ui/server/window.c

Thu, 11 Dec 2025 19:52:44 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Thu, 11 Dec 2025 19:52:44 +0100
changeset 985
93f07ccfd997
parent 984
2cf5e6d55013
child 986
6f7600c2b9e1
permissions
-rw-r--r--

add button (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"
981
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31
982
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
32 #include "../common/object.h"
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
33
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
34 #include <cx/buffer.h>
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
35
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
36 static UiObject* create_window(const char *title, UiBool simple, UiBool sidebar, UiBool splitview) {
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
37 UiObject *obj = uic_object_new_toplevel();
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
38 const CxAllocator *a = obj->ctx->allocator;
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
39
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
40 UiWindow *window = cxZalloc(a, sizeof(UiWindow));
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
41 window->widget.obj = ui_create_server_object(obj->ctx);
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
42 window->widget.children = cxLinkedListCreate(a, NULL, CX_STORE_POINTERS);
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
43 window->widget.serialize = (ui_serialize_func)ui_window_serialize;
985
93f07ccfd997 add button (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 984
diff changeset
44 window->widget.invisible = TRUE;
982
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
45 window->title = cx_strdup_a(a, title);
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
46
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
47 obj->widget = (UiWidget*)window;
985
93f07ccfd997 add button (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 984
diff changeset
48 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
49 ui_reg_widget(obj->widget);
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
50
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
51 return obj;
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
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
54 UiObject *ui_window(const char *title, void *window_data) {
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
55 return create_window(title, FALSE, FALSE, FALSE);
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
56 }
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
57
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
58 UiObject *ui_sidebar_window(const char *title, void *window_data) {
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
59 return create_window(title, FALSE, TRUE, FALSE);
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
60 }
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
61
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
62 UiObject *ui_splitview_window(const char *title, UiBool sidebar) {
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
63 return create_window(title, FALSE, sidebar, TRUE);
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
64 }
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
65
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
66 UiObject *ui_simple_window(const char *title, void *window_data) {
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
67 return create_window(title, TRUE, FALSE, FALSE);
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
68 }
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
69
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 cxmutstr ui_window_serialize(UiWindow *w) {
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
72 CxBuffer buf;
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
73 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
74
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
75 cxBufferPutString(&buf, "{\"type\":");
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
76 switch(w->type) {
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
77 case UI_WINDOW_MAIN: cxBufferPutString(&buf, "\"window\""); break;
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
78 case UI_WINDOW_SIMPLE: cxBufferPutString(&buf, "\"simple_window\""); break;
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
79 case UI_WINDOW_SIDEBAR: cxBufferPutString(&buf, "\"sidebar_window\""); break;
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
80 case UI_WINDOW_SPLITVIEW: cxBufferPutString(&buf, "\"splitview_window\""); break;
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
81 }
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
82
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
83 cxmutstr obj_id = w->widget.obj->id;
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
84 cxmutstr id = w->widget.id;
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
85
984
2cf5e6d55013 implement all window types in the client + small fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 982
diff changeset
86 cxBufferPutString(&buf, ", \"obj\":\"");
982
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
87 cxBufferWrite(obj_id.ptr, 1, obj_id.length, &buf);
984
2cf5e6d55013 implement all window types in the client + small fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 982
diff changeset
88 cxBufferPutString(&buf, "\",");
982
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
89
984
2cf5e6d55013 implement all window types in the client + small fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 982
diff changeset
90 cxBufferPutString(&buf, " \"id\":\"");
982
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
91 cxBufferWrite(id.ptr, 1, id.length, &buf);
984
2cf5e6d55013 implement all window types in the client + small fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 982
diff changeset
92 cxBufferPutString(&buf, "\", ");
982
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
93
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
94 if(w->title.ptr) {
984
2cf5e6d55013 implement all window types in the client + small fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 982
diff changeset
95 cxBufferPutString(&buf, " \"title\":\"");
982
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
96 cxBufferWrite(w->title.ptr, 1, w->title.length, &buf);
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
97 cxBufferPutString(&buf, "\"");
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
98 }
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
99
985
93f07ccfd997 add button (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 984
diff changeset
100 size_t numchildren = cxListSize(w->widget.children);
93f07ccfd997 add button (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 984
diff changeset
101 if(numchildren > 0) {
93f07ccfd997 add button (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 984
diff changeset
102 cxBufferPutString(&buf, ",\"children\":[");
93f07ccfd997 add button (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 984
diff changeset
103 CxIterator i = cxListIterator(w->widget.children);
93f07ccfd997 add button (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 984
diff changeset
104 cx_foreach(UiWidget *, child, i) {
93f07ccfd997 add button (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 984
diff changeset
105 cxmutstr child_str = child->serialize(child);
93f07ccfd997 add button (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 984
diff changeset
106 cxBufferWrite(child_str.ptr, 1, child_str.length, &buf);
93f07ccfd997 add button (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 984
diff changeset
107 if(i.index+1 < numchildren) {
93f07ccfd997 add button (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 984
diff changeset
108 cxBufferPut(&buf, ',');
93f07ccfd997 add button (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 984
diff changeset
109 }
93f07ccfd997 add button (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 984
diff changeset
110 }
93f07ccfd997 add button (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 984
diff changeset
111 cxBufferPutString(&buf, "]");
93f07ccfd997 add button (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 984
diff changeset
112 }
982
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
113
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
114 cxBufferPutString(&buf, "}\n");
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
115
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
116 return cx_mutstrn(buf.space, buf.size);
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
117 }
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
118
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
119

mercurial