]> git.mdlowis.com Git - proto/labwc.git/commitdiff
Convert menu entries to scaled font buffer
authorConsolatis <35009135+Consolatis@users.noreply.github.com>
Sun, 12 Jun 2022 19:22:01 +0000 (21:22 +0200)
committerJohan Malm <johanmalm@users.noreply.github.com>
Tue, 14 Jun 2022 21:03:08 +0000 (22:03 +0100)
include/menu/menu.h
src/menu/menu.c

index 75252d80df4f740465aeb170bdaf21f5004cfa51..da1e2166e96fe2456d0c94436e09beb122c2e295 100644 (file)
@@ -8,9 +8,9 @@
 struct view;
 struct server;
 struct wl_list;
-struct lab_data_buffer;
 struct wlr_scene_tree;
 struct wlr_scene_node;
+struct scaled_font_buffer;
 
 enum menu_align {
        LAB_MENU_OPEN_AUTO   = 0,
@@ -22,9 +22,9 @@ enum menu_align {
 
 struct menu_scene {
        struct wlr_scene_tree *tree;
-       struct lab_data_buffer *buffer;
        struct wlr_scene_node *text;
        struct wlr_scene_node *background;
+       struct scaled_font_buffer *buffer;
 };
 
 struct menuitem {
index 67fac9755e9f7f27301372edc00938fe11cb81d7..403cfe7c6939e22f6ea0011c0be05c353e3f0e34 100644 (file)
@@ -8,10 +8,12 @@
 #include <stdlib.h>
 #include <string.h>
 #include <strings.h>
+#include <wayland-server-core.h>
 #include <wlr/util/log.h>
 #include "common/buf.h"
 #include "common/font.h"
 #include "common/nodename.h"
+#include "common/scaled_font_buffer.h"
 #include "common/string-helpers.h"
 #include "common/zfree.h"
 #include "labwc.h"
@@ -97,25 +99,6 @@ item_create(struct menu *menu, const char *text)
        int x, y;
        int item_max_width = MENUWIDTH - 2 * MENU_ITEM_PADDING_X;
 
-       /* Font buffer */
-       font_buffer_create(&menuitem->normal.buffer, item_max_width,
-               text, &font, theme->menu_items_text_color, 1);
-       font_buffer_create(&menuitem->selected.buffer, item_max_width,
-               text, &font, theme->menu_items_active_text_color, 1);
-       if (!menuitem->normal.buffer || !menuitem->selected.buffer) {
-               wlr_log(WLR_ERROR, "Failed to create menu item '%s'", text);
-               if (menuitem->normal.buffer) {
-                       wlr_buffer_drop(&menuitem->normal.buffer->base);
-                       menuitem->normal.buffer = NULL;
-               }
-               if (menuitem->selected.buffer) {
-                       wlr_buffer_drop(&menuitem->selected.buffer->base);
-                       menuitem->selected.buffer = NULL;
-               }
-               free(menuitem);
-               return NULL;
-       }
-
        /* Menu item root node */
        menuitem->tree = wlr_scene_tree_create(menu->scene_tree);
        node_descriptor_create(&menuitem->tree->node,
@@ -136,15 +119,32 @@ item_create(struct menu *menu, const char *text)
                theme->menu_items_active_bg_color)->node;
 
        /* Font nodes */
-       menuitem->normal.text = &wlr_scene_buffer_create(
-               menuitem->normal.tree, &menuitem->normal.buffer->base)->node;
-       menuitem->selected.text = &wlr_scene_buffer_create(
-               menuitem->selected.tree, &menuitem->selected.buffer->base)->node;
+       menuitem->normal.buffer = scaled_font_buffer_create(menuitem->normal.tree);
+       menuitem->selected.buffer = scaled_font_buffer_create(menuitem->selected.tree);
+       if (!menuitem->normal.buffer || !menuitem->selected.buffer) {
+               wlr_log(WLR_ERROR, "Failed to create menu item '%s'", text);
+               /**
+                * Destroying the root node will destroy everything,
+                * including the node descriptor and scaled_font_buffers.
+                */
+               wlr_scene_node_destroy(&menuitem->tree->node);
+               free(menuitem);
+               return NULL;
+       }
+       menuitem->normal.text = &menuitem->normal.buffer->scene_buffer->node;
+       menuitem->selected.text = &menuitem->selected.buffer->scene_buffer->node;
+
+       /* Font buffers */
+       scaled_font_buffer_update(menuitem->normal.buffer, text, item_max_width,
+               &font, theme->menu_items_text_color);
+       scaled_font_buffer_update(menuitem->selected.buffer, text, item_max_width,
+               &font, theme->menu_items_active_text_color);
 
        /* Center font nodes */
-       y = (menu->item_height - menuitem->normal.buffer->base.height) / 2;
        x = MENU_ITEM_PADDING_X;
+       y = (menu->item_height - menuitem->normal.buffer->height) / 2;
        wlr_scene_node_set_position(menuitem->normal.text, x, y);
+       y = (menu->item_height - menuitem->selected.buffer->height) / 2;
        wlr_scene_node_set_position(menuitem->selected.text, x, y);
 
        /* Position the item in relation to its menu */
@@ -502,18 +502,12 @@ menu_finish(void)
                wl_list_for_each_safe(item, next, &menu->menuitems, link) {
                        wl_list_remove(&item->link);
                        action_list_free(&item->actions);
-                       /* TODO: just destroy menu->tree and let scene-graph do the rest */
-                       wlr_scene_node_destroy(item->normal.text);
-                       wlr_scene_node_destroy(item->selected.text);
-                       wlr_scene_node_destroy(item->normal.background);
-                       wlr_scene_node_destroy(item->selected.background);
-                       wlr_scene_node_destroy(&item->normal.tree->node);
-                       wlr_scene_node_destroy(&item->selected.tree->node);
-                       wlr_scene_node_destroy(&item->tree->node);
-                       wlr_buffer_drop(&item->normal.buffer->base);
-                       wlr_buffer_drop(&item->selected.buffer->base);
                        free(item);
                }
+               /**
+                * Destroying the root node will destroy everything,
+                * including node descriptors and scaled_font_buffers.
+                */
                wlr_scene_node_destroy(&menu->scene_tree->node);
        }
        zfree(menus);