0
|
1 #include <stdlib.h>
|
|
2 #include <string.h>
|
|
3 #include "structs.h"
|
|
4 #include "datum.h"
|
|
5 #include "interp.h"
|
|
6 #include "vis_threading.h"
|
|
7 #include "debugmacros.h"
|
|
8
|
|
9 #ifdef SYLLABLE
|
|
10 #include "syl_window.h"
|
|
11 VIS_CRITICAL_SECTION(app_lock);
|
|
12 #else
|
|
13 #ifdef WIN32
|
|
14 #include "ms_window.h"
|
|
15 VIS_CRITICAL_SECTION(hwnd_lock);
|
|
16 #endif
|
|
17 #endif
|
|
18
|
|
19 /*
|
|
20 typedef struct
|
|
21 {
|
|
22 os::Window * wind;
|
|
23 int refcount;
|
|
24 VIS_CRITICAL_SECTION(lock)
|
|
25 } os_window;
|
|
26
|
|
27 typedef struct
|
|
28 {
|
|
29 os_window * os_wind;
|
|
30 datum * title;
|
|
31 double width;
|
|
32 double height;
|
|
33 double xpos;
|
|
34 double ypos;
|
|
35 } vis_window_shown;*/
|
|
36
|
|
37 void vis_window_init()
|
|
38 {
|
|
39 #ifdef SYLLABLE
|
|
40 DEBUGPUTS("Initializing app_lock");
|
|
41
|
|
42 VIS_InitializeCriticalSection(app_lock);
|
|
43 #else
|
|
44 #ifdef WIN32
|
|
45 VIS_InitializeCriticalSection(hwnd_lock);
|
|
46 #endif
|
|
47 #endif
|
|
48 }
|
|
49
|
|
50 int vis_window_new(datum ** inputlist, queue_entry * worker_entry)
|
|
51 {
|
|
52 vis_window * window;
|
|
53 datum * window_datum = new_datum(BUILTIN_TYPE_WINDOW, 1, sizeof(vis_window), worker_entry->instance->def->program);
|
|
54 window = (vis_window *)(window_datum->c.generic.data);
|
|
55 window->title = inputlist[0];
|
|
56 DEBUGPRINTF("Type: %d\n", window->title->company->type_id);
|
|
57 DEBUGPRINTF("Length: %d\n", window->title->c.generic.len);
|
|
58 window->width = inputlist[1]->c.real;
|
|
59 window->height = inputlist[2]->c.real;
|
|
60
|
|
61 window->widget_dict = create_dict(worker_entry->instance->def->program);
|
|
62 window->widget_xpos = create_dict(worker_entry->instance->def->program);
|
|
63 window->widget_ypos = create_dict(worker_entry->instance->def->program);
|
|
64 window->id_list = create_list(worker_entry->instance->def->program);
|
|
65 release_ref(inputlist[1]);
|
|
66 release_ref(inputlist[2]);
|
|
67 inputlist[0] = window_datum;
|
|
68 return 0;
|
|
69 }
|
|
70
|
|
71 int vis_window_add_widget(datum ** inputlist, queue_entry * worker_entry)
|
|
72 {
|
|
73 datum * params[3];
|
|
74 vis_window * window;
|
|
75 inputlist[0] = copy_datum(inputlist[0], 0);
|
|
76 window = (vis_window *)(inputlist[0]->c.generic.data);
|
|
77 DEBUGPRINTF("xpos nodes: %d\n", ((dict_data *)window->widget_xpos->c.generic.data)->num_nodes);
|
|
78 params[0] = window->widget_dict;
|
|
79 params[1] = add_ref(inputlist[1]);
|
|
80 params[2] = inputlist[2];
|
|
81 DEBUGPUTS("Adding widget to widget_dict\n");
|
|
82 DEBUGPRINTF("xpos nodes: %d\n", ((dict_data *)window->widget_xpos->c.generic.data)->num_nodes);
|
|
83 DEBUGPRINTF("widget_dict->datas: %X, xpos->datas: %X\n", window->widget_dict->c.generic.data, window->widget_xpos->c.generic.data);
|
|
84 DEBUGPRINTF("sizeof(dict_data): %d, sizeof(ternary_node), %d\n", sizeof(dict_data), sizeof(ternary_node));
|
|
85 vis_dict_set(params, NULL);
|
|
86 DEBUGPRINTF("xpos nodes: %d\n", ((dict_data *)window->widget_xpos->c.generic.data)->num_nodes);
|
|
87 window->widget_dict = params[0];
|
|
88 params[0] = window->widget_xpos;
|
|
89 params[1] = add_ref(inputlist[1]);
|
|
90 params[2] = inputlist[3];
|
|
91 DEBUGPUTS("Adding xpos to xpos_dict\n");
|
|
92 vis_dict_set(params, NULL);
|
|
93 window->widget_xpos = params[0];
|
|
94 params[0] = window->widget_ypos;
|
|
95 params[1] = add_ref(inputlist[1]);
|
|
96 params[2] = inputlist[4];
|
|
97 DEBUGPUTS("Adding ypos to ypos_dict\n");
|
|
98 vis_dict_set(params, NULL);
|
|
99 window->widget_ypos = params[0];
|
|
100 params[0] = window->id_list;
|
|
101 params[1] = inputlist[1];
|
|
102 DEBUGPUTS("Adding id to id list\n");
|
|
103 DEBUGPRINTF("xpos nodes: %d\n", ((dict_data *)window->widget_xpos->c.generic.data)->num_nodes);
|
|
104 vis_list_append(params, NULL);
|
|
105 window->id_list = params[0];
|
|
106 return 0;
|
|
107 }
|
|
108
|
|
109 int vis_window_wait_close(datum ** inputlist, queue_entry * worker_entry)
|
|
110 {
|
|
111 vis_window_shown * window = (vis_window_shown *)(inputlist[0]->c.generic.data);
|
|
112 VIS_EnterCriticalSection(window->lock);
|
|
113 if(window->is_open && !window->wait_entry)
|
|
114 {
|
|
115 window->wait_entry = (queue_entry *)malloc(sizeof(queue_entry));
|
|
116 memcpy(window->wait_entry, worker_entry, sizeof(queue_entry));
|
|
117 VIS_LeaveCriticalSection(window->lock);
|
|
118 release_ref(inputlist[0]);
|
|
119 return 1;
|
|
120 }
|
|
121 else
|
|
122 {
|
|
123 VIS_LeaveCriticalSection(window->lock);
|
|
124 release_ref(inputlist[0]);
|
|
125 inputlist[0] = new_datum(BUILTIN_TYPE_YESNO, 2, 0, worker_entry->instance->def->program);
|
|
126 datum_set_yesno(inputlist[0], DATUM_NO);
|
|
127 return 0;
|
|
128 }
|
|
129 }
|
|
130
|
|
131
|
|
132
|
|
133 void vis_window_closed(datum * window_datum)
|
|
134 {
|
|
135 datum * params[1];
|
|
136 queue_entry * temp;
|
|
137 vis_window_shown * window = (vis_window_shown *)(window_datum->c.generic.data);
|
|
138
|
|
139 VIS_EnterCriticalSection(window->lock);
|
|
140 window->is_open = FALSE;
|
|
141 //window->wind = NULL;
|
|
142 temp = window->wait_entry;
|
|
143 window->wait_entry = NULL;
|
|
144 VIS_LeaveCriticalSection(window->lock);
|
|
145 release_ref(window_datum);
|
|
146 if(temp)
|
|
147 {
|
|
148 //TODO send YESNO output
|
|
149 params[0] = new_datum(BUILTIN_TYPE_YESNO, 2, 0, temp->instance->def->program);
|
|
150 datum_set_yesno(params[0], DATUM_YES);
|
|
151 process_outputs(params, temp->worker_num, temp->instance);
|
|
152 //worker_complete(*temp);
|
|
153 cleanup_check(*temp);
|
|
154 free(temp);
|
|
155 }
|
|
156
|
|
157 }
|
|
158
|
|
159 void widget_new(datum ** inputlist, int type, program * prog)
|
|
160 {
|
|
161 vis_widget * widget;
|
|
162 datum * output = new_datum(type, 1, sizeof(vis_widget), prog);
|
|
163 widget = (vis_widget *)(output->c.generic.data);
|
|
164 widget->label = inputlist[0];
|
|
165 widget->width = inputlist[1]->c.real;
|
|
166 release_ref(inputlist[1]);
|
|
167 widget->height = inputlist[2]->c.real;
|
|
168 release_ref(inputlist[2]);
|
|
169 widget->handler_dict = create_dict(prog);
|
|
170 widget->value = NULL;
|
|
171 DEBUGPRINTF("widget_new: type = %d, handler_dict = %X\n", type, widget->handler_dict);
|
|
172 inputlist[0] = output;
|
|
173 }
|
|
174
|
|
175 int vis_button_new(datum ** inputlist, queue_entry * worker_entry)
|
|
176 {
|
|
177 widget_new(inputlist, BUILTIN_TYPE_BUTTON, worker_entry->instance->def->program);
|
|
178 return 0;
|
|
179 }
|
|
180
|
|
181 int vis_button_set_handler(datum ** inputlist, queue_entry * workere_entry)
|
|
182 {
|
|
183 vis_widget * widget;
|
|
184 datum * params[3];
|
|
185 inputlist[0] = copy_datum(inputlist[0], 0);
|
|
186 widget = (vis_widget *)(inputlist[0]->c.generic.data);
|
|
187 params[0] = widget->handler_dict;
|
|
188 params[1] = inputlist[1];
|
|
189 params[2] = inputlist[2];
|
|
190 //DEBUGPUTS("\n\nvis_button_set_handler vis_dict_set\n");
|
|
191 vis_dict_set(params, NULL);
|
|
192 DEBUGPUTS("after vis_dict_set\n\n\n");
|
|
193 widget->handler_dict = params[0];
|
|
194 return 0;
|
|
195 }
|
|
196
|
|
197 int vis_inputbox_new(datum ** inputlist, queue_entry * worker_entry)
|
|
198 {
|
|
199 vis_widget * widget;
|
|
200 datum * output = new_datum(BUILTIN_TYPE_INPUTBOX, 1, sizeof(vis_widget), worker_entry->instance->def->program);
|
|
201 widget = (vis_widget *)(output->c.generic.data);
|
|
202 widget->value = inputlist[0];
|
|
203 widget->width = inputlist[1]->c.real;
|
|
204 release_ref(inputlist[1]);
|
|
205 widget->height = inputlist[2]->c.real;
|
|
206 release_ref(inputlist[2]);
|
|
207 widget->label = NULL;
|
|
208 widget->handler_dict = NULL;
|
|
209 widget->flags = 0;
|
|
210 inputlist[0] = output;
|
|
211 return 0;
|
|
212 }
|
|
213
|
|
214 int vis_inputbox_settype(datum ** inputlist, queue_entry * worker_entry)
|
|
215 {
|
|
216 vis_widget * widget;
|
|
217 inputlist[0] = copy_datum(inputlist[0], 0);
|
|
218 widget = (vis_widget *)(inputlist[0]->c.generic.data);
|
|
219 if(!strcmp((char *)(inputlist[1]->c.generic.data), "multiline"))
|
|
220 widget->flags = 1;
|
|
221 else if(!strcmp((char *)(inputlist[1]->c.generic.data), "numeric"))
|
|
222 widget->flags = 2;
|
|
223 else if(!strcmp((char *)(inputlist[1]->c.generic.data), "password"))
|
|
224 widget->flags = 3;
|
|
225 else if(!strcmp((char *)(inputlist[1]->c.generic.data), "read only"))
|
|
226 widget->flags = 4;
|
|
227 else
|
|
228 widget->flags = 0;
|
|
229 return 0;
|
|
230 }
|
|
231
|
|
232 int vis_customwidget_new(datum ** inputlist, queue_entry * worker_entry)
|
|
233 {
|
|
234 widget_new(inputlist, BUILTIN_TYPE_CUSTOM_WIDGET, worker_entry->instance->def->program);
|
|
235 return 0;
|
|
236 }
|
|
237
|
|
238
|
|
239 int vis_checkbox_new(datum ** params, queue_entry * entry)
|
|
240 {
|
|
241 vis_widget * widget;
|
|
242 widget_new(params, BUILTIN_TYPE_CHECKBOX, entry->instance->def->program);
|
|
243 widget = params[0]->c.generic.data;
|
|
244 widget->value = params[3];
|
|
245 return 0;
|
|
246 }
|
|
247
|
|
248 int vis_dropdown_new(datum ** params, queue_entry * entry)
|
|
249 {
|
|
250 vis_widget * widget;
|
|
251 widget_new(params, BUILTIN_TYPE_DROPDOWN, entry->instance->def->program);
|
|
252 widget = params[0]->c.generic.data;
|
|
253 widget->selected_index = -1;
|
|
254 return 0;
|
|
255 }
|
|
256
|
|
257 int vis_dropdown_settext(datum ** params, queue_entry * entry)
|
|
258 {
|
|
259 vis_widget * widget;
|
|
260 params[0] = copy_datum(params[0], 0);
|
|
261 widget = params[0]->c.generic.data;
|
|
262 widget->selected_index = -1;
|
|
263 release_ref(widget->value);
|
|
264 widget->value = params[1];
|
|
265 return 0;
|
|
266 }
|
|
267
|
|
268 int vis_dropdown_select(datum ** params, queue_entry * entry)
|
|
269 {
|
|
270 vis_widget * widget;
|
|
271 params[0] = copy_datum(params[0], 0);
|
|
272 widget = params[0]->c.generic.data;
|
|
273 release_ref(widget->value);
|
|
274 widget->value = NULL;
|
|
275 widget->selected_index = params[1]->c.integers.num_a;
|
|
276 release_ref(params[1]);
|
|
277 return 0;
|
|
278 }
|
|
279
|
|
280
|
|
281
|
|
282
|
|
283
|
|
284
|
|
285
|
|
286
|
|
287
|
|
288
|
|
289
|
|
290
|
|
291
|