diff options
author | Lars Knoll <lars.knoll@nokia.com> | 2011-09-20 18:09:08 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-09-21 12:07:19 +0200 |
commit | 0d4918950e61f3cbfd01c9fae37c463352c69dd3 (patch) | |
tree | c402cc38cf374231b6a9f783522b6b565290b8d3 /src | |
parent | e915b7924f251f849b2b5480d2945981a93108f6 (diff) |
Add Qt::WindowTransparentForMouseEvents
Add a flag for output only windows that are
transparent for mouse events and implement it
for the xcb backend.
Change-Id: I24afdb6b27de34bcdf0c061a5a4987ac2880e4ae
Reviewed-on: http://codereview.qt-project.org/5260
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/global/qnamespace.h | 1 | ||||
-rw-r--r-- | src/plugins/platforms/xcb/qxcbwindow.cpp | 39 | ||||
-rw-r--r-- | src/plugins/platforms/xcb/qxcbwindow.h | 3 |
3 files changed, 43 insertions, 0 deletions
diff --git a/src/corelib/global/qnamespace.h b/src/corelib/global/qnamespace.h index 43e6176811..807bed8a61 100644 --- a/src/corelib/global/qnamespace.h +++ b/src/corelib/global/qnamespace.h @@ -258,6 +258,7 @@ public: WindowContextHelpButtonHint = 0x00010000, WindowShadeButtonHint = 0x00020000, WindowStaysOnTopHint = 0x00040000, + WindowTransparentForInput = 0x00080000, CustomizeWindowHint = 0x02000000, WindowStaysOnBottomHint = 0x04000000, diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp index 50be8ba878..cde450e8e6 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.cpp +++ b/src/plugins/platforms/xcb/qxcbwindow.cpp @@ -57,6 +57,7 @@ #define class class_name #include <xcb/xcb_icccm.h> #undef class +#include <xcb/xfixes.h> // xcb-icccm 3.8 support #ifdef XCB_ICCCM_NUM_WM_SIZE_HINTS_ELEMENTS @@ -120,6 +121,7 @@ QXcbWindow::QXcbWindow(QWindow *window) , m_window(0) , m_syncCounter(0) , m_mapped(false) + , m_transparent(false) , m_netWmUserTimeWindow(XCB_NONE) #if defined(XCB_USE_EGL) , m_eglSurface(0) @@ -303,6 +305,9 @@ void QXcbWindow::create() setWindowTitle(window()->windowTitle()); setWindowState(window()->windowState()); + if (window()->windowFlags() & Qt::WindowTransparentForInput) + setTransparentForMouseEvents(true); + connection()->drag()->dndEnable(this, true); } @@ -665,9 +670,16 @@ Qt::WindowFlags QXcbWindow::setWindowFlags(Qt::WindowFlags flags) if (type == Qt::Popup) flags |= Qt::X11BypassWindowManagerHint; + if (flags & Qt::WindowTransparentForInput) { + uint32_t mask = XCB_EVENT_MASK_NO_EVENT; + xcb_change_window_attributes(xcb_connection(), xcb_window(), XCB_CW_EVENT_MASK, &mask); + } + setNetWmWindowFlags(flags); setMotifWindowFlags(flags); + setTransparentForMouseEvents(flags & Qt::WindowTransparentForInput); + return flags; } @@ -974,6 +986,33 @@ void QXcbWindow::updateNetWmUserTime(xcb_timestamp_t timestamp) XCB_ATOM_CARDINAL, 32, 1, ×tamp); } +void QXcbWindow::setTransparentForMouseEvents(bool transparent) +{ + if (transparent == m_transparent) + return; + + xcb_rectangle_t rectangle; + + xcb_rectangle_t *rect = 0; + int nrect = 0; + + if (!transparent) { + rectangle.x = 0; + rectangle.y = 0; + rectangle.width = geometry().width(); + rectangle.height = geometry().height(); + rect = &rectangle; + nrect = 1; + } + + xcb_xfixes_region_t region = xcb_generate_id(xcb_connection()); + xcb_xfixes_create_region(xcb_connection(), region, nrect, rect); + xcb_xfixes_set_window_shape_region_checked(xcb_connection(), m_window, XCB_SHAPE_SK_INPUT, 0, 0, region); + xcb_xfixes_destroy_region(xcb_connection(), region); + + m_transparent = transparent; +} + WId QXcbWindow::winId() const { diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h index a85760ea8d..e864c14f0f 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.h +++ b/src/plugins/platforms/xcb/qxcbwindow.h @@ -124,6 +124,8 @@ private: void updateMotifWmHintsBeforeMap(); void updateNetWmStateBeforeMap(); + void setTransparentForMouseEvents(bool transparent); + void create(); void destroy(); @@ -143,6 +145,7 @@ private: Qt::WindowState m_windowState; bool m_mapped; + bool m_transparent; xcb_window_t m_netWmUserTimeWindow; QSurfaceFormat m_requestedFormat; |