--- 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); +} + +