More generic use of event.
[familia.git] / src / ui / drawing_area.c
index 491906e9002a7fbfd00e2fe3ca0a45f5d39222c3..16448474091ed73e66c535cb5477e5ef3a713bbd 100644 (file)
@@ -5,6 +5,7 @@
 #include <assert.h>
 
 #include "../debug.h"
+#include "../familia.h"
 #include "drawing_area.h"
 #include "../math/3d.h"
 #include "../graphics/constants.h"
@@ -150,18 +151,46 @@ void drawing_area_unrealize (GtkWidget *widget, gpointer data)
        /* Code */
 }
 
-void drawing_area_event_scroll (GtkWidget *widget, GdkEventScroll *event, gpointer user_data)
+/**
+ * The "scroll-event" signal handler. Responsible for correctly scrolling
+ * drawing area using mouse or touchpad.
+ */
+void drawing_area_event_scroll (GtkWidget *widget,
+                               GdkEvent *event, FamiliaData *data)
 {
+       GtkAdjustment *adjustment = NULL;
+       gdouble value = 0;
+       gdouble step = 0;
+
        assert(event->type == GDK_SCROLL);
 
-       switch(event->direction) {
+       switch(event->scroll.direction) {
                case GDK_SCROLL_UP:
-                       camera_pos_y++;
-                       gtk_widget_queue_draw(widget);
+                       adjustment = data->vadjustment;
+                       step = 1;
                        break;
                case GDK_SCROLL_DOWN:
-                       camera_pos_y--;
-                       gtk_widget_queue_draw(widget);
+                       adjustment = data->vadjustment;
+                       step = -1;
+                       break;
+               case GDK_SCROLL_LEFT:
+                       adjustment = data->hadjustment;
+                       step = -1;
+                       break;
+               case GDK_SCROLL_RIGHT:
+                       adjustment = data->hadjustment;
+                       step = 1;
                        break;
+               default:
+                       break;
+       }
+
+       if (adjustment != NULL) {
+               value = gtk_adjustment_get_value (adjustment);
+               step  = step * gtk_adjustment_get_step_increment(adjustment);
+               value += step;
+
+               gtk_adjustment_set_value (adjustment, value);
+               gtk_adjustment_value_changed (adjustment);
        }
 }