diff options
Diffstat (limited to 'opensuse/core/qt3/0080-net-wm-sync-request.patch')
-rw-r--r-- | opensuse/core/qt3/0080-net-wm-sync-request.patch | 301 |
1 files changed, 301 insertions, 0 deletions
diff --git a/opensuse/core/qt3/0080-net-wm-sync-request.patch b/opensuse/core/qt3/0080-net-wm-sync-request.patch new file mode 100644 index 000000000..b3e23cd13 --- /dev/null +++ b/opensuse/core/qt3/0080-net-wm-sync-request.patch @@ -0,0 +1,301 @@ +This qt-copy patch has been slightly modified to apply to the SUSE package +(does not apply directly because of the immodule patch). + +--- src/kernel/qwidget_x11.cpp.sav 2007-08-29 15:04:42.000000000 +0200 ++++ src/kernel/qwidget_x11.cpp 2007-08-29 15:06:17.000000000 +0200 +@@ -85,6 +85,12 @@ static QWidget *keyboardGrb = 0; + extern Time qt_x_time; + extern Time qt_x_user_time; + ++#ifndef QT_NO_XSYNC ++extern Atom qt_net_wm_sync_request_counter; ++extern Atom qt_net_wm_sync_request; ++extern bool qt_use_xsync; ++#endif ++ + // defined in qfont_x11.cpp + extern bool qt_has_xft; + +@@ -593,11 +599,14 @@ void QWidget::create( WId window, bool i + + XResizeWindow( dpy, id, crect.width(), crect.height() ); + XStoreName( dpy, id, qAppName() ); +- Atom protocols[4]; ++ Atom protocols[5]; + int n = 0; + protocols[n++] = qt_wm_delete_window; // support del window protocol + protocols[n++] = qt_wm_take_focus; // support take focus window protocol + protocols[n++] = qt_net_wm_ping; // support _NET_WM_PING protocol ++#ifndef QT_NO_XSYNC ++ protocols[n++] = qt_net_wm_sync_request;// support the _NET_WM_SYNC_REQUEST protocol ++#endif + if ( testWFlags( WStyle_ContextHelp ) ) + protocols[n++] = qt_net_wm_context_help; + XSetWMProtocols( dpy, id, protocols, n ); +@@ -623,6 +632,14 @@ void QWidget::create( WId window, bool i + XChangeProperty(dpy, id, qt_net_wm_pid, XA_CARDINAL, 32, PropModeReplace, + (unsigned char *) &curr_pid, 1); + ++#ifndef QT_NO_XSYNC ++ // set _NET_WM_SYNC_COUNTER ++ createSyncCounter(); ++ long counterVal = topData()->syncCounter; ++ XChangeProperty( dpy, id, qt_net_wm_sync_request_counter, XA_CARDINAL, 32, PropModeReplace, ++ (unsigned char*) &counterVal, 1); ++#endif ++ + // when we create a toplevel widget, the frame strut should be dirty + fstrut_dirty = 1; + +@@ -722,6 +739,9 @@ void QWidget::destroy( bool destroyWindo + if ( destroyWindow ) + qt_XDestroyWindow( this, x11Display(), winid ); + } ++#ifndef QT_NO_XSYNC ++ destroySyncCounter(); ++#endif + setWinId( 0 ); + + extern void qPRCleanup( QWidget *widget ); // from qapplication_x11.cpp +@@ -781,6 +801,10 @@ void QWidget::reparentSys( QWidget *pare + destroyInputContext(); + } + ++#ifndef QT_NO_XSYNC ++ destroySyncCounter(); ++#endif ++ + if ( isTopLevel() || !parent ) // we are toplevel, or reparenting to toplevel + topData()->parentWinId = 0; + +@@ -2464,6 +2488,11 @@ void QWidget::createTLSysExtra() + // created lazily + extra->topextra->xic = 0; + #endif ++#ifndef QT_NO_XSYNC ++ extra->topextra->syncCounter = 0; ++ extra->topextra->syncRequestValue[0] = 0; ++ extra->topextra->syncRequestValue[1] = 0; ++#endif + } + + void QWidget::deleteTLSysExtra() +@@ -2510,6 +2539,51 @@ void QWidget::checkChildrenDnd() + } + } + ++ ++#ifndef QT_NO_XSYNC ++// create a window's XSyncCounter ++void QWidget::createSyncCounter() ++{ ++ if( !qt_use_xsync || !isTopLevel() || topData()->syncCounter ) ++ return; ++ XSyncValue zero; ++ XSyncIntToValue( &zero, 0 ); ++ topData()->syncCounter = XSyncCreateCounter( x11Display(), zero ); ++} ++ ++// destroy a window's XSyncCounter ++void QWidget::destroySyncCounter() ++{ ++ if( !qt_use_xsync || !extra || !extra->topextra ++ || !extra->topextra->syncCounter ) ++ return; ++ XSyncDestroyCounter( x11Display(), extra->topextra->syncCounter ); ++ extra->topextra->syncCounter = 0; ++} ++ ++// increment a window's XSyncCounter ++void QWidget::incrementSyncCounter() ++{ ++ if( qt_use_xsync && topData()->syncCounter && ++ !(topData()->syncRequestValue[0] == 0 && ++ topData()->syncRequestValue[1] == 0) ) { ++ XSyncValue val; ++ XSyncIntsToValue( &val, topData()->syncRequestValue[ 0 ], topData()->syncRequestValue[ 1 ] ); ++ XSyncSetCounter( x11Display(), topData()->syncCounter, val ); ++ topData()->syncRequestValue[0] = topData()->syncRequestValue[1] = 0; ++ } ++} ++ ++// handle _NET_WM_SYNC_REQUEST ++void QWidget::handleSyncRequest( void* ev ) ++{ ++ XEvent* xev = (XEvent*)ev; ++ topData()->syncRequestValue[ 0 ] = xev->xclient.data.l[ 2 ]; ++ topData()->syncRequestValue[ 1 ] = xev->xclient.data.l[ 3 ]; ++} ++#endif // QT_NO_XSYNC ++ ++ + /*! + \property QWidget::acceptDrops + \brief whether drop events are enabled for this widget +--- src/kernel/qt_x11_p.h.sav 2007-08-29 15:04:42.000000000 +0200 ++++ src/kernel/qt_x11_p.h 2007-08-29 15:05:27.000000000 +0200 +@@ -174,6 +174,11 @@ extern "C" { + #endif // QT_NO_XRENDER + + ++#ifndef QT_NO_XSYNC ++# include <X11/extensions/sync.h> ++#endif // QT_NO_XSYNC ++ ++ + #ifndef QT_NO_XKB + # include <X11/XKBlib.h> + #endif // QT_NO_XKB +--- src/kernel/qwidget.h.sav 2007-08-29 15:04:42.000000000 +0200 ++++ src/kernel/qwidget.h 2007-08-29 15:05:52.000000000 +0200 +@@ -605,6 +605,14 @@ private: + void focusInputContext(); + void unfocusInputContext(); + void checkChildrenDnd(); ++ ++#ifndef QT_NO_XSYNC ++ void createSyncCounter(); ++ void destroySyncCounter(); ++ void incrementSyncCounter(); ++ void handleSyncRequest( void* ev ); ++#endif ++ + #elif defined(Q_WS_MAC) + uint own_id : 1, macDropEnabled : 1; + EventHandlerRef window_event; +@@ -986,6 +994,10 @@ struct Q_EXPORT QTLWExtra { + #if defined(QT_NO_IM_EXTENSIONS) + void *xic; // Input Context + #endif ++#ifndef QT_NO_XSYNC ++ ulong syncCounter; ++ uint syncRequestValue[2]; ++#endif + #endif + #if defined(Q_WS_MAC) + WindowGroupRef group; +--- src/kernel/qapplication_x11.cpp.sav 2007-08-29 15:04:42.000000000 +0200 ++++ src/kernel/qapplication_x11.cpp 2007-08-29 15:05:27.000000000 +0200 +@@ -288,6 +288,11 @@ Atom *qt_net_supported_list = 0; + Window *qt_net_virtual_root_list = 0; + + ++// X11 SYNC support ++#ifndef QT_NO_XSYNC ++Atom qt_net_wm_sync_request_counter = 0; ++Atom qt_net_wm_sync_request = 0; ++#endif + + // client leader window + Window qt_x11_wm_client_leader = 0; +@@ -312,6 +317,13 @@ static int xrandr_eventbase; + // Display + Q_EXPORT bool qt_use_xrender = FALSE; + ++#ifndef QT_NO_XSYNC ++// True if SYNC extension exists on the connected display ++bool qt_use_xsync = FALSE; ++static int xsync_eventbase; ++static int xsync_errorbase; ++#endif ++ + // modifier masks for alt/meta - detected when the application starts + static long qt_alt_mask = 0; + static long qt_meta_mask = 0; +@@ -2007,6 +2019,11 @@ void qt_init_internal( int *argcptr, cha + qt_x11_intern_atom( "UTF8_STRING", &qt_utf8_string ); + qt_x11_intern_atom( "_SGI_DESKS_MANAGER", &qt_sgi_desks_manager ); + ++#ifndef QT_NO_XSYNC ++ qt_x11_intern_atom( "_NET_WM_SYNC_REQUEST_COUNTER", &qt_net_wm_sync_request_counter ); ++ qt_x11_intern_atom( "_NET_WM_SYNC_REQUEST", &qt_net_wm_sync_request ); ++#endif ++ + qt_xdnd_setup(); + qt_x11_motifdnd_init(); + +@@ -2043,6 +2060,15 @@ void qt_init_internal( int *argcptr, cha + } + #endif // QT_NO_XRENDER + ++#ifndef QT_NO_XSYNC ++ // Try to initialize SYNC extension on the connected display ++ int xsync_major, xsync_minor; ++ if ( XSyncQueryExtension( appDpy, &xsync_eventbase, &xsync_errorbase ) && ++ XSyncInitialize( appDpy, &xsync_major, &xsync_minor ) ) { ++ qt_use_xsync = TRUE; ++ } ++#endif ++ + #ifndef QT_NO_XKB + // If XKB is detected, set the GrabsUseXKBState option so input method + // compositions continue to work (ie. deadkeys) +@@ -3196,6 +3222,10 @@ int QApplication::x11ClientMessage(QWidg + XSendEvent( event->xclient.display, event->xclient.window, + False, SubstructureNotifyMask|SubstructureRedirectMask, event ); + } ++#ifndef QT_NO_XSYNC ++ } else if (a == qt_net_wm_sync_request ) { ++ widget->handleSyncRequest( event ); ++#endif + } + } else if ( event->xclient.message_type == qt_qt_scrolldone ) { + widget->translateScrollDoneEvent(event); +@@ -5818,6 +5848,21 @@ bool QETWidget::translateScrollDoneEvent + return FALSE; + } + ++#if defined(Q_C_CALLBACKS) ++extern "C" { ++#endif ++#ifndef QT_NO_XSYNC ++static Bool qt_net_wm_sync_request_scanner(Display*, XEvent* event, XPointer arg) ++{ ++ return (event->type == ClientMessage && event->xclient.window == *(Window*)arg ++ && event->xclient.message_type == qt_wm_protocols ++ && event->xclient.data.l[ 0 ] == qt_net_wm_sync_request ); ++} ++#endif ++ ++#if defined(Q_C_CALLBACKS) ++} ++#endif + + // + // ConfigureNotify (window move and resize) event translation +@@ -5849,6 +5894,7 @@ bool QETWidget::translateConfigEvent( co + if (! extra || extra->compress_events) { + // ConfigureNotify compression for faster opaque resizing + XEvent otherEvent; ++ int compressed_configs = 0; + while ( XCheckTypedWindowEvent( x11Display(), winId(), ConfigureNotify, + &otherEvent ) ) { + if ( qt_x11EventFilter( &otherEvent ) ) +@@ -5869,7 +5915,18 @@ bool QETWidget::translateConfigEvent( co + newCPos.ry() = otherEvent.xconfigure.y + + otherEvent.xconfigure.border_width; + } ++ ++compressed_configs; ++ } ++#ifndef QT_NO_XSYNC ++ // _NET_WM_SYNC_REQUEST compression ++ Window wid = winId(); ++ while ( compressed_configs && ++ XCheckIfEvent( x11Display(), &otherEvent, ++ qt_net_wm_sync_request_scanner, (XPointer)&wid ) ) { ++ handleSyncRequest( (void*)&otherEvent ); ++ --compressed_configs; + } ++#endif + } + + QRect cr ( geometry() ); +@@ -5923,6 +5980,8 @@ bool QETWidget::translateConfigEvent( co + repaint( !testWFlags(WResizeNoErase) || transbg ); + } + ++ incrementSyncCounter(); ++ + return TRUE; + } + |