diff options
Diffstat (limited to 'redhat/tdebase/kdebase-bp127-57f5c069.diff')
-rw-r--r-- | redhat/tdebase/kdebase-bp127-57f5c069.diff | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/redhat/tdebase/kdebase-bp127-57f5c069.diff b/redhat/tdebase/kdebase-bp127-57f5c069.diff new file mode 100644 index 000000000..da6a95d22 --- /dev/null +++ b/redhat/tdebase/kdebase-bp127-57f5c069.diff @@ -0,0 +1,159 @@ +commit 57f5c0698d49f0a0a7a55c75404f5b9ded910002 +Author: Timothy Pearson <kb9vqf@pearsoncomputing.net> +Date: 1348355175 -0500 + + 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 + +diff --git a/kdesktop/lock/lockprocess.cc b/kdesktop/lock/lockprocess.cc +index 5265bc6..7191346 100644 +--- a/kdesktop/lock/lockprocess.cc ++++ b/kdesktop/lock/lockprocess.cc +@@ -138,6 +138,8 @@ extern bool trinity_desktop_lock_delay_screensaver_start; + extern bool trinity_desktop_lock_use_sak; + extern bool trinity_desktop_lock_forced; + ++extern TQXLibWindowList trinity_desktop_lock_hidden_window_list; ++ + bool trinity_desktop_lock_autohide_lockdlg = TRUE; + bool trinity_desktop_lock_closing_windows = FALSE; + bool trinity_desktop_lock_in_sec_dlg = FALSE; +@@ -961,7 +963,7 @@ void LockProcess::createSaverWindow() + setGeometry(0, 0, mRootWidth, mRootHeight); + + // HACK +- // Close all tooltips and notification windows ++ // Hide all tooltips and notification windows + { + Window rootWindow = RootWindow(x11Display(), x11Screen()); + Window parent; +@@ -974,7 +976,10 @@ void LockProcess::createSaverWindow() + for (unsigned int i=0; i<noOfChildren; i++) { + if (XGetWindowAttributes(x11Display(), children[i], &childAttr) && XGetTransientForHint(x11Display(), children[i], &childTransient)) { + if ((childAttr.map_state == IsViewable) && (childAttr.override_redirect) && (childTransient)) { +- XUnmapWindow(x11Display(), children[i]); ++ if (!trinity_desktop_lock_hidden_window_list.contains(children[i])) { ++ trinity_desktop_lock_hidden_window_list.append(children[i]); ++ } ++ XLowerWindow(x11Display(), children[i]); + } + } + } +diff --git a/kdesktop/lock/lockprocess.h b/kdesktop/lock/lockprocess.h +index 0dacc46..7fd4236 100644 +--- a/kdesktop/lock/lockprocess.h ++++ b/kdesktop/lock/lockprocess.h +@@ -38,6 +38,8 @@ struct GreeterPluginHandle { + #define FIFO_FILE_OUT "/tmp/ksocket-global/kdesktoplockcontrol_out" + #define PIPE_CHECK_INTERVAL 50 + ++typedef TQValueList<Window> TQXLibWindowList; ++ + //=========================================================================== + // + // Screen saver handling process. Handles screensaver window, +diff --git a/kdesktop/lock/main.cc b/kdesktop/lock/main.cc +index e74d9f9..a95747e 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(qt_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; |