From 5e1f91c9d1f93c5d348caa1bcc4a5b9cc21c8f7b Mon Sep 17 00:00:00 2001 From: Consolatis <35009135+Consolatis@users.noreply.github.com> Date: Mon, 12 Aug 2024 20:19:45 +0200 Subject: [PATCH] view: add state change signals --- include/view.h | 12 ++++++++++++ src/view.c | 27 +++++++++++++++++++++++++++ src/xdg.c | 1 + src/xwayland.c | 1 + 4 files changed, 41 insertions(+) diff --git a/include/view.h b/include/view.h index 6fc870e7..a1c00fef 100644 --- a/include/view.h +++ b/include/view.h @@ -286,6 +286,16 @@ struct view { struct wl_listener request_maximize; struct wl_listener request_fullscreen; struct wl_listener set_title; + + struct { + struct wl_signal new_app_id; + struct wl_signal new_title; + struct wl_signal new_outputs; + struct wl_signal maximized; + struct wl_signal minimized; + struct wl_signal fullscreened; + struct wl_signal activated; /* bool *activated */ + } events; }; struct view_query { @@ -580,6 +590,8 @@ void view_adjust_size(struct view *view, int *w, int *h); void view_evacuate_region(struct view *view); void view_on_output_destroy(struct view *view); void view_connect_map(struct view *view, struct wlr_surface *surface); + +void view_init(struct view *view); void view_destroy(struct view *view); enum view_axis view_axis_parse(const char *direction); diff --git a/src/view.c b/src/view.c index 40299fd2..84c34c09 100644 --- a/src/view.c +++ b/src/view.c @@ -474,6 +474,8 @@ view_set_activated(struct view *view, bool activated) view->toplevel.handle, activated); } + wl_signal_emit_mutable(&view->events.activated, &activated); + if (rc.kb_layout_per_window) { if (!activated) { /* Store configured keyboard layout per view */ @@ -530,6 +532,7 @@ view_update_outputs(struct view *view) if (view->toplevel.handle) { foreign_toplevel_update_outputs(view); } + wl_signal_emit_mutable(&view->events.new_outputs, NULL); desktop_update_top_layer_visiblity(view->server); } } @@ -742,7 +745,10 @@ _minimize(struct view *view, bool minimized) if (view->impl->minimize) { view->impl->minimize(view, minimized); } + view->minimized = minimized; + wl_signal_emit_mutable(&view->events.minimized, NULL); + if (minimized) { view->impl->unmap(view, /* client_request */ false); } else { @@ -1310,7 +1316,9 @@ set_maximized(struct view *view, enum view_axis maximized) wlr_foreign_toplevel_handle_v1_set_maximized( view->toplevel.handle, (maximized == VIEW_AXIS_BOTH)); } + view->maximized = maximized; + wl_signal_emit_mutable(&view->events.maximized, NULL); /* * Ensure that follow-up actions like SnapToEdge / SnapToRegion @@ -1672,7 +1680,9 @@ set_fullscreen(struct view *view, bool fullscreen) wlr_foreign_toplevel_handle_v1_set_fullscreen( view->toplevel.handle, fullscreen); } + view->fullscreen = fullscreen; + wl_signal_emit_mutable(&view->events.fullscreened, NULL); /* Re-show decorations when no longer fullscreen */ if (!fullscreen && view->ssd_enabled) { @@ -2332,6 +2342,7 @@ view_update_title(struct view *view) } ssd_update_title(view->ssd); wlr_foreign_toplevel_handle_v1_set_title(view->toplevel.handle, title); + wl_signal_emit_mutable(&view->events.new_title, NULL); } void @@ -2348,6 +2359,8 @@ view_update_app_id(struct view *view) if (view->ssd_enabled) { ssd_update_window_icon(view->ssd); } + + wl_signal_emit_mutable(&view->events.new_app_id, NULL); } void @@ -2465,6 +2478,20 @@ view_set_shade(struct view *view, bool shaded) } } +void +view_init(struct view *view) +{ + assert(view); + + wl_signal_init(&view->events.new_app_id); + wl_signal_init(&view->events.new_title); + wl_signal_init(&view->events.new_outputs); + wl_signal_init(&view->events.maximized); + wl_signal_init(&view->events.minimized); + wl_signal_init(&view->events.fullscreened); + wl_signal_init(&view->events.activated); +} + void view_destroy(struct view *view) { diff --git a/src/xdg.c b/src/xdg.c index da0ceeef..a09d1ae4 100644 --- a/src/xdg.c +++ b/src/xdg.c @@ -976,6 +976,7 @@ xdg_toplevel_new(struct wl_listener *listener, void *data) CONNECT_SIGNAL(toplevel, xdg_toplevel_view, request_show_window_menu); CONNECT_SIGNAL(xdg_surface, xdg_toplevel_view, new_popup); + view_init(view); wl_list_insert(&server->views, &view->link); } diff --git a/src/xwayland.c b/src/xwayland.c index af3bb871..c1c5a8ad 100644 --- a/src/xwayland.c +++ b/src/xwayland.c @@ -1007,6 +1007,7 @@ xwayland_view_create(struct server *server, CONNECT_SIGNAL(xsurface, xwayland_view, set_window_type); CONNECT_SIGNAL(xsurface, xwayland_view, map_request); + view_init(view); wl_list_insert(&view->server->views, &view->link); if (xsurface->surface) {