From 3d43d178e61cd38ccc78e2943f6363e464cf3500 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lind?= Date: Tue, 14 May 2013 08:17:13 +0200 Subject: Add QXcbConnectionGrabber class MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Inspired by QMutexLocker Change-Id: I66e31091d2a006db3272b627567d95d3e0b1c4f9 Reviewed-by: Samuel Rødal --- src/plugins/platforms/xcb/qxcbconnection.cpp | 20 ++++++++++++++++++++ src/plugins/platforms/xcb/qxcbconnection.h | 9 +++++++++ src/plugins/platforms/xcb/qxcbdrag.cpp | 3 +-- 3 files changed, 30 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp index db2179c73f..209c7bb187 100644 --- a/src/plugins/platforms/xcb/qxcbconnection.cpp +++ b/src/plugins/platforms/xcb/qxcbconnection.cpp @@ -1720,4 +1720,24 @@ bool QXcbConnection::xi2PrepareXIGenericDeviceEvent(xcb_ge_event_t *event, int o } #endif // defined(XCB_USE_XINPUT2) || defined(XCB_USE_XINPUT2_MAEMO) +QXcbConnectionGrabber::QXcbConnectionGrabber(QXcbConnection *connection) + :m_connection(connection) +{ + connection->grabServer(); +} + +QXcbConnectionGrabber::~QXcbConnectionGrabber() +{ + if (m_connection) + m_connection->ungrabServer(); +} + +void QXcbConnectionGrabber::release() +{ + if (m_connection) { + m_connection->ungrabServer(); + m_connection = 0; + } +} + QT_END_NAMESPACE diff --git a/src/plugins/platforms/xcb/qxcbconnection.h b/src/plugins/platforms/xcb/qxcbconnection.h index cba26e148c..883ee95e22 100644 --- a/src/plugins/platforms/xcb/qxcbconnection.h +++ b/src/plugins/platforms/xcb/qxcbconnection.h @@ -585,6 +585,15 @@ xcb_generic_event_t *QXcbConnection::checkEvent(T &checker) return 0; } +class QXcbConnectionGrabber +{ +public: + QXcbConnectionGrabber(QXcbConnection *connection); + ~QXcbConnectionGrabber(); + void release(); +private: + QXcbConnection *m_connection; +}; #ifdef Q_XCB_DEBUG template diff --git a/src/plugins/platforms/xcb/qxcbdrag.cpp b/src/plugins/platforms/xcb/qxcbdrag.cpp index 8ce4ef5f04..db736cef4e 100644 --- a/src/plugins/platforms/xcb/qxcbdrag.cpp +++ b/src/plugins/platforms/xcb/qxcbdrag.cpp @@ -1141,7 +1141,7 @@ bool QXcbDrag::dndEnable(QXcbWindow *w, bool on) if (desktop_proxy) // *WE* already have one. return false; - connection()->grabServer(); + QXcbConnectionGrabber grabber(connection()); // As per Xdnd4, use XdndProxy xcb_window_t proxy_id = xdndProxy(connection(), w->xcb_window()); @@ -1157,7 +1157,6 @@ bool QXcbDrag::dndEnable(QXcbWindow *w, bool on) XCB_ATOM_WINDOW, 32, 1, &proxy_id); } - connection()->ungrabServer(); } else { xdnd_widget = w; } -- cgit v1.2.3