add reference counting to the menu builder

Sat, 18 Oct 2025 09:43:05 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sat, 18 Oct 2025 09:43:05 +0200
changeset 860
7f2287ae2b78
parent 859
c13653b1cc9d
child 861
34b07b18b3e1

add reference counting to the menu builder

application/main.c file | annotate | diff | comparison | revisions
ui/common/menu.c file | annotate | diff | comparison | revisions
ui/common/menu.h file | annotate | diff | comparison | revisions
ui/gtk/list.c file | annotate | diff | comparison | revisions
ui/ui/menu.h file | annotate | diff | comparison | revisions
--- a/application/main.c	Sat Oct 18 09:33:39 2025 +0200
+++ b/application/main.c	Sat Oct 18 09:43:05 2025 +0200
@@ -500,6 +500,7 @@
 }
 
 void sourcelist_getvalue(UiList *list, void *sublistdata, void *rowdata, int index, UiSubListItem *item, void *userdata) {
+    ui_menubuilder_ref(sourcelist_menu);
     item->label = strdup(rowdata);
     item->button_icon = strdup("view-more-horizontal");
     item->button_menu = sourcelist_menu;
--- a/ui/common/menu.c	Sat Oct 18 09:33:39 2025 +0200
+++ b/ui/common/menu.c	Sat Oct 18 09:43:05 2025 +0200
@@ -255,6 +255,7 @@
     builder->menus_begin = NULL;
     builder->menus_end = NULL;
     builder->current = cxLinkedListCreate(cxDefaultAllocator, NULL, CX_STORE_POINTERS);
+    builder->ref = 1;
     current_builder = builder;
     *out_builder = builder;
     
@@ -324,3 +325,13 @@
     cxListFree(builder->current);
     free(builder);
 }
+
+void ui_menubuilder_ref(UiMenuBuilder *builder) {
+    builder->ref++;
+}
+
+void ui_menubuilder_unref(UiMenuBuilder *builder) {
+    if(--builder->ref <= 0) {
+        ui_menubuilder_free(builder);
+    }
+}
--- a/ui/common/menu.h	Sat Oct 18 09:33:39 2025 +0200
+++ b/ui/common/menu.h	Sat Oct 18 09:43:05 2025 +0200
@@ -120,6 +120,7 @@
     UiMenu *menus_begin;
     UiMenu *menus_end;
     CxList *current;
+    int ref;
 };
 
 void uic_menu_init(void);
--- a/ui/gtk/list.c	Sat Oct 18 09:33:39 2025 +0200
+++ b/ui/gtk/list.c	Sat Oct 18 09:43:05 2025 +0200
@@ -2420,6 +2420,7 @@
             UIMENU menu = ui_contextmenu_create(item->button_menu, listbox->obj, button);
             event->customdata3 = menu;
             g_signal_connect(menu, "closed", G_CALLBACK(button_popover_closed), button);
+            ui_menubuilder_unref(item->button_menu);
         }
     }
 }
--- a/ui/ui/menu.h	Sat Oct 18 09:33:39 2025 +0200
+++ b/ui/ui/menu.h	Sat Oct 18 09:43:05 2025 +0200
@@ -94,7 +94,8 @@
 #define ui_contextmenu(builder) for(ui_contextmenu_builder(builder);ui_menu_is_open();ui_menu_close())
 
 UIEXPORT void ui_contextmenu_builder(UiMenuBuilder **out_builder);
-UIEXPORT void ui_menubuilder_free(UiMenuBuilder *builder);
+UIEXPORT void ui_menubuilder_ref(UiMenuBuilder *builder);
+UIEXPORT void ui_menubuilder_unref(UiMenuBuilder *builder);
 UIEXPORT UIMENU ui_contextmenu_create(UiMenuBuilder *builder, UiObject *obj, UIWIDGET widget);
 UIEXPORT void ui_contextmenu_popup(UIMENU menu, UIWIDGET widget, int x, int y);
 

mercurial