diff options
| author | Dana Jansens <danakj@orodu.net> | 2010-04-16 21:19:50 -0400 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2010-04-16 21:32:38 -0400 |
| commit | 171e476ba3faaa3dbd95e9e95f4121fae2db6564 (patch) | |
| tree | 2129a2dde6bf02755ef3e38ca7ffdbd691c58dc8 /openbox/event.c | |
| parent | 550e961c0e4e5b512d2cc4408bda03201dee5089 (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/event.c')
| -rw-r--r-- | openbox/event.c | 36 |
1 files changed, 32 insertions, 4 deletions
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; } |
