Alexandre Julliard : winex11: Create X11 cursors on demand when the cursor is set to a window.

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


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri May 21 13:26:22 2010 +0200

winex11: Create X11 cursors on demand when the cursor is set to a window.

---

 dlls/winex11.drv/mouse.c          |   90 +++++++++++-------------------------
 dlls/winex11.drv/winex11.drv.spec |    1 -
 dlls/winex11.drv/x11drv.h         |    1 -
 3 files changed, 28 insertions(+), 64 deletions(-)

diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
index 9e3a5cd..e8c84dc 100644
--- a/dlls/winex11.drv/mouse.c
+++ b/dlls/winex11.drv/mouse.c
@@ -39,7 +39,6 @@ MAKE_FUNCPTR(XcursorImageLoadCursor);
 #define NONAMELESSSTRUCT
 #include "windef.h"
 #include "winbase.h"
-#include "wine/winuser16.h"
 
 #include "x11drv.h"
 #include "wine/server.h"
@@ -90,6 +89,7 @@ static HWND cursor_window;
 static DWORD last_time_modified;
 static RECT cursor_clip; /* Cursor clipping rect */
 static XContext cursor_context;
+static Cursor create_cursor( HANDLE handle );
 
 BOOL CDECL X11DRV_SetCursorPos( INT x, INT y );
 
@@ -195,38 +195,42 @@ static Cursor get_empty_cursor(void)
 }
 
 /***********************************************************************
- *		get_x11_cursor
- */
-Cursor get_x11_cursor( HCURSOR handle )
-{
-    Cursor cursor;
-
-    if (!handle) return get_empty_cursor();
-
-    if (cursor_context && !XFindContext( gdi_display, (XID)handle, cursor_context, (char **)&cursor ))
-        return cursor;
-    return 0;
-}
-
-/***********************************************************************
  *		set_window_cursor
  */
 void set_window_cursor( HWND hwnd, HCURSOR handle )
 {
     struct x11drv_win_data *data;
-    Cursor cursor;
+    Cursor cursor, prev;
 
     if (!(data = X11DRV_get_win_data( hwnd ))) return;
 
     wine_tsx11_lock();
-    if ((cursor = get_x11_cursor( handle )))
+    if (!handle) cursor = get_empty_cursor();
+    else if (!cursor_context || XFindContext( gdi_display, (XID)handle, cursor_context, (char **)&cursor ))
     {
-        TRACE( "%p xid %lx\n", handle, cursor );
-        XDefineCursor( gdi_display, data->whole_window, cursor );
-        /* Make the change take effect immediately */
-        XFlush( gdi_display );
-        data->cursor = handle;
+        /* 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 */
+            XFreeCursor( gdi_display, cursor );
+            cursor = prev;
+        }
+        else
+        {
+            XSaveContext( gdi_display, (XID)handle, cursor_context, (char *)cursor );
+            TRACE( "cursor %p created %lx\n", handle, cursor );
+        }
     }
+
+    XDefineCursor( gdi_display, data->whole_window, cursor );
+    /* make the change take effect immediately */
+    XFlush( gdi_display );
+    data->cursor = handle;
     wine_tsx11_unlock();
 }
 
@@ -327,16 +331,8 @@ static void queue_raw_mouse_message( UINT message, HWND hwnd, DWORD x, DWORD y,
 
     if (hwnd)
     {
-        Cursor xcursor;
         struct x11drv_win_data *data = X11DRV_get_win_data( hwnd );
-        if (data && cursor != data->cursor)
-        {
-            wine_tsx11_lock();
-            if ((xcursor = get_x11_cursor( cursor )))
-                XDefineCursor( gdi_display, data->whole_window, xcursor );
-            data->cursor = cursor;
-            wine_tsx11_unlock();
-        }
+        if (data && cursor != data->cursor) set_window_cursor( hwnd, cursor );
     }
 }
 
@@ -796,36 +792,6 @@ static Cursor create_cursor( HANDLE handle )
 }
 
 /***********************************************************************
- *		CreateCursorIcon (X11DRV.@)
- */
-void CDECL X11DRV_CreateCursorIcon( HCURSOR handle, CURSORICONINFO *info )
-{
-    static const WORD ICON_HOTSPOT = 0x4242;
-    Cursor cursor, prev;
-
-    /* ignore icons (FIXME: shouldn't use magic hotspot value) */
-    if (info->ptHotSpot.x == ICON_HOTSPOT && info->ptHotSpot.y == ICON_HOTSPOT) return;
-
-    cursor = create_cursor( handle );
-    if (cursor)
-    {
-        wine_tsx11_lock();
-        if (!cursor_context) cursor_context = XUniqueContext();
-        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 );
-    }
-}
-
-/***********************************************************************
  *		DestroyCursorIcon (X11DRV.@)
  */
 void CDECL X11DRV_DestroyCursorIcon( HCURSOR handle )
@@ -833,7 +799,7 @@ void CDECL X11DRV_DestroyCursorIcon( HCURSOR handle )
     Cursor cursor;
 
     wine_tsx11_lock();
-    if ((cursor = get_x11_cursor( handle )))
+    if (cursor_context && !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/winex11.drv.spec b/dlls/winex11.drv/winex11.drv.spec
index 6bdf66e..ab61f54 100644
--- a/dlls/winex11.drv/winex11.drv.spec
+++ b/dlls/winex11.drv/winex11.drv.spec
@@ -73,7 +73,6 @@
 @ cdecl ToUnicodeEx(long long ptr ptr long long long) X11DRV_ToUnicodeEx
 @ cdecl UnloadKeyboardLayout(long) X11DRV_UnloadKeyboardLayout
 @ cdecl VkKeyScanEx(long long) X11DRV_VkKeyScanEx
-@ cdecl CreateCursorIcon(long ptr) X11DRV_CreateCursorIcon
 @ cdecl DestroyCursorIcon(long) X11DRV_DestroyCursorIcon
 @ cdecl SetCursor(long) X11DRV_SetCursor
 @ cdecl GetCursorPos(ptr) X11DRV_GetCursorPos
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index 13afe78..944669e 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -781,7 +781,6 @@ extern int CDECL X11DRV_AcquireClipboard(HWND hWndClipWindow);
 extern void X11DRV_Clipboard_Cleanup(void);
 extern void X11DRV_ResetSelectionOwner(void);
 extern void CDECL X11DRV_SetFocus( HWND hwnd );
-extern Cursor get_x11_cursor( HCURSOR handle );
 extern void set_window_cursor( HWND hwnd, HCURSOR handle );
 extern BOOL CDECL X11DRV_ClipCursor( LPCRECT clip );
 extern void X11DRV_InitKeyboard( Display *display );




More information about the wine-cvs mailing list