diff options
Diffstat (limited to 'kcontrol/tdm/tdm-appear.cpp')
-rw-r--r-- | kcontrol/tdm/tdm-appear.cpp | 554 |
1 files changed, 554 insertions, 0 deletions
diff --git a/kcontrol/tdm/tdm-appear.cpp b/kcontrol/tdm/tdm-appear.cpp new file mode 100644 index 000000000..cdd5f2fc9 --- /dev/null +++ b/kcontrol/tdm/tdm-appear.cpp @@ -0,0 +1,554 @@ +/* + This file is part of the KDE Display Manager Configuration package + Copyright (C) 1997-1998 Thomas Tanghus ([email protected]) + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + + +#include <unistd.h> +#include <sys/types.h> + + +#include <tqbuttongroup.h> +#include <tqlabel.h> +#include <tqlayout.h> +#include <tqradiobutton.h> +#include <tqwhatsthis.h> +#include <tqvalidator.h> +#include <tqstylefactory.h> +#include <tqcheckbox.h> +#include <tqstyle.h> + +#include <klocale.h> +#include <klineedit.h> +#include <kimageio.h> +#include <kcombobox.h> +#include <kmessagebox.h> +#include <kstandarddirs.h> +#include <kio/netaccess.h> +#include <kiconloader.h> +#include <kurldrag.h> +#include <kimagefilepreview.h> + +#include "tdm-appear.h" +#include "kbackedcombobox.h" + +extern KSimpleConfig *config; + + +TDMAppearanceWidget::TDMAppearanceWidget(TQWidget *parent, const char *name) + : TQWidget(parent, name) +{ + TQString wtstr; + + TQVBoxLayout *vbox = new TQVBoxLayout(this, KDialog::marginHint(), + KDialog::spacingHint(), "vbox"); + TQGroupBox *group = new TQGroupBox(i18n("Appearance"), this); + vbox->addWidget(group); + + TQGridLayout *grid = new TQGridLayout( group, 5, 2, KDialog::marginHint(), + KDialog::spacingHint(), "grid"); + grid->addRowSpacing(0, group->fontMetrics().height()); + grid->setColStretch(0, 1); + grid->setColStretch(1, 1); + + TQHBoxLayout *hlay = new TQHBoxLayout( KDialog::spacingHint() ); + grid->addMultiCellLayout(hlay, 1,1, 0,1); + greetstr_lined = new KLineEdit(group); + TQLabel *label = new TQLabel(greetstr_lined, i18n("&Greeting:"), group); + hlay->addWidget(label); + connect(greetstr_lined, TQT_SIGNAL(textChanged(const TQString&)), + TQT_SLOT(changed())); + hlay->addWidget(greetstr_lined); + wtstr = i18n("This is the \"headline\" for TDM's login window. You may want to " + "put some nice greeting or information about the operating system here.<p>" + "TDM will substitute the following character pairs with the " + "respective contents:<br><ul>" + "<li>%d -> current display</li>" + "<li>%h -> host name, possibly with domain name</li>" + "<li>%n -> node name, most probably the host name without domain name</li>" + "<li>%s -> the operating system</li>" + "<li>%r -> the operating system's version</li>" + "<li>%m -> the machine (hardware) type</li>" + "<li>%% -> a single %</li>" + "</ul>" ); + TQWhatsThis::add( label, wtstr ); + TQWhatsThis::add( greetstr_lined, wtstr ); + + + TQGridLayout *hglay = new TQGridLayout( 3, 4, KDialog::spacingHint() ); + grid->addMultiCellLayout(hglay, 2,4, 0,0); + + label = new TQLabel(i18n("Logo area:"), group); + hglay->addWidget(label, 0, 0); + TQVBoxLayout *vlay = new TQVBoxLayout( KDialog::spacingHint() ); + hglay->addMultiCellLayout(vlay, 0,0, 1,2); + noneRadio = new TQRadioButton( i18n("logo area", "&None"), group ); + clockRadio = new TQRadioButton( i18n("Show cloc&k"), group ); + logoRadio = new TQRadioButton( i18n("Sho&w logo"), group ); + TQButtonGroup *buttonGroup = new TQButtonGroup( group ); + label->setBuddy( buttonGroup ); + connect( buttonGroup, TQT_SIGNAL(clicked(int)), TQT_SLOT(slotAreaRadioClicked(int)) ); + connect( buttonGroup, TQT_SIGNAL(clicked(int)), TQT_SLOT(changed()) ); + buttonGroup->hide(); + buttonGroup->insert(noneRadio, KdmNone); + buttonGroup->insert(clockRadio, KdmClock); + buttonGroup->insert(logoRadio, KdmLogo); + vlay->addWidget(noneRadio); + vlay->addWidget(clockRadio); + vlay->addWidget(logoRadio); + wtstr = i18n("You can choose to display a custom logo (see below), a clock or no logo at all."); + TQWhatsThis::add( label, wtstr ); + TQWhatsThis::add( noneRadio, wtstr ); + TQWhatsThis::add( logoRadio, wtstr ); + TQWhatsThis::add( clockRadio, wtstr ); + + logoLabel = new TQLabel(i18n("&Logo:"), group); + logobutton = new TQPushButton(group); + logoLabel->setBuddy( logobutton ); + logobutton->setAutoDefault(false); + logobutton->setAcceptDrops(true); + logobutton->installEventFilter(this); // for drag and drop + connect(logobutton, TQT_SIGNAL(clicked()), TQT_SLOT(slotLogoButtonClicked())); + hglay->addWidget(logoLabel, 1, 0); + hglay->addWidget(logobutton, 1, 1, Qt::AlignCenter); + hglay->addRowSpacing(1, 110); + wtstr = i18n("Click here to choose an image that TDM will display. " + "You can also drag and drop an image onto this button " + "(e.g. from Konqueror)."); + TQWhatsThis::add( logoLabel, wtstr ); + TQWhatsThis::add( logobutton, wtstr ); + hglay->addRowSpacing( 2, KDialog::spacingHint()); + hglay->setColStretch( 3, 1); + + + hglay = new TQGridLayout( 2, 3, KDialog::spacingHint() ); + grid->addLayout(hglay, 2, 1); + + label = new TQLabel(i18n("Position:"), group); + hglay->addMultiCellWidget(label, 0,1, 0,0, Qt::AlignVCenter); + TQValidator *posValidator = new TQIntValidator(0, 100, TQT_TQOBJECT(group)); + TQLabel *xLineLabel = new TQLabel(i18n("&X:"), group); + hglay->addWidget(xLineLabel, 0, 1); + xLineEdit = new TQLineEdit (group); + connect( xLineEdit, TQT_SIGNAL( textChanged(const TQString&) ), TQT_SLOT( changed() )); + hglay->addWidget(xLineEdit, 0, 2); + xLineLabel->setBuddy(xLineEdit); + xLineEdit->setValidator(posValidator); + TQLabel *yLineLabel = new TQLabel(i18n("&Y:"), group); + hglay->addWidget(yLineLabel, 1, 1); + yLineEdit = new TQLineEdit (group); + connect( yLineEdit, TQT_SIGNAL( textChanged(const TQString&) ), TQT_SLOT( changed() )); + hglay->addWidget(yLineEdit, 1, 2); + yLineLabel->setBuddy(yLineEdit); + yLineEdit->setValidator(posValidator); + wtstr = i18n("Here you specify the relative coordinates (in percent) of the login dialog's <em>center</em>."); + TQWhatsThis::add( label, wtstr ); + TQWhatsThis::add( xLineLabel, wtstr ); + TQWhatsThis::add( xLineEdit, wtstr ); + TQWhatsThis::add( yLineLabel, wtstr ); + TQWhatsThis::add( yLineEdit, wtstr ); + hglay->setColStretch( 3, 1); + hglay->setRowStretch( 2, 1); + + + hglay = new TQGridLayout( 2, 3, KDialog::spacingHint() ); + grid->addLayout(hglay, 3, 1); + hglay->setColStretch(3, 1); + + compositorcombo = new KBackedComboBox(group); + compositorcombo->insertItem( "", i18n("None") ); + compositorcombo->insertItem( "kompmgr", i18n("Trinity compositor") ); + label = new TQLabel(compositorcombo, i18n("Compositor:"), group); + connect(compositorcombo, TQT_SIGNAL(activated(int)), TQT_SLOT(changed())); + hglay->addWidget(label, 0, 0); + hglay->addWidget(compositorcombo, 0, 1); + wtstr = i18n("Choose a compositor to be used in TDM. Note that the chosen compositor will continue to run after login."); + TQWhatsThis::add( label, wtstr ); + TQWhatsThis::add( compositorcombo, wtstr ); + + guicombo = new KBackedComboBox(group); + guicombo->insertItem( "", i18n("<default>") ); + loadGuiStyles(guicombo); + guicombo->listBox()->sort(); + label = new TQLabel(guicombo, i18n("GUI s&tyle:"), group); + connect(guicombo, TQT_SIGNAL(activated(int)), TQT_SLOT(changed())); + hglay->addWidget(label, 1, 0); + hglay->addWidget(guicombo, 1, 1); + wtstr = i18n("You can choose a basic GUI style here that will be " + "used by TDM only."); + TQWhatsThis::add( label, wtstr ); + TQWhatsThis::add( guicombo, wtstr ); + + colcombo = new KBackedComboBox(group); + colcombo->insertItem( "", i18n("<default>") ); + loadColorSchemes(colcombo); + colcombo->listBox()->sort(); + label = new TQLabel(colcombo, i18n("&Color scheme:"), group); + connect(colcombo, TQT_SIGNAL(activated(int)), TQT_SLOT(changed())); + hglay->addWidget(label, 2, 0); + hglay->addWidget(colcombo, 2, 1); + wtstr = i18n("You can choose a basic Color Scheme here that will be " + "used by TDM only."); + TQWhatsThis::add( label, wtstr ); + TQWhatsThis::add( colcombo, wtstr ); + + echocombo = new KBackedComboBox(group); + echocombo->insertItem("NoEcho", i18n("No Echo")); + echocombo->insertItem("OneStar", i18n("One Star")); + echocombo->insertItem("ThreeStars", i18n("Three Stars")); + label = new TQLabel(echocombo, i18n("Echo &mode:"), group); + connect(echocombo, TQT_SIGNAL(activated(int)), TQT_SLOT(changed())); + hglay->addWidget(label, 3, 0); + hglay->addWidget(echocombo, 3, 1); + wtstr = i18n("You can choose whether and how TDM shows your password when you type it."); + TQWhatsThis::add( label, wtstr ); + TQWhatsThis::add( echocombo, wtstr ); + + + // The Language group box + group = new TQGroupBox(0, Qt::Vertical, i18n("Locale"), this); + vbox->addWidget(group); + + langcombo = new KLanguageButton(group); + loadLanguageList(langcombo); + connect(langcombo, TQT_SIGNAL(activated(const TQString &)), TQT_SLOT(changed())); + label = new TQLabel(langcombo, i18n("Languag&e:"), group); + TQGridLayout *hbox = new TQGridLayout( group->layout(), 2, 2, KDialog::spacingHint() ); + hbox->setColStretch(1, 1); + hbox->addWidget(label, 1, 0); + hbox->addWidget(langcombo, 1, 1); + wtstr = i18n("Here you can choose the language used by TDM. This setting does not affect" + " a user's personal settings; that will take effect after login."); + TQWhatsThis::add( label, wtstr ); + TQWhatsThis::add( langcombo, wtstr ); + + + // The SAK group box + group = new TQGroupBox(0, Qt::Vertical, i18n("Secure Attention Key"), this); + vbox->addWidget(group); + + sakbox = new TQCheckBox( i18n("Enable Secure Attention Key"), group ); + connect( sakbox, TQT_SIGNAL(toggled(bool)), TQT_SLOT(changed()) ); + TQGridLayout *hbox2 = new TQGridLayout( group->layout(), 2, 2, KDialog::spacingHint() ); + hbox2->setColStretch(1, 1); + hbox2->addWidget(sakbox, 1, 0); + wtstr = i18n("Here you can enable or disable the Secure Attention Key [SAK] anti-spoofing measure."); + TQWhatsThis::add( sakbox, wtstr ); + + + vbox->addStretch(1); + +} + +void TDMAppearanceWidget::makeReadOnly() +{ + disconnect( logobutton, TQT_SIGNAL(clicked()), + this, TQT_SLOT(slotLogoButtonClicked()) ); + logobutton->setAcceptDrops(false); + greetstr_lined->setReadOnly(true); + noneRadio->setEnabled(false); + clockRadio->setEnabled(false); + logoRadio->setEnabled(false); + xLineEdit->setEnabled(false); + yLineEdit->setEnabled(false); + compositorcombo->setEnabled(false); + guicombo->setEnabled(false); + colcombo->setEnabled(false); + echocombo->setEnabled(false); + langcombo->setEnabled(false); + sakbox->setEnabled(false); +} + +void TDMAppearanceWidget::loadLanguageList(KLanguageButton *combo) +{ + TQStringList langlist = KGlobal::dirs()->findAllResources("locale", + TQString::fromLatin1("*/entry.desktop")); + langlist.sort(); + for ( TQStringList::ConstIterator it = langlist.begin(); + it != langlist.end(); ++it ) + { + TQString fpath = (*it).left((*it).length() - 14); + int index = fpath.findRev('/'); + TQString nid = fpath.mid(index + 1); + + KSimpleConfig entry(*it); + entry.setGroup(TQString::fromLatin1("KCM Locale")); + TQString name = entry.readEntry(TQString::fromLatin1("Name"), i18n("without name")); + combo->insertLanguage(nid, name, TQString::fromLatin1("l10n/"), TQString::null); + } +} + +void TDMAppearanceWidget::loadColorSchemes(KBackedComboBox *combo) +{ + // XXX: Global + local schemes + TQStringList list = KGlobal::dirs()-> + findAllResources("data", "kdisplay/color-schemes/*.kcsrc", false, true); + for (TQStringList::ConstIterator it = list.begin(); it != list.end(); ++it) + { + KSimpleConfig config(*it, true); + config.setGroup("Color Scheme"); + + TQString str; + if (!(str = config.readEntry("Name")).isEmpty() || + !(str = config.readEntry("name")).isEmpty()) + { + TQString str2 = (*it).mid( (*it).findRev( '/' ) + 1 ); // strip off path + str2.setLength( str2.length() - 6 ); // strip off ".kcsrc + combo->insertItem( str2, str ); + } + } +} + +void TDMAppearanceWidget::loadGuiStyles(KBackedComboBox *combo) +{ + // XXX: Global + local schemes + TQStringList list = KGlobal::dirs()-> + findAllResources("data", "kstyle/themes/*.themerc", false, true); + for (TQStringList::ConstIterator it = list.begin(); it != list.end(); ++it) + { + KSimpleConfig config(*it, true); + + if (!(config.hasGroup("KDE") && config.hasGroup("Misc"))) + continue; + + config.setGroup("Desktop Entry"); + if (config.readBoolEntry("Hidden", false)) + continue; + + config.setGroup("KDE"); + TQString str2 = config.readEntry("WidgetStyle"); + if (str2.isNull()) + continue; + + config.setGroup("Misc"); + combo->insertItem( str2, config.readEntry("Name") ); + } +} + +bool TDMAppearanceWidget::setLogo(TQString logo) +{ + TQString flogo = logo.isEmpty() ? + locate("data", TQString::fromLatin1("tdm/pics/kdelogo.png") ) : + logo; + TQImage p(flogo); + if (p.isNull()) + return false; + if (p.width() > 100 || p.height() > 100) + p = p.smoothScale(100, 100, TQ_ScaleMin); + logobutton->setPixmap(p); + uint bd = style().pixelMetric( TQStyle::PM_ButtonMargin ) * 2; + logobutton->setFixedSize(p.width() + bd, p.height() + bd); + logopath = logo; + return true; +} + + +void TDMAppearanceWidget::slotLogoButtonClicked() +{ + KImageIO::registerFormats(); + KFileDialog dialogue(locate("data", TQString::fromLatin1("tdm/pics/")), + KImageIO::pattern( KImageIO::Reading ), + this, 0, true); + dialogue.setOperationMode( KFileDialog::Opening ); + dialogue.setMode( KFile::File | KFile::LocalOnly ); + + KImageFilePreview* imagePreview = new KImageFilePreview( &dialogue ); + dialogue.setPreviewWidget( imagePreview ); + if (dialogue.exec() == TQDialog::Accepted) { + if ( setLogo(dialogue.selectedFile()) ) { + changed(); + } + } +} + + +void TDMAppearanceWidget::slotAreaRadioClicked(int id) +{ + logobutton->setEnabled( id == KdmLogo ); + logoLabel->setEnabled( id == KdmLogo ); +} + + +bool TDMAppearanceWidget::eventFilter(TQObject *, TQEvent *e) +{ + if (e->type() == TQEvent::DragEnter) { + iconLoaderDragEnterEvent((TQDragEnterEvent *) e); + return true; + } + + if (e->type() == TQEvent::Drop) { + iconLoaderDropEvent((TQDropEvent *) e); + return true; + } + + return false; +} + +void TDMAppearanceWidget::iconLoaderDragEnterEvent(TQDragEnterEvent *e) +{ + e->accept(KURLDrag::canDecode(e)); +} + + +KURL *decodeImgDrop(TQDropEvent *e, TQWidget *wdg); + +void TDMAppearanceWidget::iconLoaderDropEvent(TQDropEvent *e) +{ + KURL pixurl; + bool istmp; + + KURL *url = decodeImgDrop(e, this); + if (url) { + + // we gotta check if it is a non-local file and make a tmp copy at the hd. + if(!url->isLocalFile()) { + pixurl.setPath(KGlobal::dirs()->resourceDirs("data").last() + + "tdm/pics/" + url->fileName()); + KIO::NetAccess::copy(*url, pixurl, parentWidget()); + istmp = true; + } else { + pixurl = *url; + istmp = false; + } + + // By now url should be "file:/..." + if (!setLogo(pixurl.path())) { + KIO::NetAccess::del(pixurl, parentWidget()); + TQString msg = i18n("There was an error loading the image:\n" + "%1\n" + "It will not be saved.") + .arg(pixurl.path()); + KMessageBox::sorry(this, msg); + } + + delete url; + } +} + + +void TDMAppearanceWidget::save() +{ + config->setGroup("X-*-Greeter"); + + config->writeEntry("GreetString", greetstr_lined->text()); + + config->writeEntry("LogoArea", noneRadio->isChecked() ? "None" : + logoRadio->isChecked() ? "Logo" : "Clock" ); + + config->writeEntry("LogoPixmap", KGlobal::iconLoader()->iconPath(logopath, KIcon::Desktop, true)); + + config->writeEntry("Compositor", compositorcombo->currentId()); + + config->writeEntry("GUIStyle", guicombo->currentId()); + + config->writeEntry("ColorScheme", colcombo->currentId()); + + config->writeEntry("EchoMode", echocombo->currentId()); + + config->writeEntry("GreeterPos", xLineEdit->text() + ',' + yLineEdit->text()); + + config->writeEntry("Language", langcombo->current()); + + config->writeEntry("UseSAK", sakbox->isChecked()); +} + + +void TDMAppearanceWidget::load() +{ + config->setGroup("X-*-Greeter"); + + // Read the greeting string + greetstr_lined->setText(config->readEntry("GreetString", i18n("Welcome to %n"))); + + // Regular logo or clock + TQString logoArea = config->readEntry("LogoArea", "Logo" ); + if (logoArea == "Clock") { + clockRadio->setChecked(true); + slotAreaRadioClicked(KdmClock); + } else if (logoArea == "Logo") { + logoRadio->setChecked(true); + slotAreaRadioClicked(KdmLogo); + } else { + noneRadio->setChecked(true); + slotAreaRadioClicked(KdmNone); + } + + // See if we use alternate logo + setLogo(config->readEntry("LogoPixmap")); + + // Check the current compositor type + compositorcombo->setCurrentId(config->readEntry("Compositor")); + + // Check the GUI type + guicombo->setCurrentId(config->readEntry("GUIStyle")); + + // Check the Color Scheme + colcombo->setCurrentId(config->readEntry("ColorScheme")); + + // Check the echo mode + echocombo->setCurrentId(config->readEntry("EchoMode", "OneStar")); + + TQStringList sl = config->readListEntry( "GreeterPos" ); + if (sl.count() != 2) { + xLineEdit->setText( "50" ); + yLineEdit->setText( "50" ); + } else { + xLineEdit->setText( sl.first() ); + yLineEdit->setText( sl.last() ); + } + + // get the language + langcombo->setCurrentItem(config->readEntry("Language", "C")); + + // See if the SAK is enabled + sakbox->setChecked(config->readBoolEntry("UseSAK", true)); +} + + +void TDMAppearanceWidget::defaults() +{ + greetstr_lined->setText( i18n("Welcome to %n") ); + logoRadio->setChecked( true ); + slotAreaRadioClicked( KdmLogo ); + setLogo( "" ); + compositorcombo->setCurrentId( "" ); + guicombo->setCurrentId( "" ); + colcombo->setCurrentId( "" ); + echocombo->setCurrentItem( "OneStar" ); + + xLineEdit->setText( "50" ); + yLineEdit->setText( "50" ); + + langcombo->setCurrentItem( "en_US" ); +} + +TQString TDMAppearanceWidget::quickHelp() const +{ + return i18n("<h1>TDM - Appearance</h1> Here you can configure the basic appearance" + " of the TDM login manager, i.e. a greeting string, an icon etc.<p>" + " For further refinement of TDM's appearance, see the \"Font\" and \"Background\" " + " tabs."); +} + + +void TDMAppearanceWidget::changed() +{ + emit changed(true); +} + +#include "tdm-appear.moc" |