summaryrefslogtreecommitdiffstats
path: root/Smoke/gtk.c
diff options
context:
space:
mode:
authorOliver Schinagl <oliver@schinagl.nl>2007-11-28 13:05:19 (GMT)
committerOliver Schinagl <oliver@schinagl.nl>2007-11-28 13:05:19 (GMT)
commitb7797f2d2229b7ac0837b642d7ead82096ddb147 (patch)
tree50c5e26d80aba9dba5269757d2e52b0bcb29f969 /Smoke/gtk.c
parent3b1c743de30bf7924bef1cc234f5326aa49804b0 (diff)
download2iv35-b7797f2d2229b7ac0837b642d7ead82096ddb147.zip
2iv35-b7797f2d2229b7ac0837b642d7ead82096ddb147.tar.gz
2iv35-b7797f2d2229b7ac0837b642d7ead82096ddb147.tar.bz2
Merged version
Diffstat (limited to 'Smoke/gtk.c')
-rw-r--r--Smoke/gtk.c556
1 files changed, 418 insertions, 138 deletions
diff --git a/Smoke/gtk.c b/Smoke/gtk.c
index db4204a..040ef84 100644
--- a/Smoke/gtk.c
+++ b/Smoke/gtk.c
@@ -59,7 +59,7 @@
*** area, plus the default title of the window.
***/
#define DEFAULT_WIDTH 800
-#define DEFAULT_HEIGHT 600
+#define DEFAULT_HEIGHT 800
#define DEFAULT_TITLE "2iv35 \"Smoke\" by Wilrik & Oliver"
#define TIMEOUT_INTERVAL 10
@@ -71,8 +71,6 @@
static gboolean animate = TRUE;
-int winWidth, winHeight; //size of the graphics window, in pixels
-
/**************************************************************************
* The following section contains the function prototype declarations.
@@ -100,7 +98,7 @@ static GtkWidget *create_window (GdkGLConfig *glconfig);
***/
static void
realize (GtkWidget *widget,
- gpointer data)
+ gpointer data)
{
GdkGLContext *glcontext = gtk_widget_get_gl_context (widget);
GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (widget);
@@ -125,8 +123,8 @@ realize (GtkWidget *widget,
***/
static gboolean
configure_event (GtkWidget *widget,
- GdkEventConfigure *event,
- gpointer data)
+ GdkEventConfigure *event,
+ gpointer data)
{
GdkGLContext *glcontext = gtk_widget_get_gl_context (widget);
GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (widget);
@@ -141,13 +139,16 @@ configure_event (GtkWidget *widget,
return FALSE;
/*** Fill in the details here. ***/
+
glViewport (0, 0, w, h);
+// fluids
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);
winWidth = w;
winHeight = h;
+// endf
gdk_gl_drawable_gl_end (gldrawable);
/*** OpenGL END ***/
@@ -162,13 +163,13 @@ configure_event (GtkWidget *widget,
***/
static gboolean
expose_event (GtkWidget *widget,
- GdkEventExpose *event,
- gpointer data)
+ GdkEventExpose *event,
+ gpointer data)
{
GdkGLContext *glcontext = gtk_widget_get_gl_context (widget);
GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (widget);
- //g_print ("%s: \"expose_event\"\n", gtk_widget_get_name (widget));
+// g_print ("%s: \"expose_event\"\n", gtk_widget_get_name (widget));
/*** OpenGL BEGIN ***/
if (!gdk_gl_drawable_gl_begin (gldrawable, glcontext))
@@ -177,12 +178,12 @@ expose_event (GtkWidget *widget,
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
/*** Fill in the details here. ***/
+ // fluids
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
- set_forces();
- solve(DIM, vx, vy, vx0, vy0, visc, dt);
- diffuse_matter(DIM, vx, vy, rho, rho0, dt);
+ calculate_one_simulation_step();
visualize();
+ // endf
/* Swap buffers */
if (gdk_gl_drawable_is_double_buffered (gldrawable))
@@ -204,7 +205,7 @@ expose_event (GtkWidget *widget,
static gboolean
timeout (GtkWidget *widget)
{
- //g_print (".");
+// g_print (".");
/*** Fill in the details here ***/
@@ -223,7 +224,7 @@ timeout (GtkWidget *widget)
***/
static void
unrealize (GtkWidget *widget,
- gpointer data)
+ gpointer data)
{
GdkGLContext *glcontext = gtk_widget_get_gl_context (widget);
GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (widget);
@@ -246,59 +247,17 @@ unrealize (GtkWidget *widget,
***/
static gboolean
motion_notify_event (GtkWidget *widget,
- GdkEventMotion *event,
- gpointer data)
+ GdkEventMotion *event,
+ gpointer data)
{
+// g_print ("%s: \"motion_notify_event\": button", gtk_widget_get_name (widget));
+
/*** Fill in the details here. ***/
- int mx, my, xi,yi,X,Y; double dx, dy, len;
- int clamp_scaled_min, clamp_scaled_max;
- static int lmx=0,lmy=0; //remembers last mouse location
-
- mx = (int)event->x;
- my = (int)event->y;
-
- /* Density calculations etc are only computed on area's below the slider */
- if (my >25) {
- // Compute the array index that corresponds to the cursor location
- xi = (int)clamp((double)(DIM + 1) * ((double)mx / (double)winWidth));
- yi = (int)clamp((double)(DIM + 1) * ((double)(winHeight - my) / (double)winHeight));
-
- X = xi; Y = yi;
-
- if (X > (DIM - 1)) X = DIM - 1; if (Y > (DIM - 1)) Y = DIM - 1;
- if (X < 0) X = 0; if (Y < 0) Y = 0;
-
- // Add force at the cursor location
- my = winHeight - my;
- dx = mx - lmx; dy = my - lmy;
- len = sqrt(dx * dx + dy * dy);
- if (len != 0.0) { dx *= 0.1 / len; dy *= 0.1 / len; }
- fx[Y * DIM + X] += dx;
- fy[Y * DIM + X] += dy;
- rho[Y * DIM + X] = 10.0f;
- lmx = mx; lmy = my;
- } else {
- switch (active_slider) {
- case MOUSE_SCALE_MIN:
- scale_min = (float)mx /winWidth;
- break;
- case MOUSE_SCALE_MAX:
- scale_max = (float)mx /winWidth;
- break;
- case MOUSE_CLAMP_MIN:
- clamp_min = (float)mx /winWidth;
- break;
- case MOUSE_CLAMP_MAX:
- clamp_max = (float)mx /winWidth;
- break;
- case MOUSE_SMOKE:
- default:
- break;
- }
- }
if (event->state & GDK_BUTTON1_MASK)
{
+// g_print (" 1");
+ drag((int)event->x, (int)event->y);
}
if (event->state & GDK_BUTTON2_MASK)
@@ -311,6 +270,8 @@ motion_notify_event (GtkWidget *widget,
g_print (" 3");
}
+// g_print ("\n");
+
return FALSE;
}
@@ -321,40 +282,18 @@ motion_notify_event (GtkWidget *widget,
***/
static gboolean
button_press_event (GtkWidget *widget,
- GdkEventButton *event,
- gpointer data)
+ GdkEventButton *event,
+ gpointer data)
{
g_print ("%s: \"button_press_event\": ", gtk_widget_get_name (widget));
if (event->button == 1)
{
/*** Fill in the details here. ***/
-
- /* First check wether we are on the top half, or bottom half of the bar, if neither then
- * the mouseinput is for the smoke
- */
- if (event->y <25) {
- /* Click received on button bar */
- if (event->y <13) {
- /* Upper half */
- /* check wether mx is min or max slider */
- if (event->x <(rescale_to_winwidth(scale_min +((scale_max - scale_min) /2)))) {
- active_slider = MOUSE_SCALE_MIN;
- } else if (event->x >(rescale_to_winwidth(scale_max -((scale_max - scale_min) /2)))) {
- active_slider = MOUSE_SCALE_MAX;
- }
- } else {
- /* Bottom half */
- /* check wether mx is min or max slider */
- if (event->x <(rescale_to_winwidth(clamp_min +((clamp_max - clamp_min) /2)))) {
- active_slider = MOUSE_CLAMP_MIN;
- } else if (event->x >(rescale_to_winwidth(clamp_max -((clamp_max - clamp_min) /2)))) {
- active_slider = MOUSE_CLAMP_MAX;
- }
- }
- } else {
- active_slider = MOUSE_SMOKE;
- }
+// g_print ("button 1\n");
+ // fluids
+ click(1, 1, (int)event->x, (int)event->y);
+ // endf
return TRUE;
}
@@ -375,8 +314,8 @@ button_press_event (GtkWidget *widget,
/* For popup menu. */
static gboolean
button_press_event_popup_menu (GtkWidget *widget,
- GdkEventButton *event,
- gpointer data)
+ GdkEventButton *event,
+ gpointer data)
{
g_print ("%s: \"button_press_event_popup\": ", gtk_widget_get_name (widget));
@@ -401,9 +340,11 @@ button_press_event_popup_menu (GtkWidget *widget,
***/
static gboolean
key_press_event (GtkWidget *widget,
- GdkEventKey *event,
- gpointer data)
+ GdkEventKey *event,
+ gpointer data)
{
+// g_print ("%s: \"key_press_event\": ", gtk_widget_get_name (widget));
+
switch (event->keyval)
{
/*** Fill in the details here. ***/
@@ -437,13 +378,11 @@ key_press_event (GtkWidget *widget,
break;
case GDK_x:
- draw_smoke = 1 -draw_smoke;
- if (!draw_smoke) { draw_smoke = 1; }
+ toggle_smoke_usage();
break;
case GDK_y:
- draw_vecs = 1 -draw_vecs;
- if (!draw_vecs) { draw_vecs = 1; }
+ toggle_glyph_usage();
break;
case GDK_m:
@@ -451,14 +390,18 @@ key_press_event (GtkWidget *widget,
break;
case GDK_a:
+// g_print ("a key\n");
toggle_animation (widget);
break;
+ case GDK_q:
case GDK_Escape:
+// g_print ("Escape key\n");
gtk_main_quit ();
break;
default:
+// g_print("\n");
return FALSE;
}
@@ -503,8 +446,8 @@ timeout_remove (GtkWidget *widget)
***/
static gboolean
map_event (GtkWidget *widget,
- GdkEvent *event,
- gpointer data)
+ GdkEvent *event,
+ gpointer data)
{
g_print ("%s: \"map_event\":\n", gtk_widget_get_name (widget));
if (animate)
@@ -535,15 +478,15 @@ unmap_event (GtkWidget *widget,
***/
static gboolean
visibility_notify_event (GtkWidget *widget,
- GdkEventVisibility *event,
- gpointer data)
+ GdkEventVisibility *event,
+ gpointer data)
{
if (animate)
{
if (event->state == GDK_VISIBILITY_FULLY_OBSCURED)
- timeout_remove (widget);
+ timeout_remove (widget);
else
- timeout_add (widget);
+ timeout_add (widget);
}
return TRUE;
@@ -593,26 +536,278 @@ create_popup_menu (GtkWidget *drawing_area)
menu_item = gtk_menu_item_new_with_label ("Toggle Animation");
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
g_signal_connect_swapped (G_OBJECT (menu_item), "activate",
- G_CALLBACK (toggle_animation), drawing_area);
+ G_CALLBACK (toggle_animation), drawing_area);
gtk_widget_show (menu_item);
/* Toggle glyphs */
- menu_item = gtk_menu_item_new_with_label ("Glyphs");
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
- g_signal_connect_swapped (G_OBJECT (menu_item), "activate",
- G_CALLBACK (set_glyph_usage), drawing_area);
- gtk_widget_show (menu_item);
+// menu_item = gtk_menu_item_new_with_label ("Glyphs");
+// gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
+// g_signal_connect_swapped (G_OBJECT (menu_item), "activate",
+// G_CALLBACK (set_glyph_usage), drawing_area);
+// gtk_widget_show (menu_item);
/* Quit */
menu_item = gtk_menu_item_new_with_label ("Quit");
gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
g_signal_connect (G_OBJECT (menu_item), "activate",
- G_CALLBACK (gtk_main_quit), NULL);
+ G_CALLBACK (gtk_main_quit), NULL);
gtk_widget_show (menu_item);
-
+
return menu;
}
+void show_settings(GtkWidget *notebook)
+{
+
+}
+
+/*
+ * Draw main notebook page
+ */
+GtkWidget *create_main_page(void)
+{
+ /* in reality a page is really just a vbox filled with other widgets
+ */
+ GtkWidget *page;
+ GtkWidget *frame;
+ GtkWidget *box;
+ GtkWidget *button;
+ GSList *dataset_group;
+
+ page = gtk_vbox_new(FALSE, 0);
+
+
+ box = gtk_vbox_new(FALSE, 0);
+ button = gtk_check_button_new_with_label("Draw Smoke");
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE);
+ g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(toggle_smoke_usage), NULL);
+ gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+ button = gtk_check_button_new_with_label("Draw Glyphs");
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
+ g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(toggle_glyph_usage), NULL);
+ gtk_box_pack_start (GTK_BOX(box), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+
+ gtk_box_pack_start (GTK_BOX(page), box, FALSE, TRUE, 0);
+ gtk_widget_show(box);
+
+// frame = gtk_frame_new("XXX");
+// gtk_box_pack_start (GTK_BOX(page), frame, TRUE, TRUE, 0);
+// gtk_widget_show(frame);
+
+ frame = gtk_frame_new("Dataset");
+
+ box = gtk_hbox_new(FALSE, 0);
+
+ button = gtk_radio_button_new_with_label (NULL, "Rho");
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
+ g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(select_dataset), (gpointer)DATASET_RHO);
+ gtk_box_pack_start(GTK_BOX(box), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+
+ dataset_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button));
+
+ button = gtk_radio_button_new_with_label(dataset_group, "Velocity");
+ g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(select_dataset), (gpointer)DATASET_VEL);
+ gtk_box_pack_start(GTK_BOX(box), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+
+ button = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(button), "Force");
+ g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(select_dataset), (gpointer)DATASET_FORCE);
+ gtk_box_pack_start(GTK_BOX(box), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+
+ gtk_container_add(GTK_CONTAINER(frame), box);
+ gtk_widget_show(box);
+
+ gtk_box_pack_start (GTK_BOX(page), frame, FALSE, TRUE, 0);
+ gtk_widget_show(frame);
+
+
+ return page;
+}
+
+/*
+ * Draw colormap notebook page
+ */
+GtkWidget *create_colormap_page(void)
+{
+ /* in reality a page is really just a vbox filled with other widgets
+ */
+ GtkWidget *page;
+ GtkWidget *frame;
+ GtkWidget *box;
+ GtkWidget *button;
+ GtkWidget *combo;
+ GList *glist;
+
+ glist = NULL;
+
+ page = gtk_vbox_new(FALSE, 0);
+
+ frame = gtk_frame_new("Scaling & Clamping");
+
+ box = gtk_vbox_new(FALSE, 0);
+
+ button = gtk_check_button_new_with_label("Scaling");
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE);
+ g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(toggle_autoscale), NULL);
+ gtk_box_pack_start(GTK_BOX(box), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+
+ button = gtk_check_button_new_with_label("Clamping");
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE);
+ g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(toggle_clamping), NULL);
+ gtk_box_pack_start(GTK_BOX(box), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+
+ gtk_container_add(GTK_CONTAINER(frame), box);
+ gtk_widget_show(box);
+
+ gtk_box_pack_start (GTK_BOX(page), frame, FALSE, TRUE, 0);
+
+ gtk_widget_show(frame);
+
+
+ frame = gtk_frame_new("Colormap");
+
+ box = gtk_hbox_new(FALSE, 0);
+
+ combo = gtk_combo_new();
+// gtk_entry_set_text (GTK_ENTRY(GTK_COMBO(combo)->entry), "Aap");
+
+ glist = g_list_append(glist, "String 1");
+ glist = g_list_append(glist, "String 2");
+ glist = g_list_append(glist, "String 3");
+ glist = g_list_append(glist, "String 4");
+
+// free(glist);
+ gtk_combo_set_popdown_strings (GTK_COMBO (combo), glist);
+
+ gtk_box_pack_start(GTK_BOX(box), combo, FALSE, TRUE, 0);
+ gtk_widget_show(combo);
+
+ gtk_container_add(GTK_CONTAINER(frame), box);
+ gtk_widget_show(box);
+
+ gtk_box_pack_start(GTK_BOX(page), frame, FALSE, TRUE, 0);
+
+ gtk_widget_show(frame);
+
+
+ return page;
+}
+
+/*
+ * Draw glyph notebook page
+ */
+GtkWidget *create_glyph_page(void)
+{
+ /* in reality a page is really just a vbox filled with other widgets
+ */
+ GtkWidget *page;
+ GtkWidget *frame;
+ GtkWidget *box;
+ GtkWidget *button;
+ GSList *dataset_group;
+
+ page = gtk_vbox_new(FALSE, 0);
+
+ frame = gtk_frame_new("Scalarset");
+
+ box = gtk_hbox_new(FALSE, 0);
+
+ button = gtk_radio_button_new_with_label (NULL, "Rho");
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
+ g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(set_glyph_scalar), (gpointer)SCALAR_RHO);
+ gtk_box_pack_start(GTK_BOX(box), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+
+ dataset_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button));
+
+ button = gtk_radio_button_new_with_label(dataset_group, "Velocity");
+ g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(set_glyph_scalar), (gpointer)SCALAR_VEL);
+ gtk_box_pack_start(GTK_BOX(box), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+
+ button = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(button), "Force");
+ g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(set_glyph_scalar), (gpointer)SCALAR_FORCE);
+ gtk_box_pack_start(GTK_BOX(box), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+
+ gtk_container_add(GTK_CONTAINER(frame), box);
+ gtk_widget_show(box);
+
+ gtk_box_pack_start (GTK_BOX(page), frame, FALSE, TRUE, 0);
+ gtk_widget_show(frame);
+
+ frame = gtk_frame_new("Vectorset");
+
+ box = gtk_hbox_new(FALSE, 0);
+
+ button = gtk_radio_button_new_with_label(NULL, "Velocity");
+ g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(set_glyph_vector), (gpointer)VECTOR_VEL);
+ gtk_box_pack_start(GTK_BOX(box), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+
+ dataset_group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button));
+
+ button = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(button), "Force");
+ g_signal_connect (G_OBJECT(button), "clicked", G_CALLBACK(set_glyph_vector), (gpointer)VECTOR_FORCE);
+ gtk_box_pack_start(GTK_BOX(box), button, TRUE, TRUE, 0);
+ gtk_widget_show(button);
+
+ gtk_container_add(GTK_CONTAINER(frame), box);
+ gtk_widget_show(box);
+
+ gtk_box_pack_start (GTK_BOX(page), frame, FALSE, TRUE, 0);
+ gtk_widget_show(frame);
+
+ return page;
+}
+
+/*
+ * Draw divergence notebook page
+ */
+GtkWidget *create_divergence_page(void)
+{
+ /* in reality a page is really just a vbox filled with other widgets
+ */
+ GtkWidget *page;
+
+ page = gtk_vbox_new(FALSE, 0);
+
+ return page;
+}
+
+/*
+ * Draw isolines notebook page
+ */
+GtkWidget *create_isolines_page(void)
+{
+ /* in reality a page is really just a vbox filled with other widgets
+ */
+ GtkWidget *page;
+
+ page = gtk_vbox_new(FALSE, 0);
+
+ return page;
+}
+/*
+ * Draw height plots notebook page
+ */
+GtkWidget *create_height_plots_page(void)
+{
+ /* in reality a page is really just a vbox filled with other widgets
+ */
+ GtkWidget *page;
+
+ page = gtk_vbox_new(FALSE, 0);
+
+ return page;
+}
+
/***
*** Creates the simple application window with one
*** drawing area that has an OpenGL-capable visual.
@@ -625,6 +820,7 @@ create_window (GdkGLConfig *glconfig)
GtkWidget *drawing_area;
GtkWidget *menu;
GtkWidget *button;
+ GtkWidget *settings_notebook, *notebook_page, *notebook_page_label;
/*
* Top-level window.
@@ -638,7 +834,7 @@ create_window (GdkGLConfig *glconfig)
/* Connect signal handlers to the window */
g_signal_connect (G_OBJECT (window), "delete_event",
- G_CALLBACK (gtk_main_quit), NULL);
+ G_CALLBACK (gtk_main_quit), NULL);
/*
* hBox.
@@ -657,43 +853,43 @@ create_window (GdkGLConfig *glconfig)
/* Set OpenGL-capability to the widget */
gtk_widget_set_gl_capability (drawing_area,
- glconfig,
- NULL,
- TRUE,
- GDK_GL_RGBA_TYPE);
+ glconfig,
+ NULL,
+ TRUE,
+ GDK_GL_RGBA_TYPE);
gtk_widget_add_events (drawing_area,
- GDK_BUTTON1_MOTION_MASK |
- GDK_BUTTON2_MOTION_MASK |
- GDK_BUTTON_PRESS_MASK |
- GDK_VISIBILITY_NOTIFY_MASK);
+ GDK_BUTTON1_MOTION_MASK |
+ GDK_BUTTON2_MOTION_MASK |
+ GDK_BUTTON_PRESS_MASK |
+ GDK_VISIBILITY_NOTIFY_MASK);
/* Connect signal handlers to the drawing area */
g_signal_connect_after (G_OBJECT (drawing_area), "realize",
G_CALLBACK (realize), NULL);
g_signal_connect (G_OBJECT (drawing_area), "configure_event",
- G_CALLBACK (configure_event), NULL);
+ G_CALLBACK (configure_event), NULL);
g_signal_connect (G_OBJECT (drawing_area), "expose_event",
- G_CALLBACK (expose_event), NULL);
+ G_CALLBACK (expose_event), NULL);
g_signal_connect (G_OBJECT (drawing_area), "unrealize",
- G_CALLBACK (unrealize), NULL);
+ G_CALLBACK (unrealize), NULL);
g_signal_connect (G_OBJECT (drawing_area), "motion_notify_event",
- G_CALLBACK (motion_notify_event), NULL);
+ G_CALLBACK (motion_notify_event), NULL);
g_signal_connect (G_OBJECT (drawing_area), "button_press_event",
- G_CALLBACK (button_press_event), NULL);
+ G_CALLBACK (button_press_event), NULL);
/* key_press_event handler for top-level window */
g_signal_connect_swapped (G_OBJECT (window), "key_press_event",
- G_CALLBACK (key_press_event), drawing_area);
+ G_CALLBACK (key_press_event), drawing_area);
/* For timeout function. */
g_signal_connect (G_OBJECT (drawing_area), "map_event",
- G_CALLBACK (map_event), NULL);
+ G_CALLBACK (map_event), NULL);
g_signal_connect (G_OBJECT (drawing_area), "unmap_event",
- G_CALLBACK (unmap_event), NULL);
+ G_CALLBACK (unmap_event), NULL);
g_signal_connect (G_OBJECT (drawing_area), "visibility_notify_event",
- G_CALLBACK (visibility_notify_event), NULL);
+ G_CALLBACK (visibility_notify_event), NULL);
gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
@@ -706,8 +902,9 @@ create_window (GdkGLConfig *glconfig)
menu = create_popup_menu (drawing_area);
g_signal_connect_swapped (G_OBJECT (drawing_area), "button_press_event",
- G_CALLBACK (button_press_event_popup_menu), menu);
+ G_CALLBACK (button_press_event_popup_menu), menu);
+#if 0
/*
* Simple quit button.
*/
@@ -720,6 +917,89 @@ create_window (GdkGLConfig *glconfig)
gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
gtk_widget_show (button);
+#endif
+
+ /*
+ * Settings button.
+ */
+
+ button = gtk_button_new_with_label("<<");
+
+ g_signal_connect(G_OBJECT(button), "clicked",
+ G_CALLBACK (show_settings), settings_notebook);
+
+ gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+
+ gtk_widget_show(button);
+
+
+ /*
+ * Draw the options notebook
+ */
+
+ settings_notebook = gtk_notebook_new();
+
+ gtk_notebook_set_tab_pos(settings_notebook, GTK_POS_BOTTOM);
+ gtk_notebook_set_scrollable(settings_notebook, TRUE);
+
+ gtk_box_pack_start(GTK_BOX(hbox), settings_notebook, FALSE, FALSE, 0);
+
+ gtk_widget_show(settings_notebook);
+
+ notebook_page_label = gtk_label_new("Main");
+ gtk_widget_show(notebook_page_label);
+
+ notebook_page = create_main_page();
+ gtk_container_add(GTK_CONTAINER(window), notebook_page);
+ gtk_widget_show(notebook_page);
+
+ gtk_notebook_append_page(settings_notebook, notebook_page, notebook_page_label);
+
+ notebook_page_label = gtk_label_new("Colormaps");
+ gtk_widget_show(notebook_page_label);
+
+ notebook_page = create_colormap_page();
+ gtk_container_add(GTK_CONTAINER(window), notebook_page);
+ gtk_widget_show(notebook_page);
+
+ gtk_notebook_append_page(settings_notebook, notebook_page, notebook_page_label);
+
+ notebook_page_label = gtk_label_new("Glyphs");
+ gtk_widget_show(notebook_page_label);
+
+ notebook_page = create_glyph_page();
+ gtk_container_add(GTK_CONTAINER(window), notebook_page);
+ gtk_widget_show(notebook_page);
+
+ gtk_notebook_append_page(settings_notebook, notebook_page, notebook_page_label);
+
+ notebook_page_label = gtk_label_new("Divergence");
+ gtk_widget_show(notebook_page_label);
+
+ notebook_page = create_divergence_page();
+ gtk_container_add(GTK_CONTAINER(window), notebook_page);
+ gtk_widget_show(notebook_page);
+
+ gtk_notebook_append_page(settings_notebook, notebook_page, notebook_page_label);
+
+ notebook_page_label = gtk_label_new("Isolines");
+ gtk_widget_show(notebook_page_label);
+
+ notebook_page = create_isolines_page();
+ gtk_container_add(GTK_CONTAINER(window), notebook_page);
+ gtk_widget_show(notebook_page);
+
+ gtk_notebook_append_page(settings_notebook, notebook_page, notebook_page_label);
+
+ notebook_page_label = gtk_label_new("Height plots");
+ gtk_widget_show(notebook_page_label);
+
+ notebook_page = create_height_plots_page();
+ gtk_container_add(GTK_CONTAINER(window), notebook_page);
+ gtk_widget_show(notebook_page);
+
+ gtk_notebook_append_page(settings_notebook, notebook_page, notebook_page_label);
+
return window;
}
@@ -739,8 +1019,8 @@ configure_gl (void)
/* Try double-buffered visual */
glconfig = gdk_gl_config_new_by_mode (GDK_GL_MODE_RGB |
- GDK_GL_MODE_DEPTH |
- GDK_GL_MODE_DOUBLE);
+ GDK_GL_MODE_DEPTH |
+ GDK_GL_MODE_DOUBLE);
if (glconfig == NULL)
{
g_print ("\n*** Cannot find the double-buffered visual.\n");
@@ -748,12 +1028,12 @@ configure_gl (void)
/* Try single-buffered visual */
glconfig = gdk_gl_config_new_by_mode (GDK_GL_MODE_RGB |
- GDK_GL_MODE_DEPTH);
+ GDK_GL_MODE_DEPTH);
if (glconfig == NULL)
- {
- g_print ("*** No appropriate OpenGL-capable visual found.\n");
- exit (1);
- }
+ {
+ g_print ("*** No appropriate OpenGL-capable visual found.\n");
+ exit (1);
+ }
}
return glconfig;