--- 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); }