summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuel Rødal <samuel.rodal@nokia.com>2011-02-10 18:22:35 (GMT)
committerSamuel Rødal <samuel.rodal@nokia.com>2011-02-10 18:22:35 (GMT)
commit80b387b77863230e6edbc03695a971bcd0bcb5d4 (patch)
tree063ecb080a70d15c8e4e6b555174f86ae212b821
parent6257adcdd693ac5c4c258fd81b0e6b2dcfbf8750 (diff)
downloadQt-80b387b77863230e6edbc03695a971bcd0bcb5d4.zip
Qt-80b387b77863230e6edbc03695a971bcd0bcb5d4.tar.gz
Qt-80b387b77863230e6edbc03695a971bcd0bcb5d4.tar.bz2
Conform to ICCCM when mapping / unmapping windows in XCB backend.
-rw-r--r--src/plugins/platforms/xcb/README2
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.cpp19
-rw-r--r--src/plugins/platforms/xcb/xcb.pro2
3 files changed, 21 insertions, 2 deletions
diff --git a/src/plugins/platforms/xcb/README b/src/plugins/platforms/xcb/README
index d250ad0..e88596b 100644
--- a/src/plugins/platforms/xcb/README
+++ b/src/plugins/platforms/xcb/README
@@ -1,2 +1,2 @@
Required packages:
-libxcb1 libxcb1-dev libx11-xcb1 libx11-xcb-dev libxcb-keysyms1 libxcb-keysyms1-dev libxcb-image0 libxcb-image0-dev libxcb-shm0 libxcb-shm0-dev
+libxcb1 libxcb1-dev libx11-xcb1 libx11-xcb-dev libxcb-keysyms1 libxcb-keysyms1-dev libxcb-image0 libxcb-image0-dev libxcb-shm0 libxcb-shm0-dev libxcb-icccm1 libxcb-icccm1-dev
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index 824a967..7fb4cc4 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -44,6 +44,8 @@
#include "qxcbconnection.h"
#include "qxcbscreen.h"
+#include <xcb/xcb_icccm.h>
+
#include <private/qapplication_p.h>
#include <private/qwindowsurface_p.h>
@@ -183,10 +185,27 @@ void QXcbWindow::setGeometry(const QRect &rect)
void QXcbWindow::setVisible(bool visible)
{
+ xcb_wm_hints_t hints;
if (visible) {
+ if (widget()->isMinimized())
+ xcb_wm_hints_set_iconic(&hints);
+ else
+ xcb_wm_hints_set_normal(&hints);
+ xcb_set_wm_hints(xcb_connection(), m_window, &hints);
xcb_map_window(xcb_connection(), m_window);
} else {
xcb_unmap_window(xcb_connection(), m_window);
+
+ // send synthetic UnmapNotify event according to icccm 4.1.4
+ xcb_unmap_notify_event_t event;
+ event.response_type = XCB_UNMAP_NOTIFY;
+ event.sequence = 0; // does this matter?
+ event.event = m_screen->root();
+ event.window = m_window;
+ event.from_configure = false;
+ xcb_send_event(xcb_connection(), false, m_screen->root(),
+ XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT, (const char *)&event);
+
xcb_flush(xcb_connection());
}
}
diff --git a/src/plugins/platforms/xcb/xcb.pro b/src/plugins/platforms/xcb/xcb.pro
index 58382c0..a6e92ef 100644
--- a/src/plugins/platforms/xcb/xcb.pro
+++ b/src/plugins/platforms/xcb/xcb.pro
@@ -31,7 +31,7 @@ contains(DEFINES, XCB_USE_XLIB_FOR_GLX) {
LIBS += -lX11 -lX11-xcb
}
-LIBS += -lxcb -lxcb-image -lxcb-keysyms
+LIBS += -lxcb -lxcb-image -lxcb-keysyms -lxcb-icccm
include (../fontdatabases/genericunix/genericunix.pri)