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.
This commit is contained in:
Dana Jansens 2011-10-04 17:53:54 -04:00
parent 98b02c6b60
commit eea1a9fef9
2 changed files with 23 additions and 11 deletions

View file

@ -717,11 +717,13 @@ static gboolean client_can_steal_focus(ObClient *self,
/* This is focus stealing prevention */ /* This is focus stealing prevention */
ob_debug("Want to focus window 0x%x at time %u " ob_debug("Want to focus window 0x%x at time %u "
"launched at %u (last user interaction 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, self->window, steal_time, launch_time,
event_last_user_time, event_last_user_time,
(request_from_user ? "user" : "other"), (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. 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 /* 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 focus, unless it was launched after we changed desktops and the request
came from the user came from the user
*/ */
if (!(self->desktop == screen_desktop || if (!screen_compare_desktops(screen_desktop, self->desktop)) {
self->desktop == DESKTOP_ALL) && /* must be allowed */
(!allow_other_desktop || if (!allow_other_desktop) {
(request_from_user && screen_desktop_user_time && steal = FALSE;
!event_time_after(launch_time, screen_desktop_user_time)))) ob_debug("Not focusing the window because its on another desktop");
{ }
steal = FALSE; /* if we don't know when the desktop changed, but request is from an
ob_debug("Not focusing the window because its on another desktop\n"); 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... */ /* If something is focused... */
else if (focus_client) { else if (focus_client) {

View file

@ -700,6 +700,8 @@ static void event_process(const XEvent *ec, gpointer data)
static guint pressed = 0; static guint pressed = 0;
static Window pressed_win = None; static Window pressed_win = None;
event_sourcetime = event_curtime;
/* If the button press was on some non-root window, or was physically /* If the button press was on some non-root window, or was physically
on the root window... */ on the root window... */
if (window != obt_root(ob_screen) || 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 || else if (e->type == KeyPress || e->type == KeyRelease ||
e->type == MotionNotify) e->type == MotionNotify)
{ {
event_sourcetime = event_curtime;
used = event_handle_user_input(client, e); used = event_handle_user_input(client, e);
if (prompt && !used) if (prompt && !used)