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.
This commit is contained in:
parent
550e961c0e
commit
171e476ba3
2 changed files with 37 additions and 8 deletions
|
@ -203,13 +203,14 @@ void client_manage(Window window, ObPrompt *prompt)
|
||||||
ObAppSettings *settings;
|
ObAppSettings *settings;
|
||||||
gboolean transient = FALSE;
|
gboolean transient = FALSE;
|
||||||
Rect place;
|
Rect place;
|
||||||
Time launch_time, map_time;
|
Time launch_time;
|
||||||
guint32 user_time;
|
guint32 user_time;
|
||||||
gboolean obplaced;
|
gboolean obplaced;
|
||||||
|
|
||||||
ob_debug("Managing window: 0x%lx", window);
|
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
|
/* choose the events we want to receive on the CLIENT window
|
||||||
(ObPrompt windows can request events too) */
|
(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);
|
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))
|
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
|
/* do this after we have a frame.. it uses the frame to help determine the
|
||||||
WM_STATE to apply. */
|
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",
|
ob_debug_type(OB_DEBUG_FOCUS, "Going to try activate new window? %s",
|
||||||
activate ? "yes" : "no");
|
activate ? "yes" : "no");
|
||||||
if (activate) {
|
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 (!activate) {
|
||||||
/* if the client isn't stealing focus, then hilite it so the user
|
/* if the client isn't stealing focus, then hilite it so the user
|
||||||
|
|
|
@ -139,6 +139,10 @@ void event_startup(gboolean reconfig)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
client_add_destroy_notify(focus_delay_client_dest, NULL);
|
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)
|
void event_shutdown(gboolean reconfig)
|
||||||
|
@ -207,7 +211,7 @@ static Window event_get_window(XEvent *e)
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void event_set_curtime(XEvent *e)
|
static inline Time event_time(const XEvent *e)
|
||||||
{
|
{
|
||||||
Time t = CurrentTime;
|
Time t = CurrentTime;
|
||||||
|
|
||||||
|
@ -238,7 +242,7 @@ static void event_set_curtime(XEvent *e)
|
||||||
if (obt_display_extension_sync &&
|
if (obt_display_extension_sync &&
|
||||||
e->type == obt_display_extension_sync_basep + XSyncAlarmNotify)
|
e->type == obt_display_extension_sync_basep + XSyncAlarmNotify)
|
||||||
{
|
{
|
||||||
t = ((XSyncAlarmNotifyEvent*)e)->time;
|
t = ((const XSyncAlarmNotifyEvent*)e)->time;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
/* if more event types are anticipated, get their timestamp
|
/* if more event types are anticipated, get their timestamp
|
||||||
|
@ -246,6 +250,20 @@ static void event_set_curtime(XEvent *e)
|
||||||
break;
|
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,
|
/* 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
|
which can happen if the clock goes backwards, we erase the last
|
||||||
specified user_time */
|
specified user_time */
|
||||||
|
@ -2206,14 +2224,24 @@ gboolean event_time_after(guint32 t1, guint32 t2)
|
||||||
return t1 >= t2 && t1 < (t2 + TIME_HALF);
|
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)
|
Time event_get_server_time(void)
|
||||||
{
|
{
|
||||||
/* Generate a timestamp */
|
|
||||||
XEvent event;
|
XEvent event;
|
||||||
|
|
||||||
|
/* Generate a timestamp so there is guaranteed at least one in the queue
|
||||||
|
eventually */
|
||||||
XChangeProperty(obt_display, screen_support_win,
|
XChangeProperty(obt_display, screen_support_win,
|
||||||
OBT_PROP_ATOM(WM_CLASS), OBT_PROP_ATOM(STRING),
|
OBT_PROP_ATOM(WM_CLASS), OBT_PROP_ATOM(STRING),
|
||||||
8, PropModeAppend, NULL, 0);
|
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;
|
return event.xproperty.time;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue