summaryrefslogtreecommitdiff
path: root/gdk/gdkframeclockidle.c
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2013-02-18 15:37:22 +0100
committerAlexander Larsson <alexl@redhat.com>2013-02-18 17:14:25 +0100
commit5dbf814f0c0c94733ef96d6dc3c8c5ddb7a63f3a (patch)
treec675f668c7f9e9df40f43c2b1cdda6a8637ae906 /gdk/gdkframeclockidle.c
parent1db87c897f930171646351c99af7df09dc7ec949 (diff)
downloadgtk+-5dbf814f0c0c94733ef96d6dc3c8c5ddb7a63f3a.tar.gz
win32: Request higher precision timers during animations
The default windows timer resolution is 16msec, which is too little for fluent animations (say at 60Hz). So, while a paint clock is active we temporarily raise the timer resolution to 1 msec.
Diffstat (limited to 'gdk/gdkframeclockidle.c')
-rw-r--r--gdk/gdkframeclockidle.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/gdk/gdkframeclockidle.c b/gdk/gdkframeclockidle.c
index 0db5bfdbc3..7e1a8c17e6 100644
--- a/gdk/gdkframeclockidle.c
+++ b/gdk/gdkframeclockidle.c
@@ -31,6 +31,10 @@
#include "gdkframeclockidle.h"
#include "gdk.h"
+#ifdef G_OS_WIN32
+#include <windows.h>
+#endif
+
#define FRAME_INTERVAL 16667 // microseconds
struct _GdkFrameClockIdlePrivate
@@ -51,6 +55,9 @@ struct _GdkFrameClockIdlePrivate
GdkFrameClockPhase phase;
guint in_paint_idle : 1;
+#ifdef G_OS_WIN32
+ guint begin_period : 1;
+#endif
};
static gboolean gdk_frame_clock_flush_idle (void *data);
@@ -140,6 +147,14 @@ gdk_frame_clock_idle_dispose (GObject *object)
priv->paint_idle_id = 0;
}
+#ifdef G_OS_WIN32
+ if (priv->begin_period)
+ {
+ timeEndPeriod(1);
+ priv->begin_period = FALSE;
+ }
+#endif
+
G_OBJECT_CLASS (gdk_frame_clock_idle_parent_class)->dispose (object);
}
@@ -474,6 +489,15 @@ gdk_frame_clock_idle_begin_updating (GdkFrameClock *clock)
GdkFrameClockIdle *clock_idle = GDK_FRAME_CLOCK_IDLE (clock);
GdkFrameClockIdlePrivate *priv = clock_idle->priv;
+#ifdef G_OS_WIN32
+ /* We need a higher resolution timer while doing animations */
+ if (priv->updating_count == 0 && !priv->begin_period)
+ {
+ timeBeginPeriod(1);
+ priv->begin_period = TRUE;
+ }
+#endif
+
priv->updating_count++;
maybe_start_idle (clock_idle);
}
@@ -488,6 +512,14 @@ gdk_frame_clock_idle_end_updating (GdkFrameClock *clock)
priv->updating_count--;
maybe_stop_idle (clock_idle);
+
+#ifdef G_OS_WIN32
+ if (priv->updating_count == 0 && priv->begin_period)
+ {
+ timeEndPeriod(1);
+ priv->begin_period = FALSE;
+ }
+#endif
}
static void