#include "gdkdisplay.h"
#include "gdkeventsource.h"
#include "gdkeventtranslator.h"
+#include "gdkframeclockprivate.h"
#include "gdkinternals.h"
#include "gdkscreen.h"
#include "gdkinternals.h"
if (!is_substructure && toplevel && display_x11->use_sync && toplevel->pending_counter_value != 0)
{
toplevel->configure_counter_value = toplevel->pending_counter_value;
+ toplevel->configure_counter_value_is_extended = toplevel->pending_counter_value_is_extended;
toplevel->pending_counter_value = 0;
}
#endif
find_frame_timings (GdkFrameClock *clock,
guint64 serial)
{
- GdkFrameHistory *history = gdk_frame_clock_get_history (clock);
gint64 start_frame, end_frame, i;
- start_frame = gdk_frame_history_get_start (history);
- end_frame = gdk_frame_history_get_frame_counter (history);
+ start_frame = gdk_frame_clock_get_start (clock);
+ end_frame = gdk_frame_clock_get_frame_counter (clock);
for (i = end_frame; i >= start_frame; i--)
{
- GdkFrameTimings *timings = gdk_frame_history_get_timings (history, i);
+ GdkFrameTimings *timings = gdk_frame_clock_get_timings (clock, i);
- if (gdk_frame_timings_get_cookie (timings) == serial)
+ if (timings->cookie == serial)
return timings;
}
guint32 d2 = xevent->xclient.data.l[2];
guint32 d3 = xevent->xclient.data.l[3];
- guint64 serial = ((guint64)d0 << 32) | d1;
+ guint64 serial = ((guint64)d1 << 32) | d0;
+ gint64 frame_drawn_time = ((guint64)d3 << 32) | d2;
+ gint64 refresh_interval, presentation_time;
GdkFrameClock *clock = gdk_window_get_frame_clock (event->any.window);
GdkFrameTimings *timings = find_frame_timings (clock, serial);
if (timings)
- gdk_frame_timings_set_drawn_time (timings, ((guint64)d2 << 32) | d3);
+ timings->drawn_time = frame_drawn_time;
if (window_impl->toplevel->frame_pending)
{
window_impl->toplevel->frame_pending = FALSE;
gdk_frame_clock_thaw (clock);
}
+
+ gdk_frame_clock_get_refresh_info (clock,
+ frame_drawn_time,
+ &refresh_interval,
+ &presentation_time);
+ if (presentation_time != 0)
+ window_impl->toplevel->throttled_presentation_time = presentation_time + refresh_interval;
}
return GDK_FILTER_REMOVE;
guint32 d2 = xevent->xclient.data.l[2];
guint32 d3 = xevent->xclient.data.l[3];
- guint64 serial = ((guint64)d0 << 32) | d1;
+ guint64 serial = ((guint64)d1 << 32) | d0;
GdkFrameClock *clock = gdk_window_get_frame_clock (event->any.window);
GdkFrameTimings *timings = find_frame_timings (clock, serial);
if (timings)
{
- gint64 drawn_time = gdk_frame_timings_get_drawn_time (timings);
gint32 presentation_time_offset = (gint32)d2;
gint32 refresh_interval = d3;
- if (drawn_time && presentation_time_offset)
- gdk_frame_timings_set_presentation_time (timings,
- drawn_time + presentation_time_offset);
+ if (timings->drawn_time && presentation_time_offset)
+ timings->presentation_time = timings->drawn_time + presentation_time_offset;
if (refresh_interval)
- gdk_frame_timings_set_refresh_interval (timings, refresh_interval);
+ timings->refresh_interval = refresh_interval;
- gdk_frame_timings_set_complete (timings, TRUE);
+ timings->complete = TRUE;
+#ifdef G_ENABLE_DEBUG
+ if ((_gdk_debug_flags & GDK_DEBUG_FRAMES) != 0)
+ _gdk_frame_clock_debug_print_timings (clock, timings);
+#endif /* G_ENABLE_DEBUG */
}
}
}
{
#ifdef HAVE_XSYNC
toplevel->pending_counter_value = xevent->xclient.data.l[2] + ((gint64)xevent->xclient.data.l[3] << 32);
+ toplevel->pending_counter_value_is_extended = xevent->xclient.data.l[4] != 0;
#endif
}
return GDK_FILTER_REMOVE;