0
|
1 #include "syl_generic.h"
|
|
2 #include "interp.h"
|
|
3 #include "debugmacros.h"
|
|
4 #include <gui/window.h>
|
|
5 #include "syl_window.h"
|
|
6
|
|
7 datum * get_callback(datum * handler_dict, char * name, worker_instance * instance)
|
|
8 {
|
|
9 queue_entry entry;
|
|
10 datum * params[2];
|
|
11 params[0] = add_ref( handler_dict );
|
|
12 params[1] = make_string(name, -1, instance->def->prog);
|
|
13 entry.instance = instance;
|
|
14 vis_dict_index(params, &entry);
|
|
15 if(params[1])
|
|
16 release_ref(params[1]);
|
|
17 return params[0];
|
|
18 }
|
|
19
|
|
20 void GenericView::SetCallbacks()
|
|
21 {
|
|
22 this->paint_worker = get_callback(this->handler_dict, "draw", instance);
|
|
23 this->mousemove_worker = get_callback(this->handler_dict, "mousemove", instance);
|
|
24 this->mousedown_worker = get_callback(this->handler_dict, "mousedown", instance);
|
|
25 this->mouseup_worker = get_callback(this->handler_dict, "mouseup", instance);
|
|
26 }
|
|
27
|
|
28 void GenericView::ResetCallbacks()
|
|
29 {
|
|
30 release_ref(this->paint_worker);
|
|
31 release_ref(this->mousemove_worker);
|
|
32 release_ref(this->mousedown_worker);
|
|
33 release_ref(this->mouseup_worker);
|
|
34 SetCallbacks();
|
|
35 }
|
|
36
|
|
37 GenericView::GenericView(const os::Rect& cFrame, const os::String& cTitle, datum * widget_datum, worker_instance * instance) : os::View(cFrame, cTitle/*, os::CF_FOLLOW_LEFT | os::CF_FOLLOW_TOP, os::WID_WILL_DRAW | os::WID_CLEAR_BACKGROUND | os::WID_TRANSPARENT*/)
|
|
38 {
|
|
39 datum * handler_dict;
|
|
40 this->widget_datum = widget_datum;
|
|
41 this->instance = instance;
|
|
42 this->handler_dict = ((vis_widget *)(widget_datum->c.generic.data))->handler_dict;
|
|
43 SetCallbacks();
|
|
44 }
|
|
45
|
|
46 void GenericView::DoCallback(datum * worker, const os::Rect& rect, datum ** extra_params, int num_extra)
|
|
47 {
|
|
48 queue_entry entry;
|
|
49 generic_view_datum * view;
|
|
50 entry.instance = this->instance;
|
|
51 datum * params[32];
|
|
52 datum * list;
|
|
53 DEBUGPRINTF("program: %X\n", this->instance->def->prog);
|
|
54 params[0] = create_list(this->instance->def->prog);
|
|
55 params[1] = new_datum(BUILTIN_TYPE_SCREEN_CUSTOM, 1, sizeof(generic_view_datum), this->instance->def->prog);
|
|
56 DEBUGPUTS("Datum created\n");
|
|
57 DEBUGPRINTF("screen custom widget company name: %s\n", params[1]->company->name);
|
|
58 view = (generic_view_datum *)(params[1]->c.generic.data);
|
|
59 view->view = this;
|
|
60 view->update_rect = rect;
|
|
61 vis_list_append(params, &entry);
|
|
62 for(int i = 0; i < num_extra; ++i)
|
|
63 {
|
|
64 params[1] = extra_params[i];
|
|
65 vis_list_append(params, &entry);
|
|
66 }
|
|
67 list = params[0];
|
|
68 worker_populate_inputs(worker, list, params);
|
|
69 release_ref(list);
|
|
70 DEBUGPUTS("Calling execute_def_wait\n");
|
|
71 execute_def_wait(((worker_datum *)(worker->c.generic.data))->def, params);
|
|
72 }
|
|
73 void GenericView::Paint(const os::Rect& cUpdateRect)
|
|
74 {
|
|
75 //DEBUGPUTS("GenericView::Paint\n");
|
|
76 //queue_entry entry;
|
|
77 //generic_view_datum * view;
|
|
78 if(this->paint_worker)
|
|
79 {
|
|
80 DoCallback(this->paint_worker, cUpdateRect, NULL, 0);
|
|
81 /*entry.instance = this->instance;
|
|
82 datum * params[32];
|
|
83 datum * list;
|
|
84 DEBUGPRINTF("program: %X\n", this->instance->def->prog);
|
|
85 params[0] = create_list(this->instance->def->prog);
|
|
86 params[1] = new_datum(BUILTIN_TYPE_SCREEN_CUSTOM, 1, sizeof(generic_view_datum), this->instance->def->prog);
|
|
87 DEBUGPUTS("Datum created\n");
|
|
88 DEBUGPRINTF("screen custom widget company name: %s\n", params[1]->company->name);
|
|
89 view = (generic_view_datum *)(params[1]->c.generic.data);
|
|
90 view->view = this;
|
|
91 view->update_rect = cUpdateRect;
|
|
92 vis_list_append(params, &entry);
|
|
93 list = params[0];
|
|
94 worker_populate_inputs(this->paint_worker, list, params);
|
|
95 release_ref(list);
|
|
96 DEBUGPUTS("Calling execute_def_wait\n");
|
|
97 execute_def_wait(((worker_datum *)(this->paint_worker->c.generic.data))->def, params);
|
|
98 //params[0] = add_ref(this->paint_worker);
|
|
99 //if(vis_worker_do(params, &entry) == 0)
|
|
100 // release_ref(params[0]);*/
|
|
101 }
|
|
102 else
|
|
103 os::View::Paint(cUpdateRect);
|
|
104 }
|
|
105
|
|
106 void GenericView::DefaultPaint(const os::Rect& cUpdateRect)
|
|
107 {
|
|
108 os::View::Paint(cUpdateRect);
|
|
109 }
|
|
110
|
|
111 void GenericView::MouseMove( const os::Point& newPos, int code, uint32 buttons, os::Message* msg)
|
|
112 {
|
|
113 datum * params[2];
|
|
114 if(this->mousemove_worker)
|
|
115 {
|
|
116 params[0] = new_datum(BUILTIN_TYPE_REAL, 3, 0, this->instance->def->prog);
|
|
117 params[0]->c.real = newPos.x;
|
|
118 params[1] = new_datum(BUILTIN_TYPE_REAL, 3, 0, this->instance->def->prog);
|
|
119 params[1]->c.real = newPos.y;
|
|
120 DoCallback(this->mousemove_worker, os::Rect(0,0,0,0), params, 2);
|
|
121 }
|
|
122 }
|
|
123
|
|
124 void GenericView::MouseDown( const os::Point& pos, uint32 buttons)
|
|
125 {
|
|
126 datum * params[3];
|
|
127 if(this->mousedown_worker)
|
|
128 {
|
|
129 DEBUGPRINTF("Mouse down worker: %X\n", this->mousedown_worker);
|
|
130 params[0] = new_datum(BUILTIN_TYPE_REAL, 3, 0, this->instance->def->prog);
|
|
131 params[0]->c.real = pos.x;
|
|
132 params[1] = new_datum(BUILTIN_TYPE_REAL, 3, 0, this->instance->def->prog);
|
|
133 params[1]->c.real = pos.y;
|
|
134 params[2] = new_datum(BUILTIN_TYPE_WHOLE, 2, 0, this->instance->def->prog);
|
|
135 params[2]->c.integers.num_a = buttons;
|
|
136 DoCallback(this->mousedown_worker, os::Rect(0,0,0,0), params, 3);
|
|
137 }
|
|
138 }
|
|
139
|
|
140 void GenericView::MouseUp( const os::Point& pos, uint32 buttons, os::Message* msg)
|
|
141 {
|
|
142 datum * params[3];
|
|
143 if(this->mouseup_worker)
|
|
144 {
|
|
145 params[0] = new_datum(BUILTIN_TYPE_REAL, 3, 0, this->instance->def->prog);
|
|
146 params[0]->c.real = pos.x;
|
|
147 params[1] = new_datum(BUILTIN_TYPE_REAL, 3, 0, this->instance->def->prog);
|
|
148 params[1]->c.real = pos.y;
|
|
149 params[2] = new_datum(BUILTIN_TYPE_WHOLE, 2, 0, this->instance->def->prog);
|
|
150 params[2]->c.integers.num_a = buttons;
|
|
151 DoCallback(this->mouseup_worker, os::Rect(0,0,0,0), params, 3);
|
|
152 }
|
|
153 }
|
|
154 /*
|
|
155 void GenericView::MakeFocus(bool give_focus)
|
|
156 {
|
|
157 os_window * parent_wind = (os_window *)GetWindow();
|
|
158 if(parent_wind)
|
|
159 if(give_focus)
|
|
160 parent_wind->SetFocusNoHandler(this)
|
|
161 else if(parent_wind->GetFocusChild() == this)
|
|
162 parent_wind->SetFocusNoHandler(NULL);
|
|
163 }
|
|
164 */
|
|
165 extern "C"
|
|
166 {
|
|
167
|
|
168 int vis_screen_custom_defaultpaint(datum ** params, queue_entry * entry)
|
|
169 {
|
|
170 generic_view_datum * view = (generic_view_datum *)(params[0]->c.generic.data);
|
|
171 DEBUGPUTS("Calling Genericview::DefaultPaint\n");
|
|
172 view->view->DefaultPaint(view->update_rect);
|
|
173 DEBUGPUTS("Genericview::DefaultPaint returned\n");
|
|
174 return 0;
|
|
175 }
|
|
176
|
|
177 int vis_screen_custom_drawline(datum ** params, queue_entry * entry)
|
|
178 {
|
|
179 DEBUGPRINTF("Draw line from %f,%f to %f,%f\n", params[1]->c.real,params[2]->c.real, params[3]->c.real,params[4]->c.real);
|
|
180 generic_view_datum * view = (generic_view_datum *)(params[0]->c.generic.data);
|
|
181 view->view->DrawLine(os::Point(params[1]->c.real,params[2]->c.real), os::Point(params[3]->c.real,params[4]->c.real));
|
|
182 DEBUGPUTS("finished calling DrawLine()\n");
|
|
183 release_ref(params[1]);
|
|
184 release_ref(params[2]);
|
|
185 release_ref(params[3]);
|
|
186 release_ref(params[4]);
|
|
187 return 0;
|
|
188 }
|
|
189
|
|
190 int vis_screen_custom_drawstring(datum ** params, queue_entry * entry)
|
|
191 {
|
|
192 generic_view_datum * view = (generic_view_datum *)(params[0]->c.generic.data);
|
|
193 view->view->DrawString(os::Point(params[2]->c.real, params[3]->c.real), ((char *)(params[1]->c.generic.data)));
|
|
194 release_ref(params[1]);
|
|
195 release_ref(params[2]);
|
|
196 release_ref(params[3]);
|
|
197 return 0;
|
|
198 }
|
|
199
|
|
200 int vis_screen_custom_setdrawcolor(datum ** params, queue_entry * entry)
|
|
201 {
|
|
202 generic_view_datum * view = (generic_view_datum *)(params[0]->c.generic.data);
|
|
203 view->view->SetFgColor(params[1]->c.integers.num_a, params[2]->c.integers.num_a, params[3]->c.integers.num_a, params[4]->c.integers.num_a);
|
|
204 release_ref(params[1]);
|
|
205 release_ref(params[2]);
|
|
206 release_ref(params[3]);
|
|
207 release_ref(params[4]);
|
|
208 return 0;
|
|
209 }
|
|
210
|
|
211 int vis_screen_custom_moveby(datum ** params, queue_entry * entry)
|
|
212 {
|
|
213 generic_view_datum * view = (generic_view_datum *)(params[0]->c.generic.data);
|
|
214 view->view->MoveBy(os::Point(params[1]->c.real, params[2]->c.real));
|
|
215 view->view->Flush();
|
|
216 release_ref(params[1]);
|
|
217 release_ref(params[2]);
|
|
218 return 0;
|
|
219 }
|
|
220
|
|
221 int vis_screen_custom_sethandler(datum ** params, queue_entry * entry)
|
|
222 {
|
|
223 datum * screen_datum;
|
|
224 generic_view_datum * view = (generic_view_datum *)(params[0]->c.generic.data);
|
|
225 screen_datum = params[0];
|
|
226 params[0] = view->view->handler_dict;
|
|
227 vis_dict_set(params, entry);
|
|
228 view->view->handler_dict = params[0];
|
|
229 params[0] = screen_datum;
|
|
230 view->view->ResetCallbacks();
|
|
231 return 0;
|
|
232 }
|
|
233
|
|
234 int vis_screen_custom_removehandler(datum ** params, queue_entry * entry)
|
|
235 {
|
|
236 datum * screen_datum;
|
|
237 generic_view_datum * view = (generic_view_datum *)(params[0]->c.generic.data);
|
|
238 screen_datum = params[0];
|
|
239 params[0] = view->view->handler_dict;
|
|
240 vis_dict_remove(params, entry);
|
|
241 view->view->handler_dict = params[0];
|
|
242 params[0] = screen_datum;
|
|
243 view->view->ResetCallbacks();
|
|
244 return 0;
|
|
245 }
|
|
246
|
|
247 int vis_screen_custom_givefocus(datum ** params, queue_entry * entry)
|
|
248 {
|
|
249 os::Window * wind;
|
|
250 generic_view_datum * view = (generic_view_datum *)(params[0]->c.generic.data);
|
|
251 wind = view->view->GetWindow();
|
|
252 if(wind)
|
|
253 wind->Unlock();
|
|
254 view->view->MakeFocus(params[1]->c.integers.num_a);
|
|
255 if(wind)
|
|
256 wind->Lock();
|
|
257 release_ref(params[1]);
|
|
258 return 0;
|
|
259 }
|
|
260
|
|
261 int vis_screen_custom_addwidget(datum ** params, queue_entry * entry)
|
|
262 {
|
|
263 generic_view_datum * view = (generic_view_datum *)(params[0]->c.generic.data);
|
|
264 os_window * wind = (os_window *)(view->view->GetWindow());
|
|
265 //printf("Locking window: %X\n", wind);
|
|
266 wind->Unlock();
|
|
267 puts("Adding widget");
|
|
268 add_widget_shared((vis_window_shown *)(wind->vis_wind->c.generic.data), params[2], (char *)(params[1]->c.generic.data), params[3]->c.real, params[4]->c.real, entry, view->view);
|
|
269 puts("Unlocking window");
|
|
270 wind->Lock();
|
|
271 puts("Releasing refs");
|
|
272 release_ref(params[1]);
|
|
273 release_ref(params[2]);
|
|
274 release_ref(params[3]);
|
|
275 release_ref(params[4]);
|
|
276 return 0;
|
|
277 }
|
|
278
|
|
279 int vis_screen_custom_getwindow(datum ** params, queue_entry * entry)
|
|
280 {
|
|
281 generic_view_datum * view = (generic_view_datum *)(params[0]->c.generic.data);
|
|
282 os_window * wind = (os_window *)(view->view->GetWindow());
|
|
283 release_ref(params[0]);
|
|
284 params[0] = add_ref(wind->vis_wind);
|
|
285 return 0;
|
|
286 }
|
|
287
|
|
288 }
|
|
289
|
|
290
|
|
291
|
|
292
|
|
293
|
|
294
|
|
295
|
|
296
|
|
297
|
|
298
|
|
299
|
|
300
|
|
301
|
|
302
|
|
303
|
|
304
|
|
305
|
|
306
|
|
307
|
|
308
|