winex11: Move X11 locking inside the cursor creation functions.
This commit is contained in:
parent
0d84ccbfa1
commit
45b7eb6858
|
@ -176,6 +176,7 @@ static Cursor get_empty_cursor(void)
|
||||||
static Cursor cursor;
|
static Cursor cursor;
|
||||||
static const char data[] = { 0 };
|
static const char data[] = { 0 };
|
||||||
|
|
||||||
|
wine_tsx11_lock();
|
||||||
if (!cursor)
|
if (!cursor)
|
||||||
{
|
{
|
||||||
XColor bg;
|
XColor bg;
|
||||||
|
@ -189,6 +190,7 @@ static Cursor get_empty_cursor(void)
|
||||||
XFreePixmap( gdi_display, pixmap );
|
XFreePixmap( gdi_display, pixmap );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
wine_tsx11_unlock();
|
||||||
return cursor;
|
return cursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -682,7 +684,7 @@ static Cursor create_xcursor_cursor( Display *display, CURSORICONINFO *ptr )
|
||||||
*
|
*
|
||||||
* Create an X cursor from a Windows one.
|
* 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;
|
Pixmap pixmapBits, pixmapMask, pixmapMaskInv = 0, pixmapAll;
|
||||||
XColor fg, bg;
|
XColor fg, bg;
|
||||||
|
@ -691,12 +693,6 @@ static Cursor create_cursor( Display *display, CURSORICONINFO *ptr )
|
||||||
char *bitMask32 = NULL;
|
char *bitMask32 = NULL;
|
||||||
BOOL alpha_zero = TRUE;
|
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 */
|
/* Create the X cursor from the bits */
|
||||||
{
|
{
|
||||||
XImage *image;
|
XImage *image;
|
||||||
|
@ -991,27 +987,61 @@ static Cursor create_cursor( Display *display, CURSORICONINFO *ptr )
|
||||||
return cursor;
|
return cursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* 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.@)
|
* CreateCursorIcon (X11DRV.@)
|
||||||
*/
|
*/
|
||||||
void CDECL X11DRV_CreateCursorIcon( HCURSOR handle, CURSORICONINFO *info )
|
void CDECL X11DRV_CreateCursorIcon( HCURSOR handle, CURSORICONINFO *info )
|
||||||
{
|
{
|
||||||
static const WORD ICON_HOTSPOT = 0x4242;
|
static const WORD ICON_HOTSPOT = 0x4242;
|
||||||
Cursor cursor;
|
Cursor cursor, prev;
|
||||||
|
|
||||||
/* ignore icons (FIXME: shouldn't use magic hotspot value) */
|
/* ignore icons (FIXME: shouldn't use magic hotspot value) */
|
||||||
if (info->ptHotSpot.x == ICON_HOTSPOT && info->ptHotSpot.y == ICON_HOTSPOT) return;
|
if (info->ptHotSpot.x == ICON_HOTSPOT && info->ptHotSpot.y == ICON_HOTSPOT) return;
|
||||||
|
|
||||||
wine_tsx11_lock();
|
cursor = create_cursor( handle, info );
|
||||||
cursor = create_cursor( gdi_display, info );
|
|
||||||
if (cursor)
|
if (cursor)
|
||||||
{
|
{
|
||||||
|
wine_tsx11_lock();
|
||||||
if (!cursor_context) cursor_context = XUniqueContext();
|
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",
|
TRACE( "cursor %p %ux%u, planes %u, bpp %u -> xid %lx\n",
|
||||||
handle, info->nWidth, info->nHeight, info->bPlanes, info->bBitsPerPixel, cursor );
|
handle, info->nWidth, info->nHeight, info->bPlanes, info->bBitsPerPixel, cursor );
|
||||||
}
|
}
|
||||||
wine_tsx11_unlock();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
|
Loading…
Reference in New Issue