$ mkdir -p build && cd build -$ meson .. -$ ninja+
mkdir -p build +meson setup build +meson compile -C build
diff --git a/_docs/hacking-howto b/_docs/hacking-howto index ae48c44..d8c95ca 100644 --- a/_docs/hacking-howto +++ b/_docs/hacking-howto @@ -28,9 +28,9 @@ https://mesonbuild.com/[The Meson Build system]; see https://mesonbuild.com/Quick-guide.html#compiling-a-meson-project[Quickstart Guide → Compiling a Meson project]. In case you’re unfamiliar: - $ mkdir -p build && cd build - $ meson .. - $ ninja + mkdir -p build + meson setup build + meson compile -C build === Build system features diff --git a/_docs/i3bar-workspace-protocol b/_docs/i3bar-workspace-protocol index 016fc96..009b2a1 100644 --- a/_docs/i3bar-workspace-protocol +++ b/_docs/i3bar-workspace-protocol @@ -86,7 +86,7 @@ name (string):: the +name+ as you wish, effectively renaming the buttons of i3bar. visible (boolean):: Defaults to +false+ if not included. +focused+ takes precedence over it, - however +visible+ is important for more than one monitors. + however +visible+ is important for more than one monitor. focused (boolean):: Defaults to +false+ if not included. Generally, exactly one of the workspaces should be +focused+. If not, no button will have the @@ -129,7 +129,7 @@ i3-msg -t subscribe -m '["workspace", "output"]' | { # avoids having an empty bar when starting up. i3-msg -t get_workspaces; # Then, while we receive events, update the workspace information. - while read; do i3-msg -t get_workspaces; done; + while read EVENT; do i3-msg -t get_workspaces; done; } ------------------------------ @@ -139,7 +139,7 @@ i3-msg -t subscribe -m '["workspace", "output"]' | { #!/bin/sh i3-msg -t subscribe -m '["workspace", "output"]' | { i3-msg -t get_workspaces; - while read; do i3-msg -t get_workspaces; done; + while read EVENT; do i3-msg -t get_workspaces; done; } | jq --unbuffered -c '[ .[] | select(.name != "foo" or .focused) ]' ------------------------------ @@ -153,7 +153,7 @@ might mean that you are getting an empty bar until enough events are written. #!/bin/sh i3-msg -t subscribe -m '["workspace", "output"]' | { i3-msg -t get_workspaces; - while read; do i3-msg -t get_workspaces; done; + while read EVENT; do i3-msg -t get_workspaces; done; } | jq --unbuffered -c ' def fake_ws(name): { name: name, @@ -169,7 +169,7 @@ i3-msg -t subscribe -m '["workspace", "output"]' | { #!/bin/sh i3-msg -t subscribe -m '["workspace", "output"]' | { i3-msg -t get_workspaces; - while read; do i3-msg -t get_workspaces; done; + while read EVENT; do i3-msg -t get_workspaces; done; } | jq --unbuffered -c 'sort_by(.name) | reverse' ------------------------------ @@ -179,6 +179,6 @@ i3-msg -t subscribe -m '["workspace", "output"]' | { #!/bin/sh i3-msg -t subscribe -m '["workspace", "output"]' | { i3-msg -t get_workspaces; - while read; do i3-msg -t get_workspaces; done; + while read EVENT; do i3-msg -t get_workspaces; done; } | jq --unbuffered -c '[ .[] | .name |= . + " foo" ]' ------------------------------ diff --git a/_docs/testsuite b/_docs/testsuite index ea70664..22e96ab 100644 --- a/_docs/testsuite +++ b/_docs/testsuite @@ -76,30 +76,20 @@ used to install the testsuite. Many users prefer to use the more modern The tests additionally require +Xephyr(1)+ to run a nested X server. Install +xserver-xephyr+ on Debian or +xorg-server-xephyr+ on Arch Linux. -.Installing testsuite dependencies using cpanminus (preferred) +.Installing testsuite dependencies using cpanminus -------------------------------------------------------------------------------- -$ cd ~/i3/testcases -$ sudo apt-get install cpanminus -$ sudo cpanm . +# Install testsuite system-level dependencies. Xvfb is optional but recommended. +$ sudo apt-get install xcb-proto cpanminus xvfb xserver-xephyr +# Install dependencies in ~/perl5 local library +$ cpanm --local-lib=~/perl5 local::lib App::cpanminus Module::Install +# Activate the local library +$ eval $(perl -I ~/perl5/lib/perl5/ -Mlocal::lib) +$ cd ~/i3/testcases/ +$ cpanm . $ cd ~/i3/AnyEvent-I3 -$ sudo cpanm Module::Install -$ sudo cpanm . +$ cpanm . -------------------------------------------------------------------------------- -If you don’t want to use cpanminus for some reason, the same works with cpan: - -.Installing testsuite dependencies using cpan --------------------------------------------------------------------------------- -$ cd ~/i3/testcases -$ sudo cpan . -$ cd ~/i3/AnyEvent-I3 -$ sudo cpan Module::Install -$ sudo cpan . --------------------------------------------------------------------------------- - -In case you don’t have root permissions, you can also install into your home -directory, see https://michael.stapelberg.de/cpan/ - === Mechanisms ==== Script: complete-run @@ -119,48 +109,57 @@ tests are run under Xvfb. --------------------------------------- $ cd ~/i3 -$ mkdir -p build && cd build +$ mkdir -p build -$ meson .. +$ meson setup build +$ cd build -$ ninja +$ meson compile # output omitted because it is very long -$ cd testcases - $ ./complete-run.pl # output omitted because it is very long All tests successful. Files=78, Tests=734, 27 wallclock secs ( 0.38 usr 0.48 sys + 17.65 cusr 3.21 csys = 21.72 CPU) Result: PASS -$ ./complete-run.pl t/04-floating.t -[:3] i3 startup: took 0.07s, status = 1 -[:3] Running t/04-floating.t with logfile testsuite-2011-09-24-16-06-04-4.0.2-226-g1eb011a/i3-log-for-04-floating.t -[:3] t/04-floating.t finished -[:3] killing i3 -output for t/04-floating.t: -ok 1 - use X11::XCB::Window; -ok 2 - The object isa X11::XCB::Window -ok 3 - Window is mapped -ok 4 - i3 raised the width to 75 -ok 5 - i3 raised the height to 50 -ok 6 - i3 did not map it to (0x0) -ok 7 - The object isa X11::XCB::Window -ok 8 - i3 let the width at 80 -ok 9 - i3 let the height at 90 -ok 10 - i3 mapped it to x=1 -ok 11 - i3 mapped it to y=18 -ok 12 - The object isa X11::XCB::Window -ok 13 - i3 let the width at 80 -ok 14 - i3 let the height at 90 -1..14 +$ ./complete-run.pl t/005-floating.t +Running tests under Xvfb display :99 +Starting 1 Xephyr instances, starting at :100... + +Rough time estimate for this run: 9.65 seconds + +Writing logfile to 'testsuite-2024-05-01-21-33-45-4.23-28-g5834b7e8/complete-run.log'... +[:100] i3/testcases/t/005-floating.t: finished +completed 0 of 1 tests All tests successful. -Files=1, Tests=14, 0 wallclock secs ( 0.01 usr 0.00 sys + 0.19 cusr 0.03 csys = 0.23 CPU) +Files=1, Tests=13, 0 wallclock secs ( 0.00 usr + 0.00 sys = 0.00 CPU) Result: PASS -$ less latest/i3-log-for-04-floating.t +The slowest tests are: + i3/testcases/t/005-floating.t with 0.07 seconds + +Test output: +[:100] i3/testcases/t/005-floating.t: starting +[:100] i3/testcases/t/005-floating.t: finished +output for i3/testcases/t/005-floating.t: +ok 1 - An object of class 'X11::XCB::Window' isa 'X11::XCB::Window' +ok 2 - Window is mapped +ok 3 - i3 raised the width to 75 +ok 4 - i3 raised the height to 50 +ok 5 - i3 did not map it to (0x0) +ok 6 - An object of class 'X11::XCB::Window' isa 'X11::XCB::Window' +ok 7 - i3 let the width at 80 +ok 8 - i3 let the height at 90 +ok 9 - i3 mapped it to x=20 +ok 10 - i3 mapped it to y=20 +ok 11 - An object of class 'X11::XCB::Window' isa 'X11::XCB::Window' +ok 12 - i3 let the width at 80 +ok 13 - i3 let the height at 90 +1..13 + +$ less latest/i3-log-for-005-floating.t ---------------------------------------- If your attempt to run the tests with a bare call to ./complete-run.pl fails, try this: @@ -172,37 +171,34 @@ $ ./complete-run.pl --parallel=1 --keep-xserver-output This will show the output of Xephyr, which is the X server implementation we use for testing. -===== make command: +make check+ -Make check runs the i3 testsuite. -You can still use ./testcases/complete-run.pl to get the interactive progress output. +===== ninja command: +ninja test+ ++ninja test+ runs the i3 testsuite. +You can still use ./complete-run.pl to get the interactive progress output. -.Example invocation of +make check+ +.Example invocation of +ninja test+ --------------------------------------- $ cd ~/i3 -$ mkdir -p build && cd build +$ mkdir -p build -$ meson .. +$ meson setup build +$ cd build -$ ninja -# output omitted because it is very long +$ ninja test +[1/102] Generating config.h with a custom command +[1/2] Running all tests. +1/1 complete-run OK 34.39s -$ make check -# output omitted because it is very long -PASS: testcases/complete-run.pl -============================================================================ -Testsuite summary for i3 4.13 -============================================================================ -# TOTAL: 1 -# PASS: 1 -# SKIP: 0 -# XFAIL: 0 -# FAIL: 0 -# XPASS: 0 -# ERROR: 0 -============================================================================ - -$ less test-suite.log +Ok: 1 +Expected Fail: 0 +Fail: 0 +Unexpected Pass: 0 +Skipped: 0 +Timeout: 0 + +Full log written to i3/build/meson-logs/testlog.txt + +$ less latest/complete-run.log ---------------------------------------- ==== Coverage testing diff --git a/_docs/userguide b/_docs/userguide index d211c1d..8bc5aa1 100644 --- a/_docs/userguide +++ b/_docs/userguide @@ -743,8 +743,11 @@ This option determines which border style *new* windows will have. The default +normal+. Note that default_floating_border applies only to windows which are starting out as floating windows, e.g., dialog windows, but not windows that are floated later on. -Setting border style to +pixel+ eliminates title bars. The border style +normal+ allows you to -adjust edge border width while keeping your title bar. +Setting border style to +pixel+ eliminates title bars in split layouts. The border style ++normal+ allows you to adjust edge border width while keeping your title bar. + +The title bar is always visible in stacking and tabbed layouts, and this cannot be changed +through configuration. *Syntax*: --------------------------------------------- @@ -789,35 +792,18 @@ The "smart_no_gaps" setting hides edge-specific borders of a container if the container is the only container on its workspace and the gaps to the screen edge are +0+. -*Syntax*: ------------------------------------------------ -hide_edge_borders none|vertical|horizontal|both|smart|smart_no_gaps ------------------------------------------------ - -*Example*: ----------------------- -hide_edge_borders vertical ----------------------- - [[_smart_borders]] -=== Smart borders - -Smart borders will draw borders on windows only if there is more than one window -in a workspace. This feature can also be enabled only if the gap size between -window and screen edge is +0+. ++hide_edge_borders+ has replaced the old +smart_borders+ syntax. Use the former +instead of the latter. *Syntax*: ----------------------------------------------- -smart_borders on|off|no_gaps +hide_edge_borders none|vertical|horizontal|both|smart|smart_no_gaps ----------------------------------------------- *Example*: ---------------------- -# Activate smart borders (always) -smart_borders on - -# Activate smart borders (only when there are effectively no gaps) -smart_borders no_gaps +hide_edge_borders vertical ---------------------- [[for_window]] diff --git a/docs/hacking-howto.html b/docs/hacking-howto.html index bd5f360..fecb511 100644 --- a/docs/hacking-howto.html +++ b/docs/hacking-howto.html @@ -66,9 +66,9 @@
$ mkdir -p build && cd build -$ meson .. -$ ninja+
mkdir -p build +meson setup build +meson compile -C build
Defaults to false if not included. focused takes precedence over it, - however visible is important for more than one monitors. + however visible is important for more than one monitor.
#!/bin/sh i3-msg -t subscribe -m '["workspace", "output"]' | { i3-msg -t get_workspaces; - while read; do i3-msg -t get_workspaces; done; + while read EVENT; do i3-msg -t get_workspaces; done; } | jq --unbuffered -c '[ .[] | select(.name != "foo" or .focused) ]'
Important! Make sure you use the --unbuffered flag with jq, otherwise you @@ -236,7 +236,7 @@
#!/bin/sh i3-msg -t subscribe -m '["workspace", "output"]' | { i3-msg -t get_workspaces; - while read; do i3-msg -t get_workspaces; done; + while read EVENT; do i3-msg -t get_workspaces; done; } | jq --unbuffered -c 'sort_by(.name) | reverse'
#!/bin/sh i3-msg -t subscribe -m '["workspace", "output"]' | { i3-msg -t get_workspaces; - while read; do i3-msg -t get_workspaces; done; + while read EVENT; do i3-msg -t get_workspaces; done; } | jq --unbuffered -c '[ .[] | .name |= . + " foo" ]'diff --git a/docs/testsuite.html b/docs/testsuite.html index d5a17ab..75edffd 100644 --- a/docs/testsuite.html +++ b/docs/testsuite.html @@ -145,27 +145,19 @@
The tests additionally require Xephyr(1) to run a nested X server. Install xserver-xephyr on Debian or xorg-server-xephyr on Arch Linux.
$ cd ~/i3/testcases -$ sudo apt-get install cpanminus -$ sudo cpanm . +# Install testsuite system-level dependencies. Xvfb is optional but recommended. +$ sudo apt-get install xcb-proto cpanminus xvfb xserver-xephyr +# Install dependencies in ~/perl5 local library +$ cpanm --local-lib=~/perl5 local::lib App::cpanminus Module::Install +# Activate the local library +$ eval $(perl -I ~/perl5/lib/perl5/ -Mlocal::lib) +$ cd ~/i3/testcases/ +$ cpanm . $ cd ~/i3/AnyEvent-I3 -$ sudo cpanm Module::Install -$ sudo cpanm .+$ cpanm .
If you don’t want to use cpanminus for some reason, the same works with cpan:
$ cd ~/i3/testcases -$ sudo cpan . -$ cd ~/i3/AnyEvent-I3 -$ sudo cpan Module::Install -$ sudo cpan .-
In case you don’t have root permissions, you can also install into your home -directory, see https://michael.stapelberg.de/cpan/
$ cd ~/i3 -$ mkdir -p build && cd build +$ mkdir -p build -$ meson .. +$ meson setup build +$ cd build -$ ninja +$ meson compile # output omitted because it is very long -$ cd testcases - $ ./complete-run.pl # output omitted because it is very long All tests successful. Files=78, Tests=734, 27 wallclock secs ( 0.38 usr 0.48 sys + 17.65 cusr 3.21 csys = 21.72 CPU) Result: PASS -$ ./complete-run.pl t/04-floating.t -[:3] i3 startup: took 0.07s, status = 1 -[:3] Running t/04-floating.t with logfile testsuite-2011-09-24-16-06-04-4.0.2-226-g1eb011a/i3-log-for-04-floating.t -[:3] t/04-floating.t finished -[:3] killing i3 -output for t/04-floating.t: -ok 1 - use X11::XCB::Window; -ok 2 - The object isa X11::XCB::Window -ok 3 - Window is mapped -ok 4 - i3 raised the width to 75 -ok 5 - i3 raised the height to 50 -ok 6 - i3 did not map it to (0x0) -ok 7 - The object isa X11::XCB::Window -ok 8 - i3 let the width at 80 -ok 9 - i3 let the height at 90 -ok 10 - i3 mapped it to x=1 -ok 11 - i3 mapped it to y=18 -ok 12 - The object isa X11::XCB::Window -ok 13 - i3 let the width at 80 -ok 14 - i3 let the height at 90 -1..14 +$ ./complete-run.pl t/005-floating.t +Running tests under Xvfb display :99 +Starting 1 Xephyr instances, starting at :100... + +Rough time estimate for this run: 9.65 seconds + +Writing logfile to 'testsuite-2024-05-01-21-33-45-4.23-28-g5834b7e8/complete-run.log'... +[:100] i3/testcases/t/005-floating.t: finished +completed 0 of 1 tests All tests successful. -Files=1, Tests=14, 0 wallclock secs ( 0.01 usr 0.00 sys + 0.19 cusr 0.03 csys = 0.23 CPU) +Files=1, Tests=13, 0 wallclock secs ( 0.00 usr + 0.00 sys = 0.00 CPU) Result: PASS -$ less latest/i3-log-for-04-floating.t+The slowest tests are: + i3/testcases/t/005-floating.t with 0.07 seconds + +Test output: +[:100] i3/testcases/t/005-floating.t: starting +[:100] i3/testcases/t/005-floating.t: finished +output for i3/testcases/t/005-floating.t: +ok 1 - An object of class 'X11::XCB::Window' isa 'X11::XCB::Window' +ok 2 - Window is mapped +ok 3 - i3 raised the width to 75 +ok 4 - i3 raised the height to 50 +ok 5 - i3 did not map it to (0x0) +ok 6 - An object of class 'X11::XCB::Window' isa 'X11::XCB::Window' +ok 7 - i3 let the width at 80 +ok 8 - i3 let the height at 90 +ok 9 - i3 mapped it to x=20 +ok 10 - i3 mapped it to y=20 +ok 11 - An object of class 'X11::XCB::Window' isa 'X11::XCB::Window' +ok 12 - i3 let the width at 80 +ok 13 - i3 let the height at 90 +1..13 + +$ less latest/i3-log-for-005-floating.t
If your attempt to run the tests with a bare call to ./complete-run.pl fails, try this:
This will show the output of Xephyr, which is the X server implementation we use for testing.
Make check runs the i3 testsuite. -You can still use ./testcases/complete-run.pl to get the interactive progress output.
ninja test runs the i3 testsuite. +You can still use ./complete-run.pl to get the interactive progress output.
$ cd ~/i3 -$ mkdir -p build && cd build +$ mkdir -p build -$ meson .. +$ meson setup build +$ cd build -$ ninja -# output omitted because it is very long +$ ninja test +[1/102] Generating config.h with a custom command +[1/2] Running all tests. +1/1 complete-run OK 34.39s -$ make check -# output omitted because it is very long -PASS: testcases/complete-run.pl -============================================================================ -Testsuite summary for i3 4.13 -============================================================================ -# TOTAL: 1 -# PASS: 1 -# SKIP: 0 -# XFAIL: 0 -# FAIL: 0 -# XPASS: 0 -# ERROR: 0 -============================================================================ - -$ less test-suite.log+Ok: 1 +Expected Fail: 0 +Fail: 0 +Unexpected Pass: 0 +Skipped: 0 +Timeout: 0 + +Full log written to i3/build/meson-logs/testlog.txt + +$ less latest/complete-run.log
This option determines which border style new windows will have. The default is normal. Note that default_floating_border applies only to windows which are starting out as floating windows, e.g., dialog windows, but not windows that are floated later on.
Setting border style to pixel eliminates title bars. The border style normal allows you to -adjust edge border width while keeping your title bar.
Setting border style to pixel eliminates title bars in split layouts. The border style +normal allows you to adjust edge border width while keeping your title bar.
The title bar is always visible in stacking and tabbed layouts, and this cannot be changed +through configuration.
Syntax:
The "smart_no_gaps" setting hides edge-specific borders of a container if the container is the only container on its workspace and the gaps to the screen edge are 0.
hide_edge_borders has replaced the old smart_borders syntax. Use the former +instead of the latter.
Syntax:
Smart borders will draw borders on windows only if there is more than one window -in a workspace. This feature can also be enabled only if the gap size between -window and screen edge is 0.
Syntax:
smart_borders on|off|no_gaps-
Example:
# Activate smart borders (always) -smart_borders on - -# Activate smart borders (only when there are effectively no gaps) -smart_borders no_gaps-
With the for_window directive, you can let i3 execute any command when it encounters a specific window. This can be used to set windows to floating or to change their border style, for example.
When a new window appears, it will be focused. The no_focus directive allows preventing this from happening and must be used in combination with [command_criteria].
Note that this does not apply to all cases, e.g., when feeding data into a running application @@ -974,7 +958,7 @@
As you learned in the section about keyboard bindings, you will have to configure lots of bindings containing modifier keys. If you want to save yourself some typing and be able to change the modifier you use later, @@ -1000,7 +984,7 @@
[variables] can also be created using a value configured in the X resource database. This is useful, for example, to avoid configuring color values within the i3 configuration. Instead, the values can be configured, once, in the X @@ -1028,7 +1012,7 @@
To automatically make a specific window show up on a specific workspace, you can use an assignment. You can match windows by using any criteria, see [command_criteria]. The difference between assign and @@ -1130,7 +1114,7 @@
By using the exec keyword outside a keybinding, you can configure which commands will be performed by i3 on initial startup. exec commands will not run when restarting i3, if you need a command to run @@ -1157,7 +1141,7 @@
The flag --no-startup-id is explained in [exec].
If you assign clients to workspaces, it might be handy to put the workspaces on specific screens. Also, the assignment of workspaces to screens will determine which workspace i3 uses for a new screen when adding screens @@ -1193,7 +1177,7 @@
You can change all colors which i3 uses to draw the window decorations.
Syntax:
i3 uses Unix sockets to provide an IPC interface. This allows third-party programs to get information from i3, such as the current workspaces (to display a workspace bar), and to control i3.
By default, window focus follows your mouse movements as the mouse crosses window borders. However, if you have a setup where your mouse usually is in your way (like a touchpad on your laptop which you do not want to disable @@ -1332,7 +1316,7 @@
By default, when switching focus to a window on a different output (e.g. focusing a window on workspace 3 on output VGA-1, coming from workspace 2 on LVDS-1), the mouse cursor is warped to the center of that window.
When you are in fullscreen mode, some applications still open popup windows (take Xpdf for example). This is because these applications might not be aware that they are in fullscreen mode (they do not check the corresponding hint). @@ -1388,7 +1372,7 @@
By default, when in a container with several windows or child containers, the opposite window will be focused when trying to move the focus over the edge of a container (and there are no other containers in that direction) — the focus @@ -1425,7 +1409,7 @@
As explained in-depth in https://i3wm.org/docs/multi-monitor.html, some X11 video drivers (especially the nVidia binary driver) only provide support for Xinerama instead of RandR. In such a situation, i3 must be told to use the @@ -1448,7 +1432,7 @@
This configuration directive enables automatic workspace back_and_forth (see [back_and_forth]) when switching to the workspace that is currently focused.
For instance: Assume you are on workspace "1: www" and switch to "2: IM" using @@ -1466,7 +1450,7 @@
If an application on another workspace sets an urgency hint, switching to this workspace might lead to immediate focus of the application, which also means the window decoration color would be immediately reset to client.focused. This @@ -1488,7 +1472,7 @@
If a window is activated, e.g., via google-chrome www.google.com, it may request to take focus. Since this might not be preferable, different reactions can be configured.
Note that this might not affect windows that are being opened. To prevent new windows @@ -1536,7 +1520,7 @@
If activated, marks (see [vim_like_marks]) on windows are drawn in their window decoration. However, any mark starting with an underscore in its name (_) will not be drawn even if this option is activated.
Config files support line continuation, meaning when you end a line in a backslash character (\), the line-break will be ignored by the parser. This feature can be used to create more readable configuration files. @@ -1569,7 +1553,7 @@
You can configure how to initiate the tiling drag feature (see [tiling_drag]).
The default is modifier.
Syntax:
Since i3 4.22, you can configure window gaps. “Gaps” are added spacing between windows (or split containers) and to the screen edges: