diff options
Diffstat (limited to 'kdesktop')
29 files changed, 3734 insertions, 3366 deletions
diff --git a/kdesktop/init/My_Documents b/kdesktop/init/My_Documents index 497f34c40..d465deb64 100644 --- a/kdesktop/init/My_Documents +++ b/kdesktop/init/My_Documents @@ -4,9 +4,9 @@ Icon=folder_wordprocessing Name=My Documents Name[af]=Dokument Gids Name[ar]=مستنداتي -Name[be]=ТÑчка Ð´Ð»Ñ Ð´Ð°ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñž -Name[bg]=Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð¸ -Name[bn]=ডকà§à¦®à§‡à¦¨à§à¦Ÿ ফোলà§à¦¡à¦¾à¦° +Name[be]=Тэчка для дакументаў +Name[bg]=Директория с документи +Name[bn]=ডকমেনট ফোলডার Name[br]=Renkell an teulioù Name[bs]=Direktorij dokumenata Name[ca]=Carpeta de documents diff --git a/kdesktop/lock/CMakeLists.txt b/kdesktop/lock/CMakeLists.txt index 2bbe4b289..a0ec2f08a 100644 --- a/kdesktop/lock/CMakeLists.txt +++ b/kdesktop/lock/CMakeLists.txt @@ -19,10 +19,12 @@ include_directories( ${CMAKE_SOURCE_DIR}/kcheckpass ${TDE_INCLUDE_DIR} ${TQT_INCLUDE_DIRS} + ${KRB5_INCLUDE_DIRS} ) link_directories( ${TQT_LIBRARY_DIRS} + ${TDE_LIB_DIR} ) @@ -38,6 +40,7 @@ set( ${target}_SRCS tde_add_executable( ${target} AUTOMOC SOURCES ${${target}_SRCS} LINK kdesktopsettings-static dmctl-static tdeio-shared Xext - pthread ${GL_LIBRARIES} "${LINKER_IMMEDIATE_BINDING_FLAGS}" + pthread ${GL_LIBRARIES} ${LIBTDELDAP_LIBRARIES} + "${LINKER_IMMEDIATE_BINDING_FLAGS}" DESTINATION ${BIN_INSTALL_DIR} ) diff --git a/kdesktop/lock/autologout.cc b/kdesktop/lock/autologout.cc index 7d6bf6ff1..6e05c439d 100644 --- a/kdesktop/lock/autologout.cc +++ b/kdesktop/lock/autologout.cc @@ -1,6 +1,6 @@ //=========================================================================== // -// This file is part of the KDE project +// This file is part of the TDE project // // Copyright (c) 2004 Chris Howells <howells@kde.org> @@ -33,88 +33,88 @@ extern bool trinity_desktop_lock_use_system_modal_dialogs; AutoLogout::AutoLogout(LockProcess *parent) : TQDialog(parent, "password dialog", true, (trinity_desktop_lock_use_system_modal_dialogs?((WFlags)WStyle_StaysOnTop):((WFlags)WX11BypassWM))) { - if (trinity_desktop_lock_use_system_modal_dialogs) { - // Signal that we do not want any window controls to be shown at all - Atom kde_wm_system_modal_notification; - kde_wm_system_modal_notification = XInternAtom(tqt_xdisplay(), "_TDE_WM_MODAL_SYS_NOTIFICATION", False); - XChangeProperty(tqt_xdisplay(), winId(), kde_wm_system_modal_notification, XA_INTEGER, 32, PropModeReplace, (unsigned char *) "TRUE", 1L); - } - setCaption(i18n("Automatic Logout Notification")); - - frame = new TQFrame(this); - if (trinity_desktop_lock_use_system_modal_dialogs) - frame->setFrameStyle( TQFrame::NoFrame ); - else - frame->setFrameStyle(TQFrame::Panel | TQFrame::Raised); - frame->setLineWidth(2); - - TQLabel *pixLabel = new TQLabel( frame, "pixlabel" ); - pixLabel->setPixmap(DesktopIcon("system-log-out")); - - TQLabel *greetLabel = new TQLabel(i18n("<nobr><qt><b>Automatic Log Out</b></qt><nobr>"), frame); - TQLabel *infoLabel = new TQLabel(i18n("<qt>To prevent being logged out, resume using this session by moving the mouse or pressing a key.</qt>"), frame); - - mStatusLabel = new TQLabel("<b> </b>", frame); - mStatusLabel->setAlignment(TQLabel::AlignCenter); - - TQLabel *mProgressLabel = new TQLabel("Time Remaining:", frame); - mProgressRemaining = new TQProgressBar(frame); - mProgressRemaining->setPercentageVisible(false); - - TQVBoxLayout *unlockDialogLayout = new TQVBoxLayout( this ); - unlockDialogLayout->addWidget( frame ); - - frameLayout = new TQGridLayout(frame, 1, 1, KDialog::marginHint(), KDialog::spacingHint()); - frameLayout->addMultiCellWidget(pixLabel, 0, 2, 0, 0, Qt::AlignCenter | Qt::AlignTop); - frameLayout->addWidget(greetLabel, 0, 1); - frameLayout->addWidget(mStatusLabel, 1, 1); - frameLayout->addWidget(infoLabel, 2, 1); - frameLayout->addWidget(mProgressLabel, 3, 1); - frameLayout->addWidget(mProgressRemaining, 4, 1); - - // get the time remaining in seconds for the status label - mRemaining = COUNTDOWN * 25; - - mProgressRemaining->setTotalSteps(COUNTDOWN * 25); - - updateInfo(mRemaining); - - mCountdownTimerId = startTimer(1000/25); - - connect(tqApp, TQT_SIGNAL(activity()), TQT_SLOT(slotActivity())); - - setFixedSize( sizeHint() ); + if (trinity_desktop_lock_use_system_modal_dialogs) { + // Signal that we do not want any window controls to be shown at all + Atom kde_wm_system_modal_notification; + kde_wm_system_modal_notification = XInternAtom(tqt_xdisplay(), "_TDE_WM_MODAL_SYS_NOTIFICATION", False); + XChangeProperty(tqt_xdisplay(), winId(), kde_wm_system_modal_notification, XA_INTEGER, 32, PropModeReplace, (unsigned char *) "TRUE", 1L); + } + setCaption(i18n("Automatic Logout Notification")); + + frame = new TQFrame(this); + if (trinity_desktop_lock_use_system_modal_dialogs) { + frame->setFrameStyle( TQFrame::NoFrame ); + } + else { + frame->setFrameStyle(TQFrame::Panel | TQFrame::Raised); + } + frame->setLineWidth(2); + + TQLabel *pixLabel = new TQLabel( frame, "pixlabel" ); + pixLabel->setPixmap(DesktopIcon("system-log-out")); + + TQLabel *greetLabel = new TQLabel(i18n("<nobr><qt><b>Automatic Log Out</b></qt><nobr>"), frame); + TQLabel *infoLabel = new TQLabel(i18n("<qt>To prevent being logged out, resume using this session by moving the mouse or pressing a key.</qt>"), frame); + + mStatusLabel = new TQLabel("<b> </b>", frame); + mStatusLabel->setAlignment(TQLabel::AlignCenter); + + TQLabel *mProgressLabel = new TQLabel("Time Remaining:", frame); + mProgressRemaining = new TQProgressBar(frame); + mProgressRemaining->setPercentageVisible(false); + + TQVBoxLayout *unlockDialogLayout = new TQVBoxLayout( this ); + unlockDialogLayout->addWidget( frame ); + + frameLayout = new TQGridLayout(frame, 1, 1, KDialog::marginHint(), KDialog::spacingHint()); + frameLayout->addMultiCellWidget(pixLabel, 0, 2, 0, 0, Qt::AlignCenter | Qt::AlignTop); + frameLayout->addWidget(greetLabel, 0, 1); + frameLayout->addWidget(mStatusLabel, 1, 1); + frameLayout->addWidget(infoLabel, 2, 1); + frameLayout->addWidget(mProgressLabel, 3, 1); + frameLayout->addWidget(mProgressRemaining, 4, 1); + + // get the time remaining in seconds for the status label + mRemaining = COUNTDOWN * 25; + + mProgressRemaining->setTotalSteps(COUNTDOWN * 25); + + updateInfo(mRemaining); + + mCountdownTimerId = startTimer(1000/25); + + connect(tqApp, TQT_SIGNAL(activity()), TQT_SLOT(slotActivity())); + + setFixedSize( sizeHint() ); } AutoLogout::~AutoLogout() { - hide(); + hide(); } void AutoLogout::updateInfo(int timeout) { - mStatusLabel->setText(i18n("<nobr><qt>You will be automatically logged out in 1 second</qt></nobr>", - "<nobr><qt>You will be automatically logged out in %n seconds</qt></nobr>", - timeout / 25) ); - mProgressRemaining->setProgress(timeout); + mStatusLabel->setText(i18n("<nobr><qt>You will be automatically logged out in 1 second</qt></nobr>", + "<nobr><qt>You will be automatically logged out in %n seconds</qt></nobr>", + timeout / 25) ); + mProgressRemaining->setProgress(timeout); } void AutoLogout::timerEvent(TQTimerEvent *ev) { - if (ev->timerId() == mCountdownTimerId) - { - updateInfo(mRemaining); - --mRemaining; - if (mRemaining < 0) - { - logout(); + if (ev->timerId() == mCountdownTimerId) { + updateInfo(mRemaining); + --mRemaining; + if (mRemaining < 0) { + logout(); + } } - } } void AutoLogout::slotActivity() { - accept(); + accept(); } void AutoLogout::logout() @@ -125,8 +125,8 @@ void AutoLogout::logout() void AutoLogout::show() { - TQDialog::show(); - TQApplication::flushX(); + TQDialog::show(); + TQApplication::flushX(); } #include "autologout.moc" diff --git a/kdesktop/lock/autologout.h b/kdesktop/lock/autologout.h index c15a47f07..89cbb880e 100644 --- a/kdesktop/lock/autologout.h +++ b/kdesktop/lock/autologout.h @@ -1,6 +1,6 @@ //=========================================================================== // -// This file is part of the KDE project +// This file is part of the TDE project // // Copyright (c) 1999 Martin R. Jones <mjones@kde.org> // Copyright (c) 2003 Oswald Buddenhagen <ossi@kde.org> @@ -22,29 +22,29 @@ class TQProgressBar; class AutoLogout : public TQDialog { - Q_OBJECT - -public: - AutoLogout(LockProcess *parent); - ~AutoLogout(); - virtual void show(); - -protected: - virtual void timerEvent(TQTimerEvent *); - -private slots: - void slotActivity(); - -private: - void updateInfo(int); - TQFrame *frame; - TQGridLayout *frameLayout; - TQLabel *mStatusLabel; - int mCountdownTimerId; - int mRemaining; - TQTimer countDownTimer; - TQProgressBar *mProgressRemaining; - void logout(); + Q_OBJECT + + public: + AutoLogout(LockProcess *parent); + ~AutoLogout(); + virtual void show(); + + protected: + virtual void timerEvent(TQTimerEvent *); + + private slots: + void slotActivity(); + + private: + void updateInfo(int); + TQFrame *frame; + TQGridLayout *frameLayout; + TQLabel *mStatusLabel; + int mCountdownTimerId; + int mRemaining; + TQTimer countDownTimer; + TQProgressBar *mProgressRemaining; + void logout(); }; #endif diff --git a/kdesktop/lock/infodlg.cc b/kdesktop/lock/infodlg.cc index d248d7bd0..3efaf060d 100644 --- a/kdesktop/lock/infodlg.cc +++ b/kdesktop/lock/infodlg.cc @@ -1,8 +1,8 @@ //=========================================================================== // -// This file is part of the KDE project +// This file is part of the TDE project // -// Copyright (c) 2010 Timothy Pearson <kb9vqf@pearsoncomputing.net> +// Copyright (c) 2010 - 2015 Timothy Pearson <kb9vqf@pearsoncomputing.net> #include <config.h> @@ -62,86 +62,88 @@ extern bool trinity_desktop_lock_use_system_modal_dialogs; // Simple dialog for displaying an unlock status or recurring error message // InfoDlg::InfoDlg(LockProcess *parent) - : TQDialog(parent, "information dialog", true, (trinity_desktop_lock_use_system_modal_dialogs?((WFlags)WStyle_StaysOnTop):((WFlags)WX11BypassWM))), - mUnlockingFailed(false) + : TQDialog(parent, "information dialog", true, (trinity_desktop_lock_use_system_modal_dialogs?((WFlags)WStyle_StaysOnTop):((WFlags)WX11BypassWM))), + mUnlockingFailed(false) { - if (trinity_desktop_lock_use_system_modal_dialogs) { - // Signal that we do not want any window controls to be shown at all - Atom kde_wm_system_modal_notification; - kde_wm_system_modal_notification = XInternAtom(tqt_xdisplay(), "_TDE_WM_MODAL_SYS_NOTIFICATION", False); - XChangeProperty(tqt_xdisplay(), winId(), kde_wm_system_modal_notification, XA_INTEGER, 32, PropModeReplace, (unsigned char *) "TRUE", 1L); - } - setCaption(i18n("Information")); + if (trinity_desktop_lock_use_system_modal_dialogs) { + // Signal that we do not want any window controls to be shown at all + Atom kde_wm_system_modal_notification; + kde_wm_system_modal_notification = XInternAtom(tqt_xdisplay(), "_TDE_WM_MODAL_SYS_NOTIFICATION", False); + XChangeProperty(tqt_xdisplay(), winId(), kde_wm_system_modal_notification, XA_INTEGER, 32, PropModeReplace, (unsigned char *) "TRUE", 1L); + } + setCaption(i18n("Information")); - frame = new TQFrame( this ); - if (trinity_desktop_lock_use_system_modal_dialogs) - frame->setFrameStyle( TQFrame::NoFrame ); - else - frame->setFrameStyle( TQFrame::Panel | TQFrame::Raised ); - frame->setLineWidth( 2 ); + frame = new TQFrame( this ); + if (trinity_desktop_lock_use_system_modal_dialogs) { + frame->setFrameStyle( TQFrame::NoFrame ); + } + else { + frame->setFrameStyle( TQFrame::Panel | TQFrame::Raised ); + } + frame->setLineWidth( 2 ); - mpixLabel = new TQLabel( frame, "pixlabel" ); - mpixLabel->setPixmap(DesktopIcon("unlock")); + mpixLabel = new TQLabel( frame, "pixlabel" ); + mpixLabel->setPixmap(DesktopIcon("unlock")); - KUser user; + KUser user; - mStatusLabel = new TQLabel( "<b> </b>", frame ); - mStatusLabel->setAlignment( TQLabel::AlignCenter ); + mStatusLabel = new TQLabel( "<b> </b>", frame ); + mStatusLabel->setAlignment( TQLabel::AlignCenter ); - TQVBoxLayout *unlockDialogLayout = new TQVBoxLayout( this ); - unlockDialogLayout->addWidget( frame ); + TQVBoxLayout *unlockDialogLayout = new TQVBoxLayout( this ); + unlockDialogLayout->addWidget( frame ); - TQHBoxLayout *layStatus = new TQHBoxLayout( 0, 0, KDialog::spacingHint()); - layStatus->addWidget( mStatusLabel ); + TQHBoxLayout *layStatus = new TQHBoxLayout( 0, 0, KDialog::spacingHint()); + layStatus->addWidget( mStatusLabel ); - frameLayout = new TQGridLayout( frame, 1, 1, KDialog::marginHint(), KDialog::spacingHint() ); - frameLayout->addMultiCellWidget( mpixLabel, 0, 2, 0, 0, Qt::AlignTop ); - frameLayout->addLayout( layStatus, 1, 1 ); + frameLayout = new TQGridLayout( frame, 1, 1, KDialog::marginHint(), KDialog::spacingHint() ); + frameLayout->addMultiCellWidget( mpixLabel, 0, 2, 0, 0, Qt::AlignTop ); + frameLayout->addLayout( layStatus, 1, 1 ); - installEventFilter(this); - setFixedSize( sizeHint() ); -} + installEventFilter(this); + setFixedSize( sizeHint() ); + } InfoDlg::~InfoDlg() { - hide(); + hide(); } void InfoDlg::updateLabel(TQString &txt) { - mStatusLabel->setPaletteForegroundColor(Qt::black); - mStatusLabel->setText("<b>" + txt + "</b>"); + mStatusLabel->setPaletteForegroundColor(Qt::black); + mStatusLabel->setText("<b>" + txt + "</b>"); } void InfoDlg::setUnlockIcon() { - mpixLabel->setPixmap(DesktopIcon("unlock")); + mpixLabel->setPixmap(DesktopIcon("unlock")); } void InfoDlg::setKDEIcon() { - mpixLabel->setPixmap(DesktopIcon("about_kde")); + mpixLabel->setPixmap(DesktopIcon("about_kde")); } void InfoDlg::setInfoIcon() { - mpixLabel->setPixmap(DesktopIcon("messagebox_info")); + mpixLabel->setPixmap(DesktopIcon("messagebox_info")); } void InfoDlg::setWarningIcon() { - mpixLabel->setPixmap(DesktopIcon("messagebox_warning")); + mpixLabel->setPixmap(DesktopIcon("messagebox_warning")); } void InfoDlg::setErrorIcon() { - mpixLabel->setPixmap(DesktopIcon("messagebox_critical")); + mpixLabel->setPixmap(DesktopIcon("messagebox_critical")); } void InfoDlg::show() { - TQDialog::show(); - TQApplication::flushX(); + TQDialog::show(); + TQApplication::flushX(); } #include "infodlg.moc" diff --git a/kdesktop/lock/infodlg.h b/kdesktop/lock/infodlg.h index bb974282f..3daf4d2ce 100644 --- a/kdesktop/lock/infodlg.h +++ b/kdesktop/lock/infodlg.h @@ -1,8 +1,8 @@ //=========================================================================== // -// This file is part of the KDE project +// This file is part of the TDE project // -// Copyright (c) 2010 Timothy Pearson <kb9vqf@pearsoncomputing.net> +// Copyright (c) 2010 - 2015 Timothy Pearson <kb9vqf@pearsoncomputing.net> // #ifndef __INFODLG_H__ @@ -26,30 +26,30 @@ class TQListView; // class InfoDlg : public TQDialog { - Q_OBJECT - -public: - InfoDlg(LockProcess *parent); - ~InfoDlg(); - virtual void show(); - - void updateLabel( TQString &txt ); - void setUnlockIcon(); - void setKDEIcon(); - void setInfoIcon(); - void setWarningIcon(); - void setErrorIcon(); - -private: - TQFrame *frame; - TQGridLayout *frameLayout; - TQLabel *mStatusLabel; - TQLabel *mpixLabel; - int mCapsLocked; - bool mUnlockingFailed; - TQStringList layoutsList; - TQStringList::iterator currLayout; - int sPid, sFd; + Q_OBJECT + + public: + InfoDlg(LockProcess *parent); + ~InfoDlg(); + virtual void show(); + + void updateLabel( TQString &txt ); + void setUnlockIcon(); + void setKDEIcon(); + void setInfoIcon(); + void setWarningIcon(); + void setErrorIcon(); + + private: + TQFrame *frame; + TQGridLayout *frameLayout; + TQLabel *mStatusLabel; + TQLabel *mpixLabel; + int mCapsLocked; + bool mUnlockingFailed; + TQStringList layoutsList; + TQStringList::iterator currLayout; + int sPid, sFd; }; #endif diff --git a/kdesktop/lock/lockdlg.cc b/kdesktop/lock/lockdlg.cc index 763d7bf95..d51536dca 100644 --- a/kdesktop/lock/lockdlg.cc +++ b/kdesktop/lock/lockdlg.cc @@ -1,10 +1,11 @@ //=========================================================================== // -// This file is part of the KDE project +// This file is part of the TDE project // // Copyright (c) 1999 Martin R. Jones <mjones@kde.org> // Copyright (c) 2003 Chris Howells <howells@kde.org> // Copyright (c) 2003 Oswald Buddenhagen <ossi@kde.org> +// Copyright (c) 2010 - 2015 Timothy Pearson <kb9vqf@pearsoncomputing.net> #include <config.h> @@ -42,6 +43,7 @@ #include <tqlistview.h> #include <tqheader.h> #include <tqcheckbox.h> +#include <tqfile.h> #include <ctype.h> #include <unistd.h> @@ -56,6 +58,10 @@ #include <X11/Xatom.h> #include <fixx11h.h> +#ifdef HAVE_KRB5 +#include <tde/libtdeldap.h> +#endif + #ifndef AF_LOCAL # define AF_LOCAL AF_UNIX #endif @@ -75,12 +81,15 @@ int dialogHideTimeout = 10*1000; // Simple dialog for entering a password. // PasswordDlg::PasswordDlg(LockProcess *parent, GreeterPluginHandle *plugin) - : TQDialog(parent, "password dialog", true, (trinity_desktop_lock_use_system_modal_dialogs?((WFlags)WStyle_StaysOnTop):((WFlags)WX11BypassWM))), - mPlugin( plugin ), - mCapsLocked(-1), - mUnlockingFailed(false) + : TQDialog(parent, "password dialog", true, (trinity_desktop_lock_use_system_modal_dialogs?((WFlags)WStyle_StaysOnTop):((WFlags)WX11BypassWM))), + mPlugin( plugin ), + mCapsLocked(-1), + mUnlockingFailed(false), + validUserCardInserted(false), + showInfoMessages(true), + mCardLoginInProgress(false) { - init(plugin); + init(plugin); } // @@ -88,239 +97,249 @@ PasswordDlg::PasswordDlg(LockProcess *parent, GreeterPluginHandle *plugin) // This version includes support for displaying the date and time the lock process was started // PasswordDlg::PasswordDlg(LockProcess *parent, GreeterPluginHandle *plugin, TQDateTime lockStartDateTime) - : TQDialog(parent, "password dialog", true, (trinity_desktop_lock_use_system_modal_dialogs?((WFlags)WStyle_StaysOnTop):((WFlags)WX11BypassWM))), - mPlugin( plugin ), - mCapsLocked(-1), - mUnlockingFailed(false) + : TQDialog(parent, "password dialog", true, (trinity_desktop_lock_use_system_modal_dialogs?((WFlags)WStyle_StaysOnTop):((WFlags)WX11BypassWM))), + mPlugin( plugin ), + mCapsLocked(-1), + mUnlockingFailed(false), + showInfoMessages(true), + mCardLoginInProgress(false) { - m_lockStartDT = lockStartDateTime; - init(plugin); + m_lockStartDT = lockStartDateTime; + init(plugin); } void PasswordDlg::init(GreeterPluginHandle *plugin) { - dialogHideTimeout = trinity_desktop_lock_delay_screensaver_start?KDesktopSettings::timeout()*1000:10*1000; - - if (trinity_desktop_lock_use_system_modal_dialogs) { - // Signal that we do not want any window controls to be shown at all - Atom kde_wm_system_modal_notification; - kde_wm_system_modal_notification = XInternAtom(tqt_xdisplay(), "_TDE_WM_MODAL_SYS_NOTIFICATION", False); - XChangeProperty(tqt_xdisplay(), winId(), kde_wm_system_modal_notification, XA_INTEGER, 32, PropModeReplace, (unsigned char *) "TRUE", 1L); - } - setCaption(i18n("Desktop Session Locked")); - - frame = new TQFrame( this ); - if (trinity_desktop_lock_use_system_modal_dialogs) - frame->setFrameStyle( TQFrame::NoFrame ); - else - frame->setFrameStyle( TQFrame::Panel | TQFrame::Raised ); - frame->setLineWidth( 2 ); - - TQLabel *pixLabel = NULL; - if (!trinity_desktop_lock_use_system_modal_dialogs) { - pixLabel = new TQLabel( frame, "pixlabel" ); - pixLabel->setPixmap(DesktopIcon("system-lock-screen")); - } - - KUser user; - TQLabel *greetLabel; - if (trinity_desktop_lock_use_system_modal_dialogs) { - greetLabel = new TQLabel( user.fullName().isEmpty() ? - "<b>" + i18n("This computer is in use and has been locked.") + "</b>" : - "<b>" + i18n("This computer is in use and has been locked.") + "</b><br><nobr>" + i18n("Only '%1' may unlock this session.").arg( user.fullName() ), frame ); - } - else { - greetLabel = new TQLabel( user.fullName().isEmpty() ? - i18n("<nobr><b>The session is locked</b><br>") : - i18n("<nobr><b>The session was locked by %1</b><br>").arg( user.fullName() ), frame ); - } - - TQLabel *lockDTLabel = NULL; - if ((trinity_desktop_lock_use_system_modal_dialogs) && (!m_lockStartDT.isNull())) { - lockDTLabel = new TQLabel(i18n("This session has been locked since %1").arg(m_lockStartDT.toString()), frame); - } - - mStatusLabel = new TQLabel( "<b> </b>", frame ); - mStatusLabel->setAlignment( TQLabel::AlignCenter ); - - mLayoutButton = new TQPushButton( frame ); - mLayoutButton->setFlat( true ); - - KSeparator *sep = new KSeparator( KSeparator::HLine, frame ); - - mNewSessButton = new KPushButton( KGuiItem(i18n("Sw&itch User..."), "fork"), frame ); - ok = new KPushButton( i18n("Unl&ock"), frame ); - ok->setDefault(true); - - bool show_cancel_button = !trinity_desktop_lock_hide_cancel_button || - trinity_desktop_lock_use_sak || - !trinity_desktop_lock_use_system_modal_dialogs; - if (show_cancel_button) - cancel = new KPushButton( KStdGuiItem::cancel(), frame ); - else - cancel = NULL; - - greet = plugin->info->create( this, 0, this, mLayoutButton, TQString::null, - KGreeterPlugin::Authenticate, KGreeterPlugin::ExUnlock ); - - TQVBoxLayout *unlockDialogLayout = new TQVBoxLayout( this ); - unlockDialogLayout->addWidget( frame ); - - TQHBoxLayout *layStatus = new TQHBoxLayout( 0, 0, KDialog::spacingHint()); - layStatus->addWidget( mStatusLabel ); - layStatus->addWidget( mLayoutButton ); - - TQHBoxLayout *layButtons = new TQHBoxLayout( 0, 0, KDialog::spacingHint()); - layButtons->addWidget( mNewSessButton ); - layButtons->addStretch(); - layButtons->addWidget(ok); - if (show_cancel_button) - layButtons->addWidget(cancel); - - if (trinity_desktop_lock_use_system_modal_dialogs) { - KSMModalDialogHeader* theader = new KSMModalDialogHeader( frame ); - - if (!m_lockStartDT.isNull()) { - frameLayout = new TQGridLayout( frame, 1, 1, KDialog::marginHint(), KDialog::spacingHint() ); - frameLayout->addMultiCellWidget( theader, 0, 0, 0, 2, Qt::AlignTop ); - frameLayout->addWidget( greetLabel, 1, 1 ); - frameLayout->addWidget( lockDTLabel, 2, 1 ); - frameLayout->addItem( greet->getLayoutItem(), 3, 1 ); - frameLayout->addLayout( layStatus, 4, 1 ); - frameLayout->addMultiCellWidget( sep, 5, 5, 0, 1 ); - frameLayout->addMultiCellLayout( layButtons, 6, 6, 0, 1 ); - } - else { - frameLayout = new TQGridLayout( frame, 1, 1, KDialog::marginHint(), KDialog::spacingHint() ); - frameLayout->addMultiCellWidget( theader, 0, 0, 0, 2, Qt::AlignTop ); - frameLayout->addWidget( greetLabel, 1, 1 ); - frameLayout->addItem( greet->getLayoutItem(), 2, 1 ); - frameLayout->addLayout( layStatus, 3, 1 ); - frameLayout->addMultiCellWidget( sep, 4, 4, 0, 1 ); - frameLayout->addMultiCellLayout( layButtons, 5, 5, 0, 1 ); - } - } - else { - frameLayout = new TQGridLayout( frame, 1, 1, KDialog::marginHint(), KDialog::spacingHint() ); - frameLayout->addMultiCellWidget( pixLabel, 0, 2, 0, 0, Qt::AlignTop ); - frameLayout->addWidget( greetLabel, 0, 1 ); - frameLayout->addItem( greet->getLayoutItem(), 1, 1 ); - frameLayout->addLayout( layStatus, 2, 1 ); - frameLayout->addMultiCellWidget( sep, 3, 3, 0, 1 ); - frameLayout->addMultiCellLayout( layButtons, 4, 4, 0, 1 ); - } - - if (show_cancel_button) - { - setTabOrder( ok, cancel ); - setTabOrder( cancel, mNewSessButton ); - } - else - { - setTabOrder( ok, mNewSessButton ); - } - setTabOrder( mNewSessButton, mLayoutButton ); - - connect(mLayoutButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(layoutClicked())); - if (show_cancel_button) - { - connect(cancel, TQT_SIGNAL(clicked()), TQT_SLOT(reject())); - } - connect(ok, TQT_SIGNAL(clicked()), TQT_SLOT(slotOK())); - connect(mNewSessButton, TQT_SIGNAL(clicked()), TQT_SLOT(slotSwitchUser())); - - if (!DM().isSwitchable() || !kapp->authorize("switch_user")) - mNewSessButton->hide(); - - installEventFilter(this); - setFixedSize( sizeHint() ); - - mFailedTimerId = 0; - mTimeoutTimerId = startTimer(PASSDLG_HIDE_TIMEOUT); - connect(tqApp, TQT_SIGNAL(activity()), TQT_SLOT(slotActivity()) ); - - greet->start(); - - DCOPRef kxkb("kxkb", "kxkb"); - if( !kxkb.isNull() ) { - DCOPReply reply = kxkb.call("getLayoutsList"); - if (reply.isValid()) { - layoutsList = reply; - } - reply = kxkb.call("getCurrentLayout"); - TQString currentLayout; - if (reply.isValid()) { - reply.get(currentLayout); - } - if( !currentLayout.isEmpty() && layoutsList.count() > 1 ) { - currLayout = layoutsList.find(currentLayout); - if (currLayout == layoutsList.end()) - setLayoutText("err"); - else - setLayoutText(*currLayout); - } else - mLayoutButton->hide(); - } else { - mLayoutButton->hide(); // no kxkb running - } - capsLocked(); + dialogHideTimeout = trinity_desktop_lock_delay_screensaver_start?KDesktopSettings::timeout()*1000:10*1000; + + if (trinity_desktop_lock_use_system_modal_dialogs) { + // Signal that we do not want any window controls to be shown at all + Atom kde_wm_system_modal_notification; + kde_wm_system_modal_notification = XInternAtom(tqt_xdisplay(), "_TDE_WM_MODAL_SYS_NOTIFICATION", False); + XChangeProperty(tqt_xdisplay(), winId(), kde_wm_system_modal_notification, XA_INTEGER, 32, PropModeReplace, (unsigned char *) "TRUE", 1L); + } + setCaption(i18n("Desktop Session Locked")); + + frame = new TQFrame( this ); + if (trinity_desktop_lock_use_system_modal_dialogs) { + frame->setFrameStyle( TQFrame::NoFrame ); + } + else { + frame->setFrameStyle( TQFrame::Panel | TQFrame::Raised ); + } + frame->setLineWidth( 2 ); + + TQLabel *pixLabel = NULL; + if (!trinity_desktop_lock_use_system_modal_dialogs) { + pixLabel = new TQLabel( frame, "pixlabel" ); + pixLabel->setPixmap(DesktopIcon("system-lock-screen")); + } + + KUser user; + TQLabel *greetLabel; + if (trinity_desktop_lock_use_system_modal_dialogs) { + greetLabel = new TQLabel( user.fullName().isEmpty() ? + "<b>" + i18n("This computer is in use and has been locked.") + "</b>" : + "<b>" + i18n("This computer is in use and has been locked.") + "</b><br><nobr>" + i18n("Only '%1' may unlock this session.").arg( user.fullName() ), frame ); + } + else { + greetLabel = new TQLabel( user.fullName().isEmpty() ? + i18n("<nobr><b>The session is locked</b><br>") : + i18n("<nobr><b>The session was locked by %1</b><br>").arg( user.fullName() ), frame ); + } + + TQLabel *lockDTLabel = NULL; + if ((trinity_desktop_lock_use_system_modal_dialogs) && (!m_lockStartDT.isNull())) { + lockDTLabel = new TQLabel(i18n("This session has been locked since %1").arg(m_lockStartDT.toString()), frame); + } + + mStatusLabel = new TQLabel( "<b> </b>", frame ); + mStatusLabel->setAlignment( TQLabel::AlignCenter ); + + mLayoutButton = new TQPushButton( frame ); + mLayoutButton->setFlat( true ); + + KSeparator *sep = new KSeparator( KSeparator::HLine, frame ); + + mNewSessButton = new KPushButton( KGuiItem(i18n("Sw&itch User..."), "fork"), frame ); + ok = new KPushButton( i18n("Unl&ock"), frame ); + ok->setDefault(true); + + bool show_cancel_button = !trinity_desktop_lock_hide_cancel_button + || trinity_desktop_lock_use_sak + || !trinity_desktop_lock_use_system_modal_dialogs; + if (show_cancel_button) { + cancel = new KPushButton( KStdGuiItem::cancel(), frame ); + } + else { + cancel = NULL; + } + + greet = plugin->info->create( this, 0, this, mLayoutButton, TQString::null, + KGreeterPlugin::Authenticate, KGreeterPlugin::ExUnlock ); + + TQVBoxLayout *unlockDialogLayout = new TQVBoxLayout( this ); + unlockDialogLayout->addWidget( frame ); + + TQHBoxLayout *layStatus = new TQHBoxLayout( 0, 0, KDialog::spacingHint()); + layStatus->addWidget( mStatusLabel ); + layStatus->addWidget( mLayoutButton ); + + TQHBoxLayout *layButtons = new TQHBoxLayout( 0, 0, KDialog::spacingHint()); + layButtons->addWidget( mNewSessButton ); + layButtons->addStretch(); + layButtons->addWidget(ok); + if (show_cancel_button) { + layButtons->addWidget(cancel); + } + + if (trinity_desktop_lock_use_system_modal_dialogs) { + KSMModalDialogHeader* theader = new KSMModalDialogHeader( frame ); + + if (!m_lockStartDT.isNull()) { + frameLayout = new TQGridLayout( frame, 1, 1, KDialog::marginHint(), KDialog::spacingHint() ); + frameLayout->addMultiCellWidget( theader, 0, 0, 0, 2, Qt::AlignTop ); + frameLayout->addWidget( greetLabel, 1, 1 ); + frameLayout->addWidget( lockDTLabel, 2, 1 ); + frameLayout->addItem( greet->getLayoutItem(), 3, 1 ); + frameLayout->addLayout( layStatus, 4, 1 ); + frameLayout->addMultiCellWidget( sep, 5, 5, 0, 1 ); + frameLayout->addMultiCellLayout( layButtons, 6, 6, 0, 1 ); + } + else { + frameLayout = new TQGridLayout( frame, 1, 1, KDialog::marginHint(), KDialog::spacingHint() ); + frameLayout->addMultiCellWidget( theader, 0, 0, 0, 2, Qt::AlignTop ); + frameLayout->addWidget( greetLabel, 1, 1 ); + frameLayout->addItem( greet->getLayoutItem(), 2, 1 ); + frameLayout->addLayout( layStatus, 3, 1 ); + frameLayout->addMultiCellWidget( sep, 4, 4, 0, 1 ); + frameLayout->addMultiCellLayout( layButtons, 5, 5, 0, 1 ); + } + } + else { + frameLayout = new TQGridLayout( frame, 1, 1, KDialog::marginHint(), KDialog::spacingHint() ); + frameLayout->addMultiCellWidget( pixLabel, 0, 2, 0, 0, Qt::AlignTop ); + frameLayout->addWidget( greetLabel, 0, 1 ); + frameLayout->addItem( greet->getLayoutItem(), 1, 1 ); + frameLayout->addLayout( layStatus, 2, 1 ); + frameLayout->addMultiCellWidget( sep, 3, 3, 0, 1 ); + frameLayout->addMultiCellLayout( layButtons, 4, 4, 0, 1 ); + } + + if (show_cancel_button) { + setTabOrder( ok, cancel ); + setTabOrder( cancel, mNewSessButton ); + } + else { + setTabOrder( ok, mNewSessButton ); + } + setTabOrder( mNewSessButton, mLayoutButton ); + + connect(mLayoutButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(layoutClicked())); + if (show_cancel_button) { + connect(cancel, TQT_SIGNAL(clicked()), TQT_SLOT(reject())); + } + connect(ok, TQT_SIGNAL(clicked()), TQT_SLOT(slotOK())); + connect(mNewSessButton, TQT_SIGNAL(clicked()), TQT_SLOT(slotSwitchUser())); + + if (!DM().isSwitchable() || !kapp->authorize("switch_user")) { + mNewSessButton->hide(); + } + + installEventFilter(this); + setFixedSize( sizeHint() ); + + mFailedTimerId = 0; + mTimeoutTimerId = startTimer(PASSDLG_HIDE_TIMEOUT); + connect(tqApp, TQT_SIGNAL(activity()), TQT_SLOT(slotActivity()) ); + + greet->setInfoMessageDisplay(showInfoMessages); + greet->start(); + + DCOPRef kxkb("kxkb", "kxkb"); + if( !kxkb.isNull() ) { + DCOPReply reply = kxkb.call("getLayoutsList"); + if (reply.isValid()) { + layoutsList = reply; + } + reply = kxkb.call("getCurrentLayout"); + TQString currentLayout; + if (reply.isValid()) { + reply.get(currentLayout); + } + if( !currentLayout.isEmpty() && layoutsList.count() > 1 ) { + currLayout = layoutsList.find(currentLayout); + if (currLayout == layoutsList.end()) + setLayoutText("err"); + else + setLayoutText(*currLayout); + } + else { + mLayoutButton->hide(); + } + } + else { + mLayoutButton->hide(); // no kxkb running + } + capsLocked(); + + if (static_cast< LockProcess* >(parent())->cryptographicCardDevice()) { + attemptCardLogin(); + } } PasswordDlg::~PasswordDlg() { - hide(); - frameLayout->removeItem( greet->getLayoutItem() ); - delete greet; + hide(); + frameLayout->removeItem( greet->getLayoutItem() ); + delete greet; } void PasswordDlg::reject() { - if (!trinity_desktop_lock_hide_cancel_button || trinity_desktop_lock_use_sak || - !trinity_desktop_lock_use_system_modal_dialogs || trinity_desktop_lock_autohide_lockdlg) - { - TQDialog::reject(); - } + if (!trinity_desktop_lock_hide_cancel_button + || trinity_desktop_lock_use_sak + || !trinity_desktop_lock_use_system_modal_dialogs + || trinity_desktop_lock_autohide_lockdlg) { + TQDialog::reject(); + } } void PasswordDlg::layoutClicked() { + if( ++currLayout == layoutsList.end() ) { + currLayout = layoutsList.begin(); + } - if( ++currLayout == layoutsList.end() ) - currLayout = layoutsList.begin(); - - DCOPRef kxkb("kxkb", "kxkb"); - setLayoutText( kxkb.call("setLayout", *currLayout) ? *currLayout : "err" ); + DCOPRef kxkb("kxkb", "kxkb"); + setLayoutText( kxkb.call("setLayout", *currLayout) ? *currLayout : "err" ); } void PasswordDlg::setLayoutText( const TQString &txt ) { - mLayoutButton->setText( txt ); - TQSize sz = mLayoutButton->fontMetrics().size( 0, txt ); - int mrg = mLayoutButton->style().pixelMetric( TQStyle::PM_ButtonMargin ) * 2; - mLayoutButton->setFixedSize( sz.width() + mrg, sz.height() + mrg ); + mLayoutButton->setText( txt ); + TQSize sz = mLayoutButton->fontMetrics().size( 0, txt ); + int mrg = mLayoutButton->style().pixelMetric( TQStyle::PM_ButtonMargin ) * 2; + mLayoutButton->setFixedSize( sz.width() + mrg, sz.height() + mrg ); } void PasswordDlg::updateLabel() { - if (mUnlockingFailed) - { - mStatusLabel->setPaletteForegroundColor(Qt::black); - mStatusLabel->setText(i18n("<b>Unlocking failed</b>")); -// mStatusLabel->show(); - } - else - if (mCapsLocked) - { - mStatusLabel->setPaletteForegroundColor(Qt::red); - mStatusLabel->setText(i18n("<b>Warning: Caps Lock on</b>")); -// mStatusLabel->show(); - } - else - { - mStatusLabel->setText("<b> </b>"); -// mStatusLabel->hide(); - } + if (mUnlockingFailed) { + mStatusLabel->setPaletteForegroundColor(Qt::black); + mStatusLabel->setText(i18n("<b>Unlocking failed</b>")); +// mStatusLabel->show(); + } + else if (mCapsLocked) { + mStatusLabel->setPaletteForegroundColor(Qt::red); + mStatusLabel->setText(i18n("<b>Warning: Caps Lock on</b>")); +// mStatusLabel->show(); + } + else { + mStatusLabel->setText("<b> </b>"); +// mStatusLabel->hide(); + } } //--------------------------------------------------------------------------- @@ -329,240 +348,294 @@ void PasswordDlg::updateLabel() // void PasswordDlg::timerEvent(TQTimerEvent *ev) { - if (ev->timerId() == mTimeoutTimerId) - { - if (trinity_desktop_lock_autohide_lockdlg) - { - // Force dialog rejection regardless of the value of trinity_desktop_lock_hide_cancel_button - TQDialog::reject(); - } - else - { - slotActivity(); - } - } - else if (ev->timerId() == mFailedTimerId) - { - killTimer(mFailedTimerId); - mFailedTimerId = 0; - // Show the normal password prompt. - mUnlockingFailed = false; - updateLabel(); - ok->setEnabled(true); - if (cancel) cancel->setEnabled(true); - mNewSessButton->setEnabled( true ); - greet->revive(); - greet->start(); - } + if (ev->timerId() == mTimeoutTimerId) { + if (trinity_desktop_lock_autohide_lockdlg) { + // Force dialog rejection regardless of the value of trinity_desktop_lock_hide_cancel_button + TQDialog::reject(); + } + else { + slotActivity(); + } + } + else if (ev->timerId() == mFailedTimerId) { + killTimer(mFailedTimerId); + mFailedTimerId = 0; + // Show the normal password prompt. + mUnlockingFailed = false; + updateLabel(); + ok->setEnabled(true); + if (cancel) { + cancel->setEnabled(true); + } + mNewSessButton->setEnabled( true ); + greet->revive(); + greet->start(); + } } bool PasswordDlg::eventFilter(TQObject *, TQEvent *ev) { - if (ev->type() == TQEvent::KeyPress || ev->type() == TQEvent::KeyRelease) - capsLocked(); - return false; + if (ev->type() == TQEvent::KeyPress || ev->type() == TQEvent::KeyRelease) { + capsLocked(); + } + return false; } void PasswordDlg::slotActivity() { - if (mTimeoutTimerId) { - killTimer(mTimeoutTimerId); - mTimeoutTimerId = startTimer(PASSDLG_HIDE_TIMEOUT); - } + if (mTimeoutTimerId) { + killTimer(mTimeoutTimerId); + mTimeoutTimerId = startTimer(PASSDLG_HIDE_TIMEOUT); + } } ////// kckeckpass interface code int PasswordDlg::Reader (void *buf, int count) { - int ret, rlen; - - for (rlen = 0; rlen < count; ) { - dord: - ret = ::read (sFd, (void *)((char *)buf + rlen), count - rlen); - if (ret < 0) { - if (errno == EINTR) - goto dord; - if (errno == EAGAIN) - break; - return -1; - } - if (!ret) - break; - rlen += ret; - } - return rlen; + int ret, rlen; + + for (rlen = 0; rlen < count; ) { +dord: + ret = ::read (sFd, (void *)((char *)buf + rlen), count - rlen); + if (ret < 0) { + if (errno == EINTR) { + goto dord; + } + if (errno == EAGAIN) { + break; + } + return -1; + } + if (!ret) { + break; + } + rlen += ret; + } + return rlen; } bool PasswordDlg::GRead (void *buf, int count) { - return Reader (buf, count) == count; + return Reader (buf, count) == count; } bool PasswordDlg::GWrite (const void *buf, int count) { - return ::write (sFd, buf, count) == count; + return ::write (sFd, buf, count) == count; } bool PasswordDlg::GSendInt (int val) { - return GWrite (&val, sizeof(val)); + return GWrite (&val, sizeof(val)); } bool PasswordDlg::GSendStr (const char *buf) { - int len = buf ? ::strlen (buf) + 1 : 0; - return GWrite (&len, sizeof(len)) && GWrite (buf, len); + int len = buf ? ::strlen (buf) + 1 : 0; + return GWrite (&len, sizeof(len)) && GWrite (buf, len); } bool PasswordDlg::GSendArr (int len, const char *buf) { - return GWrite (&len, sizeof(len)) && GWrite (buf, len); + return GWrite (&len, sizeof(len)) && GWrite (buf, len); } bool PasswordDlg::GRecvInt (int *val) { - return GRead (val, sizeof(*val)); + return GRead (val, sizeof(*val)); } bool PasswordDlg::GRecvArr (char **ret) { - int len; - char *buf; - - if (!GRecvInt(&len)) - return false; - if (!len) { - *ret = 0; - return true; - } - if (!(buf = (char *)::malloc (len))) - return false; - *ret = buf; - return GRead (buf, len); + int len; + char *buf; + + if (!GRecvInt(&len)) { + return false; + } + if (!len) { + *ret = 0; + return true; + } + if (!(buf = (char *)::malloc (len))) { + return false; + } + *ret = buf; + return GRead (buf, len); } void PasswordDlg::reapVerify() { - ::close( sFd ); - int status; - pid_t retpid = ::waitpid( sPid, &status, 0 ); - if (retpid < 0) { - // FIXME - // ERROR - } - else { - if (WIFEXITED(status)) { - switch (WEXITSTATUS(status)) { - case AuthOk: - greet->succeeded(); - accept(); - return; - case AuthBad: - greet->failed(); - mUnlockingFailed = true; - updateLabel(); - mFailedTimerId = startTimer(1500); - ok->setEnabled(false); - if (cancel) cancel->setEnabled(false); - mNewSessButton->setEnabled( false ); - return; - case AuthAbort: - return; - } - } - else if (WIFSIGNALED(status)) { - // FIXME - // ERROR - } - } - cantCheck(); + ::close( sFd ); + int status; + pid_t retpid = ::waitpid( sPid, &status, 0 ); + if (retpid < 0) { + // FIXME + // ERROR + } + else { + if (WIFEXITED(status)) { + switch (WEXITSTATUS(status)) { + case AuthOk: + { + KUser userinfo; + TQString fileName = userinfo.homeDir() + "/.tde_card_login_state"; + TQFile flagFile(fileName); + if (validUserCardInserted) { + // Card was likely used to log in + if (flagFile.open(IO_WriteOnly)) { + flagFile.writeBlock("1\n", 2); + flagFile.close(); + } + } + else { + // Card was not used to log in + flagFile.remove(); + } + + // Signal success + greet->succeeded(); + accept(); + return; + } + case AuthBad: + greet->failed(); + mUnlockingFailed = true; + updateLabel(); + mFailedTimerId = startTimer(1500); + ok->setEnabled(false); + if (cancel) { + cancel->setEnabled(false); + } + mNewSessButton->setEnabled( false ); + return; + case AuthAbort: + return; + } + } + else if (WIFSIGNALED(status)) { + // FIXME + // ERROR + } + } + cantCheck(); } void PasswordDlg::handleVerify() { - int ret; - char *arr; - - while (GRecvInt( &ret )) { - switch (ret) { - case ConvGetBinary: - if (!GRecvArr( &arr )) - break; - greet->binaryPrompt( arr, false ); - if (arr) - ::free( arr ); - return; - case ConvGetNormal: - if (!GRecvArr( &arr )) - break; - greet->textPrompt( arr, true, false ); - if (arr) - ::free( arr ); - return; - case ConvGetHidden: - if (!GRecvArr( &arr )) - break; - greet->textPrompt( arr, false, false ); - if (arr) - ::free( arr ); - return; - case ConvPutInfo: - if (!GRecvArr( &arr )) - break; - if (!greet->textMessage( arr, false )) - static_cast< LockProcess* >(parent())->msgBox( TQMessageBox::Information, TQString::fromLocal8Bit( arr ) ); - ::free( arr ); - continue; - case ConvPutError: - if (!GRecvArr( &arr )) - break; - if (!greet->textMessage( arr, true )) - static_cast< LockProcess* >(parent())->msgBox( TQMessageBox::Warning, TQString::fromLocal8Bit( arr ) ); - ::free( arr ); - continue; - } - break; - } - reapVerify(); + int ret; + char *arr; + + while (GRecvInt( &ret )) { + switch (ret) { + case ConvGetBinary: + if (!GRecvArr( &arr )) + break; + greet->binaryPrompt( arr, false ); + if (arr) + ::free( arr ); + return; + case ConvGetNormal: + if (!GRecvArr( &arr )) + break; + greet->textPrompt( arr, true, false ); + if (arr) + ::free( arr ); + return; + case ConvGetHidden: + if (!GRecvArr( &arr )) + break; + if (arr && (arr[0] != 0)) { + // Reset password entry and change text + greet->start(); + greet->textPrompt( arr, false, false ); + + // Force relayout + setFixedSize( sizeHint().width(), sizeHint().height() + 1 ); + setFixedSize( sizeHint() ); + + // Check if cryptographic card login is being used + if (mCardLoginInProgress) { + // Attempt authentication if configured + TDECryptographicCardDevice* cdevice = static_cast<LockProcess*>(parent())->cryptographicCardDevice(); + if (cdevice) { + TQString autoPIN = cdevice->autoPIN(); + if (autoPIN != TQString::null) { + greet->setPassword(autoPIN); + TQTimer::singleShot(0, this, SLOT(slotOK())); + } + } + mCardLoginInProgress = false; + } + } + else { + greet->textPrompt( arr, false, false ); + } + if (arr) + ::free( arr ); + return; + case ConvPutInfo: + if (!GRecvArr( &arr )) + break; + if (!greet->textMessage( arr, false )) + static_cast< LockProcess* >(parent())->msgBox( TQMessageBox::Information, TQString::fromLocal8Bit( arr ) ); + ::free( arr ); + continue; + case ConvPutError: + if (!GRecvArr( &arr )) + break; + if (!greet->textMessage( arr, true )) + static_cast< LockProcess* >(parent())->msgBox( TQMessageBox::Warning, TQString::fromLocal8Bit( arr ) ); + ::free( arr ); + continue; + } + break; + } + reapVerify(); } ////// greeter plugin callbacks void PasswordDlg::gplugReturnText( const char *text, int tag ) { - GSendStr( text ); - if (text) - GSendInt( tag ); - handleVerify(); + GSendStr( text ); + if (text) { + GSendInt( tag ); + } + handleVerify(); } void PasswordDlg::gplugReturnBinary( const char *data ) { - if (data) { - unsigned const char *up = (unsigned const char *)data; - int len = up[3] | (up[2] << 8) | (up[1] << 16) | (up[0] << 24); - if (!len) - GSendArr( 4, data ); - else - GSendArr( len, data ); - } else - GSendArr( 0, 0 ); - handleVerify(); + if (data) { + unsigned const char *up = (unsigned const char *)data; + int len = up[3] | (up[2] << 8) | (up[1] << 16) | (up[0] << 24); + if (!len) { + GSendArr( 4, data ); + } + else { + GSendArr( len, data ); + } + } + else { + GSendArr( 0, 0 ); + } + handleVerify(); } void PasswordDlg::gplugSetUser( const TQString & ) { - // ignore ... + // ignore ... } void PasswordDlg::cantCheck() { - greet->failed(); - static_cast< LockProcess* >(parent())->msgBox( TQMessageBox::Critical, - i18n("Cannot unlock the session because the authentication system failed to work;\n" - "you must kill kdesktop_lock (pid %1) manually.").arg(getpid()) ); - greet->revive(); + greet->failed(); + static_cast< LockProcess* >(parent())->msgBox( TQMessageBox::Critical, + i18n("Cannot unlock the session because the authentication system failed to work;\n" + "you must kill kdesktop_lock (pid %1) manually.").arg(getpid()) ); + greet->revive(); } //--------------------------------------------------------------------------- @@ -571,330 +644,384 @@ void PasswordDlg::cantCheck() // void PasswordDlg::gplugStart() { - int sfd[2]; - char fdbuf[16]; - - if (::socketpair(AF_LOCAL, SOCK_STREAM, 0, sfd)) { - cantCheck(); - return; - } - if ((sPid = ::fork()) < 0) { - ::close(sfd[0]); - ::close(sfd[1]); - cantCheck(); - return; - } - if (!sPid) { - ::close(sfd[0]); - sprintf(fdbuf, "%d", sfd[1]); - execlp("kcheckpass", "kcheckpass", + int sfd[2]; + char fdbuf[16]; + + if (::socketpair(AF_LOCAL, SOCK_STREAM, 0, sfd)) { + cantCheck(); + return; + } + if ((sPid = ::fork()) < 0) { + ::close(sfd[0]); + ::close(sfd[1]); + cantCheck(); + return; + } + if (!sPid) { + ::close(sfd[0]); + sprintf(fdbuf, "%d", sfd[1]); + execlp("kcheckpass", "kcheckpass", #ifdef HAVE_PAM - "-c", TDESCREENSAVER_PAM_SERVICE, + "-c", TDESCREENSAVER_PAM_SERVICE, #endif - "-m", mPlugin->info->method, - "-S", fdbuf, - (char *)0); - exit(20); - } - ::close(sfd[1]); - sFd = sfd[0]; - handleVerify(); + "-m", mPlugin->info->method, + "-S", fdbuf, + (char *)0); + exit(20); + } + ::close(sfd[1]); + sFd = sfd[0]; + handleVerify(); } void PasswordDlg::gplugActivity() { - slotActivity(); + slotActivity(); } void PasswordDlg::gplugMsgBox( TQMessageBox::Icon type, const TQString &text ) { - TQDialog dialog( this, 0, true, (trinity_desktop_lock_use_system_modal_dialogs?((WFlags)WStyle_StaysOnTop):((WFlags)WX11BypassWM)) ); - if (trinity_desktop_lock_use_system_modal_dialogs) { - // Signal that we do not want any window controls to be shown at all - Atom kde_wm_system_modal_notification; - kde_wm_system_modal_notification = XInternAtom(tqt_xdisplay(), "_TDE_WM_MODAL_SYS_NOTIFICATION", False); - XChangeProperty(tqt_xdisplay(), dialog.winId(), kde_wm_system_modal_notification, XA_INTEGER, 32, PropModeReplace, (unsigned char *) "TRUE", 1L); - } - dialog.setCaption(i18n("Authentication Subsystem Notice")); - TQFrame *winFrame = new TQFrame( &dialog ); - if (trinity_desktop_lock_use_system_modal_dialogs) - winFrame->setFrameStyle( TQFrame::NoFrame ); - else - winFrame->setFrameStyle( TQFrame::WinPanel | TQFrame::Raised ); - winFrame->setLineWidth( 2 ); - TQVBoxLayout *vbox = new TQVBoxLayout( &dialog ); - vbox->addWidget( winFrame ); - - TQLabel *label1 = new TQLabel( winFrame ); - label1->setPixmap( TQMessageBox::standardIcon( type ) ); - TQLabel *label2 = new TQLabel( text, winFrame ); - KPushButton *button = new KPushButton( KStdGuiItem::ok(), winFrame ); - button->setDefault( true ); - button->setSizePolicy( TQSizePolicy( TQSizePolicy::Preferred, TQSizePolicy::Preferred ) ); - connect( button, TQT_SIGNAL( clicked() ), TQT_SLOT( accept() ) ); - - TQGridLayout *grid = new TQGridLayout( winFrame, 2, 2, 10 ); - grid->addWidget( label1, 0, 0, Qt::AlignCenter ); - grid->addWidget( label2, 0, 1, Qt::AlignCenter ); - grid->addMultiCellWidget( button, 1,1, 0,1, Qt::AlignCenter ); - - static_cast< LockProcess* >(parent())->execDialog( &dialog ); + TQDialog dialog( this, 0, true, (trinity_desktop_lock_use_system_modal_dialogs?((WFlags)WStyle_StaysOnTop):((WFlags)WX11BypassWM)) ); + if (trinity_desktop_lock_use_system_modal_dialogs) { + // Signal that we do not want any window controls to be shown at all + Atom kde_wm_system_modal_notification; + kde_wm_system_modal_notification = XInternAtom(tqt_xdisplay(), "_TDE_WM_MODAL_SYS_NOTIFICATION", False); + XChangeProperty(tqt_xdisplay(), dialog.winId(), kde_wm_system_modal_notification, XA_INTEGER, 32, PropModeReplace, (unsigned char *) "TRUE", 1L); + } + dialog.setCaption(i18n("Authentication Subsystem Notice")); + TQFrame *winFrame = new TQFrame( &dialog ); + if (trinity_desktop_lock_use_system_modal_dialogs) { + winFrame->setFrameStyle( TQFrame::NoFrame ); + } + else { + winFrame->setFrameStyle( TQFrame::WinPanel | TQFrame::Raised ); + } + winFrame->setLineWidth( 2 ); + TQVBoxLayout *vbox = new TQVBoxLayout( &dialog ); + vbox->addWidget( winFrame ); + + TQLabel *label1 = new TQLabel( winFrame ); + label1->setPixmap( TQMessageBox::standardIcon( type ) ); + TQLabel *label2 = new TQLabel( text, winFrame ); + KPushButton *button = new KPushButton( KStdGuiItem::ok(), winFrame ); + button->setDefault( true ); + button->setSizePolicy( TQSizePolicy( TQSizePolicy::Preferred, TQSizePolicy::Preferred ) ); + connect( button, TQT_SIGNAL( clicked() ), TQT_SLOT( accept() ) ); + + TQGridLayout *grid = new TQGridLayout( winFrame, 2, 2, 10 ); + grid->addWidget( label1, 0, 0, Qt::AlignCenter ); + grid->addWidget( label2, 0, 1, Qt::AlignCenter ); + grid->addMultiCellWidget( button, 1,1, 0,1, Qt::AlignCenter ); + + static_cast< LockProcess* >(parent())->execDialog( &dialog ); } void PasswordDlg::slotOK() { - greet->next(); + greet->next(); } void PasswordDlg::show() { - TQDialog::show(); - TQApplication::flushX(); - setFixedSize( sizeHint() ); + TQDialog::show(); + TQApplication::flushX(); + setFixedSize( sizeHint() ); } void PasswordDlg::slotStartNewSession() { - if (!KMessageBox::shouldBeShownContinue( ":confirmNewSession" )) { - DM().startReserve(); - return; - } - - killTimer(mTimeoutTimerId); - mTimeoutTimerId = 0; - - TQDialog *dialog = new TQDialog( this, "warnbox", true, (trinity_desktop_lock_use_system_modal_dialogs?((WFlags)WStyle_StaysOnTop):((WFlags)WX11BypassWM))); - - if (trinity_desktop_lock_use_system_modal_dialogs) { - // Signal that we do not want any window controls to be shown at all - Atom kde_wm_system_modal_notification; - kde_wm_system_modal_notification = XInternAtom(tqt_xdisplay(), "_TDE_WM_MODAL_SYS_NOTIFICATION", False); - XChangeProperty(tqt_xdisplay(), dialog->winId(), kde_wm_system_modal_notification, XA_INTEGER, 32, PropModeReplace, (unsigned char *) "TRUE", 1L); - } - dialog->setCaption(i18n("New Session")); - - TQFrame *winFrame = new TQFrame( dialog ); - if (trinity_desktop_lock_use_system_modal_dialogs) - winFrame->setFrameStyle( TQFrame::NoFrame ); - else - winFrame->setFrameStyle( TQFrame::WinPanel | TQFrame::Raised ); - winFrame->setLineWidth( 2 ); - TQVBoxLayout *vbox = new TQVBoxLayout( dialog ); - vbox->addWidget( winFrame ); - - TQLabel *label1 = new TQLabel( winFrame ); - label1->setPixmap( TQMessageBox::standardIcon( TQMessageBox::Warning ) ); - TQString qt_text = - i18n("You have chosen to open another desktop session " - "instead of resuming the current one.<br>" - "The current session will be hidden " - "and a new login screen will be displayed.<br>" - "An F-key is assigned to each session; " - "F%1 is usually assigned to the first session, " - "F%2 to the second session and so on. " - "You can switch between sessions by pressing " - "Ctrl, Alt and the appropriate F-key at the same time. " - "Additionally, the TDE Panel and Desktop menus have " - "actions for switching between sessions.") - .arg(7).arg(8); - TQLabel *label2 = new TQLabel( qt_text, winFrame ); - KPushButton *okbutton = new KPushButton( KGuiItem(i18n("&Start New Session"), "fork"), winFrame ); - okbutton->setDefault( true ); - connect( okbutton, TQT_SIGNAL( clicked() ), dialog, TQT_SLOT( accept() ) ); - KPushButton *cbutton = new KPushButton( KStdGuiItem::cancel(), winFrame ); - connect( cbutton, TQT_SIGNAL( clicked() ), dialog, TQT_SLOT( reject() ) ); - - TQBoxLayout *mbox = new TQVBoxLayout( winFrame, KDialog::marginHint(), KDialog::spacingHint() ); - - TQGridLayout *grid = new TQGridLayout( mbox, 2, 2, 2 * KDialog::spacingHint() ); - grid->setMargin( KDialog::marginHint() ); - grid->addWidget( label1, 0, 0, Qt::AlignCenter ); - grid->addWidget( label2, 0, 1, Qt::AlignCenter ); - TQCheckBox *cb = new TQCheckBox( i18n("&Do not ask again"), winFrame ); - grid->addMultiCellWidget( cb, 1,1, 0,1 ); - - TQBoxLayout *hbox = new TQHBoxLayout( mbox, KDialog::spacingHint() ); - hbox->addStretch( 1 ); - hbox->addWidget( okbutton ); - hbox->addStretch( 1 ); - hbox->addWidget( cbutton ); - hbox->addStretch( 1 ); - - // stolen from kmessagebox - int pref_width = 0; - int pref_height = 0; - // Calculate a proper size for the text. - { - TQSimpleRichText rt(qt_text, dialog->font()); - TQRect rect = TDEGlobalSettings::desktopGeometry(dialog); - - pref_width = rect.width() / 3; - rt.setWidth(pref_width); - int used_width = rt.widthUsed(); - pref_height = rt.height(); - if (used_width <= pref_width) - { - while(true) - { - int new_width = (used_width * 9) / 10; - rt.setWidth(new_width); - int new_height = rt.height(); - if (new_height > pref_height) - break; - used_width = rt.widthUsed(); - if (used_width > new_width) - break; - } - pref_width = used_width; - } - else - { - if (used_width > (pref_width *2)) - pref_width = pref_width *2; - else - pref_width = used_width; - } - } - label2->setFixedSize(TQSize(pref_width+10, pref_height)); - - int ret = static_cast< LockProcess* >( parent())->execDialog( dialog ); - - delete dialog; - - if (ret == TQDialog::Accepted) { - if (cb->isChecked()) - KMessageBox::saveDontShowAgainContinue( ":confirmNewSession" ); - DM().startReserve(); - } - - mTimeoutTimerId = startTimer(PASSDLG_HIDE_TIMEOUT); + if (!KMessageBox::shouldBeShownContinue( ":confirmNewSession" )) { + DM().startReserve(); + return; + } + + killTimer(mTimeoutTimerId); + mTimeoutTimerId = 0; + + TQDialog *dialog = new TQDialog( this, "warnbox", true, (trinity_desktop_lock_use_system_modal_dialogs?((WFlags)WStyle_StaysOnTop):((WFlags)WX11BypassWM))); + + if (trinity_desktop_lock_use_system_modal_dialogs) { + // Signal that we do not want any window controls to be shown at all + Atom kde_wm_system_modal_notification; + kde_wm_system_modal_notification = XInternAtom(tqt_xdisplay(), "_TDE_WM_MODAL_SYS_NOTIFICATION", False); + XChangeProperty(tqt_xdisplay(), dialog->winId(), kde_wm_system_modal_notification, XA_INTEGER, 32, PropModeReplace, (unsigned char *) "TRUE", 1L); + } + dialog->setCaption(i18n("New Session")); + + TQFrame *winFrame = new TQFrame( dialog ); + if (trinity_desktop_lock_use_system_modal_dialogs) { + winFrame->setFrameStyle( TQFrame::NoFrame ); + } + else { + winFrame->setFrameStyle( TQFrame::WinPanel | TQFrame::Raised ); + } + winFrame->setLineWidth( 2 ); + TQVBoxLayout *vbox = new TQVBoxLayout( dialog ); + vbox->addWidget( winFrame ); + + TQLabel *label1 = new TQLabel( winFrame ); + label1->setPixmap( TQMessageBox::standardIcon( TQMessageBox::Warning ) ); + TQString qt_text = i18n("You have chosen to open another desktop session " + "instead of resuming the current one.<br>" + "The current session will be hidden " + "and a new login screen will be displayed.<br>" + "An F-key is assigned to each session; " + "F%1 is usually assigned to the first session, " + "F%2 to the second session and so on. " + "You can switch between sessions by pressing " + "Ctrl, Alt and the appropriate F-key at the same time. " + "Additionally, the TDE Panel and Desktop menus have " + "actions for switching between sessions.") + .arg(7).arg(8); + TQLabel *label2 = new TQLabel( qt_text, winFrame ); + KPushButton *okbutton = new KPushButton( KGuiItem(i18n("&Start New Session"), "fork"), winFrame ); + okbutton->setDefault( true ); + connect( okbutton, TQT_SIGNAL( clicked() ), dialog, TQT_SLOT( accept() ) ); + KPushButton *cbutton = new KPushButton( KStdGuiItem::cancel(), winFrame ); + connect( cbutton, TQT_SIGNAL( clicked() ), dialog, TQT_SLOT( reject() ) ); + + TQBoxLayout *mbox = new TQVBoxLayout( winFrame, KDialog::marginHint(), KDialog::spacingHint() ); + + TQGridLayout *grid = new TQGridLayout( mbox, 2, 2, 2 * KDialog::spacingHint() ); + grid->setMargin( KDialog::marginHint() ); + grid->addWidget( label1, 0, 0, Qt::AlignCenter ); + grid->addWidget( label2, 0, 1, Qt::AlignCenter ); + TQCheckBox *cb = new TQCheckBox( i18n("&Do not ask again"), winFrame ); + grid->addMultiCellWidget( cb, 1,1, 0,1 ); + + TQBoxLayout *hbox = new TQHBoxLayout( mbox, KDialog::spacingHint() ); + hbox->addStretch( 1 ); + hbox->addWidget( okbutton ); + hbox->addStretch( 1 ); + hbox->addWidget( cbutton ); + hbox->addStretch( 1 ); + + // stolen from kmessagebox + int pref_width = 0; + int pref_height = 0; + // Calculate a proper size for the text. + { + TQSimpleRichText rt(qt_text, dialog->font()); + TQRect rect = TDEGlobalSettings::desktopGeometry(dialog); + + pref_width = rect.width() / 3; + rt.setWidth(pref_width); + int used_width = rt.widthUsed(); + pref_height = rt.height(); + if (used_width <= pref_width) { + while(true) { + int new_width = (used_width * 9) / 10; + rt.setWidth(new_width); + int new_height = rt.height(); + if (new_height > pref_height) { + break; + } + used_width = rt.widthUsed(); + if (used_width > new_width) { + break; + } + } + pref_width = used_width; + } + else { + if (used_width > (pref_width *2)) + pref_width = pref_width *2; + else + pref_width = used_width; + } + } + label2->setFixedSize(TQSize(pref_width+10, pref_height)); + + int ret = static_cast< LockProcess* >( parent())->execDialog( dialog ); + + delete dialog; + + if (ret == TQDialog::Accepted) { + if (cb->isChecked()) { + KMessageBox::saveDontShowAgainContinue( ":confirmNewSession" ); + } + DM().startReserve(); + } + + mTimeoutTimerId = startTimer(PASSDLG_HIDE_TIMEOUT); } class LockListViewItem : public TQListViewItem { -public: - LockListViewItem( TQListView *parent, - const TQString &sess, const TQString &loc, int _vt ) - : TQListViewItem( parent ) - , vt( _vt ) - { - setText( 0, sess ); - setText( 1, loc ); - } - - int vt; + public: + LockListViewItem( TQListView *parent, const TQString &sess, const TQString &loc, int _vt ) : TQListViewItem( parent ) + , vt( _vt ) + { + setText( 0, sess ); + setText( 1, loc ); + } + + int vt; }; void PasswordDlg::slotSwitchUser() { - int p = 0; - DM dm; - - TQDialog dialog( this, "sessbox", true, (trinity_desktop_lock_use_system_modal_dialogs?((WFlags)WStyle_StaysOnTop):((WFlags)WX11BypassWM)) ); - - if (trinity_desktop_lock_use_system_modal_dialogs) { - // Signal that we do not want any window controls to be shown at all - Atom kde_wm_system_modal_notification; - kde_wm_system_modal_notification = XInternAtom(tqt_xdisplay(), "_TDE_WM_MODAL_SYS_NOTIFICATION", False); - XChangeProperty(tqt_xdisplay(), dialog.winId(), kde_wm_system_modal_notification, XA_INTEGER, 32, PropModeReplace, (unsigned char *) "TRUE", 1L); - } - dialog.setCaption(i18n("Switch User")); - - TQFrame *winFrame = new TQFrame( &dialog ); - if (trinity_desktop_lock_use_system_modal_dialogs) - winFrame->setFrameStyle( TQFrame::NoFrame ); - else - winFrame->setFrameStyle( TQFrame::WinPanel | TQFrame::Raised ); - winFrame->setLineWidth( 2 ); - TQBoxLayout *vbox = new TQVBoxLayout( &dialog ); - vbox->addWidget( winFrame ); - - TQBoxLayout *hbox = new TQHBoxLayout( winFrame, KDialog::marginHint(), KDialog::spacingHint() ); - - TQBoxLayout *vbox1 = new TQVBoxLayout( hbox, KDialog::spacingHint() ); - TQBoxLayout *vbox2 = new TQVBoxLayout( hbox, KDialog::spacingHint() ); - - KPushButton *btn; - - SessList sess; - if (dm.localSessions( sess )) { - - lv = new TQListView( winFrame ); - connect( lv, TQT_SIGNAL(doubleClicked(TQListViewItem *, const TQPoint&, int)), TQT_SLOT(slotSessionActivated()) ); - connect( lv, TQT_SIGNAL(doubleClicked(TQListViewItem *, const TQPoint&, int)), &dialog, TQT_SLOT(accept()) ); - lv->setAllColumnsShowFocus( true ); - lv->addColumn( i18n("Session") ); - lv->addColumn( i18n("Location") ); - lv->setColumnWidthMode( 0, TQListView::Maximum ); - lv->setColumnWidthMode( 1, TQListView::Maximum ); - TQListViewItem *itm = 0; - TQString user, loc; - int ns = 0; - for (SessList::ConstIterator it = sess.begin(); it != sess.end(); ++it) { - DM::sess2Str2( *it, user, loc ); - itm = new LockListViewItem( lv, user, loc, (*it).vt ); - if (!(*it).vt) - itm->setEnabled( false ); - if ((*it).self) { - lv->setCurrentItem( itm ); - itm->setSelected( true ); - } - ns++; - } - int fw = lv->frameWidth() * 2; - TQSize hds( lv->header()->sizeHint() ); - lv->setMinimumWidth( fw + hds.width() + - (ns > 10 ? style().pixelMetric(TQStyle::PM_ScrollBarExtent) : 0 ) ); - lv->setFixedHeight( fw + hds.height() + - itm->height() * (ns < 6 ? 6 : ns > 10 ? 10 : ns) ); - lv->header()->adjustHeaderSize(); - vbox1->addWidget( lv ); - - btn = new KPushButton( KGuiItem(i18n("session", "&Activate"), "fork"), winFrame ); - connect( btn, TQT_SIGNAL(clicked()), TQT_SLOT(slotSessionActivated()) ); - connect( btn, TQT_SIGNAL(clicked()), &dialog, TQT_SLOT(accept()) ); - vbox2->addWidget( btn ); - vbox2->addStretch( 2 ); - } - - if (kapp->authorize("start_new_session") && (p = dm.numReserve()) >= 0) - { - btn = new KPushButton( KGuiItem(i18n("Start &New Session"), "fork"), winFrame ); - connect( btn, TQT_SIGNAL(clicked()), TQT_SLOT(slotStartNewSession()) ); - connect( btn, TQT_SIGNAL(clicked()), &dialog, TQT_SLOT(accept()) ); - if (!p) - btn->setEnabled( false ); - vbox2->addWidget( btn ); - vbox2->addStretch( 1 ); - } - - btn = new KPushButton( KStdGuiItem::cancel(), winFrame ); - connect( btn, TQT_SIGNAL(clicked()), &dialog, TQT_SLOT(reject()) ); - vbox2->addWidget( btn ); - - dialog.setFixedSize( dialog.sizeHint() ); - - int ret = static_cast< LockProcess* >(parent())->execDialog( &dialog ); - if (ret != TQDialog::Rejected) { - TQDialog::reject(); - } + int p = 0; + DM dm; + + TQDialog dialog( this, "sessbox", true, (trinity_desktop_lock_use_system_modal_dialogs?((WFlags)WStyle_StaysOnTop):((WFlags)WX11BypassWM)) ); + + if (trinity_desktop_lock_use_system_modal_dialogs) { + // Signal that we do not want any window controls to be shown at all + Atom kde_wm_system_modal_notification; + kde_wm_system_modal_notification = XInternAtom(tqt_xdisplay(), "_TDE_WM_MODAL_SYS_NOTIFICATION", False); + XChangeProperty(tqt_xdisplay(), dialog.winId(), kde_wm_system_modal_notification, XA_INTEGER, 32, PropModeReplace, (unsigned char *) "TRUE", 1L); + } + dialog.setCaption(i18n("Switch User")); + + TQFrame *winFrame = new TQFrame( &dialog ); + if (trinity_desktop_lock_use_system_modal_dialogs) { + winFrame->setFrameStyle( TQFrame::NoFrame ); + } + else { + winFrame->setFrameStyle( TQFrame::WinPanel | TQFrame::Raised ); + } + winFrame->setLineWidth( 2 ); + TQBoxLayout *vbox = new TQVBoxLayout( &dialog ); + vbox->addWidget( winFrame ); + + TQBoxLayout *hbox = new TQHBoxLayout( winFrame, KDialog::marginHint(), KDialog::spacingHint() ); + + TQBoxLayout *vbox1 = new TQVBoxLayout( hbox, KDialog::spacingHint() ); + TQBoxLayout *vbox2 = new TQVBoxLayout( hbox, KDialog::spacingHint() ); + + KPushButton *btn; + + SessList sess; + if (dm.localSessions( sess )) { + lv = new TQListView( winFrame ); + connect( lv, TQT_SIGNAL(doubleClicked(TQListViewItem *, const TQPoint&, int)), TQT_SLOT(slotSessionActivated()) ); + connect( lv, TQT_SIGNAL(doubleClicked(TQListViewItem *, const TQPoint&, int)), &dialog, TQT_SLOT(accept()) ); + lv->setAllColumnsShowFocus( true ); + lv->addColumn( i18n("Session") ); + lv->addColumn( i18n("Location") ); + lv->setColumnWidthMode( 0, TQListView::Maximum ); + lv->setColumnWidthMode( 1, TQListView::Maximum ); + TQListViewItem *itm = 0; + TQString user, loc; + int ns = 0; + for (SessList::ConstIterator it = sess.begin(); it != sess.end(); ++it) { + DM::sess2Str2( *it, user, loc ); + itm = new LockListViewItem( lv, user, loc, (*it).vt ); + if (!(*it).vt) { + itm->setEnabled( false ); + } + if ((*it).self) { + lv->setCurrentItem( itm ); + itm->setSelected( true ); + } + ns++; + } + int fw = lv->frameWidth() * 2; + TQSize hds( lv->header()->sizeHint() ); + lv->setMinimumWidth( fw + hds.width() + + (ns > 10 ? style().pixelMetric(TQStyle::PM_ScrollBarExtent) : 0 ) ); + lv->setFixedHeight( fw + hds.height() + + itm->height() * (ns < 6 ? 6 : ns > 10 ? 10 : ns) ); + lv->header()->adjustHeaderSize(); + vbox1->addWidget( lv ); + + btn = new KPushButton( KGuiItem(i18n("session", "&Activate"), "fork"), winFrame ); + connect( btn, TQT_SIGNAL(clicked()), TQT_SLOT(slotSessionActivated()) ); + connect( btn, TQT_SIGNAL(clicked()), &dialog, TQT_SLOT(accept()) ); + vbox2->addWidget( btn ); + vbox2->addStretch( 2 ); + } + + if (kapp->authorize("start_new_session") && (p = dm.numReserve()) >= 0) { + btn = new KPushButton( KGuiItem(i18n("Start &New Session"), "fork"), winFrame ); + connect( btn, TQT_SIGNAL(clicked()), TQT_SLOT(slotStartNewSession()) ); + connect( btn, TQT_SIGNAL(clicked()), &dialog, TQT_SLOT(accept()) ); + if (!p) + btn->setEnabled( false ); + vbox2->addWidget( btn ); + vbox2->addStretch( 1 ); + } + + btn = new KPushButton( KStdGuiItem::cancel(), winFrame ); + connect( btn, TQT_SIGNAL(clicked()), &dialog, TQT_SLOT(reject()) ); + vbox2->addWidget( btn ); + + dialog.setFixedSize( dialog.sizeHint() ); + + int ret = static_cast< LockProcess* >(parent())->execDialog( &dialog ); + if (ret != TQDialog::Rejected) { + TQDialog::reject(); + } } void PasswordDlg::slotSessionActivated() { - LockListViewItem *itm = (LockListViewItem *)lv->currentItem(); - if (itm && itm->vt > 0) - DM().switchVT( itm->vt ); + LockListViewItem *itm = (LockListViewItem *)lv->currentItem(); + if (itm && itm->vt > 0) { + DM().switchVT( itm->vt ); + } } void PasswordDlg::capsLocked() { - unsigned int lmask; - Window dummy1, dummy2; - int dummy3, dummy4, dummy5, dummy6; - XQueryPointer(tqt_xdisplay(), DefaultRootWindow( tqt_xdisplay() ), &dummy1, &dummy2, &dummy3, &dummy4, &dummy5, &dummy6, &lmask); - mCapsLocked = lmask & LockMask; - updateLabel(); + unsigned int lmask; + Window dummy1, dummy2; + int dummy3, dummy4, dummy5, dummy6; + XQueryPointer(tqt_xdisplay(), DefaultRootWindow( tqt_xdisplay() ), &dummy1, &dummy2, &dummy3, &dummy4, &dummy5, &dummy6, &lmask); + mCapsLocked = lmask & LockMask; + updateLabel(); +} + +void PasswordDlg::attemptCardLogin() { +#ifdef HAVE_KRB5 + // Make sure card logins are enabled before attempting one + if (!LDAPManager::pkcsLoginEnabled()) { + return; + } +#else + // Don't enable card-based logins if Kerberos integration was disabled + return; +#endif + + if (mCardLoginInProgress) { + return; + } + mCardLoginInProgress = true; + + // FIXME + // pam_pkcs11 is extremely chatty with no apparent way to disable the unwanted messages + greet->setInfoMessageDisplay(false); + + validUserCardInserted = true; + greet->setPasswordPrompt(i18n("PIN:")); + + // Force relayout + setFixedSize(sizeHint().width(), sizeHint().height() + 1); + setFixedSize(sizeHint()); + + // Bypass initial password prompt + greet->start(); + greet->setPassword(""); + TQTimer::singleShot(0, this, SLOT(slotOK())); +} + +void PasswordDlg::resetCardLogin() { + validUserCardInserted = false; + greet->abort(); + greet->clear(); + greet->revive(); + greet->start(); + greet->setPasswordPrompt(TQString::null); + + // Force relayout + setFixedSize(sizeHint().width(), sizeHint().height() + 1); + setFixedSize(sizeHint()); + + // Restore information message display settings + greet->setInfoMessageDisplay(showInfoMessages); + + mCardLoginInProgress = false; } #include "lockdlg.moc" diff --git a/kdesktop/lock/lockdlg.h b/kdesktop/lock/lockdlg.h index 2ede5a4fa..571d825fa 100644 --- a/kdesktop/lock/lockdlg.h +++ b/kdesktop/lock/lockdlg.h @@ -1,9 +1,10 @@ //=========================================================================== // -// This file is part of the KDE project +// This file is part of the TDE project // // Copyright (c) 1999 Martin R. Jones <mjones@kde.org> // Copyright (c) 2003 Oswald Buddenhagen <ossi@kde.org> +// Copyright (c) 2010 - 2015 Timothy Pearson <kb9vqf@pearsoncomputing.net> // #ifndef __LOCKDLG_H__ @@ -32,69 +33,75 @@ class TQListView; // class PasswordDlg : public TQDialog, public KGreeterPluginHandler { - Q_OBJECT + Q_OBJECT -public: - PasswordDlg(LockProcess *parent, GreeterPluginHandle *plugin); - PasswordDlg(LockProcess *parent, GreeterPluginHandle *plugin, TQDateTime lockStartDateTime); - ~PasswordDlg(); - void init(GreeterPluginHandle *plugin); - virtual void show(); + public: + PasswordDlg(LockProcess *parent, GreeterPluginHandle *plugin); + PasswordDlg(LockProcess *parent, GreeterPluginHandle *plugin, TQDateTime lockStartDateTime); + ~PasswordDlg(); + void init(GreeterPluginHandle *plugin); + virtual void show(); + + // from KGreetPluginHandler + virtual void gplugReturnText( const char *text, int tag ); + virtual void gplugReturnBinary( const char *data ); + virtual void gplugSetUser( const TQString & ); + virtual void gplugStart(); + virtual void gplugActivity(); + virtual void gplugMsgBox( TQMessageBox::Icon type, const TQString &text ); - // from KGreetPluginHandler - virtual void gplugReturnText( const char *text, int tag ); - virtual void gplugReturnBinary( const char *data ); - virtual void gplugSetUser( const TQString & ); - virtual void gplugStart(); - virtual void gplugActivity(); - virtual void gplugMsgBox( TQMessageBox::Icon type, const TQString &text ); - -protected: - virtual void timerEvent(TQTimerEvent *); - virtual bool eventFilter(TQObject *, TQEvent *); - -private slots: - void slotSwitchUser(); - void slotSessionActivated(); - void slotStartNewSession(); - void slotOK(); - void layoutClicked(); - void slotActivity(); - -protected slots: - virtual void reject(); - -private: - void setLayoutText( const TQString &txt ); - void capsLocked(); - void updateLabel(); - int Reader (void *buf, int count); - bool GRead (void *buf, int count); - bool GWrite (const void *buf, int count); - bool GSendInt (int val); - bool GSendStr (const char *buf); - bool GSendArr (int len, const char *buf); - bool GRecvInt (int *val); - bool GRecvArr (char **buf); - void handleVerify(); - void reapVerify(); - void cantCheck(); - GreeterPluginHandle *mPlugin; - KGreeterPlugin *greet; - TQFrame *frame; - TQGridLayout *frameLayout; - TQLabel *mStatusLabel; - KPushButton *mNewSessButton, *ok, *cancel; - TQPushButton *mLayoutButton; - int mFailedTimerId; - int mTimeoutTimerId; - int mCapsLocked; - bool mUnlockingFailed; - TQStringList layoutsList; - TQStringList::iterator currLayout; - int sPid, sFd; - TQListView *lv; - TQDateTime m_lockStartDT; + virtual void attemptCardLogin(); + virtual void resetCardLogin(); + + protected: + virtual void timerEvent(TQTimerEvent *); + virtual bool eventFilter(TQObject *, TQEvent *); + + private slots: + void slotSwitchUser(); + void slotSessionActivated(); + void slotStartNewSession(); + void slotOK(); + void layoutClicked(); + void slotActivity(); + + protected slots: + virtual void reject(); + + private: + void setLayoutText( const TQString &txt ); + void capsLocked(); + void updateLabel(); + int Reader (void *buf, int count); + bool GRead (void *buf, int count); + bool GWrite (const void *buf, int count); + bool GSendInt (int val); + bool GSendStr (const char *buf); + bool GSendArr (int len, const char *buf); + bool GRecvInt (int *val); + bool GRecvArr (char **buf); + void handleVerify(); + void reapVerify(); + void cantCheck(); + GreeterPluginHandle *mPlugin; + KGreeterPlugin *greet; + TQFrame *frame; + TQGridLayout *frameLayout; + TQLabel *mStatusLabel; + KPushButton *mNewSessButton, *ok, *cancel; + TQPushButton *mLayoutButton; + int mFailedTimerId; + int mTimeoutTimerId; + int mCapsLocked; + bool mUnlockingFailed; + bool validUserCardInserted; + bool showInfoMessages; + TQStringList layoutsList; + TQStringList::iterator currLayout; + int sPid, sFd; + TQListView *lv; + bool mCardLoginInProgress; + TQDateTime m_lockStartDT; }; #endif diff --git a/kdesktop/lock/lockprocess.cc b/kdesktop/lock/lockprocess.cc index bfafa371b..0a7f86366 100644 --- a/kdesktop/lock/lockprocess.cc +++ b/kdesktop/lock/lockprocess.cc @@ -1,10 +1,10 @@ //=========================================================================== // -// This file is part of the KDE project +// This file is part of the TDE project // // Copyright (c) 1999 Martin R. Jones <mjones@kde.org> // Copyright (c) 2003 Oswald Buddenhagen <ossi@kde.org> -// Copyright (c) 2010-2013 Timothy Pearson <kb9vqf@pearsoncomputing.net> +// Copyright (c) 2010 - 2015 Timothy Pearson <kb9vqf@pearsoncomputing.net> // //kdesktop keeps running and checks user inactivity @@ -34,6 +34,7 @@ #include <tdeapplication.h> #include <kservicegroup.h> #include <kdebug.h> +#include <kuser.h> #include <tdemessagebox.h> #include <tdeglobalsettings.h> #include <tdelocale.h> @@ -112,6 +113,8 @@ Status DPMSInfo ( Display *, CARD16 *, BOOL * ); #include <GL/glx.h> #endif +#define KDESKTOP_DEBUG_ID 1204 + #define LOCK_GRACE_DEFAULT 5000 #define AUTOLOGOUT_DEFAULT 600 @@ -146,7 +149,7 @@ Atom kde_wm_transparent_to_black = 0; static void segv_handler(int) { - kdError(1204) << "A fatal exception was encountered." + kdError(KDESKTOP_DEBUG_ID) << "A fatal exception was encountered." << " Trapping and ignoring it so as not to compromise desktop security..." << kdBacktrace() << endl; sleep(1); @@ -185,118 +188,132 @@ mHackDelayStartupTimer->stop(); // starting screensaver hacks, and password entry. // LockProcess::LockProcess() - : TQWidget(0L, "saver window", ((WFlags)(WStyle_StaysOnTop|WStyle_Customize|WStyle_NoBorder))), - mOpenGLVisual(0), - mParent(0), - mShowLockDateTime(false), - mSuspended(false), - mVisibility(false), - mRestoreXF86Lock(false), - mForbidden(false), - mAutoLogout(false), - resizeTimer(NULL), - hackResumeTimer(NULL), - mVkbdProcess(NULL), - mKWinModule(NULL), - mPipeOpen(false), - mPipeOpen_out(false), - mInfoMessageDisplayed(false), - mDialogControlLock(false), - mForceReject(false), - currentDialog(NULL), - mEnsureScreenHiddenTimer(NULL), - mForceContinualLockDisplayTimer(NULL), - mEnsureVRootWindowSecurityTimer(NULL), - mHackDelayStartupTimer(NULL), - mHackDelayStartupTimeout(0), - mHackStartupEnabled(true), - mOverrideHackStartupEnabled(false), - mResizingDesktopLock(false), - mFullyOnlineSent(false), - mClosingWindows(false), - mInSecureDialog(false), - mHackActive(false), - m_rootPixmap(NULL), - mBackingStartupDelayTimer(0), - m_startupStatusDialog(NULL), - m_mouseDown(0), - m_mousePrevX(0), - m_mousePrevY(0), - m_dialogPrevX(0), - m_dialogPrevY(0), - m_notifyReadyRequested(false), - m_maskWidget(NULL), - m_saverRootWindow(0) + : TQWidget(0L, "saver window", ((WFlags)(WStyle_StaysOnTop|WStyle_Customize|WStyle_NoBorder))), + mOpenGLVisual(0), + mParent(0), + mShowLockDateTime(false), + mSuspended(false), + mVisibility(false), + mRestoreXF86Lock(false), + mForbidden(false), + mAutoLogout(false), + resizeTimer(NULL), + hackResumeTimer(NULL), + mVkbdProcess(NULL), + mKWinModule(NULL), + mPipeOpen(false), + mPipeOpen_out(false), + mInfoMessageDisplayed(false), + mDialogControlLock(false), + mForceReject(false), + currentDialog(NULL), + mEnsureScreenHiddenTimer(NULL), + mForceContinualLockDisplayTimer(NULL), + mEnsureVRootWindowSecurityTimer(NULL), + mHackDelayStartupTimer(NULL), + mHackDelayStartupTimeout(0), + mHackStartupEnabled(true), + mOverrideHackStartupEnabled(false), + mResizingDesktopLock(false), + mFullyOnlineSent(false), + mClosingWindows(false), + mInSecureDialog(false), + mHackActive(false), + m_rootPixmap(NULL), + mBackingStartupDelayTimer(0), + m_startupStatusDialog(NULL), + m_mouseDown(0), + m_mousePrevX(0), + m_mousePrevY(0), + m_dialogPrevX(0), + m_dialogPrevY(0), + m_notifyReadyRequested(false), + m_loginCardDevice(NULL), + m_maskWidget(NULL), + m_saverRootWindow(0) { #ifdef KEEP_MOUSE_UNGRABBED - setNFlags(WX11DisableMove|WX11DisableClose|WX11DisableShade|WX11DisableMinimize|WX11DisableMaximize); + setNFlags(WX11DisableMove|WX11DisableClose|WX11DisableShade|WX11DisableMinimize|WX11DisableMaximize); #endif - setupSignals(); - - // Set up atoms - kde_wm_system_modal_notification = XInternAtom(tqt_xdisplay(), "_TDE_WM_MODAL_SYS_NOTIFICATION", False); - kde_wm_transparent_to_desktop = XInternAtom(tqt_xdisplay(), "_TDE_TRANSPARENT_TO_DESKTOP", False); - kde_wm_transparent_to_black = XInternAtom(tqt_xdisplay(), "_TDE_TRANSPARENT_TO_BLACK", False); - - kapp->installX11EventFilter(this); - - mForceContinualLockDisplayTimer = new TQTimer( this ); - mHackDelayStartupTimer = new TQTimer( this ); - mEnsureVRootWindowSecurityTimer = new TQTimer( this ); - - if (!argb_visual) { - // Try to get the root pixmap - if (!m_rootPixmap) m_rootPixmap = new KRootPixmap(this); - connect(m_rootPixmap, TQT_SIGNAL(backgroundUpdated(const TQPixmap &)), this, TQT_SLOT(slotPaintBackground(const TQPixmap &))); - m_rootPixmap->setCustomPainting(true); - m_rootPixmap->start(); - } - - // Get root window attributes - XWindowAttributes rootAttr; - XGetWindowAttributes(tqt_xdisplay(), RootWindow(tqt_xdisplay(), tqt_xscreen()), &rootAttr); - { // trigger creation of QToolTipManager, it does XSelectInput() on the root window - TQWidget w; - TQToolTip::add( &w, "foo" ); - } - XSelectInput( tqt_xdisplay(), tqt_xrootwin(), SubstructureNotifyMask | rootAttr.your_event_mask ); - - // Add non-TDE path - TDEGlobal::dirs()->addResourceType("scrsav", - TDEGlobal::dirs()->kde_default("apps") + - "System/ScreenSavers/"); - - // Add KDE specific screensaver path - TQString relPath="System/ScreenSavers/"; - KServiceGroup::Ptr servGroup = KServiceGroup::baseGroup( "screensavers"); - if (servGroup) - { - relPath=servGroup->relPath(); - kdDebug(1204) << "relPath=" << relPath << endl; - } - TDEGlobal::dirs()->addResourceType("scrsav", - TDEGlobal::dirs()->kde_default("apps") + - relPath); - - // virtual root property - gXA_VROOT = XInternAtom (tqt_xdisplay(), "__SWM_VROOT", False); - gXA_SCREENSAVER_VERSION = XInternAtom (tqt_xdisplay(), "_SCREENSAVER_VERSION", False); - - TQStringList dmopt = - TQStringList::split(TQChar(','), - TQString::fromLatin1( ::getenv( "XDM_MANAGED" ))); - for (TQStringList::ConstIterator it = dmopt.begin(); it != dmopt.end(); ++it) - if ((*it).startsWith("method=")) - mMethod = (*it).mid(7); + setupSignals(); + + // Set up atoms + kde_wm_system_modal_notification = XInternAtom(tqt_xdisplay(), "_TDE_WM_MODAL_SYS_NOTIFICATION", False); + kde_wm_transparent_to_desktop = XInternAtom(tqt_xdisplay(), "_TDE_TRANSPARENT_TO_DESKTOP", False); + kde_wm_transparent_to_black = XInternAtom(tqt_xdisplay(), "_TDE_TRANSPARENT_TO_BLACK", False); + + kapp->installX11EventFilter(this); + + mForceContinualLockDisplayTimer = new TQTimer( this ); + mHackDelayStartupTimer = new TQTimer( this ); + mEnsureVRootWindowSecurityTimer = new TQTimer( this ); + + if (!argb_visual) { + // Try to get the root pixmap + if (!m_rootPixmap) m_rootPixmap = new KRootPixmap(this); + connect(m_rootPixmap, TQT_SIGNAL(backgroundUpdated(const TQPixmap &)), this, TQT_SLOT(slotPaintBackground(const TQPixmap &))); + m_rootPixmap->setCustomPainting(true); + m_rootPixmap->start(); + } + + // Get root window attributes + XWindowAttributes rootAttr; + XGetWindowAttributes(tqt_xdisplay(), RootWindow(tqt_xdisplay(), tqt_xscreen()), &rootAttr); + { // trigger creation of QToolTipManager, it does XSelectInput() on the root window + TQWidget w; + TQToolTip::add( &w, "foo" ); + } + XSelectInput( tqt_xdisplay(), tqt_xrootwin(), SubstructureNotifyMask | rootAttr.your_event_mask ); + + // Add non-TDE path + TDEGlobal::dirs()->addResourceType("scrsav", + TDEGlobal::dirs()->kde_default("apps") + + "System/ScreenSavers/"); + + // Add KDE specific screensaver path + TQString relPath="System/ScreenSavers/"; + KServiceGroup::Ptr servGroup = KServiceGroup::baseGroup( "screensavers"); + if (servGroup) { + relPath=servGroup->relPath(); + kdDebug(KDESKTOP_DEBUG_ID) << "relPath=" << relPath << endl; + } + TDEGlobal::dirs()->addResourceType("scrsav", + TDEGlobal::dirs()->kde_default("apps") + + relPath); + + // virtual root property + gXA_VROOT = XInternAtom (tqt_xdisplay(), "__SWM_VROOT", False); + gXA_SCREENSAVER_VERSION = XInternAtom (tqt_xdisplay(), "_SCREENSAVER_VERSION", False); + + TQStringList dmopt = TQStringList::split(TQChar(','), + TQString::fromLatin1( ::getenv( "XDM_MANAGED" ))); + for (TQStringList::ConstIterator it = dmopt.begin(); it != dmopt.end(); ++it) { + if ((*it).startsWith("method=")) { + mMethod = (*it).mid(7); + } + } + + // Initialize SmartCard readers + TDEGenericDevice *hwdevice; + TDEHardwareDevices *hwdevices = TDEGlobal::hardwareDevices(); + TDEGenericHardwareList cardReaderList = hwdevices->listByDeviceClass(TDEGenericDeviceType::CryptographicCard); + for (hwdevice = cardReaderList.first(); hwdevice; hwdevice = cardReaderList.next()) { + TDECryptographicCardDevice* cdevice = static_cast<TDECryptographicCardDevice*>(hwdevice); + // connect(cdevice, SIGNAL(pinRequested(TQString,TDECryptographicCardDevice*)), this, SLOT(cryptographicCardPinRequested(TQString,TDECryptographicCardDevice*))); + connect(cdevice, TQT_SIGNAL(certificateListAvailable(TDECryptographicCardDevice*)), this, TQT_SLOT(cryptographicCardInserted(TDECryptographicCardDevice*))); + connect(cdevice, TQT_SIGNAL(cardRemoved(TDECryptographicCardDevice*)), this, TQT_SLOT(cryptographicCardRemoved(TDECryptographicCardDevice*))); + cdevice->enableCardMonitoring(true); + // cdevice->enablePINEntryCallbacks(true); + } #ifdef KEEP_MOUSE_UNGRABBED - setEnabled(false); + setEnabled(false); #endif - greetPlugin.library = 0; + greetPlugin.library = 0; - TDECrash::setCrashHandler(segv_handler); + TDECrash::setCrashHandler(segv_handler); } //--------------------------------------------------------------------------- @@ -305,49 +322,49 @@ LockProcess::LockProcess() // LockProcess::~LockProcess() { - mControlPipeHandler->terminateThread(); - mControlPipeHandlerThread->wait(); - delete mControlPipeHandler; -// delete mControlPipeHandlerThread; - - if (resizeTimer != NULL) { - resizeTimer->stop(); - delete resizeTimer; - } - if (hackResumeTimer != NULL) { - hackResumeTimer->stop(); - delete hackResumeTimer; - } - if (mEnsureScreenHiddenTimer != NULL) { - mEnsureScreenHiddenTimer->stop(); - delete mEnsureScreenHiddenTimer; - } - if (mForceContinualLockDisplayTimer != NULL) { - mForceContinualLockDisplayTimer->stop(); - delete mForceContinualLockDisplayTimer; - } - if (mHackDelayStartupTimer != NULL) { - mHackDelayStartupTimer->stop(); - delete mHackDelayStartupTimer; - } - if (mEnsureVRootWindowSecurityTimer != NULL) { - mEnsureVRootWindowSecurityTimer->stop(); - delete mEnsureVRootWindowSecurityTimer; - } - - if (greetPlugin.library) { - if (greetPlugin.info->done) - greetPlugin.info->done(); - greetPlugin.library->unload(); - } - - if (m_rootPixmap) { - m_rootPixmap->stop(); - delete m_rootPixmap; - } - - mPipeOpen = false; - mPipeOpen_out = false; + mControlPipeHandler->terminateThread(); + mControlPipeHandlerThread->wait(); + delete mControlPipeHandler; +// delete mControlPipeHandlerThread; + + if (resizeTimer != NULL) { + resizeTimer->stop(); + delete resizeTimer; + } + if (hackResumeTimer != NULL) { + hackResumeTimer->stop(); + delete hackResumeTimer; + } + if (mEnsureScreenHiddenTimer != NULL) { + mEnsureScreenHiddenTimer->stop(); + delete mEnsureScreenHiddenTimer; + } + if (mForceContinualLockDisplayTimer != NULL) { + mForceContinualLockDisplayTimer->stop(); + delete mForceContinualLockDisplayTimer; + } + if (mHackDelayStartupTimer != NULL) { + mHackDelayStartupTimer->stop(); + delete mHackDelayStartupTimer; + } + if (mEnsureVRootWindowSecurityTimer != NULL) { + mEnsureVRootWindowSecurityTimer->stop(); + delete mEnsureVRootWindowSecurityTimer; + } + + if (greetPlugin.library) { + if (greetPlugin.info->done) + greetPlugin.info->done(); + greetPlugin.library->unload(); + } + + if (m_rootPixmap) { + m_rootPixmap->stop(); + delete m_rootPixmap; + } + + mPipeOpen = false; + mPipeOpen_out = false; } //--------------------------------------------------------------------------- @@ -357,118 +374,117 @@ LockProcess::~LockProcess() // void LockProcess::init(bool child, bool useBlankOnly) { - // Get root window size - XWindowAttributes rootAttr; - XGetWindowAttributes(tqt_xdisplay(), RootWindow(tqt_xdisplay(), tqt_xscreen()), &rootAttr); - mRootWidth = rootAttr.width; - mRootHeight = rootAttr.height; - generateBackingImages(); - - // Connect all signals - connect( mForceContinualLockDisplayTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(displayLockDialogIfNeeded()) ); - connect( mHackDelayStartupTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(closeDialogAndStartHack()) ); - connect( mEnsureVRootWindowSecurityTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(repaintRootWindowIfNeeded()) ); - connect(tqApp, TQT_SIGNAL(mouseInteraction(XEvent *)), TQT_SLOT(slotMouseActivity(XEvent *))); - connect(&mHackProc, TQT_SIGNAL(processExited(TDEProcess *)), TQT_SLOT(hackExited(TDEProcess *))); - connect(&mSuspendTimer, TQT_SIGNAL(timeout()), TQT_SLOT(suspend())); + // Get root window size + XWindowAttributes rootAttr; + XGetWindowAttributes(tqt_xdisplay(), RootWindow(tqt_xdisplay(), tqt_xscreen()), &rootAttr); + mRootWidth = rootAttr.width; + mRootHeight = rootAttr.height; + generateBackingImages(); + + // Connect all signals + connect( mForceContinualLockDisplayTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(displayLockDialogIfNeeded()) ); + connect( mHackDelayStartupTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(closeDialogAndStartHack()) ); + connect( mEnsureVRootWindowSecurityTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(repaintRootWindowIfNeeded()) ); + connect(tqApp, TQT_SIGNAL(mouseInteraction(XEvent *)), TQT_SLOT(slotMouseActivity(XEvent *))); + connect(&mHackProc, TQT_SIGNAL(processExited(TDEProcess *)), TQT_SLOT(hackExited(TDEProcess *))); + connect(&mSuspendTimer, TQT_SIGNAL(timeout()), TQT_SLOT(suspend())); #ifdef HAVE_DPMS - //if the user decided that the screensaver should run independent from - //dpms, we shouldn't check for it, aleXXX - if (KDesktopSettings::dpmsDependent()) { - BOOL on; - CARD16 state; - if (DPMSInfo(tqt_xdisplay(), &state, &on)) { - if (on) { - connect(&mCheckDPMS, TQT_SIGNAL(timeout()), TQT_SLOT(checkDPMSActive())); - // we can save CPU if we stop it as quickly as possible - // but we waste CPU if we check too often -> so take 10s - mCheckDPMS.start(10000); - } - } - } + //if the user decided that the screensaver should run independent from + //dpms, we shouldn't check for it, aleXXX + if (KDesktopSettings::dpmsDependent()) { + BOOL on; + CARD16 state; + if (DPMSInfo(tqt_xdisplay(), &state, &on)) { + if (on) { + connect(&mCheckDPMS, TQT_SIGNAL(timeout()), TQT_SLOT(checkDPMSActive())); + // we can save CPU if we stop it as quickly as possible + // but we waste CPU if we check too often -> so take 10s + mCheckDPMS.start(10000); + } + } + } #endif #if (TQT_VERSION-0 >= 0x030200) // XRANDR support - connect( kapp->desktop(), TQT_SIGNAL( resized( int )), TQT_SLOT( desktopResized())); + connect( kapp->desktop(), TQT_SIGNAL( resized( int )), TQT_SLOT( desktopResized())); #endif - if (!trinity_desktop_lock_use_system_modal_dialogs) { - setWFlags((WFlags)WX11BypassWM); - } + if (!trinity_desktop_lock_use_system_modal_dialogs) { + setWFlags((WFlags)WX11BypassWM); + } - child_saver = child; - mUseBlankOnly = useBlankOnly; + child_saver = child; + mUseBlankOnly = useBlankOnly; - mShowLockDateTime = KDesktopSettings::showLockDateTime(); - mlockDateTime = TQDateTime::currentDateTime(); + mShowLockDateTime = KDesktopSettings::showLockDateTime(); + mlockDateTime = TQDateTime::currentDateTime(); - mHackDelayStartupTimeout = trinity_desktop_lock_delay_screensaver_start?KDesktopSettings::timeout()*1000:10*1000; - mHackStartupEnabled = trinity_desktop_lock_use_system_modal_dialogs?KDesktopSettings::screenSaverEnabled():true; + mHackDelayStartupTimeout = trinity_desktop_lock_delay_screensaver_start?KDesktopSettings::timeout()*1000:10*1000; + mHackStartupEnabled = trinity_desktop_lock_use_system_modal_dialogs?KDesktopSettings::screenSaverEnabled():true; - configure(); + configure(); - mControlPipeHandlerThread = new TQEventLoopThread(); - mControlPipeHandler = new ControlPipeHandlerObject(); - mControlPipeHandler->mParent = this; - mControlPipeHandler->moveToThread(mControlPipeHandlerThread); - TQObject::connect(mControlPipeHandler, SIGNAL(processCommand(TQString)), this, SLOT(processInputPipeCommand(TQString))); - TQTimer::singleShot(0, mControlPipeHandler, SLOT(run())); - mControlPipeHandlerThread->start(); + mControlPipeHandlerThread = new TQEventLoopThread(); + mControlPipeHandler = new ControlPipeHandlerObject(); + mControlPipeHandler->mParent = this; + mControlPipeHandler->moveToThread(mControlPipeHandlerThread); + TQObject::connect(mControlPipeHandler, SIGNAL(processCommand(TQString)), this, SLOT(processInputPipeCommand(TQString))); + TQTimer::singleShot(0, mControlPipeHandler, SLOT(run())); + mControlPipeHandlerThread->start(); } static int signal_pipe[2]; static void sigterm_handler(int) { - if ((!trinity_desktop_lock_process) || (!trinity_desktop_lock_process->inSecureDialog())) { - // Exit uncleanly - char tmp = 'U'; - if (::write( signal_pipe[1], &tmp, 1) == -1) { - // Error handler to shut up gcc warnings - } - } + if ((!trinity_desktop_lock_process) || (!trinity_desktop_lock_process->inSecureDialog())) { + // Exit uncleanly + char tmp = 'U'; + if (::write( signal_pipe[1], &tmp, 1) == -1) { + // Error handler to shut up gcc warnings + } + } } static void sighup_handler(int) { - char tmp = 'H'; - if (::write( signal_pipe[1], &tmp, 1) == -1) { - // Error handler to shut up gcc warnings - } + char tmp = 'H'; + if (::write( signal_pipe[1], &tmp, 1) == -1) { + // Error handler to shut up gcc warnings + } } bool LockProcess::closeCurrentWindow() { - mClosingWindows = TRUE; - if (currentDialog != NULL) { - mForceReject = true; - if (dynamic_cast<SAKDlg*>(currentDialog)) { - dynamic_cast<SAKDlg*>(currentDialog)->closeDialogForced(); - } - else if (dynamic_cast<SecureDlg*>(currentDialog)) { - dynamic_cast<SecureDlg*>(currentDialog)->closeDialogForced(); - } - else { - currentDialog->close(); - } - } - - if( mDialogs.isEmpty() ) { - mClosingWindows = FALSE; - mForceReject = false; - return false; - } - else { - mClosingWindows = TRUE; - return true; - } + mClosingWindows = TRUE; + if (currentDialog != NULL) { + mForceReject = true; + if (dynamic_cast<SAKDlg*>(currentDialog)) { + dynamic_cast<SAKDlg*>(currentDialog)->closeDialogForced(); + } + else if (dynamic_cast<SecureDlg*>(currentDialog)) { + dynamic_cast<SecureDlg*>(currentDialog)->closeDialogForced(); + } + else { + currentDialog->close(); + } + } + + if( mDialogs.isEmpty() ) { + mClosingWindows = FALSE; + mForceReject = false; + return false; + } + else { + mClosingWindows = TRUE; + return true; + } } void LockProcess::timerEvent(TQTimerEvent *ev) { - if (mAutoLogout && ev->timerId() == mAutoLogoutTimerId) - { + if (mAutoLogout && ev->timerId() == mAutoLogoutTimerId) { killTimer(mAutoLogoutTimerId); AutoLogout autologout(this); execDialog(&autologout); @@ -482,58 +498,58 @@ void LockProcess::resizeEvent(TQResizeEvent *) void LockProcess::setupSignals() { - struct sigaction act; - // ignore SIGINT - act.sa_handler=SIG_IGN; - sigemptyset(&(act.sa_mask)); - sigaddset(&(act.sa_mask), SIGINT); - act.sa_flags = 0; - sigaction(SIGINT, &act, 0L); - // ignore SIGQUIT - act.sa_handler=SIG_IGN; - sigemptyset(&(act.sa_mask)); - sigaddset(&(act.sa_mask), SIGQUIT); - act.sa_flags = 0; - sigaction(SIGQUIT, &act, 0L); - // exit uncleanly on SIGTERM - act.sa_handler= sigterm_handler; - sigemptyset(&(act.sa_mask)); - sigaddset(&(act.sa_mask), SIGTERM); - act.sa_flags = 0; - sigaction(SIGTERM, &act, 0L); - // SIGHUP forces lock - act.sa_handler= sighup_handler; - sigemptyset(&(act.sa_mask)); - sigaddset(&(act.sa_mask), SIGHUP); - act.sa_flags = 0; - sigaction(SIGHUP, &act, 0L); - - if (pipe(signal_pipe) == -1) { - // Error handler to shut up gcc warnings - } - TQSocketNotifier* notif = new TQSocketNotifier(signal_pipe[0], TQSocketNotifier::Read, TQT_TQOBJECT(this) ); - connect( notif, TQT_SIGNAL(activated(int)), TQT_SLOT(signalPipeSignal())); + struct sigaction act; + // ignore SIGINT + act.sa_handler=SIG_IGN; + sigemptyset(&(act.sa_mask)); + sigaddset(&(act.sa_mask), SIGINT); + act.sa_flags = 0; + sigaction(SIGINT, &act, 0L); + // ignore SIGQUIT + act.sa_handler=SIG_IGN; + sigemptyset(&(act.sa_mask)); + sigaddset(&(act.sa_mask), SIGQUIT); + act.sa_flags = 0; + sigaction(SIGQUIT, &act, 0L); + // exit uncleanly on SIGTERM + act.sa_handler= sigterm_handler; + sigemptyset(&(act.sa_mask)); + sigaddset(&(act.sa_mask), SIGTERM); + act.sa_flags = 0; + sigaction(SIGTERM, &act, 0L); + // SIGHUP forces lock + act.sa_handler= sighup_handler; + sigemptyset(&(act.sa_mask)); + sigaddset(&(act.sa_mask), SIGHUP); + act.sa_flags = 0; + sigaction(SIGHUP, &act, 0L); + + if (pipe(signal_pipe) == -1) { + // Error handler to shut up gcc warnings + } + TQSocketNotifier* notif = new TQSocketNotifier(signal_pipe[0], TQSocketNotifier::Read, TQT_TQOBJECT(this) ); + connect( notif, TQT_SIGNAL(activated(int)), TQT_SLOT(signalPipeSignal())); } void LockProcess::signalPipeSignal() { - char tmp; - if (::read( signal_pipe[0], &tmp, 1) == -1) { - // Error handler to shut up gcc warnings - } - if( tmp == 'T' ) { - quitSaver(); - } - else if( tmp == 'H' ) { - if( !mLocked ) - startLock(); - } - else if( tmp == 'U' ) { - // Exit uncleanly - quitSaver(); - exit(1); - } + char tmp; + if (::read( signal_pipe[0], &tmp, 1) == -1) { + // Error handler to shut up gcc warnings + } + if( tmp == 'T' ) { + quitSaver(); + } + else if( tmp == 'H' ) { + if( !mLocked ) + startLock(); + } + else if( tmp == 'U' ) { + // Exit uncleanly + quitSaver(); + exit(1); + } } //--------------------------------------------------------------------------- @@ -554,8 +570,7 @@ bool LockProcess::lock() // the screensaver kicks in because the user moved the mouse after // selecting "lock screen", that looks really untidy. mBusy = true; - if (startLock()) - { + if (startLock()) { TQTimer::singleShot(1000, this, TQT_SLOT(slotDeadTimePassed())); return true; } @@ -567,39 +582,40 @@ bool LockProcess::lock() //--------------------------------------------------------------------------- void LockProcess::slotDeadTimePassed() { - mBusy = false; + mBusy = false; } //--------------------------------------------------------------------------- bool LockProcess::defaultSave() { - mLocked = false; - mOverrideHackStartupEnabled = true; - if (startSaver()) { - if (mLockGrace >= 0) - TQTimer::singleShot(mLockGrace, this, TQT_SLOT(startLock())); - return true; - } - return false; + mLocked = false; + mOverrideHackStartupEnabled = true; + if (startSaver()) { + if (mLockGrace >= 0) { + TQTimer::singleShot(mLockGrace, this, TQT_SLOT(startLock())); + } + return true; + } + return false; } //--------------------------------------------------------------------------- bool LockProcess::dontLock() { - mLocked = false; - return startSaver(); + mLocked = false; + return startSaver(); } //--------------------------------------------------------------------------- void LockProcess::quitSaver() { - DISABLE_CONTINUOUS_LOCKDLG_DISPLAY - if (closeCurrentWindow()) { - TQTimer::singleShot( 0, this, SLOT(quitSaver()) ); - return; - } - stopSaver(); - kapp->quit(); + DISABLE_CONTINUOUS_LOCKDLG_DISPLAY + if (closeCurrentWindow()) { + TQTimer::singleShot( 0, this, SLOT(quitSaver()) ); + return; + } + stopSaver(); + kapp->quit(); } //--------------------------------------------------------------------------- @@ -724,47 +740,45 @@ bool LockProcess::inSecureDialog() // void LockProcess::configure() { - // the configuration is stored in kdesktop's config file - if( KDesktopSettings::lock() ) - { - mLockGrace = KDesktopSettings::lockGrace(); - if (mLockGrace < 0) - mLockGrace = 0; - else if (mLockGrace > 300000) - mLockGrace = 300000; // 5 minutes, keep the value sane - } - else - mLockGrace = -1; - - if ( KDesktopSettings::autoLogout() ) - { - mAutoLogout = true; - mAutoLogoutTimeout = KDesktopSettings::autoLogoutTimeout(); - mAutoLogoutTimerId = startTimer(mAutoLogoutTimeout * 1000); // in milliseconds - } - - mPriority = KDesktopSettings::priority(); - if (mPriority < 0) mPriority = 0; - if (mPriority > 19) mPriority = 19; - - mSaver = KDesktopSettings::saver(); - if (mSaver.isEmpty() || mUseBlankOnly) { - mSaver = "KBlankscreen.desktop"; - } - if (!trinity_desktop_lock_use_system_modal_dialogs) { - if (KDesktopSettings::screenSaverEnabled() == false) { - mSaver = ""; - mSaverExec = ""; - } - } - - readSaver(); - - mPlugins = KDesktopSettings::pluginsUnlock(); - if (mPlugins.isEmpty()) { - mPlugins = TQStringList("classic"); - } - mPluginOptions = KDesktopSettings::pluginOptions(); + // the configuration is stored in kdesktop's config file + if( KDesktopSettings::lock() ) { + mLockGrace = KDesktopSettings::lockGrace(); + if (mLockGrace < 0) + mLockGrace = 0; + else if (mLockGrace > 300000) + mLockGrace = 300000; // 5 minutes, keep the value sane + } + else + mLockGrace = -1; + + if ( KDesktopSettings::autoLogout() ) { + mAutoLogout = true; + mAutoLogoutTimeout = KDesktopSettings::autoLogoutTimeout(); + mAutoLogoutTimerId = startTimer(mAutoLogoutTimeout * 1000); // in milliseconds + } + + mPriority = KDesktopSettings::priority(); + if (mPriority < 0) mPriority = 0; + if (mPriority > 19) mPriority = 19; + + mSaver = KDesktopSettings::saver(); + if (mSaver.isEmpty() || mUseBlankOnly) { + mSaver = "KBlankscreen.desktop"; + } + if (!trinity_desktop_lock_use_system_modal_dialogs) { + if (KDesktopSettings::screenSaverEnabled() == false) { + mSaver = ""; + mSaverExec = ""; + } + } + + readSaver(); + + mPlugins = KDesktopSettings::pluginsUnlock(); + if (mPlugins.isEmpty()) { + mPlugins = TQStringList("classic"); + } + mPluginOptions = KDesktopSettings::pluginOptions(); } //--------------------------------------------------------------------------- @@ -773,53 +787,45 @@ void LockProcess::configure() // void LockProcess::readSaver() { - if (!mSaver.isEmpty()) - { - TQString file = locate("scrsav", mSaver); - - bool opengl = kapp->authorize("opengl_screensavers"); - bool manipulatescreen = kapp->authorize("manipulatescreen_screensavers"); - KDesktopFile config(file, true); - if (config.readEntry("X-TDE-Type").utf8() != 0) - { - TQString saverType = config.readEntry("X-TDE-Type").utf8(); - TQStringList saverTypes = TQStringList::split(";", saverType); - for (uint i = 0; i < saverTypes.count(); i++) - { - if ((saverTypes[i] == "ManipulateScreen") && !manipulatescreen) - { - kdDebug(1204) << "Screensaver is type ManipulateScreen and ManipulateScreen is forbidden" << endl; - mForbidden = true; + if (!mSaver.isEmpty()) { + TQString file = locate("scrsav", mSaver); + + bool opengl = kapp->authorize("opengl_screensavers"); + bool manipulatescreen = kapp->authorize("manipulatescreen_screensavers"); + KDesktopFile config(file, true); + if (config.readEntry("X-TDE-Type").utf8() != 0) { + TQString saverType = config.readEntry("X-TDE-Type").utf8(); + TQStringList saverTypes = TQStringList::split(";", saverType); + for (uint i = 0; i < saverTypes.count(); i++) { + if ((saverTypes[i] == "ManipulateScreen") && !manipulatescreen) { + kdDebug(KDESKTOP_DEBUG_ID) << "Screensaver is type ManipulateScreen and ManipulateScreen is forbidden" << endl; + mForbidden = true; + } + if ((saverTypes[i] == "OpenGL") && !opengl) { + kdDebug(KDESKTOP_DEBUG_ID) << "Screensaver is type OpenGL and OpenGL is forbidden" << endl; + mForbidden = true; + } + if (saverTypes[i] == "OpenGL") { + mOpenGLVisual = true; + } } - if ((saverTypes[i] == "OpenGL") && !opengl) - { - kdDebug(1204) << "Screensaver is type OpenGL and OpenGL is forbidden" << endl; - mForbidden = true; + } + + kdDebug(KDESKTOP_DEBUG_ID) << "mForbidden: " << (mForbidden ? "true" : "false") << endl; + + if (trinity_desktop_lock_use_system_modal_dialogs) { + if (config.hasActionGroup("InWindow")) { + config.setActionGroup("InWindow"); + mSaverExec = config.readPathEntry("Exec"); } - if (saverTypes[i] == "OpenGL") - { - mOpenGLVisual = true; + } + else { + if (config.hasActionGroup("Root")) { + config.setActionGroup("Root"); + mSaverExec = config.readPathEntry("Exec"); } } } - - kdDebug(1204) << "mForbidden: " << (mForbidden ? "true" : "false") << endl; - - if (trinity_desktop_lock_use_system_modal_dialogs) { - if (config.hasActionGroup("InWindow")) - { - config.setActionGroup("InWindow"); - mSaverExec = config.readPathEntry("Exec"); - } - } - else { - if (config.hasActionGroup("Root")) - { - config.setActionGroup("Root"); - mSaverExec = config.readPathEntry("Exec"); - } - } - } } //--------------------------------------------------------------------------- @@ -828,229 +834,226 @@ void LockProcess::readSaver() // void LockProcess::createSaverWindow() { - Visual* visual = CopyFromParent; - XSetWindowAttributes attrs; - XVisualInfo* info = NULL; - int flags = trinity_desktop_lock_use_system_modal_dialogs?0:CWOverrideRedirect; + Visual* visual = CopyFromParent; + XSetWindowAttributes attrs; + XVisualInfo* info = NULL; + int flags = trinity_desktop_lock_use_system_modal_dialogs?0:CWOverrideRedirect; #ifdef HAVE_GLXCHOOSEVISUAL - if( mOpenGLVisual ) - { - static int attribs[][ 15 ] = - { - #define R GLX_RED_SIZE - #define G GLX_GREEN_SIZE - #define B GLX_BLUE_SIZE - { GLX_RGBA, R, 8, G, 8, B, 8, GLX_DEPTH_SIZE, 8, GLX_DOUBLEBUFFER, GLX_STENCIL_SIZE, 1, None }, - { GLX_RGBA, R, 4, G, 4, B, 4, GLX_DEPTH_SIZE, 4, GLX_DOUBLEBUFFER, GLX_STENCIL_SIZE, 1, None }, - { GLX_RGBA, R, 8, G, 8, B, 8, GLX_DEPTH_SIZE, 8, GLX_DOUBLEBUFFER, None }, - { GLX_RGBA, R, 4, G, 4, B, 4, GLX_DEPTH_SIZE, 4, GLX_DOUBLEBUFFER, None }, - { GLX_RGBA, R, 8, G, 8, B, 8, GLX_DEPTH_SIZE, 8, GLX_STENCIL_SIZE, 1, None }, - { GLX_RGBA, R, 4, G, 4, B, 4, GLX_DEPTH_SIZE, 4, GLX_STENCIL_SIZE, 1, None }, - { GLX_RGBA, R, 8, G, 8, B, 8, GLX_DEPTH_SIZE, 8, None }, - { GLX_RGBA, R, 4, G, 4, B, 4, GLX_DEPTH_SIZE, 4, None }, - { GLX_RGBA, GLX_DEPTH_SIZE, 8, GLX_DOUBLEBUFFER, GLX_STENCIL_SIZE, 1, None }, - { GLX_RGBA, GLX_DEPTH_SIZE, 8, GLX_DOUBLEBUFFER, None }, - { GLX_RGBA, GLX_DEPTH_SIZE, 8, GLX_STENCIL_SIZE, 1, None }, - { GLX_RGBA, GLX_DEPTH_SIZE, 8, None } - #undef R - #undef G - #undef B - }; - for( unsigned int i = 0; i < sizeof( attribs ) / sizeof( attribs[ 0 ] ); ++i ) { - int n_glxfb_configs; - GLXFBConfig *fbc = glXChooseFBConfig( x11Display(), x11Screen(), attribs[ i ], &n_glxfb_configs); - if (!fbc) { - n_glxfb_configs = 0; - } - for( int j = 0; j < n_glxfb_configs; j++ ) { - info = glXGetVisualFromFBConfig(x11Display(), fbc[j]); - if( info ) { - if (argb_visual) { - if (info->depth < 32) { - XFree( info ); - info = NULL; - continue; - } - } - visual = info->visual; - static Colormap colormap = 0; - if( colormap != 0 ) { - XFreeColormap( x11Display(), colormap ); - } - colormap = XCreateColormap( x11Display(), RootWindow( x11Display(), x11Screen()), visual, AllocNone ); - attrs.colormap = colormap; - flags |= CWColormap; - break; - } - } - if (flags & CWColormap) { - break; - } - } - if ( !info ) - { - printf("[WARNING] Unable to locate matching X11 GLX Visual; this OpenGL application may not function correctly!\n"); - } - } + if( mOpenGLVisual ) { + static int attribs[][ 15 ] = { + #define R GLX_RED_SIZE + #define G GLX_GREEN_SIZE + #define B GLX_BLUE_SIZE + { GLX_RGBA, R, 8, G, 8, B, 8, GLX_DEPTH_SIZE, 8, GLX_DOUBLEBUFFER, GLX_STENCIL_SIZE, 1, None }, + { GLX_RGBA, R, 4, G, 4, B, 4, GLX_DEPTH_SIZE, 4, GLX_DOUBLEBUFFER, GLX_STENCIL_SIZE, 1, None }, + { GLX_RGBA, R, 8, G, 8, B, 8, GLX_DEPTH_SIZE, 8, GLX_DOUBLEBUFFER, None }, + { GLX_RGBA, R, 4, G, 4, B, 4, GLX_DEPTH_SIZE, 4, GLX_DOUBLEBUFFER, None }, + { GLX_RGBA, R, 8, G, 8, B, 8, GLX_DEPTH_SIZE, 8, GLX_STENCIL_SIZE, 1, None }, + { GLX_RGBA, R, 4, G, 4, B, 4, GLX_DEPTH_SIZE, 4, GLX_STENCIL_SIZE, 1, None }, + { GLX_RGBA, R, 8, G, 8, B, 8, GLX_DEPTH_SIZE, 8, None }, + { GLX_RGBA, R, 4, G, 4, B, 4, GLX_DEPTH_SIZE, 4, None }, + { GLX_RGBA, GLX_DEPTH_SIZE, 8, GLX_DOUBLEBUFFER, GLX_STENCIL_SIZE, 1, None }, + { GLX_RGBA, GLX_DEPTH_SIZE, 8, GLX_DOUBLEBUFFER, None }, + { GLX_RGBA, GLX_DEPTH_SIZE, 8, GLX_STENCIL_SIZE, 1, None }, + { GLX_RGBA, GLX_DEPTH_SIZE, 8, None } + #undef R + #undef G + #undef B + }; + for( unsigned int i = 0; i < sizeof( attribs ) / sizeof( attribs[ 0 ] ); ++i ) { + int n_glxfb_configs; + GLXFBConfig *fbc = glXChooseFBConfig( x11Display(), x11Screen(), attribs[ i ], &n_glxfb_configs); + if (!fbc) { + n_glxfb_configs = 0; + } + for( int j = 0; j < n_glxfb_configs; j++ ) { + info = glXGetVisualFromFBConfig(x11Display(), fbc[j]); + if( info ) { + if (argb_visual) { + if (info->depth < 32) { + XFree( info ); + info = NULL; + continue; + } + } + visual = info->visual; + static Colormap colormap = 0; + if( colormap != 0 ) { + XFreeColormap( x11Display(), colormap ); + } + colormap = XCreateColormap( x11Display(), RootWindow( x11Display(), x11Screen()), visual, AllocNone ); + attrs.colormap = colormap; + flags |= CWColormap; + break; + } + } + if (flags & CWColormap) { + break; + } + } + if ( !info ) { + printf("[WARNING] Unable to locate matching X11 GLX Visual; this OpenGL application may not function correctly!\n"); + } + } #endif - attrs.override_redirect = 1; - hide(); - - if (argb_visual) { - // The GL visual selection can return a visual with invalid depth - // Check for this and use a fallback visual if needed - if (info && (info->depth < 32)) { - printf("[WARNING] Unable to locate matching X11 GLX Visual; this OpenGL application may not function correctly!\n"); - XFree( info ); - info = NULL; - flags &= ~CWColormap; - } - - attrs.background_pixel = 0; - attrs.border_pixel = 0; - flags |= CWBackPixel; - flags |= CWBorderPixel; - if (!(flags & CWColormap)) { - if (!info) { - info = new XVisualInfo; - if (!XMatchVisualInfo( x11Display(), x11Screen(), 32, TrueColor, info )) { - printf("[ERROR] Unable to locate matching X11 Visual; this application will not function correctly!\n"); - free(info); - info = NULL; - } - } - if (info) { - visual = info->visual; - attrs.colormap = XCreateColormap( x11Display(), RootWindow( x11Display(), x11Screen()), visual, AllocNone ); - flags |= CWColormap; - } - } - } - if (info) { - XFree( info ); - } - - m_saverRootWindow = XCreateWindow( x11Display(), RootWindow( x11Display(), x11Screen()), x(), y(), width(), height(), 0, x11Depth(), InputOutput, visual, flags, &attrs ); - create( m_saverRootWindow ); - - // Some xscreensaver hacks check for this property - const char *version = "KDE 2.0"; - XChangeProperty (tqt_xdisplay(), winId(), - gXA_SCREENSAVER_VERSION, XA_STRING, 8, PropModeReplace, - (unsigned char *) version, strlen(version)); - - XSetWindowAttributes attr; - attr.event_mask = KeyPressMask | ButtonPressMask | PointerMotionMask | VisibilityChangeMask | ExposureMask; - XChangeWindowAttributes(tqt_xdisplay(), winId(), CWEventMask, &attr); - - // Signal that we want to be transparent to the desktop, not to windows behind us... - XChangeProperty(tqt_xdisplay(), m_saverRootWindow, kde_wm_transparent_to_desktop, XA_INTEGER, 32, PropModeReplace, (unsigned char *) "TRUE", 1L); - - // erase(); - - // set NoBackground so that the saver can capture the current - // screen state if necessary - // this is a security risk and has been deactivated--welcome to the 21st century folks! - // setBackgroundMode(TQWidget::NoBackground); - - setGeometry(0, 0, mRootWidth, mRootHeight); - saverReadyIfNeeded(); - - // HACK - // Hide all tooltips and notification windows - { - Window rootWindow = RootWindow(x11Display(), x11Screen()); - Window parent; - Window* children = NULL; - unsigned int noOfChildren = 0; - XWindowAttributes childAttr; - Window childTransient; - - if (XQueryTree(x11Display(), rootWindow, &rootWindow, &parent, &children, &noOfChildren) && noOfChildren>0 ) { - for (unsigned int i=0; i<noOfChildren; i++) { - if (XGetWindowAttributes(x11Display(), children[i], &childAttr) && XGetTransientForHint(x11Display(), children[i], &childTransient)) { - if ((childAttr.map_state == IsViewable) && (childAttr.override_redirect) && (childTransient)) { - if (!trinity_desktop_lock_hidden_window_list.contains(children[i])) { - trinity_desktop_lock_hidden_window_list.append(children[i]); - } - XLowerWindow(x11Display(), children[i]); - XFlush(x11Display()); - } - } - } - } - } + attrs.override_redirect = 1; + hide(); + + if (argb_visual) { + // The GL visual selection can return a visual with invalid depth + // Check for this and use a fallback visual if needed + if (info && (info->depth < 32)) { + printf("[WARNING] Unable to locate matching X11 GLX Visual; this OpenGL application may not function correctly!\n"); + XFree( info ); + info = NULL; + flags &= ~CWColormap; + } + + attrs.background_pixel = 0; + attrs.border_pixel = 0; + flags |= CWBackPixel; + flags |= CWBorderPixel; + if (!(flags & CWColormap)) { + if (!info) { + info = new XVisualInfo; + if (!XMatchVisualInfo( x11Display(), x11Screen(), 32, TrueColor, info )) { + printf("[ERROR] Unable to locate matching X11 Visual; this application will not function correctly!\n"); + free(info); + info = NULL; + } + } + if (info) { + visual = info->visual; + attrs.colormap = XCreateColormap( x11Display(), RootWindow( x11Display(), x11Screen()), visual, AllocNone ); + flags |= CWColormap; + } + } + } + if (info) { + XFree( info ); + } + + m_saverRootWindow = XCreateWindow( x11Display(), RootWindow( x11Display(), x11Screen()), x(), y(), width(), height(), 0, x11Depth(), InputOutput, visual, flags, &attrs ); + create( m_saverRootWindow ); + + // Some xscreensaver hacks check for this property + const char *version = "KDE 2.0"; + XChangeProperty (tqt_xdisplay(), winId(), + gXA_SCREENSAVER_VERSION, XA_STRING, 8, PropModeReplace, + (unsigned char *) version, strlen(version)); + + XSetWindowAttributes attr; + attr.event_mask = KeyPressMask | ButtonPressMask | PointerMotionMask | VisibilityChangeMask | ExposureMask; + XChangeWindowAttributes(tqt_xdisplay(), winId(), CWEventMask, &attr); + + // Signal that we want to be transparent to the desktop, not to windows behind us... + XChangeProperty(tqt_xdisplay(), m_saverRootWindow, kde_wm_transparent_to_desktop, XA_INTEGER, 32, PropModeReplace, (unsigned char *) "TRUE", 1L); + + // erase(); - kdDebug(1204) << "Saver window Id: " << winId() << endl; + // set NoBackground so that the saver can capture the current + // screen state if necessary + // this is a security risk and has been deactivated--welcome to the 21st century folks! + // setBackgroundMode(TQWidget::NoBackground); + + setGeometry(0, 0, mRootWidth, mRootHeight); + saverReadyIfNeeded(); + + // HACK + // Hide all tooltips and notification windows + { + Window rootWindow = RootWindow(x11Display(), x11Screen()); + Window parent; + Window* children = NULL; + unsigned int noOfChildren = 0; + XWindowAttributes childAttr; + Window childTransient; + + if (XQueryTree(x11Display(), rootWindow, &rootWindow, &parent, &children, &noOfChildren) && noOfChildren>0 ) { + for (unsigned int i=0; i<noOfChildren; i++) { + if (XGetWindowAttributes(x11Display(), children[i], &childAttr) && XGetTransientForHint(x11Display(), children[i], &childTransient)) { + if ((childAttr.map_state == IsViewable) && (childAttr.override_redirect) && (childTransient)) { + if (!trinity_desktop_lock_hidden_window_list.contains(children[i])) { + trinity_desktop_lock_hidden_window_list.append(children[i]); + } + XLowerWindow(x11Display(), children[i]); + XFlush(x11Display()); + } + } + } + } + } + + kdDebug(KDESKTOP_DEBUG_ID) << "Saver window Id: " << winId() << endl; } void LockProcess::desktopResized() { - // Get root window size - XWindowAttributes rootAttr; - XGetWindowAttributes(tqt_xdisplay(), RootWindow(tqt_xdisplay(), tqt_xscreen()), &rootAttr); - if ((rootAttr.width == mRootWidth) && (rootAttr.height == mRootHeight)) { - return; - } - mRootWidth = rootAttr.width; - mRootHeight = rootAttr.height; - generateBackingImages(); - - mBusy = true; - mHackDelayStartupTimer->stop(); - stopHack(); - DISABLE_CONTINUOUS_LOCKDLG_DISPLAY - mResizingDesktopLock = true; - - backingPixmap = TQPixmap(); - - if (trinity_desktop_lock_use_system_modal_dialogs) { - // Temporarily hide the entire screen with a new override redirect window - if (m_maskWidget) { - m_maskWidget->setGeometry(0, 0, mRootWidth, mRootHeight); - } - else { - m_maskWidget = new TQWidget(0, 0, TQt::WStyle_StaysOnTop | TQt::WX11BypassWM); - m_maskWidget->setGeometry(0, 0, mRootWidth, mRootHeight); - m_maskWidget->setBackgroundColor(TQt::black); - m_maskWidget->erase(); - m_maskWidget->show(); - } + // Get root window size + XWindowAttributes rootAttr; + XGetWindowAttributes(tqt_xdisplay(), RootWindow(tqt_xdisplay(), tqt_xscreen()), &rootAttr); + if ((rootAttr.width == mRootWidth) && (rootAttr.height == mRootHeight)) { + return; + } + mRootWidth = rootAttr.width; + mRootHeight = rootAttr.height; + generateBackingImages(); + + mBusy = true; + mHackDelayStartupTimer->stop(); + stopHack(); + DISABLE_CONTINUOUS_LOCKDLG_DISPLAY + mResizingDesktopLock = true; + + backingPixmap = TQPixmap(); + + if (trinity_desktop_lock_use_system_modal_dialogs) { + // Temporarily hide the entire screen with a new override redirect window + if (m_maskWidget) { + m_maskWidget->setGeometry(0, 0, mRootWidth, mRootHeight); + } + else { + m_maskWidget = new TQWidget(0, 0, TQt::WStyle_StaysOnTop | TQt::WX11BypassWM); + m_maskWidget->setGeometry(0, 0, mRootWidth, mRootHeight); + m_maskWidget->setBackgroundColor(TQt::black); + m_maskWidget->erase(); + m_maskWidget->show(); + } + XSync(tqt_xdisplay(), False); + saverReadyIfNeeded(); + + if (mEnsureScreenHiddenTimer) { + mEnsureScreenHiddenTimer->stop(); + } + else { + mEnsureScreenHiddenTimer = new TQTimer( this ); + connect( mEnsureScreenHiddenTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(slotForcePaintBackground()) ); + } + mEnsureScreenHiddenTimer->start(DESKTOP_WALLPAPER_OBTAIN_TIMEOUT_MS, true); + } + + // Resize the background widget + setGeometry(0, 0, mRootWidth, mRootHeight); XSync(tqt_xdisplay(), False); saverReadyIfNeeded(); - if (mEnsureScreenHiddenTimer) { - mEnsureScreenHiddenTimer->stop(); + // Black out the background widget to hide ugly resize tiling artifacts + if (argb_visual) { + setTransparentBackgroundARGB(); } else { - mEnsureScreenHiddenTimer = new TQTimer( this ); - connect( mEnsureScreenHiddenTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(slotForcePaintBackground()) ); + setBackgroundColor(black); } - mEnsureScreenHiddenTimer->start(DESKTOP_WALLPAPER_OBTAIN_TIMEOUT_MS, true); - } - - // Resize the background widget - setGeometry(0, 0, mRootWidth, mRootHeight); - XSync(tqt_xdisplay(), False); - saverReadyIfNeeded(); - - // Black out the background widget to hide ugly resize tiling artifacts - if (argb_visual) { - setTransparentBackgroundARGB(); - } - else { - setBackgroundColor(black); - } - erase(); + erase(); - // This slot needs to be able to execute very rapidly so as to prevent the user's desktop from ever - // being displayed, so we finish the hack restarting/display prettying operations in a separate timed slot - if (resizeTimer == NULL) { - resizeTimer = new TQTimer( this ); - connect( resizeTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(doDesktopResizeFinish()) ); - } - resizeTimer->start( 100, TRUE ); // 100 millisecond single shot timer; should allow display switching operations to finish before hack is started + // This slot needs to be able to execute very rapidly so as to prevent the user's desktop from ever + // being displayed, so we finish the hack restarting/display prettying operations in a separate timed slot + if (resizeTimer == NULL) { + resizeTimer = new TQTimer( this ); + connect( resizeTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(doDesktopResizeFinish()) ); + } + resizeTimer->start( 100, TRUE ); // 100 millisecond single shot timer; should allow display switching operations to finish before hack is started } void LockProcess::doDesktopResizeFinish() @@ -1096,23 +1099,23 @@ void LockProcess::doDesktopResizeFinish() // void LockProcess::hideSaverWindow() { - hide(); - lower(); - removeVRoot(winId()); - XDeleteProperty(tqt_xdisplay(), winId(), gXA_SCREENSAVER_VERSION); - if ( gVRoot ) { - unsigned long vroot_data[1] = { gVRootData }; - XChangeProperty(tqt_xdisplay(), gVRoot, gXA_VROOT, XA_WINDOW, 32, - PropModeReplace, (unsigned char *)vroot_data, 1); - gVRoot = 0; - } - XSync(tqt_xdisplay(), False); + hide(); + lower(); + removeVRoot(winId()); + XDeleteProperty(tqt_xdisplay(), winId(), gXA_SCREENSAVER_VERSION); + if ( gVRoot ) { + unsigned long vroot_data[1] = { gVRootData }; + XChangeProperty(tqt_xdisplay(), gVRoot, gXA_VROOT, XA_WINDOW, 32, + PropModeReplace, (unsigned char *)vroot_data, 1); + gVRoot = 0; + } + XSync(tqt_xdisplay(), False); } //--------------------------------------------------------------------------- static int ignoreXError(Display *, XErrorEvent *) { - return 0; + return 0; } //--------------------------------------------------------------------------- @@ -1121,44 +1124,39 @@ static int ignoreXError(Display *, XErrorEvent *) // void LockProcess::saveVRoot() { - Window rootReturn, parentReturn, *children; - unsigned int numChildren; - Window root = RootWindowOfScreen(ScreenOfDisplay(tqt_xdisplay(), tqt_xscreen())); - - gVRoot = 0; - gVRootData = 0; - - int (*oldHandler)(Display *, XErrorEvent *); - oldHandler = XSetErrorHandler(ignoreXError); - - if (XQueryTree(tqt_xdisplay(), root, &rootReturn, &parentReturn, - &children, &numChildren)) - { - for (unsigned int i = 0; i < numChildren; i++) - { - Atom actual_type; - int actual_format; - unsigned long nitems, bytesafter; - unsigned char *newRoot = 0; - - if ((XGetWindowProperty(tqt_xdisplay(), children[i], gXA_VROOT, 0, 1, - False, XA_WINDOW, &actual_type, &actual_format, &nitems, &bytesafter, - &newRoot) == Success) && newRoot) - { - gVRoot = children[i]; - Window *dummy = (Window*)newRoot; - gVRootData = *dummy; - XFree ((char*) newRoot); - break; - } - } - if (children) - { - XFree((char *)children); - } - } - - XSetErrorHandler(oldHandler); + Window rootReturn, parentReturn, *children; + unsigned int numChildren; + Window root = RootWindowOfScreen(ScreenOfDisplay(tqt_xdisplay(), tqt_xscreen())); + + gVRoot = 0; + gVRootData = 0; + + int (*oldHandler)(Display *, XErrorEvent *); + oldHandler = XSetErrorHandler(ignoreXError); + + if (XQueryTree(tqt_xdisplay(), root, &rootReturn, &parentReturn, &children, &numChildren)) { + for (unsigned int i = 0; i < numChildren; i++) { + Atom actual_type; + int actual_format; + unsigned long nitems, bytesafter; + unsigned char *newRoot = 0; + + if ((XGetWindowProperty(tqt_xdisplay(), children[i], gXA_VROOT, 0, 1, + False, XA_WINDOW, &actual_type, &actual_format, &nitems, &bytesafter, + &newRoot) == Success) && newRoot) { + gVRoot = children[i]; + Window *dummy = (Window*)newRoot; + gVRootData = *dummy; + XFree ((char*) newRoot); + break; + } + } + if (children) { + XFree((char *)children); + } + } + + XSetErrorHandler(oldHandler); } //--------------------------------------------------------------------------- @@ -1167,35 +1165,35 @@ void LockProcess::saveVRoot() // void LockProcess::setVRoot(Window win, Window vr) { - if (gVRoot) { - removeVRoot(gVRoot); - } - - unsigned long rw = RootWindowOfScreen(ScreenOfDisplay(tqt_xdisplay(), tqt_xscreen())); - unsigned long vroot_data[1] = { vr }; - - Window rootReturn; - Window parentReturn; - Window *children = NULL; - unsigned int numChildren; - Window top = win; - while (1) { - if (XQueryTree(tqt_xdisplay(), top, &rootReturn, &parentReturn, &children, &numChildren) == 0) { - printf("[WARNING] XQueryTree() failed!\n"); fflush(stdout); - break; - } - if (children) { - XFree((char *)children); - } - if (parentReturn == rw) { - break; - } - else { - top = parentReturn; - } - } - - XChangeProperty(tqt_xdisplay(), top, gXA_VROOT, XA_WINDOW, 32, PropModeReplace, (unsigned char *)vroot_data, 1); + if (gVRoot) { + removeVRoot(gVRoot); + } + + unsigned long rw = RootWindowOfScreen(ScreenOfDisplay(tqt_xdisplay(), tqt_xscreen())); + unsigned long vroot_data[1] = { vr }; + + Window rootReturn; + Window parentReturn; + Window *children = NULL; + unsigned int numChildren; + Window top = win; + while (1) { + if (XQueryTree(tqt_xdisplay(), top, &rootReturn, &parentReturn, &children, &numChildren) == 0) { + printf("[WARNING] XQueryTree() failed!\n"); fflush(stdout); + break; + } + if (children) { + XFree((char *)children); + } + if (parentReturn == rw) { + break; + } + else { + top = parentReturn; + } + } + + XChangeProperty(tqt_xdisplay(), top, gXA_VROOT, XA_WINDOW, 32, PropModeReplace, (unsigned char *)vroot_data, 1); } //--------------------------------------------------------------------------- @@ -1204,7 +1202,7 @@ void LockProcess::setVRoot(Window win, Window vr) // void LockProcess::removeVRoot(Window win) { - XDeleteProperty (tqt_xdisplay(), win, gXA_VROOT); + XDeleteProperty (tqt_xdisplay(), win, gXA_VROOT); } //--------------------------------------------------------------------------- @@ -1213,10 +1211,13 @@ void LockProcess::removeVRoot(Window win) // bool LockProcess::grabKeyboard() { - int rv = XGrabKeyboard( tqt_xdisplay(), TQApplication::desktop()->winId(), - True, GrabModeAsync, GrabModeAsync, CurrentTime ); + int rv = XGrabKeyboard( tqt_xdisplay(), TQApplication::desktop()->winId(), + True, GrabModeAsync, GrabModeAsync, CurrentTime ); - return (rv == GrabSuccess); + if (rv != GrabSuccess) { + kdWarning(1204) << "LockProcess::grabKeyboard() failed: " << rv << endl; + } + return (rv == GrabSuccess); } #define GRABEVENTS ButtonPressMask | ButtonReleaseMask | PointerMotionMask | \ @@ -1228,18 +1229,21 @@ bool LockProcess::grabKeyboard() // bool LockProcess::grabMouse() { - HANDLE cursorHandle; - if (mHackActive) { - cursorHandle = TQCursor(tqblankCursor).handle(); - } - else { - cursorHandle = TQCursor(tqbusyCursor).handle(); - } - int rv = XGrabPointer( tqt_xdisplay(), TQApplication::desktop()->winId(), - True, GRABEVENTS, GrabModeAsync, GrabModeAsync, None, - cursorHandle, CurrentTime ); + HANDLE cursorHandle; + if (mHackActive) { + cursorHandle = TQCursor(tqblankCursor).handle(); + } + else { + cursorHandle = TQCursor(tqbusyCursor).handle(); + } + int rv = XGrabPointer( tqt_xdisplay(), TQApplication::desktop()->winId(), + True, GRABEVENTS, GrabModeAsync, GrabModeAsync, None, + cursorHandle, CurrentTime ); - return (rv == GrabSuccess); + if (rv != GrabSuccess) { + kdWarning(1204) << "LockProcess::grabMouse() failed: " << rv << endl; + } + return (rv == GrabSuccess); } //--------------------------------------------------------------------------- @@ -1248,32 +1252,28 @@ bool LockProcess::grabMouse() // bool LockProcess::grabInput() { - XSync(tqt_xdisplay(), False); + XSync(tqt_xdisplay(), False); - if (!grabKeyboard()) - { - usleep(100000); - if (!grabKeyboard()) - { - return false; - } - } + if (!grabKeyboard()) { + usleep(100000); + if (!grabKeyboard()) { + return false; + } + } #ifndef KEEP_MOUSE_UNGRABBED - if (!grabMouse()) - { - usleep(100000); - if (!grabMouse()) - { - XUngrabKeyboard(tqt_xdisplay(), CurrentTime); - return false; - } - } + if (!grabMouse()) { + usleep(100000); + if (!grabMouse()) { + XUngrabKeyboard(tqt_xdisplay(), CurrentTime); + return false; + } + } #endif - lockXF86(); + lockXF86(); - return true; + return true; } //--------------------------------------------------------------------------- @@ -1282,9 +1282,9 @@ bool LockProcess::grabInput() // void LockProcess::ungrabInput() { - XUngrabKeyboard(tqt_xdisplay(), CurrentTime); - XUngrabPointer(tqt_xdisplay(), CurrentTime); - unlockXF86(); + XUngrabKeyboard(tqt_xdisplay(), CurrentTime); + XUngrabPointer(tqt_xdisplay(), CurrentTime); + unlockXF86(); } //--------------------------------------------------------------------------- @@ -1330,7 +1330,7 @@ bool LockProcess::startSaver(bool notify_ready) { if (!child_saver && !grabInput()) { - kdWarning(1204) << "LockProcess::startSaver() grabInput() failed!!!!" << endl; + kdWarning(KDESKTOP_DEBUG_ID) << "LockProcess::startSaver() grabInput() failed!!!!" << endl; return false; } mBusy = false; @@ -1416,39 +1416,42 @@ bool LockProcess::startSaver(bool notify_ready) // void LockProcess::stopSaver() { - kdDebug(1204) << "LockProcess: stopping saver" << endl; - mHackProc.kill(SIGCONT); - stopHack(); - mSuspended = false; - hideSaverWindow(); - mVisibility = false; - if (!child_saver) { - if (mLocked) - DM().setLock( false ); - ungrabInput(); - const char *out = "GOAWAY!"; - for (TQValueList<int>::ConstIterator it = child_sockets.begin(); it != child_sockets.end(); ++it) - if (write(*it, out, sizeof(out)) == -1) { - // Error handler to shut up gcc warnings - } - } + kdDebug(KDESKTOP_DEBUG_ID) << "LockProcess: stopping saver" << endl; + mHackProc.kill(SIGCONT); + stopHack(); + mSuspended = false; + hideSaverWindow(); + mVisibility = false; + if (!child_saver) { + if (mLocked) { + DM().setLock( false ); + } + ungrabInput(); + const char *out = "GOAWAY!"; + for (TQValueList<int>::ConstIterator it = child_sockets.begin(); it != child_sockets.end(); ++it) { + if (write(*it, out, sizeof(out)) == -1) { + // Error handler to shut up gcc warnings + } + } + } } // private static TQVariant LockProcess::getConf(void *ctx, const char *key, const TQVariant &dflt) { - LockProcess *that = (LockProcess *)ctx; - TQString fkey = TQString::fromLatin1( key ) + '='; - for (TQStringList::ConstIterator it = that->mPluginOptions.begin(); - it != that->mPluginOptions.end(); ++it) - if ((*it).startsWith( fkey )) - return (*it).mid( fkey.length() ); - return dflt; + LockProcess *that = (LockProcess *)ctx; + TQString fkey = TQString::fromLatin1( key ) + '='; + for (TQStringList::ConstIterator it = that->mPluginOptions.begin(); it != that->mPluginOptions.end(); ++it) { + if ((*it).startsWith( fkey )) { + return (*it).mid( fkey.length() ); + } + } + return dflt; } void LockProcess::cantLock( const TQString &txt) { - msgBox( TQMessageBox::Critical, i18n("Will not lock the session, as unlocking would be impossible:\n") + txt ); + msgBox( TQMessageBox::Critical, i18n("Will not lock the session, as unlocking would be impossible:\n") + txt ); } #if 0 // placeholders for later @@ -1462,42 +1465,41 @@ i18n("<i>kcheckpass</i> is unable to operate. Possibly it is not SetUID root."); // bool LockProcess::startLock() { - for (TQStringList::ConstIterator it = mPlugins.begin(); it != mPlugins.end(); ++it) { - GreeterPluginHandle plugin; - TQString path = KLibLoader::self()->findLibrary( - ((*it)[0] == '/' ? *it : "kgreet_" + *it ).latin1() ); - if (path.isEmpty()) { - kdWarning(1204) << "GreeterPlugin " << *it << " does not exist" << endl; - continue; - } - if (!(plugin.library = KLibLoader::self()->library( path.latin1() ))) { - kdWarning(1204) << "Cannot load GreeterPlugin " << *it << " (" << path << ")" << endl; - continue; - } - if (!plugin.library->hasSymbol( "kgreeterplugin_info" )) { - kdWarning(1204) << "GreeterPlugin " << *it << " (" << path << ") is no valid greet widget plugin" << endl; - plugin.library->unload(); - continue; - } - plugin.info = (kgreeterplugin_info*)plugin.library->symbol( "kgreeterplugin_info" ); - if (plugin.info->method && !mMethod.isEmpty() && mMethod != plugin.info->method) { - kdDebug(1204) << "GreeterPlugin " << *it << " (" << path << ") serves " << plugin.info->method << ", not " << mMethod << endl; - plugin.library->unload(); - continue; - } - if (!plugin.info->init( mMethod, getConf, this )) { - kdDebug(1204) << "GreeterPlugin " << *it << " (" << path << ") refuses to serve " << mMethod << endl; - plugin.library->unload(); - continue; - } - kdDebug(1204) << "GreeterPlugin " << *it << " (" << plugin.info->method << ", " << plugin.info->name << ") loaded" << endl; - greetPlugin = plugin; - mLocked = true; - DM().setLock( true ); - return true; - } - cantLock( i18n("No appropriate greeter plugin configured.") ); - return false; + for (TQStringList::ConstIterator it = mPlugins.begin(); it != mPlugins.end(); ++it) { + GreeterPluginHandle plugin; + TQString path = KLibLoader::self()->findLibrary( ((*it)[0] == '/' ? *it : "kgreet_" + *it ).latin1() ); + if (path.isEmpty()) { + kdWarning(KDESKTOP_DEBUG_ID) << "GreeterPlugin " << *it << " does not exist" << endl; + continue; + } + if (!(plugin.library = KLibLoader::self()->library( path.latin1() ))) { + kdWarning(KDESKTOP_DEBUG_ID) << "Cannot load GreeterPlugin " << *it << " (" << path << ")" << endl; + continue; + } + if (!plugin.library->hasSymbol( "kgreeterplugin_info" )) { + kdWarning(KDESKTOP_DEBUG_ID) << "GreeterPlugin " << *it << " (" << path << ") is no valid greet widget plugin" << endl; + plugin.library->unload(); + continue; + } + plugin.info = (kgreeterplugin_info*)plugin.library->symbol( "kgreeterplugin_info" ); + if (plugin.info->method && !mMethod.isEmpty() && mMethod != plugin.info->method) { + kdDebug(KDESKTOP_DEBUG_ID) << "GreeterPlugin " << *it << " (" << path << ") serves " << plugin.info->method << ", not " << mMethod << endl; + plugin.library->unload(); + continue; + } + if (!plugin.info->init( mMethod, getConf, this )) { + kdDebug(KDESKTOP_DEBUG_ID) << "GreeterPlugin " << *it << " (" << path << ") refuses to serve " << mMethod << endl; + plugin.library->unload(); + continue; + } + kdDebug(KDESKTOP_DEBUG_ID) << "GreeterPlugin " << *it << " (" << plugin.info->method << ", " << plugin.info->name << ") loaded" << endl; + greetPlugin = plugin; + mLocked = true; + DM().setLock( true ); + return true; + } + cantLock( i18n("No appropriate greeter plugin configured.") ); + return false; } //--------------------------------------------------------------------------- @@ -1563,168 +1565,165 @@ void LockProcess::repaintRootWindowIfNeeded() bool LockProcess::startHack() { - mHackActive = TRUE; + mHackActive = TRUE; - if ((mEnsureVRootWindowSecurityTimer) && (!mEnsureVRootWindowSecurityTimer->isActive())) mEnsureVRootWindowSecurityTimer->start(250, FALSE); - - if (currentDialog || (!mDialogs.isEmpty())) - { - // no resuming with dialog visible or when not visible - if (argb_visual) { - setTransparentBackgroundARGB(); + if ((mEnsureVRootWindowSecurityTimer) && (!mEnsureVRootWindowSecurityTimer->isActive())) { + mEnsureVRootWindowSecurityTimer->start(250, FALSE); } - else { - if (backingPixmap.isNull()) { - setBackgroundColor(black); + + if (currentDialog || (!mDialogs.isEmpty())) { + // no resuming with dialog visible or when not visible + if (argb_visual) { + setTransparentBackgroundARGB(); } else { - setBackgroundPixmap(backingPixmap); + if (backingPixmap.isNull()) { + setBackgroundColor(black); + } + else { + setBackgroundPixmap(backingPixmap); + } } + setGeometry(0, 0, mRootWidth, mRootHeight); + erase(); + saverReadyIfNeeded(); + return false; } - setGeometry(0, 0, mRootWidth, mRootHeight); - erase(); - saverReadyIfNeeded(); - return false; - } - - setCursor( tqblankCursor ); - XChangeActivePointerGrab( tqt_xdisplay(), GRABEVENTS, TQCursor(tqblankCursor).handle(), CurrentTime); - - if (mSaverExec.isEmpty()) - { - return false; - } - - if (mHackProc.isRunning()) - { - stopHack(); - } - - mHackProc.clearArguments(); - - TQTextStream ts(&mSaverExec, IO_ReadOnly); - TQString word; - ts >> word; - TQString path = TDEStandardDirs::findExe(word); - - if (!path.isEmpty()) - { - mHackProc << path; - - kdDebug(1204) << "Starting hack: " << path << endl; - - while (!ts.atEnd()) - { - ts >> word; - if (word == "%w") - { - word = word.setNum(winId()); - } - mHackProc << word; - } - - if (!mForbidden) - { - if (trinity_desktop_lock_use_system_modal_dialogs) { - // Make sure we have a nice clean display to start with! - if (argb_visual) { - // Signal that we want to be transparent to a black background... - if (m_saverRootWindow) { - XChangeProperty(tqt_xdisplay(), m_saverRootWindow, kde_wm_transparent_to_black, XA_INTEGER, 32, PropModeReplace, (unsigned char *) "TRUE", 1L); - XClearArea(tqt_xdisplay(), m_saverRootWindow, 0, 0, 0, 0, True); - } - setTransparentBackgroundARGB(); + + setCursor( tqblankCursor ); + XChangeActivePointerGrab( tqt_xdisplay(), GRABEVENTS, TQCursor(tqblankCursor).handle(), CurrentTime); + + if (mSaverExec.isEmpty()) { + return false; + } + + if (mHackProc.isRunning()) { + stopHack(); + } + + mHackProc.clearArguments(); + + TQTextStream ts(&mSaverExec, IO_ReadOnly); + TQString word; + ts >> word; + TQString path = TDEStandardDirs::findExe(word); + + if (!path.isEmpty()) { + mHackProc << path; + + kdDebug(KDESKTOP_DEBUG_ID) << "Starting hack: " << path << endl; + + while (!ts.atEnd()) { + ts >> word; + if (word == "%w") + { + word = word.setNum(winId()); } - else { - if (backingPixmap.isNull()) { - setBackgroundColor(black); + mHackProc << word; + } + + if (!mForbidden) { + if (trinity_desktop_lock_use_system_modal_dialogs) { + // Make sure we have a nice clean display to start with! + if (argb_visual) { + // Signal that we want to be transparent to a black background... + if (m_saverRootWindow) { + XChangeProperty(tqt_xdisplay(), m_saverRootWindow, kde_wm_transparent_to_black, XA_INTEGER, 32, PropModeReplace, (unsigned char *) "TRUE", 1L); + XClearArea(tqt_xdisplay(), m_saverRootWindow, 0, 0, 0, 0, True); + } + setTransparentBackgroundARGB(); } else { - setBackgroundPixmap(backingPixmap); + if (backingPixmap.isNull()) { + setBackgroundColor(black); + } + else { + setBackgroundPixmap(backingPixmap); + } } + setGeometry(0, 0, mRootWidth, mRootHeight); + erase(); + saverReadyIfNeeded(); + mSuspended = false; } - setGeometry(0, 0, mRootWidth, mRootHeight); - erase(); - saverReadyIfNeeded(); - mSuspended = false; - } - XChangeActivePointerGrab( tqt_xdisplay(), GRABEVENTS, TQCursor(tqblankCursor).handle(), CurrentTime); - if (mHackProc.start() == true) - { + XChangeActivePointerGrab( tqt_xdisplay(), GRABEVENTS, TQCursor(tqblankCursor).handle(), CurrentTime); + if (mHackProc.start() == true) { #ifdef HAVE_SETPRIORITY - setpriority(PRIO_PROCESS, mHackProc.pid(), mPriority); + setpriority(PRIO_PROCESS, mHackProc.pid(), mPriority); #endif - //bitBlt(this, 0, 0, &mOriginal); - DISABLE_CONTINUOUS_LOCKDLG_DISPLAY - if (trinity_desktop_lock_delay_screensaver_start && trinity_desktop_lock_forced) { - // Close any active dialogs - if (closeCurrentWindow()) { - TQTimer::singleShot( 0, this, SLOT(closeCurrentWindow()) ); + //bitBlt(this, 0, 0, &mOriginal); + DISABLE_CONTINUOUS_LOCKDLG_DISPLAY + if (trinity_desktop_lock_delay_screensaver_start && trinity_desktop_lock_forced) { + // Close any active dialogs + if (closeCurrentWindow()) { + TQTimer::singleShot( 0, this, SLOT(closeCurrentWindow()) ); + } } + if (m_startupStatusDialog) { m_startupStatusDialog->closeSMDialog(); m_startupStatusDialog=NULL; } + return true; } - if (m_startupStatusDialog) { m_startupStatusDialog->closeSMDialog(); m_startupStatusDialog=NULL; } - return true; } - } - else - // we aren't allowed to start the specified screensaver either because it didn't run for some reason - // according to the kiosk restrictions forbid it - { - usleep(100); - TQApplication::syncX(); - if (!trinity_desktop_lock_use_system_modal_dialogs) { + else { + // we aren't allowed to start the specified screensaver either because it didn't run for some reason + // according to the kiosk restrictions forbid it + usleep(100); + TQApplication::syncX(); + if (!trinity_desktop_lock_use_system_modal_dialogs) { + if (argb_visual) { + setTransparentBackgroundARGB(); + } + else { + if (backingPixmap.isNull()) { + setBackgroundColor(black); + } + else { + setBackgroundPixmap(backingPixmap); + } + } + } if (argb_visual) { setTransparentBackgroundARGB(); + erase(); } else { if (backingPixmap.isNull()) { - setBackgroundColor(black); + setGeometry(0, 0, mRootWidth, mRootHeight); + erase(); } else { - setBackgroundPixmap(backingPixmap); + bitBlt(this, 0, 0, &backingPixmap); } } - } - if (argb_visual) { - setTransparentBackgroundARGB(); - erase(); - } - else { - if (backingPixmap.isNull()) { - setGeometry(0, 0, mRootWidth, mRootHeight); - erase(); - } - else { - bitBlt(this, 0, 0, &backingPixmap); + if (trinity_desktop_lock_use_system_modal_dialogs) { + ENABLE_CONTINUOUS_LOCKDLG_DISPLAY + if (mHackStartupEnabled) mHackDelayStartupTimer->start(mHackDelayStartupTimeout, TRUE); } + saverReadyIfNeeded(); } - if (trinity_desktop_lock_use_system_modal_dialogs) { - ENABLE_CONTINUOUS_LOCKDLG_DISPLAY - if (mHackStartupEnabled) mHackDelayStartupTimer->start(mHackDelayStartupTimeout, TRUE); - } - saverReadyIfNeeded(); } - } - if (m_startupStatusDialog) { m_startupStatusDialog->closeSMDialog(); m_startupStatusDialog=NULL; } - return false; + + if (m_startupStatusDialog) { + m_startupStatusDialog->closeSMDialog(); + m_startupStatusDialog=NULL; + } + + return false; } //--------------------------------------------------------------------------- // void LockProcess::stopHack() { - if (mHackProc.isRunning()) - { - mHackProc.kill(); - if (!mHackProc.wait(10)) - { - mHackProc.kill(SIGKILL); - } - } - setCursor( tqarrowCursor ); + if (mHackProc.isRunning()) { + mHackProc.kill(); + if (!mHackProc.wait(10)) { + mHackProc.kill(SIGKILL); + } + } + setCursor( tqarrowCursor ); - mHackActive = FALSE; + mHackActive = FALSE; } //--------------------------------------------------------------------------- @@ -1799,81 +1798,81 @@ void LockProcess::displayLockDialogIfNeeded() void LockProcess::suspend() { - if(!mSuspended) - { - if (trinity_desktop_lock_use_system_modal_dialogs) { - mSuspended = true; - stopHack(); - ENABLE_CONTINUOUS_LOCKDLG_DISPLAY - if (mHackStartupEnabled) mHackDelayStartupTimer->start(mHackDelayStartupTimeout, TRUE); - } - else { - TQString hackStatus; - mHackProc.kill(SIGSTOP); - mSuspended = true; + if (!mSuspended) { + if (trinity_desktop_lock_use_system_modal_dialogs) { + mSuspended = true; + stopHack(); + ENABLE_CONTINUOUS_LOCKDLG_DISPLAY + if (mHackStartupEnabled) { + mHackDelayStartupTimer->start(mHackDelayStartupTimeout, TRUE); + } + } + else { + TQString hackStatus; + mHackProc.kill(SIGSTOP); + mSuspended = true; #if 0 - // wait for the stop signal to take effect - while (hackStatus != "T") { - char hackstat[8192]; - FILE *fp = fopen(TQString("/proc/%1/stat").arg(mHackProc.pid()).ascii(),"r"); - if (fp != NULL) { - fgets (hackstat, 8192, fp); - fclose (fp); - } - hackstat[8191] = 0; - hackStatus = hackstat; - hackStatus = hackStatus.remove(TQRegExp("(*) ", TRUE, TRUE)); - TQStringList hackStatusList = TQStringList::split(" ", hackStatus); - hackStatus = (*(hackStatusList.at(1))); - } + // wait for the stop signal to take effect + while (hackStatus != "T") { + char hackstat[8192]; + FILE *fp = fopen(TQString("/proc/%1/stat").arg(mHackProc.pid()).ascii(),"r"); + if (fp != NULL) { + fgets (hackstat, 8192, fp); + fclose (fp); + } + hackstat[8191] = 0; + hackStatus = hackstat; + hackStatus = hackStatus.remove(TQRegExp("(*) ", TRUE, TRUE)); + TQStringList hackStatusList = TQStringList::split(" ", hackStatus); + hackStatus = (*(hackStatusList.at(1))); + } #endif - TQApplication::syncX(); - usleep(100000); // Allow certain bad graphics drivers (*cough* fglrx *cough*) time to actually sync up the display - } - TQApplication::syncX(); - mSavedScreen = TQPixmap::grabWindow( winId()); - } + TQApplication::syncX(); + usleep(100000); // Allow certain bad graphics drivers (*cough* fglrx *cough*) time to actually sync up the display + } + TQApplication::syncX(); + mSavedScreen = TQPixmap::grabWindow( winId()); + } } void LockProcess::resume( bool force ) { - if (trinity_desktop_lock_use_sak && (mHackDelayStartupTimer->isActive() || !mHackStartupEnabled)) { - return; - } - if( !force && (!mDialogs.isEmpty() || !mVisibility )) { - // no resuming with dialog visible or when not visible - if (trinity_desktop_lock_use_system_modal_dialogs) { - if (argb_visual) { - setTransparentBackgroundARGB(); - } - else { - if (backingPixmap.isNull()) { - setBackgroundColor(black); + if (trinity_desktop_lock_use_sak && (mHackDelayStartupTimer->isActive() || !mHackStartupEnabled)) { + return; + } + if( !force && (!mDialogs.isEmpty() || !mVisibility )) { + // no resuming with dialog visible or when not visible + if (trinity_desktop_lock_use_system_modal_dialogs) { + if (argb_visual) { + setTransparentBackgroundARGB(); } else { - setBackgroundPixmap(backingPixmap); + if (backingPixmap.isNull()) { + setBackgroundColor(black); + } + else { + setBackgroundPixmap(backingPixmap); + } } + setGeometry(0, 0, mRootWidth, mRootHeight); + erase(); } - setGeometry(0, 0, mRootWidth, mRootHeight); - erase(); + else { + setGeometry(0, 0, mRootWidth, mRootHeight); + } + saverReadyIfNeeded(); + return; } - else { - setGeometry(0, 0, mRootWidth, mRootHeight); + if ((mSuspended) && (mHackProc.isRunning())) { + XForceScreenSaver(tqt_xdisplay(), ScreenSaverReset ); + bitBlt( this, 0, 0, &mSavedScreen ); + TQApplication::syncX(); + mHackProc.kill(SIGCONT); + mSuspended = false; + } + else if (mSuspended && trinity_desktop_lock_use_system_modal_dialogs) { + startHack(); } - saverReadyIfNeeded(); - return; - } - if ((mSuspended) && (mHackProc.isRunning())) - { - XForceScreenSaver(tqt_xdisplay(), ScreenSaverReset ); - bitBlt( this, 0, 0, &mSavedScreen ); - TQApplication::syncX(); - mHackProc.kill(SIGCONT); - mSuspended = false; - } - else if (mSuspended && trinity_desktop_lock_use_system_modal_dialogs) { - startHack(); - } } //--------------------------------------------------------------------------- @@ -1883,152 +1882,153 @@ void LockProcess::resume( bool force ) // bool LockProcess::checkPass() { - if (!mDialogs.isEmpty()) { - // Another dialog is already shown - // Abort! - return 0; - } - if (mInfoMessageDisplayed == false) { - if (mAutoLogout) { - killTimer(mAutoLogoutTimerId); - } - - // Make sure we never launch the SAK or login dialog if windows are being closed down - // Otherwise we can get stuck in an irrecoverable state where any attempt to show the login screen is instantly aborted - if (mClosingWindows) { - return 0; - } - - if (trinity_desktop_lock_use_sak) { - // Verify SAK operational status - TDEProcess* checkSAKProcess = new TDEProcess; - *checkSAKProcess << "tdmtsak" << "check"; - checkSAKProcess->start(TDEProcess::Block, TDEProcess::NoCommunication); - int retcode = checkSAKProcess->exitStatus(); - delete checkSAKProcess; - if (retcode != 0) { - trinity_desktop_lock_use_sak = false; - } - } - - if (trinity_desktop_lock_use_sak) { - // Wait for SAK press before continuing... - SAKDlg inDlg( this ); - execDialog( &inDlg ); - if (mClosingWindows) { - return 0; - } - } - - showVkbd(); - PasswordDlg passDlg( this, &greetPlugin, (mShowLockDateTime)?mlockDateTime:TQDateTime()); - int ret = execDialog( &passDlg ); - hideVkbd(); - - if (mForceReject == true) { - ret = TQDialog::Rejected; - } - mForceReject = false; - - XWindowAttributes rootAttr; - XGetWindowAttributes(tqt_xdisplay(), RootWindow(tqt_xdisplay(), - tqt_xscreen()), &rootAttr); - if(( rootAttr.your_event_mask & SubstructureNotifyMask ) == 0 ) - { - kdWarning() << "ERROR: Something removed SubstructureNotifyMask from the root window!!!" << endl; - XSelectInput( tqt_xdisplay(), tqt_xrootwin(), - SubstructureNotifyMask | rootAttr.your_event_mask ); - } - - return ret == TQDialog::Accepted; - } - else { - return 0; - } + if (!mDialogs.isEmpty()) { + // Another dialog is already shown + // Abort! + return 0; + } + if (mInfoMessageDisplayed == false) { + if (mAutoLogout) { + killTimer(mAutoLogoutTimerId); + } + + // Make sure we never launch the SAK or login dialog if windows are being closed down + // Otherwise we can get stuck in an irrecoverable state where any attempt to show the login screen is instantly aborted + if (mClosingWindows) { + return 0; + } + + if (trinity_desktop_lock_use_sak) { + // Verify SAK operational status + TDEProcess* checkSAKProcess = new TDEProcess; + *checkSAKProcess << "tdmtsak" << "check"; + checkSAKProcess->start(TDEProcess::Block, TDEProcess::NoCommunication); + int retcode = checkSAKProcess->exitStatus(); + delete checkSAKProcess; + if (retcode != 0) { + trinity_desktop_lock_use_sak = false; + } + } + + if (trinity_desktop_lock_use_sak) { + // Wait for SAK press before continuing... + SAKDlg inDlg( this ); + execDialog( &inDlg ); + if (mClosingWindows) { + return 0; + } + } + + showVkbd(); + PasswordDlg passDlg( this, &greetPlugin, (mShowLockDateTime)?mlockDateTime:TQDateTime()); + int ret = execDialog( &passDlg ); + hideVkbd(); + + if (mForceReject == true) { + ret = TQDialog::Rejected; + } + mForceReject = false; + + XWindowAttributes rootAttr; + XGetWindowAttributes(tqt_xdisplay(), RootWindow(tqt_xdisplay(), + tqt_xscreen()), &rootAttr); + if(( rootAttr.your_event_mask & SubstructureNotifyMask ) == 0 ) { + kdWarning() << "ERROR: Something removed SubstructureNotifyMask from the root window!!!" << endl; + XSelectInput( tqt_xdisplay(), tqt_xrootwin(), + SubstructureNotifyMask | rootAttr.your_event_mask ); + } + + return ret == TQDialog::Accepted; + } + else { + return 0; + } } static void fakeFocusIn( WId window ) { - // We have keyboard grab, so this application will - // get keyboard events even without having focus. - // Fake FocusIn to make Qt realize it has the active - // window, so that it will correctly show cursor in the dialog. - XEvent ev; - memset(&ev, 0, sizeof(ev)); - ev.xfocus.display = tqt_xdisplay(); - ev.xfocus.type = FocusIn; - ev.xfocus.window = window; - ev.xfocus.mode = NotifyNormal; - ev.xfocus.detail = NotifyAncestor; - XSendEvent( tqt_xdisplay(), window, False, NoEventMask, &ev ); + // We have keyboard grab, so this application will + // get keyboard events even without having focus. + // Fake FocusIn to make Qt realize it has the active + // window, so that it will correctly show cursor in the dialog. + XEvent ev; + memset(&ev, 0, sizeof(ev)); + ev.xfocus.display = tqt_xdisplay(); + ev.xfocus.type = FocusIn; + ev.xfocus.window = window; + ev.xfocus.mode = NotifyNormal; + ev.xfocus.detail = NotifyAncestor; + XSendEvent( tqt_xdisplay(), window, False, NoEventMask, &ev ); } void LockProcess::resumeUnforced() { - resume( false ); + resume( false ); } int LockProcess::execDialog( TQDialog *dlg ) { - currentDialog=dlg; - dlg->adjustSize(); - - TQRect rect = dlg->geometry(); - rect.moveCenter(TDEGlobalSettings::desktopGeometry(TQCursor::pos()).center()); - dlg->move( rect.topLeft() ); - - if (mDialogs.isEmpty()) - { - suspend(); - XChangeActivePointerGrab( tqt_xdisplay(), GRABEVENTS, TQCursor(tqarrowCursor).handle(), CurrentTime); - } - mDialogs.prepend( dlg ); - fakeFocusIn( dlg->winId()); - if (trinity_desktop_lock_use_system_modal_dialogs) { - if (backingPixmap.isNull()) { - setGeometry(0, 0, mRootWidth, mRootHeight); - erase(); - } - else { - bitBlt(this, 0, 0, &backingPixmap); - } - saverReadyIfNeeded(); - } - // dlg->exec may generate BadMatch errors, so make sure they are silently ignored - int (*oldHandler)(Display *, XErrorEvent *); - oldHandler = XSetErrorHandler(ignoreXError); - int rt = dlg->exec(); - XSetErrorHandler(oldHandler); - while (mDialogControlLock == true) usleep(100000); - currentDialog = NULL; - mDialogs.remove( dlg ); - if( mDialogs.isEmpty() ) { - HANDLE cursorHandle; - if (mHackActive) { - cursorHandle = TQCursor(tqblankCursor).handle(); - } - else { - cursorHandle = TQCursor(tqbusyCursor).handle(); - } - XChangeActivePointerGrab( tqt_xdisplay(), GRABEVENTS, cursorHandle, CurrentTime); - if (trinity_desktop_lock_use_system_modal_dialogs) { - // Slight delay before screensaver resume to allow the dialog window to fully disappear - if (hackResumeTimer == NULL) { - hackResumeTimer = new TQTimer( this ); - connect( hackResumeTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(resumeUnforced()) ); - } - if (mResizingDesktopLock == false) { - hackResumeTimer->start( 10, TRUE ); - } - } - else { - resume( false ); - } - } else { - fakeFocusIn( mDialogs.first()->winId()); - currentDialog = dynamic_cast<TQDialog*>(mDialogs.first()); - } - return rt; + currentDialog=dlg; + dlg->adjustSize(); + + TQRect rect = dlg->geometry(); + rect.moveCenter(TDEGlobalSettings::desktopGeometry(TQCursor::pos()).center()); + dlg->move( rect.topLeft() ); + + if (mDialogs.isEmpty()) { + suspend(); + XChangeActivePointerGrab( tqt_xdisplay(), GRABEVENTS, TQCursor(tqarrowCursor).handle(), CurrentTime); + } + mDialogs.prepend( dlg ); + fakeFocusIn( dlg->winId()); + if (trinity_desktop_lock_use_system_modal_dialogs) { + if (backingPixmap.isNull()) { + setGeometry(0, 0, mRootWidth, mRootHeight); + erase(); + } + else { + bitBlt(this, 0, 0, &backingPixmap); + } + saverReadyIfNeeded(); + } + // dlg->exec may generate BadMatch errors, so make sure they are silently ignored + int (*oldHandler)(Display *, XErrorEvent *); + oldHandler = XSetErrorHandler(ignoreXError); + int rt = dlg->exec(); + XSetErrorHandler(oldHandler); + while (mDialogControlLock == true) { + usleep(100000); + } + currentDialog = NULL; + mDialogs.remove( dlg ); + if( mDialogs.isEmpty() ) { + HANDLE cursorHandle; + if (mHackActive) { + cursorHandle = TQCursor(tqblankCursor).handle(); + } + else { + cursorHandle = TQCursor(tqbusyCursor).handle(); + } + XChangeActivePointerGrab( tqt_xdisplay(), GRABEVENTS, cursorHandle, CurrentTime); + if (trinity_desktop_lock_use_system_modal_dialogs) { + // Slight delay before screensaver resume to allow the dialog window to fully disappear + if (hackResumeTimer == NULL) { + hackResumeTimer = new TQTimer( this ); + connect( hackResumeTimer, TQT_SIGNAL(timeout()), this, TQT_SLOT(resumeUnforced()) ); + } + if (mResizingDesktopLock == false) { + hackResumeTimer->start( 10, TRUE ); + } + } + else { + resume( false ); + } + } + else { + fakeFocusIn( mDialogs.first()->winId()); + currentDialog = dynamic_cast<TQDialog*>(mDialogs.first()); + } + return rt; } void LockProcess::slotForcePaintBackground() @@ -2096,36 +2096,38 @@ void LockProcess::slotPaintBackground(const TQPixmap &rpm) void LockProcess::preparePopup() { - TQWidget *dlg = (TQWidget *)sender(); - mDialogs.prepend( dlg ); - fakeFocusIn( dlg->winId() ); + TQWidget *dlg = (TQWidget *)sender(); + mDialogs.prepend( dlg ); + fakeFocusIn( dlg->winId() ); } void LockProcess::cleanupPopup() { - TQWidget *dlg = (TQWidget *)sender(); - mDialogs.remove( dlg ); - if ( mDialogs.isEmpty() ) { - fakeFocusIn( mDialogs.first()->winId() ); - } + TQWidget *dlg = (TQWidget *)sender(); + mDialogs.remove( dlg ); + if ( mDialogs.isEmpty() ) { + fakeFocusIn( mDialogs.first()->winId() ); + } } void LockProcess::doFunctionKeyBroadcast() { - // Provide a clean, pretty display switch by hiding the password dialog here - // This does NOT work with the SAK or system modal dialogs! - if ((!trinity_desktop_lock_use_system_modal_dialogs) && (!trinity_desktop_lock_use_sak)) { - mBusy=true; - TQTimer::singleShot(1000, this, TQT_SLOT(slotDeadTimePassed())); - if (mkeyCode == XKeysymToKeycode(tqt_xdisplay(), XF86XK_Display)) { - while (mDialogControlLock == true) usleep(100000); - mDialogControlLock = true; - currentDialog->close(); // DO NOT use closeCurrentWindow() here! - mDialogControlLock = false; - } - } - - DCOPRef ref( "*", "MainApplication-Interface"); - ref.send("sendFakeKey", DCOPArg(mkeyCode , "unsigned int")); + // Provide a clean, pretty display switch by hiding the password dialog here + // This does NOT work with the SAK or system modal dialogs! + if ((!trinity_desktop_lock_use_system_modal_dialogs) && (!trinity_desktop_lock_use_sak)) { + mBusy=true; + TQTimer::singleShot(1000, this, TQT_SLOT(slotDeadTimePassed())); + if (mkeyCode == XKeysymToKeycode(tqt_xdisplay(), XF86XK_Display)) { + while (mDialogControlLock == true) { + usleep(100000); + } + mDialogControlLock = true; + currentDialog->close(); // DO NOT use closeCurrentWindow() here! + mDialogControlLock = false; + } + } + + DCOPRef ref( "*", "MainApplication-Interface"); + ref.send("sendFakeKey", DCOPArg(mkeyCode , "unsigned int")); } //--------------------------------------------------------------------------- @@ -2134,203 +2136,203 @@ void LockProcess::doFunctionKeyBroadcast() { // bool LockProcess::x11Event(XEvent *event) { - // Allow certain very specific keypresses through - // Key: Reason: - // XF86Display You need to be able to see the screen when unlocking your computer - // XF86AudioMute Would be nice to be able to shut your computer up in an emergency while it is locked - // XF86AudioRaiseVolume Ditto - // XF86AudioLowerVolume Ditto - // XF86XK_PowerOff If someone has access to the power button, they can hard power off the machine anyway - // XF86XK_Sleep Ditto - // XF86XK_Suspend Ditto - // XF86XK_Hibernate Ditto - - //if ((event->type == KeyPress) || (event->type == KeyRelease)) { - if (event->type == KeyPress) { - // Multimedia keys - if ((event->xkey.keycode == XKeysymToKeycode(event->xkey.display, XF86XK_Display)) || \ - (event->xkey.keycode == XKeysymToKeycode(event->xkey.display, XF86XK_AudioMute)) || \ - (event->xkey.keycode == XKeysymToKeycode(event->xkey.display, XF86XK_AudioRaiseVolume)) || \ - (event->xkey.keycode == XKeysymToKeycode(event->xkey.display, XF86XK_AudioLowerVolume))) { - mkeyCode = event->xkey.keycode; - TQTimer::singleShot( 100, this, TQT_SLOT(doFunctionKeyBroadcast()) ); - return true; - } - // ACPI power keys - if ((event->xkey.keycode == XKeysymToKeycode(event->xkey.display, XF86XK_PowerOff)) || \ - (event->xkey.keycode == XKeysymToKeycode(event->xkey.display, XF86XK_Sleep)) || \ - (event->xkey.keycode == XKeysymToKeycode(event->xkey.display, XF86XK_Suspend)) || \ - (event->xkey.keycode == XKeysymToKeycode(event->xkey.display, XF86XK_Hibernate))) { - mkeyCode = event->xkey.keycode; - TQTimer::singleShot( 100, this, TQT_SLOT(doFunctionKeyBroadcast()) ); - return true; - } - } - - switch (event->type) - { - case ButtonPress: - case MotionNotify: - case ButtonRelease: - if( forwardVkbdEvent( event )) - return true; // filter out - // fall through - case KeyPress: - if ((mHackDelayStartupTimer) && (mHackDelayStartupTimer->isActive())) { - if (mHackStartupEnabled) mHackDelayStartupTimer->start(mHackDelayStartupTimeout, TRUE); - } - if (mBusy || !mDialogs.isEmpty()) - break; - mBusy = true; - if (trinity_desktop_lock_delay_screensaver_start) { - if (mLocked) { - ENABLE_CONTINUOUS_LOCKDLG_DISPLAY - if (mHackStartupEnabled) mHackDelayStartupTimer->start(mHackDelayStartupTimeout, TRUE); - } - if ((!mLocked) && (!mInSecureDialog)) - { - stopSaver(); - kapp->quit(); - } - if (mAutoLogout) // we need to restart the auto logout countdown - { - killTimer(mAutoLogoutTimerId); - mAutoLogoutTimerId = startTimer(mAutoLogoutTimeout); - } - } - else { - if (!mLocked || checkPass()) - { - mClosingWindows = true; - stopSaver(); - kapp->quit(); - } - else if (mAutoLogout) // we need to restart the auto logout countdown - { - killTimer(mAutoLogoutTimerId); - mAutoLogoutTimerId = startTimer(mAutoLogoutTimeout); - } - } - mBusy = false; - return true; - - case VisibilityNotify: - if( event->xvisibility.window == winId()) - { // mVisibility == false means the screensaver is not visible at all - // e.g. when switched to text console - mVisibility = !(event->xvisibility.state == VisibilityFullyObscured); - if(!mVisibility) { - mSuspendTimer.start(2000, true); - } - else - { - mSuspendTimer.stop(); - if (mResizingDesktopLock == false) { - if (trinity_desktop_lock_delay_screensaver_start && trinity_desktop_lock_forced && trinity_desktop_lock_use_system_modal_dialogs) { - // Do nothing + // Allow certain very specific keypresses through + // Key: Reason: + // XF86Display You need to be able to see the screen when unlocking your computer + // XF86AudioMute Would be nice to be able to shut your computer up in an emergency while it is locked + // XF86AudioRaiseVolume Ditto + // XF86AudioLowerVolume Ditto + // XF86XK_PowerOff If someone has access to the power button, they can hard power off the machine anyway + // XF86XK_Sleep Ditto + // XF86XK_Suspend Ditto + // XF86XK_Hibernate Ditto + + //if ((event->type == KeyPress) || (event->type == KeyRelease)) { + if (event->type == KeyPress) { + // Multimedia keys + if ((event->xkey.keycode == XKeysymToKeycode(event->xkey.display, XF86XK_Display)) || \ + (event->xkey.keycode == XKeysymToKeycode(event->xkey.display, XF86XK_AudioMute)) || \ + (event->xkey.keycode == XKeysymToKeycode(event->xkey.display, XF86XK_AudioRaiseVolume)) || \ + (event->xkey.keycode == XKeysymToKeycode(event->xkey.display, XF86XK_AudioLowerVolume))) { + mkeyCode = event->xkey.keycode; + TQTimer::singleShot( 100, this, TQT_SLOT(doFunctionKeyBroadcast()) ); + return true; + } + // ACPI power keys + if ((event->xkey.keycode == XKeysymToKeycode(event->xkey.display, XF86XK_PowerOff)) || \ + (event->xkey.keycode == XKeysymToKeycode(event->xkey.display, XF86XK_Sleep)) || \ + (event->xkey.keycode == XKeysymToKeycode(event->xkey.display, XF86XK_Suspend)) || \ + (event->xkey.keycode == XKeysymToKeycode(event->xkey.display, XF86XK_Hibernate))) { + mkeyCode = event->xkey.keycode; + TQTimer::singleShot( 100, this, TQT_SLOT(doFunctionKeyBroadcast()) ); + return true; + } + } + + switch (event->type) + { + case ButtonPress: + case MotionNotify: + case ButtonRelease: + if( forwardVkbdEvent( event )) { + return true; // filter out + } + // fall through + case KeyPress: + if ((mHackDelayStartupTimer) && (mHackDelayStartupTimer->isActive())) { + if (mHackStartupEnabled) mHackDelayStartupTimer->start(mHackDelayStartupTimeout, TRUE); + } + if (mBusy || !mDialogs.isEmpty()) { + break; + } + mBusy = true; + if (trinity_desktop_lock_delay_screensaver_start) { + if (mLocked) { + ENABLE_CONTINUOUS_LOCKDLG_DISPLAY + if (mHackStartupEnabled) { + mHackDelayStartupTimer->start(mHackDelayStartupTimeout, TRUE); + } + } + if ((!mLocked) && (!mInSecureDialog)) { + stopSaver(); + kapp->quit(); + } + if (mAutoLogout) { + // we need to restart the auto logout countdown + killTimer(mAutoLogoutTimerId); + mAutoLogoutTimerId = startTimer(mAutoLogoutTimeout); + } } else { - if (mHackStartupEnabled == true) { - resume( false ); + if (!mLocked || checkPass()) { + mClosingWindows = true; + stopSaver(); + kapp->quit(); + } + else if (mAutoLogout) { + // we need to restart the auto logout countdown + killTimer(mAutoLogoutTimerId); + mAutoLogoutTimerId = startTimer(mAutoLogoutTimeout); + } + } + mBusy = false; + return true; + + case VisibilityNotify: + if( event->xvisibility.window == winId()) { + // mVisibility == false means the screensaver is not visible at all + // e.g. when switched to text console + mVisibility = !(event->xvisibility.state == VisibilityFullyObscured); + if(!mVisibility) { + mSuspendTimer.start(2000, true); } else { - if (trinity_desktop_lock_use_system_modal_dialogs == true) { - ENABLE_CONTINUOUS_LOCKDLG_DISPLAY - if (mHackStartupEnabled) mHackDelayStartupTimer->start(mHackDelayStartupTimeout, TRUE); - } - else { - resume( false ); + mSuspendTimer.stop(); + if (mResizingDesktopLock == false) { + if (trinity_desktop_lock_delay_screensaver_start && trinity_desktop_lock_forced && trinity_desktop_lock_use_system_modal_dialogs) { + // Do nothing + } + else { + if (mHackStartupEnabled == true) { + resume( false ); + } + else { + if (trinity_desktop_lock_use_system_modal_dialogs == true) { + ENABLE_CONTINUOUS_LOCKDLG_DISPLAY + if (mHackStartupEnabled) mHackDelayStartupTimer->start(mHackDelayStartupTimeout, TRUE); + } + else { + resume( false ); + } + } + } } } + if (event->xvisibility.state != VisibilityUnobscured) { + stayOnTop(); + } } - } - } - if (event->xvisibility.state != VisibilityUnobscured) { - stayOnTop(); - } - } - break; - - case ConfigureNotify: // from SubstructureNotifyMask on the root window - if(event->xconfigure.event == tqt_xrootwin()) { - stayOnTop(); - } - for( TQValueList< VkbdWindow >::Iterator it = mVkbdWindows.begin(); - it != mVkbdWindows.end(); - ++it ) { - if( (*it).id == event->xconfigure.window ) { - (*it).rect = TQRect( event->xconfigure.x, event->xconfigure.y, - event->xconfigure.width, event->xconfigure.height ); - break; - } - } - break; - case MapNotify: // from SubstructureNotifyMask on the root window - windowAdded( event->xmap.window, false ); - if( event->xmap.event == tqt_xrootwin()) - stayOnTop(); - break; - case DestroyNotify: - for( TQValueList< VkbdWindow >::Iterator it = mVkbdWindows.begin(); - it != mVkbdWindows.end(); - ++it ) - if( (*it).id == event->xdestroywindow.window ) { - mVkbdWindows.remove( it ); - break; - } - break; - } - - // We have grab with the grab window being the root window. - // This results in key events being sent to the root window, - // but they should be sent to the dialog if it's visible. - // It could be solved by setFocus() call, but that would mess - // the focus after this process exits. - // Qt seems to be quite hard to persuade to redirect the event, - // so let's simply dupe it with correct destination window, - // and ignore the original one. - if(!mDialogs.isEmpty() && ( event->type == KeyPress || event->type == KeyRelease) - && event->xkey.window != mDialogs.first()->winId()) - { - XEvent ev2 = *event; - ev2.xkey.window = ev2.xkey.subwindow = mDialogs.first()->winId(); - tqApp->x11ProcessEvent( &ev2 ); - return true; - } - - return false; + break; + + case ConfigureNotify: // from SubstructureNotifyMask on the root window + if(event->xconfigure.event == tqt_xrootwin()) { + stayOnTop(); + } + for( TQValueList< VkbdWindow >::Iterator it = mVkbdWindows.begin(); + it != mVkbdWindows.end(); + ++it ) { + if( (*it).id == event->xconfigure.window ) { + (*it).rect = TQRect( event->xconfigure.x, event->xconfigure.y, + event->xconfigure.width, event->xconfigure.height ); + break; + } + } + break; + case MapNotify: // from SubstructureNotifyMask on the root window + windowAdded( event->xmap.window, false ); + if( event->xmap.event == tqt_xrootwin()) { + stayOnTop(); + } + break; + case DestroyNotify: + for( TQValueList< VkbdWindow >::Iterator it = mVkbdWindows.begin(); it != mVkbdWindows.end(); ++it ) { + if( (*it).id == event->xdestroywindow.window ) { + mVkbdWindows.remove( it ); + break; + } + } + break; + } + + // We have grab with the grab window being the root window. + // This results in key events being sent to the root window, + // but they should be sent to the dialog if it's visible. + // It could be solved by setFocus() call, but that would mess + // the focus after this process exits. + // Qt seems to be quite hard to persuade to redirect the event, + // so let's simply dupe it with correct destination window, + // and ignore the original one. + if(!mDialogs.isEmpty() && ( event->type == KeyPress || event->type == KeyRelease) + && event->xkey.window != mDialogs.first()->winId()) { + XEvent ev2 = *event; + ev2.xkey.window = ev2.xkey.subwindow = mDialogs.first()->winId(); + tqApp->x11ProcessEvent( &ev2 ); + return true; + } + + return false; } void LockProcess::stayOnTop() { - if(!mDialogs.isEmpty() || !mVkbdWindows.isEmpty()) - { - // this restacking is written in a way so that - // if the stacking positions actually don't change, - // all restacking operations will be no-op, - // and no ConfigureNotify will be generated, - // thus avoiding possible infinite loops - if( !mVkbdWindows.isEmpty()) - XRaiseWindow( tqt_xdisplay(), mVkbdWindows.first().id ); - else - XRaiseWindow( tqt_xdisplay(), mDialogs.first()->winId()); // raise topmost - // and stack others below it - Window* stack = new Window[ mDialogs.count() + mVkbdWindows.count() + 1 ]; - int count = 0; - for( TQValueList< VkbdWindow >::ConstIterator it = mVkbdWindows.begin(); - it != mVkbdWindows.end(); - ++it ) - stack[ count++ ] = (*it).id; - for( TQValueList< TQWidget* >::ConstIterator it = mDialogs.begin(); - it != mDialogs.end(); - ++it ) - stack[ count++ ] = (*it)->winId(); - stack[ count++ ] = winId(); - XRestackWindows( x11Display(), stack, count ); - delete[] stack; - } - else - XRaiseWindow(tqt_xdisplay(), winId()); + if(!mDialogs.isEmpty() || !mVkbdWindows.isEmpty()) { + // this restacking is written in a way so that + // if the stacking positions actually don't change, + // all restacking operations will be no-op, + // and no ConfigureNotify will be generated, + // thus avoiding possible infinite loops + if( !mVkbdWindows.isEmpty()) { + XRaiseWindow( tqt_xdisplay(), mVkbdWindows.first().id ); + } + else { + XRaiseWindow( tqt_xdisplay(), mDialogs.first()->winId()); // raise topmost + } + // and stack others below it + Window* stack = new Window[ mDialogs.count() + mVkbdWindows.count() + 1 ]; + int count = 0; + for( TQValueList< VkbdWindow >::ConstIterator it = mVkbdWindows.begin(); it != mVkbdWindows.end(); ++it ) { + stack[ count++ ] = (*it).id; + } + for( TQValueList< TQWidget* >::ConstIterator it = mDialogs.begin(); it != mDialogs.end(); ++it ) { + stack[ count++ ] = (*it)->winId(); + } + stack[ count++ ] = winId(); + XRestackWindows( x11Display(), stack, count ); + delete[] stack; + } + else { + XRaiseWindow(tqt_xdisplay(), winId()); + } } void LockProcess::checkDPMSActive() @@ -2361,233 +2363,245 @@ void LockProcess::checkDPMSActive() static enum { Unknown, Yes, No } can_do_xf86_lock = Unknown; void LockProcess::lockXF86() { - if( can_do_xf86_lock == Unknown ) - { - int major, minor; - if( XF86MiscQueryVersion( tqt_xdisplay(), &major, &minor ) - && major >= 0 && minor >= 5 ) - can_do_xf86_lock = Yes; - else - can_do_xf86_lock = No; - } - if( can_do_xf86_lock != Yes ) - return; - if( mRestoreXF86Lock ) - return; - if( XF86MiscSetGrabKeysState( tqt_xdisplay(), False ) != MiscExtGrabStateSuccess ) - return; - // success - mRestoreXF86Lock = true; + if( can_do_xf86_lock == Unknown ) { + int major, minor; + if( XF86MiscQueryVersion( tqt_xdisplay(), &major, &minor ) && major >= 0 && minor >= 5 ) { + can_do_xf86_lock = Yes; + } + else { + can_do_xf86_lock = No; + } + } + if( can_do_xf86_lock != Yes ) { + return; + } + if( mRestoreXF86Lock ) { + return; + } + if( XF86MiscSetGrabKeysState( tqt_xdisplay(), False ) != MiscExtGrabStateSuccess ) { + return; + } + // success + mRestoreXF86Lock = true; } void LockProcess::unlockXF86() { - if( can_do_xf86_lock != Yes ) - return; - if( !mRestoreXF86Lock ) - return; - XF86MiscSetGrabKeysState( tqt_xdisplay(), True ); - mRestoreXF86Lock = false; + if( can_do_xf86_lock != Yes ) { + return; + } + if( !mRestoreXF86Lock ) { + return; + } + XF86MiscSetGrabKeysState( tqt_xdisplay(), True ); + mRestoreXF86Lock = false; } #else void LockProcess::lockXF86() { + // } void LockProcess::unlockXF86() { + // } #endif void LockProcess::msgBox( TQMessageBox::Icon type, const TQString &txt ) { - TQDialog box( 0, "messagebox", true, (trinity_desktop_lock_use_system_modal_dialogs?((WFlags)WStyle_StaysOnTop):((WFlags)WX11BypassWM)) ); - if (trinity_desktop_lock_use_system_modal_dialogs) { - // Signal that we do not want any window controls to be shown at all - XChangeProperty(tqt_xdisplay(), box.winId(), kde_wm_system_modal_notification, XA_INTEGER, 32, PropModeReplace, (unsigned char *) "TRUE", 1L); - } - box.setCaption(i18n("Authentication Subsystem Notice")); - TQFrame *winFrame = new TQFrame( &box ); - if (trinity_desktop_lock_use_system_modal_dialogs) - winFrame->setFrameStyle( TQFrame::NoFrame ); - else - winFrame->setFrameStyle( TQFrame::WinPanel | TQFrame::Raised ); - winFrame->setLineWidth( 2 ); - TQLabel *label1 = new TQLabel( winFrame ); - label1->setPixmap( TQMessageBox::standardIcon( type ) ); - TQLabel *label2 = new TQLabel( txt, winFrame ); - KPushButton *button = new KPushButton( KStdGuiItem::ok(), winFrame ); - button->setDefault( true ); - button->setSizePolicy( TQSizePolicy( TQSizePolicy::Preferred, TQSizePolicy::Preferred ) ); - connect( button, TQT_SIGNAL( clicked() ), &box, TQT_SLOT( accept() ) ); - - TQVBoxLayout *vbox = new TQVBoxLayout( &box ); - vbox->addWidget( winFrame ); - TQGridLayout *grid = new TQGridLayout( winFrame, 2, 2, 10 ); - grid->addWidget( label1, 0, 0, Qt::AlignCenter ); - grid->addWidget( label2, 0, 1, Qt::AlignCenter ); - grid->addMultiCellWidget( button, 1,1, 0,1, Qt::AlignCenter ); - - execDialog( &box ); + TQDialog box( 0, "messagebox", true, (trinity_desktop_lock_use_system_modal_dialogs?((WFlags)WStyle_StaysOnTop):((WFlags)WX11BypassWM)) ); + if (trinity_desktop_lock_use_system_modal_dialogs) { + // Signal that we do not want any window controls to be shown at all + XChangeProperty(tqt_xdisplay(), box.winId(), kde_wm_system_modal_notification, XA_INTEGER, 32, PropModeReplace, (unsigned char *) "TRUE", 1L); + } + box.setCaption(i18n("Authentication Subsystem Notice")); + TQFrame *winFrame = new TQFrame( &box ); + if (trinity_desktop_lock_use_system_modal_dialogs) { + winFrame->setFrameStyle( TQFrame::NoFrame ); + } + else { + winFrame->setFrameStyle( TQFrame::WinPanel | TQFrame::Raised ); + } + winFrame->setLineWidth( 2 ); + TQLabel *label1 = new TQLabel( winFrame ); + label1->setPixmap( TQMessageBox::standardIcon( type ) ); + TQLabel *label2 = new TQLabel( txt, winFrame ); + KPushButton *button = new KPushButton( KStdGuiItem::ok(), winFrame ); + button->setDefault( true ); + button->setSizePolicy( TQSizePolicy( TQSizePolicy::Preferred, TQSizePolicy::Preferred ) ); + connect( button, TQT_SIGNAL( clicked() ), &box, TQT_SLOT( accept() ) ); + + TQVBoxLayout *vbox = new TQVBoxLayout( &box ); + vbox->addWidget( winFrame ); + TQGridLayout *grid = new TQGridLayout( winFrame, 2, 2, 10 ); + grid->addWidget( label1, 0, 0, Qt::AlignCenter ); + grid->addWidget( label2, 0, 1, Qt::AlignCenter ); + grid->addMultiCellWidget( button, 1,1, 0,1, Qt::AlignCenter ); + + execDialog( &box ); } static int run_vkbd = -1; void LockProcess::showVkbd() { - if( run_vkbd == - 1 ) { + if( run_vkbd == - 1 ) { #ifdef WITH_HAL - int status = system( "hal-find-by-property --key system.formfactor.subtype --string tabletpc" ); -// status = 0; // enable for testing - run_vkbd = ( WIFEXITED( status ) && WEXITSTATUS( status ) == 0 - && !TDEStandardDirs::findExe( "xvkbd" ).isEmpty()) ? 1 : 0; + int status = system( "hal-find-by-property --key system.formfactor.subtype --string tabletpc" ); +// status = 0; // enable for testing + run_vkbd = ( WIFEXITED( status ) && WEXITSTATUS( status ) == 0 && !TDEStandardDirs::findExe( "xvkbd" ).isEmpty()) ? 1 : 0; #else // WITH_HAL - run_vkbd = (!TDEStandardDirs::findExe( "xvkbd" ).isEmpty()); + run_vkbd = (!TDEStandardDirs::findExe( "xvkbd" ).isEmpty()); #endif // WITH_HAL - } - if( run_vkbd ) { - mVkbdWindows.clear(); - mVkbdLastEventWindow = None; - mKWinModule = new KWinModule( NULL, KWinModule::INFO_WINDOWS ); - connect( mKWinModule, TQT_SIGNAL( windowAdded( WId )), TQT_SLOT( windowAdded( WId ))); - mVkbdProcess = new TDEProcess; - *mVkbdProcess << "xvkbd" << "-compact" << "-geometry" << "-0-0" << "-xdm"; - mVkbdProcess->start(); - } + } + if( run_vkbd ) { + mVkbdWindows.clear(); + mVkbdLastEventWindow = None; + mKWinModule = new KWinModule( NULL, KWinModule::INFO_WINDOWS ); + connect( mKWinModule, TQT_SIGNAL( windowAdded( WId )), TQT_SLOT( windowAdded( WId ))); + mVkbdProcess = new TDEProcess; + *mVkbdProcess << "xvkbd" << "-compact" << "-geometry" << "-0-0" << "-xdm"; + mVkbdProcess->start(); + } } void LockProcess::hideVkbd() { - if( mVkbdProcess != NULL ) { - mVkbdProcess->kill(); - delete mVkbdProcess; - mVkbdProcess = NULL; - delete mKWinModule; - mKWinModule = NULL; - mVkbdWindows.clear(); - } + if( mVkbdProcess != NULL ) { + mVkbdProcess->kill(); + delete mVkbdProcess; + mVkbdProcess = NULL; + delete mKWinModule; + mKWinModule = NULL; + mVkbdWindows.clear(); + } } void LockProcess::windowAdded( WId w ) { - windowAdded( w, true ); + windowAdded( w, true ); } void LockProcess::windowAdded( WId w, bool managed ) { - // KWin::windowInfo may generate BadWindow errors, so make sure they are silently ignored - int (*oldHandler)(Display *, XErrorEvent *); - oldHandler = XSetErrorHandler(ignoreXError); - KWin::WindowInfo info = KWin::windowInfo( w, 0, NET::WM2WindowClass ); - XSetErrorHandler(oldHandler); - - if( info.windowClassClass().lower() != "xvkbd" ) - return; - // Unmanaged windows (i.e. popups) don't currently work anyway, since they - // don't have WM_CLASS set anyway. I could perhaps try tricks with X id - // ranges if really needed. - if( managed ) { - // withdraw the window, wait for it to be withdrawn, reparent it directly - // to root at the right position - XWithdrawWindow( tqt_xdisplay(), w, tqt_xscreen()); - for(;;) { - Atom type; - int format; - unsigned long length, after; - unsigned char *data; - int r = XGetWindowProperty( tqt_xdisplay(), w, tqt_wm_state, 0, 2, - false, AnyPropertyType, &type, &format, - &length, &after, &data ); - bool withdrawn = true; - if ( r == Success && data && format == 32 ) { - TQ_UINT32 *wstate = (TQ_UINT32*)data; - withdrawn = (*wstate == WithdrawnState ); - XFree( (char *)data ); - } - if( withdrawn ) - break; - } - } - XSelectInput( tqt_xdisplay(), w, StructureNotifyMask ); - XWindowAttributes attr_geom; - if( !XGetWindowAttributes( tqt_xdisplay(), w, &attr_geom )) - return; - int x = XDisplayWidth( tqt_xdisplay(), tqt_xscreen()) - attr_geom.width; - int y = XDisplayHeight( tqt_xdisplay(), tqt_xscreen()) - attr_geom.height; - if( managed ) { - XSetWindowAttributes attr; - if (!trinity_desktop_lock_use_system_modal_dialogs) { - attr.override_redirect = True; - XChangeWindowAttributes( tqt_xdisplay(), w, CWOverrideRedirect, &attr ); - } - XReparentWindow( tqt_xdisplay(), w, tqt_xrootwin(), x, y ); - XMapWindow( tqt_xdisplay(), w ); - } - VkbdWindow data; - data.id = w; - data.rect = TQRect( x, y, attr_geom.width, attr_geom.height ); - mVkbdWindows.prepend( data ); + // KWin::windowInfo may generate BadWindow errors, so make sure they are silently ignored + int (*oldHandler)(Display *, XErrorEvent *); + oldHandler = XSetErrorHandler(ignoreXError); + KWin::WindowInfo info = KWin::windowInfo( w, 0, NET::WM2WindowClass ); + XSetErrorHandler(oldHandler); + + if( info.windowClassClass().lower() != "xvkbd" ) { + return; + } + // Unmanaged windows (i.e. popups) don't currently work anyway, since they + // don't have WM_CLASS set anyway. I could perhaps try tricks with X id + // ranges if really needed. + if( managed ) { + // withdraw the window, wait for it to be withdrawn, reparent it directly + // to root at the right position + XWithdrawWindow( tqt_xdisplay(), w, tqt_xscreen()); + for(;;) { + Atom type; + int format; + unsigned long length, after; + unsigned char *data; + int r = XGetWindowProperty( tqt_xdisplay(), w, tqt_wm_state, 0, 2, + false, AnyPropertyType, &type, &format, + &length, &after, &data ); + bool withdrawn = true; + if ( r == Success && data && format == 32 ) { + TQ_UINT32 *wstate = (TQ_UINT32*)data; + withdrawn = (*wstate == WithdrawnState ); + XFree( (char *)data ); + } + if( withdrawn ) { + break; + } + } + } + XSelectInput( tqt_xdisplay(), w, StructureNotifyMask ); + XWindowAttributes attr_geom; + if( !XGetWindowAttributes( tqt_xdisplay(), w, &attr_geom )) { + return; + } + int x = XDisplayWidth( tqt_xdisplay(), tqt_xscreen()) - attr_geom.width; + int y = XDisplayHeight( tqt_xdisplay(), tqt_xscreen()) - attr_geom.height; + if( managed ) { + XSetWindowAttributes attr; + if (!trinity_desktop_lock_use_system_modal_dialogs) { + attr.override_redirect = True; + XChangeWindowAttributes( tqt_xdisplay(), w, CWOverrideRedirect, &attr ); + } + XReparentWindow( tqt_xdisplay(), w, tqt_xrootwin(), x, y ); + XMapWindow( tqt_xdisplay(), w ); + } + VkbdWindow data; + data.id = w; + data.rect = TQRect( x, y, attr_geom.width, attr_geom.height ); + mVkbdWindows.prepend( data ); } bool LockProcess::forwardVkbdEvent( XEvent* event ) { - if( mVkbdProcess == NULL ) - return false; - TQPoint pos; - Time time; - switch( event->type ) - { - case ButtonPress: - case ButtonRelease: - pos = TQPoint( event->xbutton.x, event->xbutton.y ); - time = event->xbutton.time; - break; - case MotionNotify: - pos = TQPoint( event->xmotion.x, event->xmotion.y ); - time = event->xmotion.time; - break; - default: - return false; - } - // vkbd windows are kept topmost, so just find the first one in the position - for( TQValueList< VkbdWindow >::ConstIterator it = mVkbdWindows.begin(); - it != mVkbdWindows.end(); - ++it ) { - if( TQT_TQRECT_OBJECT((*it).rect).contains( pos )) { - // Find the subwindow where the event should actually go. - // Not exactly cheap in the number of X roundtrips but oh well. - Window window = (*it).id; - Window root, child; - int root_x, root_y, x, y; - unsigned int mask; - for(;;) { - if( !XQueryPointer( tqt_xdisplay(), window, &root, &child, &root_x, &root_y, &x, &y, &mask )) - return false; - if( child == None ) - break; - window = child; - } - switch( event->type ) - { - case ButtonPress: - case ButtonRelease: - event->xbutton.x = x; - event->xbutton.y = y; - event->xbutton.subwindow = None; - break; - case MotionNotify: - event->xmotion.x = x; - event->xmotion.y = y; - event->xmotion.subwindow = None; - break; - } - event->xany.window = window; - sendVkbdFocusInOut( window, time ); - XSendEvent( tqt_xdisplay(), window, False, 0, event ); - return true; - } - } - sendVkbdFocusInOut( None, time ); - return false; + if( mVkbdProcess == NULL ) { + return false; + } + TQPoint pos; + Time time; + switch( event->type ) + { + case ButtonPress: + case ButtonRelease: + pos = TQPoint( event->xbutton.x, event->xbutton.y ); + time = event->xbutton.time; + break; + case MotionNotify: + pos = TQPoint( event->xmotion.x, event->xmotion.y ); + time = event->xmotion.time; + break; + default: + return false; + } + // vkbd windows are kept topmost, so just find the first one in the position + for( TQValueList< VkbdWindow >::ConstIterator it = mVkbdWindows.begin(); it != mVkbdWindows.end(); ++it ) { + if( TQT_TQRECT_OBJECT((*it).rect).contains( pos )) { + // Find the subwindow where the event should actually go. + // Not exactly cheap in the number of X roundtrips but oh well. + Window window = (*it).id; + Window root, child; + int root_x, root_y, x, y; + unsigned int mask; + for(;;) { + if( !XQueryPointer( tqt_xdisplay(), window, &root, &child, &root_x, &root_y, &x, &y, &mask )) { + return false; + } + if( child == None ) { + break; + } + window = child; + } + switch( event->type ) + { + case ButtonPress: + case ButtonRelease: + event->xbutton.x = x; + event->xbutton.y = y; + event->xbutton.subwindow = None; + break; + case MotionNotify: + event->xmotion.x = x; + event->xmotion.y = y; + event->xmotion.subwindow = None; + break; + } + event->xany.window = window; + sendVkbdFocusInOut( window, time ); + XSendEvent( tqt_xdisplay(), window, False, 0, event ); + return true; + } + } + sendVkbdFocusInOut( None, time ); + return false; } // Fake EnterNotify/LeaveNotify events as the mouse moves. They're not sent by X @@ -2595,47 +2609,48 @@ bool LockProcess::forwardVkbdEvent( XEvent* event ) // not needed otherwise it seems). void LockProcess::sendVkbdFocusInOut( WId window, Time t ) { - if( mVkbdLastEventWindow == window ) - return; - if( mVkbdLastEventWindow != None ) { - XEvent e; - e.xcrossing.type = LeaveNotify; - e.xcrossing.display = tqt_xdisplay(); - e.xcrossing.window = mVkbdLastEventWindow; - e.xcrossing.root = tqt_xrootwin(); - e.xcrossing.subwindow = None; - e.xcrossing.time = t; - e.xcrossing.x = 0; - e.xcrossing.y = 0; - e.xcrossing.x_root = -1; - e.xcrossing.y_root = -1; - e.xcrossing.mode = NotifyNormal; - e.xcrossing.detail = NotifyAncestor; - e.xcrossing.same_screen = True; - e.xcrossing.focus = False; - e.xcrossing.state = 0; - XSendEvent( tqt_xdisplay(), mVkbdLastEventWindow, False, 0, &e ); - } - mVkbdLastEventWindow = window; - if( mVkbdLastEventWindow != None ) { - XEvent e; - e.xcrossing.type = EnterNotify; - e.xcrossing.display = tqt_xdisplay(); - e.xcrossing.window = mVkbdLastEventWindow; - e.xcrossing.root = tqt_xrootwin(); - e.xcrossing.subwindow = None; - e.xcrossing.time = t; - e.xcrossing.x = 0; - e.xcrossing.y = 0; - e.xcrossing.x_root = 0; - e.xcrossing.y_root = 0; - e.xcrossing.mode = NotifyNormal; - e.xcrossing.detail = NotifyAncestor; - e.xcrossing.same_screen = True; - e.xcrossing.focus = False; - e.xcrossing.state = 0; - XSendEvent( tqt_xdisplay(), mVkbdLastEventWindow, False, 0, &e ); - } + if( mVkbdLastEventWindow == window ) { + return; + } + if( mVkbdLastEventWindow != None ) { + XEvent e; + e.xcrossing.type = LeaveNotify; + e.xcrossing.display = tqt_xdisplay(); + e.xcrossing.window = mVkbdLastEventWindow; + e.xcrossing.root = tqt_xrootwin(); + e.xcrossing.subwindow = None; + e.xcrossing.time = t; + e.xcrossing.x = 0; + e.xcrossing.y = 0; + e.xcrossing.x_root = -1; + e.xcrossing.y_root = -1; + e.xcrossing.mode = NotifyNormal; + e.xcrossing.detail = NotifyAncestor; + e.xcrossing.same_screen = True; + e.xcrossing.focus = False; + e.xcrossing.state = 0; + XSendEvent( tqt_xdisplay(), mVkbdLastEventWindow, False, 0, &e ); + } + mVkbdLastEventWindow = window; + if( mVkbdLastEventWindow != None ) { + XEvent e; + e.xcrossing.type = EnterNotify; + e.xcrossing.display = tqt_xdisplay(); + e.xcrossing.window = mVkbdLastEventWindow; + e.xcrossing.root = tqt_xrootwin(); + e.xcrossing.subwindow = None; + e.xcrossing.time = t; + e.xcrossing.x = 0; + e.xcrossing.y = 0; + e.xcrossing.x_root = 0; + e.xcrossing.y_root = 0; + e.xcrossing.mode = NotifyNormal; + e.xcrossing.detail = NotifyAncestor; + e.xcrossing.same_screen = True; + e.xcrossing.focus = False; + e.xcrossing.state = 0; + XSendEvent( tqt_xdisplay(), mVkbdLastEventWindow, False, 0, &e ); + } } void LockProcess::slotMouseActivity(XEvent *event) @@ -2803,6 +2818,101 @@ void LockProcess::processInputPipeCommand(TQString inputcommand) { } } +void LockProcess::cryptographicCardInserted(TDECryptographicCardDevice* cdevice) { + TQString login_name = TQString::null; + X509CertificatePtrList certList = cdevice->cardX509Certificates(); + if (certList.count() > 0) { + KSSLCertificate* card_cert = NULL; + card_cert = KSSLCertificate::fromX509(certList[0]); + TQStringList cert_subject_parts = TQStringList::split("/", card_cert->getSubject(), false); + for (TQStringList::Iterator it = cert_subject_parts.begin(); it != cert_subject_parts.end(); ++it ) { + TQString lcpart = (*it).lower(); + if (lcpart.startsWith("cn=")) { + login_name = lcpart.right(lcpart.length() - strlen("cn=")); + } + } + delete card_cert; + } + + if (login_name != "") { + KUser user; + if (login_name == user.loginName()) { + // Pass login to the PAM stack... + m_loginCardDevice = cdevice; + if (dynamic_cast<SAKDlg*>(currentDialog)) { + dynamic_cast<SAKDlg*>(currentDialog)->closeDialogForced(); + TQTimer::singleShot(0, this, SLOT(signalPassDlgToAttemptCardLogin())); + } + else if (dynamic_cast<SecureDlg*>(currentDialog)) { + dynamic_cast<SecureDlg*>(currentDialog)->closeDialogForced(); + TQTimer::singleShot(0, this, SLOT(signalPassDlgToAttemptCardLogin())); + } + else if (dynamic_cast<PasswordDlg*>(currentDialog)) { + signalPassDlgToAttemptCardLogin(); + } + } + } +} + +void LockProcess::cryptographicCardRemoved(TDECryptographicCardDevice* cdevice) { + PasswordDlg* passDlg = dynamic_cast<PasswordDlg*>(currentDialog); + if (passDlg) { + passDlg->resetCardLogin(); + } + else { + m_loginCardDevice = NULL; + TQTimer::singleShot(0, this, SLOT(signalPassDlgToAttemptCardAbort())); + } +} + +void LockProcess::signalPassDlgToAttemptCardLogin() { + PasswordDlg* passDlg = dynamic_cast<PasswordDlg*>(currentDialog); + if (passDlg && m_loginCardDevice) { + passDlg->attemptCardLogin(); + } + else { + if (currentDialog && m_loginCardDevice) { + // Try again later + TQTimer::singleShot(0, this, SLOT(signalPassDlgToAttemptCardLogin())); + } + } +} + +void LockProcess::signalPassDlgToAttemptCardAbort() { + PasswordDlg* passDlg = dynamic_cast<PasswordDlg*>(currentDialog); + if (passDlg) { + passDlg->resetCardLogin(); + } + else { + if (currentDialog) { + // Try again later + TQTimer::singleShot(0, this, SLOT(signalPassDlgToAttemptCardAbort())); + } + } +} + +void LockProcess::cryptographicCardPinRequested(TQString prompt, TDECryptographicCardDevice* cdevice) { + TQCString password; + const char * pin_entry; + + QueryDlg qryDlg(this); + qryDlg.updateLabel(prompt); + qryDlg.setUnlockIcon(); + mForceReject = false; + execDialog(&qryDlg); + if (mForceReject == false) { + pin_entry = qryDlg.getEntry(); + cdevice->setProvidedPin(pin_entry); + } + else { + cdevice->setProvidedPin(TQString::null); + } +} + +TDECryptographicCardDevice* LockProcess::cryptographicCardDevice() { + return m_loginCardDevice; +} + void LockProcess::fullyOnline() { if (!mFullyOnlineSent) { if (kdesktop_pid > 0) { @@ -2868,15 +2978,15 @@ void ControlPipeHandlerObject::run(void) { mkdir(FIFO_DIR,0644); mknod(fifo_file, S_IFIFO|0644, 0); chmod(fifo_file, 0644); - + mParent->mPipe_fd = open(fifo_file, O_RDONLY | O_NONBLOCK); if (mParent->mPipe_fd > -1) { mParent->mPipeOpen = true; } - + mknod(fifo_file_out, S_IFIFO|0600, 0); chmod(fifo_file_out, 0600); - + mParent->mPipe_fd_out = open(fifo_file_out, O_RDWR | O_NONBLOCK); if (mParent->mPipe_fd_out > -1) { mParent->mPipeOpen_out = true; diff --git a/kdesktop/lock/lockprocess.h b/kdesktop/lock/lockprocess.h index 34e3da8e0..4dc2d8bab 100644 --- a/kdesktop/lock/lockprocess.h +++ b/kdesktop/lock/lockprocess.h @@ -1,15 +1,20 @@ //=========================================================================== // -// This file is part of the KDE project +// This file is part of the TDE project // // Copyright (c) 1999 Martin R. Jones <mjones@kde.org> // Copyright (c) 2003 Oswald Buddenhagen <ossi@kde.org> -// Copyright (c) 2010-2013 Timothy Pearson <kb9vqf@pearsoncomputing.net> +// Copyright (c) 2010 - 2015 Timothy Pearson <kb9vqf@pearsoncomputing.net> // #ifndef __LOCKENG_H__ #define __LOCKENG_H__ +#include <ksslcertificate.h> + +#include <tdehardwaredevices.h> +#include <tdecryptographiccarddevice.h> + #include <kgreeterplugin.h> #include <kprocess.h> @@ -32,8 +37,8 @@ class KSMModalDialog; class LockProcess; struct GreeterPluginHandle { - KLibrary *library; - kgreeterplugin_info *info; + KLibrary *library; + kgreeterplugin_info *info; }; #define FIFO_DIR "/tmp/tdesocket-global" @@ -57,7 +62,7 @@ class ControlPipeHandlerObject : public TQObject public slots: void run(); void terminateThread(); - + signals: void processCommand(TQString); @@ -75,195 +80,202 @@ class ControlPipeHandlerObject : public TQObject // Screen saver handling process. Handles screensaver window, // starting screensaver hacks, and password entry. // -class LockProcess - : public TQWidget +class LockProcess : public TQWidget { - Q_OBJECT -public: - LockProcess(); - ~LockProcess(); - - void init(bool child_saver = false, bool useBlankOnly = false); - - bool lock(); - - bool defaultSave(); - - bool dontLock(); - - bool runSecureDialog(); - bool inSecureDialog(); - - void setChildren(TQValueList<int> children) { child_sockets = children; } - void setParent(int fd) { mParent = fd; } - - void msgBox( TQMessageBox::Icon type, const TQString &txt ); - int execDialog( TQDialog* dlg ); - -signals: - void terminateHelperThread(); - -public slots: - void quitSaver(); - void preparePopup(); - void cleanupPopup(); - void desktopResized(); - void doDesktopResizeFinish(); - void doFunctionKeyBroadcast(); - void slotPaintBackground(const TQPixmap &pm); - void slotForcePaintBackground(); - -protected: - virtual bool x11Event(XEvent *); - virtual void timerEvent(TQTimerEvent *); - virtual void resizeEvent(TQResizeEvent *); - -private slots: - void hackExited(TDEProcess *); - void signalPipeSignal(); - bool startLock(); - void suspend(); - void checkDPMSActive(); - void slotDeadTimePassed(); - void windowAdded( WId ); - void resumeUnforced(); - void displayLockDialogIfNeeded(); - void closeDialogAndStartHack(); - bool closeCurrentWindow(); - void repaintRootWindowIfNeeded(); - void startSecureDialog(); - void slotMouseActivity(XEvent *event); - void processInputPipeCommand(TQString command); - -private: - void configure(); - void readSaver(); - void createSaverWindow(); - void hideSaverWindow(); - void saveVRoot(); - void setVRoot(Window win, Window rw); - void removeVRoot(Window win); - void setTransparentBackgroundARGB(); - bool grabKeyboard(); - bool grabMouse(); - bool grabInput(); - void ungrabInput(); - void cantLock(const TQString &reason); - bool startSaver(bool notify_ready = false); - void stopSaver(); - bool startHack(); - void stopHack(); - void setupSignals(); - bool checkPass(); - void stayOnTop(); - void lockXF86(); - void unlockXF86(); - void showVkbd(); - void hideVkbd(); - void saverReady(); - void saverReadyIfNeeded(); - bool forwardVkbdEvent( XEvent* event ); - void sendVkbdFocusInOut( WId window, Time t ); - void windowAdded( WId window, bool managed ); - void resume( bool force ); - static TQVariant getConf(void *ctx, const char *key, const TQVariant &dflt); - void generateBackingImages(); - void fullyOnline(); - - bool mLocked; - int mLockGrace; - int mPriority; - bool mBusy; - TDEProcess mHackProc; - int mRootWidth; - int mRootHeight; - TQString mSaverExec; - TQString mSaver; - bool mOpenGLVisual; - bool child_saver; - TQValueList<int> child_sockets; - int mParent; - bool mUseBlankOnly; - bool mShowLockDateTime; - bool mSuspended; - TQTimer mSuspendTimer; - bool mVisibility; - TQTimer mCheckDPMS; - TQValueStack< TQWidget* > mDialogs; - bool mRestoreXF86Lock; - bool mForbidden; - TQStringList mPlugins, mPluginOptions; - TQString mMethod; - GreeterPluginHandle greetPlugin; - TQPixmap mSavedScreen; - int mAutoLogoutTimerId; - int mAutoLogoutTimeout; - bool mAutoLogout; - - TQTimer *resizeTimer; - unsigned int mkeyCode; - - TQTimer *hackResumeTimer; - - TDEProcess* mVkbdProcess; - KWinModule* mKWinModule; - struct VkbdWindow - { - WId id; - TQRect rect; - }; - TQValueList< VkbdWindow > mVkbdWindows; - WId mVkbdLastEventWindow; - - bool mPipeOpen; - int mPipe_fd; - bool mPipeOpen_out; - int mPipe_fd_out; - - bool mInfoMessageDisplayed; - bool mDialogControlLock; - bool mForceReject; - TQDialog *currentDialog; - - TQTimer* mEnsureScreenHiddenTimer; - TQTimer* mForceContinualLockDisplayTimer; - TQTimer* mEnsureVRootWindowSecurityTimer; - TQTimer* mHackDelayStartupTimer; - - int mHackDelayStartupTimeout; - bool mHackStartupEnabled; - bool mOverrideHackStartupEnabled; - bool mResizingDesktopLock; - bool mFullyOnlineSent; - - bool mClosingWindows; - bool mInSecureDialog; - bool mHackActive; - - TQPixmap backingPixmap; - KRootPixmap *m_rootPixmap; - int mBackingStartupDelayTimer; - TQPixmap mArgbTransparentBackgroundPixmap; - - KSMModalDialog* m_startupStatusDialog; - - TQDateTime mlockDateTime; - - bool m_mouseDown; - int m_mousePrevX; - int m_mousePrevY; - int m_dialogPrevX; - int m_dialogPrevY; - - bool m_notifyReadyRequested; - - TQWidget* m_maskWidget; - Window m_saverRootWindow; - - ControlPipeHandlerObject* mControlPipeHandler; - TQEventLoopThread* mControlPipeHandlerThread; - - friend class ControlPipeHandlerObject; + Q_OBJECT + + public: + LockProcess(); + ~LockProcess(); + + void init(bool child_saver = false, bool useBlankOnly = false); + + bool lock(); + + bool defaultSave(); + + bool dontLock(); + + bool runSecureDialog(); + bool inSecureDialog(); + + void setChildren(TQValueList<int> children) { child_sockets = children; } + void setParent(int fd) { mParent = fd; } + + void msgBox( TQMessageBox::Icon type, const TQString &txt ); + int execDialog( TQDialog* dlg ); + + TDECryptographicCardDevice* cryptographicCardDevice(); + + signals: + void terminateHelperThread(); + + public slots: + void quitSaver(); + void preparePopup(); + void cleanupPopup(); + void desktopResized(); + void doDesktopResizeFinish(); + void doFunctionKeyBroadcast(); + void slotPaintBackground(const TQPixmap &pm); + void slotForcePaintBackground(); + + protected: + virtual bool x11Event(XEvent *); + virtual void timerEvent(TQTimerEvent *); + virtual void resizeEvent(TQResizeEvent *); + + private slots: + void hackExited(TDEProcess *); + void signalPipeSignal(); + bool startLock(); + void suspend(); + void checkDPMSActive(); + void slotDeadTimePassed(); + void windowAdded( WId ); + void resumeUnforced(); + void displayLockDialogIfNeeded(); + void closeDialogAndStartHack(); + bool closeCurrentWindow(); + void repaintRootWindowIfNeeded(); + void startSecureDialog(); + void slotMouseActivity(XEvent *event); + void processInputPipeCommand(TQString command); + void cryptographicCardInserted(TDECryptographicCardDevice*); + void cryptographicCardRemoved(TDECryptographicCardDevice*); + void cryptographicCardPinRequested(TQString prompt, TDECryptographicCardDevice* cdevice); + void signalPassDlgToAttemptCardLogin(); + void signalPassDlgToAttemptCardAbort(); + + private: + void configure(); + void readSaver(); + void createSaverWindow(); + void hideSaverWindow(); + void saveVRoot(); + void setVRoot(Window win, Window rw); + void removeVRoot(Window win); + void setTransparentBackgroundARGB(); + bool grabKeyboard(); + bool grabMouse(); + bool grabInput(); + void ungrabInput(); + void cantLock(const TQString &reason); + bool startSaver(bool notify_ready = false); + void stopSaver(); + bool startHack(); + void stopHack(); + void setupSignals(); + bool checkPass(); + void stayOnTop(); + void lockXF86(); + void unlockXF86(); + void showVkbd(); + void hideVkbd(); + void saverReady(); + void saverReadyIfNeeded(); + bool forwardVkbdEvent( XEvent* event ); + void sendVkbdFocusInOut( WId window, Time t ); + void windowAdded( WId window, bool managed ); + void resume( bool force ); + static TQVariant getConf(void *ctx, const char *key, const TQVariant &dflt); + void generateBackingImages(); + void fullyOnline(); + + bool mLocked; + int mLockGrace; + int mPriority; + bool mBusy; + TDEProcess mHackProc; + int mRootWidth; + int mRootHeight; + TQString mSaverExec; + TQString mSaver; + bool mOpenGLVisual; + bool child_saver; + TQValueList<int> child_sockets; + int mParent; + bool mUseBlankOnly; + bool mShowLockDateTime; + bool mSuspended; + TQTimer mSuspendTimer; + bool mVisibility; + TQTimer mCheckDPMS; + TQValueStack< TQWidget* > mDialogs; + bool mRestoreXF86Lock; + bool mForbidden; + TQStringList mPlugins, mPluginOptions; + TQString mMethod; + GreeterPluginHandle greetPlugin; + TQPixmap mSavedScreen; + int mAutoLogoutTimerId; + int mAutoLogoutTimeout; + bool mAutoLogout; + + TQTimer *resizeTimer; + unsigned int mkeyCode; + + TQTimer *hackResumeTimer; + + TDEProcess* mVkbdProcess; + KWinModule* mKWinModule; + struct VkbdWindow { + WId id; + TQRect rect; + }; + TQValueList< VkbdWindow > mVkbdWindows; + WId mVkbdLastEventWindow; + + bool mPipeOpen; + int mPipe_fd; + bool mPipeOpen_out; + int mPipe_fd_out; + + bool mInfoMessageDisplayed; + bool mDialogControlLock; + bool mForceReject; + TQDialog *currentDialog; + + TQTimer* mEnsureScreenHiddenTimer; + TQTimer* mForceContinualLockDisplayTimer; + TQTimer* mEnsureVRootWindowSecurityTimer; + TQTimer* mHackDelayStartupTimer; + + int mHackDelayStartupTimeout; + bool mHackStartupEnabled; + bool mOverrideHackStartupEnabled; + bool mResizingDesktopLock; + bool mFullyOnlineSent; + + bool mClosingWindows; + bool mInSecureDialog; + bool mHackActive; + + TQPixmap backingPixmap; + KRootPixmap *m_rootPixmap; + int mBackingStartupDelayTimer; + TQPixmap mArgbTransparentBackgroundPixmap; + + KSMModalDialog* m_startupStatusDialog; + + TQDateTime mlockDateTime; + + bool m_mouseDown; + int m_mousePrevX; + int m_mousePrevY; + int m_dialogPrevX; + int m_dialogPrevY; + + bool m_notifyReadyRequested; + TDECryptographicCardDevice* m_loginCardDevice; + + TQWidget* m_maskWidget; + Window m_saverRootWindow; + + ControlPipeHandlerObject* mControlPipeHandler; + TQEventLoopThread* mControlPipeHandlerThread; + + friend class ControlPipeHandlerObject; }; #endif diff --git a/kdesktop/lock/main.cc b/kdesktop/lock/main.cc index c1b1da2f0..871c87a69 100644 --- a/kdesktop/lock/main.cc +++ b/kdesktop/lock/main.cc @@ -1,7 +1,7 @@ -/* This file is part of the KDE project +/* This file is part of the TDE project Copyright (C) 1999 David Faure Copyright (c) 2003 Oswald Buddenhagen <ossi@kde.org> - Copyright (c) 2010-2012 Timothy Pearson <kb9vqf@pearsoncomputing.net> + Copyright (c) 2010-2015 Timothy Pearson <kb9vqf@pearsoncomputing.net> This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public @@ -88,462 +88,471 @@ bool trinity_desktop_lock_settings_initialized = FALSE; static void sigusr1_handler(int) { - signalled_forcelock = TRUE; + signalled_forcelock = TRUE; } static void sigusr2_handler(int) { - signalled_dontlock = TRUE; + signalled_dontlock = TRUE; } static void sigusr3_handler(int) { - signalled_securedialog = TRUE; + signalled_securedialog = TRUE; } static void sigusr4_handler(int) { - signalled_blank = TRUE; + signalled_blank = TRUE; } static void sigusr5_handler(int) { - signalled_run = TRUE; + signalled_run = TRUE; } static int trapXErrors(Display *, XErrorEvent *) { - return 0; + return 0; } bool MyApp::x11EventFilter( XEvent *ev ) { - if (ev->type == ButtonPress || ev->type == ButtonRelease || ev->type == MotionNotify) { - emit mouseInteraction(ev); - } - if (ev->type == XKeyPress || ev->type == ButtonPress) { - emit activity(); - } - else if (ev->type == MotionNotify) { - time_t tick = time( 0 ); - if (tick != lastTick) { - lastTick = tick; - emit activity(); - } - } - else if (ev->type == MapNotify) { - // HACK - // Hide all tooltips and notification windows - XMapEvent map_event = ev->xmap; - XWindowAttributes childAttr; - Window childTransient; - if (XGetWindowAttributes(map_event.display, map_event.window, &childAttr) && XGetTransientForHint(map_event.display, map_event.window, &childTransient)) { - if((childAttr.map_state == IsViewable) && (childAttr.override_redirect) && (childTransient)) { - if (!trinity_desktop_lock_hidden_window_list.contains(map_event.window)) { - trinity_desktop_lock_hidden_window_list.append(map_event.window); - } - XLowerWindow(map_event.display, map_event.window); - XFlush(map_event.display); - } - } - } - else if (ev->type == VisibilityNotify) { - // HACK - // Hide all tooltips and notification windows - XVisibilityEvent visibility_event = ev->xvisibility; - XWindowAttributes childAttr; - Window childTransient; - if ((visibility_event.state == VisibilityUnobscured) || (visibility_event.state == VisibilityPartiallyObscured)) { - if (XGetWindowAttributes(visibility_event.display, visibility_event.window, &childAttr) && XGetTransientForHint(visibility_event.display, visibility_event.window, &childTransient)) { - if((childAttr.map_state == IsViewable) && (childAttr.override_redirect) && (childTransient)) { - if (!trinity_desktop_lock_hidden_window_list.contains(visibility_event.window)) { - trinity_desktop_lock_hidden_window_list.append(visibility_event.window); - } - XLowerWindow(visibility_event.display, visibility_event.window); - XFlush(visibility_event.display); - } - } - } - } - else if (ev->type == CreateNotify) { - // HACK - // Close all tooltips and notification windows - XCreateWindowEvent create_event = ev->xcreatewindow; - XWindowAttributes childAttr; - Window childTransient; - - // XGetWindowAttributes may generate BadWindow errors, so make sure they are silently ignored - int (*oldHandler)(Display *, XErrorEvent *); - oldHandler = XSetErrorHandler(trapXErrors); - if (XGetWindowAttributes(create_event.display, create_event.window, &childAttr) && XGetTransientForHint(create_event.display, create_event.window, &childTransient)) { - if ((childAttr.override_redirect) && (childTransient)) { - if (!trinity_desktop_lock_hidden_window_list.contains(create_event.window)) { - trinity_desktop_lock_hidden_window_list.append(create_event.window); - } - XLowerWindow(create_event.display, create_event.window); - XFlush(create_event.display); - } - } - XSetErrorHandler(oldHandler); - } - else if (ev->type == DestroyNotify) { - XDestroyWindowEvent destroy_event = ev->xdestroywindow; - if (trinity_desktop_lock_hidden_window_list.contains(destroy_event.window)) { - trinity_desktop_lock_hidden_window_list.remove(destroy_event.window); - } - } + if (ev->type == ButtonPress || ev->type == ButtonRelease || ev->type == MotionNotify) { + emit mouseInteraction(ev); + } + if (ev->type == XKeyPress || ev->type == ButtonPress) { + emit activity(); + } + else if (ev->type == MotionNotify) { + time_t tick = time( 0 ); + if (tick != lastTick) { + lastTick = tick; + emit activity(); + } + } + else if (ev->type == MapNotify) { + // HACK + // Hide all tooltips and notification windows + XMapEvent map_event = ev->xmap; + XWindowAttributes childAttr; + Window childTransient; + if (XGetWindowAttributes(map_event.display, map_event.window, &childAttr) && XGetTransientForHint(map_event.display, map_event.window, &childTransient)) { + if((childAttr.map_state == IsViewable) && (childAttr.override_redirect) && (childTransient)) { + if (!trinity_desktop_lock_hidden_window_list.contains(map_event.window)) { + trinity_desktop_lock_hidden_window_list.append(map_event.window); + } + XLowerWindow(map_event.display, map_event.window); + XFlush(map_event.display); + } + } + } + else if (ev->type == VisibilityNotify) { + // HACK + // Hide all tooltips and notification windows + XVisibilityEvent visibility_event = ev->xvisibility; + XWindowAttributes childAttr; + Window childTransient; + if ((visibility_event.state == VisibilityUnobscured) || (visibility_event.state == VisibilityPartiallyObscured)) { + if (XGetWindowAttributes(visibility_event.display, visibility_event.window, &childAttr) && XGetTransientForHint(visibility_event.display, visibility_event.window, &childTransient)) { + if((childAttr.map_state == IsViewable) && (childAttr.override_redirect) && (childTransient)) { + if (!trinity_desktop_lock_hidden_window_list.contains(visibility_event.window)) { + trinity_desktop_lock_hidden_window_list.append(visibility_event.window); + } + XLowerWindow(visibility_event.display, visibility_event.window); + XFlush(visibility_event.display); + } + } + } + } + else if (ev->type == CreateNotify) { + // HACK + // Close all tooltips and notification windows + XCreateWindowEvent create_event = ev->xcreatewindow; + XWindowAttributes childAttr; + Window childTransient; + + // XGetWindowAttributes may generate BadWindow errors, so make sure they are silently ignored + int (*oldHandler)(Display *, XErrorEvent *); + oldHandler = XSetErrorHandler(trapXErrors); + if (XGetWindowAttributes(create_event.display, create_event.window, &childAttr) && XGetTransientForHint(create_event.display, create_event.window, &childTransient)) { + if ((childAttr.override_redirect) && (childTransient)) { + if (!trinity_desktop_lock_hidden_window_list.contains(create_event.window)) { + trinity_desktop_lock_hidden_window_list.append(create_event.window); + } + XLowerWindow(create_event.display, create_event.window); + XFlush(create_event.display); + } + } + XSetErrorHandler(oldHandler); + } + else if (ev->type == DestroyNotify) { + XDestroyWindowEvent destroy_event = ev->xdestroywindow; + if (trinity_desktop_lock_hidden_window_list.contains(destroy_event.window)) { + trinity_desktop_lock_hidden_window_list.remove(destroy_event.window); + } + } #if 0 - else if (ev->type == CreateNotify) { - // HACK - // Close all tooltips and notification windows - XCreateWindowEvent create_event = ev->xcreatewindow; - XWindowAttributes childAttr; - Window childTransient; - if (XGetWindowAttributes(create_event.display, create_event.window, &childAttr) && XGetTransientForHint(create_event.display, create_event.window, &childTransient)) { - if ((childAttr.override_redirect) && (childTransient)) { - XDestroyWindow(create_event.display, create_event.window); - } - } - } + else if (ev->type == CreateNotify) { + // HACK + // Close all tooltips and notification windows + XCreateWindowEvent create_event = ev->xcreatewindow; + XWindowAttributes childAttr; + Window childTransient; + if (XGetWindowAttributes(create_event.display, create_event.window, &childAttr) && XGetTransientForHint(create_event.display, create_event.window, &childTransient)) { + if ((childAttr.override_redirect) && (childTransient)) { + XDestroyWindow(create_event.display, create_event.window); + } + } + } #endif - return TDEApplication::x11EventFilter( ev ); + return TDEApplication::x11EventFilter( ev ); } static TDECmdLineOptions options[] = { - { "forcelock", I18N_NOOP("Force session locking"), 0 }, - { "dontlock", I18N_NOOP("Only start screensaver"), 0 }, - { "securedialog", I18N_NOOP("Launch the secure dialog"), 0 }, - { "blank", I18N_NOOP("Only use the blank screensaver"), 0 }, - { "internal <pid>", I18N_NOOP("TDE internal command for background process loading"), 0 }, - TDECmdLineLastOption + { "forcelock", I18N_NOOP("Force session locking"), 0 }, + { "dontlock", I18N_NOOP("Only start screensaver"), 0 }, + { "securedialog", I18N_NOOP("Launch the secure dialog"), 0 }, + { "blank", I18N_NOOP("Only use the blank screensaver"), 0 }, + { "internal <pid>", I18N_NOOP("TDE internal command for background process loading"), 0 }, + TDECmdLineLastOption }; void restore_hidden_override_redirect_windows() { - TQXLibWindowList::iterator it; - for (it = trinity_desktop_lock_hidden_window_list.begin(); it != trinity_desktop_lock_hidden_window_list.end(); ++it) { - Window win = *it; - XRaiseWindow(tqt_xdisplay(), win); - } + TQXLibWindowList::iterator it; + for (it = trinity_desktop_lock_hidden_window_list.begin(); it != trinity_desktop_lock_hidden_window_list.end(); ++it) { + Window win = *it; + XRaiseWindow(tqt_xdisplay(), win); + } } // ----------------------------------------------------------------------------- int main( int argc, char **argv ) { - TDELocale::setMainCatalogue("kdesktop"); - - TDECmdLineArgs::init( argc, argv, "kdesktop_lock", I18N_NOOP("KDesktop Locker"), I18N_NOOP("Session Locker for KDesktop"), "2.1" ); - TDECmdLineArgs::addCmdLineOptions( options ); - TDECmdLineArgs *args = TDECmdLineArgs::parsedArgs(); - - putenv(strdup("SESSION_MANAGER=")); - - TDEApplication::disableAutoDcopRegistration(); // not needed - - XSetErrorHandler(trapXErrors); - - MyApp* app = NULL; - - while (1 == 1) { - signalled_forcelock = FALSE; - signalled_dontlock = FALSE; - signalled_securedialog = FALSE; - signalled_blank = FALSE; - signalled_run = FALSE; - - int kdesktop_screen_number = 0; - int starting_screen = 0; - - bool child = false; - int parent_connection = 0; // socket to the parent saver - TQValueList<int> child_sockets; - - if (TDEGlobalSettings::isMultiHead()) - { - Display *dpy = XOpenDisplay(NULL); - if (! dpy) { - fprintf(stderr, - "%s: FATAL ERROR: couldn't open display '%s'\n", - argv[0], XDisplayName(NULL)); - exit(1); - } - - int number_of_screens = ScreenCount(dpy); - starting_screen = kdesktop_screen_number = DefaultScreen(dpy); - int pos; - TQCString display_name = XDisplayString(dpy); - XCloseDisplay(dpy); - kdDebug() << "screen " << number_of_screens << " " << kdesktop_screen_number << " " << display_name << " " << starting_screen << endl; - dpy = 0; - - if ((pos = display_name.findRev('.')) != -1) - display_name.remove(pos, 10); - - TQCString env; - if (number_of_screens != 1) { - for (int i = 0; i < number_of_screens; i++) { - if (i != starting_screen) { - int fd[2]; - if (pipe(fd)) { - perror("pipe"); - break; - } - if (fork() == 0) { - child = true; - kdesktop_screen_number = i; - parent_connection = fd[0]; - // break here because we are the child process, we don't - // want to fork() anymore - break; - } else { - child_sockets.append(fd[1]); - } - } - } - - env.sprintf("DISPLAY=%s.%d", display_name.data(), - kdesktop_screen_number); - kdDebug() << "env " << env << endl; - - if (putenv(strdup(env.data()))) { - fprintf(stderr, - "%s: WARNING: unable to set DISPLAY environment variable\n", - argv[0]); - perror("putenv()"); - } - } - } - - if (!app) { + TDELocale::setMainCatalogue("kdesktop"); + + TDECmdLineArgs::init( argc, argv, "kdesktop_lock", I18N_NOOP("KDesktop Locker"), I18N_NOOP("Session Locker for KDesktop"), "2.1" ); + TDECmdLineArgs::addCmdLineOptions( options ); + TDECmdLineArgs *args = TDECmdLineArgs::parsedArgs(); + + putenv(strdup("SESSION_MANAGER=")); + + TDEApplication::disableAutoDcopRegistration(); // not needed + + XSetErrorHandler(trapXErrors); + + MyApp* app = NULL; + + while (1 == 1) { + sigset_t new_mask; + sigset_t orig_mask; + + // Block reception of all signals in this thread + sigprocmask(SIG_BLOCK, &new_mask, NULL); + + signalled_forcelock = FALSE; + signalled_dontlock = FALSE; + signalled_securedialog = FALSE; + signalled_blank = FALSE; + signalled_run = FALSE; + + int kdesktop_screen_number = 0; + int starting_screen = 0; + + bool child = false; + int parent_connection = 0; // socket to the parent saver + TQValueList<int> child_sockets; + + if (TDEGlobalSettings::isMultiHead()) { + Display *dpy = XOpenDisplay(NULL); + if (! dpy) { + fprintf(stderr, + "%s: FATAL ERROR: couldn't open display '%s'\n", + argv[0], XDisplayName(NULL)); + exit(1); + } + + int number_of_screens = ScreenCount(dpy); + starting_screen = kdesktop_screen_number = DefaultScreen(dpy); + int pos; + TQCString display_name = XDisplayString(dpy); + XCloseDisplay(dpy); + kdDebug() << "screen " << number_of_screens << " " << kdesktop_screen_number << " " << display_name << " " << starting_screen << endl; + dpy = 0; + + if ((pos = display_name.findRev('.')) != -1) { + display_name.remove(pos, 10); + } + + TQCString env; + if (number_of_screens != 1) { + for (int i = 0; i < number_of_screens; i++) { + if (i != starting_screen) { + int fd[2]; + if (pipe(fd)) { + perror("pipe"); + break; + } + if (fork() == 0) { + child = true; + kdesktop_screen_number = i; + parent_connection = fd[0]; + // break here because we are the child process, we don't + // want to fork() anymore + break; + } + else { + child_sockets.append(fd[1]); + } + } + } + + env.sprintf("DISPLAY=%s.%d", display_name.data(), + kdesktop_screen_number); + kdDebug() << "env " << env << endl; + + if (putenv(strdup(env.data()))) { + fprintf(stderr, + "%s: WARNING: unable to set DISPLAY environment variable\n", + argv[0]); + perror("putenv()"); + } + } + } + + if (!app) { #ifdef COMPOSITE - app = new MyApp(TDEApplication::openX11RGBADisplay()); - argb_visual = app->isX11CompositionAvailable(); + app = new MyApp(TDEApplication::openX11RGBADisplay()); + argb_visual = app->isX11CompositionAvailable(); #else - app = new MyApp; + app = new MyApp; #endif - } - - TDELockFile lock(locateLocal("tmp", "kdesktop_lock_lockfile")); - lock.setStaleTime(0); - TDELockFile::LockResult lockRet = lock.lock(); - if (lockRet != TDELockFile::LockOK) { - // Terminate existing (stale) process if needed - int pid; - TQString hostName; - TQString appName; - if (lock.getLockInfo(pid, hostName, appName)) { - // Verify that the pid in question is an instance of kdesktop_lock - int len; - char procpath[PATH_MAX]; - char fullpath[PATH_MAX]; - snprintf(procpath, sizeof(procpath), "/proc/%d/exe", pid); - len = readlink( procpath, fullpath, sizeof(fullpath) ); - if (len >= 0) { - fullpath[len] = 0; - TQFileInfo fileInfo(fullpath); - if (fileInfo.baseName() == "kdesktop_lock") { - // Verify that pid in question is owned by current user before killing it - uid_t current_uid = geteuid(); - - struct stat info; - if (lstat(procpath, &info) == 0) { - if (info.st_uid == current_uid) { - kill(pid, SIGKILL); - } - } - } - } - } - } - - // Force a relock as a stale lockfile or process may have been dealt with above - if (!lock.isLocked()) { - lockRet = lock.lock(TDELockFile::LockNoBlock | TDELockFile::LockForce); - } - - kdDebug() << "app " << kdesktop_screen_number << " " << starting_screen << " " << child << " " << child_sockets.count() << " " << parent_connection << endl; - app->disableSessionManagement(); - TDEGlobal::locale()->insertCatalogue("libdmctl"); - - struct stat st; - KSimpleConfig* tdmconfig; - OPEN_TDMCONFIG_AND_SET_GROUP - - trinity_desktop_lock_process = new LockProcess; - - // Start loading core functions, such as the desktop wallpaper interface - app->processEvents(); - - if (args->isSet( "internal" )) { - kdesktop_pid = atoi(args->getOption( "internal" )); - sigset_t new_mask; - sigset_t orig_mask; - struct sigaction act; - - in_internal_mode = TRUE; - - // handle SIGUSR1 - act.sa_handler= sigusr1_handler; - sigemptyset(&(act.sa_mask)); - sigaddset(&(act.sa_mask), SIGUSR1); - act.sa_flags = 0; - sigaction(SIGUSR1, &act, 0L); - // handle SIGUSR2 - act.sa_handler= sigusr2_handler; - sigemptyset(&(act.sa_mask)); - sigaddset(&(act.sa_mask), SIGUSR2); - act.sa_flags = 0; - sigaction(SIGUSR2, &act, 0L); - // handle SIGWINCH (an ersatz SIGUSR3) - act.sa_handler= sigusr3_handler; - sigemptyset(&(act.sa_mask)); - sigaddset(&(act.sa_mask), SIGWINCH); - act.sa_flags = 0; - sigaction(SIGWINCH, &act, 0L); - // handle SIGTTIN (an ersatz SIGUSR4) - act.sa_handler= sigusr4_handler; - sigemptyset(&(act.sa_mask)); - sigaddset(&(act.sa_mask), SIGTTIN); - act.sa_flags = 0; - sigaction(SIGTTIN, &act, 0L); - // handle SIGTTOU (an ersatz SIGUSR5) - act.sa_handler= sigusr5_handler; - sigemptyset(&(act.sa_mask)); - sigaddset(&(act.sa_mask), SIGTTOU); - act.sa_flags = 0; - sigaction(SIGTTOU, &act, 0L); - - // initialize the signal masks - sigemptyset(&new_mask); - sigaddset(&new_mask,SIGUSR1); - sigaddset(&new_mask,SIGUSR2); - sigaddset(&new_mask,SIGWINCH); - sigaddset(&new_mask,SIGTTIN); - sigaddset(&new_mask,SIGTTOU); - - while (signalled_run == FALSE) { - // let kdesktop know the saver process is ready - if (kill(kdesktop_pid, SIGTTIN) < 0) { - // The controlling kdesktop process probably died. Commit suicide... - return 12; - } - - // Get root window attributes - XWindowAttributes rootAttr; - XGetWindowAttributes(tqt_xdisplay(), RootWindow(tqt_xdisplay(), tqt_xscreen()), &rootAttr); - - // Disable reception of all X11 events on the root window - XSelectInput( tqt_xdisplay(), tqt_xrootwin(), 0 ); - app->processEvents(); + } - // wait for SIGUSR1, SIGUSR2, SIGWINCH, SIGTTIN, or SIGTTOU - sigprocmask(SIG_BLOCK, &new_mask, &orig_mask); - if (signalled_run != TRUE) { - sigsuspend(&orig_mask); + TDELockFile lock(locateLocal("tmp", "kdesktop_lock_lockfile")); + lock.setStaleTime(0); + TDELockFile::LockResult lockRet = lock.lock(); + if (lockRet != TDELockFile::LockOK) { + // Terminate existing (stale) process if needed + int pid; + TQString hostName; + TQString appName; + if (lock.getLockInfo(pid, hostName, appName)) { + // Verify that the pid in question is an instance of kdesktop_lock + int len; + char procpath[PATH_MAX]; + char fullpath[PATH_MAX]; + snprintf(procpath, sizeof(procpath), "/proc/%d/exe", pid); + len = readlink( procpath, fullpath, sizeof(fullpath) ); + if (len >= 0) { + fullpath[len] = 0; + TQFileInfo fileInfo(fullpath); + if (fileInfo.baseName() == "kdesktop_lock") { + // Verify that pid in question is owned by current user before killing it + uid_t current_uid = geteuid(); + + struct stat info; + if (lstat(procpath, &info) == 0) { + if (info.st_uid == current_uid) { + kill(pid, SIGKILL); + } + } + } + } + } } + + // Force a relock as a stale lockfile or process may have been dealt with above + if (!lock.isLocked()) { + lockRet = lock.lock(TDELockFile::LockNoBlock | TDELockFile::LockForce); + } + + kdDebug() << "app " << kdesktop_screen_number << " " << starting_screen << " " << child << " " << child_sockets.count() << " " << parent_connection << endl; + app->disableSessionManagement(); + TDEGlobal::locale()->insertCatalogue("libdmctl"); + + struct stat st; + KSimpleConfig* tdmconfig; + OPEN_TDMCONFIG_AND_SET_GROUP + + // Create new LockProcess, which also spawns threads inheriting the blocked signal mask + trinity_desktop_lock_process = new LockProcess; + + // Unblock reception of all signals in this thread sigprocmask(SIG_UNBLOCK, &new_mask, NULL); - // Reenable reception of X11 events on the root window - XSelectInput( tqt_xdisplay(), tqt_xrootwin(), rootAttr.your_event_mask ); - } - - // Block reception of all signals in this thread - sigprocmask(SIG_BLOCK, &new_mask, NULL); - } - - // (re)load settings here so that they actually reflect reality - // we need to read from the right rc file - possibly taking screen number in account - if (!trinity_desktop_lock_settings_initialized) { - KDesktopSettings::instance("kdesktoprc"); - trinity_desktop_lock_settings_initialized = true; - } - else { - KDesktopSettings::self()->readConfig(); - } - trinity_desktop_lock_use_system_modal_dialogs = !KDesktopSettings::useUnmanagedLockWindows(); - trinity_desktop_lock_delay_screensaver_start = KDesktopSettings::delaySaverStart(); - if (trinity_desktop_lock_use_system_modal_dialogs) { + // Start loading core functions, such as the desktop wallpaper interface + app->processEvents(); + + if (args->isSet( "internal" )) { + kdesktop_pid = atoi(args->getOption( "internal" )); + struct sigaction act; + + in_internal_mode = TRUE; + + // handle SIGUSR1 + act.sa_handler= sigusr1_handler; + sigemptyset(&(act.sa_mask)); + sigaddset(&(act.sa_mask), SIGUSR1); + act.sa_flags = 0; + sigaction(SIGUSR1, &act, 0L); + // handle SIGUSR2 + act.sa_handler= sigusr2_handler; + sigemptyset(&(act.sa_mask)); + sigaddset(&(act.sa_mask), SIGUSR2); + act.sa_flags = 0; + sigaction(SIGUSR2, &act, 0L); + // handle SIGWINCH (an ersatz SIGUSR3) + act.sa_handler= sigusr3_handler; + sigemptyset(&(act.sa_mask)); + sigaddset(&(act.sa_mask), SIGWINCH); + act.sa_flags = 0; + sigaction(SIGWINCH, &act, 0L); + // handle SIGTTIN (an ersatz SIGUSR4) + act.sa_handler= sigusr4_handler; + sigemptyset(&(act.sa_mask)); + sigaddset(&(act.sa_mask), SIGTTIN); + act.sa_flags = 0; + sigaction(SIGTTIN, &act, 0L); + // handle SIGTTOU (an ersatz SIGUSR5) + act.sa_handler= sigusr5_handler; + sigemptyset(&(act.sa_mask)); + sigaddset(&(act.sa_mask), SIGTTOU); + act.sa_flags = 0; + sigaction(SIGTTOU, &act, 0L); + + // initialize the signal masks + sigemptyset(&new_mask); + sigaddset(&new_mask,SIGUSR1); + sigaddset(&new_mask,SIGUSR2); + sigaddset(&new_mask,SIGWINCH); + sigaddset(&new_mask,SIGTTIN); + sigaddset(&new_mask,SIGTTOU); + + while (signalled_run == FALSE) { + // let kdesktop know the saver process is ready + if (kill(kdesktop_pid, SIGTTIN) < 0) { + // The controlling kdesktop process probably died. Commit suicide... + return 12; + } + + // Get root window attributes + XWindowAttributes rootAttr; + XGetWindowAttributes(tqt_xdisplay(), RootWindow(tqt_xdisplay(), tqt_xscreen()), &rootAttr); + + // Disable reception of all X11 events on the root window + XSelectInput( tqt_xdisplay(), tqt_xrootwin(), 0 ); + app->processEvents(); + + // wait for SIGUSR1, SIGUSR2, SIGWINCH, SIGTTIN, or SIGTTOU + sigprocmask(SIG_BLOCK, &new_mask, &orig_mask); + if (signalled_run != TRUE) { + sigsuspend(&orig_mask); + } + sigprocmask(SIG_UNBLOCK, &new_mask, NULL); + + // Reenable reception of X11 events on the root window + XSelectInput( tqt_xdisplay(), tqt_xrootwin(), rootAttr.your_event_mask ); + } + + // Block reception of all signals in this thread + sigprocmask(SIG_BLOCK, &new_mask, NULL); + } + + // (re)load settings here so that they actually reflect reality + // we need to read from the right rc file - possibly taking screen number in account + if (!trinity_desktop_lock_settings_initialized) { + KDesktopSettings::instance("kdesktoprc"); + trinity_desktop_lock_settings_initialized = true; + } + else { + KDesktopSettings::self()->readConfig(); + } + trinity_desktop_lock_use_system_modal_dialogs = !KDesktopSettings::useUnmanagedLockWindows(); + trinity_desktop_lock_delay_screensaver_start = KDesktopSettings::delaySaverStart(); + if (trinity_desktop_lock_use_system_modal_dialogs) { #ifdef BUILD_TSAK - trinity_desktop_lock_use_sak = tdmconfig->readBoolEntry("UseSAK", false) && KDesktopSettings::useTDESAK(); + trinity_desktop_lock_use_sak = tdmconfig->readBoolEntry("UseSAK", false) && KDesktopSettings::useTDESAK(); #else - trinity_desktop_lock_use_sak = false; + trinity_desktop_lock_use_sak = false; #endif - } - else { - trinity_desktop_lock_use_sak = false; // If SAK is enabled with unmanaged windows, the SAK dialog will never close and will "burn in" the screen - trinity_desktop_lock_delay_screensaver_start = false; // If trinity_desktop_lock_delay_screensaver_start is true with unmanaged windows, the lock dialog may never appear - } - trinity_desktop_lock_hide_active_windows = KDesktopSettings::hideActiveWindowsFromSaver(); - trinity_desktop_lock_hide_cancel_button = KDesktopSettings::hideCancelButton(); - - delete tdmconfig; - - if (args->isSet( "forcelock" ) || (signalled_forcelock == TRUE)) { - trinity_desktop_lock_forced = TRUE; - } - - trinity_desktop_lock_process->init(child, (args->isSet( "blank" ) || (signalled_blank == TRUE))); - if (!child) { - trinity_desktop_lock_process->setChildren(child_sockets); - } - else { - trinity_desktop_lock_process->setParent(parent_connection); - } - - bool rt; - if( (((!child) && (args->isSet( "forcelock" ))) || (signalled_forcelock == TRUE))) { - rt = trinity_desktop_lock_process->lock(); - } - else if( child || (args->isSet( "dontlock" ) || (signalled_dontlock == TRUE))) { - rt = trinity_desktop_lock_process->dontLock(); - } - else if( child || (args->isSet( "securedialog" ) || (signalled_securedialog == TRUE))) { - int retcode = tde_sak_verify_calling_process(); - if (retcode == 0) { - rt = trinity_desktop_lock_process->runSecureDialog(); - } - else { - return 1; - } - } - else { - rt = trinity_desktop_lock_process->defaultSave(); - } - if (!rt) { - return 0; - } - - if (in_internal_mode == FALSE) { - trinity_desktop_lock_hidden_window_list.clear(); - int ret = app->exec(); - restore_hidden_override_redirect_windows(); - return ret; - } - else { - if (kill(kdesktop_pid, 0) < 0) { - // The controlling kdesktop process probably died. Commit suicide... - return 12; - } - trinity_desktop_lock_hidden_window_list.clear(); - app->exec(); - restore_hidden_override_redirect_windows(); - if (kill(kdesktop_pid, SIGUSR1) < 0) { - // The controlling kdesktop process probably died. Commit suicide... - return 12; - } - - delete trinity_desktop_lock_process; - trinity_desktop_lock_process = NULL; - - // FIXME - // We should not have to return (restart) at all, - // but it seems that some X11 connections are left active, - // preventing the lock process from restarting properly in the while() loop above. - return 0; - } - } + } + else { + trinity_desktop_lock_use_sak = false; // If SAK is enabled with unmanaged windows, the SAK dialog will never close and will "burn in" the screen + trinity_desktop_lock_delay_screensaver_start = false; // If trinity_desktop_lock_delay_screensaver_start is true with unmanaged windows, the lock dialog may never appear + } + trinity_desktop_lock_hide_active_windows = KDesktopSettings::hideActiveWindowsFromSaver(); + trinity_desktop_lock_hide_cancel_button = KDesktopSettings::hideCancelButton(); + + delete tdmconfig; + + if (args->isSet( "forcelock" ) || (signalled_forcelock == TRUE)) { + trinity_desktop_lock_forced = TRUE; + } + + trinity_desktop_lock_process->init(child, (args->isSet( "blank" ) || (signalled_blank == TRUE))); + if (!child) { + trinity_desktop_lock_process->setChildren(child_sockets); + } + else { + trinity_desktop_lock_process->setParent(parent_connection); + } + + bool rt; + if( (((!child) && (args->isSet( "forcelock" ))) || (signalled_forcelock == TRUE))) { + rt = trinity_desktop_lock_process->lock(); + } + else if( child || (args->isSet( "dontlock" ) || (signalled_dontlock == TRUE))) { + rt = trinity_desktop_lock_process->dontLock(); + } + else if( child || (args->isSet( "securedialog" ) || (signalled_securedialog == TRUE))) { + int retcode = tde_sak_verify_calling_process(); + if (retcode == 0) { + rt = trinity_desktop_lock_process->runSecureDialog(); + } + else { + return 1; + } + } + else { + rt = trinity_desktop_lock_process->defaultSave(); + } + if (!rt) { + return 0; + } + + if (in_internal_mode == FALSE) { + trinity_desktop_lock_hidden_window_list.clear(); + int ret = app->exec(); + restore_hidden_override_redirect_windows(); + return ret; + } + else { + if (kill(kdesktop_pid, 0) < 0) { + // The controlling kdesktop process probably died. Commit suicide... + return 12; + } + trinity_desktop_lock_hidden_window_list.clear(); + app->exec(); + restore_hidden_override_redirect_windows(); + if (kill(kdesktop_pid, SIGUSR1) < 0) { + // The controlling kdesktop process probably died. Commit suicide... + return 12; + } + + delete trinity_desktop_lock_process; + trinity_desktop_lock_process = NULL; + + // FIXME + // We should not have to return (restart) at all, + // but it seems that some X11 connections are left active, + // preventing the lock process from restarting properly in the while() loop above. + return 0; + } + } } #include "main.moc" diff --git a/kdesktop/lock/main.h b/kdesktop/lock/main.h index da3accda2..fd19c6183 100644 --- a/kdesktop/lock/main.h +++ b/kdesktop/lock/main.h @@ -1,4 +1,4 @@ -/* This file is part of the KDE project +/* This file is part of the TDE project Copyright (c) 2003 Oswald Buddenhagen <ossi@kde.org> This library is free software; you can redistribute it and/or @@ -25,17 +25,20 @@ #include <time.h> class MyApp : public TDEApplication { - Q_OBJECT -public: - MyApp() : TDEApplication(), lastTick( 0 ) {} - MyApp(Display *display, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0, bool allowStyles=true) : TDEApplication(display, visual, colormap, allowStyles), lastTick( 0 ) {} -protected: - bool x11EventFilter( XEvent * ); -signals: - void activity(); - void mouseInteraction(XEvent *event); -private: - time_t lastTick; + Q_OBJECT + public: + MyApp() : TDEApplication(), lastTick( 0 ) {} + MyApp(Display *display, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0, bool allowStyles=true) : TDEApplication(display, visual, colormap, allowStyles), lastTick( 0 ) {} + + protected: + bool x11EventFilter( XEvent * ); + + signals: + void activity(); + void mouseInteraction(XEvent *event); + + private: + time_t lastTick; }; #endif diff --git a/kdesktop/lock/querydlg.cc b/kdesktop/lock/querydlg.cc index 7618a5062..004bbc458 100644 --- a/kdesktop/lock/querydlg.cc +++ b/kdesktop/lock/querydlg.cc @@ -1,8 +1,8 @@ //=========================================================================== // -// This file is part of the KDE project +// This file is part of the TDE project // -// Copyright (c) 2010 Timothy Pearson <kb9vqf@pearsoncomputing.net> +// Copyright (c) 2010 - 2015 Timothy Pearson <kb9vqf@pearsoncomputing.net> #include <config.h> @@ -62,100 +62,102 @@ extern bool trinity_desktop_lock_use_system_modal_dialogs; // Simple dialog for displaying a password/PIN entry dialog // QueryDlg::QueryDlg(LockProcess *parent) - : TQDialog(parent, "query dialog", true, (trinity_desktop_lock_use_system_modal_dialogs?((WFlags)WStyle_StaysOnTop):((WFlags)WX11BypassWM))), - mUnlockingFailed(false) + : TQDialog(parent, "query dialog", true, (trinity_desktop_lock_use_system_modal_dialogs?((WFlags)WStyle_StaysOnTop):((WFlags)WX11BypassWM))), + mUnlockingFailed(false) { - if (trinity_desktop_lock_use_system_modal_dialogs) { - // Signal that we do not want any window controls to be shown at all - Atom kde_wm_system_modal_notification; - kde_wm_system_modal_notification = XInternAtom(tqt_xdisplay(), "_TDE_WM_MODAL_SYS_NOTIFICATION", False); - XChangeProperty(tqt_xdisplay(), winId(), kde_wm_system_modal_notification, XA_INTEGER, 32, PropModeReplace, (unsigned char *) "TRUE", 1L); - } - setCaption(i18n("Information Needed")); - - frame = new TQFrame( this ); - if (trinity_desktop_lock_use_system_modal_dialogs) - frame->setFrameStyle( TQFrame::NoFrame ); - else - frame->setFrameStyle( TQFrame::Panel | TQFrame::Raised ); - frame->setLineWidth( 2 ); - - mpixLabel = new TQLabel( frame, "pixlabel" ); - mpixLabel->setPixmap(DesktopIcon("unlock")); - - KUser user; - - mStatusLabel = new TQLabel( "<b> </b>", frame ); - //mStatusLabel->setAlignment( TQLabel::AlignCenter ); - mStatusLabel->setAlignment( TQLabel::AlignLeft ); - - KSeparator *sep = new KSeparator( KSeparator::HLine, frame ); - - ok = new KPushButton( i18n("Unl&ock"), frame ); - - TQVBoxLayout *unlockDialogLayout = new TQVBoxLayout( this ); - unlockDialogLayout->addWidget( frame ); - - TQHBoxLayout *layStatus = new TQHBoxLayout( 0, 0, KDialog::spacingHint()); - layStatus->addWidget( mStatusLabel ); - - TQHBoxLayout *layPin = new TQHBoxLayout( 0, 0, KDialog::spacingHint()); - pin_box = new KPasswordEdit( this, "pin_box" ); - layPin->addWidget( pin_box ); - pin_box->setFocus(); - - TQHBoxLayout *layButtons = new TQHBoxLayout( 0, 0, KDialog::spacingHint()); - layButtons->addStretch(); - layButtons->addWidget( ok ); - - frameLayout = new TQGridLayout( frame, 1, 1, KDialog::marginHint(), KDialog::spacingHint() ); - frameLayout->addMultiCellWidget( mpixLabel, 0, 2, 0, 0, Qt::AlignTop ); - frameLayout->addLayout( layStatus, 0, 1 ); - frameLayout->addLayout( layPin, 2, 1 ); - frameLayout->addMultiCellWidget( sep, 3, 3, 0, 1 ); - frameLayout->addMultiCellLayout( layButtons, 4, 4, 0, 1 ); - - connect(ok, TQT_SIGNAL(clicked()), TQT_SLOT(slotOK())); - - installEventFilter(this); - setFixedSize( sizeHint() ); + if (trinity_desktop_lock_use_system_modal_dialogs) { + // Signal that we do not want any window controls to be shown at all + Atom kde_wm_system_modal_notification; + kde_wm_system_modal_notification = XInternAtom(tqt_xdisplay(), "_TDE_WM_MODAL_SYS_NOTIFICATION", False); + XChangeProperty(tqt_xdisplay(), winId(), kde_wm_system_modal_notification, XA_INTEGER, 32, PropModeReplace, (unsigned char *) "TRUE", 1L); + } + setCaption(i18n("Information Needed")); + + frame = new TQFrame( this ); + if (trinity_desktop_lock_use_system_modal_dialogs) { + frame->setFrameStyle( TQFrame::NoFrame ); + } + else { + frame->setFrameStyle( TQFrame::Panel | TQFrame::Raised ); + } + frame->setLineWidth( 2 ); + + mpixLabel = new TQLabel( frame, "pixlabel" ); + mpixLabel->setPixmap(DesktopIcon("unlock")); + + KUser user; + + mStatusLabel = new TQLabel( "<b> </b>", frame ); + //mStatusLabel->setAlignment( TQLabel::AlignCenter ); + mStatusLabel->setAlignment( TQLabel::AlignLeft ); + + KSeparator *sep = new KSeparator( KSeparator::HLine, frame ); + + ok = new KPushButton( i18n("Unl&ock"), frame ); + + TQVBoxLayout *unlockDialogLayout = new TQVBoxLayout( this ); + unlockDialogLayout->addWidget( frame ); + + TQHBoxLayout *layStatus = new TQHBoxLayout( 0, 0, KDialog::spacingHint()); + layStatus->addWidget( mStatusLabel ); + + TQHBoxLayout *layPin = new TQHBoxLayout( 0, 0, KDialog::spacingHint()); + pin_box = new KPasswordEdit( this, "pin_box" ); + layPin->addWidget( pin_box ); + pin_box->setFocus(); + + TQHBoxLayout *layButtons = new TQHBoxLayout( 0, 0, KDialog::spacingHint()); + layButtons->addStretch(); + layButtons->addWidget( ok ); + + frameLayout = new TQGridLayout( frame, 1, 1, KDialog::marginHint(), KDialog::spacingHint() ); + frameLayout->addMultiCellWidget( mpixLabel, 0, 2, 0, 0, Qt::AlignTop ); + frameLayout->addLayout( layStatus, 0, 1 ); + frameLayout->addLayout( layPin, 2, 1 ); + frameLayout->addMultiCellWidget( sep, 3, 3, 0, 1 ); + frameLayout->addMultiCellLayout( layButtons, 4, 4, 0, 1 ); + + connect(ok, TQT_SIGNAL(clicked()), TQT_SLOT(slotOK())); + + installEventFilter(this); + setFixedSize( sizeHint() ); } QueryDlg::~QueryDlg() { - hide(); + hide(); } void QueryDlg::slotOK() { - close(); + close(); } const char * QueryDlg::getEntry() { - return pin_box->password(); + return pin_box->password(); } void QueryDlg::updateLabel(TQString &txt) { - mStatusLabel->setPaletteForegroundColor(Qt::black); - mStatusLabel->setText("<b>" + txt + "</b>"); + mStatusLabel->setPaletteForegroundColor(Qt::black); + mStatusLabel->setText("<b>" + txt + "</b>"); } void QueryDlg::setUnlockIcon() { - mpixLabel->setPixmap(DesktopIcon("unlock")); + mpixLabel->setPixmap(DesktopIcon("unlock")); } void QueryDlg::setWarningIcon() { - mpixLabel->setPixmap(DesktopIcon("messagebox_warning")); + mpixLabel->setPixmap(DesktopIcon("messagebox_warning")); } void QueryDlg::show() { - TQDialog::show(); - TQApplication::flushX(); + TQDialog::show(); + TQApplication::flushX(); } #include "querydlg.moc" diff --git a/kdesktop/lock/querydlg.h b/kdesktop/lock/querydlg.h index 0da557caf..71f73f9ab 100644 --- a/kdesktop/lock/querydlg.h +++ b/kdesktop/lock/querydlg.h @@ -1,8 +1,8 @@ //=========================================================================== // -// This file is part of the KDE project +// This file is part of the TDE project // -// Copyright (c) 2010 Timothy Pearson <kb9vqf@pearsoncomputing.net> +// Copyright (c) 2010 - 2015 Timothy Pearson <kb9vqf@pearsoncomputing.net> // #ifndef __QUERYDLG_H__ @@ -28,33 +28,33 @@ class TQListView; // class QueryDlg : public TQDialog { - Q_OBJECT - -public: - QueryDlg(LockProcess *parent); - ~QueryDlg(); - virtual void show(); - - void updateLabel( TQString &txt ); - void setUnlockIcon(); - void setWarningIcon(); - const char * getEntry(); - -private slots: - void slotOK(); - -private: - TQFrame *frame; - TQGridLayout *frameLayout; - TQLabel *mStatusLabel; - TQLabel *mpixLabel; - int mCapsLocked; - bool mUnlockingFailed; - TQStringList layoutsList; - TQStringList::iterator currLayout; - int sPid, sFd; - KPushButton *ok; - KPasswordEdit *pin_box; + Q_OBJECT + + public: + QueryDlg(LockProcess *parent); + ~QueryDlg(); + virtual void show(); + + void updateLabel( TQString &txt ); + void setUnlockIcon(); + void setWarningIcon(); + const char * getEntry(); + + private slots: + void slotOK(); + + private: + TQFrame *frame; + TQGridLayout *frameLayout; + TQLabel *mStatusLabel; + TQLabel *mpixLabel; + int mCapsLocked; + bool mUnlockingFailed; + TQStringList layoutsList; + TQStringList::iterator currLayout; + int sPid, sFd; + KPushButton *ok; + KPasswordEdit *pin_box; }; #endif diff --git a/kdesktop/lock/sakdlg.cc b/kdesktop/lock/sakdlg.cc index 1bb8305ef..803c77919 100644 --- a/kdesktop/lock/sakdlg.cc +++ b/kdesktop/lock/sakdlg.cc @@ -1,8 +1,8 @@ //=========================================================================== // -// This file is part of the KDE project +// This file is part of the TDE project // -// Copyright (c) 2010-2011 Timothy Pearson <kb9vqf@pearsoncomputing.net> +// Copyright (c) 2010 - 2015 Timothy Pearson <kb9vqf@pearsoncomputing.net> #include <config.h> @@ -64,71 +64,75 @@ extern bool trinity_desktop_lock_use_sak; // Simple dialog for displaying an unlock status or recurring error message // SAKDlg::SAKDlg(LockProcess *parent) - : TQDialog(parent, "information dialog", true, (trinity_desktop_lock_use_system_modal_dialogs?((WFlags)WStyle_StaysOnTop):((WFlags)WX11BypassWM))), - mUnlockingFailed(false) + : TQDialog(parent, "information dialog", true, (trinity_desktop_lock_use_system_modal_dialogs?((WFlags)WStyle_StaysOnTop):((WFlags)WX11BypassWM))), + mUnlockingFailed(false) { - if (trinity_desktop_lock_use_system_modal_dialogs) { - // Signal that we do not want any window controls to be shown at all - Atom kde_wm_system_modal_notification; - kde_wm_system_modal_notification = XInternAtom(tqt_xdisplay(), "_TDE_WM_MODAL_SYS_NOTIFICATION", False); - XChangeProperty(tqt_xdisplay(), winId(), kde_wm_system_modal_notification, XA_INTEGER, 32, PropModeReplace, (unsigned char *) "TRUE", 1L); - } - setCaption(i18n("Desktop Session Locked")); + if (trinity_desktop_lock_use_system_modal_dialogs) { + // Signal that we do not want any window controls to be shown at all + Atom kde_wm_system_modal_notification; + kde_wm_system_modal_notification = XInternAtom(tqt_xdisplay(), "_TDE_WM_MODAL_SYS_NOTIFICATION", False); + XChangeProperty(tqt_xdisplay(), winId(), kde_wm_system_modal_notification, XA_INTEGER, 32, PropModeReplace, (unsigned char *) "TRUE", 1L); + } + setCaption(i18n("Desktop Session Locked")); - frame = new TQFrame( this ); - if (trinity_desktop_lock_use_system_modal_dialogs) - frame->setFrameStyle( TQFrame::NoFrame ); - else - frame->setFrameStyle( TQFrame::Panel | TQFrame::Raised ); - frame->setLineWidth( 2 ); + frame = new TQFrame( this ); + if (trinity_desktop_lock_use_system_modal_dialogs) { + frame->setFrameStyle( TQFrame::NoFrame ); + } + else { + frame->setFrameStyle( TQFrame::Panel | TQFrame::Raised ); + } + frame->setLineWidth( 2 ); - KSMModalDialogHeader* theader = new KSMModalDialogHeader( frame ); + KSMModalDialogHeader* theader = new KSMModalDialogHeader( frame ); - KUser user; + KUser user; - mStatusLabel = new TQLabel( "<b> </b>", frame ); - mStatusLabel->setAlignment( TQLabel::AlignVCenter ); + mStatusLabel = new TQLabel( "<b> </b>", frame ); + mStatusLabel->setAlignment( TQLabel::AlignVCenter ); - TQVBoxLayout *unlockDialogLayout = new TQVBoxLayout( this ); - unlockDialogLayout->addWidget( frame ); + TQVBoxLayout *unlockDialogLayout = new TQVBoxLayout( this ); + unlockDialogLayout->addWidget( frame ); - TQHBoxLayout *layStatus = new TQHBoxLayout( 0, 0, KDialog::spacingHint()); - layStatus->addWidget( mStatusLabel ); + TQHBoxLayout *layStatus = new TQHBoxLayout( 0, 0, KDialog::spacingHint()); + layStatus->addWidget( mStatusLabel ); - frameLayout = new TQGridLayout( frame, 1, 1, KDialog::marginHint(), KDialog::spacingHint() ); - frameLayout->addMultiCellWidget( theader, 0, 0, 0, 1, AlignTop | AlignLeft ); - frameLayout->addMultiCellLayout( layStatus, 1, 1, 0, 1, AlignLeft | AlignVCenter); + frameLayout = new TQGridLayout( frame, 1, 1, KDialog::marginHint(), KDialog::spacingHint() ); + frameLayout->addMultiCellWidget( theader, 0, 0, 0, 1, AlignTop | AlignLeft ); + frameLayout->addMultiCellLayout( layStatus, 1, 1, 0, 1, AlignLeft | AlignVCenter); - mStatusLabel->setText("<b>" + i18n("Press Ctrl+Alt+Del to begin.") + "</b><p>" + i18n("This process helps keep your password secure.") + "<br>" + i18n("It prevents unauthorized users from emulating the login screen.")); + mStatusLabel->setText("<b>" + i18n("Press Ctrl+Alt+Del to begin.") + "</b><p>" + i18n("This process helps keep your password secure.") + "<br>" + i18n("It prevents unauthorized users from emulating the login screen.")); - installEventFilter(this); - setFixedSize( sizeHint() ); + installEventFilter(this); + setFixedSize( sizeHint() ); - mSAKProcess = new TDEProcess; - *mSAKProcess << "tdmtsak"; - connect(mSAKProcess, TQT_SIGNAL(processExited(TDEProcess*)), this, TQT_SLOT(slotSAKProcessExited())); - mSAKProcess->start(); + mSAKProcess = new TDEProcess; + *mSAKProcess << "tdmtsak"; + connect(mSAKProcess, TQT_SIGNAL(processExited(TDEProcess*)), this, TQT_SLOT(slotSAKProcessExited())); + mSAKProcess->start(); } void SAKDlg::slotSAKProcessExited() { - int retcode = mSAKProcess->exitStatus(); - if (retcode != 0) trinity_desktop_lock_use_sak = false; - hide(); + int retcode = mSAKProcess->exitStatus(); + if (retcode != 0) { + trinity_desktop_lock_use_sak = false; + } + hide(); } SAKDlg::~SAKDlg() { - if ((mSAKProcess) && (mSAKProcess->isRunning())) { - mSAKProcess->kill(SIGTERM); - delete mSAKProcess; - } - hide(); + if ((mSAKProcess) && (mSAKProcess->isRunning())) { + mSAKProcess->kill(SIGKILL); + delete mSAKProcess; + } + hide(); } void SAKDlg::closeDialogForced() { - TQDialog::reject(); + TQDialog::reject(); } void SAKDlg::reject() @@ -138,14 +142,14 @@ void SAKDlg::reject() void SAKDlg::updateLabel(TQString &txt) { - mStatusLabel->setPaletteForegroundColor(Qt::black); - mStatusLabel->setText("<b>" + txt + "</b>"); + mStatusLabel->setPaletteForegroundColor(Qt::black); + mStatusLabel->setText("<b>" + txt + "</b>"); } void SAKDlg::show() { - TQDialog::show(); - TQApplication::flushX(); + TQDialog::show(); + TQApplication::flushX(); } #include "sakdlg.moc" diff --git a/kdesktop/lock/sakdlg.h b/kdesktop/lock/sakdlg.h index 5810b8771..faded4b6e 100644 --- a/kdesktop/lock/sakdlg.h +++ b/kdesktop/lock/sakdlg.h @@ -1,8 +1,8 @@ //=========================================================================== // -// This file is part of the KDE project +// This file is part of the TDE project // -// Copyright (c) 2010 Timothy Pearson <kb9vqf@pearsoncomputing.net> +// Copyright (c) 2010 - 2015 Timothy Pearson <kb9vqf@pearsoncomputing.net> // #ifndef __SAKDLG_H__ @@ -26,32 +26,32 @@ class TQListView; // class SAKDlg : public TQDialog { - Q_OBJECT - -public: - SAKDlg(LockProcess *parent); - ~SAKDlg(); - virtual void show(); - - void updateLabel( TQString &txt ); - void closeDialogForced(); - -private slots: - void slotSAKProcessExited(); - -protected slots: - virtual void reject(); - -private: - TQFrame *frame; - TQGridLayout *frameLayout; - TQLabel *mStatusLabel; - int mCapsLocked; - bool mUnlockingFailed; - TQStringList layoutsList; - TQStringList::iterator currLayout; - int sPid, sFd; - TDEProcess* mSAKProcess; + Q_OBJECT + + public: + SAKDlg(LockProcess *parent); + ~SAKDlg(); + virtual void show(); + + void updateLabel( TQString &txt ); + void closeDialogForced(); + + private slots: + void slotSAKProcessExited(); + + protected slots: + virtual void reject(); + + private: + TQFrame *frame; + TQGridLayout *frameLayout; + TQLabel *mStatusLabel; + int mCapsLocked; + bool mUnlockingFailed; + TQStringList layoutsList; + TQStringList::iterator currLayout; + int sPid, sFd; + TDEProcess* mSAKProcess; }; #endif diff --git a/kdesktop/lock/securedlg.cc b/kdesktop/lock/securedlg.cc index b38378f2e..fca79a707 100644 --- a/kdesktop/lock/securedlg.cc +++ b/kdesktop/lock/securedlg.cc @@ -1,8 +1,8 @@ //=========================================================================== // -// This file is part of the KDE project +// This file is part of the TDE project // -// Copyright (c) 2010-2011 Timothy Pearson <kb9vqf@pearsoncomputing.net> +// Copyright (c) 2010 - 2015 Timothy Pearson <kb9vqf@pearsoncomputing.net> #include <config.h> @@ -64,152 +64,154 @@ extern bool trinity_desktop_lock_use_sak; // Simple dialog for displaying an unlock status or recurring error message // SecureDlg::SecureDlg(LockProcess *parent) - : TQDialog(parent, "information dialog", true, (trinity_desktop_lock_use_system_modal_dialogs?((WFlags)WStyle_StaysOnTop):((WFlags)WX11BypassWM))), - mUnlockingFailed(false), retInt(NULL) + : TQDialog(parent, "information dialog", true, (trinity_desktop_lock_use_system_modal_dialogs?((WFlags)WStyle_StaysOnTop):((WFlags)WX11BypassWM))), + mUnlockingFailed(false), retInt(NULL) { - if (trinity_desktop_lock_use_system_modal_dialogs) { - // Signal that we do not want any window controls to be shown at all - Atom kde_wm_system_modal_notification; - kde_wm_system_modal_notification = XInternAtom(tqt_xdisplay(), "_TDE_WM_MODAL_SYS_NOTIFICATION", False); - XChangeProperty(tqt_xdisplay(), winId(), kde_wm_system_modal_notification, XA_INTEGER, 32, PropModeReplace, (unsigned char *) "TRUE", 1L); - } - setCaption(i18n("Secure Desktop Area")); - - frame = new TQFrame( this ); - if (trinity_desktop_lock_use_system_modal_dialogs) - frame->setFrameStyle( TQFrame::NoFrame ); - else - frame->setFrameStyle( TQFrame::Panel | TQFrame::Raised ); - frame->setLineWidth( 2 ); - - KSMModalDialogHeader* theader = new KSMModalDialogHeader( frame ); - - KUser user; - - mLogonStatus = new TQLabel( frame ); - TQString userString = user.fullName(); - if (userString == "") { - userString = user.loginName(); - } - if (userString != "") { - mLogonStatus->setText(i18n("'%1' is currently logged on").arg( user.fullName() )); - } - else { - mLogonStatus->setText(i18n("You are currently logged on")); // We should never get here, and this message is somewhat obtuse, but it is better than displaying two qotation marks with no text between them... - } - - KSeparator *sep = new KSeparator( KSeparator::HLine, frame ); - - mLockButton = new TQPushButton( frame ); - mLockButton->setText(i18n("Lock Session")); - - mTaskButton = new TQPushButton( frame ); - mTaskButton->setText(i18n("Task Manager")); - - mShutdownButton = new TQPushButton( frame ); - mShutdownButton->setText(i18n("Logoff Menu")); - - mCancelButton = new TQPushButton( frame ); - mCancelButton->setText(i18n("Cancel")); - - mSwitchButton = new TQPushButton( frame ); - mSwitchButton->setText(i18n("Switch User")); - mSwitchButton->setEnabled(false); // FIXME - - TQVBoxLayout *unlockDialogLayout = new TQVBoxLayout( this ); - unlockDialogLayout->addWidget( frame ); - - TQHBoxLayout *layStatus = new TQHBoxLayout( 0, 0, KDialog::spacingHint()); - layStatus->addWidget( mLogonStatus ); - - TQGridLayout *layPBGrid = new TQGridLayout( 0, 0, KDialog::spacingHint()); - layPBGrid->addWidget( mLockButton, 0, 0 ); - layPBGrid->addWidget( mTaskButton, 0, 1 ); - layPBGrid->addWidget( mShutdownButton, 0, 2 ); - layPBGrid->addWidget( mCancelButton, 0, 3 ); - layPBGrid->addWidget( mSwitchButton, 1, 0 ); - - frameLayout = new TQGridLayout( frame, 1, 1, KDialog::marginHint(), KDialog::spacingHint() ); - frameLayout->addMultiCellWidget( theader, 0, 0, 0, 1, AlignTop | AlignLeft ); - frameLayout->addMultiCellLayout( layStatus, 1, 1, 0, 1, AlignLeft | AlignVCenter); - frameLayout->addMultiCellWidget( sep, 2, 2, 0, 1 ); - frameLayout->addMultiCellLayout( layPBGrid, 3, 3, 0, 1, AlignLeft | AlignVCenter); - - connect(mCancelButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotBtnCancel())); - connect(mLockButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotBtnLock())); - connect(mTaskButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotBtnTask())); - connect(mShutdownButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotBtnShutdown())); - connect(mSwitchButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotBtnSwitchUser())); - - TQSize dlgSz = sizeHint(); - int btnSize = dlgSz.width(); - btnSize = btnSize / 4; - btnSize = btnSize - (KDialog::spacingHint() / 2); - mLockButton->setFixedWidth(btnSize); - mTaskButton->setFixedWidth(btnSize); - mCancelButton->setFixedWidth(btnSize); - mShutdownButton->setFixedWidth(btnSize); - mSwitchButton->setFixedWidth(btnSize); - - installEventFilter(this); - setFixedSize( sizeHint() ); + if (trinity_desktop_lock_use_system_modal_dialogs) { + // Signal that we do not want any window controls to be shown at all + Atom kde_wm_system_modal_notification; + kde_wm_system_modal_notification = XInternAtom(tqt_xdisplay(), "_TDE_WM_MODAL_SYS_NOTIFICATION", False); + XChangeProperty(tqt_xdisplay(), winId(), kde_wm_system_modal_notification, XA_INTEGER, 32, PropModeReplace, (unsigned char *) "TRUE", 1L); + } + setCaption(i18n("Secure Desktop Area")); + + frame = new TQFrame( this ); + if (trinity_desktop_lock_use_system_modal_dialogs) { + frame->setFrameStyle( TQFrame::NoFrame ); + } + else { + frame->setFrameStyle( TQFrame::Panel | TQFrame::Raised ); + } + frame->setLineWidth( 2 ); + + KSMModalDialogHeader* theader = new KSMModalDialogHeader( frame ); + + KUser user; + + mLogonStatus = new TQLabel( frame ); + TQString userString = user.fullName(); + if (userString == "") { + userString = user.loginName(); + } + if (userString != "") { + mLogonStatus->setText(i18n("'%1' is currently logged on").arg( user.fullName() )); + } + else { + mLogonStatus->setText(i18n("You are currently logged on")); // We should never get here, and this message is somewhat obtuse, but it is better than displaying two qotation marks with no text between them... + } + + KSeparator *sep = new KSeparator( KSeparator::HLine, frame ); + + mLockButton = new TQPushButton( frame ); + mLockButton->setText(i18n("Lock Session")); + + mTaskButton = new TQPushButton( frame ); + mTaskButton->setText(i18n("Task Manager")); + + mShutdownButton = new TQPushButton( frame ); + mShutdownButton->setText(i18n("Logoff Menu")); + + mCancelButton = new TQPushButton( frame ); + mCancelButton->setText(i18n("Cancel")); + + mSwitchButton = new TQPushButton( frame ); + mSwitchButton->setText(i18n("Switch User")); + mSwitchButton->setEnabled(false); // FIXME + + TQVBoxLayout *unlockDialogLayout = new TQVBoxLayout( this ); + unlockDialogLayout->addWidget( frame ); + + TQHBoxLayout *layStatus = new TQHBoxLayout( 0, 0, KDialog::spacingHint()); + layStatus->addWidget( mLogonStatus ); + + TQGridLayout *layPBGrid = new TQGridLayout( 0, 0, KDialog::spacingHint()); + layPBGrid->addWidget( mLockButton, 0, 0 ); + layPBGrid->addWidget( mTaskButton, 0, 1 ); + layPBGrid->addWidget( mShutdownButton, 0, 2 ); + layPBGrid->addWidget( mCancelButton, 0, 3 ); + layPBGrid->addWidget( mSwitchButton, 1, 0 ); + + frameLayout = new TQGridLayout( frame, 1, 1, KDialog::marginHint(), KDialog::spacingHint() ); + frameLayout->addMultiCellWidget( theader, 0, 0, 0, 1, AlignTop | AlignLeft ); + frameLayout->addMultiCellLayout( layStatus, 1, 1, 0, 1, AlignLeft | AlignVCenter); + frameLayout->addMultiCellWidget( sep, 2, 2, 0, 1 ); + frameLayout->addMultiCellLayout( layPBGrid, 3, 3, 0, 1, AlignLeft | AlignVCenter); + + connect(mCancelButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotBtnCancel())); + connect(mLockButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotBtnLock())); + connect(mTaskButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotBtnTask())); + connect(mShutdownButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotBtnShutdown())); + connect(mSwitchButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotBtnSwitchUser())); + + TQSize dlgSz = sizeHint(); + int btnSize = dlgSz.width(); + btnSize = btnSize / 4; + btnSize = btnSize - (KDialog::spacingHint() / 2); + mLockButton->setFixedWidth(btnSize); + mTaskButton->setFixedWidth(btnSize); + mCancelButton->setFixedWidth(btnSize); + mShutdownButton->setFixedWidth(btnSize); + mSwitchButton->setFixedWidth(btnSize); + + installEventFilter(this); + setFixedSize( sizeHint() ); } SecureDlg::~SecureDlg() { - hide(); + hide(); } void SecureDlg::slotBtnCancel() { - if (retInt) *retInt = 0; - hide(); + if (retInt) *retInt = 0; + hide(); } void SecureDlg::slotBtnLock() { - if (retInt) *retInt = 1; - hide(); + if (retInt) *retInt = 1; + hide(); } void SecureDlg::slotBtnTask() { - if (retInt) *retInt = 2; - hide(); + if (retInt) *retInt = 2; + hide(); } void SecureDlg::slotBtnShutdown() { - if (retInt) *retInt = 3; - hide(); + if (retInt) *retInt = 3; + hide(); } void SecureDlg::slotBtnSwitchUser() { - if (retInt) *retInt = 4; - hide(); + if (retInt) *retInt = 4; + hide(); } void SecureDlg::setRetInt(int *i) { - retInt = i; + retInt = i; } void SecureDlg::closeDialogForced() { - if (retInt) *retInt = 0; - TQDialog::reject(); + if (retInt) *retInt = 0; + TQDialog::reject(); } void SecureDlg::reject() { - closeDialogForced(); + closeDialogForced(); } void SecureDlg::show() { - TQDialog::show(); - TQApplication::flushX(); + TQDialog::show(); + TQApplication::flushX(); } #include "securedlg.moc" diff --git a/kdesktop/lock/securedlg.h b/kdesktop/lock/securedlg.h index d616bf2e7..9ad0ac1da 100644 --- a/kdesktop/lock/securedlg.h +++ b/kdesktop/lock/securedlg.h @@ -1,8 +1,8 @@ //=========================================================================== // -// This file is part of the KDE project +// This file is part of the TDE project // -// Copyright (c) 2010 Timothy Pearson <kb9vqf@pearsoncomputing.net> +// Copyright (c) 2010 - 2015 Timothy Pearson <kb9vqf@pearsoncomputing.net> // #ifndef __SECUREDLG_H__ @@ -27,41 +27,41 @@ class TQListView; // class SecureDlg : public TQDialog { - Q_OBJECT + Q_OBJECT -public: - SecureDlg(LockProcess *parent); - ~SecureDlg(); - virtual void show(); + public: + SecureDlg(LockProcess *parent); + ~SecureDlg(); + virtual void show(); - void closeDialogForced(); - void setRetInt(int *); + void closeDialogForced(); + void setRetInt(int *); -private slots: - void slotBtnCancel(); - void slotBtnLock(); - void slotBtnTask(); - void slotBtnShutdown(); - void slotBtnSwitchUser(); + private slots: + void slotBtnCancel(); + void slotBtnLock(); + void slotBtnTask(); + void slotBtnShutdown(); + void slotBtnSwitchUser(); -protected slots: - virtual void reject(); + protected slots: + virtual void reject(); -private: - TQFrame *frame; - TQGridLayout *frameLayout; - TQLabel *mLogonStatus; - TQButton *mCancelButton; - TQButton *mLockButton; - TQButton *mTaskButton; - TQButton *mShutdownButton; - TQButton *mSwitchButton; - int mCapsLocked; - bool mUnlockingFailed; - TQStringList layoutsList; - TQStringList::iterator currLayout; - int sPid, sFd; - int* retInt; + private: + TQFrame *frame; + TQGridLayout *frameLayout; + TQLabel *mLogonStatus; + TQButton *mCancelButton; + TQButton *mLockButton; + TQButton *mTaskButton; + TQButton *mShutdownButton; + TQButton *mSwitchButton; + int mCapsLocked; + bool mUnlockingFailed; + TQStringList layoutsList; + TQStringList::iterator currLayout; + int sPid, sFd; + int* retInt; }; #endif diff --git a/kdesktop/lockeng.cc b/kdesktop/lockeng.cc index 600573f27..8aa6bb61c 100644 --- a/kdesktop/lockeng.cc +++ b/kdesktop/lockeng.cc @@ -11,10 +11,16 @@ #include <stdlib.h> +#include <ksslcertificate.h> + +#include <tdehardwaredevices.h> +#include <tdecryptographiccarddevice.h> + #include <kstandarddirs.h> #include <tdeapplication.h> #include <kservicegroup.h> #include <kdebug.h> +#include <kuser.h> #include <tdelocale.h> #include <tqfile.h> #include <tqtimer.h> @@ -82,6 +88,7 @@ SaverEngine::SaverEngine() mTerminationRequested(false), mSaverProcessReady(false), mNewVTAfterLockEngage(false), + mValidCryptoCardInserted(false), mSwitchVTAfterLockEngage(-1), dBusLocal(0), dBusWatch(0), @@ -158,6 +165,30 @@ SaverEngine::SaverEngine() sigaddset(&mThreadBlockSet, SIGTTIN); pthread_sigmask(SIG_BLOCK, &mThreadBlockSet, NULL); + // Initialize SmartCard readers + TDEGenericDevice *hwdevice; + TDEHardwareDevices *hwdevices = TDEGlobal::hardwareDevices(); + TDEGenericHardwareList cardReaderList = hwdevices->listByDeviceClass(TDEGenericDeviceType::CryptographicCard); + for (hwdevice = cardReaderList.first(); hwdevice; hwdevice = cardReaderList.next()) { + TDECryptographicCardDevice* cdevice = static_cast<TDECryptographicCardDevice*>(hwdevice); + connect(cdevice, TQT_SIGNAL(certificateListAvailable(TDECryptographicCardDevice*)), this, TQT_SLOT(cryptographicCardInserted(TDECryptographicCardDevice*))); + connect(cdevice, TQT_SIGNAL(cardRemoved(TDECryptographicCardDevice*)), this, TQT_SLOT(cryptographicCardRemoved(TDECryptographicCardDevice*))); + cdevice->enableCardMonitoring(true); + } + + // Check card login status + KUser userinfo; + TQString fileName = userinfo.homeDir() + "/.tde_card_login_state"; + TQFile flagFile(fileName); + if (flagFile.open(IO_ReadOnly)) { + TQTextStream stream(&flagFile); + if (stream.readLine().startsWith("1")) { + // Card was likely used to log in + TQTimer::singleShot(5000, this, SLOT(cardStartupTimeout())); + } + flagFile.close(); + } + dBusConnect(); } @@ -186,6 +217,52 @@ SaverEngine::~SaverEngine() delete m_helperThread; } +void SaverEngine::cardStartupTimeout() { + if (!mValidCryptoCardInserted) { + // Restore saver timeout + configure(); + + // Force lock + lockScreen(); + } +} + +void SaverEngine::cryptographicCardInserted(TDECryptographicCardDevice* cdevice) { + TQString login_name = TQString::null; + X509CertificatePtrList certList = cdevice->cardX509Certificates(); + if (certList.count() > 0) { + KSSLCertificate* card_cert = NULL; + card_cert = KSSLCertificate::fromX509(certList[0]); + TQStringList cert_subject_parts = TQStringList::split("/", card_cert->getSubject(), false); + for (TQStringList::Iterator it = cert_subject_parts.begin(); it != cert_subject_parts.end(); ++it ) { + TQString lcpart = (*it).lower(); + if (lcpart.startsWith("cn=")) { + login_name = lcpart.right(lcpart.length() - strlen("cn=")); + } + } + delete card_cert; + } + + if (login_name != "") { + KUser user; + if (login_name == user.loginName()) { + mValidCryptoCardInserted = true; + } + } +} + +void SaverEngine::cryptographicCardRemoved(TDECryptographicCardDevice* cdevice) { + if (mValidCryptoCardInserted) { + mValidCryptoCardInserted = false; + + // Restore saver timeout + configure(); + + // Force lock + lockScreen(); + } +} + //--------------------------------------------------------------------------- // // This should be called only using DCOP. @@ -201,8 +278,12 @@ void SaverEngine::lock() // void SaverEngine::lockScreen(bool DCOP) { + if (mValidCryptoCardInserted) { + return; + } + bool ok = true; - if (mState != Saving) + if (mState == Waiting) { ok = startLockProcess( ForceLock ); // It takes a while for kdesktop_lock to start and lock the screen. @@ -250,9 +331,10 @@ void SaverEngine::saverLockReady() //--------------------------------------------------------------------------- void SaverEngine::save() { - if (mState == Waiting) - { - startLockProcess( DefaultLock ); + if (!mValidCryptoCardInserted) { + if (mState == Waiting) { + startLockProcess( DefaultLock ); + } } } @@ -283,28 +365,25 @@ bool SaverEngine::enable( bool e ) mEnabled = e; - if (mEnabled) - { + if (mEnabled) { if ( !mXAutoLock ) { mXAutoLock = new XAutoLock(); connect(mXAutoLock, TQT_SIGNAL(timeout()), TQT_SLOT(idleTimeout())); } - mXAutoLock->setTimeout(mTimeout); - mXAutoLock->setDPMS(true); + mXAutoLock->setTimeout(mTimeout); + mXAutoLock->setDPMS(true); //mXAutoLock->changeCornerLockStatus( mLockCornerTopLeft, mLockCornerTopRight, mLockCornerBottomLeft, mLockCornerBottomRight); - // We'll handle blanking - XSetScreenSaver(tqt_xdisplay(), mTimeout + 10, mXInterval, PreferBlanking, mXExposures); - kdDebug() << "XSetScreenSaver " << mTimeout + 10 << endl; - - mXAutoLock->start(); - - kdDebug(1204) << "Saver Engine started, timeout: " << mTimeout << endl; + // We'll handle blanking + XSetScreenSaver(tqt_xdisplay(), mTimeout + 10, mXInterval, PreferBlanking, mXExposures); + kdDebug() << "XSetScreenSaver " << mTimeout + 10 << endl; + + mXAutoLock->start(); + + kdDebug(1204) << "Saver Engine started, timeout: " << mTimeout << endl; } - else - { - if (mXAutoLock) - { + else { + if (mXAutoLock) { delete mXAutoLock; mXAutoLock = 0; } @@ -652,10 +731,12 @@ void SaverEngine::lockProcessWaiting() // void SaverEngine::idleTimeout() { - // disable X screensaver - XForceScreenSaver(tqt_xdisplay(), ScreenSaverReset ); - XSetScreenSaver(tqt_xdisplay(), 0, mXInterval, PreferBlanking, DontAllowExposures); - startLockProcess( DefaultLock ); + if (!mValidCryptoCardInserted) { + // disable X screensaver + XForceScreenSaver(tqt_xdisplay(), ScreenSaverReset ); + XSetScreenSaver(tqt_xdisplay(), 0, mXInterval, PreferBlanking, DontAllowExposures); + startLockProcess( DefaultLock ); + } } xautolock_corner_t SaverEngine::applyManualSettings(int action) diff --git a/kdesktop/lockeng.h b/kdesktop/lockeng.h index 166d6b40e..11f751db8 100644 --- a/kdesktop/lockeng.h +++ b/kdesktop/lockeng.h @@ -18,6 +18,7 @@ #include <tqdbusconnection.h> +class TDECryptographicCardDevice; class DCOPClientTransaction; class TQT_DBusMessage; class TQT_DBusProxy; @@ -134,11 +135,15 @@ private slots: void handleSecureDialog(); void slotSAKProcessExited(); + void cryptographicCardInserted(TDECryptographicCardDevice*); + void cryptographicCardRemoved(TDECryptographicCardDevice*); + /** * Enable wallpaper exports */ void enableExports(); void recoverFromHackingAttempt(); + void cardStartupTimeout(); bool dBusReconnect(); @@ -186,6 +191,7 @@ private: bool mTerminationRequested; bool mSaverProcessReady; bool mNewVTAfterLockEngage; + bool mValidCryptoCardInserted; int mSwitchVTAfterLockEngage; struct sigaction mSignalAction; TQT_DBusConnection dBusConn; diff --git a/kdesktop/patterns/fish.png b/kdesktop/patterns/fish.png Binary files differindex 33de9be7c..4d7f6005c 100644 --- a/kdesktop/patterns/fish.png +++ b/kdesktop/patterns/fish.png diff --git a/kdesktop/patterns/flowers.png b/kdesktop/patterns/flowers.png Binary files differindex cab6af8eb..9ab816d09 100644 --- a/kdesktop/patterns/flowers.png +++ b/kdesktop/patterns/flowers.png diff --git a/kdesktop/patterns/pavement.png b/kdesktop/patterns/pavement.png Binary files differindex 7ba9bcf14..c06a42da5 100644 --- a/kdesktop/patterns/pavement.png +++ b/kdesktop/patterns/pavement.png diff --git a/kdesktop/patterns/rattan.png b/kdesktop/patterns/rattan.png Binary files differindex 28f600541..beccc178e 100644 --- a/kdesktop/patterns/rattan.png +++ b/kdesktop/patterns/rattan.png diff --git a/kdesktop/patterns/stonewall2.png b/kdesktop/patterns/stonewall2.png Binary files differindex cb9f10f40..a750d680f 100644 --- a/kdesktop/patterns/stonewall2.png +++ b/kdesktop/patterns/stonewall2.png diff --git a/kdesktop/patterns/triangles.png b/kdesktop/patterns/triangles.png Binary files differindex cde9068eb..6d9d637e4 100644 --- a/kdesktop/patterns/triangles.png +++ b/kdesktop/patterns/triangles.png diff --git a/kdesktop/pics/cr32-app-error.png b/kdesktop/pics/cr32-app-error.png Binary files differindex 1de7a6fda..18efe897b 100644 --- a/kdesktop/pics/cr32-app-error.png +++ b/kdesktop/pics/cr32-app-error.png diff --git a/kdesktop/pics/ksslogo.png b/kdesktop/pics/ksslogo.png Binary files differindex 953ecdddb..466215dee 100644 --- a/kdesktop/pics/ksslogo.png +++ b/kdesktop/pics/ksslogo.png diff --git a/kdesktop/pics/splash.png b/kdesktop/pics/splash.png Binary files differindex c32afcc1e..1d5738697 100644 --- a/kdesktop/pics/splash.png +++ b/kdesktop/pics/splash.png |