]> git.mdlowis.com Git - proto/labwc.git/commitdiff
src/osd.c: Add preview outlines
authorConsolatis <35009135+Consolatis@users.noreply.github.com>
Mon, 4 Jul 2022 18:15:03 +0000 (20:15 +0200)
committerJohan Malm <johanmalm@users.noreply.github.com>
Sat, 20 Aug 2022 21:40:31 +0000 (22:40 +0100)
include/labwc.h
src/osd.c

index 49144e9408da6ddd6106e49ba485dc9d3685b2ce..deeaa5a9ffd31eb7c87cfec3812365b10363925d 100644 (file)
@@ -202,6 +202,8 @@ struct server {
        /* Tree for built in menu */
        struct wlr_scene_tree *menu_tree;
 
+       struct multi_rect *osd_preview_outline;
+
        /* Workspaces */
        struct wl_list workspaces;  /* struct workspace.link */
        struct workspace *workspace_current;
index 0764f4536e5c9c9e0896f7dbf2f8c4f593e0254d..f2927c29d002746459a588db6a44a9bcf2edb0e9 100644 (file)
--- a/src/osd.c
+++ b/src/osd.c
@@ -83,6 +83,32 @@ destroy_osd_nodes(struct output *output)
        }
 }
 
+static void
+osd_update_preview_outlines(struct view *view)
+{
+       /* Create / Update preview outline tree */
+       struct server *server = view->server;
+       struct multi_rect *rect = view->server->osd_preview_outline;
+       if (!rect) {
+               int line_width = server->theme->osd_border_width;
+               float *colors[] = {
+                       server->theme->osd_bg_color,
+                       server->theme->osd_label_text_color,
+                       server->theme->osd_bg_color
+               };
+               rect = multi_rect_create(&server->scene->tree, colors, line_width);
+               wlr_scene_node_place_above(&rect->tree->node, &server->menu_tree->node);
+               server->osd_preview_outline = rect;
+       }
+       /* A multi_rect consists of 3 layered rects */
+       int line_width = rect->line_width * 3;
+       struct wlr_box geo = ssd_max_extents(view);
+       multi_rect_set_size(rect,
+               geo.width + line_width * 2, geo.height + line_width * 2);
+       wlr_scene_node_set_position(&rect->tree->node,
+               geo.x - line_width, geo.y - line_width);
+}
+
 void
 osd_finish(struct server *server)
 {
@@ -91,6 +117,11 @@ osd_finish(struct server *server)
                destroy_osd_nodes(output);
                wlr_scene_node_set_enabled(&output->osd_tree->node, false);
        }
+       if (server->osd_preview_outline) {
+               /* Destroy the whole multi_rect so we can easily react to new themes */
+               wlr_scene_node_destroy(&server->osd_preview_outline->tree->node);
+               server->osd_preview_outline = NULL;
+       }
 }
 
 void
@@ -158,6 +189,7 @@ osd_update(struct server *server)
                                cairo_rectangle(cairo, OSD_BORDER_WIDTH, y,
                                        OSD_ITEM_WIDTH, OSD_ITEM_HEIGHT);
                                cairo_stroke(cairo);
+                               osd_update_preview_outlines(view);
                                break;
                        }
                        y += OSD_ITEM_HEIGHT;