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:
parent
98b02c6b60
commit
eea1a9fef9
2 changed files with 23 additions and 11 deletions
|
@ -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) {
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue