Extend tiling/floating criteria with optional auto/user values (#4006)
The default `tiling` and `floating` behavior is preserved and matches both cases. Adds a new handler to `remanage_window` on A_I3_FLOATING_WINDOW change. Mainly in order to `run_assignments`, this makes `for_window [floating]` directives to work for windows which where initially opened as tiling. Now, when floating is enabled, `for_window` will trigger correctly. Same applies to `for_window [tiling]`. The obvious solution of `run_assignments` after `floating_{enable,disable}` doesn't work because `run_assignments` modifies the parser state in src/assignments.c:51. Fixes #3588 Co-Authored-By: Michael Stapelberg <michael@stapelberg.de>
This commit is contained in:
@ -98,18 +98,53 @@ is(parser_calls($config),
|
||||
################################################################################
|
||||
|
||||
$config = <<'EOT';
|
||||
for_window [] nop empty
|
||||
for_window [class="^Chrome"] floating enable
|
||||
for_window [class=^Chrome] floating enable
|
||||
for_window [floating_from = "auto" class= ==Class== ] nop floating
|
||||
for_window [tiling_from=auto class="==Class=="]nop floating
|
||||
EOT
|
||||
|
||||
$expected = <<'EOT';
|
||||
cfg_for_window(nop empty)
|
||||
cfg_criteria_add(class, ^Chrome)
|
||||
cfg_for_window(floating enable)
|
||||
cfg_criteria_add(class, ^Chrome)
|
||||
cfg_for_window(floating enable)
|
||||
cfg_criteria_add(floating_from, auto)
|
||||
cfg_criteria_add(class, ==Class==)
|
||||
cfg_for_window(nop floating)
|
||||
cfg_criteria_add(tiling_from, auto)
|
||||
cfg_criteria_add(class, ==Class==)
|
||||
cfg_for_window(nop floating)
|
||||
EOT
|
||||
|
||||
is(parser_calls($config),
|
||||
$expected,
|
||||
'for_window okay');
|
||||
|
||||
$config = <<'EOT';
|
||||
for_window [tiling_from=typo] nop typo
|
||||
for_window [tiling_from="typo"] nop typo
|
||||
EOT
|
||||
|
||||
$expected = <<'EOT';
|
||||
ERROR: CONFIG: Expected one of these tokens: '"', 'auto', 'user'
|
||||
ERROR: CONFIG: (in file <stdin>)
|
||||
ERROR: CONFIG: Line 1: for_window [tiling_from=typo] nop typo
|
||||
ERROR: CONFIG: ^^^^^^^^^^^^^^
|
||||
ERROR: CONFIG: Line 2: for_window [tiling_from="typo"] nop typo
|
||||
ERROR: CONFIG: Expected one of these tokens: 'auto', 'user'
|
||||
ERROR: CONFIG: (in file <stdin>)
|
||||
ERROR: CONFIG: Line 1: for_window [tiling_from=typo] nop typo
|
||||
ERROR: CONFIG: Line 2: for_window [tiling_from="typo"] nop typo
|
||||
ERROR: CONFIG: ^^^^^^^^^^^^^^^
|
||||
EOT
|
||||
|
||||
is(parser_calls($config),
|
||||
$expected,
|
||||
'for_window errors okay');
|
||||
|
||||
################################################################################
|
||||
# assign
|
||||
################################################################################
|
||||
|
@ -17,27 +17,69 @@
|
||||
use i3test i3_config => <<EOT;
|
||||
# i3 config file (v4)
|
||||
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
|
||||
for_window [tiling] mark tiled
|
||||
for_window [floating] mark floated
|
||||
for_window [tiling] mark --add tiling
|
||||
for_window [floating] mark --add floating
|
||||
|
||||
for_window [tiling_from="auto"] mark --add tiling_auto
|
||||
for_window [floating_from="auto"] mark --add floating_auto
|
||||
|
||||
for_window [tiling_from="user"] mark --add tiling_user
|
||||
for_window [floating_from="user"] mark --add floating_user
|
||||
EOT
|
||||
use X11::XCB qw(PROP_MODE_REPLACE);
|
||||
|
||||
##############################################################
|
||||
# 13: check that the tiling / floating criteria work.
|
||||
# Check that the auto tiling / floating criteria work.
|
||||
##############################################################
|
||||
|
||||
my $tmp = fresh_workspace;
|
||||
|
||||
open_window;
|
||||
open_floating_window;
|
||||
my $A = open_window;
|
||||
my $B = open_floating_window;
|
||||
|
||||
my @nodes = @{get_ws($tmp)->{nodes}};
|
||||
cmp_ok(@nodes, '==', 1, 'one tiling container on this workspace');
|
||||
is_deeply($nodes[0]->{marks}, [ 'tiled' ], "mark set for 'tiling' criterion");
|
||||
is_deeply($nodes[0]->{marks}, [ 'tiling', 'tiling_auto' ], "mark set for 'tiling' criterion");
|
||||
|
||||
@nodes = @{get_ws($tmp)->{floating_nodes}};
|
||||
cmp_ok(@nodes, '==', 1, 'one floating container on this workspace');
|
||||
is_deeply($nodes[0]->{nodes}[0]->{marks}, [ 'floated' ], "mark set for 'floating' criterion");
|
||||
is_deeply($nodes[0]->{nodes}[0]->{marks}, [ 'floating', 'floating_auto' ], "mark set for 'floating' criterion");
|
||||
|
||||
################################################################################
|
||||
# Check that the user tiling / floating criteria work.
|
||||
# The following rules are triggered here: 'tiling', 'tiling_user', 'floating',
|
||||
# 'floating_user'. Therefore, the old marks 'tiling' and 'floating' are
|
||||
# replaced but the 'tiling_auto' and 'floating_auto' marks are preserved.
|
||||
################################################################################
|
||||
|
||||
cmd '[id=' . $A->{id} . '] floating enable';
|
||||
cmd '[id=' . $B->{id} . '] floating disable';
|
||||
|
||||
@nodes = @{get_ws($tmp)->{nodes}};
|
||||
cmp_ok(@nodes, '==', 1, 'one tiling container on this workspace');
|
||||
is_deeply($nodes[0]->{marks}, [ 'floating_auto', 'tiling', 'tiling_user' ], "Marks updated after 'floating_user' criterion");
|
||||
|
||||
@nodes = @{get_ws($tmp)->{floating_nodes}};
|
||||
cmp_ok(@nodes, '==', 1, 'one floating container on this workspace');
|
||||
is_deeply($nodes[0]->{nodes}[0]->{marks}, [ 'tiling_auto', 'floating', 'floating_user' ], "Marks updated after 'tiling_user' criterion");
|
||||
|
||||
################################################################################
|
||||
# Check that the default and auto rules do not re-trigger
|
||||
# Here, the windows are returned to their original state but since the rules
|
||||
# `tiling`, `tiling_auto`, `floating` and `floating_auto` where already
|
||||
# triggered, only the `tiling_user` and `floating_user` rules should trigger.
|
||||
################################################################################
|
||||
|
||||
# Use 'mark' to clear old marks
|
||||
cmd '[id=' . $A->{id} . '] mark A, floating disable';
|
||||
cmd '[id=' . $B->{id} . '] mark B, floating enable';
|
||||
|
||||
@nodes = @{get_ws($tmp)->{nodes}};
|
||||
cmp_ok(@nodes, '==', 1, 'one tiling container on this workspace');
|
||||
is_deeply($nodes[0]->{marks}, [ 'A', 'tiling_user' ], "Only 'tiling_user' rule triggered");
|
||||
|
||||
@nodes = @{get_ws($tmp)->{floating_nodes}};
|
||||
cmp_ok(@nodes, '==', 1, 'one floating container on this workspace');
|
||||
is_deeply($nodes[0]->{nodes}[0]->{marks}, [ 'B', 'floating_user' ], "Only 'floating_user' rule triggered");
|
||||
|
||||
##############################################################
|
||||
|
||||
|
Reference in New Issue
Block a user