On Windows, the main loop runs right after the idle source is added.
This causes the callback queue_draw function to assign a dead ID which
leads to the viewer never refreshing.
static gboolean _grits_viewer_queue_draw_cb(gpointer _viewer)
{
GritsViewer *viewer = _viewer;
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;
gtk_widget_queue_draw(GTK_WIDGET(viewer));
viewer->draw_source = 0;
+ g_mutex_unlock(&viewer->draw_lock);
*/
void grits_viewer_queue_draw(GritsViewer *viewer)
{
*/
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);
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;
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_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_debug("GritsViewer: dispose");
GritsViewer *viewer = GRITS_VIEWER(gobject);
+ g_mutex_lock(&viewer->draw_lock);
if (viewer->draw_source)
g_source_remove(viewer->draw_source);
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");
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");
}
G_OBJECT_CLASS(grits_viewer_parent_class)->finalize(gobject);
g_debug("GritsViewer: finalize - done");
}
/* For queue_draw */
guint draw_source;
/* For queue_draw */
guint draw_source;
};
struct _GritsViewerClass {
};
struct _GritsViewerClass {