ui/server/window.c

changeset 982
9102a53c5385
parent 981
1d47e71f26b6
child 984
2cf5e6d55013
--- a/ui/server/window.c	Mon Dec 08 18:11:54 2025 +0100
+++ b/ui/server/window.c	Wed Dec 10 19:04:46 2025 +0100
@@ -28,3 +28,76 @@
 
 #include "window.h"
 
+#include "../common/object.h"
+
+#include <cx/buffer.h>
+
+static UiObject* create_window(const char *title, UiBool simple, UiBool sidebar, UiBool splitview) {
+    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.children = cxLinkedListCreate(a, NULL, CX_STORE_POINTERS);
+    window->widget.serialize = (ui_serialize_func)ui_window_serialize;
+    window->title = cx_strdup_a(a, title);
+    
+    obj->widget = (UiWidget*)window;
+    ui_reg_widget(obj->widget);
+    
+    return obj;
+}
+
+UiObject *ui_window(const char *title, void *window_data) {
+    return create_window(title, FALSE, FALSE, FALSE);
+}
+
+UiObject *ui_sidebar_window(const char *title, void *window_data) {
+    return create_window(title, FALSE, TRUE, FALSE);
+}
+
+UiObject *ui_splitview_window(const char *title, UiBool sidebar) {
+    return create_window(title, FALSE, sidebar, TRUE);
+}
+
+UiObject *ui_simple_window(const char *title, void *window_data) {
+    return create_window(title, TRUE, FALSE, FALSE);
+}
+
+
+cxmutstr ui_window_serialize(UiWindow *w) {
+    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_id=\"");
+    cxBufferWrite(obj_id.ptr, 1, obj_id.length, &buf);
+    cxBufferPutString(&buf, "\"");
+    
+    cxBufferPutString(&buf, " id=\"");
+    cxBufferWrite(id.ptr, 1, id.length, &buf);
+    cxBufferPutString(&buf, "\"");
+    
+    if(w->title.ptr) {
+        cxBufferPutString(&buf, " title=\"");
+        cxBufferWrite(w->title.ptr, 1, w->title.length, &buf);
+        cxBufferPutString(&buf, "\"");
+    }
+    
+    
+    cxBufferPutString(&buf, "}\n");
+    
+    return cx_mutstrn(buf.space, buf.size);
+}
+
+

mercurial