summaryrefslogtreecommitdiffstats
path: root/kdesktop/lock
diff options
context:
space:
mode:
Diffstat (limited to 'kdesktop/lock')
-rw-r--r--kdesktop/lock/lockprocess.cc36
1 files changed, 33 insertions, 3 deletions
diff --git a/kdesktop/lock/lockprocess.cc b/kdesktop/lock/lockprocess.cc
index dc8d4d330..acb4889a9 100644
--- a/kdesktop/lock/lockprocess.cc
+++ b/kdesktop/lock/lockprocess.cc
@@ -141,6 +141,7 @@ extern bool trinity_desktop_lock_forced;
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); \
@@ -1080,9 +1081,16 @@ bool LockProcess::grabKeyboard()
//
bool LockProcess::grabMouse()
{
+ HANDLE cursorHandle;
+ if (trinity_desktop_hack_active) {
+ cursorHandle = TQCursor(tqblankCursor).handle();
+ }
+ else {
+ cursorHandle = TQCursor(tqbusyCursor).handle();
+ }
int rv = XGrabPointer( tqt_xdisplay(), TQApplication::desktop()->winId(),
True, GRABEVENTS, GrabModeAsync, GrabModeAsync, None,
- TQCursor(tqbusyCursor).handle(), CurrentTime );
+ cursorHandle, CurrentTime );
return (rv == GrabSuccess);
}
@@ -1331,7 +1339,10 @@ void LockProcess::repaintRootWindowIfNeeded()
bool LockProcess::startHack()
{
+ trinity_desktop_hack_active = TRUE;
+
setCursor( tqblankCursor );
+ XChangeActivePointerGrab( tqt_xdisplay(), GRABEVENTS, TQCursor(tqblankCursor).handle(), CurrentTime);
if ((mEnsureVRootWindowSecurityTimer) && (!mEnsureVRootWindowSecurityTimer->isActive())) mEnsureVRootWindowSecurityTimer->start(250, FALSE);
@@ -1401,7 +1412,7 @@ bool LockProcess::startHack()
#endif
//bitBlt(this, 0, 0, &mOriginal);
DISABLE_CONTINUOUS_LOCKDLG_DISPLAY
- if (trinity_desktop_lock_delay_screensaver_start && trinity_desktop_lock_forced) {
+ if (trinity_desktop_lock_delay_screensaver_start && trinity_desktop_lock_forced) {
// Close any active dialogs
if (closeCurrentWindow()) {
TQTimer::singleShot( 0, this, SLOT(closeCurrentWindow()) );
@@ -1450,6 +1461,8 @@ void LockProcess::stopHack()
}
}
setCursor( tqarrowCursor );
+
+ trinity_desktop_hack_active = FALSE;
}
//---------------------------------------------------------------------------
@@ -1458,6 +1471,7 @@ void LockProcess::hackExited(KProcess *)
{
// Hack exited while we're supposed to be saving the screen.
// Make sure the saver window is black.
+ trinity_desktop_hack_active = FALSE;
usleep(100);
TQApplication::syncX();
if (!trinity_desktop_lock_use_system_modal_dialogs) {
@@ -1656,13 +1670,24 @@ int LockProcess::execDialog( TQDialog *dlg )
erase();
}
else bitBlt(this, 0, 0, &backingPixmap);
+ // 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 (trinity_desktop_hack_active) {
+ cursorHandle = TQCursor(tqblankCursor).handle();
+ }
+ else {
+ cursorHandle = TQCursor(tqbusyCursor).handle();
+ }
XChangeActivePointerGrab( tqt_xdisplay(), GRABEVENTS,
- TQCursor(tqbusyCursor).handle(), CurrentTime);
+ 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) {
@@ -2050,7 +2075,12 @@ void LockProcess::windowAdded( WId w )
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