@ -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 ;
@ -76,6 +78,76 @@ bool MyApp::x11EventFilter( XEvent *ev )
emit activity ( ) ;
}
}
else if ( ev - > type = = MapNotify ) {
// HACK
// 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 ) ) {
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 ) ;
XFlush ( map_event . display ) ;
}
}
}
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 ) ;
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 ) ) {
trinity_desktop_lock_hidden_window_list . remove ( destroy_event . window ) ;
}
}
#if 0
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 ) ;
}
}
}
# endif
return KApplication : : x11EventFilter ( ev ) ;
}
@ -90,6 +162,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 ;
@ -332,7 +412,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 " ) ) ;
@ -340,7 +423,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 ;