314a7ca
From 94a88b752a9373656bb0f62897513c8f5e552127 Mon Sep 17 00:00:00 2001
314a7ca
From: Carlos Garnacho <carlosg@gnome.org>
314a7ca
Date: Fri, 4 Nov 2016 19:36:10 +0100
314a7ca
Subject: [PATCH xserver 07/12] xwayland: Refactor cursor management into
314a7ca
 xwl_cursor
314a7ca
314a7ca
This struct takes away the cursor info in xwl_seat, and has
314a7ca
an update function so we can share the frame handling code
314a7ca
across several xwl_cursors.
314a7ca
314a7ca
Signed-off-by: Carlos Garnacho <carlosg@gnome.org>
314a7ca
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
314a7ca
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
314a7ca
Acked-by: Ping Cheng <ping.cheng@wacom.com>
314a7ca
(cherry picked from commit 6d1ad39fe6c18220dd39b0653fd1e4145140e2dc)
314a7ca
---
314a7ca
 hw/xwayland/xwayland-cursor.c | 39 ++++++++++++++++++++-------------------
314a7ca
 hw/xwayland/xwayland-input.c  | 38 +++++++++++++++++++++++++++++++-------
314a7ca
 hw/xwayland/xwayland.h        | 11 ++++++++---
314a7ca
 3 files changed, 59 insertions(+), 29 deletions(-)
314a7ca
314a7ca
diff --git a/hw/xwayland/xwayland-cursor.c b/hw/xwayland/xwayland-cursor.c
314a7ca
index f334f1ca5..fdae3ce85 100644
314a7ca
--- a/hw/xwayland/xwayland-cursor.c
314a7ca
+++ b/hw/xwayland/xwayland-cursor.c
314a7ca
@@ -96,11 +96,11 @@ xwl_unrealize_cursor(DeviceIntPtr device, ScreenPtr screen, CursorPtr cursor)
314a7ca
 }
314a7ca
 
314a7ca
 static void
