all repos — openbox @ 171e476ba3faaa3dbd95e9e95f4121fae2db6564

openbox fork - make it a bit more like ryudo

When determining the current timestamp, try get something a lil more accurate

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.
Dana Jansens danakj@orodu.net
commit

171e476ba3faaa3dbd95e9e95f4121fae2db6564

parent

550e961c0e4e5b512d2cc4408bda03201dee5089

2 files changed, 37 insertions(+), 8 deletions(-)

jump to
M openbox/client.copenbox/client.c

@@ -203,13 +203,14 @@ gboolean activate = FALSE;

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 @@ /* tell startup notification that this app started */

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 @@

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
M openbox/event.copenbox/event.c

@@ -139,6 +139,10 @@ IceAddConnectionWatch(ice_watch, NULL);

#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 @@ }

return window; } -static void event_set_curtime(XEvent *e) +static inline Time event_time(const XEvent *e) { Time t = CurrentTime;

@@ -238,12 +242,26 @@ #ifdef SYNC

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 explicitly */ 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,

@@ -2206,14 +2224,24 @@ /* t2 is in the first half so t1 has to come after it */

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; }