ui/server/toolkit.c

changeset 982
9102a53c5385
parent 981
1d47e71f26b6
child 985
93f07ccfd997
--- a/ui/server/toolkit.c	Mon Dec 08 18:11:54 2025 +0100
+++ b/ui/server/toolkit.c	Wed Dec 10 19:04:46 2025 +0100
@@ -37,6 +37,9 @@
 #include "../common/threadpool.h"
 #include "../common/app.h"
 
+#include <cx/hash_map.h>
+#include <cx/printf.h>
+
 static const char *ui_app_name;
 
 static UiMessageHandler *message_handler;
@@ -46,10 +49,15 @@
 
 static UiQueue *event_queue;
 
+static CxMap *srv_obj_map;
+static uint64_t srv_obj_id_counter = 0;
+
 void ui_init(const char *appname, int argc, char **argv) {
     ui_app_name = appname;
     
     message_handler = uic_simple_msg_handler(STDIN_FILENO, STDOUT_FILENO, ui_server_message_received);
+    
+    srv_obj_map = cxHashMapCreateSimple(CX_STORE_POINTERS);
 }
 
 const char* ui_appname() {
@@ -66,6 +74,8 @@
 }
 
 void ui_main(void) {
+    uic_simple_msg_handler_start(message_handler);
+    uic_application_startup(NULL);
     event_queue = ui_queue_create();
     UiServerEvent *event = NULL;
     while((event = ui_queue_get_wait(event_queue)) != NULL) {
@@ -96,3 +106,41 @@
     c->data = td;
     ui_queue_put(event_queue, c);
 }
+
+void ui_show(UiObject *obj) {
+    if(!obj->widget->sent) {
+        cxmutstr msg = obj->widget->serialize(obj->widget);
+        obj->widget->sent = TRUE;
+        uic_message_send(message_handler, msg);
+        free(msg.ptr);
+    }
+    cxmutstr msg = cx_asprintf("{\"type\":\"show\", \"obj\":\"%s\"}", obj->widget->obj->id.ptr);
+    obj->widget->visible = TRUE;
+    uic_message_send(message_handler, msg);
+    free(msg.ptr);
+}
+
+UiSrvObj* ui_create_server_object(UiContext *ctx) {
+    const CxAllocator *a = ctx->allocator;
+    UiSrvObj *obj = cxZalloc(a, sizeof(UiSrvObj));
+    
+    char id[32];
+    snprintf(id, 32, "%" PRIu64, srv_obj_id_counter++);
+    obj->id = cx_strdup_a(a, id);
+    obj->ctx = ctx;
+    
+    obj->widgets = cxHashMapCreate(a, CX_STORE_POINTERS, 64);
+    
+    return obj;
+}
+
+void ui_reg_widget(UiWidget *widget) {
+    UiSrvObj *obj = widget->obj;
+    
+    char id[32];
+    snprintf(id, 32, "%" PRIu64, obj->widget_id_counter++);
+    
+    widget->id = cx_strdup_a(widget->obj->ctx->allocator, cx_str(id));
+    cxMapPut(obj->widgets, id, widget);
+}
+

mercurial