summaryrefslogtreecommitdiff
path: root/debian/patches/0180-window-role.diff
blob: a26ef89d160f09b150d36553fed650b5fd58db6a (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
qt-bugs@ issue : 167704
Trolltech task ID : 168283 (status: "fixed" for Qt 4.4.0, but effectively refused)
bugs.kde.org number : none
applied: no
author: Lubos Lunak <l.lunak@kde.org>

NOTE: It is suggested to apply patch #0209 as well when this patch is used.

This patch uses object name as a fallback for window role if no window role
is set explicitly using setWindowRole(). Since Qt3 always used the object
name as the window role and most Qt3/KDE3 code is ported to call setObjectName(),
this makes the window role set in many cases (which KWin uses for window identifying).


--- a/src/corelib/kernel/qobject.cpp
+++ b/src/corelib/kernel/qobject.cpp
@@ -1037,9 +1037,18 @@
 {
     Q_D(QObject);
     d->objectName = name;
+#if defined(Q_WS_X11)
+    d->checkWindowRole();
+#endif
 }
 
 
+#if defined(Q_WS_X11)
+void QObjectPrivate::checkWindowRole()
+{
+}
+#endif
+
 #ifdef QT3_SUPPORT
 /*! \internal
     QObject::child is compat but needs to call itself recursively,
--- a/src/corelib/kernel/qobject_p.h
+++ b/src/corelib/kernel/qobject_p.h
@@ -146,6 +146,9 @@
     mutable quint32 connectedSignals;
 
     QString objectName;
+#if defined(Q_WS_X11)
+    virtual void checkWindowRole();
+#endif
 
     // Note: you must hold the signalSlotLock() before accessing the lists below or calling the functions
     struct Connection
--- a/src/gui/kernel/qwidget_p.h
+++ b/src/gui/kernel/qwidget_p.h
@@ -333,6 +333,7 @@
 
 #if defined(Q_WS_X11)
     void setWindowRole();
+    virtual void checkWindowRole();
     void sendStartupMessage(const char *message) const;
     void setNetWmWindowTypes();
 #endif
--- a/src/gui/kernel/qwidget_x11.cpp
+++ b/src/gui/kernel/qwidget_x11.cpp
@@ -719,13 +719,17 @@
         data.fstrut_dirty = 1;
 
         // declare the widget's window role
+        QByteArray windowRole;
         if (QTLWExtra *topData = maybeTopData()) {
-            if (!topData->role.isEmpty()) {
-                QByteArray windowRole = topData->role.toUtf8();
-                XChangeProperty(dpy, id,
-                                ATOM(WM_WINDOW_ROLE), XA_STRING, 8, PropModeReplace,
-                                (unsigned char *)windowRole.constData(), windowRole.length());
-            }
+            if (!topData->role.isEmpty())
+                windowRole = topData->role.toUtf8();
+        }
+        if (windowRole.isEmpty()) // use object name as a fallback
+            windowRole = objectName.toUtf8();
+        if (!windowRole.isEmpty()) {
+            XChangeProperty(dpy, id,
+                            ATOM(WM_WINDOW_ROLE), XA_STRING, 8, PropModeReplace,
+                            (unsigned char *)windowRole.constData(), windowRole.length());
         }
 
         // set client leader property
@@ -2719,6 +2723,17 @@
                     (unsigned char *)windowRole.constData(), windowRole.length());
 }
 
+void QWidgetPrivate::checkWindowRole()
+{
+    Q_Q(QWidget);
+    if( !q->windowRole().isEmpty() || !q->internalWinId())
+        return;
+    QByteArray windowRole = objectName.toUtf8(); // use as a fallback
+    XChangeProperty(X11->display, q->internalWinId(),
+                    ATOM(WM_WINDOW_ROLE), XA_STRING, 8, PropModeReplace,
+                    (unsigned char *)windowRole.constData(), windowRole.length());
+}
+
 Q_GLOBAL_STATIC(QX11PaintEngine, qt_widget_paintengine)
 QPaintEngine *QWidget::paintEngine() const
 {