Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:42.2
qt3
0080-net-wm-sync-request.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0080-net-wm-sync-request.patch of Package qt3
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; }
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor