Alexandre Julliard : winex11: Make the cursor window global instead of per-thread, and send it a message when the cursor changes.

Alexandre Julliard julliard at winehq.org
Thu Apr 29 14:45:04 CDT 2010


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Apr 28 19:23:05 2010 -0500

winex11: Make the cursor window global instead of per-thread, and send it a message when the cursor changes.

---

 dlls/user32/tests/cursoricon.c |   15 +++++--------
 dlls/winex11.drv/mouse.c       |   42 +++++++++++++++++++++++----------------
 dlls/winex11.drv/window.c      |    3 ++
 dlls/winex11.drv/x11drv.h      |    5 ++-
 4 files changed, 37 insertions(+), 28 deletions(-)

diff --git a/dlls/user32/tests/cursoricon.c b/dlls/user32/tests/cursoricon.c
index c1da70d..2a4100e 100644
--- a/dlls/user32/tests/cursoricon.c
+++ b/dlls/user32/tests/cursoricon.c
@@ -1639,13 +1639,12 @@ static void test_DestroyCursor(void)
          * ERROR_INVALID_CURSOR_HANDLE.  This happens because we called
          * DestroyCursor() 2+ times after calling SetCursor().  The calls to
          * GetCursor() and SetCursor(NULL) in between make no difference. */
+        SetLastError(0xdeadbeef);
         ret = DestroyCursor(cursor);
-        todo_wine {
-            ok(!ret, "DestroyCursor succeeded.\n");
-            error = GetLastError();
-            ok(error == ERROR_INVALID_CURSOR_HANDLE || error == 0xdeadbeef, /* vista */
-               "Last error: 0x%08x\n", error);
-        }
+        todo_wine ok(!ret, "DestroyCursor succeeded.\n");
+        error = GetLastError();
+        ok(error == ERROR_INVALID_CURSOR_HANDLE || error == 0xdeadbeef, /* vista */
+           "Last error: 0x%08x\n", error);
     }
 
     DeleteObject(cursorInfo.hbmMask);
@@ -1664,9 +1663,7 @@ static void test_DestroyCursor(void)
     SetLastError(0xdeadbeef);
     SetCursor(cursor);
     error = GetLastError();
-    todo_wine {
-        ok(error == 0xdeadbeef, "Last error: 0x%08x\n", error);
-    }
+    ok(error == 0xdeadbeef, "Last error: 0x%08x\n", error);
 
     /* Check if LoadCursor() returns the same handle with the same icon. */
     cursor2 = LoadCursor(NULL, IDC_ARROW);
diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
index e0e6bb1..5a1a09f 100644
--- a/dlls/winex11.drv/mouse.c
+++ b/dlls/winex11.drv/mouse.c
@@ -86,6 +86,7 @@ static const UINT button_up_flags[NB_BUTTONS] =
 };
 
 POINT cursor_pos;
+static HWND cursor_window;
 static DWORD last_time_modified;
 static RECT cursor_clip; /* Cursor clipping rect */
 static XContext cursor_context;
@@ -206,6 +207,28 @@ Cursor get_x11_cursor( HCURSOR handle )
 }
 
 /***********************************************************************
+ *		set_window_cursor
+ */
+void set_window_cursor( HWND hwnd, HCURSOR handle )
+{
+    struct x11drv_win_data *data;
+    Cursor cursor;
+
+    if (!(data = X11DRV_get_win_data( hwnd ))) return;
+
+    wine_tsx11_lock();
+    if ((cursor = get_x11_cursor( handle )))
+    {
+        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;
+    }
+    wine_tsx11_unlock();
+}
+
+/***********************************************************************
  *		update_mouse_state
  *
  * Update the various window states on a mouse event.
@@ -216,7 +239,7 @@ static void update_mouse_state( HWND hwnd, Window window, int x, int y, unsigned
 
     get_coords( hwnd, window, x, y, pt );
 
-    data->cursor_window = hwnd;
+    cursor_window = hwnd;
 
     /* update the wine server Z-order */
 
@@ -1012,22 +1035,7 @@ void CDECL X11DRV_DestroyCursorIcon( HCURSOR handle )
  */
 void CDECL X11DRV_SetCursor( HCURSOR handle )
 {
-    struct x11drv_thread_data *thread_data = x11drv_init_thread_data();
-    struct x11drv_win_data *data;
-    Cursor cursor;
-
-    if (!(data = X11DRV_get_win_data( thread_data->cursor_window ))) return;
-
-    wine_tsx11_lock();
-    if ((cursor = get_x11_cursor( handle )))
-    {
-        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;
-    }
-    wine_tsx11_unlock();
+    if (cursor_window) SendNotifyMessageW( cursor_window, WM_X11DRV_SET_CURSOR, 0, (LPARAM)handle );
 }
 
 /***********************************************************************
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c
index 831b7c9..8cd3bf3 100644
--- a/dlls/winex11.drv/window.c
+++ b/dlls/winex11.drv/window.c
@@ -2493,6 +2493,9 @@ LRESULT CDECL X11DRV_WindowMessage( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
     case WM_X11DRV_RESIZE_DESKTOP:
         X11DRV_resize_desktop( LOWORD(lp), HIWORD(lp) );
         return 0;
+    case WM_X11DRV_SET_CURSOR:
+        set_window_cursor( hwnd, (HCURSOR)lp );
+        return 0;
     default:
         FIXME( "got window msg %x hwnd %p wp %lx lp %lx\n", msg, hwnd, wp, lp );
         return 0;
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index 4a3f8b7..13afe78 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -546,7 +546,6 @@ struct x11drv_thread_data
 {
     Display *display;
     XEvent  *current_event;        /* event currently being processed */
-    HWND     cursor_window;        /* current window that contains the cursor */
     Window   grab_window;          /* window that currently grabs the mouse */
     HWND     last_focus;           /* last window that had focus */
     XIM      xim;                  /* input method */
@@ -714,7 +713,8 @@ enum x11drv_window_messages
     WM_X11DRV_ACQUIRE_SELECTION = 0x80001000,
     WM_X11DRV_SET_WIN_FORMAT,
     WM_X11DRV_SET_WIN_REGION,
-    WM_X11DRV_RESIZE_DESKTOP
+    WM_X11DRV_RESIZE_DESKTOP,
+    WM_X11DRV_SET_CURSOR
 };
 
 /* _NET_WM_STATE properties that we keep track of */
@@ -782,6 +782,7 @@ 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 );
 extern void X11DRV_send_keyboard_input( WORD wVk, WORD wScan, DWORD dwFlags, DWORD time,




More information about the wine-cvs mailing list