Module: wine Branch: master Commit: e25049e879b5fdbe3fe97d2ff00a64ed79eb3633 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e25049e879b5fdbe3fe97d2ff0...
Author: Alexandre Julliard julliard@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 );