Mercurial > repos > rhope
diff window.c @ 0:76568becd6d6
Rhope Alpha 2a source import
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 28 Apr 2009 23:06:07 +0000 |
parents | |
children | 94c885692eb5 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/window.c Tue Apr 28 23:06:07 2009 +0000 @@ -0,0 +1,291 @@ +#include <stdlib.h> +#include <string.h> +#include "structs.h" +#include "datum.h" +#include "interp.h" +#include "vis_threading.h" +#include "debugmacros.h" + +#ifdef SYLLABLE +#include "syl_window.h" +VIS_CRITICAL_SECTION(app_lock); +#else + #ifdef WIN32 +#include "ms_window.h" +VIS_CRITICAL_SECTION(hwnd_lock); + #endif +#endif + +/* +typedef struct +{ + os::Window * wind; + int refcount; + VIS_CRITICAL_SECTION(lock) +} os_window; + +typedef struct +{ + os_window * os_wind; + datum * title; + double width; + double height; + double xpos; + double ypos; +} vis_window_shown;*/ + +void vis_window_init() +{ + #ifdef SYLLABLE + DEBUGPUTS("Initializing app_lock"); + + VIS_InitializeCriticalSection(app_lock); + #else + #ifdef WIN32 + VIS_InitializeCriticalSection(hwnd_lock); + #endif + #endif +} + +int vis_window_new(datum ** inputlist, queue_entry * worker_entry) +{ + vis_window * window; + datum * window_datum = new_datum(BUILTIN_TYPE_WINDOW, 1, sizeof(vis_window), worker_entry->instance->def->program); + window = (vis_window *)(window_datum->c.generic.data); + window->title = inputlist[0]; + DEBUGPRINTF("Type: %d\n", window->title->company->type_id); + DEBUGPRINTF("Length: %d\n", window->title->c.generic.len); + window->width = inputlist[1]->c.real; + window->height = inputlist[2]->c.real; + + window->widget_dict = create_dict(worker_entry->instance->def->program); + window->widget_xpos = create_dict(worker_entry->instance->def->program); + window->widget_ypos = create_dict(worker_entry->instance->def->program); + window->id_list = create_list(worker_entry->instance->def->program); + release_ref(inputlist[1]); + release_ref(inputlist[2]); + inputlist[0] = window_datum; + return 0; +} + +int vis_window_add_widget(datum ** inputlist, queue_entry * worker_entry) +{ + datum * params[3]; + vis_window * window; + inputlist[0] = copy_datum(inputlist[0], 0); + window = (vis_window *)(inputlist[0]->c.generic.data); + DEBUGPRINTF("xpos nodes: %d\n", ((dict_data *)window->widget_xpos->c.generic.data)->num_nodes); + params[0] = window->widget_dict; + params[1] = add_ref(inputlist[1]); + params[2] = inputlist[2]; + DEBUGPUTS("Adding widget to widget_dict\n"); + DEBUGPRINTF("xpos nodes: %d\n", ((dict_data *)window->widget_xpos->c.generic.data)->num_nodes); + DEBUGPRINTF("widget_dict->datas: %X, xpos->datas: %X\n", window->widget_dict->c.generic.data, window->widget_xpos->c.generic.data); + DEBUGPRINTF("sizeof(dict_data): %d, sizeof(ternary_node), %d\n", sizeof(dict_data), sizeof(ternary_node)); + vis_dict_set(params, NULL); + DEBUGPRINTF("xpos nodes: %d\n", ((dict_data *)window->widget_xpos->c.generic.data)->num_nodes); + window->widget_dict = params[0]; + params[0] = window->widget_xpos; + params[1] = add_ref(inputlist[1]); + params[2] = inputlist[3]; + DEBUGPUTS("Adding xpos to xpos_dict\n"); + vis_dict_set(params, NULL); + window->widget_xpos = params[0]; + params[0] = window->widget_ypos; + params[1] = add_ref(inputlist[1]); + params[2] = inputlist[4]; + DEBUGPUTS("Adding ypos to ypos_dict\n"); + vis_dict_set(params, NULL); + window->widget_ypos = params[0]; + params[0] = window->id_list; + params[1] = inputlist[1]; + DEBUGPUTS("Adding id to id list\n"); + DEBUGPRINTF("xpos nodes: %d\n", ((dict_data *)window->widget_xpos->c.generic.data)->num_nodes); + vis_list_append(params, NULL); + window->id_list = params[0]; + return 0; +} + +int vis_window_wait_close(datum ** inputlist, queue_entry * worker_entry) +{ + vis_window_shown * window = (vis_window_shown *)(inputlist[0]->c.generic.data); + VIS_EnterCriticalSection(window->lock); + if(window->is_open && !window->wait_entry) + { + window->wait_entry = (queue_entry *)malloc(sizeof(queue_entry)); + memcpy(window->wait_entry, worker_entry, sizeof(queue_entry)); + VIS_LeaveCriticalSection(window->lock); + release_ref(inputlist[0]); + return 1; + } + else + { + VIS_LeaveCriticalSection(window->lock); + release_ref(inputlist[0]); + inputlist[0] = new_datum(BUILTIN_TYPE_YESNO, 2, 0, worker_entry->instance->def->program); + datum_set_yesno(inputlist[0], DATUM_NO); + return 0; + } +} + + + +void vis_window_closed(datum * window_datum) +{ + datum * params[1]; + queue_entry * temp; + vis_window_shown * window = (vis_window_shown *)(window_datum->c.generic.data); + + VIS_EnterCriticalSection(window->lock); + window->is_open = FALSE; + //window->wind = NULL; + temp = window->wait_entry; + window->wait_entry = NULL; + VIS_LeaveCriticalSection(window->lock); + release_ref(window_datum); + if(temp) + { + //TODO send YESNO output + params[0] = new_datum(BUILTIN_TYPE_YESNO, 2, 0, temp->instance->def->program); + datum_set_yesno(params[0], DATUM_YES); + process_outputs(params, temp->worker_num, temp->instance); + //worker_complete(*temp); + cleanup_check(*temp); + free(temp); + } + +} + +void widget_new(datum ** inputlist, int type, program * prog) +{ + vis_widget * widget; + datum * output = new_datum(type, 1, sizeof(vis_widget), prog); + widget = (vis_widget *)(output->c.generic.data); + widget->label = inputlist[0]; + widget->width = inputlist[1]->c.real; + release_ref(inputlist[1]); + widget->height = inputlist[2]->c.real; + release_ref(inputlist[2]); + widget->handler_dict = create_dict(prog); + widget->value = NULL; + DEBUGPRINTF("widget_new: type = %d, handler_dict = %X\n", type, widget->handler_dict); + inputlist[0] = output; +} + +int vis_button_new(datum ** inputlist, queue_entry * worker_entry) +{ + widget_new(inputlist, BUILTIN_TYPE_BUTTON, worker_entry->instance->def->program); + return 0; +} + +int vis_button_set_handler(datum ** inputlist, queue_entry * workere_entry) +{ + vis_widget * widget; + datum * params[3]; + inputlist[0] = copy_datum(inputlist[0], 0); + widget = (vis_widget *)(inputlist[0]->c.generic.data); + params[0] = widget->handler_dict; + params[1] = inputlist[1]; + params[2] = inputlist[2]; + //DEBUGPUTS("\n\nvis_button_set_handler vis_dict_set\n"); + vis_dict_set(params, NULL); + DEBUGPUTS("after vis_dict_set\n\n\n"); + widget->handler_dict = params[0]; + return 0; +} + +int vis_inputbox_new(datum ** inputlist, queue_entry * worker_entry) +{ + vis_widget * widget; + datum * output = new_datum(BUILTIN_TYPE_INPUTBOX, 1, sizeof(vis_widget), worker_entry->instance->def->program); + widget = (vis_widget *)(output->c.generic.data); + widget->value = inputlist[0]; + widget->width = inputlist[1]->c.real; + release_ref(inputlist[1]); + widget->height = inputlist[2]->c.real; + release_ref(inputlist[2]); + widget->label = NULL; + widget->handler_dict = NULL; + widget->flags = 0; + inputlist[0] = output; + return 0; +} + +int vis_inputbox_settype(datum ** inputlist, queue_entry * worker_entry) +{ + vis_widget * widget; + inputlist[0] = copy_datum(inputlist[0], 0); + widget = (vis_widget *)(inputlist[0]->c.generic.data); + if(!strcmp((char *)(inputlist[1]->c.generic.data), "multiline")) + widget->flags = 1; + else if(!strcmp((char *)(inputlist[1]->c.generic.data), "numeric")) + widget->flags = 2; + else if(!strcmp((char *)(inputlist[1]->c.generic.data), "password")) + widget->flags = 3; + else if(!strcmp((char *)(inputlist[1]->c.generic.data), "read only")) + widget->flags = 4; + else + widget->flags = 0; + return 0; +} + +int vis_customwidget_new(datum ** inputlist, queue_entry * worker_entry) +{ + widget_new(inputlist, BUILTIN_TYPE_CUSTOM_WIDGET, worker_entry->instance->def->program); + return 0; +} + + +int vis_checkbox_new(datum ** params, queue_entry * entry) +{ + vis_widget * widget; + widget_new(params, BUILTIN_TYPE_CHECKBOX, entry->instance->def->program); + widget = params[0]->c.generic.data; + widget->value = params[3]; + return 0; +} + +int vis_dropdown_new(datum ** params, queue_entry * entry) +{ + vis_widget * widget; + widget_new(params, BUILTIN_TYPE_DROPDOWN, entry->instance->def->program); + widget = params[0]->c.generic.data; + widget->selected_index = -1; + return 0; +} + +int vis_dropdown_settext(datum ** params, queue_entry * entry) +{ + vis_widget * widget; + params[0] = copy_datum(params[0], 0); + widget = params[0]->c.generic.data; + widget->selected_index = -1; + release_ref(widget->value); + widget->value = params[1]; + return 0; +} + +int vis_dropdown_select(datum ** params, queue_entry * entry) +{ + vis_widget * widget; + params[0] = copy_datum(params[0], 0); + widget = params[0]->c.generic.data; + release_ref(widget->value); + widget->value = NULL; + widget->selected_index = params[1]->c.integers.num_a; + release_ref(params[1]); + return 0; +} + + + + + + + + + + + + +