move some common serialization code to functions (Server)

Fri, 12 Dec 2025 12:00:34 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Fri, 12 Dec 2025 12:00:34 +0100
changeset 991
ab3125bd8b5f
parent 990
38a48b756d80
child 992
f421aef8f865

move some common serialization code to functions (Server)

ui/server/button.c file | annotate | diff | comparison | revisions
ui/server/container.c file | annotate | diff | comparison | revisions
ui/server/toolkit.h file | annotate | diff | comparison | revisions
ui/server/widget.c file | annotate | diff | comparison | revisions
ui/server/widget.h file | annotate | diff | comparison | revisions
ui/server/window.c file | annotate | diff | comparison | revisions
ui/server/window.h file | annotate | diff | comparison | revisions
--- a/ui/server/button.c	Fri Dec 12 11:38:47 2025 +0100
+++ b/ui/server/button.c	Fri Dec 12 12:00:34 2025 +0100
@@ -32,6 +32,7 @@
 
 #include "args.h"
 #include "container.h"
+#include "widget.h"
 
 cxmutstr ui_button_args_to_string(UiContext *ctx, UiButtonArgs *args) {
     CxBuffer buf;
@@ -58,6 +59,7 @@
 UIWIDGET ui_button_create(UiObject *obj, UiButtonArgs *args) {
     UiCallbackWidget *widget = cxZalloc(obj->ctx->allocator, sizeof(UiCallbackWidget));
     widget->widget.obj = obj->widget->obj;
+    widget->widget.type = CX_STR("button");
     widget->widget.args = ui_button_args_to_string(obj->ctx, args);
     widget->widget.serialize = (ui_serialize_func)ui_button_serialize;
     widget->callback = args->onclick;
@@ -74,11 +76,9 @@
     CxBuffer buf;
     cxBufferInit(&buf, NULL, 1024, NULL, CX_BUFFER_AUTO_EXTEND | CX_BUFFER_FREE_CONTENTS);
     
-    cxBufferPutString(&buf, "{\"type\":\"button\", \"obj\":\"");
-    cxBufferPutString(&buf, w->widget.obj->id.ptr);
-    cxBufferPutString(&buf, "\", \"id\":\"");
-    cxBufferPutString(&buf, w->widget.id.ptr);
-    cxBufferPutString(&buf, "\", \"args\":");
+    cxBufferPutString(&buf, "{");
+    ui_serialize_type_obj_id(&w->widget, &buf);
+    cxBufferPutString(&buf, ",\"args\":");
     cxBufferPutString(&buf, w->widget.args.ptr);
     cxBufferPutString(&buf, "}\n");
     
--- a/ui/server/container.c	Fri Dec 12 11:38:47 2025 +0100
+++ b/ui/server/container.c	Fri Dec 12 12:00:34 2025 +0100
@@ -30,6 +30,7 @@
 #include <cx/buffer.h>
 
 #include "container.h"
+#include "widget.h"
 #include "args.h"
 
 void ui_container_begin_close(UiObject *obj) {
@@ -80,12 +81,13 @@
     widget->args = ui_container_args_to_string(obj->ctx, args);
     widget->children = cxLinkedListCreate(a, NULL, CX_STORE_POINTERS);
     widget->serialize = ui_container_serialize;
-    uic_object_push_container(obj, ui_widget_container(widget));
-    ui_reg_widget((UiWidget*)widget);
     
     UiWidget *parent = obj->container_end->container;
     cxListAdd(parent->children, widget); 
     
+    uic_object_push_container(obj, ui_widget_container(widget));
+    ui_reg_widget((UiWidget*)widget);
+    
     return widget;
 }
 
@@ -109,15 +111,10 @@
     CxBuffer buf;
     cxBufferInit(&buf, NULL, 1024, NULL, CX_BUFFER_AUTO_EXTEND | CX_BUFFER_FREE_CONTENTS);
     
-    cxBufferPutString(&buf, "{\"type\":\"");
-    cxBufferPutString(&buf, w->type.ptr);
-    cxBufferPutString(&buf, "\",\"args\":\"");
+    cxBufferPutString(&buf, "{");
+    ui_serialize_type_obj_id(w, &buf);
+    cxBufferPutString(&buf, ",\"args\":");
     cxBufferPutString(&buf, w->args.ptr);
-    cxBufferPutString(&buf, "\",\"obj\":");
-    cxBufferPutString(&buf, w->obj->id.ptr);
-    cxBufferPutString(&buf, "\",\"id\":");
-    cxBufferPutString(&buf, w->id.ptr);
-    cxBufferPutString(&buf, "\"");
     
     ui_serialize_children(w, &buf);
     
--- a/ui/server/toolkit.h	Fri Dec 12 11:38:47 2025 +0100
+++ b/ui/server/toolkit.h	Fri Dec 12 12:00:34 2025 +0100
@@ -86,7 +86,6 @@
 
 typedef struct UiCallbackWidget {
     UiWidget widget;
-    cxstring type;
     ui_callback callback;
     void *userdata;
 } UiCallbackWidget; 
--- a/ui/server/widget.c	Fri Dec 12 11:38:47 2025 +0100
+++ b/ui/server/widget.c	Fri Dec 12 12:00:34 2025 +0100
@@ -26,7 +26,20 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include <stdio.h>
+
 #include "widget.h"
+#include "toolkit.h"
+
+void ui_serialize_type_obj_id(UiWidget *w, CxBuffer *buf) {
+    cxBufferPutString(buf, "\"type\":\"");
+    cxBufferPutString(buf, w->type.ptr);
+    cxBufferPutString(buf, "\",\"obj\":\"");
+    cxBufferPutString(buf, w->obj->id.ptr);
+    cxBufferPutString(buf, "\",\"id\":\"");
+    cxBufferPutString(buf, w->id.ptr);
+    cxBufferPutString(buf, "\"");
+}
 
 
 void ui_set_enabled(UIWIDGET widget, int enabled) {
--- a/ui/server/widget.h	Fri Dec 12 11:38:47 2025 +0100
+++ b/ui/server/widget.h	Fri Dec 12 12:00:34 2025 +0100
@@ -31,11 +31,13 @@
 
 #include "../ui/widget.h"
 
+#include <cx/buffer.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-
+void ui_serialize_type_obj_id(UiWidget *w, CxBuffer *buf);
 
 
 #ifdef __cplusplus
--- a/ui/server/window.c	Fri Dec 12 11:38:47 2025 +0100
+++ b/ui/server/window.c	Fri Dec 12 12:00:34 2025 +0100
@@ -28,17 +28,19 @@
 
 #include "window.h"
 #include "container.h"
+#include "widget.h"
 
 #include "../common/object.h"
 
 #include <cx/buffer.h>
 
-static UiObject* create_window(const char *title, UiBool simple, UiBool sidebar, UiBool splitview) {
+static UiObject* create_window(const char *title, const char *type, UiBool sidebar) {
     UiObject *obj = uic_object_new_toplevel();
     const CxAllocator *a = obj->ctx->allocator;
     
     UiWindow *window = cxZalloc(a, sizeof(UiWindow));
     window->widget.obj = ui_create_server_object(obj->ctx);
+    window->widget.type = cx_str(type);
     window->widget.children = cxLinkedListCreate(a, NULL, CX_STORE_POINTERS);
     window->widget.serialize = (ui_serialize_func)ui_window_serialize;
     window->widget.invisible = TRUE;
@@ -52,19 +54,19 @@
 }
 
 UiObject *ui_window(const char *title) {
-    return create_window(title, FALSE, FALSE, FALSE);
+    return create_window(title, "window", FALSE);
 }
 
 UiObject *ui_sidebar_window(const char *title) {
-    return create_window(title, FALSE, TRUE, FALSE);
+    return create_window(title, "sidebar_window", FALSE);
 }
 
 UiObject *ui_splitview_window(const char *title, UiBool sidebar) {
-    return create_window(title, FALSE, sidebar, TRUE);
+    return create_window(title, "splitview_window", sidebar);
 }
 
 UiObject *ui_simple_window(const char *title) {
-    return create_window(title, TRUE, FALSE, FALSE);
+    return create_window(title, "simple_window", FALSE);
 }
 
 
@@ -72,27 +74,11 @@
     CxBuffer buf;
     cxBufferInit(&buf, NULL, 1024, NULL, CX_BUFFER_AUTO_EXTEND | CX_BUFFER_FREE_CONTENTS);
     
-    cxBufferPutString(&buf, "{\"type\":");
-    switch(w->type) {
-        case UI_WINDOW_MAIN: cxBufferPutString(&buf, "\"window\""); break;
-        case UI_WINDOW_SIMPLE: cxBufferPutString(&buf, "\"simple_window\""); break;
-        case UI_WINDOW_SIDEBAR: cxBufferPutString(&buf, "\"sidebar_window\""); break;
-        case UI_WINDOW_SPLITVIEW: cxBufferPutString(&buf, "\"splitview_window\""); break;
-    }
-    
-    cxmutstr obj_id = w->widget.obj->id;
-    cxmutstr id = w->widget.id;
-    
-    cxBufferPutString(&buf, ", \"obj\":\"");
-    cxBufferWrite(obj_id.ptr, 1, obj_id.length, &buf);
-    cxBufferPutString(&buf, "\",");
-    
-    cxBufferPutString(&buf, " \"id\":\"");
-    cxBufferWrite(id.ptr, 1, id.length, &buf);
-    cxBufferPutString(&buf, "\", ");
+    cxBufferPutString(&buf, "{");
+    ui_serialize_type_obj_id(&w->widget, &buf);
     
     if(w->title.ptr) {
-        cxBufferPutString(&buf, " \"title\":\"");
+        cxBufferPutString(&buf, ",\"title\":\"");
         cxBufferWrite(w->title.ptr, 1, w->title.length, &buf);
         cxBufferPutString(&buf, "\"");
     }
--- a/ui/server/window.h	Fri Dec 12 11:38:47 2025 +0100
+++ b/ui/server/window.h	Fri Dec 12 12:00:34 2025 +0100
@@ -36,17 +36,9 @@
 extern "C" {
 #endif
 
-enum UiWindowType {
-    UI_WINDOW_MAIN = 0,
-    UI_WINDOW_SIMPLE,
-    UI_WINDOW_SIDEBAR,
-    UI_WINDOW_SPLITVIEW
-};
-typedef enum UiWindowType UiWindowType;
 
 typedef struct UiWindow {
     UiWidget widget;
-    UiWindowType type;
     cxmutstr title;
 } UiWindow;
 

mercurial