ui/server/window.c

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
permissions
-rw-r--r--

move some common serialization code to functions (Server)

981
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 * Copyright 2025 Olaf Wintermann. All rights reserved.
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 #include "window.h"
985
93f07ccfd997 add button (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 984
diff changeset
30 #include "container.h"
991
ab3125bd8b5f move some common serialization code to functions (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 990
diff changeset
31 #include "widget.h"
981
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
32
982
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
33 #include "../common/object.h"
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
34
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
35 #include <cx/buffer.h>
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
36
991
ab3125bd8b5f move some common serialization code to functions (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 990
diff changeset
37 static UiObject* create_window(const char *title, const char *type, UiBool sidebar) {
982
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
38 UiObject *obj = uic_object_new_toplevel();
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
39 const CxAllocator *a = obj->ctx->allocator;
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
40
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
41 UiWindow *window = cxZalloc(a, sizeof(UiWindow));
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
42 window->widget.obj = ui_create_server_object(obj->ctx);
991
ab3125bd8b5f move some common serialization code to functions (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 990
diff changeset
43 window->widget.type = cx_str(type);
982
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
44 window->widget.children = cxLinkedListCreate(a, NULL, CX_STORE_POINTERS);
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
45 window->widget.serialize = (ui_serialize_func)ui_window_serialize;
985
93f07ccfd997 add button (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 984
diff changeset
46 window->widget.invisible = TRUE;
982
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
47 window->title = cx_strdup_a(a, title);
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
48
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
49 obj->widget = (UiWidget*)window;
985
93f07ccfd997 add button (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 984
diff changeset
50 uic_object_push_container(obj, ui_widget_container((UiWidget*)window));
982
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
51 ui_reg_widget(obj->widget);
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
52
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
53 return obj;
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
54 }
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
55
986
6f7600c2b9e1 remove window data arg
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 985
diff changeset
56 UiObject *ui_window(const char *title) {
991
ab3125bd8b5f move some common serialization code to functions (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 990
diff changeset
57 return create_window(title, "window", FALSE);
982
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
58 }
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
59
986
6f7600c2b9e1 remove window data arg
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 985
diff changeset
60 UiObject *ui_sidebar_window(const char *title) {
991
ab3125bd8b5f move some common serialization code to functions (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 990
diff changeset
61 return create_window(title, "sidebar_window", FALSE);
982
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
62 }
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
63
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
64 UiObject *ui_splitview_window(const char *title, UiBool sidebar) {
991
ab3125bd8b5f move some common serialization code to functions (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 990
diff changeset
65 return create_window(title, "splitview_window", sidebar);
982
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
66 }
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
67
986
6f7600c2b9e1 remove window data arg
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 985
diff changeset
68 UiObject *ui_simple_window(const char *title) {
991
ab3125bd8b5f move some common serialization code to functions (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 990
diff changeset
69 return create_window(title, "simple_window", FALSE);
982
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
70 }
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
71
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
72
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
73 cxmutstr ui_window_serialize(UiWindow *w) {
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
74 CxBuffer buf;
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
75 cxBufferInit(&buf, NULL, 1024, NULL, CX_BUFFER_AUTO_EXTEND | CX_BUFFER_FREE_CONTENTS);
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
76
991
ab3125bd8b5f move some common serialization code to functions (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 990
diff changeset
77 cxBufferPutString(&buf, "{");
ab3125bd8b5f move some common serialization code to functions (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 990
diff changeset
78 ui_serialize_type_obj_id(&w->widget, &buf);
982
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
79
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
80 if(w->title.ptr) {
991
ab3125bd8b5f move some common serialization code to functions (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 990
diff changeset
81 cxBufferPutString(&buf, ",\"title\":\"");
982
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
82 cxBufferWrite(w->title.ptr, 1, w->title.length, &buf);
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
83 cxBufferPutString(&buf, "\"");
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
84 }
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
85
990
38a48b756d80 add box/grid containers (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 986
diff changeset
86 ui_serialize_children(&w->widget, &buf);
982
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
87
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
88 cxBufferPutString(&buf, "}\n");
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
89
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
90 return cx_mutstrn(buf.space, buf.size);
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
91 }
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
92
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
93

mercurial