summaryrefslogtreecommitdiffstats
path: root/opensuse/core/qt3/0048-qclipboard_hack_80072.patch
blob: 2f508019b7ea9a514022388658b6c3030145e6d9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
qt-bugs@ issue : none, probably even won't be
bugs.kde.org number : 80072
applied: no
author: Lubos Lunak <l.lunak@kde.org>

A crude hack for KDE #80072. No good idea how to fix it properly yet :(.

================================================================================
Index: src/kernel/qclipboard_x11.cpp
===================================================================
--- src/kernel/qclipboard_x11.cpp.orig
+++ src/kernel/qclipboard_x11.cpp
@@ -112,6 +112,7 @@ static int pending_timer_id = 0;
 static bool pending_clipboard_changed = FALSE;
 static bool pending_selection_changed = FALSE;
 
+Q_EXPORT bool qt_qclipboard_bailout_hack = false;
 
 // event capture mechanism for qt_xclb_wait_for_event
 static bool waiting_for_data = FALSE;
@@ -464,6 +465,15 @@ static Bool checkForClipboardEvents(Disp
                                               || e->xselectionclear.selection == qt_xa_clipboard)));
 }
 
+static bool selection_request_pending = false;
+
+static Bool check_selection_request_pending( Display*, XEvent* e, XPointer )
+    {
+    if( e->type == SelectionRequest && e->xselectionrequest.owner == owner->winId())
+        selection_request_pending = true;
+    return False;
+    }
+
 bool qt_xclb_wait_for_event( Display *dpy, Window win, int type, XEvent *event,
 			     int timeout )
 {
@@ -515,6 +525,14 @@ bool qt_xclb_wait_for_event( Display *dp
     do {
         if ( XCheckTypedWindowEvent(dpy,win,type,event) )
 	    return TRUE;
+        if( qt_qclipboard_bailout_hack ) {
+            XEvent dummy;
+            selection_request_pending = false;
+            if ( owner != NULL )
+                XCheckIfEvent(dpy,&dummy,check_selection_request_pending,NULL);
+            if( selection_request_pending )
+	        return TRUE;
+        }
 
         // process other clipboard events, since someone is probably requesting data from us
         XEvent e;