+
+gboolean find_timestamp(XEvent *e, gpointer data)
+{
+ const Time t = event_get_timestamp(e);
+ if (t && t >= event_curtime) {
+ event_curtime = t;
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
+static Time next_time(void)
+{
+ /* Some events don't come with timestamps :(
+ ...but we can get one anyways >:) */
+
+ /* Generate a timestamp so there is guaranteed at least one in the queue
+ eventually */
+ XChangeProperty(obt_display, screen_support_win,
+ OBT_PROP_ATOM(WM_CLASS), OBT_PROP_ATOM(STRING),
+ 8, PropModeAppend, NULL, 0);
+
+ /* Grab the first timestamp available */
+ xqueue_exists(find_timestamp, NULL);
+
+ /*g_assert(event_curtime != CurrentTime);*/
+
+ /* Save the time so we don't have to do this again for this event */
+ return event_curtime;
+}
+
+Time event_time(void)
+{
+ if (event_curtime) return event_curtime;
+
+ return next_time();
+}
+
+Time event_source_time(void)
+{
+ return event_sourcetime;
+}
+
+void event_reset_time(void)
+{
+ next_time();
+}
+
+void event_update_user_time(void)
+{
+ event_last_user_time = event_time();
+}
+
+void event_reset_user_time(void)
+{
+ event_last_user_time = CurrentTime;
+}