summaryrefslogtreecommitdiffstats
path: root/redhat/kdebase/kdebase-bp126-553923b2.diff
blob: 62a4e20b79dd2061bb91645771a8b7ce454dc474 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
commit 553923b25dc41e2c17ba9038eb225cd3bb9b1770
Author: Timothy Pearson <kb9vqf@pearsoncomputing.net>
Date:   1348270079 -0500

    Forcibly prevent transient override redirect windows from showing up over the lock screen
    This closes Bug 1079

diff --git a/kdesktop/lock/lockdlg.cc b/kdesktop/lock/lockdlg.cc
index 236bf8a..005ac99 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(qt_xdisplay(), "_KDE_WM_MODAL_SYS_NOTIFICATION", False);
+        XChangeProperty(qt_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 2ce7507..5265bc6 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; 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]);
+                    }
+                }
+            }
+        }
+    }
+
     kdDebug(1204) << "Saver window Id: " << winId() << endl;
 }
 
@@ -2162,9 +2183,19 @@ void LockProcess::unlockXF86()
 
 void LockProcess::msgBox( TQMessageBox::Icon type, const TQString &txt )
 {
-    TQDialog box( 0, "messagebox", true, (WFlags)WX11BypassWM );
+    TQDialog box( 0, "messagebox", 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(qt_xdisplay(), "_KDE_WM_MODAL_SYS_NOTIFICATION", False);
+        XChangeProperty(qt_xdisplay(), box.winId(), kde_wm_system_modal_notification, XA_INTEGER, 32, PropModeReplace, (unsigned char *) "TRUE", 1L);
+    }
+    box.setCaption(i18n("Authentication Subsystem Notice"));
     TQFrame *winFrame = new TQFrame( &box );
-    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 );
     TQLabel *label1 = new TQLabel( winFrame );
     label1->setPixmap( TQMessageBox::standardIcon( type ) );
@@ -2264,8 +2295,10 @@ void LockProcess::windowAdded( WId w, bool managed )
     int y = XDisplayHeight( qt_xdisplay(), qt_xscreen()) - attr_geom.height;
     if( managed ) {
         XSetWindowAttributes attr;
-        attr.override_redirect = True;
-        XChangeWindowAttributes( qt_xdisplay(), w, CWOverrideRedirect, &attr );
+        if (!trinity_desktop_lock_use_system_modal_dialogs) {
+            attr.override_redirect = True;
+            XChangeWindowAttributes( qt_xdisplay(), w, CWOverrideRedirect, &attr );
+        }
         XReparentWindow( qt_xdisplay(), w, qt_xrootwin(), x, y );
         XMapWindow( qt_xdisplay(), w );
     }
diff --git a/kdesktop/lock/main.cc b/kdesktop/lock/main.cc
index 56b4b5f..e74d9f9 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 );
 }