summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'x11-libs/qt/files/qt-3.3.1-qclipboard-fix.patch')
-rw-r--r--x11-libs/qt/files/qt-3.3.1-qclipboard-fix.patch94
1 files changed, 94 insertions, 0 deletions
diff --git a/x11-libs/qt/files/qt-3.3.1-qclipboard-fix.patch b/x11-libs/qt/files/qt-3.3.1-qclipboard-fix.patch
new file mode 100644
index 000000000000..fdfa086ff13f
--- /dev/null
+++ b/x11-libs/qt/files/qt-3.3.1-qclipboard-fix.patch
@@ -0,0 +1,94 @@
+--- src/kernel/qclipboard_x11.cpp.sav 2004-01-06 19:24:40.000000000 +0100
++++ src/kernel/qclipboard_x11.cpp 2004-01-22 19:48:32.000000000 +0100
+@@ -112,10 +112,6 @@ static bool pending_selection_changed =
+
+ // event capture mechanism for qt_xclb_wait_for_event
+ static bool waiting_for_data = FALSE;
+-static bool has_captured_event = FALSE;
+-static Window capture_event_win = None;
+-static int capture_event_type = -1;
+-static XEvent captured_event;
+
+ class QClipboardWatcher; // forward decl
+ static QClipboardWatcher *selection_watcher = 0;
+@@ -432,69 +428,36 @@ bool QClipboard::selectionModeEnabled()
+ { return inSelectionMode_obsolete; }
+
+
+-// event filter function... captures interesting events while
+-// qt_xclb_wait_for_event is running the event loop
+-static int qt_xclb_event_filter(XEvent *event)
+-{
+- if (event->xany.type == capture_event_type &&
+- event->xany.window == capture_event_win) {
+- VDEBUG( "QClipboard: event_filter(): caught event type %d", event->type );
+- has_captured_event = TRUE;
+- captured_event = *event;
+- return 1;
+- }
+-
+- return 0;
+-}
+-
+ bool qt_xclb_wait_for_event( Display *dpy, Window win, int type, XEvent *event,
+ int timeout )
+ {
+- if ( waiting_for_data )
+- qFatal( "QClipboard: internal error, qt_xclb_wait_for_event recursed" );
+-
+- waiting_for_data = TRUE;
+-
+ QTime started = QTime::currentTime();
+ QTime now = started;
+-
+- has_captured_event = FALSE;
+- capture_event_win = win;
+- capture_event_type = type;
+-
+- QX11EventFilter old_event_filter = qt_set_x11_event_filter(qt_xclb_event_filter);
++ bool flushed = FALSE;
+
+ do {
+- if ( XCheckTypedWindowEvent(dpy,win,type,event) ) {
+- waiting_for_data = FALSE;
+- qt_set_x11_event_filter(old_event_filter);
++ if ( XCheckTypedWindowEvent(dpy,win,type,event) )
+ return TRUE;
+- }
+
+ now = QTime::currentTime();
+ if ( started > now ) // crossed midnight
+ started = now;
+
+- // 0x08 == ExcludeTimers for X11 only
+- qApp->eventLoop()->processEvents( QEventLoop::ExcludeUserInput |
+- QEventLoop::ExcludeSocketNotifiers |
+- QEventLoop::WaitForMore | 0x08 );
+-
+- if ( has_captured_event ) {
+- waiting_for_data = FALSE;
+- *event = captured_event;
+- qt_set_x11_event_filter(old_event_filter);
+- return TRUE;
++ if(!flushed) {
++ XFlush( dpy );
++ flushed = TRUE;
+ }
+- } while ( started.msecsTo(now) < timeout );
+
+- waiting_for_data = FALSE;
+- qt_set_x11_event_filter(old_event_filter);
++ // sleep 50ms, so we don't use up CPU cycles all the time.
++ struct timeval usleep_tv;
++ usleep_tv.tv_sec = 0;
++ usleep_tv.tv_usec = 50000;
++ select(0, 0, 0, 0, &usleep_tv);
++ } while ( started.msecsTo(now) < timeout );
+
+ return FALSE;
+ }
+
+-
+ static inline int maxSelectionIncr( Display *dpy )
+ { return XMaxRequestSize(dpy) > 65536 ? 65536*4 : XMaxRequestSize(dpy)*4 - 100; }
+