Mercurial > repos > rhope
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/syl_generic.cpp Tue Apr 28 23:06:07 2009 +0000 @@ -0,0 +1,308 @@ +#include "syl_generic.h" +#include "interp.h" +#include "debugmacros.h" +#include <gui/window.h> +#include "syl_window.h" + +datum * get_callback(datum * handler_dict, char * name, worker_instance * instance) +{ + queue_entry entry; + datum * params[2]; + params[0] = add_ref( handler_dict ); + params[1] = make_string(name, -1, instance->def->prog); + entry.instance = instance; + vis_dict_index(params, &entry); + if(params[1]) + release_ref(params[1]); + return params[0]; +} + +void GenericView::SetCallbacks() +{ + this->paint_worker = get_callback(this->handler_dict, "draw", instance); + this->mousemove_worker = get_callback(this->handler_dict, "mousemove", instance); + this->mousedown_worker = get_callback(this->handler_dict, "mousedown", instance); + this->mouseup_worker = get_callback(this->handler_dict, "mouseup", instance); +} + +void GenericView::ResetCallbacks() +{ + release_ref(this->paint_worker); + release_ref(this->mousemove_worker); + release_ref(this->mousedown_worker); + release_ref(this->mouseup_worker); + SetCallbacks(); +} + +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*/) +{ + datum * handler_dict; + this->widget_datum = widget_datum; + this->instance = instance; + this->handler_dict = ((vis_widget *)(widget_datum->c.generic.data))->handler_dict; + SetCallbacks(); +} + +void GenericView::DoCallback(datum * worker, const os::Rect& rect, datum ** extra_params, int num_extra) +{ + queue_entry entry; + generic_view_datum * view; + entry.instance = this->instance; + datum * params[32]; + datum * list; + DEBUGPRINTF("program: %X\n", this->instance->def->prog); + params[0] = create_list(this->instance->def->prog); + params[1] = new_datum(BUILTIN_TYPE_SCREEN_CUSTOM, 1, sizeof(generic_view_datum), this->instance->def->prog); + DEBUGPUTS("Datum created\n"); + DEBUGPRINTF("screen custom widget company name: %s\n", params[1]->company->name); + view = (generic_view_datum *)(params[1]->c.generic.data); + view->view = this; + view->update_rect = rect; + vis_list_append(params, &entry); + for(int i = 0; i < num_extra; ++i) + { + params[1] = extra_params[i]; + vis_list_append(params, &entry); + } + list = params[0]; + worker_populate_inputs(worker, list, params); + release_ref(list); + DEBUGPUTS("Calling execute_def_wait\n"); + execute_def_wait(((worker_datum *)(worker->c.generic.data))->def, params); +} +void GenericView::Paint(const os::Rect& cUpdateRect) +{ + //DEBUGPUTS("GenericView::Paint\n"); + //queue_entry entry; + //generic_view_datum * view; + if(this->paint_worker) + { + DoCallback(this->paint_worker, cUpdateRect, NULL, 0); + /*entry.instance = this->instance; + datum * params[32]; + datum * list; + DEBUGPRINTF("program: %X\n", this->instance->def->prog); + params[0] = create_list(this->instance->def->prog); + params[1] = new_datum(BUILTIN_TYPE_SCREEN_CUSTOM, 1, sizeof(generic_view_datum), this->instance->def->prog); + DEBUGPUTS("Datum created\n"); + DEBUGPRINTF("screen custom widget company name: %s\n", params[1]->company->name); + view = (generic_view_datum *)(params[1]->c.generic.data); + view->view = this; + view->update_rect = cUpdateRect; + vis_list_append(params, &entry); + list = params[0]; + worker_populate_inputs(this->paint_worker, list, params); + release_ref(list); + DEBUGPUTS("Calling execute_def_wait\n"); + execute_def_wait(((worker_datum *)(this->paint_worker->c.generic.data))->def, params); + //params[0] = add_ref(this->paint_worker); + //if(vis_worker_do(params, &entry) == 0) + // release_ref(params[0]);*/ + } + else + os::View::Paint(cUpdateRect); +} + +void GenericView::DefaultPaint(const os::Rect& cUpdateRect) +{ + os::View::Paint(cUpdateRect); +} + +void GenericView::MouseMove( const os::Point& newPos, int code, uint32 buttons, os::Message* msg) +{ + datum * params[2]; + if(this->mousemove_worker) + { + params[0] = new_datum(BUILTIN_TYPE_REAL, 3, 0, this->instance->def->prog); + params[0]->c.real = newPos.x; + params[1] = new_datum(BUILTIN_TYPE_REAL, 3, 0, this->instance->def->prog); + params[1]->c.real = newPos.y; + DoCallback(this->mousemove_worker, os::Rect(0,0,0,0), params, 2); + } +} + +void GenericView::MouseDown( const os::Point& pos, uint32 buttons) +{ + datum * params[3]; + if(this->mousedown_worker) + { + DEBUGPRINTF("Mouse down worker: %X\n", this->mousedown_worker); + params[0] = new_datum(BUILTIN_TYPE_REAL, 3, 0, this->instance->def->prog); + params[0]->c.real = pos.x; + params[1] = new_datum(BUILTIN_TYPE_REAL, 3, 0, this->instance->def->prog); + params[1]->c.real = pos.y; + params[2] = new_datum(BUILTIN_TYPE_WHOLE, 2, 0, this->instance->def->prog); + params[2]->c.integers.num_a = buttons; + DoCallback(this->mousedown_worker, os::Rect(0,0,0,0), params, 3); + } +} + +void GenericView::MouseUp( const os::Point& pos, uint32 buttons, os::Message* msg) +{ + datum * params[3]; + if(this->mouseup_worker) + { + params[0] = new_datum(BUILTIN_TYPE_REAL, 3, 0, this->instance->def->prog); + params[0]->c.real = pos.x; + params[1] = new_datum(BUILTIN_TYPE_REAL, 3, 0, this->instance->def->prog); + params[1]->c.real = pos.y; + params[2] = new_datum(BUILTIN_TYPE_WHOLE, 2, 0, this->instance->def->prog); + params[2]->c.integers.num_a = buttons; + DoCallback(this->mouseup_worker, os::Rect(0,0,0,0), params, 3); + } +} +/* +void GenericView::MakeFocus(bool give_focus) +{ + os_window * parent_wind = (os_window *)GetWindow(); + if(parent_wind) + if(give_focus) + parent_wind->SetFocusNoHandler(this) + else if(parent_wind->GetFocusChild() == this) + parent_wind->SetFocusNoHandler(NULL); +} +*/ +extern "C" +{ + +int vis_screen_custom_defaultpaint(datum ** params, queue_entry * entry) +{ + generic_view_datum * view = (generic_view_datum *)(params[0]->c.generic.data); + DEBUGPUTS("Calling Genericview::DefaultPaint\n"); + view->view->DefaultPaint(view->update_rect); + DEBUGPUTS("Genericview::DefaultPaint returned\n"); + return 0; +} + +int vis_screen_custom_drawline(datum ** params, queue_entry * entry) +{ + 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); + generic_view_datum * view = (generic_view_datum *)(params[0]->c.generic.data); + view->view->DrawLine(os::Point(params[1]->c.real,params[2]->c.real), os::Point(params[3]->c.real,params[4]->c.real)); + DEBUGPUTS("finished calling DrawLine()\n"); + release_ref(params[1]); + release_ref(params[2]); + release_ref(params[3]); + release_ref(params[4]); + return 0; +} + +int vis_screen_custom_drawstring(datum ** params, queue_entry * entry) +{ + generic_view_datum * view = (generic_view_datum *)(params[0]->c.generic.data); + view->view->DrawString(os::Point(params[2]->c.real, params[3]->c.real), ((char *)(params[1]->c.generic.data))); + release_ref(params[1]); + release_ref(params[2]); + release_ref(params[3]); + return 0; +} + +int vis_screen_custom_setdrawcolor(datum ** params, queue_entry * entry) +{ + generic_view_datum * view = (generic_view_datum *)(params[0]->c.generic.data); + 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); + release_ref(params[1]); + release_ref(params[2]); + release_ref(params[3]); + release_ref(params[4]); + return 0; +} + +int vis_screen_custom_moveby(datum ** params, queue_entry * entry) +{ + generic_view_datum * view = (generic_view_datum *)(params[0]->c.generic.data); + view->view->MoveBy(os::Point(params[1]->c.real, params[2]->c.real)); + view->view->Flush(); + release_ref(params[1]); + release_ref(params[2]); + return 0; +} + +int vis_screen_custom_sethandler(datum ** params, queue_entry * entry) +{ + datum * screen_datum; + generic_view_datum * view = (generic_view_datum *)(params[0]->c.generic.data); + screen_datum = params[0]; + params[0] = view->view->handler_dict; + vis_dict_set(params, entry); + view->view->handler_dict = params[0]; + params[0] = screen_datum; + view->view->ResetCallbacks(); + return 0; +} + +int vis_screen_custom_removehandler(datum ** params, queue_entry * entry) +{ + datum * screen_datum; + generic_view_datum * view = (generic_view_datum *)(params[0]->c.generic.data); + screen_datum = params[0]; + params[0] = view->view->handler_dict; + vis_dict_remove(params, entry); + view->view->handler_dict = params[0]; + params[0] = screen_datum; + view->view->ResetCallbacks(); + return 0; +} + +int vis_screen_custom_givefocus(datum ** params, queue_entry * entry) +{ + os::Window * wind; + generic_view_datum * view = (generic_view_datum *)(params[0]->c.generic.data); + wind = view->view->GetWindow(); + if(wind) + wind->Unlock(); + view->view->MakeFocus(params[1]->c.integers.num_a); + if(wind) + wind->Lock(); + release_ref(params[1]); + return 0; +} + +int vis_screen_custom_addwidget(datum ** params, queue_entry * entry) +{ + generic_view_datum * view = (generic_view_datum *)(params[0]->c.generic.data); + os_window * wind = (os_window *)(view->view->GetWindow()); + //printf("Locking window: %X\n", wind); + wind->Unlock(); + puts("Adding widget"); + 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); + puts("Unlocking window"); + wind->Lock(); + puts("Releasing refs"); + release_ref(params[1]); + release_ref(params[2]); + release_ref(params[3]); + release_ref(params[4]); + return 0; +} + +int vis_screen_custom_getwindow(datum ** params, queue_entry * entry) +{ + generic_view_datum * view = (generic_view_datum *)(params[0]->c.generic.data); + os_window * wind = (os_window *)(view->view->GetWindow()); + release_ref(params[0]); + params[0] = add_ref(wind->vis_wind); + return 0; +} + +} + + + + + + + + + + + + + + + + + + + +