summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--openbox/client.c6
-rw-r--r--openbox/event.c12
-rw-r--r--openbox/event.h4
-rw-r--r--openbox/grab.c23
4 files changed, 31 insertions, 14 deletions
diff --git a/openbox/client.c b/openbox/client.c
index a51ecfd7..203c6dbc 100644
--- a/openbox/client.c
+++ b/openbox/client.c
@@ -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)
diff --git a/openbox/event.c b/openbox/event.c
index 75cf5d2e..15724968 100644
--- a/openbox/event.c
+++ b/openbox/event.c
@@ -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));
+}
diff --git a/openbox/event.h b/openbox/event.h
index 44bf54a0..4221e54d 100644
--- a/openbox/event.h
+++ b/openbox/event.h
@@ -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
diff --git a/openbox/grab.c b/openbox/grab.c
index f63da5e9..991956da 100644
--- a/openbox/grab.c
+++ b/openbox/grab.c
@@ -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;
}