diff --git a/app/display/gimpdisplay.c b/app/display/gimpdisplay.c index f52c282487..18a049a94a 100644 --- a/app/display/gimpdisplay.c +++ b/app/display/gimpdisplay.c @@ -49,7 +49,7 @@ #include "gimp-intl.h" -#define FLUSH_NOW_TIMEOUT 20 +#define FLUSH_NOW_INTERVAL 20000 /* 20 ms in microseconds */ enum @@ -75,7 +75,7 @@ struct _GimpDisplayPrivate GtkWidget *shell; GSList *update_areas; - guint flush_now_timeout; + GTimeVal last_flush_now; }; #define GIMP_DISPLAY_GET_PRIVATE(display) \ @@ -88,7 +88,6 @@ struct _GimpDisplayPrivate static void gimp_display_progress_iface_init (GimpProgressInterface *iface); -static void gimp_display_dispose (GObject *object); static void gimp_display_set_property (GObject *object, guint property_id, const GValue *value, @@ -140,7 +139,6 @@ gimp_display_class_init (GimpDisplayClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); - object_class->dispose = gimp_display_dispose; object_class->set_property = gimp_display_set_property; object_class->get_property = gimp_display_get_property; @@ -191,20 +189,6 @@ gimp_display_progress_iface_init (GimpProgressInterface *iface) iface->message = gimp_display_progress_message; } -static void -gimp_display_dispose (GObject *object) -{ - GimpDisplayPrivate *private = GIMP_DISPLAY_GET_PRIVATE (object); - - if (private->flush_now_timeout) - { - g_source_remove (private->flush_now_timeout); - private->flush_now_timeout = 0; - } - - G_OBJECT_CLASS (parent_class)->dispose (object); -} - static void gimp_display_set_property (GObject *object, guint property_id, @@ -634,12 +618,6 @@ gimp_display_set_image (GimpDisplay *display, shell = gimp_display_get_shell (display); - if (private->flush_now_timeout) - { - g_source_remove (private->flush_now_timeout); - private->flush_now_timeout = 0; - } - if (private->image) { /* stop any active tool */ @@ -815,18 +793,6 @@ gimp_display_flush_now (GimpDisplay *display) /* private functions */ -static gboolean -gimp_display_flush_now_timeout (GimpDisplay *display) -{ - GimpDisplayPrivate *private = GIMP_DISPLAY_GET_PRIVATE (display); - - private->flush_now_timeout = 0; - - gimp_display_shell_flush (gimp_display_get_shell (display), TRUE); - - return FALSE; -} - static void gimp_display_flush_whenever (GimpDisplay *display, gboolean now) @@ -857,12 +823,22 @@ gimp_display_flush_whenever (GimpDisplay *display, if (now) { - if (! private->flush_now_timeout) - private->flush_now_timeout = - gdk_threads_add_timeout_full (G_PRIORITY_HIGH_IDLE, - FLUSH_NOW_TIMEOUT, - (GSourceFunc) gimp_display_flush_now_timeout, - display, NULL); + GTimeVal time_now; + gint diff_usec; + + g_get_current_time (&time_now); + + diff_usec = (((guint64) time_now.tv_sec * G_USEC_PER_SEC + + (guint64) time_now.tv_usec) - + ((guint64) private->last_flush_now.tv_sec * G_USEC_PER_SEC + + (guint64) private->last_flush_now.tv_usec)); + + if (diff_usec > FLUSH_NOW_INTERVAL) + { + gimp_display_shell_flush (gimp_display_get_shell (display), now); + + g_get_current_time (&private->last_flush_now); + } } else {