Module: wine Branch: master Commit: 886ae4c3484bcf2cda549d8be39e2f901e0394fc URL: http://source.winehq.org/git/wine.git/?a=commit;h=886ae4c3484bcf2cda549d8be3...
Author: Alexandre Julliard julliard@winehq.org Date: Mon Apr 4 15:06:59 2011 +0200
winex11: Always forward SetCursor to the driver, and limit the frequency of updates on the driver side.
---
dlls/user32/cursoricon.c | 4 +--- dlls/winex11.drv/mouse.c | 26 +++++++++++++++++--------- dlls/winex11.drv/window.c | 6 +++++- dlls/winex11.drv/x11drv.h | 2 +- 4 files changed, 24 insertions(+), 14 deletions(-)
diff --git a/dlls/user32/cursoricon.c b/dlls/user32/cursoricon.c index 476aa51..ba06e96 100644 --- a/dlls/user32/cursoricon.c +++ b/dlls/user32/cursoricon.c @@ -1651,9 +1651,7 @@ HCURSOR WINAPI DECLSPEC_HOTPATCH SetCursor( HCURSOR hCursor /* [in] Handle of cu SERVER_END_REQ;
if (!ret) return 0; - - /* Change the cursor shape only if it is visible */ - if (show_count >= 0 && hOldCursor != hCursor) USER_Driver->pSetCursor( hCursor ); + USER_Driver->pSetCursor( show_count >= 0 ? hCursor : 0 );
if (!(obj = get_icon_ptr( hOldCursor ))) return 0; release_icon_ptr( hOldCursor, obj ); diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c index fe9f716..63773ce 100644 --- a/dlls/winex11.drv/mouse.c +++ b/dlls/winex11.drv/mouse.c @@ -93,7 +93,8 @@ static const UINT button_up_flags[NB_BUTTONS] = };
static HWND cursor_window; -static DWORD last_time_modified; +static HCURSOR last_cursor; +static DWORD last_cursor_change; static XContext cursor_context; static RECT clip_rect; static Cursor create_cursor( HANDLE handle ); @@ -157,7 +158,7 @@ static Cursor get_empty_cursor(void) /*********************************************************************** * set_window_cursor */ -void set_window_cursor( struct x11drv_win_data *data, HCURSOR handle ) +void set_window_cursor( Window window, HCURSOR handle ) { Cursor cursor, prev;
@@ -184,10 +185,9 @@ void set_window_cursor( struct x11drv_win_data *data, HCURSOR handle ) } }
- XDefineCursor( gdi_display, data->whole_window, cursor ); + XDefineCursor( gdi_display, window, cursor ); /* make the change take effect immediately */ XFlush( gdi_display ); - data->cursor = handle; wine_tsx11_unlock(); }
@@ -206,7 +206,11 @@ void sync_window_cursor( struct x11drv_win_data *data ) } SERVER_END_REQ;
- if (data->cursor != cursor) set_window_cursor( data, cursor ); + if (data->cursor != cursor) + { + data->cursor = cursor; + set_window_cursor( data->whole_window, cursor ); + } }
/*********************************************************************** @@ -247,12 +251,11 @@ static void send_mouse_input( HWND hwnd, UINT flags, Window window, int x, int y MapWindowPoints( hwnd, 0, &pt, 1 );
if (InterlockedExchangePointer( (void **)&cursor_window, hwnd ) != hwnd || - GetTickCount() - last_time_modified > 100) + GetTickCount() - last_cursor_change > 100) { - cursor_window = hwnd; sync_window_cursor( data ); + last_cursor_change = GetTickCount(); } - last_time_modified = GetTickCount();
if (hwnd != GetDesktopWindow()) hwnd = GetAncestor( hwnd, GA_ROOT );
@@ -877,7 +880,12 @@ void CDECL X11DRV_DestroyCursorIcon( HCURSOR handle ) */ void CDECL X11DRV_SetCursor( HCURSOR handle ) { - if (cursor_window) SendNotifyMessageW( cursor_window, WM_X11DRV_SET_CURSOR, 0, (LPARAM)handle ); + if (InterlockedExchangePointer( (void **)&last_cursor, handle ) != handle || + GetTickCount() - last_cursor_change > 100) + { + last_cursor_change = GetTickCount(); + 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 1fcadb5..21c8352 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -2699,7 +2699,11 @@ LRESULT CDECL X11DRV_WindowMessage( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp ) X11DRV_resize_desktop( LOWORD(lp), HIWORD(lp) ); return 0; case WM_X11DRV_SET_CURSOR: - if ((data = X11DRV_get_win_data( hwnd ))) set_window_cursor( data, (HCURSOR)lp ); + if ((data = X11DRV_get_win_data( hwnd )) && data->whole_window) + { + data->cursor = (HCURSOR)lp; + set_window_cursor( data->whole_window, data->cursor ); + } return 0; default: FIXME( "got window msg %x hwnd %p wp %lx lp %lx\n", msg, hwnd, wp, lp ); diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 0a1e3d9..26375fd 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -820,7 +820,7 @@ 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 void set_window_cursor( struct x11drv_win_data *data, HCURSOR handle ); +extern void set_window_cursor( Window window, HCURSOR handle ); extern void sync_window_cursor( struct x11drv_win_data *data ); extern BOOL CDECL X11DRV_ClipCursor( LPCRECT clip ); extern void X11DRV_InitKeyboard( Display *display );