"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)
}
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));
+}
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
/*! 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;
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;
}
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;
}
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;
}