Module: wine Branch: master Commit: c970621d90372d14f982b41811efa4e4fe9e5ec8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c970621d90372d14f982b41811...
Author: Alexandre Julliard julliard@winehq.org Date: Wed Aug 15 15:51:06 2012 +0200
winex11: Create contexts at initialization time to avoid the need for locks.
---
dlls/winex11.drv/mouse.c | 12 +++++------- dlls/winex11.drv/window.c | 6 +----- dlls/winex11.drv/x11drv.h | 4 ++++ dlls/winex11.drv/x11drv_main.c | 4 ++++ 4 files changed, 14 insertions(+), 12 deletions(-)
diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c index e8ba8e3..caa2530 100644 --- a/dlls/winex11.drv/mouse.c +++ b/dlls/winex11.drv/mouse.c @@ -121,10 +121,11 @@ static const UINT button_up_data[NB_BUTTONS] = XBUTTON2 };
+XContext cursor_context = 0; + static HWND cursor_window; static HCURSOR last_cursor; static DWORD last_cursor_change; -static XContext cursor_context; static RECT clip_rect; static Cursor create_cursor( HANDLE handle );
@@ -200,16 +201,13 @@ void set_window_cursor( Window window, HCURSOR handle ) { Cursor cursor, prev;
- wine_tsx11_lock(); if (!handle) cursor = get_empty_cursor(); - else if (!cursor_context || XFindContext( gdi_display, (XID)handle, cursor_context, (char **)&cursor )) + else if (XFindContext( gdi_display, (XID)handle, cursor_context, (char **)&cursor )) { /* try to create it */ - wine_tsx11_unlock(); if (!(cursor = create_cursor( handle ))) return;
wine_tsx11_lock(); - if (!cursor_context) cursor_context = XUniqueContext(); if (!XFindContext( gdi_display, (XID)handle, cursor_context, (char **)&prev )) { /* someone else was here first */ @@ -221,12 +219,12 @@ void set_window_cursor( Window window, HCURSOR handle ) XSaveContext( gdi_display, (XID)handle, cursor_context, (char *)cursor ); TRACE( "cursor %p created %lx\n", handle, cursor ); } + wine_tsx11_unlock(); }
XDefineCursor( gdi_display, window, cursor ); /* make the change take effect immediately */ XFlush( gdi_display ); - wine_tsx11_unlock(); }
/*********************************************************************** @@ -1205,7 +1203,7 @@ void CDECL X11DRV_DestroyCursorIcon( HCURSOR handle ) Cursor cursor;
wine_tsx11_lock(); - if (cursor_context && !XFindContext( gdi_display, (XID)handle, cursor_context, (char **)&cursor )) + if (!XFindContext( gdi_display, (XID)handle, cursor_context, (char **)&cursor )) { TRACE( "%p xid %lx\n", handle, cursor ); XFreeCursor( gdi_display, cursor ); diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index c69ef8c..c8e48b2 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -75,7 +75,7 @@ int clipping_cursor = 0; XContext winContext = 0;
/* X context to associate a struct x11drv_win_data to an hwnd */ -static XContext win_data_context; +XContext win_data_context = 0;
/* time of last user event and window where it's stored */ static Time last_user_time; @@ -1914,11 +1914,7 @@ static struct x11drv_win_data *alloc_win_data( Display *display, HWND hwnd ) if ((data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*data)))) { data->hwnd = hwnd; - wine_tsx11_lock(); - if (!winContext) winContext = XUniqueContext(); - if (!win_data_context) win_data_context = XUniqueContext(); XSaveContext( display, (XID)hwnd, win_data_context, (char *)data ); - wine_tsx11_unlock(); } return data; } diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index f24ccdc..3aaedef 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -615,6 +615,10 @@ static inline BOOL is_window_rect_fullscreen( const RECT *rect )
/* X context to associate a hwnd to an X window */ extern XContext winContext DECLSPEC_HIDDEN; +/* X context to associate a struct x11drv_win_data to an hwnd */ +extern XContext win_data_context DECLSPEC_HIDDEN; +/* X context to associate an X cursor to a Win32 cursor handle */ +extern XContext cursor_context DECLSPEC_HIDDEN;
extern void X11DRV_InitClipboard(void) DECLSPEC_HIDDEN; extern int CDECL X11DRV_AcquireClipboard(HWND hWndClipWindow) DECLSPEC_HIDDEN; diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c index 1499329..5659143 100644 --- a/dlls/winex11.drv/x11drv_main.c +++ b/dlls/winex11.drv/x11drv_main.c @@ -570,6 +570,10 @@ static BOOL process_attach(void)
XInternAtoms( display, (char **)atom_names, NB_XATOMS - FIRST_XATOM, False, X11DRV_Atoms );
+ winContext = XUniqueContext(); + win_data_context = XUniqueContext(); + cursor_context = XUniqueContext(); + if (TRACE_ON(synchronous)) XSynchronize( display, True );
xinerama_init( WidthOfScreen(screen), HeightOfScreen(screen) );