Alexandre Julliard : winex11: Fallback to the standard cursor font when XCursor is missing.
Alexandre Julliard
julliard at winehq.org
Thu Jan 17 14:48:50 CST 2013
Module: wine
Branch: master
Commit: 77af9035d8165604dad7613e6d3e512506819860
URL: http://source.winehq.org/git/wine.git/?a=commit;h=77af9035d8165604dad7613e6d3e512506819860
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Jan 17 15:33:09 2013 +0100
winex11: Fallback to the standard cursor font when XCursor is missing.
---
dlls/winex11.drv/mouse.c | 121 +++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 115 insertions(+), 6 deletions(-)
diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
index 8870665..790c532 100644
--- a/dlls/winex11.drv/mouse.c
+++ b/dlls/winex11.drv/mouse.c
@@ -772,6 +772,8 @@ cleanup:
return cursor;
}
+#endif /* SONAME_LIBXCURSOR */
+
struct system_cursors
{
@@ -843,6 +845,111 @@ static const struct
{ riched20_cursors, {'r','i','c','h','e','d','2','0','.','d','l','l',0} }
};
+struct cursor_font_fallback
+{
+ const char *name;
+ unsigned int shape;
+};
+
+static const struct cursor_font_fallback fallbacks[] =
+{
+ { "X_cursor", XC_X_cursor },
+ { "arrow", XC_arrow },
+ { "based_arrow_down", XC_based_arrow_down },
+ { "based_arrow_up", XC_based_arrow_up },
+ { "boat", XC_boat },
+ { "bogosity", XC_bogosity },
+ { "bottom_left_corner", XC_bottom_left_corner },
+ { "bottom_right_corner", XC_bottom_right_corner },
+ { "bottom_side", XC_bottom_side },
+ { "bottom_tee", XC_bottom_tee },
+ { "box_spiral", XC_box_spiral },
+ { "center_ptr", XC_center_ptr },
+ { "circle", XC_circle },
+ { "clock", XC_clock },
+ { "coffee_mug", XC_coffee_mug },
+ { "col-resize", XC_sb_v_double_arrow },
+ { "cross", XC_cross },
+ { "cross_reverse", XC_cross_reverse },
+ { "crosshair", XC_crosshair },
+ { "diamond_cross", XC_diamond_cross },
+ { "dot", XC_dot },
+ { "dotbox", XC_dotbox },
+ { "double_arrow", XC_double_arrow },
+ { "draft_large", XC_draft_large },
+ { "draft_small", XC_draft_small },
+ { "draped_box", XC_draped_box },
+ { "exchange", XC_exchange },
+ { "fleur", XC_fleur },
+ { "gobbler", XC_gobbler },
+ { "gumby", XC_gumby },
+ { "hand1", XC_hand1 },
+ { "hand2", XC_hand2 },
+ { "heart", XC_heart },
+ { "icon", XC_icon },
+ { "iron_cross", XC_iron_cross },
+ { "left_ptr", XC_left_ptr },
+ { "left_side", XC_left_side },
+ { "left_tee", XC_left_tee },
+ { "leftbutton", XC_leftbutton },
+ { "ll_angle", XC_ll_angle },
+ { "lr_angle", XC_lr_angle },
+ { "man", XC_man },
+ { "middlebutton", XC_middlebutton },
+ { "mouse", XC_mouse },
+ { "pencil", XC_pencil },
+ { "pirate", XC_pirate },
+ { "plus", XC_plus },
+ { "question_arrow", XC_question_arrow },
+ { "right_ptr", XC_right_ptr },
+ { "right_side", XC_right_side },
+ { "right_tee", XC_right_tee },
+ { "rightbutton", XC_rightbutton },
+ { "row-resize", XC_sb_h_double_arrow },
+ { "rtl_logo", XC_rtl_logo },
+ { "sailboat", XC_sailboat },
+ { "sb_down_arrow", XC_sb_down_arrow },
+ { "sb_h_double_arrow", XC_sb_h_double_arrow },
+ { "sb_left_arrow", XC_sb_left_arrow },
+ { "sb_right_arrow", XC_sb_right_arrow },
+ { "sb_up_arrow", XC_sb_up_arrow },
+ { "sb_v_double_arrow", XC_sb_v_double_arrow },
+ { "shuttle", XC_shuttle },
+ { "sizing", XC_sizing },
+ { "spider", XC_spider },
+ { "spraycan", XC_spraycan },
+ { "star", XC_star },
+ { "target", XC_target },
+ { "tcross", XC_tcross },
+ { "top_left_arrow", XC_top_left_arrow },
+ { "top_left_corner", XC_top_left_corner },
+ { "top_right_corner", XC_top_right_corner },
+ { "top_side", XC_top_side },
+ { "top_tee", XC_top_tee },
+ { "trek", XC_trek },
+ { "ul_angle", XC_ul_angle },
+ { "umbrella", XC_umbrella },
+ { "ur_angle", XC_ur_angle },
+ { "watch", XC_watch },
+ { "xterm", XC_xterm }
+};
+
+static int fallback_cmp( const void *key, const void *member )
+{
+ const struct cursor_font_fallback *fallback = member;
+ return strcmp( key, fallback->name );
+}
+
+static int find_fallback_shape( const char *name )
+{
+ struct cursor_font_fallback *fallback;
+
+ if ((fallback = bsearch( name, fallbacks, sizeof(fallbacks) / sizeof(fallbacks[0]),
+ sizeof(*fallback), fallback_cmp )))
+ return fallback->shape;
+ return -1;
+}
+
/***********************************************************************
* create_xcursor_system_cursor
*
@@ -860,7 +967,6 @@ static Cursor create_xcursor_system_cursor( const ICONINFOEXW *info )
char valueA[64];
DWORD size, ret;
- if (!pXcursorLibraryLoadCursor) return 0;
if (!info->szModName[0]) return 0;
p = strrchrW( info->szModName, '\\' );
@@ -904,7 +1010,14 @@ static Cursor create_xcursor_system_cursor( const ICONINFOEXW *info )
done:
if (valueA[0])
{
- cursor = pXcursorLibraryLoadCursor( gdi_display, valueA );
+#ifdef SONAME_LIBXCURSOR
+ if (pXcursorLibraryLoadCursor) cursor = pXcursorLibraryLoadCursor( gdi_display, valueA );
+#endif
+ if (!cursor)
+ {
+ int shape = find_fallback_shape( valueA );
+ if (shape != -1) cursor = XCreateFontCursor( gdi_display, shape );
+ }
if (!cursor) WARN( "no system cursor found for %s mapped to %s\n",
debugstr_w(name), debugstr_a(valueA) );
}
@@ -912,8 +1025,6 @@ done:
return cursor;
}
-#endif /* SONAME_LIBXCURSOR */
-
/***********************************************************************
* create_xlib_monochrome_cursor
@@ -1154,14 +1265,12 @@ static Cursor create_cursor( HANDLE handle )
info.cbSize = sizeof(info);
if (!GetIconInfoExW( handle, &info )) return 0;
-#ifdef SONAME_LIBXCURSOR
if (use_system_cursors && (cursor = create_xcursor_system_cursor( &info )))
{
DeleteObject( info.hbmColor );
DeleteObject( info.hbmMask );
return cursor;
}
-#endif
GetObjectW( info.hbmMask, sizeof(bm), &bm );
if (!info.hbmColor) bm.bmHeight = max( 1, bm.bmHeight / 2 );
More information about the wine-cvs
mailing list