summaryrefslogtreecommitdiff
path: root/openbox/client.c
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2011-10-04 17:53:54 -0400
committerDana Jansens <danakj@orodu.net>2011-10-05 13:32:08 -0400
commiteea1a9fef91686a511ae0a8590dbb6df02c26470 (patch)
tree484cb169d0ca83df745d5c366c4b52df499abfe5 /openbox/client.c
parent98b02c6b60bbde2a5db026b3ee3e6e6dc44d1a92 (diff)
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.
Diffstat (limited to 'openbox/client.c')
-rw-r--r--openbox/client.c30
1 files changed, 19 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) {