diff options
author | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2012-09-22 18:06:15 -0500 |
---|---|---|
committer | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2012-09-22 18:06:15 -0500 |
commit | 57f5c0698d49f0a0a7a55c75404f5b9ded910002 (patch) | |
tree | b1832ad8738497b0cd14d14da585116010f34742 /kdesktop/lock/main.cc | |
parent | 553923b25dc41e2c17ba9038eb225cd3bb9b1770 (diff) | |
download | tdebase-57f5c0698d49f0a0a7a55c75404f5b9ded910002.tar.gz tdebase-57f5c0698d49f0a0a7a55c75404f5b9ded910002.zip |
Lower override redirect windows instead of unmapping them on lock start
Restore lowered windows on lock exit
This provides a better solution to Bug 1079
Diffstat (limited to 'kdesktop/lock/main.cc')
-rw-r--r-- | kdesktop/lock/main.cc | 49 |
1 files changed, 46 insertions, 3 deletions
diff --git a/kdesktop/lock/main.cc b/kdesktop/lock/main.cc index e74d9f98f..a95747e06 100644 --- a/kdesktop/lock/main.cc +++ b/kdesktop/lock/main.cc @@ -47,6 +47,8 @@ else { \ } \ tdmconfig->setGroup("X-*-Greeter"); +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; @@ -78,16 +80,43 @@ bool MyApp::x11EventFilter( XEvent *ev ) } else if (ev->type == MapNotify) { // HACK - // Close all tooltips and notification windows + // Hide all tooltips and notification windows XMapEvent map_event = ev->xmap; XWindowAttributes childAttr; Window childTransient; if (XGetWindowAttributes(map_event.display, map_event.window, &childAttr) && XGetTransientForHint(map_event.display, map_event.window, &childTransient)) { if((childAttr.map_state == IsViewable) && (childAttr.override_redirect) && (childTransient)) { - XUnmapWindow(map_event.display, map_event.window); + if (!trinity_desktop_lock_hidden_window_list.contains(map_event.window)) { + trinity_desktop_lock_hidden_window_list.append(map_event.window); + } + XLowerWindow(map_event.display, map_event.window); } } } + else if (ev->type == VisibilityNotify) { + // HACK + // Hide all tooltips and notification windows + XVisibilityEvent visibility_event = ev->xvisibility; + XWindowAttributes childAttr; + Window childTransient; + if ((visibility_event.state == VisibilityUnobscured) || (visibility_event.state == VisibilityPartiallyObscured)) { + if (XGetWindowAttributes(visibility_event.display, visibility_event.window, &childAttr) && XGetTransientForHint(visibility_event.display, visibility_event.window, &childTransient)) { + if((childAttr.map_state == IsViewable) && (childAttr.override_redirect) && (childTransient)) { + if (!trinity_desktop_lock_hidden_window_list.contains(visibility_event.window)) { + trinity_desktop_lock_hidden_window_list.append(visibility_event.window); + } + XLowerWindow(visibility_event.display, visibility_event.window); + } + } + } + } + else if (ev->type == DestroyNotify) { + XDestroyWindowEvent destroy_event = ev->xdestroywindow; + if (trinity_desktop_lock_hidden_window_list.contains(destroy_event.window)) { + trinity_desktop_lock_hidden_window_list.remove(destroy_event.window); + } + } +#if 0 else if (ev->type == CreateNotify) { // HACK // Close all tooltips and notification windows @@ -100,6 +129,7 @@ bool MyApp::x11EventFilter( XEvent *ev ) } } } +#endif return KApplication::x11EventFilter( ev ); } @@ -114,6 +144,14 @@ static KCmdLineOptions options[] = KCmdLineLastOption }; +void restore_hidden_override_redirect_windows() { + TQXLibWindowList::iterator it; + for (it = trinity_desktop_lock_hidden_window_list.begin(); it != trinity_desktop_lock_hidden_window_list.end(); ++it) { + Window win = *it; + XRaiseWindow(tqt_xdisplay(), win); + } +} + static void sigusr1_handler(int) { signalled_forcelock = TRUE; @@ -356,7 +394,10 @@ int main( int argc, char **argv ) } if (in_internal_mode == FALSE) { - return app.exec(); + trinity_desktop_lock_hidden_window_list.clear(); + int ret = app.exec(); + restore_hidden_override_redirect_windows(); + return ret; } else { pid_t kdesktop_pid = atoi(args->getOption( "internal" )); @@ -364,7 +405,9 @@ int main( int argc, char **argv ) // The controlling kdesktop process probably died. Commit suicide... return 12; } + trinity_desktop_lock_hidden_window_list.clear(); app.exec(); + restore_hidden_override_redirect_windows(); if (kill(kdesktop_pid, SIGUSR1) < 0) { // The controlling kdesktop process probably died. Commit suicide... return 12; |