Alexandre Julliard : winex11: Move X11 locking inside the cursor creation functions.

Alexandre Julliard julliard at winehq.org
Fri May 21 12:15:16 CDT 2010


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu May 20 14:40:06 2010 +0200

winex11: Move X11 locking inside the cursor creation functions.

---

 dlls/winex11.drv/mouse.c |   54 +++++++++++++++++++++++++++++++++++----------
 1 files changed, 42 insertions(+), 12 deletions(-)

diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
index b044182..9581945 100644
--- a/dlls/winex11.drv/mouse.c
+++ b/dlls/winex11.drv/mouse.c
@@ -176,6 +176,7 @@ static Cursor get_empty_cursor(void)
     static Cursor cursor;
     static const char data[] = { 0 };
 
+    wine_tsx11_lock();
     if (!cursor)
     {
         XColor bg;
@@ -189,6 +190,7 @@ static Cursor get_empty_cursor(void)
             XFreePixmap( gdi_display, pixmap );
         }
     }
+    wine_tsx11_unlock();
     return cursor;
 }
 
@@ -682,7 +684,7 @@ static Cursor create_xcursor_cursor( Display *display, CURSORICONINFO *ptr )
  *
  * Create an X cursor from a Windows one.
  */
-static Cursor create_cursor( Display *display, CURSORICONINFO *ptr )
+static Cursor create_xlib_cursor( Display *display, CURSORICONINFO *ptr )
 {
     Pixmap pixmapBits, pixmapMask, pixmapMaskInv = 0, pixmapAll;
     XColor fg, bg;
@@ -691,12 +693,6 @@ static Cursor create_cursor( Display *display, CURSORICONINFO *ptr )
     char *bitMask32 = NULL;
     BOOL alpha_zero = TRUE;
 
-    if (!ptr) return get_empty_cursor();
-
-#ifdef SONAME_LIBXCURSOR
-    if (pXcursorImageLoadCursor) return create_xcursor_cursor( display, ptr );
-#endif
-
     /* Create the X cursor from the bits */
     {
         XImage *image;
@@ -992,26 +988,60 @@ static Cursor create_cursor( Display *display, CURSORICONINFO *ptr )
 }
 
 /***********************************************************************
+ *		create_cursor
+ *
+ * Create an X cursor from a Windows one.
+ */
+static Cursor create_cursor( HANDLE handle, CURSORICONINFO *ptr )
+{
+    Cursor cursor;
+
+    if (!handle) return get_empty_cursor();
+
+#ifdef SONAME_LIBXCURSOR
+    if (pXcursorImageLoadCursor)
+    {
+        wine_tsx11_lock();
+        cursor = create_xcursor_cursor( gdi_display, ptr );
+        wine_tsx11_unlock();
+        if (cursor) return cursor;
+    }
+#endif
+
+    wine_tsx11_lock();
+    cursor = create_xlib_cursor( gdi_display, ptr );
+    wine_tsx11_unlock();
+    return cursor;
+}
+
+/***********************************************************************
  *		CreateCursorIcon (X11DRV.@)
  */
 void CDECL X11DRV_CreateCursorIcon( HCURSOR handle, CURSORICONINFO *info )
 {
     static const WORD ICON_HOTSPOT = 0x4242;
-    Cursor cursor;
+    Cursor cursor, prev;
 
     /* ignore icons (FIXME: shouldn't use magic hotspot value) */
     if (info->ptHotSpot.x == ICON_HOTSPOT && info->ptHotSpot.y == ICON_HOTSPOT) return;
 
-    wine_tsx11_lock();
-    cursor = create_cursor( gdi_display, info );
+    cursor = create_cursor( handle, info );
     if (cursor)
     {
+        wine_tsx11_lock();
         if (!cursor_context) cursor_context = XUniqueContext();
-        XSaveContext( gdi_display, (XID)handle, cursor_context, (char *)cursor );
+        if (!XFindContext( gdi_display, (XID)handle, cursor_context, (char **)&prev ))
+        {
+            /* someone else was here first */
+            XFreeCursor( gdi_display, cursor );
+            cursor = prev;
+        }
+        else
+            XSaveContext( gdi_display, (XID)handle, cursor_context, (char *)cursor );
+        wine_tsx11_unlock();
         TRACE( "cursor %p %ux%u, planes %u, bpp %u -> xid %lx\n",
                handle, info->nWidth, info->nHeight, info->bPlanes, info->bBitsPerPixel, cursor );
     }
-    wine_tsx11_unlock();
 }
 
 /***********************************************************************




More information about the wine-cvs mailing list