ui/server/window.c

Wed, 10 Dec 2025 22:22:55 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Wed, 10 Dec 2025 22:22:55 +0100
changeset 984
2cf5e6d55013
parent 982
9102a53c5385
child 985
93f07ccfd997
permissions
-rw-r--r--

implement all window types in the client + small fixes

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"
1d47e71f26b6 add server base structs
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30
982
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
31 #include "../common/object.h"
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
32
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
33 #include <cx/buffer.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 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
36 UiObject *obj = uic_object_new_toplevel();
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
37 const CxAllocator *a = obj->ctx->allocator;
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
38
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
39 UiWindow *window = cxZalloc(a, sizeof(UiWindow));
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
40 window->widget.obj = ui_create_server_object(obj->ctx);
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
41 window->widget.children = cxLinkedListCreate(a, NULL, CX_STORE_POINTERS);
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
42 window->widget.serialize = (ui_serialize_func)ui_window_serialize;
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
43 window->title = cx_strdup_a(a, title);
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
44
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
45 obj->widget = (UiWidget*)window;
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
46 ui_reg_widget(obj->widget);
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
47
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
48 return obj;
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
49 }
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 UiObject *ui_window(const char *title, void *window_data) {
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
52 return create_window(title, FALSE, FALSE, FALSE);
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
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
55 UiObject *ui_sidebar_window(const char *title, void *window_data) {
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
56 return create_window(title, FALSE, TRUE, FALSE);
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
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
59 UiObject *ui_splitview_window(const char *title, UiBool sidebar) {
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
60 return create_window(title, FALSE, sidebar, TRUE);
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
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
63 UiObject *ui_simple_window(const char *title, void *window_data) {
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
64 return create_window(title, TRUE, FALSE, FALSE);
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
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
67
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
68 cxmutstr ui_window_serialize(UiWindow *w) {
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
69 CxBuffer buf;
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
70 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
71
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
72 cxBufferPutString(&buf, "{\"type\":");
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
73 switch(w->type) {
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
74 case UI_WINDOW_MAIN: cxBufferPutString(&buf, "\"window\""); break;
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
75 case UI_WINDOW_SIMPLE: cxBufferPutString(&buf, "\"simple_window\""); break;
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
76 case UI_WINDOW_SIDEBAR: cxBufferPutString(&buf, "\"sidebar_window\""); break;
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
77 case UI_WINDOW_SPLITVIEW: cxBufferPutString(&buf, "\"splitview_window\""); break;
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
78 }
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 cxmutstr obj_id = w->widget.obj->id;
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
81 cxmutstr id = w->widget.id;
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
82
984
2cf5e6d55013 implement all window types in the client + small fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 982
diff changeset
83 cxBufferPutString(&buf, ", \"obj\":\"");
982
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
84 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
85 cxBufferPutString(&buf, "\",");
982
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
86
984
2cf5e6d55013 implement all window types in the client + small fixes
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 982
diff changeset
87 cxBufferPutString(&buf, " \"id\":\"");
982
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
88 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
89 cxBufferPutString(&buf, "\", ");
982
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
90
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
91 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
92 cxBufferPutString(&buf, " \"title\":\"");
982
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
93 cxBufferWrite(w->title.ptr, 1, w->title.length, &buf);
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
94 cxBufferPutString(&buf, "\"");
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
95 }
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
96
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
97
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
98 cxBufferPutString(&buf, "}\n");
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
99
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
100 return cx_mutstrn(buf.space, buf.size);
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
101 }
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
102
9102a53c5385 implement window (Server)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 981
diff changeset
103

mercurial