From 553923b25dc41e2c17ba9038eb225cd3bb9b1770 Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Fri, 21 Sep 2012 18:27:59 -0500 Subject: Forcibly prevent transient override redirect windows from showing up over the lock screen This closes Bug 1079 --- kdesktop/lock/lockdlg.cc | 14 ++++++++++++-- kdesktop/lock/lockprocess.cc | 41 +++++++++++++++++++++++++++++++++++++---- kdesktop/lock/main.cc | 24 ++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 6 deletions(-) diff --git a/kdesktop/lock/lockdlg.cc b/kdesktop/lock/lockdlg.cc index 236bf8a62..005ac9913 100644 --- a/kdesktop/lock/lockdlg.cc +++ b/kdesktop/lock/lockdlg.cc @@ -573,9 +573,19 @@ void PasswordDlg::gplugActivity() void PasswordDlg::gplugMsgBox( TQMessageBox::Icon type, const TQString &text ) { - TQDialog dialog( this, 0, true, (WFlags)WX11BypassWM ); + TQDialog dialog( this, 0, true, (trinity_desktop_lock_use_system_modal_dialogs?((WFlags)WStyle_StaysOnTop):((WFlags)WX11BypassWM)) ); + if (trinity_desktop_lock_use_system_modal_dialogs) { + // Signal that we do not want any window controls to be shown at all + Atom kde_wm_system_modal_notification; + kde_wm_system_modal_notification = XInternAtom(tqt_xdisplay(), "_KDE_WM_MODAL_SYS_NOTIFICATION", False); + XChangeProperty(tqt_xdisplay(), dialog.winId(), kde_wm_system_modal_notification, XA_INTEGER, 32, PropModeReplace, (unsigned char *) "TRUE", 1L); + } + dialog.setCaption(i18n("Authentication Subsystem Notice")); TQFrame *winFrame = new TQFrame( &dialog ); - winFrame->setFrameStyle( TQFrame::WinPanel | TQFrame::Raised ); + if (trinity_desktop_lock_use_system_modal_dialogs) + winFrame->setFrameStyle( TQFrame::NoFrame ); + else + winFrame->setFrameStyle( TQFrame::WinPanel | TQFrame::Raised ); winFrame->setLineWidth( 2 ); TQVBoxLayout *vbox = new TQVBoxLayout( &dialog ); vbox->addWidget( winFrame ); diff --git a/kdesktop/lock/lockprocess.cc b/kdesktop/lock/lockprocess.cc index 2ce750756..5265bc627 100644 --- a/kdesktop/lock/lockprocess.cc +++ b/kdesktop/lock/lockprocess.cc @@ -960,6 +960,27 @@ void LockProcess::createSaverWindow() setGeometry(0, 0, mRootWidth, mRootHeight); + // HACK + // Close all tooltips and notification windows + { + Window rootWindow = RootWindow(x11Display(), x11Screen()); + Window parent; + Window* children = NULL; + unsigned int noOfChildren = 0; + XWindowAttributes childAttr; + Window childTransient; + + if (XQueryTree(x11Display(), rootWindow, &rootWindow, &parent, &children, &noOfChildren) && noOfChildren>0 ) { + for (unsigned int i=0; isetFrameStyle( TQFrame::WinPanel | TQFrame::Raised ); + if (trinity_desktop_lock_use_system_modal_dialogs) + winFrame->setFrameStyle( TQFrame::NoFrame ); + else + winFrame->setFrameStyle( TQFrame::WinPanel | TQFrame::Raised ); winFrame->setLineWidth( 2 ); TQLabel *label1 = new TQLabel( winFrame ); label1->setPixmap( TQMessageBox::standardIcon( type ) ); @@ -2264,8 +2295,10 @@ void LockProcess::windowAdded( WId w, bool managed ) int y = XDisplayHeight( tqt_xdisplay(), tqt_xscreen()) - attr_geom.height; if( managed ) { XSetWindowAttributes attr; - attr.override_redirect = True; - XChangeWindowAttributes( tqt_xdisplay(), w, CWOverrideRedirect, &attr ); + if (!trinity_desktop_lock_use_system_modal_dialogs) { + attr.override_redirect = True; + XChangeWindowAttributes( tqt_xdisplay(), w, CWOverrideRedirect, &attr ); + } XReparentWindow( tqt_xdisplay(), w, tqt_xrootwin(), x, y ); XMapWindow( tqt_xdisplay(), w ); } diff --git a/kdesktop/lock/main.cc b/kdesktop/lock/main.cc index 56b4b5fed..e74d9f98f 100644 --- a/kdesktop/lock/main.cc +++ b/kdesktop/lock/main.cc @@ -76,6 +76,30 @@ bool MyApp::x11EventFilter( XEvent *ev ) emit activity(); } } + else if (ev->type == MapNotify) { + // HACK + // Close 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); + } + } + } + else if (ev->type == CreateNotify) { + // HACK + // Close all tooltips and notification windows + XCreateWindowEvent create_event = ev->xcreatewindow; + XWindowAttributes childAttr; + Window childTransient; + if (XGetWindowAttributes(create_event.display, create_event.window, &childAttr) && XGetTransientForHint(create_event.display, create_event.window, &childTransient)) { + if ((childAttr.override_redirect) && (childTransient)) { + XDestroyWindow(create_event.display, create_event.window); + } + } + } return KApplication::x11EventFilter( ev ); } -- cgit v1.2.1 From 57f5c0698d49f0a0a7a55c75404f5b9ded910002 Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Sat, 22 Sep 2012 18:06:15 -0500 Subject: 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 --- kdesktop/lock/lockprocess.cc | 9 ++++++-- kdesktop/lock/lockprocess.h | 2 ++ kdesktop/lock/main.cc | 49 +++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 55 insertions(+), 5 deletions(-) diff --git a/kdesktop/lock/lockprocess.cc b/kdesktop/lock/lockprocess.cc index 5265bc627..71913469e 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 TQXLibWindowList; + //=========================================================================== // // Screen saver handling process. Handles screensaver window, 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; -- cgit v1.2.1 From 1f33dc8fd2fc14c2abb74be4e27ef08fdda784d6 Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Sat, 22 Sep 2012 23:31:10 -0500 Subject: Attempt to minimize the time in which new notifications are displayed before being hidden --- kdesktop/lock/lockprocess.cc | 1 + kdesktop/lock/main.cc | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/kdesktop/lock/lockprocess.cc b/kdesktop/lock/lockprocess.cc index 71913469e..db92c0018 100644 --- a/kdesktop/lock/lockprocess.cc +++ b/kdesktop/lock/lockprocess.cc @@ -980,6 +980,7 @@ void LockProcess::createSaverWindow() trinity_desktop_lock_hidden_window_list.append(children[i]); } XLowerWindow(x11Display(), children[i]); + XFlush(x11Display()); } } } diff --git a/kdesktop/lock/main.cc b/kdesktop/lock/main.cc index a95747e06..7235776fb 100644 --- a/kdesktop/lock/main.cc +++ b/kdesktop/lock/main.cc @@ -90,6 +90,7 @@ bool MyApp::x11EventFilter( XEvent *ev ) trinity_desktop_lock_hidden_window_list.append(map_event.window); } XLowerWindow(map_event.display, map_event.window); + XFlush(map_event.display); } } } @@ -106,10 +107,27 @@ bool MyApp::x11EventFilter( XEvent *ev ) trinity_desktop_lock_hidden_window_list.append(visibility_event.window); } XLowerWindow(visibility_event.display, visibility_event.window); + XFlush(visibility_event.display); } } } } + else if (ev->type == CreateNotify) { + // HACK + // Close all tooltips and notification windows + XCreateWindowEvent create_event = ev->xcreatewindow; + XWindowAttributes childAttr; + Window childTransient; + if (XGetWindowAttributes(create_event.display, create_event.window, &childAttr) && XGetTransientForHint(create_event.display, create_event.window, &childTransient)) { + if ((childAttr.override_redirect) && (childTransient)) { + if (!trinity_desktop_lock_hidden_window_list.contains(create_event.window)) { + trinity_desktop_lock_hidden_window_list.append(create_event.window); + } + XLowerWindow(create_event.display, create_event.window); + XFlush(create_event.display); + } + } + } else if (ev->type == DestroyNotify) { XDestroyWindowEvent destroy_event = ev->xdestroywindow; if (trinity_desktop_lock_hidden_window_list.contains(destroy_event.window)) { -- cgit v1.2.1