Fix fullscreen focus bug and corresponding test flaw
As the workspace might be reached via recursion (e.g. moving from the edge of a fullscreen split container), it's necessary to check for a fullscreen container whenever a workspace is reached.
This commit is contained in:
parent
7a280f5691
commit
e07803999f
|
@ -1297,14 +1297,6 @@ void cmd_exec(I3_CMD, char *nosn, char *command) {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void cmd_focus_direction(I3_CMD, char *direction) {
|
void cmd_focus_direction(I3_CMD, char *direction) {
|
||||||
if (focused &&
|
|
||||||
focused->type != CT_WORKSPACE &&
|
|
||||||
focused->fullscreen_mode != CF_NONE) {
|
|
||||||
LOG("Cannot change focus while in fullscreen mode.\n");
|
|
||||||
ysuccess(false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
DLOG("direction = *%s*\n", direction);
|
DLOG("direction = *%s*\n", direction);
|
||||||
|
|
||||||
if (strcmp(direction, "left") == 0)
|
if (strcmp(direction, "left") == 0)
|
||||||
|
@ -1331,14 +1323,6 @@ void cmd_focus_direction(I3_CMD, char *direction) {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void cmd_focus_window_mode(I3_CMD, char *window_mode) {
|
void cmd_focus_window_mode(I3_CMD, char *window_mode) {
|
||||||
if (focused &&
|
|
||||||
focused->type != CT_WORKSPACE &&
|
|
||||||
focused->fullscreen_mode != CF_NONE) {
|
|
||||||
LOG("Cannot change focus while in fullscreen mode.\n");
|
|
||||||
ysuccess(false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
DLOG("window_mode = %s\n", window_mode);
|
DLOG("window_mode = %s\n", window_mode);
|
||||||
|
|
||||||
Con *ws = con_get_workspace(focused);
|
Con *ws = con_get_workspace(focused);
|
||||||
|
|
|
@ -466,6 +466,11 @@ static bool _tree_next(Con *con, char way, orientation_t orientation, bool wrap)
|
||||||
/* Stop recursing at workspaces after attempting to switch to next
|
/* Stop recursing at workspaces after attempting to switch to next
|
||||||
* workspace if possible. */
|
* workspace if possible. */
|
||||||
if (con->type == CT_WORKSPACE) {
|
if (con->type == CT_WORKSPACE) {
|
||||||
|
if (con_get_fullscreen_con(con, CF_GLOBAL) ||
|
||||||
|
con_get_fullscreen_con(con, CF_OUTPUT)) {
|
||||||
|
DLOG("Cannot change workspace while in fullscreen mode.\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
Output *current_output = get_output_containing(con->rect.x, con->rect.y);
|
Output *current_output = get_output_containing(con->rect.x, con->rect.y);
|
||||||
Output *next_output;
|
Output *next_output;
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,20 @@
|
||||||
# the time of launching the new one. Also make sure that focusing containers
|
# the time of launching the new one. Also make sure that focusing containers
|
||||||
# in other workspaces work even when there is a fullscreen container.
|
# in other workspaces work even when there is a fullscreen container.
|
||||||
#
|
#
|
||||||
use i3test;
|
use i3test i3_autostart => 0;
|
||||||
|
|
||||||
|
# Screen setup looks like this:
|
||||||
|
# +----+----+
|
||||||
|
# | S1 | S2 |
|
||||||
|
# +----+----+
|
||||||
|
my $config = <<EOT;
|
||||||
|
# i3 config file (v4)
|
||||||
|
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
|
||||||
|
|
||||||
|
fake-outputs 1024x768+0+0,1024x768+1024+0
|
||||||
|
EOT
|
||||||
|
|
||||||
|
my $pid = launch_with_config($config);
|
||||||
|
|
||||||
my $i3 = i3(get_socket_path());
|
my $i3 = i3(get_socket_path());
|
||||||
|
|
||||||
|
@ -305,4 +318,6 @@ verify_move(2, 'prevented move to workspace by position');
|
||||||
|
|
||||||
# TODO: Tests for "move to output" and "move workspace to output".
|
# TODO: Tests for "move to output" and "move workspace to output".
|
||||||
|
|
||||||
|
exit_gracefully($pid);
|
||||||
|
|
||||||
done_testing;
|
done_testing;
|
||||||
|
|
Loading…
Reference in New Issue