static gboolean _grits_viewer_queue_draw_cb(gpointer _viewer)
{
GritsViewer *viewer = _viewer;
+ g_mutex_lock(&viewer->draw_lock);
gtk_widget_queue_draw(GTK_WIDGET(viewer));
viewer->draw_source = 0;
+ g_mutex_unlock(&viewer->draw_lock);
return FALSE;
}
static gboolean on_key_press(GritsViewer *viewer, GdkEventKey *event, gpointer _)
{
g_debug("GritsViewer: on_key_press - key=%x, state=%x, plus=%x",
- event->keyval, event->state, GDK_plus);
+ event->keyval, event->state, GDK_KEY_plus);
double lat, lon, elev, pan;
grits_viewer_get_location(viewer, &lat, &lon, &elev);
pan = MIN(elev/(EARTH_R/2), 30);
switch (event->keyval) {
- case GDK_Left: case GDK_h: grits_viewer_pan(viewer, 0, -pan, 0); break;
- case GDK_Down: case GDK_j: grits_viewer_pan(viewer, -pan, 0, 0); break;
- case GDK_Up: case GDK_k: grits_viewer_pan(viewer, pan, 0, 0); break;
- case GDK_Right: case GDK_l: grits_viewer_pan(viewer, 0, pan, 0); break;
- case GDK_minus: case GDK_o: grits_viewer_zoom(viewer, 10./9); break;
- case GDK_plus: case GDK_i: grits_viewer_zoom(viewer, 9./10); break;
- case GDK_H: grits_viewer_rotate(viewer, 0, 0, -2); break;
- case GDK_J: grits_viewer_rotate(viewer, 2, 0, 0); break;
- case GDK_K: grits_viewer_rotate(viewer, -2, 0, 0); break;
- case GDK_L: grits_viewer_rotate(viewer, 0, 0, 2); break;
+ case GDK_KEY_Left: case GDK_KEY_h: grits_viewer_pan(viewer, 0, -pan, 0); break;
+ case GDK_KEY_Down: case GDK_KEY_j: grits_viewer_pan(viewer, -pan, 0, 0); break;
+ case GDK_KEY_Up: case GDK_KEY_k: grits_viewer_pan(viewer, pan, 0, 0); break;
+ case GDK_KEY_Right: case GDK_KEY_l: grits_viewer_pan(viewer, 0, pan, 0); break;
+ case GDK_KEY_minus: case GDK_KEY_o: grits_viewer_zoom(viewer, 10./9); break;
+ case GDK_KEY_plus: case GDK_KEY_i: grits_viewer_zoom(viewer, 9./10); break;
+ case GDK_KEY_H: grits_viewer_rotate(viewer, 0, 0, -2); break;
+ case GDK_KEY_J: grits_viewer_rotate(viewer, 2, 0, 0); break;
+ case GDK_KEY_K: grits_viewer_rotate(viewer, -2, 0, 0); break;
+ case GDK_KEY_L: grits_viewer_rotate(viewer, 0, 0, 2); break;
}
return FALSE;
}
*/
void grits_viewer_queue_draw(GritsViewer *viewer)
{
+ g_mutex_lock(&viewer->draw_lock);
if (!viewer->draw_source)
viewer->draw_source = g_idle_add_full(G_PRIORITY_HIGH,
_grits_viewer_queue_draw_cb, viewer, NULL);
+ g_mutex_unlock(&viewer->draw_lock);
}
/***********************************
viewer->rotation[1] = 0;
viewer->rotation[2] = 0;
+ g_mutex_init(&viewer->draw_lock);
+
g_object_set(viewer, "can-focus", TRUE, NULL);
gtk_widget_add_events(GTK_WIDGET(viewer),
GDK_BUTTON_PRESS_MASK |
{
g_debug("GritsViewer: dispose");
GritsViewer *viewer = GRITS_VIEWER(gobject);
+ g_mutex_lock(&viewer->draw_lock);
if (viewer->draw_source)
g_source_remove(viewer->draw_source);
+ g_mutex_unlock(&viewer->draw_lock);
G_OBJECT_CLASS(grits_viewer_parent_class)->dispose(gobject);
}
static void grits_viewer_finalize(GObject *gobject)
{
g_debug("GritsViewer: finalize");
+ GritsViewer *viewer = GRITS_VIEWER(gobject);
+ g_mutex_clear(&viewer->draw_lock);
G_OBJECT_CLASS(grits_viewer_parent_class)->finalize(gobject);
g_debug("GritsViewer: finalize - done");
}