display: add support for more cursor types

These cursors are used by gnome-shell, supporting them allows
to reduce GDK usage in the shell.

Also, make meta_screen_set_cursor() public.

https://bugzilla.gnome.org/show_bug.cgi?id=707919
This commit is contained in:
Giovanni Campagna 2013-09-11 17:22:14 +02:00
parent f044eda079
commit 9def55914c
4 changed files with 49 additions and 8 deletions

View File

@ -3863,7 +3863,8 @@ meta_display_create_x_cursor (MetaDisplay *display,
MetaCursor cursor) MetaCursor cursor)
{ {
Cursor xcursor; Cursor xcursor;
guint glyph; guint glyph = XC_num_glyphs;
const char *name = NULL;
switch (cursor) switch (cursor)
{ {
@ -3900,14 +3901,38 @@ meta_display_create_x_cursor (MetaDisplay *display,
case META_CURSOR_BUSY: case META_CURSOR_BUSY:
glyph = XC_watch; glyph = XC_watch;
break; break;
case META_CURSOR_DND_IN_DRAG:
name = "dnd-in-drag";
break;
case META_CURSOR_DND_MOVE:
name = "dnd-move";
break;
case META_CURSOR_DND_COPY:
name = "dnd-copy";
break;
case META_CURSOR_DND_UNSUPPORTED_TARGET:
name = "dnd-none";
break;
case META_CURSOR_POINTING_HAND:
glyph = XC_hand2;
break;
case META_CURSOR_CROSSHAIR:
glyph = XC_crosshair;
break;
case META_CURSOR_IBEAM:
glyph = XC_xterm;
break;
default: default:
g_assert_not_reached (); g_assert_not_reached ();
glyph = 0; /* silence compiler */ glyph = 0; /* silence compiler */
break; break;
} }
xcursor = XCreateFontCursor (display->xdisplay, glyph); if (name != NULL)
xcursor = XcursorLibraryLoadCursor (display->xdisplay, name);
else
xcursor = XCreateFontCursor (display->xdisplay, glyph);
return xcursor; return xcursor;
} }

View File

@ -151,8 +151,6 @@ void meta_screen_foreach_window (MetaScreen *scree
MetaScreenWindowFunc func, MetaScreenWindowFunc func,
gpointer data); gpointer data);
void meta_screen_set_cursor (MetaScreen *screen,
MetaCursor cursor);
void meta_screen_update_cursor (MetaScreen *screen); void meta_screen_update_cursor (MetaScreen *screen);
void meta_screen_tab_popup_create (MetaScreen *screen, void meta_screen_tab_popup_create (MetaScreen *screen,

View File

@ -260,6 +260,13 @@ typedef enum
* @META_CURSOR_NW_RESIZE: Resize north-western corner cursor * @META_CURSOR_NW_RESIZE: Resize north-western corner cursor
* @META_CURSOR_MOVE_OR_RESIZE_WINDOW: Move or resize cursor * @META_CURSOR_MOVE_OR_RESIZE_WINDOW: Move or resize cursor
* @META_CURSOR_BUSY: Busy cursor * @META_CURSOR_BUSY: Busy cursor
* @META_CURSOR_DND_IN_DRAG: DND in drag cursor
* @META_CURSOR_DND_MOVE: DND move cursor
* @META_CURSOR_DND_COPY: DND copy cursor
* @META_CURSOR_DND_UNSUPPORTED_TARGET: DND unsupported target
* @META_CURSOR_POINTING_HAND: pointing hand
* @META_CURSOR_CROSSHAIR: crosshair (action forbidden)
* @META_CURSOR_IBEAM: I-beam (text input)
*/ */
typedef enum typedef enum
{ {
@ -273,8 +280,15 @@ typedef enum
META_CURSOR_NE_RESIZE, META_CURSOR_NE_RESIZE,
META_CURSOR_NW_RESIZE, META_CURSOR_NW_RESIZE,
META_CURSOR_MOVE_OR_RESIZE_WINDOW, META_CURSOR_MOVE_OR_RESIZE_WINDOW,
META_CURSOR_BUSY META_CURSOR_BUSY,
META_CURSOR_DND_IN_DRAG,
META_CURSOR_DND_MOVE,
META_CURSOR_DND_COPY,
META_CURSOR_DND_UNSUPPORTED_TARGET,
META_CURSOR_POINTING_HAND,
META_CURSOR_CROSSHAIR,
META_CURSOR_IBEAM,
META_CURSOR_LAST
} MetaCursor; } MetaCursor;
/** /**

View File

@ -114,4 +114,8 @@ void meta_screen_override_workspace_layout (MetaScreen *screen,
gboolean vertical_layout, gboolean vertical_layout,
int n_rows, int n_rows,
int n_columns); int n_columns);
void meta_screen_set_cursor (MetaScreen *screen,
MetaCursor cursor);
#endif #endif