When determining the current timestamp, try get something a lil more accurate
authorDana Jansens <danakj@orodu.net>
Sat, 17 Apr 2010 01:19:50 +0000 (21:19 -0400)
committerDana Jansens <danakj@orodu.net>
Sat, 17 Apr 2010 01:32:38 +0000 (21:32 -0400)
Get the first timestamp from the event queue, rather than (potentially) the
  last.
also treat it as the actual event_curtime, meaning it is used when focusing a
  newly mapped window etc.

openbox/client.c
openbox/event.c

index 2d78040..3399b50 100644 (file)
@@ -203,13 +203,14 @@ void client_manage(Window window, ObPrompt *prompt)
     ObAppSettings *settings;
     gboolean transient = FALSE;
     Rect place;
-    Time launch_time, map_time;
+    Time launch_time;
     guint32 user_time;
     gboolean obplaced;
 
     ob_debug("Managing window: 0x%lx", window);
 
-    map_time = event_get_server_time();
+    /* we want to always have a valid time when the window is mapping */
+    g_assert(event_curtime != CurrentTime);
 
     /* choose the events we want to receive on the CLIENT window
        (ObPrompt windows can request events too) */
@@ -272,7 +273,7 @@ void client_manage(Window window, ObPrompt *prompt)
     launch_time = sn_app_started(self->startup_id, self->class, self->name);
 
     if (!OBT_PROP_GET32(self->window, NET_WM_USER_TIME, CARDINAL, &user_time))
-        user_time = map_time;
+        user_time = event_curtime;
 
     /* do this after we have a frame.. it uses the frame to help determine the
        WM_STATE to apply. */
@@ -441,7 +442,7 @@ void client_manage(Window window, ObPrompt *prompt)
     ob_debug_type(OB_DEBUG_FOCUS, "Going to try activate new window? %s",
                   activate ? "yes" : "no");
     if (activate) {
-        activate = client_can_steal_focus(self, map_time, launch_time);
+        activate = client_can_steal_focus(self, event_curtime, launch_time);
 
         if (!activate) {
             /* if the client isn't stealing focus, then hilite it so the user
index 3126ef9..bcf887f 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;
 }