From 2f7d50c20cebb33745c0ecea5a5b6cc3f4747d6e Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Fri, 28 Nov 2014 17:12:06 -0600 Subject: Fix kdesktop_lock requiring a process stop/start on unlock Attempt to fix kdesktop_lock start/stop causing dcop failures by keeping kdesktop_lock process running across lock/unlock cycles --- kdesktop/lock/lockprocess.cc | 65 ++++++++++++++++++++++++-------------------- kdesktop/lock/lockprocess.h | 5 ++++ kdesktop/lock/main.cc | 55 ++++++++++++++++++++++++------------- kdesktop/lock/main.h | 2 +- 4 files changed, 78 insertions(+), 49 deletions(-) (limited to 'kdesktop') diff --git a/kdesktop/lock/lockprocess.cc b/kdesktop/lock/lockprocess.cc index 3dacc7ff3..9612f5cca 100644 --- a/kdesktop/lock/lockprocess.cc +++ b/kdesktop/lock/lockprocess.cc @@ -159,15 +159,14 @@ extern bool trinity_desktop_lock_hide_active_windows; extern bool trinity_desktop_lock_hide_cancel_button; extern bool trinity_desktop_lock_forced; +extern LockProcess* trinity_desktop_lock_process; + extern bool argb_visual; extern pid_t kdesktop_pid; extern TQXLibWindowList trinity_desktop_lock_hidden_window_list; bool trinity_desktop_lock_autohide_lockdlg = TRUE; -bool trinity_desktop_lock_closing_windows = FALSE; -bool trinity_desktop_lock_in_sec_dlg = FALSE; -bool trinity_desktop_hack_active = FALSE; #define ENABLE_CONTINUOUS_LOCKDLG_DISPLAY \ if (!mForceContinualLockDisplayTimer->isActive()) mForceContinualLockDisplayTimer->start(100, FALSE); \ @@ -213,6 +212,9 @@ LockProcess::LockProcess() mOverrideHackStartupEnabled(false), mResizingDesktopLock(false), mFullyOnlineSent(false), + mClosingWindows(false), + mInSecureDialog(false), + mHackActive(false), m_rootPixmap(NULL), mBackingStartupDelayTimer(0), m_startupStatusDialog(NULL), @@ -418,7 +420,7 @@ static int signal_pipe[2]; static void sigterm_handler(int) { - if (!trinity_desktop_lock_in_sec_dlg) { + if ((!trinity_desktop_lock_process) || (!trinity_desktop_lock_process->inSecureDialog())) { // Exit uncleanly char tmp = 'U'; if (::write( signal_pipe[1], &tmp, 1) == -1) { @@ -437,7 +439,7 @@ static void sighup_handler(int) bool LockProcess::closeCurrentWindow() { - trinity_desktop_lock_closing_windows = TRUE; + mClosingWindows = TRUE; if (currentDialog != NULL) { mForceReject = true; if (dynamic_cast(currentDialog)) { @@ -452,12 +454,12 @@ bool LockProcess::closeCurrentWindow() } if( mDialogs.isEmpty() ) { - trinity_desktop_lock_closing_windows = FALSE; + mClosingWindows = FALSE; mForceReject = false; return false; } else { - trinity_desktop_lock_closing_windows = TRUE; + mClosingWindows = TRUE; return true; } } @@ -621,9 +623,9 @@ void LockProcess::startSecureDialog() if (forcecontdisp) { DISABLE_CONTINUOUS_LOCKDLG_DISPLAY } - trinity_desktop_lock_in_sec_dlg = false; + mInSecureDialog = false; if (ret == 0) { - trinity_desktop_lock_closing_windows = 1; + mClosingWindows = 1; kapp->quit(); } if (ret == 1) { @@ -669,14 +671,14 @@ void LockProcess::startSecureDialog() return; } if (ret == 2) { - trinity_desktop_lock_closing_windows = 1; + mClosingWindows = 1; if (system("ksysguard &") == -1) { // Error handler to shut up gcc warnings } kapp->quit(); } if (ret == 3) { - trinity_desktop_lock_closing_windows = 1; + mClosingWindows = 1; DCOPRef("ksmserver","ksmserver").send("logout", (int)TDEApplication::ShutdownConfirmYes, (int)TDEApplication::ShutdownTypeNone, (int)TDEApplication::ShutdownModeInteractive); kapp->quit(); } @@ -699,7 +701,7 @@ bool LockProcess::runSecureDialog() tqApp->processEvents(); #endif - trinity_desktop_lock_in_sec_dlg = true; + mInSecureDialog = true; if (startSaver()) { mBackingStartupDelayTimer = 0; TQTimer::singleShot(0, this, TQT_SLOT(startSecureDialog())); @@ -710,6 +712,11 @@ bool LockProcess::runSecureDialog() } } +bool LockProcess::inSecureDialog() +{ + return mInSecureDialog; +} + //--------------------------------------------------------------------------- // // Read and apply configuration. @@ -1223,7 +1230,7 @@ bool LockProcess::grabKeyboard() bool LockProcess::grabMouse() { HANDLE cursorHandle; - if (trinity_desktop_hack_active) { + if (mHackActive) { cursorHandle = TQCursor(tqblankCursor).handle(); } else { @@ -1351,7 +1358,7 @@ bool LockProcess::startSaver(bool notify_ready) slotPaintBackground(rootWinSnapShot); } - if (((!(trinity_desktop_lock_delay_screensaver_start && trinity_desktop_lock_forced)) && (!trinity_desktop_lock_in_sec_dlg)) && (mHackStartupEnabled || mOverrideHackStartupEnabled)) { + if (((!(trinity_desktop_lock_delay_screensaver_start && trinity_desktop_lock_forced)) && (!mInSecureDialog)) && (mHackStartupEnabled || mOverrideHackStartupEnabled)) { if (argb_visual) { setTransparentBackgroundARGB(); } @@ -1377,7 +1384,7 @@ bool LockProcess::startSaver(bool notify_ready) } } - if (trinity_desktop_lock_in_sec_dlg == FALSE) { + if (mInSecureDialog == FALSE) { if (trinity_desktop_lock_delay_screensaver_start && trinity_desktop_lock_forced && trinity_desktop_lock_use_system_modal_dialogs) { ENABLE_CONTINUOUS_LOCKDLG_DISPLAY if (mHackStartupEnabled) mHackDelayStartupTimer->start(mHackDelayStartupTimeout, TRUE); @@ -1554,7 +1561,7 @@ void LockProcess::repaintRootWindowIfNeeded() bool LockProcess::startHack() { - trinity_desktop_hack_active = TRUE; + mHackActive = TRUE; if ((mEnsureVRootWindowSecurityTimer) && (!mEnsureVRootWindowSecurityTimer->isActive())) mEnsureVRootWindowSecurityTimer->start(250, FALSE); @@ -1715,7 +1722,7 @@ void LockProcess::stopHack() } setCursor( tqarrowCursor ); - trinity_desktop_hack_active = FALSE; + mHackActive = FALSE; } //--------------------------------------------------------------------------- @@ -1724,7 +1731,7 @@ void LockProcess::hackExited(TDEProcess *) { // Hack exited while we're supposed to be saving the screen. // Make sure the saver window is black. - trinity_desktop_hack_active = FALSE; + mHackActive = FALSE; usleep(100); TQApplication::syncX(); if (!trinity_desktop_lock_use_system_modal_dialogs) { @@ -1771,13 +1778,13 @@ void LockProcess::displayLockDialogIfNeeded() m_startupStatusDialog->closeSMDialog(); m_startupStatusDialog = NULL; } - if (!trinity_desktop_lock_in_sec_dlg) { + if (!mInSecureDialog) { if (trinity_desktop_lock_use_system_modal_dialogs) { if (!mBusy) { mBusy = true; if (mLocked) { if (checkPass()) { - trinity_desktop_lock_closing_windows = true; + mClosingWindows = true; stopSaver(); kapp->quit(); } @@ -1886,7 +1893,7 @@ bool LockProcess::checkPass() // 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 (trinity_desktop_lock_closing_windows) { + if (mClosingWindows) { return 0; } @@ -1906,7 +1913,7 @@ bool LockProcess::checkPass() // Wait for SAK press before continuing... SAKDlg inDlg( this ); execDialog( &inDlg ); - if (trinity_desktop_lock_closing_windows) { + if (mClosingWindows) { return 0; } } @@ -1995,7 +2002,7 @@ int LockProcess::execDialog( TQDialog *dlg ) mDialogs.remove( dlg ); if( mDialogs.isEmpty() ) { HANDLE cursorHandle; - if (trinity_desktop_hack_active) { + if (mHackActive) { cursorHandle = TQCursor(tqblankCursor).handle(); } else { @@ -2179,7 +2186,7 @@ bool LockProcess::x11Event(XEvent *event) ENABLE_CONTINUOUS_LOCKDLG_DISPLAY if (mHackStartupEnabled) mHackDelayStartupTimer->start(mHackDelayStartupTimeout, TRUE); } - if ((!mLocked) && (!trinity_desktop_lock_in_sec_dlg)) + if ((!mLocked) && (!mInSecureDialog)) { stopSaver(); kapp->quit(); @@ -2193,7 +2200,7 @@ bool LockProcess::x11Event(XEvent *event) else { if (!mLocked || checkPass()) { - trinity_desktop_lock_closing_windows = true; + mClosingWindows = true; stopSaver(); kapp->quit(); } @@ -2704,7 +2711,7 @@ void LockProcess::processInputPipeCommand(TQString inputcommand) { closeCurrentWindow(); } } - trinity_desktop_lock_closing_windows = false; + mClosingWindows = false; mInfoMessageDisplayed = false; mDialogControlLock = false; } @@ -2728,7 +2735,7 @@ void LockProcess::processInputPipeCommand(TQString inputcommand) { inDlg.setUnlockIcon(); execDialog( &inDlg ); mForceReject = false; - trinity_desktop_lock_closing_windows = false; + mClosingWindows = false; return; } if ((command[0] == 'E') || (command[0] == 'W') || (command[0] == 'I') || (command[0] == 'K')) { @@ -2754,7 +2761,7 @@ void LockProcess::processInputPipeCommand(TQString inputcommand) { if (command[0] == 'E') inDlg.setErrorIcon(); execDialog( &inDlg ); mForceReject = false; - trinity_desktop_lock_closing_windows = false; + mClosingWindows = false; return; } if (command[0] == 'Q') { @@ -2790,7 +2797,7 @@ void LockProcess::processInputPipeCommand(TQString inputcommand) { } } mForceReject = false; - trinity_desktop_lock_closing_windows = false; + mClosingWindows = false; return; } } diff --git a/kdesktop/lock/lockprocess.h b/kdesktop/lock/lockprocess.h index 85e9cdd31..e063b9669 100644 --- a/kdesktop/lock/lockprocess.h +++ b/kdesktop/lock/lockprocess.h @@ -86,6 +86,7 @@ public: bool dontLock(); bool runSecureDialog(); + bool inSecureDialog(); void setChildren(TQValueList children) { child_sockets = children; } void setParent(int fd) { mParent = fd; } @@ -226,6 +227,10 @@ private: bool mResizingDesktopLock; bool mFullyOnlineSent; + bool mClosingWindows; + bool mInSecureDialog; + bool mHackActive; + TQPixmap backingPixmap; KRootPixmap *m_rootPixmap; int mBackingStartupDelayTimer; diff --git a/kdesktop/lock/main.cc b/kdesktop/lock/main.cc index d5f037f56..ce3be3f14 100644 --- a/kdesktop/lock/main.cc +++ b/kdesktop/lock/main.cc @@ -73,6 +73,8 @@ bool trinity_desktop_lock_hide_active_windows = FALSE; bool trinity_desktop_lock_hide_cancel_button = FALSE; bool trinity_desktop_lock_forced = FALSE; +LockProcess* trinity_desktop_lock_process = NULL; + bool signalled_forcelock; bool signalled_dontlock; bool signalled_securedialog; @@ -82,6 +84,7 @@ bool in_internal_mode = FALSE; bool argb_visual = FALSE; pid_t kdesktop_pid = -1; +bool trinity_desktop_lock_settings_initialized = FALSE; static void sigusr1_handler(int) { @@ -241,6 +244,8 @@ int main( int argc, char **argv ) XSetErrorHandler(trapXErrors); + MyApp* app = NULL; + while (1 == 1) { signalled_forcelock = FALSE; signalled_dontlock = FALSE; @@ -311,12 +316,14 @@ int main( int argc, char **argv ) } } + if (!app) { #ifdef COMPOSITE - MyApp app(TDEApplication::openX11RGBADisplay()); - argb_visual = app.isX11CompositionAvailable(); + app = new MyApp(TDEApplication::openX11RGBADisplay()); + argb_visual = app->isX11CompositionAvailable(); #else - MyApp app; + app = new MyApp; #endif + } TDELockFile lock(locateLocal("tmp", "kdesktop_lock_lockfile")); lock.setStaleTime(0); @@ -357,17 +364,17 @@ int main( int argc, char **argv ) } kdDebug() << "app " << kdesktop_screen_number << " " << starting_screen << " " << child << " " << child_sockets.count() << " " << parent_connection << endl; - app.disableSessionManagement(); + app->disableSessionManagement(); TDEGlobal::locale()->insertCatalogue("libdmctl"); struct stat st; KSimpleConfig* tdmconfig; OPEN_TDMCONFIG_AND_SET_GROUP - LockProcess process; + trinity_desktop_lock_process = new LockProcess; // Start loading core functions, such as the desktop wallpaper interface - app.processEvents(); + app->processEvents(); if (args->isSet( "internal" )) { kdesktop_pid = atoi(args->getOption( "internal" )); @@ -428,7 +435,7 @@ int main( int argc, char **argv ) // Disable reception of all X11 events on the root window XSelectInput( tqt_xdisplay(), tqt_xrootwin(), 0 ); - app.processEvents(); + app->processEvents(); // wait for SIGUSR1, SIGUSR2, SIGWINCH, SIGTTIN, or SIGTTOU sigsuspend(&new_mask); @@ -438,10 +445,15 @@ int main( int argc, char **argv ) } } - // load settings here so that they actually reflect reality - // there is no way to force a reload once KDesktopSettings::instance has been called! + // (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 - KDesktopSettings::instance("kdesktoprc"); + 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) { @@ -464,32 +476,32 @@ int main( int argc, char **argv ) trinity_desktop_lock_forced = TRUE; } - process.init(child, (args->isSet( "blank" ) || (signalled_blank == TRUE))); + trinity_desktop_lock_process->init(child, (args->isSet( "blank" ) || (signalled_blank == TRUE))); if (!child) { - process.setChildren(child_sockets); + trinity_desktop_lock_process->setChildren(child_sockets); } else { - process.setParent(parent_connection); + trinity_desktop_lock_process->setParent(parent_connection); } bool rt; if( (((!child) && (args->isSet( "forcelock" ))) || (signalled_forcelock == TRUE))) { - rt = process.lock(); + rt = trinity_desktop_lock_process->lock(); } else if( child || (args->isSet( "dontlock" ) || (signalled_dontlock == TRUE))) { - rt = process.dontLock(); + 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 = process.runSecureDialog(); + rt = trinity_desktop_lock_process->runSecureDialog(); } else { return 1; } } else { - rt = process.defaultSave(); + rt = trinity_desktop_lock_process->defaultSave(); } if (!rt) { return 0; @@ -497,7 +509,7 @@ int main( int argc, char **argv ) if (in_internal_mode == FALSE) { trinity_desktop_lock_hidden_window_list.clear(); - int ret = app.exec(); + int ret = app->exec(); restore_hidden_override_redirect_windows(); return ret; } @@ -507,18 +519,23 @@ int main( int argc, char **argv ) return 12; } trinity_desktop_lock_hidden_window_list.clear(); - app.exec(); + 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; + +#if 0 // 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; +#endif } } } diff --git a/kdesktop/lock/main.h b/kdesktop/lock/main.h index 6caaa0898..da3accda2 100644 --- a/kdesktop/lock/main.h +++ b/kdesktop/lock/main.h @@ -36,6 +36,6 @@ signals: void mouseInteraction(XEvent *event); private: time_t lastTick; -}; +}; #endif -- cgit v1.2.3