+ double lat, lon, elev, pan;
+ gis_viewer_get_location(self, &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(self, 0, -pan, 0);
+ else if (kv == GDK_Down || kv == GDK_j) gis_viewer_pan(self, -pan, 0, 0);
+ else if (kv == GDK_Up || kv == GDK_k) gis_viewer_pan(self, pan, 0, 0);
+ else if (kv == GDK_Right || kv == GDK_l) gis_viewer_pan(self, 0, pan, 0);
+ else if (kv == GDK_minus || kv == GDK_o) gis_viewer_zoom(self, 10./9);
+ else if (kv == GDK_plus || kv == GDK_i) gis_viewer_zoom(self, 9./10);
+ else if (kv == GDK_H) gis_viewer_rotate(self, 0, 0, -2);
+ else if (kv == GDK_J) gis_viewer_rotate(self, 2, 0, 0);
+ else if (kv == GDK_K) gis_viewer_rotate(self, -2, 0, 0);
+ else if (kv == GDK_L) gis_viewer_rotate(self, 0, 0, 2);
+ return FALSE;
+}
+static void on_view_changed(GisViewer *self,
+ gdouble _1, gdouble _2, gdouble _3)
+{
+ gtk_widget_queue_draw(GTK_WIDGET(self));
+}