Mercurial > repos > rhope
view window.c @ 3:94c885692eb5
Partial set of fixes and enhancements from Linux box
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 29 Apr 2009 03:21:23 -0400 |
parents | 76568becd6d6 |
children |
line wrap: on
line source
#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 GTK #include "gtk_window.h" VIS_CRITICAL_SECTION(gtk_init_lock); #else #ifdef WIN32 #include "ms_window.h" VIS_CRITICAL_SECTION(hwnd_lock); #endif #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 GTK VIS_InitializeCriticalSection(gtk_init_lock); #else #ifdef WIN32 VIS_InitializeCriticalSection(hwnd_lock); #endif #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); window->menu = NULL; 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; } //Also used for Set Data@Datagrid 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; } int vis_datagrid_new(datum ** inputlist, queue_entry * worker_entry) { widget_new(inputlist, BUILTIN_TYPE_DATAGRID, worker_entry->instance->def->program); return 0; } int vis_menu_new(datum ** inputlist, queue_entry * worker_entry) { vis_menu * menu; inputlist[0] = new_datum(BUILTIN_TYPE_MENU, 1, sizeof(vis_menu), worker_entry->instance->def->program); menu = inputlist[0]->c.generic.data; menu->label_list = create_list(worker_entry->instance->def->program); menu->action_list = create_list(worker_entry->instance->def->program); return 0; } int vis_menu_add_item(datum ** inputlist, queue_entry * worker_entry) { datum * wparams[2]; vis_menu * menu; inputlist[0] = copy_datum(inputlist[0], 0); menu = inputlist[0]->c.generic.data; wparams[0] = menu->label_list; wparams[1] = inputlist[1]; vis_list_append(wparams, worker_entry); menu->label_list = wparams[0]; wparams[0] = menu->action_list; wparams[1] = inputlist[2]; vis_list_append(wparams, worker_entry); menu->action_list = wparams[0]; return 0; } int vis_window_set_menu(datum ** inputlist, queue_entry * worker_entry) { vis_window * window; inputlist[0] = copy_datum(inputlist[0], 0); window = inputlist[0]->c.generic.data; release_ref(window->menu); window->menu = inputlist[1]; return 0; }