From b48e2091871516496cf0b133249fbf5326a55831 Mon Sep 17 00:00:00 2001 From: Lubos Lunak Date: Sat, 23 Feb 2008 16:44:52 +0100 Subject: [PATCH 01/13] 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). NOTE: It is suggested to apply patch #0209 as well when this patch is used. qt-bugs@ issue : 167704 Trolltech task ID : 168283 (status: "fixed" for Qt 4.4.0, but effectively refused) --- src/corelib/kernel/qobject.cpp | 8 ++++++++ src/corelib/kernel/qobject_p.h | 3 +++ src/gui/kernel/qwidget_p.h | 1 + src/gui/kernel/qwidget_x11.cpp | 27 +++++++++++++++++++++------ 4 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index 6487194..ef0369e 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -993,8 +993,16 @@ void QObject::setObjectName(const QString &name) { 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 diff --git a/src/corelib/kernel/qobject_p.h b/src/corelib/kernel/qobject_p.h index 0bcccba..6ab9e10 100644 --- a/src/corelib/kernel/qobject_p.h +++ b/src/corelib/kernel/qobject_p.h @@ -144,6 +144,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 diff --git a/src/gui/kernel/qwidget_p.h b/src/gui/kernel/qwidget_p.h index 774e390..176d6fa 100644 --- a/src/gui/kernel/qwidget_p.h +++ b/src/gui/kernel/qwidget_p.h @@ -358,6 +358,7 @@ public: #if defined(Q_WS_X11) void setWindowRole(); + virtual void checkWindowRole(); void sendStartupMessage(const char *message) const; void setNetWmWindowTypes(); void x11UpdateIsOpaque(); diff --git a/src/gui/kernel/qwidget_x11.cpp b/src/gui/kernel/qwidget_x11.cpp index 79ee8c9..b56849c 100644 --- a/src/gui/kernel/qwidget_x11.cpp +++ b/src/gui/kernel/qwidget_x11.cpp @@ -778,13 +778,17 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO 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 @@ -2768,6 +2772,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 { -- 1.6.5.1