summaryrefslogtreecommitdiffstats
path: root/kcontrol/tdm
diff options
context:
space:
mode:
Diffstat (limited to 'kcontrol/tdm')
-rw-r--r--kcontrol/tdm/AUTHORS6
-rw-r--r--kcontrol/tdm/CMakeLists.txt41
-rw-r--r--kcontrol/tdm/ChangeLog16
-rw-r--r--kcontrol/tdm/Makefile.am19
-rw-r--r--kcontrol/tdm/background.cpp111
-rw-r--r--kcontrol/tdm/background.h50
-rw-r--r--kcontrol/tdm/kbackedcombobox.cpp40
-rw-r--r--kcontrol/tdm/kbackedcombobox.h38
-rw-r--r--kcontrol/tdm/main.cpp342
-rw-r--r--kcontrol/tdm/main.h83
-rw-r--r--kcontrol/tdm/tdm-appear.cpp590
-rw-r--r--kcontrol/tdm/tdm-appear.h98
-rw-r--r--kcontrol/tdm/tdm-conv.cpp371
-rw-r--r--kcontrol/tdm/tdm-conv.h84
-rw-r--r--kcontrol/tdm/tdm-font.cpp134
-rw-r--r--kcontrol/tdm/tdm-font.h57
-rw-r--r--kcontrol/tdm/tdm-shut.cpp240
-rw-r--r--kcontrol/tdm/tdm-shut.h65
-rw-r--r--kcontrol/tdm/tdm-users.cpp500
-rw-r--r--kcontrol/tdm/tdm-users.h106
-rw-r--r--kcontrol/tdm/tdm.desktop243
21 files changed, 3234 insertions, 0 deletions
diff --git a/kcontrol/tdm/AUTHORS b/kcontrol/tdm/AUTHORS
new file mode 100644
index 000000000..3b7927243
--- /dev/null
+++ b/kcontrol/tdm/AUTHORS
@@ -0,0 +1,6 @@
+TDM - The KDE Display Manager - written by Steffen Hansen <[email protected]>
+
+The KDE Display Manager Configuration module -
+written by Thomas Tanghus <[email protected]>
+
+Currently maintend by Oswald Buddenhagen <[email protected]>
diff --git a/kcontrol/tdm/CMakeLists.txt b/kcontrol/tdm/CMakeLists.txt
new file mode 100644
index 000000000..7c2a1f887
--- /dev/null
+++ b/kcontrol/tdm/CMakeLists.txt
@@ -0,0 +1,41 @@
+#################################################
+#
+# (C) 2010-2011 Serghei Amelian
+# serghei (DOT) amelian (AT) gmail.com
+#
+# Improvements and feedback are welcome
+#
+# This file is released under GPL >= 2
+#
+#################################################
+
+include_directories(
+ ${CMAKE_CURRENT_BINARY_DIR}
+ ${CMAKE_BINARY_DIR}/kcontrol/background
+ ${CMAKE_BINARY_DIR}
+ ${TDE_INCLUDE_DIR}
+ ${TQT_INCLUDE_DIRS}
+)
+
+link_directories(
+ ${TQT_LIBRARY_DIRS}
+ ${LIBART_LIBRARY_DIRS}
+)
+
+##### other data ################################
+
+install( FILES tdm.desktop DESTINATION ${XDG_APPS_INSTALL_DIR} )
+
+
+##### kcm_tdm (module) ##########################
+
+set_source_files_properties( background.cpp PROPERTIES COMPILE_FLAGS -DKDE_CONFDIR=\\"${TDE_CONFIG_DIR}\\" )
+set_source_files_properties( main.cpp PROPERTIES COMPILE_FLAGS -DKDE_CONFDIR=\\"${TDE_CONFIG_DIR}\\" )
+
+tde_add_kpart( kcm_tdm AUTOMOC
+ SOURCES
+ background.cpp tdm-appear.cpp tdm-font.cpp tdm-shut.cpp
+ tdm-users.cpp tdm-conv.cpp main.cpp kbackedcombobox.cpp
+ LINK kcmbgnd-static bgnd-static tdenewstuff-shared
+ DESTINATION ${PLUGIN_INSTALL_DIR}
+)
diff --git a/kcontrol/tdm/ChangeLog b/kcontrol/tdm/ChangeLog
new file mode 100644
index 000000000..d49bb2548
--- /dev/null
+++ b/kcontrol/tdm/ChangeLog
@@ -0,0 +1,16 @@
+2002-07-11 Oswald Buddenhagen <[email protected]>
+ * Reworked "Users" and "Convenience" tabs
+
+2001-01-15 Oswald Buddenhagen <[email protected]>
+ * Several new fields in different tabs for some new features
+
+2000-12-06 Oswald Buddenhagen <[email protected]>
+ * New "Convenience" tab supporting the new automation features
+ * Some changes to the "Users" tab
+ * Few bug fixes
+
+1998-04-28 Thomas Tanghus <[email protected]>
+ * Improved geometry management.
+
+1998-05-14 Thomas Tanghus <[email protected]>
+ * Fixed bug with "ShutDownButton=...".
diff --git a/kcontrol/tdm/Makefile.am b/kcontrol/tdm/Makefile.am
new file mode 100644
index 000000000..3c8feeb96
--- /dev/null
+++ b/kcontrol/tdm/Makefile.am
@@ -0,0 +1,19 @@
+kde_module_LTLIBRARIES = kcm_tdm.la
+
+# _don't_ add a theme configurator!!
+kcm_tdm_la_SOURCES = background.cpp tdm-appear.cpp tdm-font.cpp tdm-shut.cpp \
+ tdm-users.cpp tdm-conv.cpp main.cpp kbackedcombobox.cpp
+
+kcm_tdm_la_LDFLAGS = $(KDE_RPATH) $(all_libraries) -module -avoid-version -no-undefined
+kcm_tdm_la_LIBADD = $(top_builddir)/kcontrol/background/libkcmbgnd.la $(top_builddir)/kcontrol/background/libbgnd.la $(LIB_TDEIO) $(LIB_TDENEWSTUFF)
+
+AM_CPPFLAGS= -I$(top_builddir)/kcontrol/background \
+ -I$(top_srcdir)/kcontrol/background \
+ -I$(top_srcdir)/kdesktop $(all_includes)
+
+METASOURCES = AUTO
+
+messages:
+ $(XGETTEXT) $(kcm_tdm_la_SOURCES) -o $(podir)/tdmconfig.pot
+
+xdg_apps_DATA = tdm.desktop
diff --git a/kcontrol/tdm/background.cpp b/kcontrol/tdm/background.cpp
new file mode 100644
index 000000000..139ae90b7
--- /dev/null
+++ b/kcontrol/tdm/background.cpp
@@ -0,0 +1,111 @@
+/* vi: ts=8 sts=4 sw=4
+ *
+ * This file is part of the KDE project, module kcmdisplay.
+ * Copyright (C) 1999 Geert Jansen <[email protected]>
+ *
+ * Modified 2000.07.14 by Brad Hughes <[email protected]>
+ * Improve layout and consistency with KDesktop's background selection
+ *
+ * Based on old backgnd.cpp:
+ *
+ * Copyright (c) Martin R. Jones 1996
+ * Converted to a kcc module by Matthias Hoelzer 1997
+ * Gradient backgrounds by Mark Donohoe 1997
+ * Pattern backgrounds by Stephan Kulow 1998
+ * Randomizing & dnd & new display modes by Matej Koss 1998
+ *
+ * You can Freely distribute this program under the GNU General Public
+ * License. See the file "COPYING" for the exact licensing terms.
+ */
+
+#include <config.h>
+
+#include <unistd.h>
+#include <sys/types.h>
+
+#include <tqgroupbox.h>
+#include <tqlayout.h>
+#include <tqwhatsthis.h>
+
+#include <kdebug.h>
+#include <tdelocale.h>
+#include <dcopclient.h>
+#include "../background/bgsettings.h"
+#include "../background/bgdialog.h"
+#include "background.h"
+#include <tqcheckbox.h>
+#include <ksimpleconfig.h>
+#include <kdialog.h>
+
+extern KSimpleConfig *config;
+
+KBackground::KBackground(TQWidget *parent, const char *name)
+ : TQWidget(parent, name)
+{
+
+ // Enabling checkbox
+ m_pCBEnable = new TQCheckBox( i18n("E&nable background"), this );
+ TQWhatsThis::add( m_pCBEnable,
+ i18n("If this is checked, TDM will use the settings below for the background."
+ " If it is disabled, you have to look after the background yourself."
+ " This is done by running some program (possibly xsetroot) in the script"
+ " specified in the Setup= option in tdmrc (usually Xsetup).") );
+ config->setGroup( "X-*-Greeter" );
+ m_simpleConf=new KSimpleConfig(config->readEntry( "BackgroundCfg",KDE_CONFDIR "/tdm/backgroundrc" ) );
+ m_background = new BGDialog( this, m_simpleConf, false );
+
+ connect(m_background, TQT_SIGNAL(changed(bool)), TQT_SIGNAL(changed(bool)));
+
+ // Top layout
+ TQVBoxLayout *top = new TQVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint() );
+ top->addWidget(m_pCBEnable);
+ top->addWidget(m_background);
+ top->addStretch();
+ connect( m_pCBEnable, TQT_SIGNAL(toggled( bool )), TQT_SLOT(slotEnableChanged()) );
+}
+
+KBackground::~KBackground()
+{
+ delete m_simpleConf;
+}
+
+void KBackground::slotEnableChanged()
+{
+ bool en = m_pCBEnable->isChecked();
+ m_background->setEnabled( en );
+ emit changed ( true );
+}
+
+void KBackground::makeReadOnly()
+{
+ m_pCBEnable->setEnabled(false);
+ m_background->makeReadOnly();
+}
+
+void KBackground::load()
+{
+ m_pCBEnable->setChecked( config->readBoolEntry( "UseBackground", true ) );
+ m_background->load(false);
+ slotEnableChanged();
+ emit changed(false);
+}
+
+
+void KBackground::save()
+{
+ kdDebug() << "Saving stuff..." << endl;
+ config->writeEntry( "UseBackground", m_pCBEnable->isChecked() );
+ m_background->save();
+ emit changed(false);
+}
+
+
+void KBackground::defaults()
+{
+ m_pCBEnable->setChecked( true );
+ slotEnableChanged();
+ m_background->defaults();
+ emit changed(true);
+}
+
+#include "background.moc"
diff --git a/kcontrol/tdm/background.h b/kcontrol/tdm/background.h
new file mode 100644
index 000000000..d88629c35
--- /dev/null
+++ b/kcontrol/tdm/background.h
@@ -0,0 +1,50 @@
+/* vi: ts=8 sts=4 sw=4
+ *
+ * This file is part of the KDE project, module kcmdisplay.
+ * Copyright (C) 1999 Geert Jansen <[email protected]>
+ *
+ * You can Freely distribute this program under the GNU General Public
+ * License. See the file "COPYING" for the exact licensing terms.
+ */
+
+#ifndef __Bgnd_h_Included__
+#define __Bgnd_h_Included__
+
+#include <tqobject.h>
+#include <tqwidget.h>
+
+
+class KSimpleConfig;
+class BGDialog;
+class TDEGlobalBackgroundSettings;
+class TQCheckBox;
+class TQLabel;
+
+class KBackground: public TQWidget
+{
+ Q_OBJECT
+public:
+ KBackground(TQWidget *parent=0, const char *name=0);
+ ~KBackground();
+
+ void load();
+ void save();
+ void defaults();
+ void makeReadOnly();
+signals:
+ void changed(bool);
+
+private slots:
+ void slotEnableChanged();
+private:
+ void init();
+ void apply();
+
+ TQCheckBox *m_pCBEnable;
+ TQLabel *m_pMLabel;
+ KSimpleConfig *m_simpleConf;
+ BGDialog *m_background;
+};
+
+
+#endif // __Bgnd_h_Included__
diff --git a/kcontrol/tdm/kbackedcombobox.cpp b/kcontrol/tdm/kbackedcombobox.cpp
new file mode 100644
index 000000000..1ba598e49
--- /dev/null
+++ b/kcontrol/tdm/kbackedcombobox.cpp
@@ -0,0 +1,40 @@
+/* This file is part of the KDE Display Manager Configuration package
+ Copyright (C) 2004-2005 Oswald Buddenhagen <[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 "kbackedcombobox.h"
+
+void KBackedComboBox::insertItem( const TQString &id, const TQString &name )
+{
+ id2name[id] = name;
+ name2id[name] = id;
+ KComboBox::insertItem( name );
+}
+
+void KBackedComboBox::setCurrentId( const TQString &id )
+{
+ if (id2name.contains( id ))
+ setCurrentItem( id2name[id] );
+ else
+ setCurrentItem( 0 );
+}
+
+const TQString &KBackedComboBox::currentId() const
+{
+ return name2id[currentText()];
+}
diff --git a/kcontrol/tdm/kbackedcombobox.h b/kcontrol/tdm/kbackedcombobox.h
new file mode 100644
index 000000000..1ec1d2a72
--- /dev/null
+++ b/kcontrol/tdm/kbackedcombobox.h
@@ -0,0 +1,38 @@
+/* This file is part of the KDE Display Manager Configuration package
+ Copyright (C) 2004-2005 Oswald Buddenhagen <[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.
+*/
+
+#ifndef KBACKEDCOMBOBOX_H
+#define KBACKEDCOMBOBOX_H
+
+#include <kcombobox.h>
+
+class KBackedComboBox : public KComboBox {
+
+public:
+ KBackedComboBox( TQWidget *parent ) : KComboBox( false, parent ) {}
+ void insertItem( const TQString &id, const TQString &name );
+ void setCurrentId( const TQString &id );
+ const TQString &currentId() const;
+
+private:
+ TQMap<TQString,TQString> id2name, name2id;
+
+};
+
+#endif // KBACKEDCOMBOBOX_H
diff --git a/kcontrol/tdm/main.cpp b/kcontrol/tdm/main.cpp
new file mode 100644
index 000000000..4a2c8e3ec
--- /dev/null
+++ b/kcontrol/tdm/main.cpp
@@ -0,0 +1,342 @@
+/*
+ * main.cpp
+ *
+ * Copyright (c) 1999 Matthias Hoelzer-Kluepfel <[email protected]>
+ *
+ * Requires the Qt widget libraries, available at no cost at
+ * http://www.troll.no/
+ *
+ * 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 General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <config.h>
+
+#include <tqlayout.h>
+
+#include <tdeaboutdata.h>
+#include <kgenericfactory.h>
+#include <kimageio.h>
+#include <tdemessagebox.h>
+#include <kurldrag.h>
+
+#include "tdm-appear.h"
+#include "tdm-font.h"
+#include "tdm-users.h"
+#include "tdm-shut.h"
+#include "tdm-conv.h"
+
+#include "main.h"
+#include "background.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <locale.h>
+#include <pwd.h>
+#include <grp.h>
+
+typedef KGenericFactory<TDModule, TQWidget> TDMFactory;
+K_EXPORT_COMPONENT_FACTORY( kcm_tdm, TDMFactory("tdmconfig") )
+
+KURL *decodeImgDrop(TQDropEvent *e, TQWidget *wdg)
+{
+ KURL::List uris;
+
+ if (KURLDrag::decode(e, uris) && (uris.count() > 0)) {
+ KURL *url = new KURL(uris.first());
+
+ KImageIO::registerFormats();
+ if( KImageIO::canRead(KImageIO::type(url->fileName())) )
+ return url;
+
+ TQStringList qs = TQStringList::split('\n', KImageIO::pattern());
+ qs.remove(qs.begin());
+
+ TQString msg = i18n( "%1 "
+ "does not appear to be an image file.\n"
+ "Please use files with these extensions:\n"
+ "%2")
+ .arg(url->fileName())
+ .arg(qs.join("\n"));
+ KMessageBox::sorry( wdg, msg);
+ delete url;
+ }
+ return 0;
+}
+
+KSimpleConfig *config;
+
+TDModule::TDModule(TQWidget *parent, const char *name, const TQStringList &)
+ : TDECModule(TDMFactory::instance(), parent, name)
+ , minshowuid(0)
+ , maxshowuid(0)
+ , updateOK(false)
+{
+ TDEAboutData *about =
+ new TDEAboutData(I18N_NOOP("kcmtdm"), I18N_NOOP("TDE Login Manager Config Module"),
+ 0, 0, TDEAboutData::License_GPL,
+ I18N_NOOP("(c) 1996 - 2005 The TDM Authors"));
+
+ about->addAuthor("Thomas Tanghus", I18N_NOOP("Original author"), "[email protected]");
+ about->addAuthor("Steffen Hansen", 0, "[email protected]");
+ about->addAuthor("Oswald Buddenhagen", I18N_NOOP("Current maintainer"), "[email protected]");
+
+ setQuickHelp( i18n( "<h1>Login Manager</h1> In this module you can configure the "
+ "various aspects of the TDE Login Manager. This includes "
+ "the look and feel as well as the users that can be "
+ "selected for login. Note that you can only make changes "
+ "if you run the module with superuser rights. If you have not started the TDE "
+ "Control Center with superuser rights (which is absolutely the right thing to "
+ "do, by the way), click on the <em>Modify</em> button to acquire "
+ "superuser rights. You will be asked for the superuser password."
+ "<h2>Appearance</h2> On this tab page, you can configure how "
+ "the Login Manager should look, which language it should use, and which "
+ "GUI style it should use. The language settings made here have no influence on "
+ "the user's language settings."
+ "<h2>Font</h2>Here you can choose the fonts that the Login Manager should use "
+ "for various purposes like greetings and user names. "
+ "<h2>Background</h2>If you want to set a special background for the login "
+ "screen, this is where to do it."
+ "<h2>Shutdown</h2> Here you can specify who is allowed to shutdown/reboot the machine "
+ "and whether a boot manager should be used."
+ "<h2>Users</h2>On this tab page, you can select which users the Login Manager "
+ "will offer you for logging in."
+ "<h2>Convenience</h2> Here you can specify a user to be logged in automatically, "
+ "users not needing to provide a password to log in, and other convenience features.<br>"
+ "Note, that these settings are security holes by their nature, so use them very carefully."));
+
+ setAboutData( about );
+
+ setlocale( LC_COLLATE, "C" );
+
+ TDEGlobal::locale()->insertCatalogue("kcmbackground");
+
+ TQStringList sl;
+ TQMap<gid_t,TQStringList> tgmap;
+ TQMap<gid_t,TQStringList>::Iterator tgmapi;
+ TQMap<gid_t,TQStringList>::ConstIterator tgmapci;
+ TQMap<TQString, QPair<int,TQStringList> >::Iterator umapi;
+
+ struct passwd *ps;
+ for (setpwent(); (ps = getpwent()); ) {
+ TQString un( TQFile::decodeName( ps->pw_name ) );
+ if (usermap.find( un ) == usermap.end()) {
+ usermap.insert( un, QPair<int,TQStringList>( ps->pw_uid, sl ) );
+ if ((tgmapi = tgmap.find( ps->pw_gid )) != tgmap.end())
+ (*tgmapi).append( un );
+ else
+ tgmap[ps->pw_gid] = un;
+ }
+ }
+ endpwent();
+
+ struct group *grp;
+ for (setgrent(); (grp = getgrent()); ) {
+ TQString gn( TQFile::decodeName( grp->gr_name ) );
+ bool delme = false;
+ if ((tgmapi = tgmap.find( grp->gr_gid )) != tgmap.end()) {
+ if ((*tgmapi).count() == 1 && (*tgmapi).first() == gn)
+ delme = true;
+ else
+ for (TQStringList::ConstIterator it = (*tgmapi).begin();
+ it != (*tgmapi).end(); ++it)
+ usermap[*it].second.append( gn );
+ tgmap.remove( tgmapi );
+ }
+ if (!*grp->gr_mem ||
+ (delme && !grp->gr_mem[1] && gn == TQFile::decodeName( *grp->gr_mem )))
+ continue;
+ do {
+ TQString un( TQFile::decodeName( *grp->gr_mem ) );
+ if ((umapi = usermap.find( un )) != usermap.end()) {
+ if ((*umapi).second.find( gn ) == (*umapi).second.end())
+ (*umapi).second.append( gn );
+ } else
+ kdWarning() << "group '" << gn << "' contains unknown user '" << un << "'" << endl;
+ } while (*++grp->gr_mem);
+ }
+ endgrent();
+
+ for (tgmapci = tgmap.begin(); tgmapci != tgmap.end(); ++tgmapci)
+ kdWarning() << "user(s) '" << tgmapci.data().join(",")
+ << "' have unknown GID " << tgmapci.key() << endl;
+
+ struct stat st;
+ if( stat( KDE_CONFDIR "/tdm/tdmdistrc" ,&st ) == 0) {
+ config = new KSimpleConfig( TQString::fromLatin1( KDE_CONFDIR "/tdm/tdmdistrc" ));
+ }
+ else {
+ config = new KSimpleConfig( TQString::fromLatin1( KDE_CONFDIR "/tdm/tdmrc" ));
+ }
+
+ TQVBoxLayout *top = new TQVBoxLayout(this);
+ tab = new TQTabWidget(this);
+
+ // *****
+ // _don't_ add a theme configurator until the theming engine is _really_ done!!
+ // *****
+
+ appearance = new TDMAppearanceWidget(this);
+ tab->addTab(appearance, i18n("A&ppearance"));
+ connect(appearance, TQT_SIGNAL(changed(bool)), TQT_SIGNAL( changed(bool)));
+
+ font = new TDMFontWidget(this);
+ tab->addTab(font, i18n("&Font"));
+ connect(font, TQT_SIGNAL(changed(bool)), TQT_SIGNAL(changed(bool)));
+
+ background = new KBackground(this);
+ tab->addTab(background, i18n("&Background"));
+ connect(background, TQT_SIGNAL(changed(bool)), TQT_SIGNAL(changed(bool)));
+
+ sessions = new TDMSessionsWidget(this);
+ tab->addTab(sessions, i18n("&Shutdown"));
+ connect(sessions, TQT_SIGNAL(changed(bool)), TQT_SIGNAL(changed(bool)));
+
+ users = new TDMUsersWidget(this, 0);
+ tab->addTab(users, i18n("&Users"));
+ connect(users, TQT_SIGNAL(changed(bool)), TQT_SIGNAL(changed(bool)));
+ connect(users, TQT_SIGNAL(setMinMaxUID(int,int)), TQT_SLOT(slotMinMaxUID(int,int)));
+ connect(this, TQT_SIGNAL(addUsers(const TQMap<TQString,int> &)), users, TQT_SLOT(slotAddUsers(const TQMap<TQString,int> &)));
+ connect(this, TQT_SIGNAL(delUsers(const TQMap<TQString,int> &)), users, TQT_SLOT(slotDelUsers(const TQMap<TQString,int> &)));
+ connect(this, TQT_SIGNAL(clearUsers()), users, TQT_SLOT(slotClearUsers()));
+
+ convenience = new TDMConvenienceWidget(this, 0);
+ tab->addTab(convenience, i18n("Con&venience"));
+ connect(convenience, TQT_SIGNAL(changed(bool)), TQT_SIGNAL(changed(bool)));
+ connect(this, TQT_SIGNAL(addUsers(const TQMap<TQString,int> &)), convenience, TQT_SLOT(slotAddUsers(const TQMap<TQString,int> &)));
+ connect(this, TQT_SIGNAL(delUsers(const TQMap<TQString,int> &)), convenience, TQT_SLOT(slotDelUsers(const TQMap<TQString,int> &)));
+ connect(this, TQT_SIGNAL(clearUsers()), convenience, TQT_SLOT(slotClearUsers()));
+
+ load();
+ if (getuid() != 0 || !config->checkConfigFilesWritable( true )) {
+ appearance->makeReadOnly();
+ font->makeReadOnly();
+ background->makeReadOnly();
+ users->makeReadOnly();
+ sessions->makeReadOnly();
+ convenience->makeReadOnly();
+ }
+ top->addWidget(tab);
+}
+
+TDModule::~TDModule()
+{
+ delete config;
+}
+
+void TDModule::load()
+{
+ appearance->load();
+ font->load();
+ background->load();
+ users->load();
+ sessions->load();
+ convenience->load();
+ propagateUsers();
+}
+
+
+void TDModule::save()
+{
+ appearance->save();
+ font->save();
+ background->save();
+ users->save();
+ sessions->save();
+ convenience->save();
+ config->sync();
+}
+
+
+void TDModule::defaults()
+{
+ if ( getuid() == 0 )
+ {
+ appearance->defaults();
+ font->defaults();
+ background->defaults();
+ users->defaults();
+ sessions->defaults();
+ convenience->defaults();
+ propagateUsers();
+ }
+}
+
+void TDModule::propagateUsers()
+{
+ groupmap.clear();
+ emit clearUsers();
+ TQMap<TQString,int> lusers;
+ TQMapConstIterator<TQString, QPair<int,TQStringList> > it;
+ TQStringList::ConstIterator jt;
+ TQMap<TQString,int>::Iterator gmapi;
+ for (it = usermap.begin(); it != usermap.end(); ++it) {
+ int uid = it.data().first;
+ if (!uid || (uid >= minshowuid && uid <= maxshowuid)) {
+ lusers[it.key()] = uid;
+ for (jt = it.data().second.begin(); jt != it.data().second.end(); ++jt)
+ if ((gmapi = groupmap.find( *jt )) == groupmap.end()) {
+ groupmap[*jt] = 1;
+ lusers['@' + *jt] = -uid;
+ } else
+ (*gmapi)++;
+ }
+ }
+ emit addUsers(lusers);
+ updateOK = true;
+}
+
+void TDModule::slotMinMaxUID(int min, int max)
+{
+ if (updateOK) {
+ TQMap<TQString,int> alusers, dlusers;
+ TQMapConstIterator<TQString, QPair<int,TQStringList> > it;
+ TQStringList::ConstIterator jt;
+ TQMap<TQString,int>::Iterator gmapi;
+ for (it = usermap.begin(); it != usermap.end(); ++it) {
+ int uid = it.data().first;
+ if (!uid) continue;
+ if ((uid >= minshowuid && uid <= maxshowuid) &&
+ !(uid >= min && uid <= max)) {
+ dlusers[it.key()] = uid;
+ for (jt = it.data().second.begin();
+ jt != it.data().second.end(); ++jt) {
+ gmapi = groupmap.find( *jt );
+ if (!--(*gmapi)) {
+ groupmap.remove( gmapi );
+ dlusers['@' + *jt] = -uid;
+ }
+ }
+ } else
+ if ((uid >= min && uid <= max) &&
+ !(uid >= minshowuid && uid <= maxshowuid)) {
+ alusers[it.key()] = uid;
+ for (jt = it.data().second.begin();
+ jt != it.data().second.end(); ++jt)
+ if ((gmapi = groupmap.find( *jt )) == groupmap.end()) {
+ groupmap[*jt] = 1;
+ alusers['@' + *jt] = -uid;
+ } else
+ (*gmapi)++;
+ }
+ }
+ emit delUsers(dlusers);
+ emit addUsers(alusers);
+ }
+ minshowuid = min;
+ maxshowuid = max;
+}
+
+#include "main.moc"
diff --git a/kcontrol/tdm/main.h b/kcontrol/tdm/main.h
new file mode 100644
index 000000000..144d1db20
--- /dev/null
+++ b/kcontrol/tdm/main.h
@@ -0,0 +1,83 @@
+/*
+ * main.h
+ *
+ * Copyright (c) 1999 Matthias Hoelzer-Kluepfel <[email protected]>
+ *
+ * Requires the Qt widget libraries, available at no cost at
+ * http://www.troll.no/
+ *
+ * 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 General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __tdm_main_h
+#define __tdm_main_h
+
+#include <tqtabwidget.h>
+#include <tqmap.h>
+
+#include <tdecmodule.h>
+
+class TDMAppearanceWidget;
+class TDMFontWidget;
+class TDMSessionsWidget;
+class TDMUsersWidget;
+class TDMConvenienceWidget;
+class KBackground;
+
+class TDModule : public TDECModule
+{
+ Q_OBJECT
+
+public:
+
+ TDModule(TQWidget *parent, const char *name, const TQStringList &);
+ ~TDModule();
+
+ void load();
+ void save();
+ void defaults();
+
+public slots:
+
+ void slotMinMaxUID(int min, int max);
+
+signals:
+
+ void clearUsers();
+ void addUsers(const TQMap<TQString,int> &);
+ void delUsers(const TQMap<TQString,int> &);
+
+private:
+
+ TQTabWidget *tab;
+
+ TDMAppearanceWidget *appearance;
+ KBackground *background;
+ TDMFontWidget *font;
+ TDMSessionsWidget *sessions;
+ TDMUsersWidget *users;
+ TDMConvenienceWidget *convenience;
+
+ TQMap<TQString, QPair<int,TQStringList> > usermap;
+ TQMap<TQString,int> groupmap;
+ int minshowuid, maxshowuid;
+ bool updateOK;
+
+ void propagateUsers();
+
+};
+
+#endif
+
diff --git a/kcontrol/tdm/tdm-appear.cpp b/kcontrol/tdm/tdm-appear.cpp
new file mode 100644
index 000000000..8d3f848b5
--- /dev/null
+++ b/kcontrol/tdm/tdm-appear.cpp
@@ -0,0 +1,590 @@
+/*
+ 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 <stdlib.h>
+#include <sys/types.h>
+#include <signal.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 <tdelocale.h>
+#include <klineedit.h>
+#include <kimageio.h>
+#include <kcombobox.h>
+#include <tdemessagebox.h>
+#include <kstandarddirs.h>
+#include <tdeio/netaccess.h>
+#include <kiconloader.h>
+#include <kurldrag.h>
+#include <kimagefilepreview.h>
+
+#include "tdm-appear.h"
+#include "kbackedcombobox.h"
+
+#include "config.h"
+
+extern KSimpleConfig *config;
+
+#define TSAK_LOCKFILE "/tmp/tdesocket-global/tsak.lock"
+
+TDMAppearanceWidget::TDMAppearanceWidget(TQWidget *parent, const char *name)
+ : TQWidget(parent, name), sakwarning(0)
+{
+ 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( TDE_COMPOSITOR_BINARY, 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);
+ if (getuid() == 0 && config->checkConfigFilesWritable( true )) {
+ if (system(KDE_BINDIR "/tsak checkdeps") != 0) {
+ sakbox->setEnabled(false);
+ sakwarning = new TQLabel( i18n("Secure Attention Key support is not available on your system. Please check for the presence of evdev and uinput."), group );
+ hbox2->addWidget(sakwarning, 2, 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 = TDEGlobal::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 = TDEGlobal::dirs()->
+ findAllResources("data", "tdedisplay/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 = TDEGlobal::dirs()->
+ findAllResources("data", "tdestyle/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(TDEGlobal::dirs()->resourceDirs("data").last() +
+ "tdm/pics/" + url->fileName());
+ TDEIO::NetAccess::copy(*url, pixurl, parentWidget());
+ istmp = true;
+ } else {
+ pixurl = *url;
+ istmp = false;
+ }
+
+ // By now url should be "file:/..."
+ if (!setLogo(pixurl.path())) {
+ TDEIO::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", TDEGlobal::iconLoader()->iconPath(logopath, TDEIcon::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());
+
+ if (!sakwarning) {
+ config->setGroup("X-:*-Greeter");
+ config->writeEntry("UseSAK", sakbox->isChecked());
+ }
+
+ // Enable/disable tsak as needed
+ if (sakbox->isChecked()) {
+ system(KDE_BINDIR "/tsak");
+ }
+ else {
+ // Get PID
+ TQFile file(TSAK_LOCKFILE);
+ if (file.open(IO_ReadOnly)) {
+ TQTextStream stream(&file);
+ unsigned long tsakpid = stream.readLine().toULong();
+ file.close();
+ kill(tsakpid, SIGTERM);
+ }
+ }
+}
+
+
+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
+ if (!sakwarning) {
+ config->setGroup("X-:*-Greeter");
+ sakbox->setChecked(config->readBoolEntry("UseSAK", false));
+ }
+ else {
+ sakbox->setChecked(false);
+ }
+}
+
+
+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"
diff --git a/kcontrol/tdm/tdm-appear.h b/kcontrol/tdm/tdm-appear.h
new file mode 100644
index 000000000..8e0acc93d
--- /dev/null
+++ b/kcontrol/tdm/tdm-appear.h
@@ -0,0 +1,98 @@
+/* This file is part of the KDE Display Manager Configuration package
+ Copyright (C) 1997 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.
+*/
+
+
+#ifndef __TDMAPPEAR_H__
+#define __TDMAPPEAR_H__
+
+
+#include <tqdir.h>
+#include <tqimage.h>
+#include <tqfileinfo.h>
+#include <tqpushbutton.h>
+
+#include <kcolorbutton.h>
+#include <kurl.h>
+#include <tdefiledialog.h>
+
+
+#include "klanguagebutton.h"
+
+class TQComboBox;
+class KBackedComboBox;
+class TQLabel;
+class TQRadioButton;
+class TQLineEdit;
+class KLineEdit;
+
+
+class TDMAppearanceWidget : public TQWidget
+{
+ Q_OBJECT
+
+public:
+ TDMAppearanceWidget(TQWidget *parent, const char *name=0);
+
+ void load();
+ void save();
+ void defaults();
+ void makeReadOnly();
+ TQString quickHelp() const;
+
+ void loadColorSchemes(KBackedComboBox *combo);
+ void loadGuiStyles(KBackedComboBox *combo);
+ void loadLanguageList(KLanguageButton *combo);
+
+ bool eventFilter(TQObject *, TQEvent *);
+
+signals:
+ void changed( bool state );
+
+protected:
+ void iconLoaderDragEnterEvent(TQDragEnterEvent *event);
+ void iconLoaderDropEvent(TQDropEvent *event);
+ bool setLogo(TQString logo);
+
+private slots:
+ void slotAreaRadioClicked(int id);
+ void slotLogoButtonClicked();
+ void changed();
+
+private:
+ enum { KdmNone, KdmClock, KdmLogo };
+ TQLabel *logoLabel;
+ TQPushButton *logobutton;
+ KLineEdit *greetstr_lined;
+ TQString logopath;
+ TQRadioButton *noneRadio;
+ TQRadioButton *clockRadio;
+ TQRadioButton *logoRadio;
+ TQLineEdit *xLineEdit;
+ TQLineEdit *yLineEdit;
+ KBackedComboBox *compositorcombo;
+ KBackedComboBox *guicombo;
+ KBackedComboBox *colcombo;
+ KBackedComboBox *echocombo;
+ KLanguageButton *langcombo;
+ TQCheckBox *sakbox;
+ TQLabel *sakwarning;
+
+};
+
+#endif
diff --git a/kcontrol/tdm/tdm-conv.cpp b/kcontrol/tdm/tdm-conv.cpp
new file mode 100644
index 000000000..487e8adbb
--- /dev/null
+++ b/kcontrol/tdm/tdm-conv.cpp
@@ -0,0 +1,371 @@
+/* This file is part of the KDE Display Manager Configuration package
+
+ Copyright (C) 2000 Oswald Buddenhagen <[email protected]>
+ Based on several other files.
+
+ 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 <tqlayout.h>
+#include <tqlabel.h>
+#include <tqhgroupbox.h>
+#include <tqvgroupbox.h>
+#include <tqvbuttongroup.h>
+#include <tqwhatsthis.h>
+#include <tqheader.h>
+
+#include <kdialog.h>
+#include <ksimpleconfig.h>
+#include <tdelocale.h>
+
+#include "tdm-conv.h"
+
+extern KSimpleConfig *config;
+
+TDMConvenienceWidget::TDMConvenienceWidget(TQWidget *parent, const char *name)
+ : TQWidget(parent, name)
+{
+ TQString wtstr;
+
+ TQLabel *paranoia = new TQLabel( i18n("<qt><center><font color=red><big><b>Attention!<br>Read help!</b></big></font></center></qt>"), this );
+
+ TQSizePolicy vpref( TQSizePolicy::Minimum, TQSizePolicy::Fixed );
+
+ alGroup = new TQVGroupBox( i18n("Enable Au&to-Login"), this );
+ alGroup->setCheckable( true );
+ alGroup->setSizePolicy( vpref );
+
+ TQWhatsThis::add( alGroup, i18n("Turn on the auto-login feature."
+ " This applies only to TDM's graphical login."
+ " Think twice before enabling this!") );
+ connect(alGroup, TQT_SIGNAL(toggled(bool)), TQT_SLOT(slotChanged()));
+
+ TQWidget *hlpw1 = new TQWidget( alGroup );
+ userlb = new KComboBox( hlpw1 );
+ u_label = new TQLabel( userlb, i18n("Use&r:"), hlpw1 );
+ TQGridLayout *hlpl1 = new TQGridLayout(hlpw1, 2, 2, 0, KDialog::spacingHint());
+ hlpl1->setColStretch(2, 1);
+ hlpl1->addWidget(u_label, 0, 0);
+ hlpl1->addWidget(userlb, 0, 1);
+ connect(userlb, TQT_SIGNAL(highlighted(int)), TQT_SLOT(slotChanged()));
+ wtstr = i18n("Select the user to be logged in automatically.");
+ TQWhatsThis::add( u_label, wtstr );
+ TQWhatsThis::add( userlb, wtstr );
+ delaysb = new TQSpinBox( 0, 3600, 5, hlpw1 );
+ delaysb->setSpecialValueText( i18n("delay", "none") );
+ delaysb->setSuffix( i18n("seconds", " s") );
+ d_label = new TQLabel( delaysb, i18n("D&elay:"), hlpw1 );
+ hlpl1->addWidget(d_label, 1, 0);
+ hlpl1->addWidget(delaysb, 1, 1);
+ connect(delaysb, TQT_SIGNAL(valueChanged(int)), TQT_SLOT(slotChanged()));
+ wtstr = i18n("The delay (in seconds) before the automatic login kicks in. "
+ "This feature is also known as \"timed login\".");
+ TQWhatsThis::add( d_label, wtstr );
+ TQWhatsThis::add( delaysb, wtstr );
+ againcb = new TQCheckBox( i18n("P&ersistent"), alGroup );
+ connect( againcb, TQT_SIGNAL(toggled(bool)), TQT_SLOT(slotChanged()) );
+ TQWhatsThis::add( againcb, i18n("Normally, automatic login is performed only "
+ "when TDM starts up. If this is checked, automatic login will kick in "
+ "after finishing a session as well.") );
+ autoLockCheck = new TQCheckBox( i18n("Loc&k session"), alGroup );
+ connect( autoLockCheck, TQT_SIGNAL(toggled(bool)), TQT_SLOT(slotChanged()) );
+ TQWhatsThis::add( autoLockCheck, i18n("If checked, the automatically started session "
+ "will be locked immediately (provided it is a TDE session). This can "
+ "be used to obtain a super-fast login restricted to one user.") );
+
+
+ puGroup = new TQVButtonGroup(i18n("Preselect User"), this );
+ puGroup->setSizePolicy( vpref );
+
+ connect(puGroup, TQT_SIGNAL(clicked(int)), TQT_SLOT(slotPresChanged()));
+ connect(puGroup, TQT_SIGNAL(clicked(int)), TQT_SLOT(slotChanged()));
+ npRadio = new TQRadioButton(i18n("preselected user", "&None"), puGroup);
+ ppRadio = new TQRadioButton(i18n("Prev&ious"), puGroup);
+ TQWhatsThis::add( ppRadio, i18n("Preselect the user that logged in previously. "
+ "Use this if this computer is usually used several consecutive times by one user.") );
+ spRadio = new TQRadioButton(i18n("Specif&y"), puGroup);
+ TQWhatsThis::add( spRadio, i18n("Preselect the user specified in the combo box below. "
+ "Use this if this computer is predominantly used by a certain user.") );
+ TQWidget *hlpw = new TQWidget(puGroup);
+ puserlb = new KComboBox(true, hlpw);
+ pu_label = new TQLabel(puserlb, i18n("Us&er:"), hlpw);
+ connect(puserlb, TQT_SIGNAL(textChanged(const TQString &)), TQT_SLOT(slotChanged()));
+ wtstr = i18n("Select the user to be preselected for login. "
+ "This box is editable, so you can specify an arbitrary non-existent "
+ "user to mislead possible attackers.");
+ TQWhatsThis::add( pu_label, wtstr );
+ TQWhatsThis::add( puserlb, wtstr );
+ TQBoxLayout *hlpl = new TQHBoxLayout(hlpw, 0, KDialog::spacingHint());
+ hlpl->addWidget(pu_label);
+ hlpl->addWidget(puserlb);
+ hlpl->addStretch( 1 );
+ cbjumppw = new TQCheckBox(i18n("Focus pass&word"), puGroup);
+ TQWhatsThis::add( cbjumppw, i18n("When this option is on, TDM will place the cursor "
+ "in the password field instead of the user field after preselecting a user. "
+ "Use this to save one key press per login, if the preselection usually does not need to "
+ "be changed.") );
+ connect(cbjumppw, TQT_SIGNAL(toggled(bool)), TQT_SLOT(slotChanged()));
+
+ npGroup = new TQVGroupBox(i18n("Enable Password-&Less Logins"), this );
+ npGroup->setCheckable( true );
+
+ TQWhatsThis::add( npGroup, i18n("When this option is checked, the checked users from"
+ " the list below will be allowed to log in without entering their"
+ " password. This applies only to TDM's graphical login."
+ " Think twice before enabling this!") );
+
+ connect(npGroup, TQT_SIGNAL(toggled(bool)), TQT_SLOT(slotChanged()));
+
+ pl_label = new TQLabel(i18n("No password re&quired for:"), npGroup);
+ npuserlv = new TDEListView(npGroup);
+ pl_label->setBuddy(npuserlv);
+ npuserlv->addColumn(TQString::null);
+ npuserlv->header()->hide();
+ npuserlv->setResizeMode(TQListView::LastColumn);
+ TQWhatsThis::add(npuserlv, i18n("Check all users you want to allow a password-less login for."
+ " Entries denoted with '@' are user groups. Checking a group is like checking all users in that group."));
+ connect( npuserlv, TQT_SIGNAL(clicked( TQListViewItem * )),
+ TQT_SLOT(slotChanged()) );
+
+ btGroup = new TQVGroupBox( i18n("Miscellaneous"), this );
+
+ cbarlen = new TQCheckBox(i18n("Automatically log in again after &X server crash"), btGroup);
+ TQWhatsThis::add( cbarlen, i18n("When this option is on, a user will be"
+ " logged in again automatically when their session is interrupted by an"
+ " X server crash; note that this can open a security hole: if you use"
+ " a screen locker than TDE's integrated one, this will make"
+ " circumventing a password-secured screen lock possible.") );
+ connect(cbarlen, TQT_SIGNAL(toggled(bool)), TQT_SLOT(slotChanged()));
+
+ allowRootLogin = new TQCheckBox(i18n("Allow &Root Login"), btGroup);
+ TQWhatsThis::add( allowRootLogin, i18n("When set this allows root logins directly in TDM. "
+ "This is discouraged by some people. Use with caution.") );
+ connect(allowRootLogin, TQT_SIGNAL(toggled(bool)), TQT_SLOT(slotChanged()));
+
+ TQGridLayout *main = new TQGridLayout(this, 5, 2, 10);
+ main->addWidget(paranoia, 0, 0);
+ main->addWidget(alGroup, 1, 0);
+ main->addWidget(puGroup, 2, 0);
+ main->addMultiCellWidget(npGroup, 0,3, 1,1);
+ main->addMultiCellWidget(btGroup, 4,4, 0,1);
+ main->setColStretch(0, 1);
+ main->setColStretch(1, 2);
+ main->setRowStretch(3, 1);
+
+ connect( userlb, TQT_SIGNAL(activated( const TQString & )),
+ TQT_SLOT(slotSetAutoUser( const TQString & )) );
+ connect( puserlb, TQT_SIGNAL(textChanged( const TQString & )),
+ TQT_SLOT(slotSetPreselUser( const TQString & )) );
+ connect( npuserlv, TQT_SIGNAL(clicked( TQListViewItem * )),
+ TQT_SLOT(slotUpdateNoPassUser( TQListViewItem * )) );
+
+}
+
+void TDMConvenienceWidget::makeReadOnly()
+{
+ ((TQWidget*)alGroup->child("qt_groupbox_checkbox"))->setEnabled(false);
+ userlb->setEnabled(false);
+ delaysb->setEnabled(false);
+ againcb->setEnabled(false);
+ autoLockCheck->setEnabled(false);
+ ((TQWidget*)npGroup->child("qt_groupbox_checkbox"))->setEnabled(false);
+ npuserlv->setEnabled(false);
+ cbarlen->setEnabled(false);
+ allowRootLogin->setEnabled(false);
+ npRadio->setEnabled(false);
+ ppRadio->setEnabled(false);
+ spRadio->setEnabled(false);
+ puserlb->setEnabled(false);
+ cbjumppw->setEnabled(false);
+}
+
+void TDMConvenienceWidget::slotPresChanged()
+{
+ bool en = spRadio->isChecked();
+ pu_label->setEnabled(en);
+ puserlb->setEnabled(en);
+ cbjumppw->setEnabled(!npRadio->isChecked());
+}
+
+void TDMConvenienceWidget::save()
+{
+ config->setGroup("X-:0-Core");
+ config->writeEntry( "AutoLoginEnable", alGroup->isChecked() );
+ config->writeEntry( "AutoLoginUser", userlb->currentText() );
+ config->writeEntry( "AutoLoginDelay", delaysb->value() );
+ config->writeEntry( "AutoLoginAgain", againcb->isChecked() );
+ config->writeEntry( "AutoLoginLocked", autoLockCheck->isChecked() );
+
+ config->setGroup("X-:*-Core");
+ config->writeEntry( "NoPassEnable", npGroup->isChecked() );
+ config->writeEntry( "NoPassUsers", noPassUsers );
+
+ config->setGroup("X-*-Core");
+ config->writeEntry( "AutoReLogin", cbarlen->isChecked() );
+ config->writeEntry( "AllowRootLogin", allowRootLogin->isChecked() );
+
+ config->setGroup("X-:*-Greeter");
+ config->writeEntry( "PreselectUser", npRadio->isChecked() ? "None" :
+ ppRadio->isChecked() ? "Previous" :
+ "Default" );
+ config->writeEntry( "DefaultUser", puserlb->currentText() );
+ config->writeEntry( "FocusPasswd", cbjumppw->isChecked() );
+}
+
+
+void TDMConvenienceWidget::load()
+{
+ config->setGroup("X-:0-Core");
+ bool alenable = config->readBoolEntry( "AutoLoginEnable", false);
+ autoUser = config->readEntry( "AutoLoginUser" );
+ delaysb->setValue( config->readNumEntry( "AutoLoginDelay", 0 ) );
+ againcb->setChecked( config->readBoolEntry( "AutoLoginAgain", false ) );
+ autoLockCheck->setChecked( config->readBoolEntry( "AutoLoginLocked", false ) );
+ if (autoUser.isEmpty())
+ alenable=false;
+ alGroup->setChecked( alenable );
+
+ config->setGroup("X-:*-Core");
+ npGroup->setChecked(config->readBoolEntry( "NoPassEnable", false) );
+ noPassUsers = config->readListEntry( "NoPassUsers");
+
+ config->setGroup("X-*-Core");
+ cbarlen->setChecked(config->readBoolEntry( "AutoReLogin", false) );
+ allowRootLogin->setChecked(config->readBoolEntry( "AllowRootLogin", false) );
+
+ config->setGroup("X-:*-Greeter");
+ TQString presstr = config->readEntry( "PreselectUser", "None" );
+ if (presstr == "Previous")
+ ppRadio->setChecked(true);
+ else if (presstr == "Default")
+ spRadio->setChecked(true);
+ else
+ npRadio->setChecked(true);
+ preselUser = config->readEntry( "DefaultUser" );
+ cbjumppw->setChecked(config->readBoolEntry( "FocusPasswd", false) );
+
+ slotPresChanged();
+}
+
+
+void TDMConvenienceWidget::defaults()
+{
+ alGroup->setChecked(false);
+ delaysb->setValue(0);
+ againcb->setChecked(false);
+ autoLockCheck->setChecked(false);
+ npRadio->setChecked(true);
+ npGroup->setChecked(false);
+ cbarlen->setChecked(false);
+ allowRootLogin->setChecked(false);
+ cbjumppw->setChecked(false);
+ autoUser = "";
+ preselUser = "";
+ noPassUsers.clear();
+
+ slotPresChanged();
+}
+
+
+void TDMConvenienceWidget::slotChanged()
+{
+ emit changed(true);
+}
+
+void TDMConvenienceWidget::slotSetAutoUser( const TQString &user )
+{
+ autoUser = user;
+}
+
+void TDMConvenienceWidget::slotSetPreselUser( const TQString &user )
+{
+ preselUser = user;
+}
+
+void TDMConvenienceWidget::slotUpdateNoPassUser( TQListViewItem *item )
+{
+ if ( !item )
+ return;
+ TQCheckListItem *itm = (TQCheckListItem *)item;
+ TQStringList::iterator it = noPassUsers.find( itm->text() );
+ if (itm->isOn()) {
+ if (it == noPassUsers.end())
+ noPassUsers.append( itm->text() );
+ } else {
+ if (it != noPassUsers.end())
+ noPassUsers.remove( it );
+ }
+}
+
+void TDMConvenienceWidget::slotClearUsers()
+{
+ userlb->clear();
+ puserlb->clear();
+ npuserlv->clear();
+ if (!autoUser.isEmpty())
+ userlb->insertItem(autoUser);
+ if (!preselUser.isEmpty())
+ puserlb->insertItem(preselUser);
+}
+
+void TDMConvenienceWidget::slotAddUsers(const TQMap<TQString,int> &users)
+{
+ TQMapConstIterator<TQString,int> it;
+ for (it = users.begin(); it != users.end(); ++it) {
+ if (it.data() > 0) {
+ if (it.key() != autoUser)
+ userlb->insertItem(it.key());
+ if (it.key() != preselUser)
+ puserlb->insertItem(it.key());
+ }
+ if (it.data() != 0)
+ (new TQCheckListItem(npuserlv, it.key(), TQCheckListItem::CheckBox))->
+ setOn(noPassUsers.find(it.key()) != noPassUsers.end());
+ }
+
+ if (userlb->listBox())
+ userlb->listBox()->sort();
+
+ if (puserlb->listBox())
+ puserlb->listBox()->sort();
+
+ npuserlv->sort();
+ userlb->setCurrentItem(autoUser);
+ puserlb->setCurrentItem(preselUser);
+}
+
+void TDMConvenienceWidget::slotDelUsers(const TQMap<TQString,int> &users)
+{
+ TQMapConstIterator<TQString,int> it;
+ for (it = users.begin(); it != users.end(); ++it) {
+ if (it.data() > 0) {
+ if (it.key() != autoUser && userlb->listBox())
+ delete userlb->listBox()->
+ findItem( it.key(), ExactMatch | CaseSensitive );
+ if (it.key() != preselUser && puserlb->listBox())
+ delete puserlb->listBox()->
+ findItem( it.key(), ExactMatch | CaseSensitive );
+ }
+ if (it.data() != 0)
+ delete npuserlv->findItem( it.key(), 0 );
+ }
+}
+
+#include "tdm-conv.moc"
diff --git a/kcontrol/tdm/tdm-conv.h b/kcontrol/tdm/tdm-conv.h
new file mode 100644
index 000000000..39e0e30f9
--- /dev/null
+++ b/kcontrol/tdm/tdm-conv.h
@@ -0,0 +1,84 @@
+/* This file is part of the KDE Display Manager Configuration package
+
+ Copyright (C) 2000 Oswald Buddenhagen <[email protected]>
+ Based on several other files.
+
+ 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.
+*/
+
+#ifndef __TDMCONV_H__
+#define __TDMCONV_H__
+
+#include <tqptrlist.h>
+#include <tqstring.h>
+#include <tqimage.h>
+#include <tqgroupbox.h>
+#include <tqradiobutton.h>
+#include <tqcheckbox.h>
+#include <tqspinbox.h>
+
+#include <tdelistbox.h>
+#include <kcombobox.h>
+#include <kcolorbutton.h>
+#include <tdelistview.h>
+#include <kurl.h>
+
+#include <pwd.h>
+
+
+class TDMConvenienceWidget : public TQWidget
+{
+ Q_OBJECT
+
+public:
+ TDMConvenienceWidget(TQWidget *parent=0, const char *name=0);
+
+ void load();
+ void save();
+ void defaults();
+ void makeReadOnly();
+
+public slots:
+ void slotClearUsers();
+ void slotAddUsers(const TQMap<TQString,int> &);
+ void slotDelUsers(const TQMap<TQString,int> &);
+
+
+signals:
+ void changed( bool state );
+
+private slots:
+ void slotPresChanged();
+ void slotChanged();
+ void slotSetAutoUser( const TQString &user );
+ void slotSetPreselUser( const TQString &user );
+ void slotUpdateNoPassUser( TQListViewItem *item );
+
+private:
+ TQGroupBox *alGroup, *puGroup, *npGroup, *btGroup;
+ TQCheckBox *againcb, *cbarlen, *cbjumppw, *autoLockCheck, *allowRootLogin;
+ TQRadioButton *npRadio, *ppRadio, *spRadio;
+ KComboBox *userlb, *puserlb;
+ TQSpinBox *delaysb;
+ TDEListView *npuserlv;
+ TQLabel *u_label, *d_label, *pu_label, *w_label, *n_label, *pl_label;
+ TQString autoUser, preselUser;
+ TQStringList noPassUsers;
+};
+
+#endif
+
+
diff --git a/kcontrol/tdm/tdm-font.cpp b/kcontrol/tdm/tdm-font.cpp
new file mode 100644
index 000000000..65dbea179
--- /dev/null
+++ b/kcontrol/tdm/tdm-font.cpp
@@ -0,0 +1,134 @@
+/* This file is part of the KDE Display Manager Configuration package
+ Copyright (C) 1997 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 <tqapplication.h>
+#include <tqcheckbox.h>
+#include <tqcombobox.h>
+#include <tqlayout.h>
+#include <tqlabel.h>
+#include <tqpushbutton.h>
+#include <tqwhatsthis.h>
+
+#include <kdialog.h>
+#include <ksimpleconfig.h>
+#include <tdefontrequester.h>
+#include <tdelocale.h>
+
+#include "tdm-font.h"
+
+
+extern KSimpleConfig *config;
+
+TDMFontWidget::TDMFontWidget(TQWidget *parent, const char *name)
+ : TQWidget(parent, name)
+{
+ TQGridLayout *ml = new TQGridLayout(this, 5, 2, KDialog::marginHint(), KDialog::spacingHint());
+ TQLabel *label = new TQLabel(i18n("&General:"), this);
+ stdFontChooser = new TDEFontRequester(this);
+ label->setBuddy(stdFontChooser);
+ TQWhatsThis::add( stdFontChooser, i18n("This changes the font which is used for all the text in the login manager except for the greeting and failure messages.") );
+ connect(stdFontChooser, TQT_SIGNAL(fontSelected(const TQFont&)),this,TQT_SLOT(configChanged()));
+ ml->addWidget(label, 1, 0);
+ ml->addWidget(stdFontChooser, 1, 1);
+
+ label = new TQLabel(i18n("&Failures:"), this);
+ failFontChooser = new TDEFontRequester(this);
+ label->setBuddy(failFontChooser);
+ TQWhatsThis::add( failFontChooser, i18n("This changes the font which is used for failure messages in the login manager.") );
+ connect(failFontChooser, TQT_SIGNAL(fontSelected(const TQFont&)),this,TQT_SLOT(configChanged()));
+ ml->addWidget(label, 2, 0);
+ ml->addWidget(failFontChooser, 2, 1);
+
+ label = new TQLabel(i18n("Gree&ting:"), this);
+ greetingFontChooser = new TDEFontRequester(this);
+ label->setBuddy(greetingFontChooser);
+ TQWhatsThis::add( greetingFontChooser, i18n("This changes the font which is used for the login manager's greeting.") );
+ connect(greetingFontChooser, TQT_SIGNAL(fontSelected(const TQFont&)),this,TQT_SLOT(configChanged()));
+ ml->addWidget(label, 3, 0);
+ ml->addWidget(greetingFontChooser, 3, 1);
+
+ aacb = new TQCheckBox (i18n("Use anti-aliasing for fonts"), this);
+ TQWhatsThis::add( aacb, i18n("If you check this box and your X-Server has the Xft extension, "
+ "fonts will be antialiased (smoothed) in the login dialog.") );
+ connect(aacb, TQT_SIGNAL(toggled ( bool )),this,TQT_SLOT(configChanged()));
+ ml->addMultiCellWidget(aacb, 4, 4, 0, 1);
+ ml->setRowStretch(5, 10);
+}
+
+void TDMFontWidget::makeReadOnly()
+{
+ stdFontChooser->button()->setEnabled(false);
+ failFontChooser->button()->setEnabled(false);
+ greetingFontChooser->button()->setEnabled(false);
+ aacb->setEnabled(false);
+}
+
+void TDMFontWidget::configChanged()
+{
+ emit changed(true);
+}
+
+void TDMFontWidget::set_def()
+{
+ stdFontChooser->setFont(TQFont("Sans Serif", 10));
+ failFontChooser->setFont(TQFont("Sans Serif", 10, TQFont::Bold));
+ greetingFontChooser->setFont(TQFont("Sans Serif", 22));
+}
+
+void TDMFontWidget::save()
+{
+ config->setGroup("X-*-Greeter");
+
+ // write font
+ config->writeEntry("StdFont", stdFontChooser->font());
+ config->writeEntry("GreetFont", greetingFontChooser->font());
+ config->writeEntry("FailFont", failFontChooser->font());
+ config->writeEntry("AntiAliasing", aacb->isChecked());
+}
+
+
+void TDMFontWidget::load()
+{
+ set_def();
+
+ config->setGroup("X-*-Greeter");
+
+ // Read the fonts
+ TQFont font = stdFontChooser->font();
+ stdFontChooser->setFont(config->readFontEntry("StdFont", &font));
+ font = failFontChooser->font();
+ failFontChooser->setFont(config->readFontEntry("FailFont", &font));
+ font = greetingFontChooser->font();
+ greetingFontChooser->setFont(config->readFontEntry("GreetFont", &font));
+
+ aacb->setChecked(config->readBoolEntry("AntiAliasing"));
+}
+
+
+void TDMFontWidget::defaults()
+{
+ set_def();
+ aacb->setChecked(true);
+}
+
+#include "tdm-font.moc"
diff --git a/kcontrol/tdm/tdm-font.h b/kcontrol/tdm/tdm-font.h
new file mode 100644
index 000000000..fbbbc5028
--- /dev/null
+++ b/kcontrol/tdm/tdm-font.h
@@ -0,0 +1,57 @@
+/* This file is part of the KDE Display Manager Configuration package
+ Copyright (C) 1997 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.
+*/
+
+#ifndef __TDMFONT_H__
+#define __TDMFONT_H__
+
+#include <tqwidget.h>
+
+class TDEFontRequester;
+class TQCheckBox;
+
+class TDMFontWidget : public TQWidget
+{
+ Q_OBJECT
+
+public:
+ TDMFontWidget(TQWidget *parent=0, const char *name=0);
+
+ void load();
+ void save();
+ void defaults();
+ void makeReadOnly();
+
+signals:
+ void changed( bool state );
+
+protected slots:
+ void configChanged();
+ void set_def();
+
+private:
+ TQCheckBox *aacb;
+ TDEFontRequester *greetingFontChooser;
+ TDEFontRequester *failFontChooser;
+ TDEFontRequester *stdFontChooser;
+};
+
+
+#endif
+
+
diff --git a/kcontrol/tdm/tdm-shut.cpp b/kcontrol/tdm/tdm-shut.cpp
new file mode 100644
index 000000000..14e681d18
--- /dev/null
+++ b/kcontrol/tdm/tdm-shut.cpp
@@ -0,0 +1,240 @@
+/* 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 <tqcheckbox.h>
+#include <tqcombobox.h>
+#include <tqlabel.h>
+#include <tqlayout.h>
+#include <tqwhatsthis.h>
+
+#include <ksimpleconfig.h>
+#include <karrowbutton.h>
+#include <klineedit.h>
+#include <tdelocale.h>
+#include <kdialog.h>
+#include <kurlrequester.h>
+
+#include "tdm-shut.h"
+#include "kbackedcombobox.h"
+
+extern KSimpleConfig *config;
+
+
+TDMSessionsWidget::TDMSessionsWidget(TQWidget *parent, const char *name)
+ : TQWidget(parent, name)
+{
+ TQString wtstr;
+
+ TQGroupBox *group0 = new TQGroupBox( i18n("Allow Shutdown"), this );
+
+ sdlcombo = new TQComboBox( FALSE, group0 );
+ sdllabel = new TQLabel (sdlcombo, i18n ("&Local:"), group0);
+ sdlcombo->insertItem(i18n("Everybody"), SdAll);
+ sdlcombo->insertItem(i18n("Only Root"), SdRoot);
+ sdlcombo->insertItem(i18n("Nobody"), SdNone);
+ connect(sdlcombo, TQT_SIGNAL(activated(int)), TQT_SLOT(changed()));
+ sdrcombo = new TQComboBox( FALSE, group0 );
+ sdrlabel = new TQLabel (sdrcombo, i18n ("&Remote:"), group0);
+ sdrcombo->insertItem(i18n("Everybody"), SdAll);
+ sdrcombo->insertItem(i18n("Only Root"), SdRoot);
+ sdrcombo->insertItem(i18n("Nobody"), SdNone);
+ connect(sdrcombo, TQT_SIGNAL(activated(int)), TQT_SLOT(changed()));
+ TQWhatsThis::add( group0, i18n("Here you can select who is allowed to shutdown"
+ " the computer using TDM. You can specify different values for local (console) and remote displays. "
+ "Possible values are:<ul>"
+ " <li><em>Everybody:</em> everybody can shutdown the computer using TDM</li>"
+ " <li><em>Only root:</em> TDM will only allow shutdown after the user has entered the root password</li>"
+ " <li><em>Nobody:</em> nobody can shutdown the computer using TDM</li></ul>") );
+
+
+ TQGroupBox *group1 = new TQGroupBox( i18n("Commands"), this );
+
+ shutdown_lined = new KURLRequester(group1);
+ TQLabel *shutdown_label = new TQLabel(shutdown_lined, i18n("H&alt:"), group1);
+ connect(shutdown_lined, TQT_SIGNAL(textChanged(const TQString&)),
+ TQT_SLOT(changed()));
+ wtstr = i18n("Command to initiate the system halt. Typical value: /sbin/halt");
+ TQWhatsThis::add( shutdown_label, wtstr );
+ TQWhatsThis::add( shutdown_lined, wtstr );
+
+ restart_lined = new KURLRequester(group1);
+ TQLabel *restart_label = new TQLabel(restart_lined, i18n("Reb&oot:"), group1);
+ connect(restart_lined, TQT_SIGNAL(textChanged(const TQString&)),
+ TQT_SLOT(changed()));
+ wtstr = i18n("Command to initiate the system reboot. Typical value: /sbin/reboot");
+ TQWhatsThis::add( restart_label, wtstr );
+ TQWhatsThis::add( restart_lined, wtstr );
+
+
+ TQGroupBox *group4 = new TQGroupBox( i18n("Miscellaneous"), this );
+
+ bm_combo = new KBackedComboBox( group4 );
+ bm_combo->insertItem("None", i18n("boot manager", "None"));
+ bm_combo->insertItem("Grub", i18n("Grub"));
+#if defined(__linux__) && ( defined(__i386__) || defined(__amd64__) )
+ bm_combo->insertItem("Lilo", i18n("Lilo"));
+#endif
+ TQLabel *bm_label = new TQLabel( bm_combo, i18n("Boot manager:"), group4 );
+ connect(bm_combo, TQT_SIGNAL(activated(int)), TQT_SLOT(changed()));
+ wtstr = i18n("Enable boot options in the \"Shutdown...\" dialog.");
+ TQWhatsThis::add( bm_label, wtstr );
+ TQWhatsThis::add( bm_combo, wtstr );
+
+ tsbox = new TQCheckBox( i18n("Restart X-Server with session exit"), this );
+ connect( tsbox, TQT_SIGNAL(toggled(bool)), TQT_SLOT(changed()) );
+ wtstr = i18n("Whether the login manager should restart the local X-Server after a session exit instead of resetting. Use this option when the X-Server leaks memory, crashes the system on reset attempts, or otherwise exhibits display issues or artifacts.");
+ TQWhatsThis::add( tsbox, wtstr );
+
+ TQBoxLayout *main = new TQVBoxLayout( this, 10 );
+ TQGridLayout *lgroup0 = new TQGridLayout( group0, 1, 1, 10);
+ TQGridLayout *lgroup1 = new TQGridLayout( group1, 1, 1, 10);
+ TQGridLayout *lgroup4 = new TQGridLayout( group4, 1, 1, 10);
+
+ main->addWidget(group0);
+ main->addWidget(group1);
+ main->addWidget(group4);
+ main->addWidget(tsbox);
+ main->addStretch();
+
+ lgroup0->addRowSpacing(0, group0->fontMetrics().height()/2);
+ lgroup0->addColSpacing(2, KDialog::spacingHint() * 2);
+ lgroup0->setColStretch(1, 1);
+ lgroup0->setColStretch(4, 1);
+ lgroup0->addWidget(sdllabel, 1, 0);
+ lgroup0->addWidget(sdlcombo, 1, 1);
+ lgroup0->addWidget(sdrlabel, 1, 3);
+ lgroup0->addWidget(sdrcombo, 1, 4);
+
+ lgroup1->addRowSpacing(0, group1->fontMetrics().height()/2);
+ lgroup1->addColSpacing(2, KDialog::spacingHint() * 2);
+ lgroup1->setColStretch(1, 1);
+ lgroup1->setColStretch(4, 1);
+ lgroup1->addWidget(shutdown_label, 1, 0);
+ lgroup1->addWidget(shutdown_lined, 1, 1);
+ lgroup1->addWidget(restart_label, 1, 3);
+ lgroup1->addWidget(restart_lined, 1, 4);
+
+ lgroup4->addRowSpacing(0, group4->fontMetrics().height()/2);
+ lgroup4->addWidget(bm_label, 1, 0);
+ lgroup4->addWidget(bm_combo, 1, 1);
+ lgroup4->setColStretch(2, 1);
+
+ main->activate();
+
+}
+
+void TDMSessionsWidget::makeReadOnly()
+{
+ sdlcombo->setEnabled(false);
+ sdrcombo->setEnabled(false);
+
+ restart_lined->lineEdit()->setReadOnly(true);
+ restart_lined->button()->setEnabled(false);
+ shutdown_lined->lineEdit()->setReadOnly(true);
+ shutdown_lined->button()->setEnabled(false);
+
+ bm_combo->setEnabled(false);
+ tsbox->setEnabled(false);
+}
+
+void TDMSessionsWidget::writeSD(TQComboBox *combo)
+{
+ TQString what;
+ switch (combo->currentItem()) {
+ case SdAll: what = "All"; break;
+ case SdRoot: what = "Root"; break;
+ default: what = "None"; break;
+ }
+ config->writeEntry( "AllowShutdown", what);
+}
+
+void TDMSessionsWidget::save()
+{
+ config->setGroup("X-:*-Core");
+ writeSD(sdlcombo);
+ config->writeEntry( "TerminateServer", tsbox->isChecked() );
+
+ config->setGroup("X-*-Core");
+ writeSD(sdrcombo);
+
+ config->setGroup("Shutdown");
+ config->writeEntry("HaltCmd", shutdown_lined->url(), true);
+ config->writeEntry("RebootCmd", restart_lined->url(), true);
+
+ config->writeEntry("BootManager", bm_combo->currentId());
+}
+
+void TDMSessionsWidget::readSD(TQComboBox *combo, TQString def)
+{
+ TQString str = config->readEntry("AllowShutdown", def);
+ SdModes sdMode;
+ if(str == "All")
+ sdMode = SdAll;
+ else if(str == "Root")
+ sdMode = SdRoot;
+ else
+ sdMode = SdNone;
+ combo->setCurrentItem(sdMode);
+}
+
+void TDMSessionsWidget::load()
+{
+ config->setGroup("X-:*-Core");
+ readSD(sdlcombo, "All");
+ tsbox->setChecked(config->readBoolEntry("TerminateServer", false));
+
+
+ config->setGroup("X-*-Core");
+ readSD(sdrcombo, "Root");
+
+ config->setGroup("Shutdown");
+ restart_lined->setURL(config->readEntry("RebootCmd", "/sbin/reboot"));
+#if defined(__OpenBSD__)
+ shutdown_lined->setURL(config->readEntry("HaltCmd", "/sbin/halt -p"));
+#else
+ shutdown_lined->setURL(config->readEntry("HaltCmd", "/sbin/poweroff"));
+#endif
+
+ bm_combo->setCurrentId(config->readEntry("BootManager", "None"));
+}
+
+
+
+void TDMSessionsWidget::defaults()
+{
+ restart_lined->setURL("/sbin/reboot");
+ shutdown_lined->setURL("/sbin/poweroff");
+
+ sdlcombo->setCurrentItem(SdAll);
+ sdrcombo->setCurrentItem(SdRoot);
+
+ bm_combo->setCurrentId("None");
+}
+
+
+void TDMSessionsWidget::changed()
+{
+ emit changed(true);
+}
+
+#include "tdm-shut.moc"
diff --git a/kcontrol/tdm/tdm-shut.h b/kcontrol/tdm/tdm-shut.h
new file mode 100644
index 000000000..a8d22adc2
--- /dev/null
+++ b/kcontrol/tdm/tdm-shut.h
@@ -0,0 +1,65 @@
+/* This file is part of the KDE Display Manager Configuration package
+ Copyright (C) 1997 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.
+*/
+
+#ifndef __TDMSESS_H__
+#define __TDMSESS_H__
+
+
+#include <tqstring.h>
+
+class TQComboBox;
+class TQCheckBox;
+class KURLRequester;
+class KBackedComboBox;
+
+class TDMSessionsWidget : public TQWidget
+{
+ Q_OBJECT
+
+public:
+ TDMSessionsWidget(TQWidget *parent=0, const char *name=0);
+
+ void load();
+ void save();
+ void defaults();
+ void makeReadOnly();
+
+ enum SdModes { SdAll, SdRoot, SdNone };
+
+signals:
+ void changed( bool state );
+
+protected slots:
+ void changed();
+
+private:
+ void readSD (TQComboBox *, TQString);
+ void writeSD (TQComboBox *);
+
+ TQComboBox *sdlcombo, *sdrcombo;
+ TQLabel *sdllabel, *sdrlabel;
+ KURLRequester *restart_lined, *shutdown_lined;
+ KBackedComboBox *bm_combo;
+ TQCheckBox *tsbox;
+};
+
+
+#endif
+
+
diff --git a/kcontrol/tdm/tdm-users.cpp b/kcontrol/tdm/tdm-users.cpp
new file mode 100644
index 000000000..d39d4048e
--- /dev/null
+++ b/kcontrol/tdm/tdm-users.cpp
@@ -0,0 +1,500 @@
+/* This file is part of the KDE Display Manager Configuration package
+ Copyright (C) 1997 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 <tqstyle.h>
+#include <tqlayout.h>
+#include <tqlabel.h>
+#include <tqtooltip.h>
+#include <tqvalidator.h>
+#include <tqwhatsthis.h>
+#include <tqvgroupbox.h>
+#include <tqpushbutton.h>
+
+#include <tdefiledialog.h>
+#include <kimageio.h>
+#include <kimagefilepreview.h>
+#include <tdeio/netaccess.h>
+#include <tdelocale.h>
+#include <kstandarddirs.h>
+#include <tdemessagebox.h>
+#include <kurldrag.h>
+
+#include "tdm-users.h"
+
+#include <sys/stat.h>
+
+
+extern KSimpleConfig *config;
+
+TDMUsersWidget::TDMUsersWidget(TQWidget *parent, const char *name)
+ : TQWidget(parent, name)
+{
+#ifdef __linux__
+ struct stat st;
+ if (!stat( "/etc/debian_version", &st )) { /* debian */
+ defminuid = "1000";
+ defmaxuid = "29999";
+ } else if (!stat( "/usr/portage", &st )) { /* gentoo */
+ defminuid = "1000";
+ defmaxuid = "65000";
+ } else if (!stat( "/etc/mandrake-release", &st )) { /* mandrake - check before redhat! */
+ defminuid = "500";
+ defmaxuid = "65000";
+ } else if (!stat( "/etc/redhat-release", &st )) { /* redhat */
+ defminuid = "100";
+ defmaxuid = "65000";
+ } else /* if (!stat( "/etc/SuSE-release", &st )) */ { /* suse */
+ defminuid = "500";
+ defmaxuid = "65000";
+ }
+#else
+ defminuid = "1000";
+ defmaxuid = "65000";
+#endif
+
+ // We assume that $kde_datadir/tdm exists, but better check for pics/ and pics/users,
+ // and create them if necessary.
+ config->setGroup( "X-*-Greeter" );
+ m_userPixDir = config->readEntry( "FaceDir", TDEGlobal::dirs()->resourceDirs("data").last() + "tdm/faces" ) + '/';
+ m_notFirst = false;
+ TQDir testDir( m_userPixDir );
+ if ( !testDir.exists() && !testDir.mkdir( testDir.absPath() ) && !geteuid() )
+ KMessageBox::sorry( this, i18n("Unable to create folder %1").arg( testDir.absPath() ) );
+ chmod( TQFile::encodeName( m_userPixDir ), 0755 );
+
+ m_defaultText = i18n("<default>");
+
+ TQString wtstr;
+
+ minGroup = new TQGroupBox( 2, Qt::Horizontal, i18n("System U&IDs"), this );
+ TQWhatsThis::add( minGroup, i18n("Users with a UID (numerical user identification) outside this range will not be listed by TDM and this setup dialog."
+ " Note that users with the UID 0 (typically root) are not affected by this and must be"
+ " explicitly hidden in \"Not hidden\" mode."));
+ TQSizePolicy sp_ign_fix( TQSizePolicy::Ignored, TQSizePolicy::Fixed );
+ TQValidator *valid = new TQIntValidator( 0, 999999, TQT_TQOBJECT(minGroup) );
+ TQLabel *minlab = new TQLabel( i18n("Below:"), minGroup );
+ leminuid = new KLineEdit( minGroup );
+ minlab->setBuddy( leminuid );
+ leminuid->setSizePolicy( sp_ign_fix );
+ leminuid->setValidator( valid );
+ connect( leminuid, TQT_SIGNAL(textChanged( const TQString & )), TQT_SLOT(slotChanged()) );
+ connect( leminuid, TQT_SIGNAL(textChanged( const TQString & )), TQT_SLOT(slotMinMaxChanged()) );
+ TQLabel *maxlab = new TQLabel( i18n("Above:"), minGroup );
+ lemaxuid = new KLineEdit( minGroup );
+ maxlab->setBuddy( lemaxuid );
+ lemaxuid->setSizePolicy( sp_ign_fix );
+ lemaxuid->setValidator( valid );
+ connect(lemaxuid, TQT_SIGNAL(textChanged( const TQString & )), TQT_SLOT(slotChanged()) );
+ connect(lemaxuid, TQT_SIGNAL(textChanged( const TQString & )), TQT_SLOT(slotMinMaxChanged()) );
+
+ usrGroup = new TQButtonGroup( 5, Qt::Vertical, i18n("Users"), this );
+ connect( usrGroup, TQT_SIGNAL(clicked( int )), TQT_SLOT(slotShowOpts()) );
+ connect( usrGroup, TQT_SIGNAL(clicked( int )), TQT_SLOT(slotChanged()) );
+ cbshowlist = new TQCheckBox( i18n("Show list"), usrGroup );
+ TQWhatsThis::add( cbshowlist, i18n("If this option is checked, TDM will show a list of users,"
+ " so users can click on their name or image rather than typing in their login.") );
+ cbcomplete = new TQCheckBox( i18n("Autocompletion"), usrGroup );
+ TQWhatsThis::add( cbcomplete, i18n("If this option is checked, TDM will automatically complete"
+ " user names while they are typed in the line edit.") );
+ cbinverted = new TQCheckBox( i18n("Inverse selection"), usrGroup );
+ TQWhatsThis::add( cbinverted, i18n("This option specifies how the users for \"Show list\" and \"Autocompletion\""
+ " are selected in the \"Select users and groups\" list: "
+ "If not checked, select only the checked users. "
+ "If checked, select all non-system users, except the checked ones."));
+ cbusrsrt = new TQCheckBox( i18n("Sor&t users"), usrGroup );
+ connect( cbusrsrt, TQT_SIGNAL(toggled( bool )), TQT_SLOT(slotChanged()) );
+ TQWhatsThis::add( cbusrsrt, i18n("If this is checked, TDM will alphabetically sort the user list."
+ " Otherwise users are listed in the order they appear in the password file.") );
+
+ wstack = new TQWidgetStack( this );
+ s_label = new TQLabel( wstack, i18n("S&elect users and groups:"), this );
+ optinlv = new TDEListView( this );
+ optinlv->addColumn( i18n("Selected Users") );
+ optinlv->setResizeMode( TQListView::LastColumn );
+ TQWhatsThis::add( optinlv, i18n("TDM will show all checked users. Entries denoted with '@' are user groups. Checking a group is like checking all users in that group.") );
+ wstack->addWidget( optinlv );
+ connect( optinlv, TQT_SIGNAL(clicked( TQListViewItem * )),
+ TQT_SLOT(slotUpdateOptIn( TQListViewItem * )) );
+ connect( optinlv, TQT_SIGNAL(clicked( TQListViewItem * )),
+ TQT_SLOT(slotChanged()) );
+ optoutlv = new TDEListView( this );
+ optoutlv->addColumn( i18n("Hidden Users") );
+ optoutlv->setResizeMode( TQListView::LastColumn );
+ TQWhatsThis::add( optoutlv, i18n("TDM will show all non-checked non-system users. Entries denoted with '@' are user groups. Checking a group is like checking all users in that group.") );
+ wstack->addWidget( optoutlv );
+ connect( optoutlv, TQT_SIGNAL(clicked( TQListViewItem * )),
+ TQT_SLOT(slotUpdateOptOut( TQListViewItem * )) );
+ connect( optoutlv, TQT_SIGNAL(clicked( TQListViewItem * )),
+ TQT_SLOT(slotChanged()) );
+
+ faceGroup = new TQButtonGroup( 5, Qt::Vertical, i18n("User Image Source"), this );
+ TQWhatsThis::add( faceGroup, i18n("Here you can specify where TDM will obtain the images that represent users."
+ " \"Admin\" represents the global folder; these are the pictures you can set below."
+ " \"User\" means that TDM should read the user's $HOME/.face.icon file."
+ " The two selections in the middle define the order of preference if both sources are available.") );
+ connect( faceGroup, TQT_SIGNAL(clicked( int )), TQT_SLOT(slotFaceOpts()) );
+ connect( faceGroup, TQT_SIGNAL(clicked( int )), TQT_SLOT(slotChanged()) );
+ rbadmonly = new TQRadioButton( i18n("Admin"), faceGroup );
+ rbprefadm = new TQRadioButton( i18n("Admin, user"), faceGroup );
+ rbprefusr = new TQRadioButton( i18n("User, admin"), faceGroup );
+ rbusronly = new TQRadioButton( i18n("User"), faceGroup );
+
+ TQGroupBox *picGroup = new TQVGroupBox( i18n("User Images"), this );
+ TQWidget *hlpw = new TQWidget( picGroup );
+ usercombo = new KComboBox( hlpw );
+ TQWhatsThis::add( usercombo, i18n("The user the image below belongs to.") );
+ connect( usercombo, TQT_SIGNAL(activated( int )),
+ TQT_SLOT(slotUserSelected()) );
+ TQLabel *userlabel = new TQLabel( usercombo, i18n("User:"), hlpw );
+ userbutton = new TQPushButton( hlpw );
+ userbutton->setAcceptDrops( true );
+ userbutton->installEventFilter( this ); // for drag and drop
+ uint sz = style().pixelMetric( TQStyle::PM_ButtonMargin ) * 2 + 48;
+ userbutton->setFixedSize( sz, sz );
+ connect( userbutton, TQT_SIGNAL(clicked()),
+ TQT_SLOT(slotUserButtonClicked()) );
+ TQToolTip::add( userbutton, i18n("Click or drop an image here") );
+ TQWhatsThis::add( userbutton, i18n("Here you can see the image assigned to the user selected in the combo box above. Click on the image button to select from a list"
+ " of images or drag and drop your own image on to the button (e.g. from Konqueror).") );
+ rstuserbutton = new TQPushButton( i18n("Unset"), hlpw );
+ TQWhatsThis::add( rstuserbutton, i18n("Click this button to make TDM use the default image for the selected user.") );
+ connect( rstuserbutton, TQT_SIGNAL(clicked()),
+ TQT_SLOT(slotUnsetUserPix()) );
+ TQGridLayout *hlpl = new TQGridLayout( hlpw, 3, 2, 0, KDialog::spacingHint() );
+ hlpl->addWidget( userlabel, 0, 0 );
+// hlpl->addSpacing( KDialog::spacingHint() );
+ hlpl->addWidget( usercombo, 0, 1 );
+ hlpl->addMultiCellWidget( userbutton, 1,1, 0,1, Qt::AlignHCenter );
+ hlpl->addMultiCellWidget( rstuserbutton, 2,2, 0,1, Qt::AlignHCenter );
+
+ TQHBoxLayout *main = new TQHBoxLayout( this, 10 );
+
+ TQVBoxLayout *lLayout = new TQVBoxLayout( main, 10 );
+ lLayout->addWidget( minGroup );
+ lLayout->addWidget( usrGroup );
+ lLayout->addStretch( 1 );
+
+ TQVBoxLayout *mLayout = new TQVBoxLayout( main, 10 );
+ mLayout->addWidget( s_label );
+ mLayout->addWidget( wstack );
+ mLayout->setStretchFactor( wstack, 1 );
+ main->setStretchFactor( mLayout, 1 );
+
+ TQVBoxLayout *rLayout = new TQVBoxLayout( main, 10 );
+ rLayout->addWidget( faceGroup );
+ rLayout->addWidget( picGroup );
+ rLayout->addStretch( 1 );
+
+}
+
+void TDMUsersWidget::makeReadOnly()
+{
+ leminuid->setReadOnly(true);
+ lemaxuid->setReadOnly(true);
+ cbshowlist->setEnabled(false);
+ cbcomplete->setEnabled(false);
+ cbinverted->setEnabled(false);
+ cbusrsrt->setEnabled(false);
+ rbadmonly->setEnabled(false);
+ rbprefadm->setEnabled(false);
+ rbprefusr->setEnabled(false);
+ rbusronly->setEnabled(false);
+ wstack->setEnabled(false);
+ disconnect( userbutton, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotUserButtonClicked()) );
+ userbutton->setAcceptDrops(false);
+ rstuserbutton->setEnabled(false);
+}
+
+void TDMUsersWidget::slotShowOpts()
+{
+ bool en = cbshowlist->isChecked() || cbcomplete->isChecked();
+ cbinverted->setEnabled( en );
+ cbusrsrt->setEnabled( en );
+ wstack->setEnabled( en );
+ wstack->raiseWidget( cbinverted->isChecked() ? optoutlv : optinlv );
+ en = cbshowlist->isChecked();
+ faceGroup->setEnabled( en );
+ if (!en) {
+ usercombo->setEnabled( false );
+ userbutton->setEnabled( false );
+ rstuserbutton->setEnabled( false );
+ } else
+ slotFaceOpts();
+}
+
+void TDMUsersWidget::slotFaceOpts()
+{
+ bool en = !rbusronly->isChecked();
+ usercombo->setEnabled( en );
+ userbutton->setEnabled( en );
+ if (en)
+ slotUserSelected();
+ else
+ rstuserbutton->setEnabled( false );
+}
+
+void TDMUsersWidget::slotUserSelected()
+{
+ TQString user = usercombo->currentText();
+ TQImage p;
+ if (user != m_defaultText &&
+ p.load( m_userPixDir + user + ".face.icon" )) {
+ rstuserbutton->setEnabled( !getuid() );
+ } else {
+ p.load( m_userPixDir + ".default.face.icon" );
+ rstuserbutton->setEnabled( false );
+ }
+ userbutton->setPixmap( p.smoothScale( 48, 48, TQ_ScaleMin ) );
+}
+
+
+void TDMUsersWidget::changeUserPix(const TQString &pix)
+{
+ TQString user( usercombo->currentText() );
+ if (user == m_defaultText)
+ {
+ user = ".default";
+ if (KMessageBox::questionYesNo(this, i18n("Save image as default image?"),TQString::null,KStdGuiItem::save(),KStdGuiItem::cancel())
+ != KMessageBox::Yes)
+ return;
+ }
+
+ TQImage p( pix );
+ if (p.isNull()) {
+ KMessageBox::sorry( this,
+ i18n("There was an error loading the image\n"
+ "%1").arg( pix ) );
+ return;
+ }
+
+ p = p.smoothScale( 48, 48, TQ_ScaleMin );
+ TQString userpix = m_userPixDir + user + ".face.icon";
+ if (!p.save( userpix, "PNG" ))
+ KMessageBox::sorry(this,
+ i18n("There was an error saving the image:\n%1")
+ .arg( userpix ) );
+ else
+ chmod( TQFile::encodeName( userpix ), 0644 );
+
+ slotUserSelected();
+}
+
+void TDMUsersWidget::slotUserButtonClicked()
+{
+ KFileDialog dlg(m_notFirst ? TQString::null :
+ TDEGlobal::dirs()->resourceDirs("data").last() + "tdm/pics/users",
+ KImageIO::pattern( KImageIO::Reading ),
+ this, 0, true);
+ dlg.setOperationMode( KFileDialog::Opening );
+ dlg.setCaption( i18n("Choose Image") );
+ dlg.setMode( KFile::File | KFile::LocalOnly );
+
+ KImageFilePreview *ip = new KImageFilePreview( &dlg );
+ dlg.setPreviewWidget( ip );
+ if (dlg.exec() != TQDialog::Accepted)
+ return;
+ m_notFirst = true;
+
+ changeUserPix( dlg.selectedFile() );
+}
+
+void TDMUsersWidget::slotUnsetUserPix()
+{
+ TQFile::remove( m_userPixDir + usercombo->currentText() + ".face.icon" );
+ slotUserSelected();
+}
+
+bool TDMUsersWidget::eventFilter(TQObject *, TQEvent *e)
+{
+ if (e->type() == TQEvent::DragEnter) {
+ TQDragEnterEvent *ee = (TQDragEnterEvent *) e;
+ ee->accept( KURLDrag::canDecode(ee) );
+ return true;
+ }
+
+ if (e->type() == TQEvent::Drop) {
+ userButtonDropEvent((TQDropEvent *) e);
+ return true;
+ }
+
+ return false;
+}
+
+KURL *decodeImgDrop(TQDropEvent *e, TQWidget *wdg);
+
+void TDMUsersWidget::userButtonDropEvent(TQDropEvent *e)
+{
+ KURL *url = decodeImgDrop(e, this);
+ if (url) {
+ TQString pixpath;
+ TDEIO::NetAccess::download(*url, pixpath, parentWidget());
+ changeUserPix( pixpath );
+ TDEIO::NetAccess::removeTempFile(pixpath);
+ delete url;
+ }
+}
+
+void TDMUsersWidget::save()
+{
+ config->setGroup( "X-*-Greeter" );
+
+ config->writeEntry( "MinShowUID", leminuid->text() );
+ config->writeEntry( "MaxShowUID", lemaxuid->text() );
+
+ config->writeEntry( "UserList", cbshowlist->isChecked() );
+ config->writeEntry( "UserCompletion", cbcomplete->isChecked() );
+ config->writeEntry( "ShowUsers",
+ cbinverted->isChecked() ? "NotHidden" : "Selected" );
+ config->writeEntry( "SortUsers", cbusrsrt->isChecked() );
+
+ config->writeEntry( "HiddenUsers", hiddenUsers );
+ config->writeEntry( "SelectedUsers", selectedUsers );
+
+ config->writeEntry( "FaceSource",
+ rbadmonly->isChecked() ? "AdminOnly" :
+ rbprefadm->isChecked() ? "PreferAdmin" :
+ rbprefusr->isChecked() ? "PreferUser" : "UserOnly" );
+}
+
+
+void TDMUsersWidget::updateOptList( TQListViewItem *item, TQStringList &list )
+{
+ if ( !item )
+ return;
+ TQCheckListItem *itm = (TQCheckListItem *)item;
+ TQStringList::iterator it = list.find( itm->text() );
+ if (itm->isOn()) {
+ if (it == list.end())
+ list.append( itm->text() );
+ } else {
+ if (it != list.end())
+ list.remove( it );
+ }
+}
+
+void TDMUsersWidget::slotUpdateOptIn( TQListViewItem *item )
+{
+ updateOptList( item, selectedUsers );
+}
+
+void TDMUsersWidget::slotUpdateOptOut( TQListViewItem *item )
+{
+ updateOptList( item, hiddenUsers );
+}
+
+void TDMUsersWidget::slotClearUsers()
+{
+ optinlv->clear();
+ optoutlv->clear();
+ usercombo->clear();
+ usercombo->insertItem( m_defaultText );
+}
+
+void TDMUsersWidget::slotAddUsers(const TQMap<TQString,int> &users)
+{
+ TQMapConstIterator<TQString,int> it;
+ for (it = users.begin(); it != users.end(); ++it) {
+ const TQString *name = &it.key();
+ (new TQCheckListItem(optinlv, *name, TQCheckListItem::CheckBox))->
+ setOn(selectedUsers.find(*name) != selectedUsers.end());
+ (new TQCheckListItem(optoutlv, *name, TQCheckListItem::CheckBox))->
+ setOn(hiddenUsers.find(*name) != hiddenUsers.end());
+ if ((*name)[0] != '@')
+ usercombo->insertItem(*name);
+ }
+ optinlv->sort();
+ optoutlv->sort();
+ if (usercombo->listBox())
+ usercombo->listBox()->sort();
+}
+
+void TDMUsersWidget::slotDelUsers(const TQMap<TQString,int> &users)
+{
+ TQMapConstIterator<TQString,int> it;
+ for (it = users.begin(); it != users.end(); ++it) {
+ const TQString *name = &it.key();
+ if (usercombo->listBox())
+ delete usercombo->listBox()->findItem( *name, ExactMatch | CaseSensitive );
+ delete optinlv->findItem( *name, 0 );
+ delete optoutlv->findItem( *name, 0 );
+ }
+}
+
+void TDMUsersWidget::load()
+{
+ TQString str;
+
+ config->setGroup("X-*-Greeter");
+
+ selectedUsers = config->readListEntry( "SelectedUsers");
+ hiddenUsers = config->readListEntry( "HiddenUsers");
+
+ leminuid->setText(config->readEntry("MinShowUID", defminuid));
+ lemaxuid->setText(config->readEntry("MaxShowUID", defmaxuid));
+
+ cbshowlist->setChecked( config->readBoolEntry( "UserList", true ) );
+ cbcomplete->setChecked( config->readBoolEntry( "UserCompletion", false ) );
+ cbinverted->setChecked( config->readEntry( "ShowUsers" ) != "Selected" );
+ cbusrsrt->setChecked(config->readBoolEntry("SortUsers", true));
+
+ TQString ps = config->readEntry( "FaceSource" );
+ if (ps == TQString::fromLatin1("UserOnly"))
+ rbusronly->setChecked(true);
+ else if (ps == TQString::fromLatin1("PreferUser"))
+ rbprefusr->setChecked(true);
+ else if (ps == TQString::fromLatin1("PreferAdmin"))
+ rbprefadm->setChecked(true);
+ else
+ rbadmonly->setChecked(true);
+
+ slotUserSelected();
+
+ slotShowOpts();
+ slotFaceOpts();
+}
+
+void TDMUsersWidget::defaults()
+{
+ leminuid->setText( defminuid );
+ lemaxuid->setText( defmaxuid );
+ cbshowlist->setChecked( true );
+ cbcomplete->setChecked( false );
+ cbinverted->setChecked( true );
+ cbusrsrt->setChecked( true );
+ rbadmonly->setChecked( true );
+ hiddenUsers.clear();
+ selectedUsers.clear();
+ slotShowOpts();
+ slotFaceOpts();
+}
+
+void TDMUsersWidget::slotMinMaxChanged()
+{
+ emit setMinMaxUID( leminuid->text().toInt(), lemaxuid->text().toInt() );
+}
+
+void TDMUsersWidget::slotChanged()
+{
+ emit changed(true);
+}
+
+#include "tdm-users.moc"
diff --git a/kcontrol/tdm/tdm-users.h b/kcontrol/tdm/tdm-users.h
new file mode 100644
index 000000000..08c66c6f8
--- /dev/null
+++ b/kcontrol/tdm/tdm-users.h
@@ -0,0 +1,106 @@
+/* This file is part of the KDE Display Manager Configuration package
+ Copyright (C) 1997 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.
+*/
+
+#ifndef __TDMUSERS_H__
+#define __TDMUSERS_H__
+
+#include <tqwidget.h>
+#include <tqptrlist.h>
+#include <tqstring.h>
+#include <tqimage.h>
+#include <tqbuttongroup.h>
+#include <tqradiobutton.h>
+#include <tqcheckbox.h>
+#include <tqwidgetstack.h>
+
+#include <klineedit.h>
+#include <tdelistview.h>
+#include <kcombobox.h>
+#include <kurl.h>
+
+#include <pwd.h>
+
+
+class TDMUsersWidget : public TQWidget
+{
+ Q_OBJECT
+
+public:
+ TDMUsersWidget( TQWidget *parent = 0, const char *name = 0 );
+
+ void load();
+ void save();
+ void defaults();
+ void makeReadOnly();
+
+ bool eventFilter( TQObject *o, TQEvent *e );
+
+public slots:
+ void slotClearUsers();
+ void slotAddUsers( const TQMap<TQString,int> & );
+ void slotDelUsers( const TQMap<TQString,int> & );
+
+signals:
+ void changed( bool state );
+ void setMinMaxUID( int, int );
+
+private slots:
+ void slotMinMaxChanged();
+ void slotShowOpts();
+ void slotUpdateOptIn( TQListViewItem *item );
+ void slotUpdateOptOut( TQListViewItem *item );
+ void slotUserSelected();
+ void slotUnsetUserPix();
+ void slotFaceOpts();
+ void slotUserButtonClicked();
+ void slotChanged();
+
+private:
+ void updateOptList( TQListViewItem *item, TQStringList &list );
+ void userButtonDropEvent( TQDropEvent *e );
+ void changeUserPix( const TQString & );
+
+ TQGroupBox *minGroup; // top left
+ TQLineEdit *leminuid, *lemaxuid;
+
+ TQButtonGroup *usrGroup; // right below
+ TQCheckBox *cbshowlist, *cbcomplete, *cbinverted, *cbusrsrt;
+
+ TQLabel *s_label; // middle
+ TQWidgetStack *wstack;
+ TDEListView *optoutlv, *optinlv;
+
+ TQButtonGroup *faceGroup; // right
+ TQRadioButton *rbadmonly, *rbprefadm, *rbprefusr, *rbusronly;
+
+ KComboBox *usercombo; // right below
+ TQPushButton *userbutton;
+ TQPushButton *rstuserbutton;
+
+ TQString m_userPixDir;
+ TQString m_defaultText;
+ TQStringList hiddenUsers, selectedUsers;
+ TQString defminuid, defmaxuid;
+
+ bool m_notFirst;
+};
+
+#endif
+
+
diff --git a/kcontrol/tdm/tdm.desktop b/kcontrol/tdm/tdm.desktop
new file mode 100644
index 000000000..349ec8709
--- /dev/null
+++ b/kcontrol/tdm/tdm.desktop
@@ -0,0 +1,243 @@
+[Desktop Entry]
+Exec=tdecmshell tdm
+Icon=tdmconfig
+Type=Application
+X-DocPath=tdm/index.html
+
+X-TDE-SubstituteUID=true
+
+X-TDE-Library=tdm
+X-TDE-RootOnly=true
+
+X-TDE-ParentApp=kcontrol
+
+Name=Login Manager
+Name[af]=Aanteken Bestuurder
+Name[ar]=مسيير تسجيل الدخول
+Name[az]=İclas Açma İdarəcisi
+Name[be]=Кіраўнік уваходу
+Name[bg]=Вход в системата
+Name[bn]=লগ-ইন ম্যানেজার
+Name[br]=Merour ereañ
+Name[bs]=Login menadžer
+Name[ca]=Gestor d'accés
+Name[cs]=Správce přihlášení
+Name[csb]=Menedżer logòwaniô
+Name[cy]=Rheolydd Mewngofnodi
+Name[da]=Login-håndtering
+Name[de]=Anmeldungsmanager
+Name[el]=Διαχειριστής σύνδεσης
+Name[eo]=Salutilo
+Name[es]=Gestor de acceso
+Name[et]=Sisselogimise haldur
+Name[eu]=Saio-hasieraren kudeatzailea
+Name[fa]=مدیر ورود
+Name[fi]=Sisäänkirjautumisasetukset
+Name[fr]=Gestionnaire de connexion
+Name[fy]=Oanmeldskerm
+Name[ga]=Bainisteoir Logála Isteach
+Name[gl]=Xestor de Login
+Name[he]=מנהל הכניסה למערכת
+Name[hi]=लॉगइन प्रबंधक
+Name[hr]=Upravljanje prijavljivanjem
+Name[hu]=Bejelentkező felület (TDM)
+Name[id]=Manajer Login
+Name[is]=Innstimplunarstjóri
+Name[it]=Gestione degli accessi
+Name[ja]=ログインマネージャ
+Name[ka]=შესვლის მენეჯერი
+Name[kk]=Жүйеге кіруді басқару
+Name[km]=កម្មវិធី​គ្រប់គ្រង​ការ​ចូល
+Name[ko]=로그인 관리자
+Name[lo]=ຈັດການລັອກອິນ
+Name[lt]=Registravimosi tvarkyklė
+Name[lv]=Pieteikšanās Menedžeris
+Name[mk]=Менаџер на најави
+Name[mn]=Нэвтрэлт удирдагч
+Name[ms]=Pengurus Login
+Name[mt]=Manager tal-Login
+Name[nb]=Innloggingsbehandler
+Name[nds]=Anmellen-Schirm
+Name[ne]=लगइन प्रबन्धक
+Name[nl]=Aanmeldscherm
+Name[nn]=Innloggingshandsamar
+Name[nso]=Molaodi wa Tseno
+Name[oc]=Gestionari de connexion
+Name[pa]=ਲਾਗ ਮੈਨੇਜਰ
+Name[pl]=Menedżer logowania
+Name[pt]=Gestor de Autenticação
+Name[pt_BR]=Gerenciador de Login
+Name[ro]=Managerul de logare
+Name[ru]=Менеджер входа в систему
+Name[rw]=Mugenga w'Ifashayinjira
+Name[se]=Sisačálihangieđahalli
+Name[sk]=Správca prihlásenia
+Name[sl]=Upravitelj prijav
+Name[sr]=Менаџер пријављивања
+Name[sr@Latn]=Menadžer prijavljivanja
+Name[sv]=Inloggningshanterare
+Name[ta]=நுழைவு மேலாளர்
+Name[te]=లాగిన్ అభికర్త
+Name[tg]=Мудири вуруд
+Name[th]=ตัวจัดการการล็อกอิน
+Name[tr]=Giriş Yöneticisi
+Name[tt]=Kerü İdäçese
+Name[uk]=Менеджер реєстрації
+Name[uz]=Kirish boshqaruvchisi
+Name[uz@cyrillic]=Кириш бошқарувчиси
+Name[ven]=Mulanguli wa u loga
+Name[vi]=Trình quản lí Đăng nhập
+Name[wa]=Manaedjeu d' elodjaedje
+Name[xh]=Umphathi Wegama elithile
+Name[zh_CN]=登录管理器
+Name[zh_TW]=登錄管理程式
+Name[zu]=Imenenja yokungena ngaphakathi
+
+Comment=Configure the login manager (TDM)
+Comment[af]=Konfigureer die aanteken bestuurder (Kdm)
+Comment[ar]=إعداد مسيير الدخول (TDM)
+Comment[az]=Giriş İdarəçisi (TDM) Qurğuları
+Comment[be]=Настаўленні кіраўніка ўваходу (TDM)
+Comment[bg]=Настройване на графичната системата за вход
+Comment[bn]=লগ-ইন ম্যানেজার কনফিগার করুন
+Comment[br]=Kefluniañ ar merour ereañ (TDM)
+Comment[bs]=Podesite menadžer prijavom (TDM)
+Comment[ca]=Configura el gestor d'accés (TDM)
+Comment[cs]=Nastavení správce přihlášení (TDM)
+Comment[csb]=Kònfigùracëjô menedżera logòwaniô (TDM)
+Comment[cy]=Ffurfweddu y rheolydd mewngofnodi (TDM)
+Comment[da]=Indstil indlogningshåndtering (TDM)
+Comment[de]=Anmeldungsmanager TDM einrichten
+Comment[el]=Ρυθμίστε το διαχειριστή σύνδεσης (TDM)
+Comment[eo]=Agordu la salutadminstrilon (TDM)
+Comment[es]=Configura el gestor de acceso (TDM)
+Comment[et]=Sisselogimise halduri seadistamine (TDM)
+Comment[eu]=Konfiguratu saio-hasieraren kudeatzailea (TDM)
+Comment[fa]=پیکربندی مدیر ورود (TDM)
+Comment[fi]=Sisäänkirjautumisasetukset
+Comment[fr]=Configuration du gestionnaire de connexion (TDM)
+Comment[fy]=Hjir kinne jo it oanmeldskerm ynstelle (TDM)
+Comment[ga]=Cumraigh an bainisteoir logála isteach (TDM)
+Comment[gl]=Configurar o xestor de início (TDM)
+Comment[he]=שינוי הגדרות מנהל הכניסה למערכת (TDM)
+Comment[hi]=लॉगइन प्रबंधक कॉन्फ़िगर करें (केडीएम)
+Comment[hr]=Konfiguriranje upravljanja prijavljivanja (TDM)
+Comment[hu]=A TDE grafikus bejelentkező felületének beállításai
+Comment[is]=Stilla innstimplunarstjórann (TDM)
+Comment[it]=Configurazione della gestione degli accessi (TDM)
+Comment[ja]=ログインマネージャ (TDM) の設定
+Comment[ka]=შევლის მენეჯერის კონფიგურირება (TDM)
+Comment[kk]=Жүйеге кіруді басқаруын (TDM) баптау
+Comment[km]=កំណត់​រចនាសម្ព័ន្ធ​កម្មវិធី​គ្រប់គ្រង​ការ​ចូល (TDM)
+Comment[ko]=로그인 관리자 TDM 설정
+Comment[lo]=ປັບແຕ່ງປລັກອິນແລະການເຊື່ອມ ຕໍ່ສຳລັບລະບົບ KDB
+Comment[lt]=Konfigūruoti registravimos tvarkyklę (TDM)
+Comment[lv]=Konfigure pieteiksanās menedžeri TDM
+Comment[mk]=Конфигурирајте го менаџерот на најави (TDM)
+Comment[mn]=Нэвтрэлт удирдагч TDM тохируулах
+Comment[ms]=Konfigur pengurus login (TDM)
+Comment[mt]=Ikkonfigura l-manager tal-logins (TDM)
+Comment[nb]=Tilpass innlogin­gsbehandler (TDM)
+Comment[nds]=Den Anmellen-Schirm instellen (TDM)
+Comment[ne]=लगइन प्रबन्धक (TDM) कन्फिगर गर्नुहोस्
+Comment[nl]=Hier kunt u het aanmeldscherm (TDM) instellen
+Comment[nn]=Set opp innloggingshandsamaren (TDM)
+Comment[nso]=Beakanya molaodoi wa tseno (TDM)
+Comment[pa]=ਲਾਗਆਨ ਮੈਨੇਜਰ ਸੰਰਚਨਾ(TDM)
+Comment[pl]=Konfiguracja menedżera logowania (TDM)
+Comment[pt]=Configuração do gestor de autenticação (TDM)
+Comment[pt_BR]=Configura o gerenciador de login (TDM)
+Comment[ro]=Configurează managerul de logare grafică (TDM)
+Comment[ru]=Настройка менеджера входа в систему (TDM)
+Comment[rw]=Kuboneza mugenga w'ifashayinjira (TDM)
+Comment[se]=Heivet sisačálihangieđahalli (TDM)
+Comment[sk]=Nastavenie správcu prihlásenia (TDM)
+Comment[sl]=Nastavitve upravitelja prijav (TDM)
+Comment[sr]=Подешавање менаџера за пријављивање (TDM)
+Comment[sr@Latn]=Podešavanje menadžera za prijavljivanje (TDM)
+Comment[sv]=Anpassa inloggningshanteraren (TDM)
+Comment[ta]=புகுபதிகை மேலாளரை அமை (TDM)
+Comment[tg]=Танзими мудири вуруд (TDM)
+Comment[th]=ปรับแต่งเครื่องมือจัดการการล็อกอิน (TDM)
+Comment[tr]=Giriş yöneticisini yapılandır (TDM)
+Comment[tt]=Kerü idäräçen caylaw urını (TDM)
+Comment[uk]=Налаштування менеджера реєстрації (TDM)
+Comment[uz]=Tizimga kirish boshqaruvchisini (TDM) moslash
+Comment[uz@cyrillic]=Тизимга кириш бошқарувчисини (TDM) мослаш
+Comment[ven]=Ni nga dzudzanya mulanguli wau loga (TDM)
+Comment[vi]=Cấu hình trình đăng nhập (TDM)
+Comment[wa]=Apontyî l' manaedjeu d' elodjaedje (TDM)
+Comment[xh]=Qwalasela umphathi wegama elithile (TDM)
+Comment[zh_CN]=配置登录管理器(TDM)
+Comment[zh_TW]=設定登入管理程式 (TDM)
+Comment[zu]=Hlanganisela imenenja yokungena ngaphakathi (TDM)
+
+Keywords=tdm;display manager;xdm;users;login;greeting;Logo;styles;language;country;fonts;background;wallpapers;sessions;shutdown;restart;
+Keywords[ar]=tdm;display manager;xdm;users;login;greeting;Logo;styles;language;country;fonts;background;wallpapers;sessions;shutdown;restart;مدير العرض;المستخدمون مستخدمون;المستخدمين;مستخدمين;دخول;الدخول;تحية;التحية;اللغة;المظهر; البلد;الخطوط;الخط;خطوط;خط;خلفية;ورق حائط;جلسات;اغلاق;اعادة تشغيل;
+Keywords[az]=tdm;görünüş idarəçi;xdm;istifadəçilər;iclas açma;qarşılama;loqo;tərzlər;dil;ölkə;yazı növləri;arxa plan;divar kağızları;iclaslar;qapat;təkrar başlat;
+Keywords[be]=кіраўнік дысплея;кіраўнік уваходу;карыстальнікі;уваход;запрашэнне;лагатып;стылі;стыль;мова;краіна;шрыфты;фон;шпалеры;сесіі;сесія;выключэнне;перазагрузка;tdm;display manager;xdm;users;login;greeting;Logo;styles;language;country;fonts;background;wallpapers;sessions;shutdown;restart;
+Keywords[bg]=графична; система; вход; влизане; включване; потребител; tdm; display manager; xdm; users; login; greeting; Logo; styles; language; country; fonts; background; wallpapers; sessions; shutdown; restart;
+Keywords[ca]=tdm;administrador de la pantalla;xdm;usuaris;accés;salutació;Logo;estils;llengua;país;lletres;fons;tapissos;sessions;apagar;reiniciar;
+Keywords[cs]=tdm;Správce obrazovky;xdm;Uživatelé;Přihlášení;Uvítání;Logo;Styly;Jazyk;Země;Písma;pozadí;Tapety;Relace;Sezení;Vypnutí;Restart;
+Keywords[csb]=tdm;menedżer ekranu;xdm;brëkòwnicë;logòwanié;przëwitanié;Logò;sztéle;jãzëk;kraj;fòntë;spódk;tapetë;spòdlë;sesëje;zamkniãce systemë;resztart;zôczãce robòtë;
+Keywords[cy]=tdm;rheolydd y dangosydd;xdm;defnyddwyr;mewngofnodi;cyfarchiad;Logo;arddulliau;iaith;gwlad;ffontiau;cefndir;papurau wal;sesiynau;cau;ailgychwyn;
+Keywords[da]=tdm;skærmhåndtering;xdm;brugere;login;hilsen;Logo;stil; sprog;land;skrifttyper;baggrund;tapeter;sessioner;luk ned;genstart;
+Keywords[de]=Kdm;Display Manager;Xdm;Benutzer;Login;Logo;Stile;Sprachen;Länder;Schriften;Hintergründe;Hintergrundbilder;Beenden;Neustart;
+Keywords[el]=tdm;διαχειριστής οθόνης;xdm;χρήστες;σύνδεση;χαιρετισμός;Λογότυπο;στυλ;γλώσσα;χώρα;γραμματοσειρές;φόντο;ταπετσαρίες;συνεδρίες;τερματισμός;επανεκκίνηση;
+Keywords[eo]=tdm;ekrano;;xdm;uzantoj;saluto;emblemo;stilo;lingvo;lando;tiparo;fono;tapeto;seanco;adaiaŭo;relanĉo;
+Keywords[es]=tdm;gestor de pantalla;xdm;usuarios;entrada;acceso;saludo;Logo;estilos;idioma;país;tipos de letra;fondo;tapices;sesiones;apagar;reiniciar;
+Keywords[et]=tdm;ekraanihaldur;xdm;kasutajad;sisselogimine;tervitus;logo;stiil;keel;riik;fondid;taust;taustapilt;seansid;töö lõpetamine;taaskäivitamine;
+Keywords[eu]=tdm;pantaila kudeatzailea;xdm;erabiltzaileak;Saio hasiera;agurra;Logoa;estiloak;hizkuntza; herrialdea;letra-tipoak;atzeko planoa;horma-irudiak;saioak;itzali;berrabiarazi;
+Keywords[fa]=tdm، مدیر نمایش، xdm، کاربران، ورود، تبریک، آرمِ، سبک، زبان، کشور، قلمها، زمینه، کاغذهای دیواری، نشستها، تعطیل، بازآغازی;
+Keywords[fi]=tdm;näytönhallinta ;xdm;käyttäjät;sisäänkirjautuminen;tervehdys;Logo;tyylit;kieli;maa;kirjasimet;tausta;istunnot;sammutus;uudelleenkäynnistys;
+Keywords[fr]=tdm;gestionnaire d'affichage;xdm;utilisateurs;login;connexion;bienvenue;message de bienvenue;Logo;styles;langue;pays;style;police;fond d'écran;papier peint;session;arrêt;logout;redémarrage;reboot;
+Keywords[fy]=tdm;display manager;xdm;users;login;begroeting;oanmelde;brûkers;Oanmeldbehearder;logo;stylen;taal;language;country;lân;fonts;lettertypen;eftergrûn;wallpapers;behang;sesjes;shutdown;restart;ôfslute;opnij begjinne;oanmelde;
+Keywords[ga]=tdm;bainisteoir scáileáin;xdm;úsáideoirí;logáil isteach;fáilte;Lógó;stíleanna;teanga;tír;clónna;clófhoirne;cúlra;cúlbhrait;seisiúin;múchadh;atosú;
+Keywords[gl]=tdm;xestor de entrada;xdm;usuarios;identificación;Logo;estilos;lingua;país;fontes;fondo;papeis tapiz;sesións;apagado;reinício;
+Keywords[he]=משתמשים;כניסה למערכת;כניסה;לוגו;סגנונות;שפה;מדינה;גופנים;רקע;טפטים;הפעלות;כיבוי;הפעלה;מחדש;מנהל;תצוגה;display;manager;xdm;users;login;greeting;Logo;styles;language;country;fonts;background;wallpapers;sessions;shutdown;restart;
+Keywords[hi]=केडीएम;प्रकटन प्रबंधक;एक्स-डीएम;उपयोक्ता;लॉगइन;शुभकामनाएँ;लोगो;पृष्ठभूमि;वालपेपर्स;सत्र;बन्द; फिर से चालू;
+Keywords[hr]=tdm;display manager;xdm;users;login;greeting;Logo;styles;language;country;fonts;background;wallpapers;sessions;shutdown;restart;upravljanje zaslona;korisnici;prijava;pozdrav;stilovi;jezik;država;zemlja;fontovi;pozadina;pozadina radne površine;sesije;gašenje;ponovno pokretanje;
+Keywords[hu]=tdm;képernyőkezelő;xdm;felhasználók;bejelentkezés;üdvözlés;embléma;stílusok;nyelv;ország;betűtípusok;háttér;tapéták;munkafolyamatok;leállítás;újraindítás;
+Keywords[is]=tdm;skjár;gluggastjóri;innskráning;innstimplun;snið;tungumál;land;letur;bakgrunnur;bakgrunnar;veggfóður;setur;slökkva;endurræsa;
+Keywords[it]=tdm;display manager;gestione degli utenti;xdm;utenti;login;accesso;benvenuto;logo;stile;lingua;stato;paese;tipi di carattere;sfondo;immagine di sfondo;sessioni;riavvio;spegnimento;gestione degli accessi;
+Keywords[ja]=tdm;ディスプレイマネージャ;xdm;ユーザ;ログイン;あいさつ;ロゴ;スタイル;言語;国;フォント;背景;壁紙;セッション;シャットダウン;再起動;
+Keywords[km]=tdm;កម្មវិធី​គ្រប់គ្រង​ការ​បង្ហាញ;xdm;អ្នក​ប្រើ;ចូល;ស្វាគមន៍;រូបសញ្ញា;រចនាប័ទ្ម;ភាសា;ប្រទេស;ពុម្ពអក្សរ;ផ្ទៃ​ខាង​ក្រោយ;ក្រដាស​បិទ​ជញ្ជាំង;សម័យ;បិទ;ចាប់ផ្ដើម​ឡើង​វិញ;
+Keywords[lt]=tdm;display manager;ekrano tvarkyklė;xdm;users;naudotojai;login;registracija;greeting;pasveikinimas;Logo; styles;stiliai;language;country;fonts;background;wallpapers;sessions; shutdown;restart;
+Keywords[lv]=tdm;displeja menedžeris;xdm;lietotāji;pieteikšanās;apsveikums;Logo;stili;valoda;valsts;fonti;fons;tapetes;sesijas;nošaut;pārstartēt;
+Keywords[mk]=tdm;display manager;xdm;users;login;greeting;Logo;styles;language;country;fonts;background;wallpapers;sessions;shutdown;restart;менаџер на екран;корисници;најава;поздрав;Лого;стилови;јазик;земја;фонтови;подлога;позадина;сесии;исклучување;рестартирање;
+Keywords[mn]=Kdm;Display Manager;Xdm;Хэрэглэгч;Login;Logo;Хэлбэр;Хэл;Улс;Бичиг;Дэвсгэр;Дэвсгэр зураг;Дуусгах;Шинээр эхлүүлэх;
+Keywords[mt]=tdm;display manager;xdm;users;login;greeting;Logo;styles;language;country;fonts;background;wallpapers;sessions;shutdown;restart;merħba;lingwa;pajjiż;sfond;itfi;irristartja;
+Keywords[nb]=tdm;skjermbehandler;xdm;brukere;innlogging;velkomst;logo;stiler;språk;land;skrifttyper;bakgrunn;bakgrunnsbilde;økter;skru av;slå av;omstart;
+Keywords[nds]=tdm;Startschirm;xdm;Bruker;anmellen;greeting;Logo;Stilen;Spraak;Land;Schriftoorden;Achtergrund;Tapeten;Törns;Utmaken;Nieg starten;
+Keywords[ne]=tdm; प्रदर्शन प्रबन्धक; xdm; प्रयोगकर्ताहरू; लगइन; अभिवादन; परिचायक चिन्ह; शैलीहरू; भाषा; देश; फन्टहरू; पृष्ठभूमि;वालपेपरहरू; सत्र; बन्द गर्नुहोस्; फेरि सुरु गर्नुहोस्;
+Keywords[nl]=tdm;display manager;xdm;users;login;begroeting;inloggen;gebruikers;loginbeheerder;logo;stijlen;taal;language;country;land;fonts;lettertypen;achtergrond;wallpapers;behang;sessies;shutdown;restart;afsluiten;herstarten;aanmelden;opstarten;
+Keywords[nn]=tdm;xdm;brukarar;innlogging;helsing;logo;stil;språk;land;skrifttypar;bakgrunn;bakgrunnsbilete;økt;avslutt;slå av;omstart;
+Keywords[nso]=tdm;molaodi wa pontsho;xdm;badirisi;tseno;madume;Logo;mekgwa;leleme;naga;difonto;bokamorago;di-wallpaper;ditiragalo;timo;thomaleswa;
+Keywords[pa]=tdm;display manager;xdm;users;login;greeting;Logo;styles;language;country;fonts;background;wallpapers;sessions;shutdown;restart; ਲੋਗੋ; ਭਾਸ਼ਾ; ਦੇਸ਼; ਫੋਂਟ; ਲਾਗਿੰਨ; ਉਪਭੋਗੀ;ਸ਼ੈਸ਼ਨ;
+Keywords[pl]=tdm;menedżer ekranu;xdm;użytkownicy;logowanie;powitanie;Logo;style;jezyk;kraj;czcionki;tło;tapety;sesje;zamknięcie systemu;restart;rozpoczęcie pracy;
+Keywords[pt]=tdm;gestor de 'logins';xdm;utilizadores;saudação;logótipo;estilos;língua;país;tipos de letra;fundo;papéis de parede;sessões;terminar;reiniciar;
+Keywords[pt_BR]=tdm;gerenciador de tela; xdm;usuários;login;saudação;Logo;estilos;linguagem;país;fontes; papéis de parede;sessões;desligar;reiniciar;
+Keywords[ro]=tdm;manager de ecran;xdm;utilizatori;logare;întîmpinare;logo;stiluri;limbaj;țară;fonturi;fundal;imagini de fundal;sesiuni;oprire;restartare;
+Keywords[ru]=tdm;display manager;xdm;users;login;greeting;Logo;styles;language;country;fonts;background;wallpapers;sessions;shutdown;restart;перезагрузка;сеанс;шрифты;страна;фон;стили;обои;
+Keywords[rw]=tdm;kwerekana umuyobozi;xdm;abakoresha;ifashayinjira;gusuhuza;ikirango;imisusire;ururimi;igihugu;imyandikire;mbuganyuma;impapurorukuta;imikoro;kuzimya;kongera gutangiza;
+Keywords[se]=tdm;xdm;geavaheaddjit;sisačáliheapmi;dearvvuođat;logo;stiila;giella;riika; fonttat;duogáš;duogášgovva;bargovuorut;heaittihit;časkit eret;ođđasit álggahit;
+Keywords[sk]=tdm;správca obrazovky;Login manažér;správca prihlásenia;xdm;používatelia;prihlásenie;login;privítanie;logo;štýly;jazyk;krajina;pozadie;tapety;sedenia;vypnutie;reset;reštart;
+Keywords[sl]=tdm;upravitelj zaslona;upravljalnik;xdm;uporabniki;prijava;login;pozdrav;logo;slogi;jezik;država;pisave;ozadje;tapete;seje;ugasnitev;vnovičen zagon;
+Keywords[sr]=tdm;display manager;xdm;users;login;greeting;Лого;styles;language;country;fonts;background;wallpapers;sessions;shutdown;restart;менаџер;пријављивање;стил;језик;земља;фонтови;позадина;сесије;гашење;
+Keywords[sr@Latn]=tdm;display manager;xdm;users;login;greeting;Logo;styles;language;country;fonts;background;wallpapers;sessions;shutdown;restart;menadžer;prijavljivanje;stil;jezik;zemlja;fontovi;pozadina;sesije;gašenje;
+Keywords[sv]=tdm;display manager;xdm;användare;inloggning;välkomsttext;Logo;stilar;språk;land;teckensnitt;bakgrund;skrivbordsunderlägg;sessioner;stäng av;starta om;
+Keywords[ta]=கேடிஎம்;காட்சி மேலாளர்;xdm;பயன்படுத்துபவர்;உள்நுழை;வாழ்த்து;சின்னம்;பாணிகள்;மொழி;நாடு;எழுத்துருக்கள்;பின்னணி;வால்பேப்பர்கள்;பகுதிகள்;முடித்தல்;தொடங்குதல்;
+Keywords[th]=tdm;ตัวจัดการจอแสดงผล;xdm;ผู้ใช้;ล็อกอิน; ทักทาย;โลโก้;รูปแบบ;ภาษา;ประเทศ;แบบอักษร;พื้นหลัง; วอลล์เปเปอร์;วาระ;ปิด;เริ่มการทำงานใหม่;
+Keywords[tr]=tdm;görüntü yönetici;xdm;kullanıcılar;oturum açma;karşılama;logo;stiller;dil;ülke;yazı tipleri;artalan;duvar kağıtları;oturumlar;kapat;tekrar başlat;
+Keywords[uk]=tdm;менеджер дисплеїв;xdm;користувачі;реєстрація;привітання;логотип;стилі;мова;країна;шрифти;тло;шпалери;сеанси;вимикання;перезапуск;
+Keywords[uz]=tdm;kirish boshqaruvchisi;xdm;foydalanuvchilar;kirish;salomlashish;Belgi;uslublar;til;davlat;shriftlar;orqa fon;seanslar;oʻchirish;oʻchirib-yoqish;
+Keywords[uz@cyrillic]=tdm;кириш бошқарувчиси;xdm;фойдаланувчилар;кириш;саломлашиш;Белги;услублар;тил;давлат;шрифтлар;орқа фон;сеанслар;ўчириш;ўчириб-ёқиш;
+Keywords[ven]=tdm;mulanguli wau vhonisa;xdm;vhashumisi;u loga;dzindumeliso;logo;zwitaela;luambo;shango;fontu;murahu;mabammbiri a luvhondoni;tshitenwa;thutha;thomolosa;
+Keywords[vi]=tdm;quản lý hiển thị;xdm;người dùng;đăng nhập;chào hỏi;Biểu trưng;kiểu;ngôn ngữ;quốc gia;phông chữ;nền;ảnh nền;phiên đăng nhập;tắt máy;khởi động lại;
+Keywords[wa]=tdm;manaedjeu d' håynaedje;xdm;uzeus;login;wilikom;greeting;Logo;styles;stîles;lingaedje;payi;fontes;fond;fond del waitroûle;sessions;distinde;dislodjî;elodjî;s' elodjî;renonder;
+Keywords[xh]=tdm;umphathi womboniso;xdm;abasebenzisi;igama elithile;umbuliso;ilogo;iintlobo;ulwimi;ilizwe;ubungakanani bamagama; imvelaphi;amaphepha odonga;iintlanganiso;vala;qala kwakhona;
+Keywords[zh_CN]=tdm;display manager;xdm;users;login;greeting;Logo;styles;language;country;fonts;background;wallpapers;sessions;shutdown;restart;显示管理器;用户;登录;欢迎辞;标志;风格;语言;国家;字体;背景;墙纸;会话;关机;重启动;
+Keywords[zh_TW]=tdm;display manager;xdm;users;login;greeting;Logo;styles;language;country;fonts;background;wallpapers;sessions;shutdown;restart;顯示管理程式;使用者;登入;歡迎;風格;語言;國家;字型;背景;底圖;工作階段;關機;重新啟動;
+Keywords[zu]=tdm;Imenenja yokuveza;xdm;abasebenzisi;ukungena ngaphakathi;isibingelelo;Isiqubulo;izitayela;ulimi;izwe;izinhlobo zamagama; inkundla yangemuva;emaphepha ezindonga;iziqendu;vala;phinda uqale;
+
+Categories=Qt;TDE;X-TDE-settings-system;