summaryrefslogtreecommitdiff
path: root/openbox
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2010-04-16 21:19:50 -0400
committerDana Jansens <danakj@orodu.net>2010-04-16 21:32:38 -0400
commit171e476ba3faaa3dbd95e9e95f4121fae2db6564 (patch)
tree2129a2dde6bf02755ef3e38ca7ffdbd691c58dc8 /openbox
parent550e961c0e4e5b512d2cc4408bda03201dee5089 (diff)
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.
Diffstat (limited to 'openbox')
-rw-r--r--openbox/client.c9
-rw-r--r--openbox/event.c36
2 files changed, 37 insertions, 8 deletions
diff --git a/openbox/client.c b/openbox/client.c
index 2d78040a..3399b509 100644
--- a/openbox/client.c
+++ b/openbox/client.c
@@ -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
diff --git a/openbox/event.c b/openbox/event.c
index 3126ef92..bcf887f6 100644
--- a/openbox/event.c
+++ b/openbox/event.c
@@ -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;
}