*/
void cmd_focus(I3_CMD) {
DLOG("current_match = %p\n", current_match);
- if (focused &&
- focused->type != CT_WORKSPACE &&
- focused->fullscreen_mode != CF_NONE) {
- LOG("Cannot change focus while in fullscreen mode.\n");
- ysuccess(false);
- return;
- }
-
- owindow *current;
if (match_is_empty(current_match)) {
ELOG("You have to specify which window/container should be focused.\n");
}
int count = 0;
+ owindow *current;
TAILQ_FOREACH(current, &owindows, owindows) {
Con *ws = con_get_workspace(current->con);
/* If no workspace could be found, this was a dock window.
if (!ws)
continue;
+ /* Don't allow the focus switch if the focused and current
+ * containers are in the same workspace. */
+ if (focused &&
+ focused->type != CT_WORKSPACE &&
+ focused->fullscreen_mode != CF_NONE &&
+ con_get_workspace(focused) == ws) {
+ LOG("Cannot change focus while in fullscreen mode (same workspace).\n");
+ ysuccess(false);
+ return;
+ }
+
/* If the container is not on the current workspace,
* workspace_show() will switch to a different workspace and (if
* enabled) trigger a mouse pointer warp to the currently focused
# vim:ts=4:sw=4:expandtab
#
# Test if new containers get focused when there is a fullscreen container at
-# the time of launching the new one.
+# the time of launching the new one. Also make sure that focusing containers
+# in other workspaces work even when there is a fullscreen container.
#
use i3test;
is($nodes->[0]->{id}, $old_id, 'id unchanged');
is($nodes->[0]->{focused}, 1, 'fullscreen window focused');
+################################################################################
+# Make sure it's possible to focus a container in a different workspace even if
+# we are currently focusing a fullscreen container.
+################################################################################
+
+$tmp2 = fresh_workspace;
+my $focusable_window = open_window;
+
+cmd "workspace $tmp";
+cmd '[id="' . $focusable_window->id . '"] focus';
+
+is(focused_ws(), $tmp2, 'focus went to a different workspace');
+
+$nodes = get_ws_content($tmp2);
+is(scalar @$nodes, 1, 'precisely one window');
+is($nodes->[0]->{focused}, 1, 'focusable window focused');
+
done_testing;