From 339d76704400a6ea514817d91a2e935a13ecc928 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Wed, 28 Mar 2007 01:52:06 +0000 Subject: [PATCH] handle time wrapping around. --- openbox/client.c | 6 ++++-- openbox/event.c | 12 ++++++++++++ openbox/event.h | 4 ++++ openbox/grab.c | 23 +++++++++++------------ 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; } -- 2.45.2