Mercurial > repos > rhope
comparison syl_generic.cpp @ 0:76568becd6d6
Rhope Alpha 2a source import
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 28 Apr 2009 23:06:07 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:76568becd6d6 |
---|---|
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 |