handle time wrapping around.
This commit is contained in:
parent
0ec2282e2c
commit
339d767044
4 changed files with 31 additions and 14 deletions
|
@ -3031,9 +3031,11 @@ void client_activate(ObClient *self, gboolean here, gboolean user)
|
|||
"source=%s\n",
|
||||
self->window, event_curtime, client_last_user_time,
|
||||
(user ? "user" : "application"));
|
||||
if (!user && event_curtime && event_curtime < client_last_user_time)
|
||||
if (!user && event_curtime &&
|
||||
!event_time_after(event_curtime, client_last_user_time))
|
||||
{
|
||||
client_hilite(self, TRUE);
|
||||
else {
|
||||
} else {
|
||||
if (client_normal(self) && screen_showing_desktop)
|
||||
screen_show_desktop(FALSE);
|
||||
if (self->iconic)
|
||||
|
|
|
@ -1376,3 +1376,15 @@ void event_ignore_queued_enters()
|
|||
}
|
||||
g_slist_free(saved);
|
||||
}
|
||||
|
||||
gboolean event_time_after(Time t1, Time t2)
|
||||
{
|
||||
/*
|
||||
Timestamp values wrap around (after about 49.7 days). The server, given
|
||||
its current time is represented by timestamp T, always interprets
|
||||
timestamps from clients by treating half of the timestamp space as being
|
||||
later in time than T.
|
||||
- http://tronche.com/gui/x/xlib/input/pointer-grabbing.html
|
||||
*/
|
||||
return t1 >= t2 && t1 <= t2 + (1 << (sizeof(Time)*8-1));
|
||||
}
|
||||
|
|
|
@ -47,4 +47,8 @@ void event_ignore_queued_enters();
|
|||
window for focus */
|
||||
void event_halt_focus_delay();
|
||||
|
||||
/*! Compare t1 and t2, taking into account wraparound. True if t1
|
||||
comes at the same time or later than t2. */
|
||||
gboolean event_time_after(Time t1, Time t2);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -38,6 +38,14 @@ static guint pgrabs = 0;
|
|||
/*! The time at which the last grab was made */
|
||||
static Time grab_time = CurrentTime;
|
||||
|
||||
static Time ungrab_time()
|
||||
{
|
||||
Time t = event_curtime;
|
||||
if (!(t == 0 || event_time_after(t, grab_time)))
|
||||
t = grab_time;
|
||||
return t;
|
||||
}
|
||||
|
||||
gboolean grab_on_keyboard()
|
||||
{
|
||||
return kgrabs > 0;
|
||||
|
@ -65,10 +73,7 @@ gboolean grab_keyboard(gboolean grab)
|
|||
ret = TRUE;
|
||||
} else if (kgrabs > 0) {
|
||||
if (--kgrabs == 0) {
|
||||
Time t = event_curtime;
|
||||
if (t != 0 && t < grab_time)
|
||||
t = grab_time;
|
||||
XUngrabKeyboard(ob_display, t);
|
||||
XUngrabKeyboard(ob_display, ungrab_time());
|
||||
}
|
||||
ret = TRUE;
|
||||
}
|
||||
|
@ -94,10 +99,7 @@ gboolean grab_pointer(gboolean grab, ObCursor cur)
|
|||
ret = TRUE;
|
||||
} else if (pgrabs > 0) {
|
||||
if (--pgrabs == 0) {
|
||||
Time t = event_curtime;
|
||||
if (t != 0 && t < grab_time)
|
||||
t = grab_time;
|
||||
XUngrabPointer(ob_display, event_curtime);
|
||||
XUngrabPointer(ob_display, ungrab_time());
|
||||
}
|
||||
ret = TRUE;
|
||||
}
|
||||
|
@ -122,10 +124,7 @@ gboolean grab_pointer_window(gboolean grab, ObCursor cur, Window win)
|
|||
ret = TRUE;
|
||||
} else if (pgrabs > 0) {
|
||||
if (--pgrabs == 0) {
|
||||
Time t = event_curtime;
|
||||
if (t != 0 && t < grab_time)
|
||||
t = grab_time;
|
||||
XUngrabPointer(ob_display, event_curtime);
|
||||
XUngrabPointer(ob_display, ungrab_time());
|
||||
}
|
||||
ret = TRUE;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue