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.
This commit is contained in:
Jasper St. Pierre 2014-07-22 11:09:12 -04:00
parent 6ee5a1437c
commit e49bbe2ed8
4 changed files with 18 additions and 48 deletions

View File

@ -30,7 +30,6 @@
struct _MetaCursorTracker { struct _MetaCursorTracker {
GObject parent_instance; GObject parent_instance;
MetaScreen *screen;
MetaCursorRenderer *renderer; MetaCursorRenderer *renderer;
gboolean is_showing; gboolean is_showing;

View File

@ -44,9 +44,6 @@
#include "meta-cursor-private.h" #include "meta-cursor-private.h"
#include "meta-cursor-tracker-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); G_DEFINE_TYPE (MetaCursorTracker, meta_cursor_tracker, G_TYPE_OBJECT);
@ -60,10 +57,12 @@ static guint signals[LAST_SIGNAL];
static MetaCursorReference * static MetaCursorReference *
get_displayed_cursor (MetaCursorTracker *tracker) get_displayed_cursor (MetaCursorTracker *tracker)
{ {
MetaDisplay *display = meta_get_display ();
if (!tracker->is_showing) if (!tracker->is_showing)
return NULL; 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) if (tracker->has_window_cursor)
return tracker->window_cursor; return tracker->window_cursor;
@ -97,6 +96,9 @@ sync_cursor (MetaCursorTracker *tracker)
static void static void
meta_cursor_tracker_init (MetaCursorTracker *self) meta_cursor_tracker_init (MetaCursorTracker *self)
{ {
MetaBackend *backend = meta_get_backend ();
self->renderer = meta_backend_get_cursor_renderer (backend);
self->is_showing = TRUE; self->is_showing = TRUE;
} }
@ -129,47 +131,9 @@ meta_cursor_tracker_class_init (MetaCursorTrackerClass *klass)
} }
static MetaCursorTracker * static MetaCursorTracker *
make_wayland_cursor_tracker (MetaScreen *screen) meta_cursor_tracker_new (void)
{ {
MetaBackend *backend = meta_get_backend (); return g_object_new (META_TYPE_CURSOR_TRACKER, NULL);
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);
} }
static MetaCursorTracker *_cursor_tracker; static MetaCursorTracker *_cursor_tracker;
@ -186,7 +150,7 @@ MetaCursorTracker *
meta_cursor_tracker_get_for_screen (MetaScreen *screen) meta_cursor_tracker_get_for_screen (MetaScreen *screen)
{ {
if (!_cursor_tracker) if (!_cursor_tracker)
_cursor_tracker = meta_cursor_tracker_new (screen); _cursor_tracker = meta_cursor_tracker_new ();
return _cursor_tracker; return _cursor_tracker;
} }
@ -207,12 +171,13 @@ gboolean
meta_cursor_tracker_handle_xevent (MetaCursorTracker *tracker, meta_cursor_tracker_handle_xevent (MetaCursorTracker *tracker,
XEvent *xevent) XEvent *xevent)
{ {
MetaDisplay *display = meta_get_display ();
XFixesCursorNotifyEvent *notify_event; XFixesCursorNotifyEvent *notify_event;
if (meta_is_wayland_compositor ()) if (meta_is_wayland_compositor ())
return FALSE; return FALSE;
if (xevent->xany.type != tracker->screen->display->xfixes_event_base + XFixesCursorNotify) if (xevent->xany.type != display->xfixes_event_base + XFixesCursorNotify)
return FALSE; return FALSE;
notify_event = (XFixesCursorNotifyEvent *)xevent; notify_event = (XFixesCursorNotifyEvent *)xevent;
@ -243,6 +208,7 @@ meta_cursor_reference_take_texture (CoglTexture2D *texture,
static void static void
ensure_xfixes_cursor (MetaCursorTracker *tracker) ensure_xfixes_cursor (MetaCursorTracker *tracker)
{ {
MetaDisplay *display = meta_get_display ();
XFixesCursorImage *cursor_image; XFixesCursorImage *cursor_image;
CoglTexture2D *sprite; CoglTexture2D *sprite;
guint8 *cursor_data; guint8 *cursor_data;
@ -252,7 +218,7 @@ ensure_xfixes_cursor (MetaCursorTracker *tracker)
if (tracker->xfixes_cursor) if (tracker->xfixes_cursor)
return; return;
cursor_image = XFixesGetCursorImage (tracker->screen->display->xdisplay); cursor_image = XFixesGetCursorImage (display->xdisplay);
if (!cursor_image) if (!cursor_image)
return; return;

View File

@ -667,6 +667,9 @@ meta_screen_new (MetaDisplay *display,
return NULL; 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 = g_object_new (META_TYPE_SCREEN, NULL);
screen->closing = 0; screen->closing = 0;

View File

@ -207,6 +207,8 @@ meta_wayland_pointer_init (MetaWaylandPointer *pointer,
manager = clutter_device_manager_get_default (); manager = clutter_device_manager_get_default ();
pointer->device = clutter_device_manager_get_core_device (manager, CLUTTER_POINTER_DEVICE); pointer->device = clutter_device_manager_get_core_device (manager, CLUTTER_POINTER_DEVICE);
pointer->cursor_tracker = meta_cursor_tracker_get_for_screen (NULL);
} }
void void