From 0b8c6548c60afc720c84a855d5748d60a718a40b Mon Sep 17 00:00:00 2001 From: Seunghun Lee Date: Wed, 21 Jun 2023 14:08:35 +0900 Subject: [PATCH] tinyds: Activate/deactivate xdg_surfaces 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 | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/examples/tinyds.c b/examples/tinyds.c index fa0a854..fb86914 100644 --- a/examples/tinyds.c +++ b/examples/tinyds.c @@ -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); -- 2.7.4