ui/common/object.c

changeset 431
bb7da585debc
parent 406
0ebf9d7b23e8
child 440
7c4b9cba09ca
--- a/ui/common/object.c	Sun May 23 09:44:43 2021 +0200
+++ b/ui/common/object.c	Sat Jan 04 16:38:48 2025 +0100
@@ -32,6 +32,8 @@
 #include "object.h"
 #include "context.h"
 
+#include "../ui/container.h"
+
 void ui_end(UiObject *obj) {
     if(!obj->next) {
         return;
@@ -49,11 +51,51 @@
     }
 }
 
+void ui_end_new(UiObject *obj) {
+    if(!obj->container_end) {
+        return;
+    }
+    UiContainerX *rm = obj->container_end;
+    uic_object_pop_container(obj);
+    ui_free(obj->ctx, rm);
+}
+
+void ui_object_ref(UiObject *obj) {
+    obj->ref++;
+}
+
+int ui_object_unref(UiObject *obj) {
+    // it is possible to have 0 references, in case
+    // a window was created but ui_show was never called
+    if(obj->ref == 0 || --obj->ref == 0) {
+        if(obj->destroy) {
+            obj->destroy(obj);
+        }
+        uic_object_destroy(obj);
+        return 0;
+    }
+    return 1;
+}
+
+void uic_object_destroy(UiObject *obj) {
+    if(obj->ctx->close_callback) {
+        UiEvent ev;
+        ev.window = obj->window;
+        ev.document = obj->ctx->document;
+        ev.obj = obj;
+        ev.eventdata = NULL;
+        ev.intval = 0;
+        obj->ctx->close_callback(&ev, obj->ctx->close_data);
+    }
+    cxMempoolDestroy(obj->ctx->mp);
+}
 
 UiObject* uic_object_new(UiObject *toplevel, UIWIDGET widget) {
-    UiContext *ctx = toplevel->ctx;
-    
-    UiObject *newobj = ucx_mempool_calloc(ctx->mempool, 1, sizeof(UiObject));
+    return uic_ctx_object_new(toplevel->ctx, widget);
+}
+
+UiObject* uic_ctx_object_new(UiContext *ctx, UIWIDGET widget) {
+    UiObject *newobj = cxCalloc(ctx->allocator, 1, sizeof(UiObject));
     newobj->ctx = ctx;
     newobj->widget = widget;
     
@@ -79,3 +121,23 @@
 UiContainer* uic_get_current_container(UiObject *obj) {
     return uic_current_obj(obj)->container;
 }
+
+void uic_object_push_container(UiObject *toplevel, UiContainerX *newcontainer) {
+    newcontainer->prev = toplevel->container_end;
+    if(toplevel->container_end) {
+        toplevel->container_end->next = newcontainer;
+        toplevel->container_end = newcontainer;
+    } else {
+        toplevel->container_begin = newcontainer;
+        toplevel->container_end = newcontainer;
+    }
+}
+
+void uic_object_pop_container(UiObject *toplevel) {
+    toplevel->container_end = toplevel->container_end->prev;
+    if(toplevel->container_end) {
+        toplevel->container_end->next = NULL;
+    } else {
+        toplevel->container_begin = NULL;
+    }
+}

mercurial