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
pull/2/head
Timothy Pearson 10 years ago
parent 2c1d4ad359
commit 2f7d50c20c

@ -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_hide_cancel_button;
extern bool trinity_desktop_lock_forced; extern bool trinity_desktop_lock_forced;
extern LockProcess* trinity_desktop_lock_process;
extern bool argb_visual; extern bool argb_visual;
extern pid_t kdesktop_pid; extern pid_t kdesktop_pid;
extern TQXLibWindowList trinity_desktop_lock_hidden_window_list; extern TQXLibWindowList trinity_desktop_lock_hidden_window_list;
bool trinity_desktop_lock_autohide_lockdlg = TRUE; 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 \ #define ENABLE_CONTINUOUS_LOCKDLG_DISPLAY \
if (!mForceContinualLockDisplayTimer->isActive()) mForceContinualLockDisplayTimer->start(100, FALSE); \ if (!mForceContinualLockDisplayTimer->isActive()) mForceContinualLockDisplayTimer->start(100, FALSE); \
@ -213,6 +212,9 @@ LockProcess::LockProcess()
mOverrideHackStartupEnabled(false), mOverrideHackStartupEnabled(false),
mResizingDesktopLock(false), mResizingDesktopLock(false),
mFullyOnlineSent(false), mFullyOnlineSent(false),
mClosingWindows(false),
mInSecureDialog(false),
mHackActive(false),
m_rootPixmap(NULL), m_rootPixmap(NULL),
mBackingStartupDelayTimer(0), mBackingStartupDelayTimer(0),
m_startupStatusDialog(NULL), m_startupStatusDialog(NULL),
@ -418,7 +420,7 @@ static int signal_pipe[2];
static void sigterm_handler(int) static void sigterm_handler(int)
{ {
if (!trinity_desktop_lock_in_sec_dlg) { if ((!trinity_desktop_lock_process) || (!trinity_desktop_lock_process->inSecureDialog())) {
// Exit uncleanly // Exit uncleanly
char tmp = 'U'; char tmp = 'U';
if (::write( signal_pipe[1], &tmp, 1) == -1) { if (::write( signal_pipe[1], &tmp, 1) == -1) {
@ -437,7 +439,7 @@ static void sighup_handler(int)
bool LockProcess::closeCurrentWindow() bool LockProcess::closeCurrentWindow()
{ {
trinity_desktop_lock_closing_windows = TRUE; mClosingWindows = TRUE;
if (currentDialog != NULL) { if (currentDialog != NULL) {
mForceReject = true; mForceReject = true;
if (dynamic_cast<SAKDlg*>(currentDialog)) { if (dynamic_cast<SAKDlg*>(currentDialog)) {
@ -452,12 +454,12 @@ bool LockProcess::closeCurrentWindow()
} }
if( mDialogs.isEmpty() ) { if( mDialogs.isEmpty() ) {
trinity_desktop_lock_closing_windows = FALSE; mClosingWindows = FALSE;
mForceReject = false; mForceReject = false;
return false; return false;
} }
else { else {
trinity_desktop_lock_closing_windows = TRUE; mClosingWindows = TRUE;
return true; return true;
} }
} }
@ -621,9 +623,9 @@ void LockProcess::startSecureDialog()
if (forcecontdisp) { if (forcecontdisp) {
DISABLE_CONTINUOUS_LOCKDLG_DISPLAY DISABLE_CONTINUOUS_LOCKDLG_DISPLAY
} }
trinity_desktop_lock_in_sec_dlg = false; mInSecureDialog = false;
if (ret == 0) { if (ret == 0) {
trinity_desktop_lock_closing_windows = 1; mClosingWindows = 1;
kapp->quit(); kapp->quit();
} }
if (ret == 1) { if (ret == 1) {
@ -669,14 +671,14 @@ void LockProcess::startSecureDialog()
return; return;
} }
if (ret == 2) { if (ret == 2) {
trinity_desktop_lock_closing_windows = 1; mClosingWindows = 1;
if (system("ksysguard &") == -1) { if (system("ksysguard &") == -1) {
// Error handler to shut up gcc warnings // Error handler to shut up gcc warnings
} }
kapp->quit(); kapp->quit();
} }
if (ret == 3) { 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); DCOPRef("ksmserver","ksmserver").send("logout", (int)TDEApplication::ShutdownConfirmYes, (int)TDEApplication::ShutdownTypeNone, (int)TDEApplication::ShutdownModeInteractive);
kapp->quit(); kapp->quit();
} }
@ -699,7 +701,7 @@ bool LockProcess::runSecureDialog()
tqApp->processEvents(); tqApp->processEvents();
#endif #endif
trinity_desktop_lock_in_sec_dlg = true; mInSecureDialog = true;
if (startSaver()) { if (startSaver()) {
mBackingStartupDelayTimer = 0; mBackingStartupDelayTimer = 0;
TQTimer::singleShot(0, this, TQT_SLOT(startSecureDialog())); TQTimer::singleShot(0, this, TQT_SLOT(startSecureDialog()));
@ -710,6 +712,11 @@ bool LockProcess::runSecureDialog()
} }
} }
bool LockProcess::inSecureDialog()
{
return mInSecureDialog;
}
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// //
// Read and apply configuration. // Read and apply configuration.
@ -1223,7 +1230,7 @@ bool LockProcess::grabKeyboard()
bool LockProcess::grabMouse() bool LockProcess::grabMouse()
{ {
HANDLE cursorHandle; HANDLE cursorHandle;
if (trinity_desktop_hack_active) { if (mHackActive) {
cursorHandle = TQCursor(tqblankCursor).handle(); cursorHandle = TQCursor(tqblankCursor).handle();
} }
else { else {
@ -1351,7 +1358,7 @@ bool LockProcess::startSaver(bool notify_ready)
slotPaintBackground(rootWinSnapShot); 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) { if (argb_visual) {
setTransparentBackgroundARGB(); 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) { if (trinity_desktop_lock_delay_screensaver_start && trinity_desktop_lock_forced && trinity_desktop_lock_use_system_modal_dialogs) {
ENABLE_CONTINUOUS_LOCKDLG_DISPLAY ENABLE_CONTINUOUS_LOCKDLG_DISPLAY
if (mHackStartupEnabled) mHackDelayStartupTimer->start(mHackDelayStartupTimeout, TRUE); if (mHackStartupEnabled) mHackDelayStartupTimer->start(mHackDelayStartupTimeout, TRUE);
@ -1554,7 +1561,7 @@ void LockProcess::repaintRootWindowIfNeeded()
bool LockProcess::startHack() bool LockProcess::startHack()
{ {
trinity_desktop_hack_active = TRUE; mHackActive = TRUE;
if ((mEnsureVRootWindowSecurityTimer) && (!mEnsureVRootWindowSecurityTimer->isActive())) mEnsureVRootWindowSecurityTimer->start(250, FALSE); if ((mEnsureVRootWindowSecurityTimer) && (!mEnsureVRootWindowSecurityTimer->isActive())) mEnsureVRootWindowSecurityTimer->start(250, FALSE);
@ -1715,7 +1722,7 @@ void LockProcess::stopHack()
} }
setCursor( tqarrowCursor ); 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. // Hack exited while we're supposed to be saving the screen.
// Make sure the saver window is black. // Make sure the saver window is black.
trinity_desktop_hack_active = FALSE; mHackActive = FALSE;
usleep(100); usleep(100);
TQApplication::syncX(); TQApplication::syncX();
if (!trinity_desktop_lock_use_system_modal_dialogs) { if (!trinity_desktop_lock_use_system_modal_dialogs) {
@ -1771,13 +1778,13 @@ void LockProcess::displayLockDialogIfNeeded()
m_startupStatusDialog->closeSMDialog(); m_startupStatusDialog->closeSMDialog();
m_startupStatusDialog = NULL; m_startupStatusDialog = NULL;
} }
if (!trinity_desktop_lock_in_sec_dlg) { if (!mInSecureDialog) {
if (trinity_desktop_lock_use_system_modal_dialogs) { if (trinity_desktop_lock_use_system_modal_dialogs) {
if (!mBusy) { if (!mBusy) {
mBusy = true; mBusy = true;
if (mLocked) { if (mLocked) {
if (checkPass()) { if (checkPass()) {
trinity_desktop_lock_closing_windows = true; mClosingWindows = true;
stopSaver(); stopSaver();
kapp->quit(); 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 // 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 // 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; return 0;
} }
@ -1906,7 +1913,7 @@ bool LockProcess::checkPass()
// Wait for SAK press before continuing... // Wait for SAK press before continuing...
SAKDlg inDlg( this ); SAKDlg inDlg( this );
execDialog( &inDlg ); execDialog( &inDlg );
if (trinity_desktop_lock_closing_windows) { if (mClosingWindows) {
return 0; return 0;
} }
} }
@ -1995,7 +2002,7 @@ int LockProcess::execDialog( TQDialog *dlg )
mDialogs.remove( dlg ); mDialogs.remove( dlg );
if( mDialogs.isEmpty() ) { if( mDialogs.isEmpty() ) {
HANDLE cursorHandle; HANDLE cursorHandle;
if (trinity_desktop_hack_active) { if (mHackActive) {
cursorHandle = TQCursor(tqblankCursor).handle(); cursorHandle = TQCursor(tqblankCursor).handle();
} }
else { else {
@ -2179,7 +2186,7 @@ bool LockProcess::x11Event(XEvent *event)
ENABLE_CONTINUOUS_LOCKDLG_DISPLAY ENABLE_CONTINUOUS_LOCKDLG_DISPLAY
if (mHackStartupEnabled) mHackDelayStartupTimer->start(mHackDelayStartupTimeout, TRUE); if (mHackStartupEnabled) mHackDelayStartupTimer->start(mHackDelayStartupTimeout, TRUE);
} }
if ((!mLocked) && (!trinity_desktop_lock_in_sec_dlg)) if ((!mLocked) && (!mInSecureDialog))
{ {
stopSaver(); stopSaver();
kapp->quit(); kapp->quit();
@ -2193,7 +2200,7 @@ bool LockProcess::x11Event(XEvent *event)
else { else {
if (!mLocked || checkPass()) if (!mLocked || checkPass())
{ {
trinity_desktop_lock_closing_windows = true; mClosingWindows = true;
stopSaver(); stopSaver();
kapp->quit(); kapp->quit();
} }
@ -2704,7 +2711,7 @@ void LockProcess::processInputPipeCommand(TQString inputcommand) {
closeCurrentWindow(); closeCurrentWindow();
} }
} }
trinity_desktop_lock_closing_windows = false; mClosingWindows = false;
mInfoMessageDisplayed = false; mInfoMessageDisplayed = false;
mDialogControlLock = false; mDialogControlLock = false;
} }
@ -2728,7 +2735,7 @@ void LockProcess::processInputPipeCommand(TQString inputcommand) {
inDlg.setUnlockIcon(); inDlg.setUnlockIcon();
execDialog( &inDlg ); execDialog( &inDlg );
mForceReject = false; mForceReject = false;
trinity_desktop_lock_closing_windows = false; mClosingWindows = false;
return; return;
} }
if ((command[0] == 'E') || (command[0] == 'W') || (command[0] == 'I') || (command[0] == 'K')) { 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(); if (command[0] == 'E') inDlg.setErrorIcon();
execDialog( &inDlg ); execDialog( &inDlg );
mForceReject = false; mForceReject = false;
trinity_desktop_lock_closing_windows = false; mClosingWindows = false;
return; return;
} }
if (command[0] == 'Q') { if (command[0] == 'Q') {
@ -2790,7 +2797,7 @@ void LockProcess::processInputPipeCommand(TQString inputcommand) {
} }
} }
mForceReject = false; mForceReject = false;
trinity_desktop_lock_closing_windows = false; mClosingWindows = false;
return; return;
} }
} }

@ -86,6 +86,7 @@ public:
bool dontLock(); bool dontLock();
bool runSecureDialog(); bool runSecureDialog();
bool inSecureDialog();
void setChildren(TQValueList<int> children) { child_sockets = children; } void setChildren(TQValueList<int> children) { child_sockets = children; }
void setParent(int fd) { mParent = fd; } void setParent(int fd) { mParent = fd; }
@ -226,6 +227,10 @@ private:
bool mResizingDesktopLock; bool mResizingDesktopLock;
bool mFullyOnlineSent; bool mFullyOnlineSent;
bool mClosingWindows;
bool mInSecureDialog;
bool mHackActive;
TQPixmap backingPixmap; TQPixmap backingPixmap;
KRootPixmap *m_rootPixmap; KRootPixmap *m_rootPixmap;
int mBackingStartupDelayTimer; int mBackingStartupDelayTimer;

@ -73,6 +73,8 @@ bool trinity_desktop_lock_hide_active_windows = FALSE;
bool trinity_desktop_lock_hide_cancel_button = FALSE; bool trinity_desktop_lock_hide_cancel_button = FALSE;
bool trinity_desktop_lock_forced = FALSE; bool trinity_desktop_lock_forced = FALSE;
LockProcess* trinity_desktop_lock_process = NULL;
bool signalled_forcelock; bool signalled_forcelock;
bool signalled_dontlock; bool signalled_dontlock;
bool signalled_securedialog; bool signalled_securedialog;
@ -82,6 +84,7 @@ bool in_internal_mode = FALSE;
bool argb_visual = FALSE; bool argb_visual = FALSE;
pid_t kdesktop_pid = -1; pid_t kdesktop_pid = -1;
bool trinity_desktop_lock_settings_initialized = FALSE;
static void sigusr1_handler(int) static void sigusr1_handler(int)
{ {
@ -241,6 +244,8 @@ int main( int argc, char **argv )
XSetErrorHandler(trapXErrors); XSetErrorHandler(trapXErrors);
MyApp* app = NULL;
while (1 == 1) { while (1 == 1) {
signalled_forcelock = FALSE; signalled_forcelock = FALSE;
signalled_dontlock = FALSE; signalled_dontlock = FALSE;
@ -311,12 +316,14 @@ int main( int argc, char **argv )
} }
} }
if (!app) {
#ifdef COMPOSITE #ifdef COMPOSITE
MyApp app(TDEApplication::openX11RGBADisplay()); app = new MyApp(TDEApplication::openX11RGBADisplay());
argb_visual = app.isX11CompositionAvailable(); argb_visual = app->isX11CompositionAvailable();
#else #else
MyApp app; app = new MyApp;
#endif #endif
}
TDELockFile lock(locateLocal("tmp", "kdesktop_lock_lockfile")); TDELockFile lock(locateLocal("tmp", "kdesktop_lock_lockfile"));
lock.setStaleTime(0); 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; kdDebug() << "app " << kdesktop_screen_number << " " << starting_screen << " " << child << " " << child_sockets.count() << " " << parent_connection << endl;
app.disableSessionManagement(); app->disableSessionManagement();
TDEGlobal::locale()->insertCatalogue("libdmctl"); TDEGlobal::locale()->insertCatalogue("libdmctl");
struct stat st; struct stat st;
KSimpleConfig* tdmconfig; KSimpleConfig* tdmconfig;
OPEN_TDMCONFIG_AND_SET_GROUP OPEN_TDMCONFIG_AND_SET_GROUP
LockProcess process; trinity_desktop_lock_process = new LockProcess;
// Start loading core functions, such as the desktop wallpaper interface // Start loading core functions, such as the desktop wallpaper interface
app.processEvents(); app->processEvents();
if (args->isSet( "internal" )) { if (args->isSet( "internal" )) {
kdesktop_pid = atoi(args->getOption( "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 // Disable reception of all X11 events on the root window
XSelectInput( tqt_xdisplay(), tqt_xrootwin(), 0 ); XSelectInput( tqt_xdisplay(), tqt_xrootwin(), 0 );
app.processEvents(); app->processEvents();
// wait for SIGUSR1, SIGUSR2, SIGWINCH, SIGTTIN, or SIGTTOU // wait for SIGUSR1, SIGUSR2, SIGWINCH, SIGTTIN, or SIGTTOU
sigsuspend(&new_mask); sigsuspend(&new_mask);
@ -438,10 +445,15 @@ int main( int argc, char **argv )
} }
} }
// load settings here so that they actually reflect reality // (re)load settings here so that they actually reflect reality
// there is no way to force a reload once KDesktopSettings::instance has been called!
// we need to read from the right rc file - possibly taking screen number in account // 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_use_system_modal_dialogs = !KDesktopSettings::useUnmanagedLockWindows();
trinity_desktop_lock_delay_screensaver_start = KDesktopSettings::delaySaverStart(); trinity_desktop_lock_delay_screensaver_start = KDesktopSettings::delaySaverStart();
if (trinity_desktop_lock_use_system_modal_dialogs) { if (trinity_desktop_lock_use_system_modal_dialogs) {
@ -464,32 +476,32 @@ int main( int argc, char **argv )
trinity_desktop_lock_forced = TRUE; 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) { if (!child) {
process.setChildren(child_sockets); trinity_desktop_lock_process->setChildren(child_sockets);
} }
else { else {
process.setParent(parent_connection); trinity_desktop_lock_process->setParent(parent_connection);
} }
bool rt; bool rt;
if( (((!child) && (args->isSet( "forcelock" ))) || (signalled_forcelock == TRUE))) { 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))) { 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))) { else if( child || (args->isSet( "securedialog" ) || (signalled_securedialog == TRUE))) {
int retcode = tde_sak_verify_calling_process(); int retcode = tde_sak_verify_calling_process();
if (retcode == 0) { if (retcode == 0) {
rt = process.runSecureDialog(); rt = trinity_desktop_lock_process->runSecureDialog();
} }
else { else {
return 1; return 1;
} }
} }
else { else {
rt = process.defaultSave(); rt = trinity_desktop_lock_process->defaultSave();
} }
if (!rt) { if (!rt) {
return 0; return 0;
@ -497,7 +509,7 @@ int main( int argc, char **argv )
if (in_internal_mode == FALSE) { if (in_internal_mode == FALSE) {
trinity_desktop_lock_hidden_window_list.clear(); trinity_desktop_lock_hidden_window_list.clear();
int ret = app.exec(); int ret = app->exec();
restore_hidden_override_redirect_windows(); restore_hidden_override_redirect_windows();
return ret; return ret;
} }
@ -507,18 +519,23 @@ int main( int argc, char **argv )
return 12; return 12;
} }
trinity_desktop_lock_hidden_window_list.clear(); trinity_desktop_lock_hidden_window_list.clear();
app.exec(); app->exec();
restore_hidden_override_redirect_windows(); restore_hidden_override_redirect_windows();
if (kill(kdesktop_pid, SIGUSR1) < 0) { if (kill(kdesktop_pid, SIGUSR1) < 0) {
// The controlling kdesktop process probably died. Commit suicide... // The controlling kdesktop process probably died. Commit suicide...
return 12; return 12;
} }
delete trinity_desktop_lock_process;
trinity_desktop_lock_process = NULL;
#if 0
// FIXME // FIXME
// We should not have to return (restart) at all, // We should not have to return (restart) at all,
// but it seems that some X11 connections are left active, // but it seems that some X11 connections are left active,
// preventing the lock process from restarting properly in the while() loop above. // preventing the lock process from restarting properly in the while() loop above.
return 0; return 0;
#endif
} }
} }
} }

@ -36,6 +36,6 @@ signals:
void mouseInteraction(XEvent *event); void mouseInteraction(XEvent *event);
private: private:
time_t lastTick; time_t lastTick;
}; };
#endif #endif

Loading…
Cancel
Save