From eea1a9fef91686a511ae0a8590dbb6df02c26470 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Tue, 4 Oct 2011 17:53:54 -0400 Subject: [PATCH] Fix focus stealing for changing desktops/Use timestamp for user input events Change the logic for when to allow stealing focus across desktops. - It was possible to call event_time_after() with a CurrentTime in the old code. - It would disallow a user requested change which is crazy. - It would change desktops on you when a new window appeared but this is generally not desirable. event_source_time() is supposed to give the time which the user made things happen. we leave it at 0 for user-input events right now which means stuff like changing desktop doesn't save any timestamp at all. we should use the timestamp from x for user-generated events. --- openbox/client.c | 30 +++++++++++++++++++----------- openbox/event.c | 4 ++++ 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/openbox/client.c b/openbox/client.c index 1b010e4b..e3d3013e 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -717,11 +717,13 @@ static gboolean client_can_steal_focus(ObClient *self, /* This is focus stealing prevention */ ob_debug("Want to focus window 0x%x at time %u " "launched at %u (last user interaction time %u) " - "request from %s, allow other desktop: %s", + "request from %s, allow other desktop: %s, " + "desktop switch time %u", self->window, steal_time, launch_time, event_last_user_time, (request_from_user ? "user" : "other"), - (allow_other_desktop ? "yes" : "no")); + (allow_other_desktop ? "yes" : "no"), + screen_desktop_user_time); /* if no launch time is provided for an application, make one up. @@ -777,18 +779,24 @@ static gboolean client_can_steal_focus(ObClient *self, } /* if it's on another desktop - then if allow_other_desktop is true, we don't want to let it steal + and if allow_other_desktop is true, we generally let it steal focus. + but if it didn't come from the user, don't let it steal unless it was + launched before the user switched desktops. focus, unless it was launched after we changed desktops and the request came from the user */ - if (!(self->desktop == screen_desktop || - self->desktop == DESKTOP_ALL) && - (!allow_other_desktop || - (request_from_user && screen_desktop_user_time && - !event_time_after(launch_time, screen_desktop_user_time)))) - { - steal = FALSE; - ob_debug("Not focusing the window because its on another desktop\n"); + if (!screen_compare_desktops(screen_desktop, self->desktop)) { + /* must be allowed */ + if (!allow_other_desktop) { + steal = FALSE; + ob_debug("Not focusing the window because its on another desktop"); + } + /* if we don't know when the desktop changed, but request is from an + application, don't let it change desktop on you */ + else if (!request_from_user) { + steal = FALSE; + ob_debug("Not focusing the window because non-user request"); + } } /* If something is focused... */ else if (focus_client) { diff --git a/openbox/event.c b/openbox/event.c index 2dde1329..ba156da6 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -700,6 +700,8 @@ static void event_process(const XEvent *ec, gpointer data) static guint pressed = 0; static Window pressed_win = None; + event_sourcetime = event_curtime; + /* If the button press was on some non-root window, or was physically on the root window... */ if (window != obt_root(ob_screen) || @@ -726,6 +728,8 @@ static void event_process(const XEvent *ec, gpointer data) else if (e->type == KeyPress || e->type == KeyRelease || e->type == MotionNotify) { + event_sourcetime = event_curtime; + used = event_handle_user_input(client, e); if (prompt && !used) -- 2.45.2