]> git.mdlowis.com Git - proto/labwc.git/commitdiff
view: add state change signals
authorConsolatis <35009135+Consolatis@users.noreply.github.com>
Mon, 12 Aug 2024 18:19:45 +0000 (20:19 +0200)
committerJohan Malm <johanmalm@users.noreply.github.com>
Sat, 9 Nov 2024 20:06:19 +0000 (20:06 +0000)
include/view.h
src/view.c
src/xdg.c
src/xwayland.c

index 6fc870e76f90e8e572813a200ea5c82195191fb7..a1c00fef050ef277f802f1de964c5378464a2f20 100644 (file)
@@ -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);
index 40299fd27ddc7fceff5e86c054ff0f7592642026..84c34c09cfe7738060ea2714a4a27b1407beb42e 100644 (file)
@@ -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)
 {
index da0ceeef119a1e37558ac2379509f40b0b788918..a09d1ae452ac9845fab15b895dac305a48b76d75 100644 (file)
--- 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);
 }
 
index af3bb87152eee6e541ab6af4d5fd4b6ba48da92b..c1c5a8add2aff454d230fce59ce53e36883aa679 100644 (file)
@@ -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) {