From 9def55914c0aa62d8ed7c24b2c6b957a46541423 Mon Sep 17 00:00:00 2001 From: Giovanni Campagna Date: Wed, 11 Sep 2013 17:22:14 +0200 Subject: [PATCH] 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 --- src/core/display.c | 33 +++++++++++++++++++++++++++++---- src/core/screen-private.h | 2 -- src/meta/common.h | 18 ++++++++++++++++-- src/meta/screen.h | 4 ++++ 4 files changed, 49 insertions(+), 8 deletions(-) diff --git a/src/core/display.c b/src/core/display.c index 755b97034..c630a950c 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -3863,7 +3863,8 @@ meta_display_create_x_cursor (MetaDisplay *display, MetaCursor cursor) { Cursor xcursor; - guint glyph; + guint glyph = XC_num_glyphs; + const char *name = NULL; switch (cursor) { @@ -3900,14 +3901,38 @@ meta_display_create_x_cursor (MetaDisplay *display, case META_CURSOR_BUSY: glyph = XC_watch; 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: g_assert_not_reached (); glyph = 0; /* silence compiler */ break; } - - xcursor = XCreateFontCursor (display->xdisplay, glyph); + + if (name != NULL) + xcursor = XcursorLibraryLoadCursor (display->xdisplay, name); + else + xcursor = XCreateFontCursor (display->xdisplay, glyph); return xcursor; } diff --git a/src/core/screen-private.h b/src/core/screen-private.h index 5d7bfd0aa..426f561ff 100644 --- a/src/core/screen-private.h +++ b/src/core/screen-private.h @@ -151,8 +151,6 @@ void meta_screen_foreach_window (MetaScreen *scree MetaScreenWindowFunc func, gpointer data); -void meta_screen_set_cursor (MetaScreen *screen, - MetaCursor cursor); void meta_screen_update_cursor (MetaScreen *screen); void meta_screen_tab_popup_create (MetaScreen *screen, diff --git a/src/meta/common.h b/src/meta/common.h index 98f2ad781..01c259773 100644 --- a/src/meta/common.h +++ b/src/meta/common.h @@ -260,6 +260,13 @@ typedef enum * @META_CURSOR_NW_RESIZE: Resize north-western corner cursor * @META_CURSOR_MOVE_OR_RESIZE_WINDOW: Move or resize 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 { @@ -273,8 +280,15 @@ typedef enum META_CURSOR_NE_RESIZE, META_CURSOR_NW_RESIZE, 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; /** diff --git a/src/meta/screen.h b/src/meta/screen.h index aec9afa47..88a3481a4 100644 --- a/src/meta/screen.h +++ b/src/meta/screen.h @@ -114,4 +114,8 @@ void meta_screen_override_workspace_layout (MetaScreen *screen, gboolean vertical_layout, int n_rows, int n_columns); + +void meta_screen_set_cursor (MetaScreen *screen, + MetaCursor cursor); + #endif