]> Dogcows Code - chaz/openbox/blobdiff - openbox/event.c
When determining the current timestamp, try get something a lil more accurate
[chaz/openbox] / openbox / event.c
index 3126ef92a9ef2d9e338f5640c2703834e69c763d..bcf887f6ffbaf9d61b11f7bbeef2df705ae021a5 100644 (file)
@@ -139,6 +139,10 @@ void event_startup(gboolean reconfig)
 #endif
 
     client_add_destroy_notify(focus_delay_client_dest, NULL);
+
+    /* get an initial time for event_curtime (mapping the initial windows needs
+       a timestamp) */
+    event_curtime = event_get_server_time();
 }
 
 void event_shutdown(gboolean reconfig)
@@ -207,7 +211,7 @@ static Window event_get_window(XEvent *e)
     return window;
 }
 
-static void event_set_curtime(XEvent *e)
+static inline Time event_time(const XEvent *e)
 {
     Time t = CurrentTime;
 
@@ -238,7 +242,7 @@ static void event_set_curtime(XEvent *e)
         if (obt_display_extension_sync &&
             e->type == obt_display_extension_sync_basep + XSyncAlarmNotify)
         {
-            t = ((XSyncAlarmNotifyEvent*)e)->time;
+            t = ((const XSyncAlarmNotifyEvent*)e)->time;
         }
 #endif
         /* if more event types are anticipated, get their timestamp
@@ -246,6 +250,20 @@ static void event_set_curtime(XEvent *e)
         break;
     }
 
+    return t;
+}
+
+static void event_set_curtime(XEvent *e)
+{
+    Time t = event_time(e);
+
+    if (t == CurrentTime) {
+        /* Some events don't come with timestamps :(
+           ...but we want the time anyways. */
+        if (e->type == MapRequest)
+            t = event_get_server_time();
+    }
+
     /* watch that if we get an event earlier than the last specified user_time,
        which can happen if the clock goes backwards, we erase the last
        specified user_time */
@@ -2206,14 +2224,24 @@ gboolean event_time_after(guint32 t1, guint32 t2)
         return t1 >= t2 && t1 < (t2 + TIME_HALF);
 }
 
+Bool find_timestamp(Display *d, XEvent *e, XPointer a)
+{
+    const Time t = event_time(e);
+    return t != CurrentTime;
+}
+
 Time event_get_server_time(void)
 {
-    /* Generate a timestamp */
     XEvent event;
 
+    /* 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);
-    XWindowEvent(obt_display, screen_support_win, PropertyChangeMask, &event);
+
+    /* Grab the first timestamp available */
+    XPeekIfEvent(obt_display, &event, find_timestamp, NULL);
+
     return event.xproperty.time;
 }
This page took 0.022319 seconds and 4 git commands to generate.