diff -r b9767cb5b06b -r d2bd73d28ff1 ui/common/object.c --- a/ui/common/object.c Fri Nov 29 22:21:36 2024 +0100 +++ b/ui/common/object.c Thu Dec 12 20:01:43 2024 +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,20 +51,30 @@ } } +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++; } -void ui_object_unref(UiObject *obj) { +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); - } else { - uic_object_destroy(obj); } + uic_object_destroy(obj); + return 0; } + return 1; } void uic_object_destroy(UiObject *obj) { @@ -109,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; + } +}