diff options
author | Albert Astals Cid <aacid@kde.org> | 2012-01-05 11:11:27 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-01-05 14:59:12 +0100 |
commit | 689c4009fb9be348f9137a9092b068e056a3d8b3 (patch) | |
tree | 52f71eb051bdc4154d41c8994b8d2f05c7c631ab /src/plugins/platforms/xcb/qxcbclipboard.cpp | |
parent | 848f53a268449e6c581737fe2930bc75967e97ce (diff) |
Check for the clipboard manager when looping due to app quiting
One can be extremely unlucky and on session logout get this:
* All apps are going down
* A Qt app checks if the clipboard manager is there to yield its clipboard contents
* The clipboard manager is still there
* Then just after that check, the clipboard manager finishes because of the session end
* This means the Qt app will loop for 5 seconds trying to yield its clipboard contents
to a clipboard manager that is not there anymore
Change-Id: Ia89670d4deb72f12e660a0d7aa5b2d212955d6fe
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
Diffstat (limited to 'src/plugins/platforms/xcb/qxcbclipboard.cpp')
-rw-r--r-- | src/plugins/platforms/xcb/qxcbclipboard.cpp | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/plugins/platforms/xcb/qxcbclipboard.cpp b/src/plugins/platforms/xcb/qxcbclipboard.cpp index 3c3469a73b..24de78861f 100644 --- a/src/plugins/platforms/xcb/qxcbclipboard.cpp +++ b/src/plugins/platforms/xcb/qxcbclipboard.cpp @@ -208,7 +208,7 @@ QXcbClipboard::~QXcbClipboard() connection()->sync(); // waiting until the clipboard manager fetches the content. - if (!waitForClipboardEvent(m_owner, XCB_SELECTION_NOTIFY, 5000)) { + if (!waitForClipboardEvent(m_owner, XCB_SELECTION_NOTIFY, 5000, true)) { qWarning("QClipboard: Unable to receive an event from the " "clipboard manager in a reasonable time"); } @@ -726,7 +726,7 @@ namespace }; } -xcb_generic_event_t *QXcbClipboard::waitForClipboardEvent(xcb_window_t win, int type, int timeout) +xcb_generic_event_t *QXcbClipboard::waitForClipboardEvent(xcb_window_t win, int type, int timeout, bool checkManager) { QElapsedTimer timer; timer.start(); @@ -736,6 +736,16 @@ xcb_generic_event_t *QXcbClipboard::waitForClipboardEvent(xcb_window_t win, int if (e) return e; + if (checkManager) { + xcb_get_selection_owner_cookie_t cookie = xcb_get_selection_owner(xcb_connection(), atom(QXcbAtom::CLIPBOARD_MANAGER)); + xcb_get_selection_owner_reply_t *reply = xcb_get_selection_owner_reply(xcb_connection(), cookie, 0); + if (!reply || reply->owner == XCB_NONE) { + free(reply); + return 0; + } + free(reply); + } + // process other clipboard events, since someone is probably requesting data from us ClipboardEvent clipboard(connection()); e = connection()->checkEvent(clipboard); |