314a7ca
-clear_cursor_frame_callback(struct xwl_seat *xwl_seat)
314a7ca
+clear_cursor_frame_callback(struct xwl_cursor *xwl_cursor)
314a7ca
 {
314a7ca
-   if (xwl_seat->cursor_frame_cb) {
314a7ca
-       wl_callback_destroy (xwl_seat->cursor_frame_cb);
314a7ca
-       xwl_seat->cursor_frame_cb = NULL;
314a7ca
+   if (xwl_cursor->frame_cb) {
314a7ca
+       wl_callback_destroy (xwl_cursor->frame_cb);
314a7ca
+       xwl_cursor->frame_cb = NULL;
314a7ca
    }
314a7ca
 }
314a7ca
 
314a7ca
@@ -109,12 +109,12 @@ frame_callback(void *data,
314a7ca
                struct wl_callback *callback,
314a7ca
                uint32_t time)
314a7ca
 {
314a7ca
-    struct xwl_seat *xwl_seat = data;
314a7ca
+    struct xwl_cursor *xwl_cursor = data;
314a7ca
 
314a7ca
-    clear_cursor_frame_callback(xwl_seat);
314a7ca
-    if (xwl_seat->cursor_needs_update) {
314a7ca
-        xwl_seat->cursor_needs_update = FALSE;
314a7ca
-        xwl_seat_set_cursor(xwl_seat);
314a7ca
+    clear_cursor_frame_callback(xwl_cursor);
314a7ca
+    if (xwl_cursor->needs_update) {
314a7ca
+        xwl_cursor->needs_update = FALSE;
314a7ca
+        xwl_cursor->update_proc(xwl_cursor);
314a7ca
     }
314a7ca
 }
314a7ca
 
314a7ca
@@ -125,6 +125,7 @@ static const struct wl_callback_listener frame_listener = {
314a7ca
 void
314a7ca
 xwl_seat_set_cursor(struct xwl_seat *xwl_seat)
314a7ca
 {
314a7ca
+    struct xwl_cursor *xwl_cursor = &xwl_seat->cursor;
314a7ca
     PixmapPtr pixmap;
314a7ca
     CursorPtr cursor;
314a7ca
     int stride;
314a7ca
@@ -135,13 +136,13 @@ xwl_seat_set_cursor(struct xwl_seat *xwl_seat)
314a7ca
     if (!xwl_seat->x_cursor) {
314a7ca
         wl_pointer_set_cursor(xwl_seat->wl_pointer,
314a7ca
                               xwl_seat->pointer_enter_serial, NULL, 0, 0);
314a7ca
-        clear_cursor_frame_callback(xwl_seat);
314a7ca
-        xwl_seat->cursor_needs_update = FALSE;
314a7ca
+        clear_cursor_frame_callback(xwl_cursor);
314a7ca
+        xwl_cursor->needs_update = FALSE;
314a7ca
         return;
314a7ca
     }
314a7ca
 
314a7ca
-    if (xwl_seat->cursor_frame_cb) {
314a7ca
-        xwl_seat->cursor_needs_update = TRUE;
314a7ca
+    if (xwl_cursor->frame_cb) {
314a7ca
+        xwl_cursor->needs_update = TRUE;
314a7ca
         return;
314a7ca
     }
314a7ca
 
314a7ca
@@ -159,19 +160,19 @@ xwl_seat_set_cursor(struct xwl_seat *xwl_seat)
314a7ca
 
314a7ca
     wl_pointer_set_cursor(xwl_seat->wl_pointer,
314a7ca
                           xwl_seat->pointer_enter_serial,
314a7ca
-                          xwl_seat->cursor,
314a7ca
+                          xwl_cursor->surface,
314a7ca
                           xwl_seat->x_cursor->bits->xhot,
314a7ca
                           xwl_seat->x_cursor->bits->yhot);
314a7ca
-    wl_surface_attach(xwl_seat->cursor,
314a7ca
+    wl_surface_attach(xwl_cursor->surface,
314a7ca
                       xwl_shm_pixmap_get_wl_buffer(pixmap), 0, 0);
314a7ca
-    wl_surface_damage(xwl_seat->cursor, 0, 0,
314a7ca
+    wl_surface_damage(xwl_cursor->surface, 0, 0,
314a7ca
                       xwl_seat->x_cursor->bits->width,
314a7ca
                       xwl_seat->x_cursor->bits->height);
314a7ca
 
314a7ca
-    xwl_seat->cursor_frame_cb = wl_surface_frame(xwl_seat->cursor);
314a7ca
-    wl_callback_add_listener(xwl_seat->cursor_frame_cb, &frame_listener, xwl_seat);
314a7ca
+    xwl_cursor->frame_cb = wl_surface_frame(xwl_cursor->surface);
314a7ca
+    wl_callback_add_listener(xwl_cursor->frame_cb, &frame_listener, xwl_cursor);
314a7ca
 
314a7ca
-    wl_surface_commit(xwl_seat->cursor);
314a7ca
+    wl_surface_commit(xwl_cursor->surface);
314a7ca
 }
314a7ca
 
314a7ca
 static void
314a7ca
diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c
314a7ca
index 50da10839..bb520e891 100644
314a7ca
--- a/hw/xwayland/xwayland-input.c
314a7ca
+++ b/hw/xwayland/xwayland-input.c
314a7ca
@@ -424,9 +424,9 @@ pointer_handle_enter(void *data, struct wl_pointer *pointer,
314a7ca
      * of our surfaces might not have been shown. In that case we'll
314a7ca
      * have a cursor surface frame callback pending which we need to
314a7ca
      * clear so that we can continue submitting new cursor frames. */
314a7ca
-    if (xwl_seat->cursor_frame_cb) {
314a7ca
-        wl_callback_destroy(xwl_seat->cursor_frame_cb);
314a7ca
-        xwl_seat->cursor_frame_cb = NULL;
314a7ca
+    if (xwl_seat->cursor.frame_cb) {
314a7ca
+        wl_callback_destroy(xwl_seat->cursor.frame_cb);
314a7ca
+        xwl_seat->cursor.frame_cb = NULL;
314a7ca
         xwl_seat_set_cursor(xwl_seat);
314a7ca
     }
314a7ca
 
314a7ca
@@ -1203,6 +1203,31 @@ static const struct wl_seat_listener seat_listener = {
314a7ca
 };
314a7ca
 
314a7ca
 static void
314a7ca
+xwl_cursor_init(struct xwl_cursor *xwl_cursor, struct xwl_screen *xwl_screen,
314a7ca
+                void (* update_proc)(struct xwl_cursor *))
314a7ca
+{
314a7ca
+    xwl_cursor->surface = wl_compositor_create_surface(xwl_screen->compositor);
314a7ca
+    xwl_cursor->update_proc = update_proc;
314a7ca
+    xwl_cursor->frame_cb = NULL;
314a7ca
+    xwl_cursor->needs_update = FALSE;
314a7ca
+}
314a7ca
+
314a7ca
+static void
314a7ca
+xwl_cursor_release(struct xwl_cursor *xwl_cursor)
314a7ca
+{
314a7ca
+    wl_surface_destroy(xwl_cursor->surface);
314a7ca
+    if (xwl_cursor->frame_cb)
314a7ca
+        wl_callback_destroy(xwl_cursor->frame_cb);
314a7ca
+}
314a7ca
+
314a7ca
+static void
314a7ca
+xwl_seat_update_cursor(struct xwl_cursor *xwl_cursor)
314a7ca
+{
314a7ca
+    struct xwl_seat *xwl_seat = wl_container_of(xwl_cursor, xwl_seat, cursor);
314a7ca
+    xwl_seat_set_cursor(xwl_seat);
314a7ca
+}
314a7ca
+
314a7ca
+static void
314a7ca
 create_input_device(struct xwl_screen *xwl_screen, uint32_t id, uint32_t version)
314a7ca
 {
314a7ca
     struct xwl_seat *xwl_seat;
314a7ca
@@ -1221,7 +1246,8 @@ create_input_device(struct xwl_screen *xwl_screen, uint32_t id, uint32_t version
314a7ca
                          &wl_seat_interface, min(version, 5));
314a7ca
     xwl_seat->id = id;
314a7ca
 
314a7ca
-    xwl_seat->cursor = wl_compositor_create_surface(xwl_screen->compositor);
314a7ca
+    xwl_cursor_init(&xwl_seat->cursor, xwl_seat->xwl_screen,
314a7ca
+                    xwl_seat_update_cursor);
314a7ca
     wl_seat_add_listener(xwl_seat->seat, &seat_listener, xwl_seat);
314a7ca
 
314a7ca
     init_tablet_manager_seat(xwl_screen, xwl_seat);
314a7ca
@@ -1252,9 +1278,7 @@ xwl_seat_destroy(struct xwl_seat *xwl_seat)
314a7ca
     release_tablet_manager_seat(xwl_seat);
314a7ca
 
314a7ca
     wl_seat_destroy(xwl_seat->seat);
314a7ca
-    wl_surface_destroy(xwl_seat->cursor);
314a7ca
-    if (xwl_seat->cursor_frame_cb)
314a7ca
-        wl_callback_destroy(xwl_seat->cursor_frame_cb);
314a7ca
+    xwl_cursor_release(&xwl_seat->cursor);
314a7ca
     wl_array_release(&xwl_seat->keys);
314a7ca
     free(xwl_seat);
314a7ca
 }
314a7ca
diff --git a/hw/xwayland/xwayland.h b/hw/xwayland/xwayland.h
314a7ca
index bb119dad7..bfa5f47c7 100644
314a7ca
--- a/hw/xwayland/xwayland.h
314a7ca
+++ b/hw/xwayland/xwayland.h
314a7ca
@@ -127,6 +127,13 @@ struct xwl_pointer_warp_emulator {
314a7ca
     struct zwp_locked_pointer_v1 *locked_pointer;
314a7ca
 };
314a7ca
 
314a7ca
+struct xwl_cursor {
314a7ca
+    void (* update_proc) (struct xwl_cursor *);
314a7ca
+    struct wl_surface *surface;
314a7ca
+    struct wl_callback *frame_cb;
314a7ca
+    Bool needs_update;
314a7ca
+};
314a7ca
+
314a7ca
 struct xwl_seat {
314a7ca
     DeviceIntPtr pointer;
314a7ca
     DeviceIntPtr relative_pointer;
314a7ca
@@ -148,9 +155,7 @@ struct xwl_seat {
314a7ca
     uint32_t pointer_enter_serial;
314a7ca
     struct xorg_list link;
314a7ca
     CursorPtr x_cursor;
314a7ca
-    struct wl_surface *cursor;
314a7ca
-    struct wl_callback *cursor_frame_cb;
314a7ca
-    Bool cursor_needs_update;
314a7ca
+    struct xwl_cursor cursor;
314a7ca
     WindowPtr last_xwindow;
314a7ca
 
314a7ca
     struct xorg_list touches;
314a7ca
-- 
314a7ca
2.13.5
314a7ca