view window.c @ 187:5e752cf2d6b1

Add versions of compile and ctobin scripts that have desktop notifications
author Mike Pavone <pavone@retrodev.com>
date Fri, 07 Oct 2011 00:11:30 -0700
parents 94c885692eb5
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;
}