--- a/ui/common/context.c Tue Nov 18 10:23:42 2025 +0100 +++ b/ui/common/context.c Tue Nov 18 12:55:28 2025 +0100 @@ -124,8 +124,10 @@ } static void uic_context_unbind_vars(UiContext *ctx) { + ui_onchange_events_enable(FALSE); CxMapIterator mi = cxMapIterator(ctx->vars); cx_foreach(CxMapEntry*, entry, mi) { + printf("detach %.*s\n", (int)entry->key->len, (char*)entry->key->data); UiVar *var = entry->value; // var->from && var->from_ctx && var->from_ctx != ctx uic_save_var(var); @@ -134,6 +136,7 @@ cxMapPut(var->from->from_ctx->vars, *entry->key, var->from); var->from = NULL; } + uic_unbind_var(var); } if(ctx->documents) { @@ -143,6 +146,8 @@ uic_context_unbind_vars(subctx); } } + + ui_onchange_events_enable(TRUE); } void uic_context_detach_document(UiContext *ctx, void *document) { @@ -215,7 +220,7 @@ var->from_ctx = ctx; var->bound = FALSE; - cxMempoolSetDestructor(var, (cx_destructor_func)uic_unbind_var); + cxMempoolSetDestructor(var, (cx_destructor_func)uic_unbind_var); // TODO: use another destructor that cleans the value (UiString free, UiText destroy, ...) cxMapPut(ctx->vars, name, var); @@ -336,7 +341,7 @@ } } - uic_copy_value_binding(from->type, from->value, to->value); + uic_copy_value_binding(from->type, fromvalue, tovalue); } void uic_copy_value_binding(UiVarType type, void *from, void *to) {