struct wl_listener destroy;
struct wl_listener key;
struct wl_listener modifiers;
+ struct wl_listener focused_view_destroy;
};
struct tinyds_touch
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;
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);
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);
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;
}
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;
}
}
}
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;
{
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);