Alexandre Julliard : winex11: Make sure the clipping window is initialized in every thread.

Alexandre Julliard julliard at winehq.org
Thu Apr 14 11:58:19 CDT 2011


Module: wine
Branch: master
Commit: 2ed57f9b96509f9bb20a28cf705414c47edff26f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=2ed57f9b96509f9bb20a28cf705414c47edff26f

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Apr 14 12:04:45 2011 +0200

winex11: Make sure the clipping window is initialized in every thread.

---

 dlls/winex11.drv/event.c  |    4 ++--
 dlls/winex11.drv/mouse.c  |    5 +++--
 dlls/winex11.drv/window.c |   42 ++++++++++++++++++++++++++----------------
 dlls/winex11.drv/x11drv.h |    3 ++-
 4 files changed, 33 insertions(+), 21 deletions(-)

diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c
index 62aea5e..97c6f29 100644
--- a/dlls/winex11.drv/event.c
+++ b/dlls/winex11.drv/event.c
@@ -774,7 +774,7 @@ static void X11DRV_MapNotify( HWND hwnd, XEvent *event )
 {
     struct x11drv_win_data *data;
 
-    if (event->xany.window == clip_window)
+    if (event->xany.window == x11drv_thread_data()->clip_window)
     {
         clipping_cursor = 1;
         return;
@@ -795,7 +795,7 @@ static void X11DRV_MapNotify( HWND hwnd, XEvent *event )
  */
 static void X11DRV_UnmapNotify( HWND hwnd, XEvent *event )
 {
-    if (event->xany.window == clip_window) clipping_window_unmapped();
+    if (event->xany.window == x11drv_thread_data()->clip_window) clipping_window_unmapped();
 }
 
 
diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
index a1c913f..2768d8e 100644
--- a/dlls/winex11.drv/mouse.c
+++ b/dlls/winex11.drv/mouse.c
@@ -379,7 +379,7 @@ static void send_mouse_input( HWND hwnd, Window window, unsigned int state, INPU
 
     input->type = INPUT_MOUSE;
 
-    if (!hwnd && window == clip_window)
+    if (!hwnd && window == x11drv_thread_data()->clip_window)
     {
         input->u.mi.dx += clip_rect.left;
         input->u.mi.dy += clip_rect.top;
@@ -1032,7 +1032,7 @@ void CDECL X11DRV_SetCursor( HCURSOR handle )
         GetTickCount() - last_cursor_change > 100)
     {
         last_cursor_change = GetTickCount();
-        if (clipping_cursor) set_window_cursor( clip_window, handle );
+        if (clipping_cursor) set_window_cursor( init_clip_window(), handle );
         else if (cursor_window) SendNotifyMessageW( cursor_window, WM_X11DRV_SET_CURSOR, 0, (LPARAM)handle );
     }
 }
@@ -1085,6 +1085,7 @@ BOOL CDECL X11DRV_GetCursorPos(LPPOINT pos)
 BOOL CDECL X11DRV_ClipCursor( LPCRECT clip )
 {
     Display *display = thread_init_display();
+    Window clip_window = init_clip_window();
 
     if (!clip_window) return TRUE;
 
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c
index 648ed59..15ee1c2 100644
--- a/dlls/winex11.drv/window.c
+++ b/dlls/winex11.drv/window.c
@@ -68,8 +68,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(x11drv);
 
 #define SWP_AGG_NOPOSCHANGE (SWP_NOSIZE | SWP_NOMOVE | SWP_NOCLIENTSIZE | SWP_NOCLIENTMOVE | SWP_NOZORDER)
 
-/* cursor clipping window */
-Window clip_window = 0;
+/* is cursor clipping active? */
 int clipping_cursor = 0;
 
 /* X context to associate a hwnd to an X window */
@@ -1208,6 +1207,24 @@ static void set_wm_hints( Display *display, struct x11drv_win_data *data )
 
 
 /***********************************************************************
+ *     init_clip_window
+ */
+Window init_clip_window(void)
+{
+    struct x11drv_thread_data *data = x11drv_init_thread_data();
+
+    if (!data->clip_window &&
+        (data->clip_window = (Window)GetPropA( GetDesktopWindow(), clip_window_prop )))
+    {
+        wine_tsx11_lock();
+        XSelectInput( data->display, data->clip_window, StructureNotifyMask );
+        wine_tsx11_unlock();
+    }
+    return data->clip_window;
+}
+
+
+/***********************************************************************
  *     update_user_time
  */
 void update_user_time( Time time )
@@ -1711,6 +1728,8 @@ static Window create_whole_window( Display *display, struct x11drv_win_data *dat
     if (!GetLayeredWindowAttributes( data->hwnd, &key, &alpha, &layered_flags )) layered_flags = 0;
     sync_window_opacity( display, data->whole_window, key, alpha, layered_flags );
 
+    init_clip_window();  /* make sure the clip window is initialized in this thread */
+
     wine_tsx11_lock();
     XFlush( display );  /* make sure the window exists before we start painting to it */
     wine_tsx11_unlock();
@@ -1964,35 +1983,26 @@ BOOL CDECL X11DRV_CreateDesktopWindow( HWND hwnd )
  */
 BOOL CDECL X11DRV_CreateWindow( HWND hwnd )
 {
-    Display *display = thread_init_display();
-
     if (hwnd == GetDesktopWindow())
     {
+        struct x11drv_thread_data *data = x11drv_init_thread_data();
         XSetWindowAttributes attr;
 
         if (root_window != DefaultRootWindow( gdi_display ))
         {
             /* the desktop win data can't be created lazily */
-            if (!create_desktop_win_data( display, hwnd )) return FALSE;
+            if (!create_desktop_win_data( data->display, hwnd )) return FALSE;
         }
 
         /* create the cursor clipping window */
         attr.override_redirect = TRUE;
         attr.event_mask = StructureNotifyMask;
         wine_tsx11_lock();
-        clip_window = XCreateWindow( display, root_window, 0, 0, 1, 1, 0, 0,
-                                     InputOnly, visual, CWOverrideRedirect | CWEventMask, &attr );
+        data->clip_window = XCreateWindow( data->display, root_window, 0, 0, 1, 1, 0, 0,
+                                           InputOnly, visual, CWOverrideRedirect | CWEventMask, &attr );
         wine_tsx11_unlock();
-        SetPropA( hwnd, clip_window_prop, (HANDLE)clip_window );
+        SetPropA( hwnd, clip_window_prop, (HANDLE)data->clip_window );
     }
-    else if (!clip_window)
-    {
-        clip_window = (Window)GetPropA( GetDesktopWindow(), clip_window_prop );
-        wine_tsx11_lock();
-        XSelectInput( display, clip_window, StructureNotifyMask );
-        wine_tsx11_unlock();
-    }
-
     return TRUE;
 }
 
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index 8d05e27..cbc563b 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -550,6 +550,7 @@ struct x11drv_thread_data
     HWND     last_xic_hwnd;        /* last xic window */
     XFontSet font_set;             /* international text drawing font set */
     Window   selection_wnd;        /* window used for selection interactions */
+    Window   clip_window;          /* window used for cursor clipping */
     HKL      kbd_layout;           /* active keyboard layout */
     enum { xi_unavailable = -1, xi_unknown, xi_disabled, xi_enabled } xi2_state; /* XInput2 state */
 };
@@ -585,7 +586,6 @@ static inline size_t get_property_size( int format, unsigned long count )
 
 extern Visual *visual;
 extern Window root_window;
-extern Window clip_window;
 extern int clipping_cursor;
 extern unsigned int screen_width;
 extern unsigned int screen_height;
@@ -800,6 +800,7 @@ extern Drawable create_glxpixmap( Display *display, XVisualInfo *vis, Pixmap par
 extern void flush_gl_drawable( X11DRV_PDEVICE *physDev );
 
 extern void wait_for_withdrawn_state( Display *display, struct x11drv_win_data *data, BOOL set );
+extern Window init_clip_window(void);
 extern void update_user_time( Time time );
 extern void update_net_wm_states( Display *display, struct x11drv_win_data *data );
 extern void make_window_embedded( Display *display, struct x11drv_win_data *data );




More information about the wine-cvs mailing list