--- a/client/uiclient.c Wed Dec 03 18:45:05 2025 +0100 +++ b/client/uiclient.c Thu Dec 04 19:04:08 2025 +0100 @@ -50,6 +50,7 @@ cxMapPut(msg_types, "grid", msg_vbox); cxMapPut(msg_types, "end", msg_end); cxMapPut(msg_types, "button", msg_button); + cxMapPut(msg_types, "toggle", msg_togglebutton); objects = cxHashMapCreateSimple(CX_STORE_POINTERS); } @@ -252,3 +253,47 @@ return 0; } + +int msg_togglebutton(UiObject *parent, const CxJsonValue *value) { + CxJsonValue *args_value = cxJsonObjGet(value, "args"); + cxmutstr id = jsonobj_getstring(value, "id"); + if(!id.ptr) { + return 1; + } + UiObject *obj = get_msg_obj(parent, value); + if(!obj) { + return 1; + } + + CxJsonValue *button_type = cxJsonObjGet(value, "button_type"); + if(!button_type || button_type->type != CX_JSON_INTEGER) { + return 1; + } + + CxJsonValue *val = cxJsonObjGet(value, "value"); + UiInteger *i = NULL; + if(val && val->type == CX_JSON_STRING) { + i = ui_int_new(obj->ctx, val->value.string.ptr); + } + + UiToggleArgs *args = json2toggle_args(args_value); + UIWIDGET w; + switch(button_type->value.integer) { + default: { + w = ui_togglebutton_create(obj, args); + break; + } + case 1: { + w = ui_checkbox_create(obj, args); + break; + } + case 2: { + w = ui_switch_create(obj, args); + break; + } + } + ui_toggle_args_free(args); + client_reg_widget(obj, id, w); + + return 0; +}