client/uiclient.c

Thu, 04 Dec 2025 19:04:08 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Thu, 04 Dec 2025 19:04:08 +0100
changeset 948
94bc57d63128
parent 944
cc23aad6335e
child 953
c98404829cd3
permissions
-rw-r--r--

implement toggle button (Client)

942
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 * Copyright 2025 Olaf Wintermann. All rights reserved.
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
488178e3e328 add initial client code
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
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 #include "uiclient.h"
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30 #include "args.h"
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
32 #include <cx/hash_map.h>
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
33
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
34 #include "../ui/common/args.h"
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
35
944
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 942
diff changeset
36 static UiMessageHandler *io;
942
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
37
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
38 static CxMap *msg_types;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
39 static CxMap *objects;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
40
944
cc23aad6335e move message handler to ui common
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 942
diff changeset
41 void client_init(UiMessageHandler *handler) {
942
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
42 io = handler;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
43
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
44 msg_types = cxHashMapCreateSimple(CX_STORE_POINTERS);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
45 cxMapPut(msg_types, "simple_window", msg_simple_window);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46 cxMapPut(msg_types, "show", msg_show);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48 cxMapPut(msg_types, "vbox", msg_vbox);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
49 cxMapPut(msg_types, "hbox", msg_vbox);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
50 cxMapPut(msg_types, "grid", msg_vbox);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
51 cxMapPut(msg_types, "end", msg_end);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
52 cxMapPut(msg_types, "button", msg_button);
948
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
53 cxMapPut(msg_types, "toggle", msg_togglebutton);
942
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
54
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
55 objects = cxHashMapCreateSimple(CX_STORE_POINTERS);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
56 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
57
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
58 static cxmutstr jsonobj_getstring(const CxJsonValue *obj, const char *name) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
59 CxJsonValue *value = cxJsonObjGet(obj, name);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
60 if(value->type == CX_JSON_STRING) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
61 return value->value.string;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
62 } else {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
63 return (cxmutstr){ NULL, 0 };
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
64 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
65 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
66
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
67 /*
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
68 * UI thread callback
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
69 */
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
70 static int msg_received(void *data) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
71 CxJsonValue *value = data;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
72 if(client_handle_json(NULL, value)) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
73 fprintf(stderr, "Error: invalid json message\n");
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
74 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
75 cxJsonValueFree(value);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
76 return 0;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
77 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
78
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
79 /*
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
80 * This message callback is executed in the message handler input thread
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
81 */
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
82 void client_msg_received(cxmutstr msg) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
83 // parse message
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
84 CxJson json;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
85 cxJsonInit(&json, NULL);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
86
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
87 cxJsonFilln(&json, msg.ptr, msg.length);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
88 CxJsonValue *value;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
89 if(cxJsonNext(&json, &value) == CX_JSON_NO_ERROR && value) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
90 // handle json message in the UI thread
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
91 ui_call_mainthread(msg_received, value);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
92 } else {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
93 fprintf(stderr, "Error: invalid json message\n");
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
94 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
95 cxJsonDestroy(&json);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
96 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
97
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
98 int client_handle_json(UiObject *obj, const CxJsonValue *value) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
99 if(value->type != CX_JSON_OBJECT) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
100 return 1;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
101 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
102
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
103 CxJsonValue *type = cxJsonObjGet(value, "type");
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
104 if(!type || type->type != CX_JSON_STRING) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
105 return 1;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
106 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
107
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
108 json_msg_handler handler = cxMapGet(msg_types, type->value.string);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
109 if(!handler) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
110 return 1;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
111 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
112
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
113 return handler(obj, value);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
114 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
115
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
116 int client_handle_children(UiObject *parent, const CxJsonValue *value) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
117 CxJsonValue *children = cxJsonObjGet(value, "children");
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
118 if(children && children->type == CX_JSON_ARRAY) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
119 for(int i=0;i<children->value.array.array_size;i++) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
120 CxJsonValue *child = children->value.array.array[i];
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
121 if(client_handle_json(parent, child)) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
122 fprintf(stderr, "Error: invalid child\n");
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
123 return 1;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
124 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
125 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
126 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
127 return 0;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
128 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
129
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
130 void client_add_obj_mapping(UiObject *obj, cxmutstr id) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
131 cxMapPut(objects, id, obj);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
132
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
133 CxAllocator *a = ui_allocator(obj->ctx);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
134
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
135 WindowData *wdata = cxMalloc(a, sizeof(WindowData));
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
136 wdata->widgets = cxHashMapCreate(a, CX_STORE_POINTERS, 128);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
137 obj->window = wdata;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
138 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
139
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
140 UiObject* client_get_mapped_obj(cxmutstr id) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
141 return cxMapGet(objects, id);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
142 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
143
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
144 void client_reg_widget(UiObject *obj, cxmutstr id, UIWIDGET w) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
145 WindowData *wdata = obj->window;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
146 if(!wdata) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
147 fprintf(stderr, "Error: missing obj window data\n");
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
148 return;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
149 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
150 cxMapPut(wdata->widgets, id, w);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
151 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
152
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
153 UIWIDGET client_get_widget(UiObject *obj, cxmutstr id) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
154 WindowData *wdata = obj->window;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
155 if(!wdata) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
156 fprintf(stderr, "Error: missing obj window data\n");
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
157 return NULL;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
158 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
159 return cxMapGet(wdata->widgets, id);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
160 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
161
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
162 static UiObject* get_msg_obj(UiObject *obj, const CxJsonValue *value) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
163 if(obj) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
164 return obj;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
165 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
166 CxJsonValue *obj_id = cxJsonObjGet(value, "obj");
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
167 if(!obj_id || obj_id->type != CX_JSON_STRING) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
168 return NULL;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
169 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
170 return client_get_mapped_obj(obj_id->value.string);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
171 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
172
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
173 int msg_simple_window(UiObject *parent, const CxJsonValue *value) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
174 cxmutstr id = jsonobj_getstring(value, "id");
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
175 cxmutstr title = jsonobj_getstring(value, "title");
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
176
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
177 if(!id.ptr) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
178 return 1;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
179 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
180
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
181 UiObject *obj = ui_simple_window(title.ptr, NULL);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
182 client_add_obj_mapping(obj, id);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
183
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
184 return client_handle_children(obj, value);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
185 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
186
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
187 int msg_show(UiObject *parent, const CxJsonValue *value) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
188 UiObject *obj = client_get_mapped_obj(jsonobj_getstring(value, "obj"));
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
189 if(!obj) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
190 return 1;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
191 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
192 ui_show(obj);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
193 return 0;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
194 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
195
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
196 typedef UIWIDGET(*ctcreate_func)(UiObject *obj, UiContainerArgs *args);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
197
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
198 static int msg_container(UiObject *parent, const CxJsonValue *value, ctcreate_func create) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
199 CxJsonValue *args_value = cxJsonObjGet(value, "args");
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
200 cxmutstr id = jsonobj_getstring(value, "id");
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
201 if(!id.ptr) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
202 return 1;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
203 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
204 UiObject *obj = get_msg_obj(parent, value);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
205 if(!obj) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
206 return 1;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
207 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
208
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
209 UiContainerArgs *args = json2container_args(args_value);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
210 UIWIDGET w = create(obj, args);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
211 ui_container_args_free(args);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
212 client_reg_widget(obj, id, w);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
213
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
214 return 0;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
215 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
216
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
217 int msg_vbox(UiObject *parent, const CxJsonValue *value) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
218 return msg_container(parent, value, ui_vbox_create);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
219 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
220
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
221 int msg_hbox(UiObject *parent, const CxJsonValue *value) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
222 return msg_container(parent, value, ui_hbox_create);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
223 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
224
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
225 int msg_grid(UiObject *parent, const CxJsonValue *value) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
226 return msg_container(parent, value, ui_grid_create);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
227 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
228
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
229 int msg_end(UiObject *parent, const CxJsonValue *value) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
230 UiObject *obj = get_msg_obj(parent, value);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
231 if(!obj) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
232 return 1;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
233 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
234 ui_end_new(obj);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
235 return 0;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
236 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
237
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
238 int msg_button(UiObject *parent, const CxJsonValue *value) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
239 CxJsonValue *args_value = cxJsonObjGet(value, "args");
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
240 cxmutstr id = jsonobj_getstring(value, "id");
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
241 if(!id.ptr) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
242 return 1;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
243 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
244 UiObject *obj = get_msg_obj(parent, value);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
245 if(!obj) {
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
246 return 1;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
247 }
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
248
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
249 UiButtonArgs *args = json2button_args(args_value);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
250 UIWIDGET w = ui_button_create(obj, args);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
251 ui_button_args_free(args);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
252 client_reg_widget(obj, id, w);
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
253
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
254 return 0;
488178e3e328 add initial client code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
255 }
948
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
256
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
257 int msg_togglebutton(UiObject *parent, const CxJsonValue *value) {
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
258 CxJsonValue *args_value = cxJsonObjGet(value, "args");
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
259 cxmutstr id = jsonobj_getstring(value, "id");
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
260 if(!id.ptr) {
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
261 return 1;
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
262 }
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
263 UiObject *obj = get_msg_obj(parent, value);
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
264 if(!obj) {
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
265 return 1;
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
266 }
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
267
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
268 CxJsonValue *button_type = cxJsonObjGet(value, "button_type");
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
269 if(!button_type || button_type->type != CX_JSON_INTEGER) {
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
270 return 1;
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
271 }
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
272
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
273 CxJsonValue *val = cxJsonObjGet(value, "value");
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
274 UiInteger *i = NULL;
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
275 if(val && val->type == CX_JSON_STRING) {
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
276 i = ui_int_new(obj->ctx, val->value.string.ptr);
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
277 }
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
278
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
279 UiToggleArgs *args = json2toggle_args(args_value);
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
280 UIWIDGET w;
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
281 switch(button_type->value.integer) {
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
282 default: {
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
283 w = ui_togglebutton_create(obj, args);
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
284 break;
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
285 }
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
286 case 1: {
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
287 w = ui_checkbox_create(obj, args);
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
288 break;
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
289 }
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
290 case 2: {
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
291 w = ui_switch_create(obj, args);
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
292 break;
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
293 }
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
294 }
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
295 ui_toggle_args_free(args);
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
296 client_reg_widget(obj, id, w);
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
297
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
298 return 0;
94bc57d63128 implement toggle button (Client)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 944
diff changeset
299 }

mercurial