diff options
Diffstat (limited to 'kdesktop/lock/main.cpp')
-rw-r--r-- | kdesktop/lock/main.cpp | 136 |
1 files changed, 71 insertions, 65 deletions
diff --git a/kdesktop/lock/main.cpp b/kdesktop/lock/main.cpp index f1407070c..9f707c35d 100644 --- a/kdesktop/lock/main.cpp +++ b/kdesktop/lock/main.cpp @@ -33,14 +33,14 @@ #include <kdebug.h> #include <tdeglobalsettings.h> #include <dcopref.h> -#include <ksimpleconfig.h> -#include <kstandarddirs.h> +#include <tdesimpleconfig.h> +#include <tdestandarddirs.h> #include <tdmtsak.h> #include <stdlib.h> -#if defined(Q_WS_X11) && defined(HAVE_XRENDER) && TQT_VERSION >= 0x030300 +#if defined(TQ_WS_X11) && defined(HAVE_XRENDER) && TQT_VERSION >= 0x030300 #define COMPOSITE #endif @@ -58,49 +58,49 @@ TQXLibWindowList trinity_desktop_lock_hidden_window_list; // [FIXME] Add GUI configuration checkboxes for these three settings (see kdesktoprc [ScreenSaver] UseUnmanagedLockWindows, DelaySaverStart, and UseTDESAK) -bool trinity_desktop_lock_use_system_modal_dialogs = FALSE; -bool trinity_desktop_lock_delay_screensaver_start = FALSE; -bool trinity_desktop_lock_use_sak = FALSE; -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 trinity_desktop_lock_use_system_modal_dialogs = false; +bool trinity_desktop_lock_delay_screensaver_start = false; +bool trinity_desktop_lock_use_sak = false; +bool trinity_desktop_lock_hide_active_windows = false; +bool trinity_desktop_lock_hide_cancel_button = false; +bool trinity_desktop_lock_forced = false; +// This is a temporary variable used till a fix for the grab issue is prepared +bool trinity_desktop_lock_failed_grab = false; bool signalled_forcelock; bool signalled_dontlock; bool signalled_securedialog; bool signalled_blank; bool signalled_run; -bool in_internal_mode = FALSE; +bool in_internal_mode = false; -bool argb_visual = FALSE; +bool argb_visual = false; pid_t kdesktop_pid = -1; -bool trinity_desktop_lock_settings_initialized = FALSE; +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) +static void sigwinch_handler(int) { - signalled_securedialog = TRUE; + signalled_securedialog = true; } -static void sigusr4_handler(int) +static void sigttin_handler(int) { - signalled_blank = TRUE; + signalled_blank = true; } -static void sigusr5_handler(int) +static void sigttou_handler(int) { - signalled_run = TRUE; + signalled_run = true; } static int trapXErrors(Display *, XErrorEvent *) @@ -236,9 +236,9 @@ int main( int argc, char **argv ) XSetErrorHandler(trapXErrors); - MyApp* app = NULL; + MyApp *app = nullptr; - while (1 == 1) { + while (true) { sigset_t new_mask; sigset_t orig_mask; @@ -246,11 +246,11 @@ int main( int argc, char **argv ) sigfillset(&new_mask); sigprocmask(SIG_BLOCK, &new_mask, NULL); - signalled_forcelock = FALSE; - signalled_dontlock = FALSE; - signalled_securedialog = FALSE; - signalled_blank = FALSE; - signalled_run = FALSE; + signalled_forcelock = false; + signalled_dontlock = false; + signalled_securedialog = false; + signalled_blank = false; + signalled_run = false; int kdesktop_screen_number = 0; int starting_screen = 0; @@ -261,7 +261,7 @@ int main( int argc, char **argv ) if (TDEGlobalSettings::isMultiHead()) { Display *dpy = XOpenDisplay(NULL); - if (! dpy) { + if (!dpy) { fprintf(stderr, "%s: FATAL ERROR: couldn't open display '%s'\n", argv[0], XDisplayName(NULL)); @@ -303,14 +303,11 @@ int main( int argc, char **argv ) } } - env.sprintf("DISPLAY=%s.%d", display_name.data(), - kdesktop_screen_number); + 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]); + fprintf(stderr, "%s: WARNING: unable to set DISPLAY environment variable\n", argv[0]); perror("putenv()"); } } @@ -374,17 +371,17 @@ int main( int argc, char **argv ) TDEGlobal::locale()->insertCatalogue("libdmctl"); struct stat st; - KSimpleConfig* tdmconfig; + TDESimpleConfig* tdmconfig; if( stat( KDE_CONFDIR "/tdm/tdmdistrc" , &st ) == 0) { - tdmconfig = new KSimpleConfig( TQString::fromLatin1( KDE_CONFDIR "/tdm/tdmdistrc" )); + tdmconfig = new TDESimpleConfig( TQString::fromLatin1( KDE_CONFDIR "/tdm/tdmdistrc" )); } else { - tdmconfig = new KSimpleConfig( TQString::fromLatin1( KDE_CONFDIR "/tdm/tdmrc" )); + tdmconfig = new TDESimpleConfig( TQString::fromLatin1( KDE_CONFDIR "/tdm/tdmrc" )); } tdmconfig->setGroup("X-:*-Greeter"); // Create new LockProcess, which also spawns threads inheriting the blocked signal mask - trinity_desktop_lock_process = new LockProcess; + LockProcess lock_process; // Unblock reception of all signals in this thread sigprocmask(SIG_UNBLOCK, &new_mask, NULL); @@ -396,7 +393,7 @@ int main( int argc, char **argv ) kdesktop_pid = atoi(args->getOption( "internal" )); struct sigaction act; - in_internal_mode = TRUE; + in_internal_mode = true; // handle SIGUSR1 act.sa_handler= sigusr1_handler; @@ -410,20 +407,20 @@ int main( int argc, char **argv ) sigaddset(&(act.sa_mask), SIGUSR2); act.sa_flags = 0; sigaction(SIGUSR2, &act, 0L); - // handle SIGWINCH (an ersatz SIGUSR3) - act.sa_handler= sigusr3_handler; + // handle SIGWINCH (as custom user signal rather than its inherent meaning) + act.sa_handler= sigwinch_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; + // handle SIGTTIN (as custom user signal rather than its inherent meaning) + act.sa_handler= sigttin_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; + // handle SIGTTOU (as custom user signal rather than its inherent meaning) + act.sa_handler= sigttou_handler; sigemptyset(&(act.sa_mask)); sigaddset(&(act.sa_mask), SIGTTOU); act.sa_flags = 0; @@ -437,7 +434,7 @@ int main( int argc, char **argv ) sigaddset(&new_mask,SIGTTIN); sigaddset(&new_mask,SIGTTOU); - while (signalled_run == FALSE) { + while (!signalled_run) { // let kdesktop know the saver process is ready if (kill(kdesktop_pid, SIGTTIN) < 0) { // The controlling kdesktop process probably died. Commit suicide... @@ -454,7 +451,7 @@ int main( int argc, char **argv ) // wait for SIGUSR1, SIGUSR2, SIGWINCH, SIGTTIN, or SIGTTOU sigprocmask(SIG_BLOCK, &new_mask, &orig_mask); - if (signalled_run != TRUE) { + if (!signalled_run) { sigsuspend(&orig_mask); } sigprocmask(SIG_UNBLOCK, &new_mask, NULL); @@ -494,42 +491,54 @@ int main( int argc, char **argv ) delete tdmconfig; - if (args->isSet( "forcelock" ) || (signalled_forcelock == TRUE)) { - trinity_desktop_lock_forced = TRUE; + if (args->isSet( "forcelock" ) || signalled_forcelock) { + trinity_desktop_lock_forced = true; } - trinity_desktop_lock_process->init(child, (args->isSet( "blank" ) || (signalled_blank == TRUE))); + lock_process.init(child, (args->isSet( "blank" ) || signalled_blank)); if (!child) { - trinity_desktop_lock_process->setChildren(child_sockets); + lock_process.setChildren(child_sockets); } else { - trinity_desktop_lock_process->setParent(parent_connection); + lock_process.setParent(parent_connection); } + trinity_desktop_lock_failed_grab = false; bool rt; - if( (((!child) && (args->isSet( "forcelock" ))) || (signalled_forcelock == TRUE))) { - rt = trinity_desktop_lock_process->lock(); + if( (!child && args->isSet( "forcelock" )) || signalled_forcelock) { + rt = lock_process.lock(); } - else if( child || (args->isSet( "dontlock" ) || (signalled_dontlock == TRUE))) { - rt = trinity_desktop_lock_process->dontLock(); + else if( child || (args->isSet( "dontlock" ) || signalled_dontlock)) { + rt = lock_process.dontLock(); } - else if( child || (args->isSet( "securedialog" ) || (signalled_securedialog == TRUE))) { + else if( child || (args->isSet( "securedialog" ) || signalled_securedialog)) { int retcode = tde_sak_verify_calling_process(); if (retcode == 0) { - rt = trinity_desktop_lock_process->runSecureDialog(); + rt = lock_process.runSecureDialog(); } else { return 1; } } else { - rt = trinity_desktop_lock_process->defaultSave(); + rt = lock_process.defaultSave(); } + + // Make sure to handle all pending responses from the X server. + // If we don't do this, in case of failed activation of the saver/lock screen, + // we will end up in a dirty state and the screen lock will no longer hide the windows + // on the screen due to 'm_rootPixmap' failing to load the background image. + // This is caused by a 'XConvertSelection' request in 'TDESharedPixmap::loadFromShared' + // not being handled and causing the corresponding property to become unusuable in X for + // subsequent lock requests. + XSync(tqt_xdisplay(), False); + app->processEvents(); + if (!rt) { - return 0; + return (trinity_desktop_lock_failed_grab ? 0 : 12); } - if (in_internal_mode == FALSE) { + if (!in_internal_mode) { trinity_desktop_lock_hidden_window_list.clear(); int ret = app->exec(); restore_hidden_override_redirect_windows(); @@ -548,9 +557,6 @@ int main( int argc, char **argv ) 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, |