]> git.mdlowis.com Git - proto/labwc.git/commitdiff
view, xdg: notify clients when tiling windows
authorAndrew J. Hesford <ajh@sideband.org>
Mon, 22 Jan 2024 20:38:14 +0000 (15:38 -0500)
committerAndrew J. Hesford <ajh@sideband.org>
Tue, 30 Jan 2024 12:30:07 +0000 (07:30 -0500)
include/view.h
src/view.c
src/xdg.c

index 866b6928a8bf91ee309d4f51fa51d6abf42d9b7f..a568945c5639798bc2ba1ad692dfcb0ae930458a 100644 (file)
@@ -94,6 +94,7 @@ struct view_impl {
        void (*map)(struct view *view);
        void (*set_activated)(struct view *view, bool activated);
        void (*set_fullscreen)(struct view *view, bool fullscreen);
+       void (*set_tiled)(struct view *view);
        /*
         * client_request is true if the client unmapped its own
         * surface; false if we are just minimizing the view. The two
index 8a42b3041cd4a62d8673e85cdb4796b891f216c1..143798044567edb727299652e933be7cd23a2c95 100644 (file)
@@ -1051,6 +1051,10 @@ view_set_untiled(struct view *view)
        view->tiled = VIEW_EDGE_INVALID;
        view->tiled_region = NULL;
        zfree(view->tiled_region_evacuate);
+
+       if (view->impl->set_tiled) {
+               view->impl->set_tiled(view);
+       }
 }
 
 void
@@ -1771,6 +1775,11 @@ view_snap_to_edge(struct view *view, enum view_edge edge,
        view_set_untiled(view);
        view_set_output(view, output);
        view->tiled = edge;
+
+       if (view->impl->set_tiled) {
+               view->impl->set_tiled(view);
+       }
+
        view_apply_tiled_geometry(view);
 }
 
@@ -1804,6 +1813,11 @@ view_snap_to_region(struct view *view, struct region *region,
        }
        view_set_untiled(view);
        view->tiled_region = region;
+
+       if (view->impl->set_tiled) {
+               view->impl->set_tiled(view);
+       }
+
        view_apply_region_geometry(view);
 }
 
index 666264de9bfa59817ddb95b53cee627ca5491127..c338ad83b5349c6f6ee04035f5a2f3d93ea463be 100644 (file)
--- a/src/xdg.c
+++ b/src/xdg.c
@@ -423,6 +423,41 @@ xdg_toplevel_view_set_fullscreen(struct view *view, bool fullscreen)
                fullscreen);
 }
 
+static void
+xdg_toplevel_view_set_tiled(struct view *view)
+{
+       enum wlr_edges edge;
+
+       /*
+        * Edge-snapped view are considered tiled on the snapped edge and those
+        * perpendicular to it.
+        */
+       switch (view->tiled) {
+       case VIEW_EDGE_LEFT:
+               edge = WLR_EDGE_LEFT | WLR_EDGE_TOP | WLR_EDGE_BOTTOM;
+               break;
+       case VIEW_EDGE_RIGHT:
+               edge = WLR_EDGE_RIGHT | WLR_EDGE_TOP | WLR_EDGE_BOTTOM;
+               break;
+       case VIEW_EDGE_UP:
+               edge = WLR_EDGE_TOP | WLR_EDGE_LEFT | WLR_EDGE_RIGHT;
+               break;
+       case VIEW_EDGE_DOWN:
+               edge = WLR_EDGE_BOTTOM | WLR_EDGE_LEFT | WLR_EDGE_RIGHT;
+               break;
+       default:
+               edge = WLR_EDGE_NONE;
+       }
+
+       if (view->tiled_region) {
+               /* Region-snapped views are considered tiled on all edges */
+               edge = WLR_EDGE_LEFT | WLR_EDGE_RIGHT |
+                       WLR_EDGE_TOP | WLR_EDGE_BOTTOM;
+       }
+
+       wlr_xdg_toplevel_set_tiled(xdg_toplevel_from_view(view), edge);
+}
+
 static struct view *
 lookup_view_by_xdg_toplevel(struct server *server,
                struct wlr_xdg_toplevel *xdg_toplevel)
@@ -594,6 +629,7 @@ static const struct view_impl xdg_toplevel_view_impl = {
        .map = xdg_toplevel_view_map,
        .set_activated = xdg_toplevel_view_set_activated,
        .set_fullscreen = xdg_toplevel_view_set_fullscreen,
+       .set_tiled = xdg_toplevel_view_set_tiled,
        .unmap = xdg_toplevel_view_unmap,
        .maximize = xdg_toplevel_view_maximize,
        .minimize = xdg_toplevel_view_minimize,