tinyds: Activate/deactivate xdg_surfaces 45/294545/1
authorSeunghun Lee <shiin.lee@samsung.com>
Wed, 21 Jun 2023 05:08:35 +0000 (14:08 +0900)
committerSeunghun Lee <shiin.lee@samsung.com>
Wed, 21 Jun 2023 05:17:19 +0000 (14:17 +0900)
This change will activate and deactivate xdg_surfaces when keyboard
focus changes. This lets client know if it has focus and the client will
repaint accordingly.

Change-Id: Idf774f5d4e0bb8a272d5833b235ea2d4433d75f4

examples/tinyds.c

index fa0a854..fb86914 100644 (file)
@@ -57,6 +57,7 @@ struct tinyds_keyboard
     struct wl_listener destroy;
     struct wl_listener key;
     struct wl_listener modifiers;
+    struct wl_listener focused_view_destroy;
 };
 
 struct tinyds_touch
@@ -127,6 +128,10 @@ struct tinyds_view
     struct wl_listener surface_commit;
     struct wl_list link; // tinyds_server::views
 
+    struct {
+        struct wl_signal destroy;
+    } events;
+
     int x, y;
     bool mapped;
     bool placed;
@@ -180,6 +185,8 @@ static void keyboard_handle_device_destroy(struct wl_listener *listener,
 static void keyboard_handle_key(struct wl_listener *listener, void *data);
 static void keyboard_handle_modifiers(struct wl_listener *listener,
         void *data);
+static void keyboard_handle_focused_view_destroy(struct wl_listener *listener,
+        void *data);
 static void touch_handle_device_destroy(struct wl_listener *listener,
         void *data);
 static void touch_handle_down(struct wl_listener *listener, void *data);
@@ -608,6 +615,8 @@ server_add_view(struct tinyds_server *server, struct ds_xdg_surface *xdg_surface
     view->server = server;
     view->xdg_surface = xdg_surface;
 
+    wl_signal_init(&view->events.destroy);
+
     view->xdg_surface_map.notify = view_handle_xdg_surface_map;
     ds_xdg_surface_add_map_listener(xdg_surface,
             &view->xdg_surface_map);
@@ -691,6 +700,9 @@ server_focus_view(struct tinyds_server *server, struct tinyds_view *view)
 
     if (keyboard->focused_view) {
         ds_seat_keyboard_notify_clear_focus(server->seat);
+        ds_xdg_toplevel_set_activated(keyboard->focused_view->xdg_surface,
+                false);
+        wl_list_remove(&keyboard->focused_view_destroy.link);
         keyboard->focused_view = NULL;
     }
 
@@ -701,6 +713,12 @@ server_focus_view(struct tinyds_server *server, struct tinyds_view *view)
         ds_seat_keyboard_notify_enter(server->seat,
                 ds_xdg_surface_get_surface(view->xdg_surface),
                 NULL, 0, NULL);
+        ds_xdg_toplevel_set_activated(view->xdg_surface, true);
+
+        keyboard->focused_view_destroy.notify =
+            keyboard_handle_focused_view_destroy;
+        wl_signal_add(&view->events.destroy, &keyboard->focused_view_destroy);
+
         keyboard->focused_view = view;
     }
 }
@@ -918,6 +936,16 @@ keyboard_handle_modifiers(struct wl_listener *listener, void *data)
 }
 
 static void
+keyboard_handle_focused_view_destroy(struct wl_listener *listener, void *data)
+{
+    struct tinyds_keyboard *kbd;
+
+    kbd = wl_container_of(listener, kbd, focused_view_destroy);
+    wl_list_remove(&kbd->focused_view_destroy.link);
+    kbd->focused_view = NULL;
+}
+
+static void
 touch_handle_device_destroy(struct wl_listener *listener, void *data)
 {
     struct tinyds_touch *touch;
@@ -1067,6 +1095,8 @@ view_destroy(struct tinyds_view *view)
 {
     ds_inf("View(%p) destroyed", view);
 
+    wl_signal_emit(&view->events.destroy, view);
+
     wl_list_remove(&view->xdg_surface_destroy.link);
     wl_list_remove(&view->xdg_surface_map.link);
     wl_list_remove(&view->xdg_surface_unmap.link);