From e49bbe2ed8aed844f15aabe289323036e2459245 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Tue, 22 Jul 2014 11:09:12 -0400 Subject: [PATCH] cursor-tracker: Don't require a screen This allows us to do initialization earlier and not have to poke into Wayland internals from the cursor tracker. --- src/backends/meta-cursor-tracker-private.h | 1 - src/backends/meta-cursor-tracker.c | 60 +++++----------------- src/core/screen.c | 3 ++ src/wayland/meta-wayland-pointer.c | 2 + 4 files changed, 18 insertions(+), 48 deletions(-) diff --git a/src/backends/meta-cursor-tracker-private.h b/src/backends/meta-cursor-tracker-private.h index 8eebd9fdb..f901e6ef3 100644 --- a/src/backends/meta-cursor-tracker-private.h +++ b/src/backends/meta-cursor-tracker-private.h @@ -30,7 +30,6 @@ struct _MetaCursorTracker { GObject parent_instance; - MetaScreen *screen; MetaCursorRenderer *renderer; gboolean is_showing; diff --git a/src/backends/meta-cursor-tracker.c b/src/backends/meta-cursor-tracker.c index 16e876d45..3f35bab47 100644 --- a/src/backends/meta-cursor-tracker.c +++ b/src/backends/meta-cursor-tracker.c @@ -44,9 +44,6 @@ #include "meta-cursor-private.h" #include "meta-cursor-tracker-private.h" -#include "screen-private.h" - -#include "wayland/meta-wayland-private.h" G_DEFINE_TYPE (MetaCursorTracker, meta_cursor_tracker, G_TYPE_OBJECT); @@ -60,10 +57,12 @@ static guint signals[LAST_SIGNAL]; static MetaCursorReference * get_displayed_cursor (MetaCursorTracker *tracker) { + MetaDisplay *display = meta_get_display (); + if (!tracker->is_showing) return NULL; - if (tracker->screen->display->grab_op == META_GRAB_OP_NONE) + if (display->grab_op == META_GRAB_OP_NONE) { if (tracker->has_window_cursor) return tracker->window_cursor; @@ -97,6 +96,9 @@ sync_cursor (MetaCursorTracker *tracker) static void meta_cursor_tracker_init (MetaCursorTracker *self) { + MetaBackend *backend = meta_get_backend (); + + self->renderer = meta_backend_get_cursor_renderer (backend); self->is_showing = TRUE; } @@ -129,47 +131,9 @@ meta_cursor_tracker_class_init (MetaCursorTrackerClass *klass) } static MetaCursorTracker * -make_wayland_cursor_tracker (MetaScreen *screen) +meta_cursor_tracker_new (void) { - MetaBackend *backend = meta_get_backend (); - MetaWaylandCompositor *compositor; - MetaCursorTracker *self; - - self = g_object_new (META_TYPE_CURSOR_TRACKER, NULL); - self->screen = screen; - self->renderer = meta_backend_get_cursor_renderer (backend); - - compositor = meta_wayland_compositor_get_default (); - compositor->seat->pointer.cursor_tracker = self; - meta_cursor_tracker_update_position (self, 0, 0); - - return self; -} - -static MetaCursorTracker * -make_x11_cursor_tracker (MetaScreen *screen) -{ - MetaBackend *backend = meta_get_backend (); - MetaCursorTracker *self; - - self = g_object_new (META_TYPE_CURSOR_TRACKER, NULL); - self->screen = screen; - self->renderer = meta_backend_get_cursor_renderer (backend); - - XFixesSelectCursorInput (screen->display->xdisplay, - screen->xroot, - XFixesDisplayCursorNotifyMask); - - return self; -} - -static MetaCursorTracker * -meta_cursor_tracker_new (MetaScreen *screen) -{ - if (meta_is_wayland_compositor ()) - return make_wayland_cursor_tracker (screen); - else - return make_x11_cursor_tracker (screen); + return g_object_new (META_TYPE_CURSOR_TRACKER, NULL); } static MetaCursorTracker *_cursor_tracker; @@ -186,7 +150,7 @@ MetaCursorTracker * meta_cursor_tracker_get_for_screen (MetaScreen *screen) { if (!_cursor_tracker) - _cursor_tracker = meta_cursor_tracker_new (screen); + _cursor_tracker = meta_cursor_tracker_new (); return _cursor_tracker; } @@ -207,12 +171,13 @@ gboolean meta_cursor_tracker_handle_xevent (MetaCursorTracker *tracker, XEvent *xevent) { + MetaDisplay *display = meta_get_display (); XFixesCursorNotifyEvent *notify_event; if (meta_is_wayland_compositor ()) return FALSE; - if (xevent->xany.type != tracker->screen->display->xfixes_event_base + XFixesCursorNotify) + if (xevent->xany.type != display->xfixes_event_base + XFixesCursorNotify) return FALSE; notify_event = (XFixesCursorNotifyEvent *)xevent; @@ -243,6 +208,7 @@ meta_cursor_reference_take_texture (CoglTexture2D *texture, static void ensure_xfixes_cursor (MetaCursorTracker *tracker) { + MetaDisplay *display = meta_get_display (); XFixesCursorImage *cursor_image; CoglTexture2D *sprite; guint8 *cursor_data; @@ -252,7 +218,7 @@ ensure_xfixes_cursor (MetaCursorTracker *tracker) if (tracker->xfixes_cursor) return; - cursor_image = XFixesGetCursorImage (tracker->screen->display->xdisplay); + cursor_image = XFixesGetCursorImage (display->xdisplay); if (!cursor_image) return; diff --git a/src/core/screen.c b/src/core/screen.c index 959907f96..9742db7ab 100644 --- a/src/core/screen.c +++ b/src/core/screen.c @@ -667,6 +667,9 @@ meta_screen_new (MetaDisplay *display, return NULL; } + /* Select for cursor changes so the cursor tracker is up to date. */ + XFixesSelectCursorInput (xdisplay, xroot, XFixesDisplayCursorNotifyMask); + screen = g_object_new (META_TYPE_SCREEN, NULL); screen->closing = 0; diff --git a/src/wayland/meta-wayland-pointer.c b/src/wayland/meta-wayland-pointer.c index 06ee78bd5..ce22e7c48 100644 --- a/src/wayland/meta-wayland-pointer.c +++ b/src/wayland/meta-wayland-pointer.c @@ -207,6 +207,8 @@ meta_wayland_pointer_init (MetaWaylandPointer *pointer, manager = clutter_device_manager_get_default (); pointer->device = clutter_device_manager_get_core_device (manager, CLUTTER_POINTER_DEVICE); + + pointer->cursor_tracker = meta_cursor_tracker_get_for_screen (NULL); } void