diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c index f1d4b37273..f3d35eb9d5 100644 --- a/gtk/gtkmain.c +++ b/gtk/gtkmain.c @@ -636,6 +636,7 @@ do_pre_parse_initialization (int *argc, char ***argv) { const gchar *env_string; + double slowdown; if (pre_initialized) return; @@ -673,6 +674,13 @@ do_pre_parse_initialization (int *argc, g_string_append (gtk_modules_string, env_string); } + + env_string = g_getenv ("GTK_SLOWDOWN"); + if (env_string) + { + slowdown = g_ascii_strtod (env_string, NULL); + _gtk_set_slowdown (slowdown); + } } static void diff --git a/gtk/gtkprivate.h b/gtk/gtkprivate.h index cd48558e99..7602394675 100644 --- a/gtk/gtkprivate.h +++ b/gtk/gtkprivate.h @@ -91,6 +91,10 @@ gboolean _gtk_propagate_captured_event (GtkWidget *widget, GdkEvent *event, GtkWidget *topmost); + +gdouble _gtk_get_slowdown (); +void _gtk_set_slowdown (gdouble slowdown_factor); + #ifdef G_OS_WIN32 void _gtk_load_dll_with_libgtk3_manifest (const char *dllname); #endif diff --git a/gtk/gtkprogresstracker.c b/gtk/gtkprogresstracker.c index 277fd9a9de..c1d3f44215 100644 --- a/gtk/gtkprogresstracker.c +++ b/gtk/gtkprogresstracker.c @@ -18,6 +18,7 @@ */ #include "gtkprogresstrackerprivate.h" +#include "gtkprivate.h" #include "gtkcsseasevalueprivate.h" #include @@ -30,8 +31,25 @@ * * Progress tracker will handle translating frame clock timestamps to a * fractional progress value for interpolating between animation targets. + * + * Progress tracker will use the GTK_SLOWDOWN environment variable to control + * the speed of animations. This can be useful for debugging. */ +static gdouble gtk_slowdown = 1.0; + +void +_gtk_set_slowdown (gdouble factor) +{ + gtk_slowdown = factor; +} + +gdouble +_gtk_get_slowdown (gdouble factor) +{ + return gtk_slowdown; +} + /** * gtk_progress_tracker_init_copy: * @source: The source progress tracker @@ -109,7 +127,7 @@ gtk_progress_tracker_advance_frame (GtkProgressTracker *tracker, return; } - delta = (frame_time - tracker->last_frame_time) / (gdouble) tracker->duration; + delta = (frame_time - tracker->last_frame_time) / gtk_slowdown / tracker->duration; tracker->last_frame_time = frame_time; tracker->iteration += delta; }