]> Pileus Git - grits/blobdiff - src/gis-viewer.c
Use a different cursor
[grits] / src / gis-viewer.c
index e8759e1cfdc43e9636594aaf46b24a2d19f54d9d..b4e3d822811146c2230165fa87b383089b6677c0 100644 (file)
@@ -102,18 +102,29 @@ static gboolean on_key_press(GisViewer *viewer, GdkEventKey *event, gpointer _)
        double lat, lon, elev, pan;
        gis_viewer_get_location(viewer, &lat, &lon, &elev);
        pan = MIN(elev/(EARTH_R/2), 30);
-       guint kv = event->keyval;
        gdk_threads_leave();
-       if      (kv == GDK_Left  || kv == GDK_h) gis_viewer_pan(viewer,  0,  -pan, 0);
-       else if (kv == GDK_Down  || kv == GDK_j) gis_viewer_pan(viewer, -pan, 0,   0);
-       else if (kv == GDK_Up    || kv == GDK_k) gis_viewer_pan(viewer,  pan, 0,   0);
-       else if (kv == GDK_Right || kv == GDK_l) gis_viewer_pan(viewer,  0,   pan, 0);
-       else if (kv == GDK_minus || kv == GDK_o) gis_viewer_zoom(viewer, 10./9);
-       else if (kv == GDK_plus  || kv == GDK_i) gis_viewer_zoom(viewer, 9./10);
-       else if (kv == GDK_H) gis_viewer_rotate(viewer,  0, 0, -2);
-       else if (kv == GDK_J) gis_viewer_rotate(viewer,  2, 0,  0);
-       else if (kv == GDK_K) gis_viewer_rotate(viewer, -2, 0,  0);
-       else if (kv == GDK_L) gis_viewer_rotate(viewer,  0, 0,  2);
+       switch (event->keyval) {
+       case GDK_Left:  case GDK_h: gis_viewer_pan(viewer,  0,  -pan, 0); break;
+       case GDK_Down:  case GDK_j: gis_viewer_pan(viewer, -pan, 0,   0); break;
+       case GDK_Up:    case GDK_k: gis_viewer_pan(viewer,  pan, 0,   0); break;
+       case GDK_Right: case GDK_l: gis_viewer_pan(viewer,  0,   pan, 0); break;
+       case GDK_minus: case GDK_o: gis_viewer_zoom(viewer, 10./9); break;
+       case GDK_plus:  case GDK_i: gis_viewer_zoom(viewer, 9./10); break;
+       case GDK_H: gis_viewer_rotate(viewer,  0, 0, -2); break;
+       case GDK_J: gis_viewer_rotate(viewer,  2, 0,  0); break;
+       case GDK_K: gis_viewer_rotate(viewer, -2, 0,  0); break;
+       case GDK_L: gis_viewer_rotate(viewer,  0, 0,  2); break;
+       }
+       return FALSE;
+}
+
+static gboolean on_scroll(GisViewer *viewer, GdkEventScroll *event, gpointer _)
+{
+       switch (event->direction) {
+       case GDK_SCROLL_DOWN: gis_viewer_zoom(viewer, 10./9); break;
+       case GDK_SCROLL_UP:   gis_viewer_zoom(viewer, 9./10); break;
+       default: break;
+       }
        return FALSE;
 }
 
@@ -148,21 +159,15 @@ static gboolean on_button_release(GisViewer *viewer, GdkEventButton *event, gpoi
 
 static gboolean on_motion_notify(GisViewer *viewer, GdkEventMotion *event, gpointer _)
 {
-       gdouble x_dist = viewer->drag_x - event->x;
-       gdouble y_dist = viewer->drag_y - event->y;
+       gdouble x = viewer->drag_x - event->x;
+       gdouble y = viewer->drag_y - event->y;
        gdouble lat, lon, elev, scale;
        gis_viewer_get_location(GIS_VIEWER(viewer), &lat, &lon, &elev);
        scale = elev/EARTH_R/15;
        switch (viewer->drag_mode) {
-       case GIS_DRAG_PAN:
-               gis_viewer_pan(viewer, -y_dist*scale, x_dist*scale, 0);
-               break;
-       case GIS_DRAG_ZOOM:
-               gis_viewer_zoom(viewer, pow(2, -y_dist/500));
-               break;
-       case GIS_DRAG_TILT:
-               gis_viewer_rotate(viewer, y_dist/10, 0, x_dist/10);
-               break;
+       case GIS_DRAG_PAN:  gis_viewer_pan(viewer, -y*scale, x*scale, 0); break;
+       case GIS_DRAG_ZOOM: gis_viewer_zoom(viewer, pow(2, -y/500)); break;
+       case GIS_DRAG_TILT: gis_viewer_rotate(viewer, y/10, 0, x/10); break;
        }
        viewer->drag_x = event->x;
        viewer->drag_y = event->y;
@@ -175,6 +180,13 @@ static void on_view_changed(GisViewer *viewer,
        gtk_widget_queue_draw(GTK_WIDGET(viewer));
 }
 
+static void on_realize(GisViewer *viewer)
+{
+       GdkCursor *cursor = gdk_cursor_new(GDK_FLEUR);
+       GdkWindow *window = gtk_widget_get_window(GTK_WIDGET(viewer));
+       gdk_window_set_cursor(window, cursor);
+}
+
 /***********
  * Methods *
  ***********/
@@ -561,6 +573,7 @@ static void gis_viewer_init(GisViewer *viewer)
                        GDK_KEY_PRESS_MASK);
 
        g_signal_connect(viewer, "key-press-event",      G_CALLBACK(on_key_press),      NULL);
+       g_signal_connect(viewer, "scroll-event",         G_CALLBACK(on_scroll),         NULL);
 
        g_signal_connect(viewer, "button-press-event",   G_CALLBACK(on_button_press),   NULL);
        g_signal_connect(viewer, "button-release-event", G_CALLBACK(on_button_release), NULL);
@@ -568,6 +581,8 @@ static void gis_viewer_init(GisViewer *viewer)
 
        g_signal_connect(viewer, "location-changed",     G_CALLBACK(on_view_changed),   NULL);
        g_signal_connect(viewer, "rotation-changed",     G_CALLBACK(on_view_changed),   NULL);
+
+       g_signal_connect(viewer, "realize",              G_CALLBACK(on_realize),        NULL);
 }
 static void gis_viewer_finalize(GObject *gobject)
 {