ui/common/context.c

changeset 102
64ded9f6a6c6
parent 101
7b3a3130be44
--- a/ui/common/context.c	Mon Jan 06 22:22:55 2025 +0100
+++ b/ui/common/context.c	Tue Feb 25 21:11:00 2025 +0100
@@ -45,7 +45,7 @@
 static UiContext* global_context;
 
 void uic_init_global_context(void) {
-    CxMempool *mp = cxBasicMempoolCreate(32);
+    CxMempool *mp = cxMempoolCreateSimple(32);
     global_context = uic_context(NULL, mp);
 }
 
@@ -61,7 +61,7 @@
     ctx->obj = toplevel;
     ctx->vars = cxHashMapCreate(mp->allocator, CX_STORE_POINTERS, 16);
     
-    ctx->documents = cxLinkedListCreate(mp->allocator, cx_cmp_intptr, CX_STORE_POINTERS);
+    ctx->documents = cxLinkedListCreate(mp->allocator, cx_cmp_ptr, CX_STORE_POINTERS);
     ctx->group_widgets = cxLinkedListCreate(mp->allocator, cx_cmp_ptr, sizeof(UiGroupWidget));
     ctx->groups = cxArrayListCreate(mp->allocator, cx_cmp_int, sizeof(int), 32);
     
@@ -92,13 +92,14 @@
     ctx->document = document;
     
     UiContext *doc_ctx = ui_document_context(document);
+    doc_ctx->parent = ctx;
     
     // check if any parent context has an unbound variable with the same name
     // as any document variable
     UiContext *var_ctx = ctx;
     while(var_ctx) {
         if(var_ctx->vars_unbound &&  cxMapSize(var_ctx->vars_unbound) > 0) {
-            CxIterator i = cxMapIterator(var_ctx->vars_unbound);
+            CxMapIterator i = cxMapIterator(var_ctx->vars_unbound);
             cx_foreach(CxMapEntry*, entry, i) {
                 printf("attach %s\n", entry->key->data);
                 UiVar *var = entry->value;
@@ -111,15 +112,15 @@
             }
         }
         
-        var_ctx = ctx->parent;
+        var_ctx = var_ctx->parent;
     }
 }
 
 static void uic_context_unbind_vars(UiContext *ctx) {
-    CxIterator i = cxMapIterator(ctx->vars);
-    cx_foreach(CxMapEntry*, entry, i) {
+    CxMapIterator mi = cxMapIterator(ctx->vars);
+    cx_foreach(CxMapEntry*, entry, mi) {
         UiVar *var = entry->value;
-        if(var->from && var->from_ctx) {
+        if(var->from && var->from_ctx && var->from_ctx != ctx) {
             uic_save_var2(var);
             uic_copy_binding(var, var->from, FALSE);
             cxMapPut(var->from_ctx->vars_unbound, *entry->key, var->from);
@@ -128,7 +129,7 @@
     }
     
     if(ctx->documents) {
-        i = cxListIterator(ctx->documents);
+        CxIterator i = cxListIterator(ctx->documents);
         cx_foreach(void *, doc, i) {
             UiContext *subctx = ui_document_context(doc);
             uic_context_unbind_vars(subctx);
@@ -148,6 +149,7 @@
     
     UiContext *docctx = ui_document_context(document);
     uic_context_unbind_vars(docctx); // unbind all doc/subdoc vars from the parent
+    docctx->parent = NULL;
 }
 
 void uic_context_detach_all(UiContext *ctx) {
@@ -471,7 +473,7 @@
 
 
 void ui_set_group(UiContext *ctx, int group) {
-    if(cxListFind(ctx->groups, &group) == -1) {
+    if(!cxListIndexValid(ctx->groups, cxListFind(ctx->groups, &group))) {
         cxListAdd(ctx->groups, &group);
     }
     

mercurial