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).
--- src/corelib/kernel/qobject.cpp.sav 2008-02-22 09:03:40.000000000 +0100
+++ src/corelib/kernel/qobject.cpp 2008-02-23 16:15:51.000000000 +0100
@@ -1016,9 +1016,18 @@ void QObject::setObjectName(const QStrin
{
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,
--- src/corelib/kernel/qobject_p.h.sav 2008-02-22 09:23:44.000000000 +0100
+++ src/corelib/kernel/qobject_p.h 2008-02-23 16:16:46.000000000 +0100
@@ -148,6 +148,9 @@ public:
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
--- src/gui/kernel/qwidget_p.h.sav 2008-02-22 09:04:04.000000000 +0100
+++ src/gui/kernel/qwidget_p.h 2008-02-23 16:17:07.000000000 +0100
@@ -324,6 +324,7 @@ public:
#if defined(Q_WS_X11)
void setWindowRole();
+ virtual void checkWindowRole();
void sendStartupMessage(const char *message) const;
void setNetWmWindowTypes();
#endif
--- src/gui/kernel/qwidget_x11.cpp.sav 2008-02-23 15:28:47.000000000 +0100
+++ src/gui/kernel/qwidget_x11.cpp 2008-02-23 16:31:47.000000000 +0100
@@ -710,13 +710,17 @@ void QWidgetPrivate::create_sys(WId wind
// 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
@@ -2852,6 +2856,17 @@ void QWidgetPrivate::setWindowRole()
(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
{
|