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;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+