diff src/rootvis/config_frontend.c @ 900:d985f0dcdeb0 trunk

[svn] - add a starting point for xmms-rootvis port. giacomo will need to finish this up, as my XLib skills are not enough at this time.
author nenolod
date Mon, 26 Mar 2007 01:19:26 -0700
parents
children 30e515b6e651
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/rootvis/config_frontend.c	Mon Mar 26 01:19:26 2007 -0700
@@ -0,0 +1,210 @@
+#include <stdarg.h>
+#include <string.h>
+
+#include <rootvis.h>
+
+#include <config_frontend.h>
+
+extern GtkWidget *frontend_create_channel(int channel);
+extern GtkWidget *frontend_create_main(void);
+extern void frontend_create_colorpicker(struct config_value*);
+
+void signal_revert(GtkWidget *togglebutton, gpointer data)
+{
+	config_revert(GPOINTER_TO_INT(data));
+}
+
+void signal_save(GtkWidget *togglebutton, gpointer data)
+{
+	config_save(GPOINTER_TO_INT(data));
+}
+
+void signal_show(GtkWidget *togglebutton, gpointer data)
+{
+	config_show(GPOINTER_TO_INT(data));
+}
+
+void signal_hide(GtkWidget *togglebutton, gpointer data)
+{
+	config_hide(GPOINTER_TO_INT(data));
+}
+
+void signal_toggle_colorselector(GtkWidget *w, struct config_value *cvar)
+{
+	struct rootvis_colorsel* colorsel = cvar->valc.frontend;
+	if (colorsel->window == NULL)
+		frontend_create_colorpicker(cvar);
+	gtk_widget_show(colorsel->window);
+}
+
+void signal_colorselector_ok(GtkWidget *w, struct config_value *cvar)
+{
+	struct rootvis_colorsel* colorsel = cvar->valc.frontend;
+	gtk_color_selection_get_color(GTK_COLOR_SELECTION(colorsel->color_picker), colorsel->color);
+	memcpy(colorsel->saved_color, colorsel->color, COLORSIZE*sizeof(gdouble));
+	frontend_update_color(cvar, 1);
+	gtk_widget_hide(colorsel->window);
+}
+
+void signal_colorselector_cancel(GtkWidget *w, struct config_value *cvar)
+{
+	struct rootvis_colorsel* colorsel = cvar->valc.frontend;
+	memcpy(colorsel->color, colorsel->saved_color, COLORSIZE*sizeof(gdouble));
+	frontend_update_color(cvar, 1);
+	gtk_widget_destroy(colorsel->window);
+	colorsel->window = NULL;
+}
+
+void signal_colorselector_update(GtkWidget *w, struct config_value *cvar)
+{
+	struct rootvis_colorsel* colorsel = cvar->valc.frontend;
+	gtk_color_selection_get_color(GTK_COLOR_SELECTION(colorsel->color_picker), colorsel->color);
+	frontend_update_color(cvar, 1);
+}
+
+void color_char2double(unsigned char source[4], gdouble dest[4])
+{
+	int i;
+	for (i = 0; i < COLORSIZE; ++i)
+	{
+		dest[i] = (double)source[i] / 255.0;
+	}
+}
+
+void color_double2char(double source[4], unsigned char dest[4])
+{
+	int i;
+	for (i = 0; i < COLORSIZE; ++i)
+	{
+		dest[i] = (int)(source[i] * 255.0);
+	}
+}
+
+// This was ripped from xmms-iris's config.c.
+void frontend_update_color(struct config_value *cvar, int system)
+{
+	struct rootvis_colorsel* colorsel = cvar->valc.frontend;
+	if (system > 0)
+	{
+		threads_lock();
+		color_double2char(colorsel->color, cvar->valc.var);
+		threads_unlock(2);
+	}
+
+	// following is among the dumbest shit I've ever seen. GtkPreview seems to suck a lot!
+	unsigned int i;
+	guchar color_buf[3*30];
+	char red, green, blue;
+	red = colorsel->color[RED]*0xff;
+	green = colorsel->color[GREEN]*0xff;
+	blue = colorsel->color[BLUE]*0xff;
+	for (i = 0; i < 30*3; i += 3) {
+		color_buf[i+RED] = (char) red;
+		color_buf[i+GREEN] = (char) green;
+		color_buf[i+BLUE] = (char) blue;
+	}
+	for (i = 0; i < 30; i++)
+		gtk_preview_draw_row(GTK_PREVIEW(colorsel->preview), color_buf, 0, i, 30);
+	gtk_widget_draw(colorsel->preview, NULL);
+}
+
+void frontend_set_color(struct config_value *cvar)
+{
+	struct rootvis_colorsel* colorsel = cvar->valc.frontend;
+	color_char2double(cvar->valc.var, colorsel->color);
+	memcpy(colorsel->saved_color, colorsel->color, COLORSIZE*sizeof(gdouble));
+}
+
+/* following functions catch signals from the gui widgets */
+
+int signal_window_close(GtkWidget *window, gpointer data)
+{
+	int number = 2;
+	if (window == widgets.window_channel[0]) number = 0;
+	if (window == widgets.window_channel[1]) number = 1;
+	config_hide(number);
+	return TRUE;
+}
+
+void signal_check_toggled(GtkWidget *togglebutton, gpointer data)
+{
+	printf("%s \n", (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(togglebutton))) ? "TRUE" : "FALSE");
+}
+
+void signal_stereo_toggled(GtkWidget *togglebutton, gpointer data)
+{
+	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(togglebutton))) {
+		gtk_label_set_text(widgets.stereo_status[0], "renders left channel");
+		gtk_label_set_text(widgets.stereo_status[1], "renders right channel");
+	} else {
+		gtk_label_set_text(widgets.stereo_status[0], "renders both channels");
+		gtk_label_set_text(widgets.stereo_status[1], "unused / inactive");
+	}
+}
+
+void signal_textentry_changed(GtkWidget *entry, gpointer data)
+{
+}
+
+void config_show_channel(int channel) {
+	if (widgets.window_channel[channel] == NULL) {
+		widgets.window_channel[channel] = frontend_create_channel(channel);
+	} else {
+		print_status("raising channel window");
+		gtk_widget_show(widgets.window_channel[channel]);
+	}
+}
+
+void config_show(int channel) {
+	if (channel == 2)
+	{
+		if (widgets.window_main == NULL) {
+			widgets.window_main = frontend_create_main();
+		} else {
+			print_status("raising windows");
+			gtk_widget_show(widgets.window_main);
+			if (widgets.window_channel[0] != NULL) {
+				gtk_widget_show(widgets.window_channel[0]);
+			}
+			if (widgets.window_channel[1] != NULL) {
+				gtk_widget_show(widgets.window_channel[1]);
+			}
+		}
+	} else config_show_channel(channel);
+}
+
+void config_hide(int number) {
+	/* hide or destroy? if destroy, pointers must be set to NULL */
+	if (number < 2) {
+		if (widgets.window_channel[number] != NULL)
+			gtk_widget_hide(widgets.window_channel[number]);
+		/* widgets.window_channel[number] = NULL; */
+	} else {
+		if (widgets.window_main != NULL)
+			gtk_widget_hide(widgets.window_main);
+		if (widgets.window_channel[0] != NULL)
+			gtk_widget_hide(widgets.window_channel[0]);
+		if (widgets.window_channel[1] != NULL)
+			gtk_widget_hide(widgets.window_channel[1]);
+		widgets.window_main = NULL;
+		widgets.window_channel[0] = NULL;
+		widgets.window_channel[1] = NULL;
+		// THIS SUCKS BEYOND REPAIR!
+	}
+}
+
+void config_set_widgets(int number)
+{
+	if (number < 2) {
+		// set per channel stuff
+	} else {
+		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets.stereo_check), ((conf.stereo>0) ? TRUE : FALSE));
+		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widgets.debug_check), ((conf.debug>0) ? TRUE : FALSE));
+	}
+}
+
+void config_frontend_init(void) {
+	widgets.window_main = NULL;
+	widgets.window_channel[0] = NULL;
+	widgets.window_channel[1] = NULL;
+}