summaryrefslogtreecommitdiffstats
path: root/kdesktop/lock/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kdesktop/lock/main.cpp')
-rw-r--r--kdesktop/lock/main.cpp136
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,