5
Copyright (C) 1997, 1998, 2000 Steffen Hansen <hansen@kde.org>
6
Copyright (C) 2000-2004 Oswald Buddenhagen <ossi@kde.org>
9
This program is free software; you can redistribute it and/or modify
10
it under the terms of the GNU General Public License as published by
11
the Free Software Foundation; either version 2 of the License, or
12
(at your option) any later version.
14
This program is distributed in the hope that it will be useful,
15
but WITHOUT ANY WARRANTY; without even the implied warranty of
16
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
GNU General Public License for more details.
19
You should have received a copy of the GNU General Public License
20
along with this program; if not, write to the Free Software
21
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
27
#include "kdmconfig.h"
29
#include "kdm_greet.h"
30
#include "themer/kdmthemer.h"
31
#include "themer/kdmitem.h"
32
#include "themer/kdmlabel.h"
34
#include <KColorScheme>
35
#include <KConfigGroup>
37
#include <kseparator.h>
38
#include <kstandarddirs.h>
39
#include <kstringhandler.h>
45
#include <QImageReader>
48
#include <QListWidget>
49
#include <QListWidgetItem>
53
#include <QPushButton>
57
#include <sys/types.h>
69
class UserListView : public QListWidget {
71
UserListView(QWidget *parent = 0)
73
, cachedSizeHint(-1, 0)
75
setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Ignored);
76
setUniformItemSizes(true);
77
setVerticalScrollMode(ScrollPerPixel);
78
setIconSize(QSize(48, 48));
79
setAlternatingRowColors(true);
82
mutable QSize cachedSizeHint;
85
virtual QSize sizeHint() const
87
if (!cachedSizeHint.isValid()) {
89
QStyleOptionViewItem vo(viewOptions());
90
QAbstractListModel *md(static_cast<QAbstractListModel *>(model()));
92
for (int i = 0, rc = md->rowCount(); i < rc; i++) {
93
QSize sh = itemDelegate()->sizeHint(vo, md->index(i));
94
uint thisw = sh.width();
99
cachedSizeHint.setWidth(
100
style()->pixelMetric(QStyle::PM_ScrollBarExtent) +
102
(style()->styleHint(QStyle::SH_ScrollView_FrameOnlyAroundContents) ?
103
style()->pixelMetric(QStyle::PM_DefaultFrameWidth) : 0)) * 2 +
105
cachedSizeHint.setHeight(frameWidth() * 2 + h);
107
return cachedSizeHint;
110
virtual void keyPressEvent(QKeyEvent *event)
112
switch (event->key()) {
116
emit itemDoubleClicked(currentItem());
121
emit itemClicked(currentItem());
125
QListWidget::keyPressEvent(event);
130
virtual void mousePressEvent(QMouseEvent *event)
132
m_suppressClick = false;
133
QListWidget::mousePressEvent(event);
136
virtual void mouseReleaseEvent(QMouseEvent *event)
139
m_suppressClick = false;
141
QListWidget::mouseReleaseEvent(event);
144
virtual void mouseDoubleClickEvent(QMouseEvent *event)
146
m_suppressClick = true;
147
QListWidget::mouseDoubleClickEvent(event);
151
bool m_suppressClick;
154
class UserListViewItem : public QListWidgetItem {
156
UserListViewItem(UserListView *parent, const QString &text,
157
const QPixmap &pixmap, const QString &username)
158
: QListWidgetItem(parent)
163
parent->cachedSizeHint.setWidth(-1);
170
int KGreeter::curPlugin = -1;
171
PluginList KGreeter::pluginList;
173
KGreeter::KGreeter(bool framed)
184
stsGroup = new KConfigGroup(KSharedConfig::openConfig(_stsFile),
188
userView = new UserListView(this);
189
connect(userView, SIGNAL(itemClicked(QListWidgetItem *)),
190
SLOT(slotUserClicked(QListWidgetItem *)));
191
connect(userView, SIGNAL(itemDoubleClicked(QListWidgetItem *)),
195
userList = new QStringList;
196
if (userView || userList)
199
sessMenu = new QMenu(this);
200
connect(sessMenu, SIGNAL(triggered(QAction *)),
201
SLOT(slotSessionSelected()));
203
sessGroup = new QActionGroup(this);
208
pluginList = KGVerify::init(_pluginsLogin);
212
KGreeter::~KGreeter()
220
#define FILE_LIMIT_ICON 20
221
#define FILE_LIMIT_IMAGE 200
222
#define PIXEL_LIMIT_ICON 100
223
#define PIXEL_LIMIT_IMAGE 300
225
// replace this with a simple !access(..., X_OK) once we run with non-root real uid
227
dirAccessible(const char *dir)
233
return (st.st_mode & S_IXOTH) != 0;
237
loadFace(QByteArray &fn, QImage &p, const QByteArray &pp, bool complain = false)
240
if ((fd = open(fn.data(), O_RDONLY | O_NONBLOCK)) < 0) {
241
if (errno != ENOENT) {
242
if (pp.isEmpty() || dirAccessible(pp.data()))
243
(complain ? logError : logInfo)
244
("Cannot load %s: %m\n", fn.data());
248
if ((fd = open(fn.data(), O_RDONLY | O_NONBLOCK)) < 0) {
249
if ((complain || errno != ENOENT) &&
250
(pp.isEmpty() || dirAccessible(pp.data())))
251
(complain ? logError : logInfo)
252
("Cannot load %s: %m\n", fn.data());
260
f.open(fd, QFile::ReadOnly);
262
if (fs > (ico ? FILE_LIMIT_ICON : FILE_LIMIT_IMAGE) * 1000) {
263
logWarn("%s exceeds file size limit (%dkB)\n",
264
fn.data(), ico ? FILE_LIMIT_ICON : FILE_LIMIT_IMAGE);
267
QByteArray fc = f.read(fs);
270
buf.open(QBuffer::ReadOnly);
271
QImageReader ir(&buf);
272
QSize sz = ir.size();
273
int lim = ico ? PIXEL_LIMIT_ICON : PIXEL_LIMIT_IMAGE;
274
if (sz.width() > lim || sz.height() > lim) {
275
logWarn("%s exceeds image dimension limit (%dx%d)\n",
276
fn.data(), lim, lim);
279
sz.scale(48, 48, Qt::KeepAspectRatio);
280
ir.setScaledSize(sz);
283
logInfo("%s is no valid image\n", fn.data());
286
if (p.width() < 48) {
287
QImage np(48, p.height(), QImage::Format_ARGB32);
290
pnt.drawImage((48 - p.width()) / 2, 0, p);
297
KGreeter::insertUser(const QImage &default_pix,
298
const QString &username, struct passwd *ps)
301
userList->append(username);
306
if (_faceSource == FACE_USER_ONLY ||
307
_faceSource == FACE_PREFER_USER)
309
if (_faceSource != FACE_USER_ONLY &&
310
_faceSource != FACE_ADMIN_ONLY)
317
fn = pp = QByteArray(ps->pw_dir);
320
fn = QFile::encodeName(_faceDir);
325
if (loadFace(fn, p, pp))
330
QString realname = KStringHandler::from8Bit(ps->pw_gecos);
331
realname.truncate(realname.indexOf(',') & (~0U >> 1));
332
if (realname.isEmpty() || realname == username) {
333
new UserListViewItem(userView, username, QPixmap::fromImage(p), username);
335
realname.append("\n").append(username);
336
new UserListViewItem(userView, realname, QPixmap::fromImage(p), username);
343
bool hasUser(const char *str) const { return users.contains(str); }
344
bool hasGroup(gid_t gid) const { return groups.contains(gid); }
345
bool hasGroups() const { return !groups.isEmpty(); }
349
QSet<QByteArray> users;
352
UserList::UserList(char **in)
358
if ((grp = getgrnam(*in + 1))) {
359
for (; *grp->gr_mem; grp->gr_mem++)
360
users.insert(*grp->gr_mem);
361
groups.insert(grp->gr_gid);
369
KGreeter::insertUsers()
374
if (!(ps = getpwnam("nobody")))
376
if (setegid(ps->pw_gid))
378
if (seteuid(ps->pw_uid)) {
386
QByteArray fn = QFile::encodeName(_faceDir) + "/.default.face.icon";
387
if (!loadFace(fn, default_pix, QByteArray(), true)) {
388
default_pix = QImage(48, 48, QImage::Format_ARGB32);
392
if (_showUsers == SHOW_ALL) {
393
UserList noUsers(_noUsers);
395
for (setpwent(); (ps = getpwent()) != 0;) {
396
if (*ps->pw_dir && *ps->pw_shell &&
397
(ps->pw_uid >= (unsigned)_lowUserId ||
398
(!ps->pw_uid && _showRoot)) &&
399
ps->pw_uid <= (unsigned)_highUserId &&
400
!noUsers.hasUser(ps->pw_name) &&
401
!noUsers.hasGroup(ps->pw_gid))
403
QString username(QFile::decodeName(ps->pw_name));
404
if (!dupes.contains(username)) {
405
dupes.insert(username);
406
insertUser(default_pix, username, ps);
411
UserList users(_users);
412
if (users.hasGroups()) {
414
for (setpwent(); (ps = getpwent()) != 0;) {
415
if (*ps->pw_dir && *ps->pw_shell &&
416
(ps->pw_uid >= (unsigned)_lowUserId ||
417
(!ps->pw_uid && _showRoot)) &&
418
ps->pw_uid <= (unsigned)_highUserId &&
419
(users.hasUser(ps->pw_name) ||
420
users.hasGroup(ps->pw_gid)))
422
QString username(QFile::decodeName(ps->pw_name));
423
if (!dupes.contains(username)) {
424
dupes.insert(username);
425
insertUser(default_pix, username, ps);
430
for (int i = 0; _users[i]; i++)
431
if ((ps = getpwnam(_users[i])) && (ps->pw_uid || _showRoot))
432
insertUser(default_pix, QFile::decodeName(_users[i]), ps);
439
userView->sortItems();
451
KGreeter::putSession(const QString &type, const QString &name, bool hid, const char *exe)
453
int prio = exe ? (!strcmp(exe, "default") ? 0 :
454
!strcmp(exe, "custom") ? 1 :
455
!strcmp(exe, "failsafe") ? 3 : 2) : 2;
456
for (int i = 0; i < sessionTypes.size(); i++)
457
if (sessionTypes[i].type == type) {
458
sessionTypes[i].prio = prio;
461
sessionTypes.append(SessType(name, type, hid, prio));
465
KGreeter::insertSessions()
467
for (char **dit = _sessionsDirs; *dit; ++dit)
468
foreach (QString ent, QDir(*dit).entryList())
469
if (ent.endsWith(".desktop")) {
471
KSharedConfig::openConfig(
472
QString(*dit).append('/').append(ent)),
474
putSession(ent.left(ent.length() - 8),
475
dsk.readEntry("Name"),
476
(dsk.readEntry("Hidden", false) ||
477
(dsk.hasKey("TryExec") &&
478
KStandardDirs::findExe(
479
dsk.readEntry("TryExec")).isEmpty())),
480
dsk.readEntry("Exec").toLatin1());
482
putSession("default", i18nc("@item:inlistbox session type", "Default"), false, "default");
483
putSession("custom", i18nc("@item:inlistbox session type", "Custom"), false, "custom");
484
putSession("failsafe", i18nc("@item:inlistbox session type", "Failsafe"), false, "failsafe");
486
for (int i = 0; i < sessionTypes.size() && !sessionTypes[i].hid; i++) {
487
sessionTypes[i].action = sessGroup->addAction(sessionTypes[i].name);
488
sessionTypes[i].action->setData(i);
489
sessionTypes[i].action->setCheckable(true);
490
switch (sessionTypes[i].prio) {
491
case 0: case 1: nSpecials++; break;
492
case 2: nNormals++; break;
495
sessMenu->addActions(sessGroup->actions());
499
KGreeter::slotUserEntered()
504
if ((pw = getpwnam(curUser.toLocal8Bit().data()))) {
505
QString theUser = QString::fromLocal8Bit(pw->pw_name);
506
for (int i = 0, rc = userView->model()->rowCount(); i < rc; i++) {
507
UserListViewItem *item =
508
static_cast<UserListViewItem *>(userView->item(i));
509
if (item->login == theUser) {
510
userView->setCurrentItem(item);
515
userView->clearSelection();
521
QTimer::singleShot(0, this, SLOT(slotLoadPrevWM()));
525
KGreeter::slotUserClicked(QListWidgetItem *item)
528
curUser = ((UserListViewItem *)item)->login;
529
verify->setUser(curUser);
535
KGreeter::slotSessionSelected()
537
verify->gplugChanged();
553
KGreeter::setPrevWM(QAction *wm)
557
curPrev->setText(sessionTypes[curPrev->data().toInt()].name);
559
wm->setText(i18nc("@item:inmenu session type",
561
sessionTypes[wm->data().toInt()].name));
567
KGreeter::slotLoadPrevWM()
570
unsigned long crc, by;
574
// XXX this should actually check for !CoreBusy - would it be safe?
575
if (verify->coreState != KGVerify::CoreIdle) {
582
name = curUser.toLocal8Bit();
583
gSendInt(G_ReadDmrc);
584
gSendStr(name.data());
585
gRecvInt(); // ignore status code ...
586
if ((len = name.length())) {
590
if (!sess) { /* no such user */
591
if (!userView && !userList) { // don't fake if user list shown
594
for (crc = _forgingSeed, i = 0; i < len; i++) {
595
by = (crc & 255) ^ name[i];
596
for (b = 0; b < 8; b++)
597
by = (by >> 1) ^ (-(by & 1) & 0xedb88320);
598
crc = (crc >> 8) ^ by;
600
/* forge a session with this hash - default & custom more probable */
601
/* XXX - this should do a statistical analysis of the real users */
603
setPrevWM(sessionTypes[crc % (nSpecials * 2 + nNormals) % (nSpecials + nNormals)].action);
605
i = crc % (nSpecials * 2 + nNormals);
607
setPrevWM(sessionTypes[i + nSpecials].action);
609
setPrevWM(sessionTypes[(i - nNormals) / 2].action);
614
for (int i = 0; i < sessionTypes.count() && !sessionTypes[i].hid; i++)
615
if (sessionTypes[i].type == sess) {
617
setPrevWM(sessionTypes[i].action);
620
if (!sessGroup->checkedAction())
621
KFMsgBox::box(this, sorrybox,
622
i18n("Your saved session type '%1' is not valid any more.\n"
623
"Please select a new one, otherwise 'default' will be used.", sess));
632
KGreeter::pluginSetup()
635
QString ent, pn(verify->pluginName()), dn(dName + '_' + pn);
637
if (_preselUser != PRESEL_PREV)
638
stsGroup->deleteEntry(verify->entitiesLocal() ? dName : dn, 0);
639
if (_preselUser != PRESEL_NONE && verify->entityPresettable()) {
640
if (verify->entitiesLocal())
641
ent = _preselUser == PRESEL_PREV ?
642
stsGroup->readEntry(dName, QString()) : _defaultUser;
644
ent = _preselUser == PRESEL_PREV ?
645
stsGroup->readEntry(dn, QString()) :
646
verify->getConf(0, (pn + ".DefaultEntity").toLatin1(), QVariant()).toString();
647
field = verify->entitiesFielded() ?
648
verify->getConf(0, (pn + ".FocusField").toLatin1(), QVariant(0)).toInt() :
651
verify->presetEntity(ent, field);
653
verify->loadUsers(*userList);
657
KGreeter::verifyPluginChanged(int id)
664
KGreeter::verifyClear()
668
if (QAction *curSel = sessGroup->checkedAction())
669
curSel->setChecked(false);
675
if (_preselUser == PRESEL_PREV && verify->entityPresettable())
676
stsGroup->writeEntry(verify->entitiesLocal() ?
678
dName + '_' + verify->pluginName(),
679
verify->getEntity());
680
if (QAction *curSel = sessGroup->checkedAction()) {
683
gSendStr(sessionTypes[curSel->data().toInt()].type.toUtf8());
684
} else if (!prevValid) {
693
KGreeter::verifyFailed()
696
userView->setEnabled(false);
702
KGreeter::verifyRetry()
705
userView->setEnabled(true);
709
KGreeter::verifySetUser(const QString &user)
716
KStdGreeter::KStdGreeter()
721
QBoxLayout *main_box;
722
#ifdef WITH_KDM_XCONSOLE
724
QBoxLayout *ex_box = new QVBoxLayout(this);
725
main_box = new QHBoxLayout();
726
ex_box->addLayout(main_box);
727
ex_box->addWidget(consoleView);
731
main_box = new QHBoxLayout(this);
733
int rs = layout()->spacing();
734
main_box->setSpacing(layout()->margin());
737
main_box->addWidget(userView);
739
QBoxLayout *inner_box = new QVBoxLayout();
740
main_box->addLayout(inner_box);
741
inner_box->setSpacing(rs);
743
if (!_authorized && _authComplain) {
744
QLabel *complainLabel = new QLabel(
745
i18n("Warning: this is an unsecured session"), this);
746
complainLabel->setToolTip(
747
i18n("This display requires no X authorization.\n"
748
"This means that anybody can connect to it,\n"
749
"open windows on it or intercept your input."));
750
complainLabel->setAlignment(Qt::AlignCenter);
751
complainLabel->setFont(*_failFont);
753
p.setBrush(QPalette::WindowText,
754
KColorScheme(QPalette::Active, KColorScheme::Window)
755
.foreground(KColorScheme::NegativeText));
756
complainLabel->setPalette(p);
757
inner_box->addWidget(complainLabel);
759
if (!_greetString.isEmpty()) {
760
QLabel *welcomeLabel = new QLabel(_greetString, this);
761
welcomeLabel->setAlignment(Qt::AlignCenter);
762
welcomeLabel->setFont(*_greetFont);
763
inner_box->addWidget(welcomeLabel);
768
clock = new KdmClock(this);
771
QMovie *movie = new QMovie(this);
772
movie->setFileName(_logo);
773
if (movie->isValid()) {
775
pixLabel = new QLabel(this);
776
pixLabel->setMovie(movie);
777
if (!movie->currentImage().hasAlphaChannel())
778
pixLabel->setFrameStyle(QFrame::Panel | QFrame::Sunken);
779
pixLabel->setIndent(0);
788
inner_box->addWidget(clock, 0, Qt::AlignCenter);
790
inner_box->addWidget(pixLabel, 0, Qt::AlignCenter);
791
inner_box->addSpacing(inner_box->spacing());
794
main_box->addWidget(clock, 0, Qt::AlignCenter);
796
main_box->addWidget(pixLabel, 0, Qt::AlignCenter);
799
goButton = new QPushButton(i18nc("@action:button", "L&ogin"), this);
800
goButton->setDefault(true);
801
connect(goButton, SIGNAL(clicked()), SLOT(accept()));
802
QPushButton *menuButton = new QPushButton(i18nc("@action:button", "&Menu"), this);
808
#ifdef WITH_KDM_XCONSOLE
809
else if (consoleView)
814
KGStdVerify *sverify =
815
new KGStdVerify(this, this, prec, QString(),
816
pluginList, KGreeterPlugin::Authenticate,
817
KGreeterPlugin::Login);
818
inner_box->addLayout(sverify->getLayout());
819
QMenu *plugMenu = sverify->getPlugMenu();
820
sverify->selectPlugin(curPlugin);
823
inner_box->addWidget(new KSeparator(Qt::Horizontal, this));
825
QBoxLayout *hbox2 = new QHBoxLayout();
826
inner_box->addLayout(hbox2);
827
hbox2->addWidget(goButton);
828
hbox2->addStretch(1);
829
hbox2->addWidget(menuButton);
830
hbox2->addStretch(1);
832
if (sessMenu->actions().count() > 1) {
833
inserten(i18nc("@title:menu", "Session &Type"), Qt::ALT + Qt::Key_T, sessMenu);
838
inserten(i18nc("@title:menu", "&Authentication Method"), Qt::ALT + Qt::Key_A, plugMenu);
843
completeMenu(LOGIN_LOCAL_ONLY, ex_choose, i18nc("@action:inmenu", "&Remote Login"), Qt::ALT + Qt::Key_R);
849
menuButton->setMenu(optMenu);
859
KStdGreeter::pluginSetup()
861
inherited::pluginSetup();
863
if (verify->entitiesLocal() && verify->entityPresettable())
873
KStdGreeter::verifyFailed()
875
goButton->setEnabled(false);
876
inherited::verifyFailed();
880
KStdGreeter::verifyRetry()
882
goButton->setEnabled(true);
883
inherited::verifyRetry();
887
KThemedGreeter::KThemedGreeter(KdmThemer *_themer)
892
// We do all painting ourselves
893
setAttribute(Qt::WA_NoSystemBackground, true);
894
// Allow tracking the mouse position
895
setMouseTracking(true);
899
themer->setWidget(this);
901
if (_allowThemeDebug)
902
new QShortcut(QKeySequence(QLatin1String("Ctrl+Alt+D")),
903
this, SLOT(slotDebugToggled()));
905
connect(themer, SIGNAL(activated(const QString &)),
906
SLOT(slotThemeActivated(const QString &)));
908
KdmItem *console_node = themer->findNode("xconsole"); // kdm ext
909
KdmItem *console_rect = themer->findNode("xconsole-rect"); // kdm ext
911
console_rect = console_node;
912
userlist_node = themer->findNode("userlist");
913
userlist_rect = themer->findNode("userlist-rect");
915
userlist_rect = userlist_node;
916
caps_warning = themer->findNode("caps-lock-warning");
917
xauth_warning = themer->findNode("xauth-warning"); // kdm ext
918
pam_error = themer->findNode("pam-error");
919
KdmLabel *pam_error_label = qobject_cast<KdmLabel *>(pam_error);
921
pam_error_label->setText(i18n("Login failed"));
922
timed_label = themer->findNode("timed-label");
925
if ((itm = themer->findNode("pam-message"))) // done via msgboxes
926
itm->setVisible(false);
927
if ((itm = themer->findNode("language_button"))) // not implemented yet
928
itm->setVisible(false);
931
#ifdef WITH_KDM_XCONSOLE
933
console_node->setWidget(consoleView);
936
console_rect->setVisible(false);
939
if (xauth_warning && (_authorized || !_authComplain))
940
xauth_warning->setVisible(false);
942
// if (!_greetString.isEmpty()) {
944
// clock = new KdmClock(this, "clock");
949
#ifdef WITH_KDM_XCONSOLE
950
else if (consoleView)
955
KGThemedVerify *tverify =
956
new KGThemedVerify(this, themer, this, prec, QString(),
957
pluginList, KGreeterPlugin::Authenticate,
958
KGreeterPlugin::Login);
959
QMenu *plugMenu = tverify->getPlugMenu();
960
tverify->selectPlugin(curPlugin);
963
if ((session_button = themer->findNode("session_button"))) {
964
if (sessMenu->actions().count() <= 1) {
965
session_button->setVisible(false);
969
if (sessMenu->actions().count() > 1) {
970
inserten(i18nc("@title:menu", "Session &Type"), Qt::ALT + Qt::Key_T, sessMenu);
976
inserten(i18nc("@title:menu", "&Authentication Method"), Qt::ALT + Qt::Key_A, plugMenu);
981
completeMenu(LOGIN_LOCAL_ONLY, ex_choose, i18nc("@action:inmenu", "&Remote Login"), Qt::ALT + Qt::Key_R);
986
if ((system_button = themer->findNode("system_button"))) {
988
addAction(optMenu->menuAction());
990
system_button->setVisible(false);
998
KThemedGreeter::~KThemedGreeter()
1000
themer->setWidget(0);
1004
KThemedGreeter::slotDebugToggled()
1006
if ((debugLevel ^= DEBUG_THEMING))
1007
themer->slotNeedPlacement();
1011
KThemedGreeter::event(QEvent *e)
1014
themer->widgetEvent(e);
1015
return inherited::event(e);
1019
KThemedGreeter::pluginSetup()
1021
inherited::pluginSetup();
1023
if (userView && verify->entitiesLocal() && verify->entityPresettable() && userlist_node) {
1024
userlist_node->setWidget(userView);
1025
userlist_rect->setVisible(true);
1030
userlist_rect->setVisible(false);
1036
KThemedGreeter::verifyFailed()
1038
// goButton->setEnabled(false);
1039
inherited::verifyFailed();
1043
KThemedGreeter::verifyRetry()
1045
// goButton->setEnabled(true);
1046
inherited::verifyRetry();
1051
KThemedGreeter::updateStatus(bool fail, bool caps, int timedleft)
1054
pam_error->setVisible(fail);
1056
caps_warning->setVisible(caps);
1059
if (timedleft != KdmLabel::timedDelay) {
1060
KdmLabel::timedDelay = timedleft;
1061
KdmLabel::timedUser = curUser;
1062
timed_label->setVisible(true);
1063
timed_label->update();
1066
KdmLabel::timedDelay = -1;
1067
timed_label->setVisible(false);
1073
KThemedGreeter::slotThemeActivated(const QString &id)
1075
if (id == "login_button")
1077
else if (id == "session_button")
1079
else if (id == "system_button")
1084
KThemedGreeter::slotSessMenu()
1086
sessMenu->popup(mapToGlobal(session_button->rect().center()));
1090
KThemedGreeter::slotActionMenu()
1093
optMenu->popup(mapToGlobal(system_button->rect().center()));
1095
optMenu->popup(mapToGlobal(rect().center()));
1099
KThemedGreeter::keyPressEvent(QKeyEvent *e)
1101
inherited::keyPressEvent(e);
1102
if (!(e->modifiers() & ~Qt::KeypadModifier) &&
1103
(e->key() == Qt::Key_Return || e->key() == Qt::Key_Enter))
1107
#include "kgreeter.moc"