From 3d43d178e61cd38ccc78e2943f6363e464cf3500 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B8rgen=20Lind?= <jorgen.lind@digia.com>
Date: Tue, 14 May 2013 08:17:13 +0200
Subject: [PATCH] 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 <samuel.rodal@digia.com>
---
 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(-)

diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
index db2179c73f5..209c7bb187b 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 cba26e148cc..883ee95e227 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 <typename cookie_t>
diff --git a/src/plugins/platforms/xcb/qxcbdrag.cpp b/src/plugins/platforms/xcb/qxcbdrag.cpp
index 8ce4ef5f047..db736cef4e7 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;
         }
-- 
GitLab