Full Code of niri-wm/niri for AI

main b07bde3ee82d cached
5546 files
6.4 MB
2.1M tokens
3867 symbols
1 requests
Download .txt
Showing preview only (8,295K chars total). Download the full file or copy to clipboard to get everything.
Repository: niri-wm/niri
Branch: main
Commit: b07bde3ee82d
Files: 5546
Total size: 6.4 MB

Directory structure:
gitextract_heky1qt6/

├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── config.yml
│   ├── dependabot.yml
│   └── workflows/
│       ├── ci.yml
│       └── release.yml
├── .gitignore
├── CONTRIBUTING.md
├── Cargo.toml
├── LICENSE
├── README.md
├── build.rs
├── clippy.toml
├── docs/
│   ├── .gitignore
│   ├── hooks/
│   │   ├── remove-must-fail.py
│   │   └── shortcodes.py
│   ├── mkdocs.yaml
│   ├── pyproject.toml
│   └── wiki/
│       ├── Accessibility.md
│       ├── Application-Issues.md
│       ├── Configuration:-Animations.md
│       ├── Configuration:-Debug-Options.md
│       ├── Configuration:-Gestures.md
│       ├── Configuration:-Include.md
│       ├── Configuration:-Input.md
│       ├── Configuration:-Introduction.md
│       ├── Configuration:-Key-Bindings.md
│       ├── Configuration:-Layer-Rules.md
│       ├── Configuration:-Layout.md
│       ├── Configuration:-Miscellaneous.md
│       ├── Configuration:-Named-Workspaces.md
│       ├── Configuration:-Outputs.md
│       ├── Configuration:-Overview.md
│       ├── Configuration:-Recent-Windows.md
│       ├── Configuration:-Switch-Events.md
│       ├── Configuration:-Window-Rules.md
│       ├── Development:-Animation-Timing.md
│       ├── Development:-Design-Principles.md
│       ├── Development:-Developing-niri.md
│       ├── Development:-Documenting-niri.md
│       ├── Development:-Fractional-Layout.md
│       ├── Development:-Redraw-Loop.md
│       ├── Example-systemd-Setup.md
│       ├── FAQ.md
│       ├── Floating-Windows.md
│       ├── Fullscreen-and-Maximize.md
│       ├── Gestures.md
│       ├── Getting-Started.md
│       ├── IPC.md
│       ├── Important-Software.md
│       ├── Integrating-niri.md
│       ├── Layer‐Shell-Components.md
│       ├── Name-and-Logo.md
│       ├── Nvidia.md
│       ├── Overview.md
│       ├── Packaging-niri.md
│       ├── README.md
│       ├── Screencasting.md
│       ├── Tabs.md
│       ├── Workspaces.md
│       ├── Xwayland.md
│       ├── _Sidebar.md
│       ├── _assets/
│       │   └── stylesheets/
│       │       └── niri.css
│       └── examples/
│           ├── close_custom_shader.frag
│           ├── open_custom_shader.frag
│           └── resize_custom_shader.frag
├── flake.nix
├── niri-config/
│   ├── Cargo.toml
│   ├── src/
│   │   ├── animations.rs
│   │   ├── appearance.rs
│   │   ├── binds.rs
│   │   ├── debug.rs
│   │   ├── error.rs
│   │   ├── gestures.rs
│   │   ├── input.rs
│   │   ├── layer_rule.rs
│   │   ├── layout.rs
│   │   ├── lib.rs
│   │   ├── macros.rs
│   │   ├── misc.rs
│   │   ├── output.rs
│   │   ├── recent_windows.rs
│   │   ├── utils/
│   │   │   └── merge_with.rs
│   │   ├── utils.rs
│   │   ├── window_rule.rs
│   │   └── workspace.rs
│   └── tests/
│       └── wiki-parses.rs
├── niri-ipc/
│   ├── Cargo.toml
│   ├── README.md
│   └── src/
│       ├── lib.rs
│       ├── socket.rs
│       └── state.rs
├── niri-visual-tests/
│   ├── Cargo.toml
│   ├── README.md
│   ├── resources/
│   │   └── style.css
│   └── src/
│       ├── cases/
│       │   ├── gradient_angle.rs
│       │   ├── gradient_area.rs
│       │   ├── gradient_oklab.rs
│       │   ├── gradient_oklab_alpha.rs
│       │   ├── gradient_oklch_alpha.rs
│       │   ├── gradient_oklch_decreasing.rs
│       │   ├── gradient_oklch_increasing.rs
│       │   ├── gradient_oklch_longer.rs
│       │   ├── gradient_oklch_shorter.rs
│       │   ├── gradient_srgb.rs
│       │   ├── gradient_srgb_alpha.rs
│       │   ├── gradient_srgblinear.rs
│       │   ├── gradient_srgblinear_alpha.rs
│       │   ├── layout.rs
│       │   ├── mod.rs
│       │   ├── tile.rs
│       │   └── window.rs
│       ├── main.rs
│       ├── smithay_view.rs
│       └── test_window.rs
├── niri.spec.rpkg
├── resources/
│   ├── cursor.rgba
│   ├── default-config.kdl
│   ├── dinit/
│   │   ├── niri
│   │   └── niri.target
│   ├── mutter-x11-interop.xml
│   ├── niri-portals.conf
│   ├── niri-session
│   ├── niri-shutdown.target
│   ├── niri.desktop
│   ├── niri.service
│   └── rustdoc-index.html
├── rustfmt.toml
├── src/
│   ├── a11y.rs
│   ├── animation/
│   │   ├── bezier.rs
│   │   ├── clock.rs
│   │   ├── mod.rs
│   │   └── spring.rs
│   ├── backend/
│   │   ├── headless.rs
│   │   ├── mod.rs
│   │   ├── tty.rs
│   │   └── winit.rs
│   ├── cli.rs
│   ├── cursor.rs
│   ├── dbus/
│   │   ├── freedesktop_a11y.rs
│   │   ├── freedesktop_locale1.rs
│   │   ├── freedesktop_login1.rs
│   │   ├── freedesktop_screensaver.rs
│   │   ├── gnome_shell_introspect.rs
│   │   ├── gnome_shell_screenshot.rs
│   │   ├── mod.rs
│   │   ├── mutter_display_config.rs
│   │   ├── mutter_screen_cast.rs
│   │   └── mutter_service_channel.rs
│   ├── frame_clock.rs
│   ├── handlers/
│   │   ├── compositor.rs
│   │   ├── layer_shell.rs
│   │   ├── mod.rs
│   │   └── xdg_shell.rs
│   ├── input/
│   │   ├── backend_ext.rs
│   │   ├── mod.rs
│   │   ├── move_grab.rs
│   │   ├── pick_color_grab.rs
│   │   ├── pick_window_grab.rs
│   │   ├── resize_grab.rs
│   │   ├── scroll_swipe_gesture.rs
│   │   ├── scroll_tracker.rs
│   │   ├── spatial_movement_grab.rs
│   │   ├── swipe_tracker.rs
│   │   ├── touch_overview_grab.rs
│   │   └── touch_resize_grab.rs
│   ├── ipc/
│   │   ├── client.rs
│   │   ├── mod.rs
│   │   └── server.rs
│   ├── layer/
│   │   ├── mapped.rs
│   │   └── mod.rs
│   ├── layout/
│   │   ├── closing_window.rs
│   │   ├── floating.rs
│   │   ├── focus_ring.rs
│   │   ├── insert_hint_element.rs
│   │   ├── mod.rs
│   │   ├── monitor.rs
│   │   ├── opening_window.rs
│   │   ├── scrolling.rs
│   │   ├── shadow.rs
│   │   ├── tab_indicator.rs
│   │   ├── tests/
│   │   │   ├── animations.rs
│   │   │   └── fullscreen.rs
│   │   ├── tests.rs
│   │   ├── tile.rs
│   │   └── workspace.rs
│   ├── lib.rs
│   ├── main.rs
│   ├── niri.rs
│   ├── protocols/
│   │   ├── ext_workspace.rs
│   │   ├── foreign_toplevel.rs
│   │   ├── gamma_control.rs
│   │   ├── mod.rs
│   │   ├── mutter_x11_interop.rs
│   │   ├── output_management.rs
│   │   ├── raw.rs
│   │   ├── screencopy.rs
│   │   └── virtual_pointer.rs
│   ├── render_helpers/
│   │   ├── border.rs
│   │   ├── clipped_surface.rs
│   │   ├── damage.rs
│   │   ├── debug.rs
│   │   ├── gradient_fade_texture.rs
│   │   ├── memory.rs
│   │   ├── mod.rs
│   │   ├── offscreen.rs
│   │   ├── primary_gpu_texture.rs
│   │   ├── render_elements.rs
│   │   ├── renderer.rs
│   │   ├── resize.rs
│   │   ├── resources.rs
│   │   ├── shader_element.rs
│   │   ├── shaders/
│   │   │   ├── border.frag
│   │   │   ├── clipped_surface.frag
│   │   │   ├── close_epilogue.frag
│   │   │   ├── close_prelude.frag
│   │   │   ├── gradient_fade.frag
│   │   │   ├── mod.rs
│   │   │   ├── open_epilogue.frag
│   │   │   ├── open_prelude.frag
│   │   │   ├── resize.frag
│   │   │   ├── resize_epilogue.frag
│   │   │   ├── resize_prelude.frag
│   │   │   ├── shadow.frag
│   │   │   └── texture.vert
│   │   ├── shadow.rs
│   │   ├── snapshot.rs
│   │   ├── solid_color.rs
│   │   ├── surface.rs
│   │   └── texture.rs
│   ├── rubber_band.rs
│   ├── screencasting/
│   │   ├── mod.rs
│   │   └── pw_utils.rs
│   ├── tests/
│   │   ├── animations.rs
│   │   ├── client.rs
│   │   ├── fixture.rs
│   │   ├── floating.rs
│   │   ├── fullscreen.rs
│   │   ├── layer_shell.rs
│   │   ├── mod.rs
│   │   ├── server.rs
│   │   ├── snapshots/
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsAN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsAN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsAN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsAN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsAU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsAU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsAU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsAU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsBN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsBN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsBN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsBN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsBU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsBU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsBU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsBU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsAN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsAN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsAN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsAN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsAU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsAU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsAU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsAU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsBN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsBN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsBN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsBN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsBU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsBU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsBU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsBU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsAN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsAN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsAN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsAN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsAU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsAU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsAU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsAU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsBN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsBN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsBN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsBN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsBU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsBU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsBU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsBU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsAN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsAN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsAN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsAN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsAU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsAU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsAU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsAU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsBN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsBN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsBN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsBN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsBU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsBU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsBU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsBU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsAN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsAN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsAN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsAN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsAU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsAU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsAU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsAU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsBN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsBN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsBN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsBN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsBU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsBU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsBU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsBU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsAN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsAN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsAN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsAN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsAU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsAU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsAU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsAU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsBN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsBN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsBN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsBN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsBU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsBU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsBU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsBU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsAN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsAN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsAN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsAN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsAU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsAU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsAU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsAU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsBN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsBN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsBN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsBN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsBU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsBU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsBU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsBU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsAN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsAN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsAN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsAN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsAU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsAU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsAU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsAU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsBN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsBN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsBN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsBN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsBU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsBU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsBU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsBU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsAN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsAN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsAN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsAN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsAU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsAU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsAU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsAU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsBN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsBN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsBN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsBN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsBU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsBU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsBU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsBU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2.snap
│   │   │   ├── niri__tests__window_opening__check_target_size.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-dhF500-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-dhF500-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-dhF500-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-dhF500-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-dhF500-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-dhF500-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-dhF500-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-dhF500-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
# LFS configuration for images from the wiki
*.png filter=lfs diff=lfs merge=lfs -text

# Exclude LFS-tracked files from the tarball
/docs/wiki/img/ export-ignore

# exclude .gitattributes itself from the tarball
.gitattributes export-ignore

# tip: can be tested using
# git archive --format=tar.gz --output=source.tar.gz HEAD && \
# tar tfvz source.tar.gz | grep -e '.png' -e '.gitattributes'


================================================
FILE: .github/FUNDING.yml
================================================
github: YaLTeR


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Report a bug or a crash
title: ''
labels: bug
assignees: ''

---

<!-- Please describe the issue here at the top, then fill in the system information below. -->

<!-- Attaching your full niri config can help diagnose the problem. -->
<details><summary>Config</summary>

```kdl
insert config here
```

</details> 

<!--
If you have a problem with a specific app, please verify that it is running on Wayland, rather than X11. An easy way is to run xeyes and mouse over the app: xeyes will be able to "see" only X11 windows.

You can also check what process the window PID belongs to:

$ readlink /proc/$(niri msg --json pick-window | jq .pid)/exe

If this points to xwayland-satellite, then it's an X11 window.

Please report issues with X11 apps to xwayland-satellite instead of niri: https://github.com/Supreeeme/xwayland-satellite/issues
-->

### System Information

<!-- Paste the output of `niri -V`, e.g. niri 25.02 (b94a5db) -->
* niri version: 

<!-- Write your distribution, e.g. Fedora 40 Silverblue -->
* Distro: 

<!-- Write your GPU vendor and model, e.g. AMD RX 6700M -->
* GPU: 

<!-- Write your CPU vendor and model, e.g. AMD Ryzen 7 6800H -->
* CPU:


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
contact_links:
  - name: Feature request
    url: https://github.com/niri-wm/niri/discussions/new?category=ideas
    about: Ideas for new features and functionality (start a Discussion)
  - name: Ask a question
    url: https://github.com/niri-wm/niri/discussions/new?category=q-a
    about: Question about niri (start a Discussion)
  - name: Matrix room
    url: https://matrix.to/#/#niri:matrix.org
    about: Chat about niri with other users


================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
  - package-ecosystem: "cargo"
    directory: "/"
    schedule:
      interval: "weekly"
    groups:
      smithay:
        patterns:
          - "smithay"
          - "smithay-drm-extras"
      rust-dependencies:
        update-types:
          - "minor"
          - "patch"
    cooldown:
      default-days: 7

  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"
    cooldown:
      default-days: 7


================================================
FILE: .github/workflows/ci.yml
================================================
name: CI

on:
  push:
  pull_request:
  workflow_dispatch:
  schedule:
    - cron: '0 0 1 * *' # Monthly

env:
  DEPS_APT: curl gcc clang libudev-dev libgbm-dev libxkbcommon-dev libegl1-mesa-dev libwayland-dev libinput-dev libdbus-1-dev libsystemd-dev libseat-dev libpipewire-0.3-dev libpango1.0-dev libdisplay-info-dev
  DEPS_DNF: cargo gcc clang libudev-devel libgbm-devel libxkbcommon-devel wayland-devel libinput-devel dbus-devel systemd-devel libseat-devel pipewire-devel pango-devel cairo-gobject-devel libdisplay-info-devel
  DEPS_APK: cargo clang-libclang eudev-dev glib-dev libdisplay-info-dev libinput-dev libseat-dev libxkbcommon-dev mesa-dev pango-dev pipewire-dev tar
  DEPS_PKG: git curl rust llvm pkgconf pixman libudev-devd libdisplay-info seatd libinput libxkbcommon pipewire mesa-libs cairo devel/glib20 gettext-runtime harfbuzz pango

jobs:
  test:
    strategy:
      fail-fast: false

    name: test
    runs-on: ubuntu-24.04
    # FIXME: remove once it's available in runs-on.
    # This is necessary for libwayland-server v1.23.
    container: ubuntu:26.04

    steps:
      - uses: actions/checkout@v4
        with:
          show-progress: false

      - name: Install dependencies
        run: |
          apt-get update -y
          apt-get install -y ${{ env.DEPS_APT }}

      - uses: dtolnay/rust-toolchain@stable

      - uses: Swatinem/rust-cache@v2

      - name: Build tests
        run: cargo test --no-run --all --exclude niri-visual-tests

      - name: Test
        run: cargo test --all --exclude niri-visual-tests -- --nocapture

  build:
    strategy:
      fail-fast: false

    name: check feature combinations
    runs-on: ubuntu-24.04

    steps:
      - uses: actions/checkout@v4
        with:
          show-progress: false

      - name: Install dependencies
        run: |
          sudo apt-get update -y
          sudo apt-get install -y ${{ env.DEPS_APT }}

      - uses: dtolnay/rust-toolchain@stable

      - uses: Swatinem/rust-cache@v2

      - name: Check (no default features)
        run: cargo check --no-default-features

      - name: Check (just dbus)
        run: cargo check --no-default-features --features dbus

      - name: Check (just systemd)
        run: cargo check --no-default-features --features systemd

      - name: Check (just dinit)
        run: cargo check --no-default-features --features dinit

      - name: Check (just xdp-gnome-screencast)
        run: cargo check --no-default-features --features xdp-gnome-screencast

      - name: Check
        run: cargo check

      - name: Build (with profiling)
        run: cargo build --features profile-with-tracy

  build-musl:
    strategy:
      fail-fast: false

    name: alpine musl
    runs-on: ubuntu-24.04
    container: alpine:3
    steps:
      - uses: actions/checkout@v4
        with:
          show-progress: false

      - name: Install Deps
        run: apk add --no-cache ${{ env.DEPS_APK }}

      - uses: Swatinem/rust-cache@v2

      - name: Build
        run: cargo build --no-default-features --features dbus,xdp-gnome-screencast

  # Job that runs randomized tests for a longer period of time.
  # Also runs normal slow tests.
  randomized-tests:
    strategy:
      fail-fast: false

    name: randomized and slow tests
    runs-on: ubuntu-24.04
    # FIXME: remove once it's available in runs-on.
    # This is necessary for libwayland-server v1.23.
    container: ubuntu:26.04

    env:
      RUST_BACKTRACE: 1
      RUN_SLOW_TESTS: 1
      PROPTEST_CASES: 200000
      PROPTEST_MAX_LOCAL_REJECTS: 200000
      PROPTEST_MAX_GLOBAL_REJECTS: 200000
      PROPTEST_MAX_SHRINK_ITERS: 200000

    steps:
      - uses: actions/checkout@v4
        with:
          show-progress: false

      - name: Install dependencies
        run: |
          apt-get update -y
          apt-get install -y ${{ env.DEPS_APT }}

      - uses: dtolnay/rust-toolchain@stable

      - uses: Swatinem/rust-cache@v2

      - name: Build tests
        run: cargo test --no-run --all --exclude niri-visual-tests --release

      - name: Test
        run: cargo test --all --exclude niri-visual-tests --release

  visual-tests:
    strategy:
      fail-fast: false

    name: visual tests
    runs-on: ubuntu-24.04

    steps:
      - uses: actions/checkout@v4
        with:
          show-progress: false

      - name: Install dependencies
        run: |
          sudo apt-get update -y
          sudo apt-get install -y ${{ env.DEPS_APT }} libadwaita-1-dev

      - uses: dtolnay/rust-toolchain@stable

      - uses: Swatinem/rust-cache@v2

      - name: Build
        run: cargo build --package niri-visual-tests

  msrv:
    strategy:
      fail-fast: false

    name: msrv
    runs-on: ubuntu-24.04

    steps:
      - uses: actions/checkout@v4
        with:
          show-progress: false

      - name: Install dependencies
        run: |
          sudo apt-get update -y
          sudo apt-get install -y ${{ env.DEPS_APT }} libadwaita-1-dev

      - uses: dtolnay/rust-toolchain@1.85.0

      - uses: Swatinem/rust-cache@v2

      - run: cargo check --all-targets

  clippy:
    strategy:
      fail-fast: false

    name: clippy
    runs-on: ubuntu-24.04

    steps:
      - uses: actions/checkout@v4
        with:
          show-progress: false

      - name: Install dependencies
        run: |
          sudo apt-get update -y
          sudo apt-get install -y ${{ env.DEPS_APT }} libadwaita-1-dev

      - uses: dtolnay/rust-toolchain@stable
        with:
          components: clippy

      - uses: Swatinem/rust-cache@v2

      - name: Run clippy
        run: cargo clippy --all --all-targets

  rustfmt:
    runs-on: ubuntu-24.04

    steps:
      - uses: actions/checkout@v4
        with:
          show-progress: false

      - uses: dtolnay/rust-toolchain@nightly
        with:
          components: rustfmt

      - name: Run rustfmt
        run: cargo fmt --all -- --check

  fedora:
    runs-on: ubuntu-24.04
    container: fedora:41

    steps:
      - uses: actions/checkout@v4
        with:
          show-progress: false

      - name: Install dependencies
        run: |
          sudo dnf update -y
          sudo dnf install -y ${{ env.DEPS_DNF }} libadwaita-devel

      - uses: Swatinem/rust-cache@v2
      - run: cargo build --all

  freebsd:
    runs-on: ubuntu-24.04
    env:
      CARGO_HOME: /home/runner/work/niri/niri/cargo-home

    steps:
      - uses: actions/checkout@v4
        with:
          show-progress: false

      # Remove man-db triggers to speed up Ubuntu upgrade by a minute or two during vmactions/freebsd-vm action run.
      - run: |
          sudo rm /var/lib/dpkg/info/man-db.*

      - name: Build
        uses: vmactions/freebsd-vm@v1
        with:
          release: "15.0"
          copyback: false
          prepare: |
            pkg update -f
            pkg install -y ${{ env.DEPS_PKG }}
          run: |
            curl -o patch-pipewire_init 'https://cgit.freebsd.org/ports/plain/x11-wm/niri/files/patch-pipewire_init?id=cadf6784d264cf780b6e0ad59bd15b831d36cf80'

            export CARGO_HOME="$PWD/cargo-home"

            cargo fetch

            ( cd $CARGO_HOME/registry/src/index.crates.io-*/; patch -p1 < $CARGO_HOME/../patch-pipewire_init; )

            cargo build \
              --offline \
              --no-default-features --features dbus,xdp-gnome-screencast

  nix:
    runs-on: ubuntu-24.04
    steps:
      - name: Free Disk Space (Ubuntu)
        uses: jlumbroso/free-disk-space@v1.3.1
        with:
          dotnet: false
          large-packages: false
        
      - uses: actions/checkout@v4
        with:
          show-progress: false

      - name: Install Nix
        uses: cachix/install-nix-action@v31
        continue-on-error: true

      - run: nix flake check
        continue-on-error: true

  publish-wiki:
    if: github.event_name == 'push' && github.ref == 'refs/heads/main'
    needs:
      - publish-docs
    permissions:
      contents: write
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v4
        with:
          lfs: true
          show-progress: false

      - uses: Andrew-Chen-Wang/github-wiki-action@b7e552d7cb0fa7f83e459012ffc6840fd87bcb83
        with:
          path: docs/wiki/

  publish-docs:
    if: github.event_name == 'push' && github.ref == 'refs/heads/main'
    needs:
      - test
    permissions:
      contents: write
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v4
        with:
          lfs: true
          show-progress: false

      - name: Install uv
        uses: astral-sh/setup-uv@v6
        with:
            enable-cache: true

      - name: Install the project
        run: uv sync --locked --all-extras --dev
        working-directory: docs/

      - name: Generate niri documentation
        run: uv run mkdocs build
        working-directory: docs/

      - uses: dtolnay/rust-toolchain@stable

      - name: Generate rustdoc documentation
        run: cargo doc --no-deps -p niri-ipc

      - run: mkdir -p publish/niri_ipc
      - run: cp -r ./target/doc/* ./publish/
      - run: cp -r ./docs/site/* ./publish/

      - name: Deploy documentation
        if: github.ref == 'refs/heads/main'
        uses: peaceiris/actions-gh-pages@v4
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          publish_dir: ./publish
          force_orphan: true


================================================
FILE: .github/workflows/release.yml
================================================
name: Prepare release

on:
  workflow_dispatch:
    inputs:
      version:
        description: 'Public version'
        required: true

concurrency:
  group: ${{ github.workflow }}
  cancel-in-progress: true

env:
  RUN_SLOW_TESTS: 1

jobs:
  prepare-release:
    runs-on: ubuntu-24.04

    permissions:
      contents: write

    steps:
      - uses: actions/checkout@v4
        with:
          show-progress: false

      - name: Check for unreplaced "Since:" in the wiki
        run: |
          if grep --recursive 'Since: next release' wiki; then
            exit 1
          fi

      - name: Install dependencies
        run: |
          sudo apt-get update -y
          sudo apt-get install -y curl gcc clang libudev-dev libgbm-dev libxkbcommon-dev libegl1-mesa-dev libwayland-dev libinput-dev libdbus-1-dev libsystemd-dev libseat-dev libpipewire-0.3-dev libpango1.0-dev libdisplay-info-dev libadwaita-1-dev

      - uses: dtolnay/rust-toolchain@stable

      - name: Create vendored dependencies archive
        run: |
          mkdir .cargo
          cargo vendor --locked > .cargo/config.toml
          tar cJf niri-${{ github.event.inputs.version }}-vendored-dependencies.tar.xz vendor/

      - name: Build
        run: cargo build --all --frozen --release

      - name: Build tests
        run: cargo test --no-run --all --frozen --release

      - name: Test
        run: cargo test --all --frozen --release -- --nocapture

      - name: Draft release
        uses: softprops/action-gh-release@v2
        with:
          draft: true
          tag_name: v${{ github.event.inputs.version }}
          files: niri-${{ github.event.inputs.version }}-vendored-dependencies.tar.xz
          fail_on_unmatched_files: true


================================================
FILE: .gitignore
================================================
/target
/result

.idea

================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to niri

Thanks for your interest in niri!
The project has grown quite a bit, and we could use all help that we can.

Make sure to join our Matrix chat if you have any questions or want to discuss anything: https://matrix.to/#/#niri:matrix.org

## Issues and discussions

This is a good way to help many new and existing users without programming knowledge.

- Answer and help people in GitHub issues and discussions.
- Check and point out duplicate issues.
- Check for issues that are likely application bugs (and not niri bugs).
    - Ask or try to reproduce on another non-Smithay-based compositor (sway, KDE/KWin, GNOME/Mutter). If the issue reproduces, it's likely an application bug.
    - Ask or try to reproduce on another *Smithay-based* compositor ([cosmic-comp], [anvil]). If the issue reproduces only on Smithay compositors, it may be a Smithay bug.
    - Make sure you're testing the Wayland version of the app on all compositors. Apps may silently use X11 when an X11 `$DISPLAY` is available.
    - Problems with X11 apps should be reported to [xwayland-satellite]. When testing xwayland-satellite on different compositors, make sure you use xwayland-satellite's `$DISPLAY` (rather than another compositor's built-in Xwayland `$DISPLAY`).
    - After testing, mention where you could and couldn't reproduce, as well as the exact steps to reproduce if the issue is missing them.
- Try to reproduce the issue on your own system and write if you could or couldn't reproduce it.
- Upvote issues with a thumbs up reaction as you like.
- Ideas and feature requests from new users should go to Discussions.

If your issue is a duplicate, or not a niri issue (application bug, hardware problem, configuration problem), then please close it.

## Reviewing and testing pull requests

With the growing popularity, the volume of pull requests is honestly more than I can manage myself in my free time.
I would really appreciate help with testing and reviewing them.

### Testing

Pick a pull request you like, then build it and give it a go.
The [Developing niri wiki page](https://niri-wm.github.io/niri/Development:-Developing-niri) has guidance on running niri test builds.

Be really thorough with your testing.
We're striving for polished features in niri, so point out any issues and bugs, even small ones like animation jank.

- Think of weird edge cases or unexpected interactions and try them to see that they work reasonably.
- Try to break the feature and check that it behaves well.
- Where applicable, try different input devices: keyboard, mouse, trackpad, tablet, touchscreen.
- Watch out for any new performance drops.

For bug fixes, first make sure you can reproduce the bug, then do the same steps in the PR test build, and verify that the bug is fixed.
Be similarly thorough: test any similar or related edge cases to verify that the fix doesn't introduce any new problems.

Write your findings in the pull request: any issues you found, or if everything worked well.
Re-test after the author updates the code to see that your issues were fixed.

Don't hesitate to test even if someone else already did; very frequently different people will stumble upon different problems.

### Reviewing

Reviewing pull requests is something I need the most help with since there are a lot of them, and it's quite time-consuming.
Anyone with code accepted into niri is welcome, but this is not a requirement; even if you aren't familiar with Rust you may find some logic problems.

Pick a pull request, then review its code.

- Check that everything looks good, check various conditions for edge cases.
- See if there are any scenarios the author forgot to handle.
- Check that the code fits well into the rest of niri, follows its design and code style.
    - I understand this is vague. The idea is: look at the surrounding code and at similar modules (e.g. when implementing a new protocol, check other protocol implementations), and try to follow the style and structure.
- Check for unrelated changes that may be better split into their own pull request.
- Check that the wiki had been updated if necessary (for example, new config options were documented with examples, and have a correct Since annotation).

Point out everything you find as review comments (don't forget to submit the review).
Be constructive and respectful; some people may be new to programming and Rust.
As the author addresses the comments and issues, check the code again to see that the problems were fixed.
If everything looks good, say that, so I know someone has reviewed the PR.

As with testing, don't hesitate to look through and comment even if someone else already had.
Extra pairs of eyes catch more problems.

## Writing pull requests

When creating pull requests, please keep the following in mind.

- Make sure new features align with niri's design directions. Ideally, there should be an existing issue or discussion where we settled on that solution.
- Keep pull requests focused on a single feature or bug fix with no unrelated changes.
- Try to split your changes into small, self-contained commits. Every commit should build and pass tests. This makes it much easier to review your PR, and bisect for regressions in the future.
    - When addressing PR comments, try to squash the changes straight into the relevant commits.
    - In some cases when the requested changes are big/unclear, you can leave them as separate commits on top, but please squash and otherwise clean up the history when the changes are finalized.
    - To update the main branch, please rebase instead of merging. Try to force-push the main update rebase separately from other changes, this way it's easy to skip during review since it's usually not interesting.
    - When working on bigger features, I usually start with a big messy commit, then gradually split out smaller self-contained changes from it as the code gets into shape.
    - [git-rebase.io](https://git-rebase.io/) is a helpful guide for splitting commits and cleaning up history in git.
- When you address a review comment, mark it as resolved.
- Remember to [run tests](https://niri-wm.github.io/niri/Development:-Developing-niri#tests) and format the code with `cargo +nightly fmt --all`.
- For new layout actions, remember to add them to the randomized tests. For weird Wayland handling, adding client-server tests in `src/tests/` could be very useful.
- Test your changes by hand thoroughly, including for edge cases and weird interactions. See the Testing section above for some tips.
- Remember to document new config options on the wiki.
- When opening a pull request, ensure "Allow edits from maintainers" is enabled, so I can make final tweaks before merging.

### How to get your pull request reviewed more quickly

- Make it small and self-contained. Avoid mixing several unrelated changes in one PR.
- Split the PR into small and self-contained commits. This makes it much easier to review.
- Discuss new features, options, or behavior changes beforehand; make sure there's consensus about the design.
- When creating the pull request, clearly write what it does, what problem it solves, how to test it.
- Follow the rest of the advice from this document.

## AI contributions

If you use LLMs for your contribution (issue, comment, pull request), then it is *your job* to check and clean up its output, just like with any other tool.
*You* have to spend the time doing this.
Particularly:

- If I can tell that a pull request is mostly LLM-generated, then very likely this pull request will take *significantly more time and effort* than usual to review and finish. This is based on my prior review experience. Therefore, I'm not interested in such pull requests—there's always plenty of human-written ones which take priority.
- When using an LLM to prepare an issue, the text usually has a lot of unnecessary wording and irrelevant details. Anyone looking at such an issue will quickly lose interest in reading through it (myself certainly). Clean up the text and keep only those details that actually matter.
- When using an LLM to comment on an issue, *you* have to verify that the comment makes sense, contributes something useful, and doesn't have unnecessary repetition.


[cosmic-comp]: https://github.com/pop-os/cosmic-comp
[anvil]: https://github.com/Smithay/smithay/tree/master/anvil
[xwayland-satellite]: https://github.com/Supreeeme/xwayland-satellite


================================================
FILE: Cargo.toml
================================================
[workspace]
members = [
    "niri-config",
    "niri-ipc",
    "niri-visual-tests",
]

[workspace.package]
version = "25.11.0"
description = "A scrollable-tiling Wayland compositor"
authors = ["Ivan Molodetskikh <yalterz@gmail.com>"]
license = "GPL-3.0-or-later"
edition = "2021"
repository = "https://github.com/niri-wm/niri"
rust-version = "1.85"

[workspace.dependencies]
anyhow = "1.0.102"
bitflags = "2.11.0"
clap = { version = "4.5.60", features = ["derive"] }
insta = "1.46.3"
serde = { version = "1.0.228", features = ["derive"] }
serde_json = "1.0.149"
tracing = { version = "0.1.44", features = ["max_level_trace", "release_max_level_debug"] }
# 0.3.20 filters out all ANSI codes to "fix a security issue" while also breaking
# everyone who relied on them for color output, with no fallback available.
# https://github.com/tokio-rs/tracing/issues/3378
tracing-subscriber = { version = "=0.3.19", features = ["env-filter"] }
tracy-client = { version = "0.18.4", default-features = false }

[workspace.dependencies.smithay]
# version = "0.4.1"
git = "https://github.com/Smithay/smithay.git"
# path = "../smithay"
default-features = false

[workspace.dependencies.smithay-drm-extras]
# version = "0.1.0"
git = "https://github.com/Smithay/smithay.git"
# path = "../smithay/smithay-drm-extras"

[package]
name = "niri"
version.workspace = true
description.workspace = true
authors.workspace = true
license.workspace = true
edition.workspace = true
repository.workspace = true
rust-version.workspace = true

readme = "README.md"
keywords = ["wayland", "compositor", "tiling", "smithay", "wm"]

[dependencies]
accesskit = { version = "0.24.0", optional = true }
accesskit_unix = { version = "0.21.0", optional = true }
anyhow.workspace = true
arrayvec = "0.7.6"
async-channel = "2.5.0"
async-io = { version = "2.6.0", optional = true }
atomic = "0.6.1"
bitflags.workspace = true
bytemuck = { version = "1.25.0", features = ["derive"] }
calloop = { version = "0.14.4", features = ["executor", "futures-io", "signals"] }
clap = { workspace = true, features = ["string"] }
clap_complete = "4.5.66"
clap_complete_nushell = "4.5.10"
directories = "6.0.0"
drm-ffi = "0.9.1"
fastrand = "2.3.0"
futures-util = { version = "0.3.32", default-features = false, features = ["std", "io"] }
git-version = "0.3.9"
glam = "0.32.1"
input = { version = "0.9.1", features = ["libinput_1_21"] }
keyframe = { version = "1.1.1", default-features = false }
libc = "0.2.182"
libdisplay-info = "0.3.0"
log = { version = "0.4.29", features = ["max_level_trace", "release_max_level_debug"] }
niri-config = { version = "25.11.0", path = "niri-config" }
niri-ipc = { version = "25.11.0", path = "niri-ipc", features = ["clap"] }
ordered-float = "5.1.0"
pango = { version = "0.21.5", features = ["v1_44"] }
pangocairo = "0.21.5"
pipewire = { version = "0.9.2", optional = true, features = ["v0_3_33"] }
png = "0.18.1"
profiling = "1.0.17"
sd-notify = "0.4.5"
serde.workspace = true
serde_json.workspace = true
smithay-drm-extras.workspace = true
tracing-subscriber.workspace = true
tracing.workspace = true
tracy-client.workspace = true
wayland-backend = "0.3.14"
wayland-scanner = "0.31.9"
wayland-server = { version = "0.31.12", features = ["libwayland_1_23"] }
xcursor = "0.3.10"
zbus = { version = "5.13.2", optional = true }

[dependencies.smithay]
workspace = true
features = [
    "backend_drm",
    "backend_egl",
    "backend_gbm",
    "backend_libinput",
    "backend_session_libseat",
    "backend_udev",
    "backend_winit",
    "desktop",
    "renderer_gl",
    "renderer_pixman",
    "renderer_multi",
    "use_system_lib",
    "wayland_frontend",
]

[dev-dependencies]
approx = "0.5.1"
calloop-wayland-source = "0.4.1"
insta.workspace = true
proptest = "1.10.0"
proptest-derive = { version = "0.8.0", features = ["boxed_union"] }
rayon = "1.11.0"
wayland-client = "0.31.13"
xshell = "0.2.7"

[build-dependencies]
pkg-config = "0.3.32"

[features]
default = ["dbus", "systemd", "xdp-gnome-screencast"]
# Enables D-Bus support (serve various freedesktop and GNOME interfaces, accessibility tree, power button handling).
dbus = ["dep:zbus", "dep:async-io", "dep:accesskit", "dep:accesskit_unix"]
# Enables systemd integration (global environment, apps in transient scopes).
systemd = ["dbus"]
# Enables screencasting support through xdg-desktop-portal-gnome.
xdp-gnome-screencast = ["dbus", "pipewire"]
# Enables the Tracy profiler instrumentation.
profile-with-tracy = ["profiling/profile-with-tracy", "tracy-client/default", "smithay/tracy_gpu_profiling"]
# Enables the on-demand Tracy profiler instrumentation.
profile-with-tracy-ondemand = ["profile-with-tracy", "tracy-client/ondemand", "tracy-client/manual-lifetime"]
# Enables Tracy allocation profiling.
profile-with-tracy-allocations = ["profile-with-tracy"]
# Enables dinit integration (global environment).
dinit = []

[lints.clippy]
new_without_default = "allow"

[profile.release]
debug = "line-tables-only"
overflow-checks = true
lto = "thin"

[profile.release.package.niri-config]
# knuffel with chomsky generates a metric ton of debuginfo.
debug = false

[profile.dev.package]
insta.opt-level = 3
similar.opt-level = 3

[package.metadata.generate-rpm]
version = "25.11"
assets = [
    { source = "target/release/niri", dest = "/usr/bin/", mode = "755" },
    { source = "resources/niri-session", dest = "/usr/bin/", mode = "755" },
    { source = "resources/niri.desktop", dest = "/usr/share/wayland-sessions/", mode = "644" },
    { source = "resources/niri-portals.conf", dest = "/usr/share/xdg-desktop-portal/", mode = "644" },
    { source = "resources/niri.service", dest = "/usr/lib/systemd/user/", mode = "644" },
    { source = "resources/niri-shutdown.target", dest = "/usr/lib/systemd/user/", mode = "644" },
]
[package.metadata.generate-rpm.requires]
alacritty = "*"
fuzzel = "*"

[package.metadata.deb]
depends = "alacritty, fuzzel"
assets = [
    ["target/release/niri", "usr/bin/", "755"],
    ["resources/niri-session", "usr/bin/", "755"],
    ["resources/niri.desktop", "/usr/share/wayland-sessions/", "644"],
    ["resources/niri-portals.conf", "/usr/share/xdg-desktop-portal/", "644"],
    ["resources/niri.service", "/usr/lib/systemd/user/", "644"],
    ["resources/niri-shutdown.target", "/usr/lib/systemd/user/", "644"],
]


================================================
FILE: LICENSE
================================================
                    GNU GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU General Public License is a free, copyleft license for
software and other kinds of works.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.  We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors.  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights.  Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received.  You must make sure that they, too, receive
or can get the source code.  And you must show them these terms so they
know their rights.

  Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.

  For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software.  For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.

  Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so.  This is fundamentally incompatible with the aim of
protecting users' freedom to change the software.  The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable.  Therefore, we
have designed this version of the GPL to prohibit the practice for those
products.  If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.

  Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary.  To prevent this, the GPL assures that
patents cannot be used to render the program non-free.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Use with the GNU Affero General Public License.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:

    <program>  Copyright (C) <year>  <name of author>
    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.

  The GNU General Public License does not permit incorporating your program
into proprietary programs.  If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library.  If this is what you want to do, use the GNU Lesser General
Public License instead of this License.  But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.



================================================
FILE: README.md
================================================
<h1 align="center"><img alt="niri" src="https://github.com/user-attachments/assets/07d05cd0-d5dc-4a28-9a35-51bae8f119a0"></h1>
<p align="center">A scrollable-tiling Wayland compositor.</p>
<p align="center">
    <a href="https://matrix.to/#/#niri:matrix.org"><img alt="Matrix" src="https://img.shields.io/badge/matrix-%23niri-blue?logo=matrix"></a>
    <a href="https://github.com/niri-wm/niri/blob/main/LICENSE"><img alt="GitHub License" src="https://img.shields.io/github/license/niri-wm/niri"></a>
    <a href="https://github.com/niri-wm/niri/releases"><img alt="GitHub Release" src="https://img.shields.io/github/v/release/niri-wm/niri?logo=github"></a>
</p>

<p align="center">
    <a href="https://niri-wm.github.io/niri/Getting-Started.html">Getting Started</a> | <a href="https://niri-wm.github.io/niri/Configuration%3A-Introduction.html">Configuration</a> | <a href="https://github.com/niri-wm/niri/discussions/325">Setup&nbsp;Showcase</a>
</p>

![niri with a few windows open](https://github.com/user-attachments/assets/535e6530-2f44-4b84-a883-1240a3eee6e9)

## About

Windows are arranged in columns on an infinite strip going to the right.
Opening a new window never causes existing windows to resize.

Every monitor has its own separate window strip.
Windows can never "overflow" onto an adjacent monitor.

Workspaces are dynamic and arranged vertically.
Every monitor has an independent set of workspaces, and there's always one empty workspace present all the way down.

The workspace arrangement is preserved across disconnecting and connecting monitors where it makes sense.
When a monitor disconnects, its workspaces will move to another monitor, but upon reconnection they will move back to the original monitor.

## Features

- Built from the ground up for scrollable tiling
- [Dynamic workspaces](https://niri-wm.github.io/niri/Workspaces.html) like in GNOME
- An [Overview](https://github.com/user-attachments/assets/379a5d1f-acdb-4c11-b36c-e85fd91f0995) that zooms out workspaces and windows
- Built-in screenshot UI
- Monitor and window screencasting through xdg-desktop-portal-gnome
    - You can [block out](https://niri-wm.github.io/niri/Configuration%3A-Window-Rules.html#block-out-from) sensitive windows from screencasts
    - [Dynamic cast target](https://niri-wm.github.io/niri/Screencasting.html#dynamic-screencast-target) that can change what it shows on the go
- [Touchpad](https://github.com/niri-wm/niri/assets/1794388/946a910e-9bec-4cd1-a923-4a9421707515) and [mouse](https://github.com/niri-wm/niri/assets/1794388/8464e65d-4bf2-44fa-8c8e-5883355bd000) gestures
- Group windows into [tabs](https://niri-wm.github.io/niri/Tabs.html)
- Configurable layout: gaps, borders, struts, window sizes
- [Gradient borders](https://niri-wm.github.io/niri/Configuration%3A-Layout.html#gradients) with Oklab and Oklch support
- [Animations](https://github.com/niri-wm/niri/assets/1794388/ce178da2-af9e-4c51-876f-8709c241d95e) with support for [custom shaders](https://github.com/niri-wm/niri/assets/1794388/27a238d6-0a22-4692-b794-30dc7a626fad)
- Live-reloading config
- Works with [screen readers](https://niri-wm.github.io/niri/Accessibility.html)

## Video Demo

https://github.com/niri-wm/niri/assets/1794388/bce834b0-f205-434e-a027-b373495f9729

Also check out this video from Brodie Robertson that showcases a lot of the niri functionality: [Niri Is My New Favorite Wayland Compositor](https://youtu.be/DeYx2exm04M)

## Status

Niri is stable for day-to-day use and does most things expected of a Wayland compositor.
Many people are daily-driving niri, and are happy to help in our [Matrix channel].

Give it a try!
Follow the instructions on the [Getting Started](https://niri-wm.github.io/niri/Getting-Started.html) page.
Have your [waybar]s and [fuzzel]s ready: niri is not a complete desktop environment.
Also check out [awesome-niri], a list of niri-related links and projects.

Here are some points you may have questions about:

- **Multi-monitor**: yes, a core part of the design from the very start. Mixed DPI works.
- **Fractional scaling**: yes, plus all niri UI stays pixel-perfect.
- **NVIDIA**: seems to work fine.
- **Floating windows**: yes, starting from niri 25.01.
- **Input devices**: niri supports tablets, touchpads, and touchscreens.
You can map the tablet to a specific monitor, or use [OpenTabletDriver].
We have touchpad gestures, but no touchscreen gestures yet.
- **Wlr protocols**: yes, we have most of the important ones like layer-shell, gamma-control, screencopy.
You can check on [wayland.app](https://wayland.app) at the bottom of each protocol's page.
- **Performance**: while I run niri on beefy machines, I try to stay conscious of performance.
I've seen someone use it fine on an Eee PC 900 from 2008, of all things.
- **Xwayland**: [integrated](https://niri-wm.github.io/niri/Xwayland.html#using-xwayland-satellite) via xwayland-satellite starting from niri 25.08.

## Media

[niri: Making a Wayland compositor in Rust](https://youtu.be/Kmz8ODolnDg?list=PLRdS-n5seLRqrmWDQY4KDqtRMfIwU0U3T) · *December 2024*

My talk from the 2024 Moscow RustCon about niri, and how I do randomized property testing and profiling, and measure input latency.
The talk is in Russian, but I prepared full English subtitles that you can find in YouTube's subtitle language selector.

[An interview with Ivan, the developer behind Niri](https://www.trommelspeicher.de/podcast/special_the_developer_behind_niri) · *June 2025*

An interview by a German tech podcast Das Triumvirat (in English).
We talk about niri development and history, and my experience building and maintaining niri.

[A tour of the niri scrolling-tiling Wayland compositor](https://lwn.net/Articles/1025866/) · *July 2025*

An LWN article with a nice overview and introduction to niri.

## Contributing

If you'd like to help with niri, there are plenty of both coding- and non-coding-related ways to do so.
See [CONTRIBUTING.md](https://github.com/niri-wm/niri/blob/main/CONTRIBUTING.md) for an overview.

## Inspiration

Niri is heavily inspired by [PaperWM] which implements scrollable tiling on top of GNOME Shell.

One of the reasons that prompted me to try writing my own compositor is being able to properly separate the monitors.
Being a GNOME Shell extension, PaperWM has to work against Shell's global window coordinate space to prevent windows from overflowing.

## Tile Scrollably Elsewhere

Here are some other projects which implement a similar workflow:

- [PaperWM]: scrollable tiling on top of GNOME Shell.
- [karousel]: scrollable tiling on top of KDE.
- [scroll](https://github.com/dawsers/scroll) and [papersway]: scrollable tiling on top of sway/i3.
- [hyprscrolling] and [hyprslidr]: scrollable tiling on top of Hyprland.
- [PaperWM.spoon]: scrollable tiling on top of macOS.

## Contact

Our main communication channel is a Matrix chat, feel free to join and ask a question: https://matrix.to/#/#niri:matrix.org

We also have a community Discord server: https://discord.gg/vT8Sfjy7sx

[PaperWM]: https://github.com/paperwm/PaperWM
[waybar]: https://github.com/Alexays/Waybar
[fuzzel]: https://codeberg.org/dnkl/fuzzel
[awesome-niri]: https://github.com/niri-wm/awesome-niri
[karousel]: https://github.com/peterfajdiga/karousel
[papersway]: https://spwhitton.name/tech/code/papersway/
[hyprscrolling]: https://github.com/hyprwm/hyprland-plugins/tree/main/hyprscrolling
[hyprslidr]: https://gitlab.com/magus/hyprslidr
[PaperWM.spoon]: https://github.com/mogenson/PaperWM.spoon
[Matrix channel]: https://matrix.to/#/#niri:matrix.org
[OpenTabletDriver]: https://opentabletdriver.net/


================================================
FILE: build.rs
================================================
fn main() {
    println!("cargo:rustc-check-cfg=cfg(have_libinput_plugin_system)");
    if pkg_config::Config::new()
        .atleast_version("1.30.0")
        .probe("libinput")
        .is_ok()
    {
        println!("cargo:rustc-cfg=have_libinput_plugin_system")
    }
}


================================================
FILE: clippy.toml
================================================
ignore-interior-mutability = [
    "smithay::desktop::Window",
    "smithay::output::Output",
    "wayland_server::backend::ClientId",
]


================================================
FILE: docs/.gitignore
================================================
site
__pycache__

================================================
FILE: docs/hooks/remove-must-fail.py
================================================
from __future__ import annotations
import re

# todo: this could be done generically, so that any 
# ```language,annotation,anything-else 
# is reduced to
# ```language
# which is what's supported by mkdocs/pygments
# also note: mkdocs provides ways to highlight lines, add line numbers
# but these are added as 
# ```language linenums="1"
# and not split by comma
def on_page_markdown(
    markdown: str, *, page, config, files
):
    return re.sub(
        r",must-fail",
        '', markdown, flags = re.I | re.M
    )

================================================
FILE: docs/hooks/shortcodes.py
================================================
# Copyright (c) 2016-2025 Martin Donath <martin.donath@squidfunk.com>

# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to
# deal in the Software without restriction, including without limitation the
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
# sell copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:

# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
# IN THE SOFTWARE.

from __future__ import annotations
import re
from re import Match

def on_page_markdown(
    markdown: str, *, page, config, files
):
    def replace(match: Match):
        matches = match.groups()
        preposition, version = matches[0], matches[1]
        return _badge_for_version(preposition, version)

    return re.sub(
        r"<sup>(Until|Since): (.*?)</sup>",
        replace, markdown, flags = re.I | re.M
    )

def _badge_for_version(preposition: str, version: str):
    if version == "next release":
        # we might fail to make real links to release notes on other cases too, but for now this is the one i've found
        return f"<span class=\"badge\">{preposition}: {version}</span>"
    else:
        path = f"https://github.com/niri-wm/niri/releases/tag/v{version}"
        return f"<span class=\"badge\">[{preposition}: {version}]({path})</span>"


================================================
FILE: docs/mkdocs.yaml
================================================
site_name: niri
docs_dir: wiki
site_url: https://niri-wm.github.io/niri
repo_url: https://github.com/niri-wm/niri
edit_uri: edit/main/docs/wiki/
use_directory_urls: false

theme:
  name: material
  logo: _assets/icons/logo.svg
  favicon: _assets/icons/logo.svg
  features:
    - navigation.instant
    - search.suggest
    - content.code.copy
    - content.action.edit
  palette:
    - media: "(prefers-color-scheme)"
      primary: custom
      toggle:
        icon: material/brightness-auto
        name: Switch to light mode
    - media: "(prefers-color-scheme: light)"
      primary: custom
      scheme: default
      toggle:
        icon: material/brightness-7
        name: Switch to dark mode
    - media: "(prefers-color-scheme: dark)"
      primary: custom
      scheme: slate
      toggle:
        icon: material/brightness-4
        name: Switch to system preference
markdown_extensions:
  - github-callouts
  - pymdownx.highlight:
      anchor_linenums: true
      line_spans: __span
      pygments_lang_class: true
  - pymdownx.inlinehilite
  - pymdownx.magiclink
  - pymdownx.snippets
  - pymdownx.superfences
  - pymdownx.keys
  - toc:
      permalink: '#'
plugins:
  - search
hooks:
  - hooks/shortcodes.py
  - hooks/remove-must-fail.py
extra_css:
  - _assets/stylesheets/niri.css
strict: true
validation:
  nav:
    omitted_files: warn
    not_found: warn
    absolute_links: relative_to_docs
  links:
    not_found: warn
    anchors: warn
    absolute_links: relative_to_docs
    unrecognized_links: warn
not_in_nav: |
  _Sidebar.md
  Configuration:-Overview.md
  README.md
# ah, wouldn't it be nice if we could autogenerate this with wiki/_Sidebar.md
nav:
  - Usage:
    - Getting Started: Getting-Started.md
    - Example systemd Setup: Example-systemd-Setup.md
    - Important Software: Important-Software.md
    - Workspaces: Workspaces.md
    - Floating Windows: Floating-Windows.md
    - Tabs: Tabs.md
    - Overview: Overview.md
    - Screencasting: Screencasting.md
    - Layer‐Shell Components: Layer‐Shell-Components.md
    - IPC, niri msg: IPC.md
    - Application-Specific Issues: Application-Issues.md
    - Nvidia: Nvidia.md
    - Xwayland: Xwayland.md
    - Gestures: Gestures.md
    - Fullscreen and Maximize: Fullscreen-and-Maximize.md
    - Packaging niri: Packaging-niri.md
    - Integrating niri: Integrating-niri.md
    - Accessibility: Accessibility.md
    - Name and Logo: Name-and-Logo.md
    - FAQ: FAQ.md
  - Configuration:
    - Introduction: Configuration:-Introduction.md
    - Input: Configuration:-Input.md
    - Outputs: Configuration:-Outputs.md
    - Key Bindings: Configuration:-Key-Bindings.md
    - Switch Events: Configuration:-Switch-Events.md
    - Layout: Configuration:-Layout.md
    - Named Workspaces: Configuration:-Named-Workspaces.md
    - Miscellaneous: Configuration:-Miscellaneous.md
    - Window Rules: Configuration:-Window-Rules.md
    - Layer Rules: Configuration:-Layer-Rules.md
    - Animations: Configuration:-Animations.md
    - Gestures: Configuration:-Gestures.md
    - Recent Windows: Configuration:-Recent-Windows.md
    - Debug Options: Configuration:-Debug-Options.md
    - Include: Configuration:-Include.md
  - Development:
    - Design Principles: Development:-Design-Principles.md
    - Developing niri: Development:-Developing-niri.md
    - Documenting niri: Development:-Documenting-niri.md
    - Fractional Layout: Development:-Fractional-Layout.md
    - Redraw Loop: Development:-Redraw-Loop.md
    - Animation Timing: Development:-Animation-Timing.md


================================================
FILE: docs/pyproject.toml
================================================
[project]
name = "niri-docs"
version = "0.1.0"
requires-python = ">=3.10"
dependencies = [
    "markdown-callouts>=0.4.0",
    "mkdocs-material>=9.6.15",
    "pygments",
]

# for KDL highlighting support
# FIXME: use the official pygments package once https://github.com/pygments/pygments/pull/2936 is merged
[tool.uv.sources]
pygments = { git = "https://github.com/chinatsu/pygments", rev = "0f0b0d4da2839e1285881389155bb4605a0a6dc4" }


================================================
FILE: docs/wiki/Accessibility.md
================================================
## Screen readers

<sup>Since: 25.08</sup>

Niri has basic support for screen readers (specifically, [Orca](https://orca.gnome.org)) when running as a full desktop session, i.e. you need to start niri through a display manager or through `niri-session`.
To avoid conflicts with an already running compositor, niri won't expose accessibility interfaces when started as a nested window, or as a plain `/usr/bin/niri` on a TTY.

We implement the `org.freedesktop.a11y.KeyboardMonitor` D-Bus interface for Orca to listen and grab keyboard keys, and we expose the main niri UI elements via [AccessKit](https://accesskit.dev).
Specifically, niri will announce:

- workspace switching, for example it'll say "Workspace 2" when you switch to the second workspace;
- the exit confirmation dialog (appears on <kbd>Super</kbd><kbd>Shift</kbd><kbd>E</kbd> by default);
- <sup>Since: 25.11</sup> niri has an <kbd>Alt</kbd><kbd>Tab</kbd> window switcher where it will announce the selected window title;
- entering the screenshot UI and the overview (niri will say when these are focused, nothing else for now);
- whenever a config parse error occurs;
- the important hotkeys list (for now, as one big announcement without tab navigation; appears on <kbd>Super</kbd><kbd>Shift</kbd><kbd>/</kbd> by default).

Here's a demo video, watch with sound on.

<video controls src="https://github.com/user-attachments/assets/afceba6f-79f1-47ec-b859-a0fcb7f8eae3">

https://github.com/user-attachments/assets/afceba6f-79f1-47ec-b859-a0fcb7f8eae3

</video>

Make sure [Xwayland](./Xwayland.md) works, then run `orca`.
The default config binds <kbd>Super</kbd><kbd>Alt</kbd><kbd>S</kbd> to toggle Orca, which is the standard key binding.

Note that there are some limitations:

- We don't have a bind to move focus to layer-shell panels. This is not hard to add, but it would be good to have some consensus or prior art with LXQt/Xfce on how exactly this should work.
- You need to have a screen connected and enabled. Without a screen, niri won't give focus any window. This makes sense for sighted users, and I'm not entirely sure what makes the most sense for accessibility purposes (maybe, it'd be better solved with virtual monitors).
- You need working EGL (hardware acceleration).
- We don't have screen curtain functionality yet.

If you're shipping niri and would like to make it work better for screen readers out of the box, consider the following changes to the default niri config:

- Change the default terminal from Alacritty to one that supports screen readers. For example, [GNOME Console](https://gitlab.gnome.org/GNOME/console) or [GNOME Terminal](https://gitlab.gnome.org/GNOME/gnome-terminal) should work well.
- Change the default application launcher and screen locker to ones that support screen readers. For example, [xfce4-appfinder](https://docs.xfce.org/xfce/xfce4-appfinder/start) is an accessible launcher. Suggestions welcome! Likely, something GTK-based will work fine.
- Add some [`spawn-at-startup`](./Configuration:-Miscellaneous.md#spawn-at-startup) command that plays a sound which will indicate to users that niri has finished loading.
- Add `spawn-at-startup "orca"` to run Orca automatically at niri startup.

## Desktop zoom

There's no built-in zoom yet, but you can use third-party utilities like [wooz](https://github.com/negrel/wooz).


================================================
FILE: docs/wiki/Application-Issues.md
================================================
### Electron applications

Electron-based applications can run directly on Wayland, but it's not the default.

For Electron ≥ 39, you can use the command-line flag if the app does not default to Wayland:
```
--ozone-platform=wayland
```

For Electron < 39, you can set an environment variable:
```kdl
environment {
    ELECTRON_OZONE_PLATFORM_HINT "auto"
}
```

For Electron ≤ 28, you need to pass command-line flags to the target application:
```
--enable-features=UseOzonePlatform --ozone-platform-hint=auto
```

If the application has a [desktop entry](https://specifications.freedesktop.org/menu-spec/latest/menu-add-example.html), you can put the command-line arguments into the `Exec` section.

### VSCode

If you're having issues with some VSCode hotkeys, try starting `Xwayland` and setting the `DISPLAY=:0` environment variable for VSCode.
That is, still running VSCode with the Wayland backend, but with `DISPLAY` set to a running Xwayland instance.
Apparently, VSCode currently unconditionally queries the X server for a keymap.

### JetBrains IDEs

JetBrains IDEs can run directly on Wayland, but it's not the default.

For JetBrainsRuntime > 17, you can set the flag `-Dawt.toolkit.name=WLToolkit` inside of `help -> edit custom vm options -> add`.

### WezTerm

> [!NOTE]
> Both of these issues seem to be fixed in the nightly build of WezTerm.

There's [a bug](https://github.com/wezterm/wezterm/issues/4708) in WezTerm that it waits for a zero-sized Wayland configure event, so its window never shows up in niri. To work around it, put this window rule in the niri config (included in the default config):

```kdl
window-rule {
    match app-id=r#"^org\.wezfurlong\.wezterm$"#
    default-column-width {}
}
```

This empty default column width lets WezTerm pick its own initial width which makes it show up properly.

There's [another bug](https://github.com/wezterm/wezterm/issues/6472) in WezTerm that causes it to choose a wrong size when it's in a tiled state, and prevent resizing it.
Niri puts windows in the tiled state with [`prefer-no-csd`](./Configuration:-Miscellaneous.md#prefer-no-csd).
So if you hit this problem, comment out `prefer-no-csd` in the niri config and restart WezTerm.

### Ghidra

Some Java apps like Ghidra can show up blank under xwayland-satellite.
To fix this, run them with the `_JAVA_AWT_WM_NONREPARENTING=1` environment variable.

### Zen Browser

For some reason, DMABUF screencasts are disabled in the Zen Browser, so screencasting doesn't work out of the box on niri.
To fix it, open `about:config` and set `widget.dmabuf.force-enabled` to `true`.

### GTK 4 dead keys / Compose

GTK 4.20 [stopped](https://gitlab.gnome.org/GNOME/gtk/-/merge_requests/8556) handling dead keys and Compose on its own on Wayland.
To make them work, either run an IME like IBus or Fcitx5, or set the `GTK_IM_MODULE=simple` environment variable.

```kdl
environment {
    GTK_IM_MODULE "simple"
}
```

Note that the niri environment config does not propagate to apps and shells started by systemd, for example to DankMaterialShell and its application launcher.
You can set the variable in your login shell config (i.e. `~/.bash_profile`) instead, though keep in mind that then it will be set for all compositors, not just niri.

### Fullscreen games

Some video games, both Linux-native and on Wine, have various issues when using non-stacking desktop environments.
Most of these can be avoided with Valve's [gamescope](https://github.com/ValveSoftware/gamescope), for example:

```sh
gamescope -f -w 1920 -h 1080 -W 1920 -H 1080 --force-grab-cursor --backend sdl -- <game>
```

This command will run *<game>* in 1080p fullscreen—make sure to replace the width and height values to match your desired resolution.
`--force-grab-cursor` forces gamescope to use relative mouse movement which prevents the cursor from escaping the game's window on multi-monitor setups.
Note that `--backend sdl` is currently also required as gamescope's default Wayland backend doesn't lock the cursor properly (possibly related to https://github.com/ValveSoftware/gamescope/issues/1711).

Steam users should use gamescope through a game's [launch options](https://help.steampowered.com/en/faqs/view/7D01-D2DD-D75E-2955) by replacing the game executable with `%command%`.
Other game launchers such as [Lutris](https://lutris.net/) have their own ways of setting gamescope options.

Running X11-based games with this method doesn't require Xwayland as gamescope creates its own Xwayland server.
You can run Wayland-native games as well by passing `--expose-wayland` to gamescope, therefore eliminating X11 from the equation.

### Steam

On some systems, Steam will show a fully black window.
To fix this, navigate to Settings -> Interface (via Steam's tray icon, or by blindly finding the Steam menu at the top left of the window), then **disable** GPU accelerated rendering in web views.
Restart Steam and it should now work fine.

If you do not want to disable GPU accelerated rendering you can instead try to pass the launch argument `-system-composer` instead.

Steam notifications don't run through the standard notification daemon and show up as floating windows in the center of the screen.
You can move them to a more convenient location by adding a window rule in your niri config:

```kdl
window-rule {
    match app-id="steam" title=r#"^notificationtoasts_\d+_desktop$"#
    default-floating-position x=10 y=10 relative-to="bottom-right"
}
```

### Waybar and other GTK 3 components

If you have rounded corners on your Waybar and they show up with black pixels in the corners, then set your Waybar opacity to 0.99, which should fix it.

GTK 3 seems to have a bug where it reports a surface as fully opaque even if it has rounded corners.
This leads to niri filling the transparent pixels inside the corners with black.

Setting the surface opacity to something below 1 fixes the problem because then GTK no longer reports the surface as opaque.


================================================
FILE: docs/wiki/Configuration:-Animations.md
================================================
### Overview

Niri has several animations which you can configure in the same way.
Additionally, you can disable or slow down all animations at once.

Here's a quick glance at the available animations with their default values.

```kdl
animations {
    // Uncomment to turn off all animations.
    // You can also put "off" into each individual animation to disable it.
    // off

    // Slow down all animations by this factor. Values below 1 speed them up instead.
    // slowdown 3.0

    // Individual animations.

    workspace-switch {
        spring damping-ratio=1.0 stiffness=1000 epsilon=0.0001
    }

    window-open {
        duration-ms 150
        curve "ease-out-expo"
    }

    window-close {
        duration-ms 150
        curve "ease-out-quad"
    }

    horizontal-view-movement {
        spring damping-ratio=1.0 stiffness=800 epsilon=0.0001
    }

    window-movement {
        spring damping-ratio=1.0 stiffness=800 epsilon=0.0001
    }

    window-resize {
        spring damping-ratio=1.0 stiffness=800 epsilon=0.0001
    }

    config-notification-open-close {
        spring damping-ratio=0.6 stiffness=1000 epsilon=0.001
    }

    exit-confirmation-open-close {
        spring damping-ratio=0.6 stiffness=500 epsilon=0.01
    }

    screenshot-ui-open {
        duration-ms 200
        curve "ease-out-quad"
    }

    overview-open-close {
        spring damping-ratio=1.0 stiffness=800 epsilon=0.0001
    }

    recent-windows-close {
        spring damping-ratio=1.0 stiffness=800 epsilon=0.001
    }
}
```

### Animation Types

There are two animation types: easing and spring.
Each animation can be either an easing or a spring.

#### Easing

This is a relatively common animation type that changes the value over a set duration using an interpolation curve.

To use this animation, set the following parameters:

- `duration-ms`: duration of the animation in milliseconds.
- `curve`: the easing curve to use.

```kdl
animations {
    window-open {
        duration-ms 150
        curve "ease-out-expo"
    }
}
```

Currently, niri only supports five curves.
You can get a feel for them on pages like [easings.net](https://easings.net/).

- `ease-out-quad` <sup>Since: 0.1.5</sup>
- `ease-out-cubic`
- `ease-out-expo`
- `linear` <sup>Since: 0.1.6</sup>
- `cubic-bezier` <sup>Since: 25.08</sup>
    A custom [cubic Bézier curve](https://www.w3.org/TR/css-easing-1/#cubic-bezier-easing-functions). You need to set 4 numbers defining the control points of the curve, for example:
    ```kdl
    animations {
        window-open {
            // Same as CSS cubic-bezier(0.05, 0.7, 0.1, 1)
            curve "cubic-bezier" 0.05 0.7 0.1 1
        }
    }
    ```
    You can tweak the cubic-bezier parameters on pages like [easings.co](https://easings.co?curve=0.05,0.7,0.1,1).

#### Spring

Spring animations use a model of a physical spring to animate the value.
They notably feel better with touchpad gestures, because they take into account the velocity of your fingers as you release the swipe.
Springs can also oscillate / bounce at the end with the right parameters if you like that sort of thing, but they don't have to (and by default they mostly don't).

Due to springs using a physical model, the animation parameters are less obvious and generally should be tuned with trial and error.
Notably, you cannot directly set the duration.
You can use the [Elastic](https://flathub.org/apps/app.drey.Elastic) app to help visualize how the spring parameters change the animation.

A spring animation is configured like this, with three mandatory parameters:

```kdl
animations {
    workspace-switch {
        spring damping-ratio=1.0 stiffness=1000 epsilon=0.0001
    }
}
```

The `damping-ratio` goes from 0.1 to 10.0 and has the following properties:

- below 1.0: underdamped spring, will oscillate in the end.
- above 1.0: overdamped spring, won't oscillate.
- 1.0: critically damped spring, comes to rest in minimum possible time without oscillations.

However, even with damping ratio = 1.0, the spring animation may oscillate if "launched" with enough velocity from a touchpad swipe.

> [!WARNING]
> Overdamped springs currently have some numerical stability issues and may cause graphical glitches.
> Therefore, setting `damping-ratio` above `1.0` is not recommended.

Lower `stiffness` will result in a slower animation more prone to oscillation.

Set `epsilon` to a lower value if the animation "jumps" at the end.

> [!TIP]
> The spring *mass* (which you can see in Elastic) is hardcoded to 1.0 and cannot be changed.
> Instead, change `stiffness` proportionally.
> E.g. increasing mass by 2× is the same as decreasing stiffness by 2×.

### Animations

Now let's go into more detail on the animations that you can configure.

#### `workspace-switch`

Animation when switching workspaces up and down, including after the vertical touchpad gesture (a spring is recommended).

```kdl
animations {
    workspace-switch {
        spring damping-ratio=1.0 stiffness=1000 epsilon=0.0001
    }
}
```

#### `window-open`

Window opening animation.

This one uses an easing type by default.

```kdl
animations {
    window-open {
        duration-ms 150
        curve "ease-out-expo"
    }
}
```

##### `custom-shader`

<sup>Since: 0.1.6</sup>

You can write a custom shader for drawing the window during an open animation.

See [this example shader](./examples/open_custom_shader.frag) for a full documentation with several animations to experiment with.

If a custom shader fails to compile, niri will print a warning and fall back to the default, or previous successfully compiled shader.
When running niri as a systemd service, you can see the warnings in the journal: `journalctl -ef /usr/bin/niri`

> [!WARNING]
>
> Custom shaders do not have a backwards compatibility guarantee.
> I may need to change their interface as I'm developing new features.

Example: open will fill the current geometry with a solid gradient that gradually fades in.

```kdl
animations {
    window-open {
        duration-ms 250
        curve "linear"

        custom-shader r"
            vec4 open_color(vec3 coords_geo, vec3 size_geo) {
                vec4 color = vec4(0.0);

                if (0.0 <= coords_geo.x && coords_geo.x <= 1.0
                        && 0.0 <= coords_geo.y && coords_geo.y <= 1.0)
                {
                    vec4 from = vec4(1.0, 0.0, 0.0, 1.0);
                    vec4 to = vec4(0.0, 1.0, 0.0, 1.0);
                    color = mix(from, to, coords_geo.y);
                }

                return color * niri_clamped_progress;
            }
        "
    }
}
```

#### `window-close`

<sup>Since: 0.1.5</sup>

Window closing animation.

This one uses an easing type by default.

```kdl
animations {
    window-close {
        duration-ms 150
        curve "ease-out-quad"
    }
}
```

##### `custom-shader`

<sup>Since: 0.1.6</sup>

You can write a custom shader for drawing the window during a close animation.

See [this example shader](./examples/close_custom_shader.frag) for a full documentation with several animations to experiment with.

If a custom shader fails to compile, niri will print a warning and fall back to the default, or previous successfully compiled shader.
When running niri as a systemd service, you can see the warnings in the journal: `journalctl -ef /usr/bin/niri`

> [!WARNING]
>
> Custom shaders do not have a backwards compatibility guarantee.
> I may need to change their interface as I'm developing new features.

Example: close will fill the current geometry with a solid gradient that gradually fades away.

```kdl
animations {
    window-close {
        custom-shader r"
            vec4 close_color(vec3 coords_geo, vec3 size_geo) {
                vec4 color = vec4(0.0);

                if (0.0 <= coords_geo.x && coords_geo.x <= 1.0
                        && 0.0 <= coords_geo.y && coords_geo.y <= 1.0)
                {
                    vec4 from = vec4(1.0, 0.0, 0.0, 1.0);
                    vec4 to = vec4(0.0, 1.0, 0.0, 1.0);
                    color = mix(from, to, coords_geo.y);
                }

                return color * (1.0 - niri_clamped_progress);
            }
        "
    }
}
```

#### `horizontal-view-movement`

All horizontal camera view movement animations, such as:

- When a window off-screen is focused and the camera scrolls to it.
- When a new window appears off-screen and the camera scrolls to it.
- After a horizontal touchpad gesture (a spring is recommended).

```kdl
animations {
    horizontal-view-movement {
        spring damping-ratio=1.0 stiffness=800 epsilon=0.0001
    }
}
```

#### `window-movement`

<sup>Since: 0.1.5</sup>

Movement of individual windows within a workspace.

Includes:

- Moving window columns with `move-column-left` and `move-column-right`.
- Moving windows inside a column with `move-window-up` and `move-window-down`.
- Moving windows out of the way upon window opening and closing.
- Window movement between columns when consuming/expelling.

This animation *does not* include the camera view movement, such as scrolling the workspace left and right.

```kdl
animations {
    window-movement {
        spring damping-ratio=1.0 stiffness=800 epsilon=0.0001
    }
}
```

#### `window-resize`

<sup>Since: 0.1.5</sup>

Window resize animation.

Only manual window resizes are animated, i.e. when you resize the window with `switch-preset-column-width` or `maximize-column`.
Also, very small resizes (up to 10 pixels) are not animated.

```kdl
animations {
    window-resize {
        spring damping-ratio=1.0 stiffness=800 epsilon=0.0001
    }
}
```

##### `custom-shader`

<sup>Since: 0.1.6</sup>

You can write a custom shader for drawing the window during a resize animation.

See [this example shader](./examples/resize_custom_shader.frag) for a full documentation with several animations to experiment with.

If a custom shader fails to compile, niri will print a warning and fall back to the default, or previous successfully compiled shader.
When running niri as a systemd service, you can see the warnings in the journal: `journalctl -ef /usr/bin/niri`

> [!WARNING]
>
> Custom shaders do not have a backwards compatibility guarantee.
> I may need to change their interface as I'm developing new features.

Example: resize will show the next (after resize) window texture right away, stretched to the current geometry.

```kdl
animations {
    window-resize {
        custom-shader r"
            vec4 resize_color(vec3 coords_curr_geo, vec3 size_curr_geo) {
                vec3 coords_tex_next = niri_geo_to_tex_next * coords_curr_geo;
                vec4 color = texture2D(niri_tex_next, coords_tex_next.st);
                return color;
            }
        "
    }
}
```

#### `config-notification-open-close`

The open/close animation of the config parse error and new default config notifications.

This one uses an underdamped spring by default (`damping-ratio=0.6`) which causes a slight oscillation in the end.

```kdl
animations {
    config-notification-open-close {
        spring damping-ratio=0.6 stiffness=1000 epsilon=0.001
    }
}
```

#### `exit-confirmation-open-close`

<sup>Since: 25.08</sup>

The open/close animation of the exit confirmation dialog.

This one uses an underdamped spring by default (`damping-ratio=0.6`) which causes a slight oscillation in the end.

```kdl
animations {
    exit-confirmation-open-close {
        spring damping-ratio=0.6 stiffness=500 epsilon=0.01
    }
}
```

#### `screenshot-ui-open`

<sup>Since: 0.1.8</sup>

The open (fade-in) animation of the screenshot UI.

```kdl
animations {
    screenshot-ui-open {
        duration-ms 200
        curve "ease-out-quad"
    }
}
```

#### `overview-open-close`

<sup>Since: 25.05</sup>

The open/close zoom animation of the [Overview](./Overview.md).

```kdl
animations {
    overview-open-close {
        spring damping-ratio=1.0 stiffness=800 epsilon=0.0001
    }
}
```

#### `recent-windows-close`

<sup>Since: 25.11</sup>

The close fade-out animation of the recent windows switcher.

```kdl
animations {
    recent-windows-close {
        spring damping-ratio=1.0 stiffness=800 epsilon=0.001
    }
}
```

### Synchronized Animations

<sup>Since: 0.1.5</sup>

Sometimes, when two animations are meant to play together synchronized, niri will drive them both with the same configuration.

For example, if a window resize causes the view to move, then that view movement animation will also use the `window-resize` configuration (rather than the `horizontal-view-movement` configuration).
This is especially important for animated resizes to look good when using `center-focused-column "always"`.

As another example, resizing a window in a column vertically causes other windows to move up or down into their new position.
This movement will use the `window-resize` configuration, rather than the `window-movement` configuration, to keep the animations synchronized.

A few actions are still missing this synchronization logic, since in some cases it is difficult to implement properly.
Therefore, for the best results, consider using the same parameters for related animations (they are all the same by default):

- `horizontal-view-movement`
- `window-movement`
- `window-resize`


================================================
FILE: docs/wiki/Configuration:-Debug-Options.md
================================================
### Overview

Niri has several options that are only useful for debugging, or are experimental and have known issues.
They are not meant for normal use.

> [!CAUTION]
> These options are **not** covered by the [config breaking change policy](./Configuration:-Introduction.md#breaking-change-policy).
> They can change or stop working at any point with little notice.

Here are all the options at a glance:

```kdl
debug {
    preview-render "screencast"
    // preview-render "screen-capture"
    enable-overlay-planes
    disable-cursor-plane
    disable-direct-scanout
    restrict-primary-scanout-to-matching-format
    force-disable-connectors-on-resume
    render-drm-device "/dev/dri/renderD129"
    ignore-drm-device "/dev/dri/renderD128"
    ignore-drm-device "/dev/dri/renderD130"
    force-pipewire-invalid-modifier
    dbus-interfaces-in-non-session-instances
    wait-for-frame-completion-before-queueing
    emulate-zero-presentation-time
    disable-resize-throttling
    disable-transactions
    keep-laptop-panel-on-when-lid-is-closed
    disable-monitor-names
    strict-new-window-focus-policy
    honor-xdg-activation-with-invalid-serial
    skip-cursor-only-updates-during-vrr
    deactivate-unfocused-windows
}

binds {
    Mod+Shift+Ctrl+T { toggle-debug-tint; }
    Mod+Shift+Ctrl+O { debug-toggle-opaque-regions; }
    Mod+Shift+Ctrl+D { debug-toggle-damage; }
}
```

### `preview-render`

Make niri render the monitors the same way as for a screencast or a screen capture.

Useful for previewing the `block-out-from` window rule.

```kdl
debug {
    preview-render "screencast"
    // preview-render "screen-capture"
}
```

### `enable-overlay-planes`

Enable direct scanout into overlay planes.
May cause frame drops during some animations on some hardware (which is why it is not the default).

Direct scanout into the primary plane is always enabled.

```kdl
debug {
    enable-overlay-planes
}
```

### `disable-cursor-plane`

Disable the use of the cursor plane.
The cursor will be rendered together with the rest of the frame.

Useful to work around driver bugs on specific hardware.

```kdl
debug {
    disable-cursor-plane
}
```

### `disable-direct-scanout`

Disable direct scanout to both the primary plane and the overlay planes.

```kdl
debug {
    disable-direct-scanout
}
```

### `restrict-primary-scanout-to-matching-format`

Restricts direct scanout to the primary plane to when the window buffer exactly matches the composition swapchain format.

This flag may prevent unexpected bandwidth changes when going between composition and scanout.
The plan is to make it default in the future, when we implement a way to tell the clients the composition swapchain format.
As is, it may prevent some clients (mpv on my machine) from scanning out to the primary plane.

```kdl
debug {
    restrict-primary-scanout-to-matching-format
}
```

### `force-disable-connectors-on-resume`

Force-disables all outputs upon resuming niri (TTY switch or waking up from suspend).
This causes a modeset/screen blank on all outputs.

If niri rendering is corrupted, or monitors don't light up after a TTY switch, you can try this flag.

```kdl
debug {
    force-disable-connectors-on-resume
}
```

### `render-drm-device`

Override the DRM device that niri will use for all rendering.

You can set this to make niri use a different primary GPU than the default one.

```kdl
debug {
    render-drm-device "/dev/dri/renderD129"
}
```

### `ignore-drm-device`

<sup>Since: 25.11</sup>

List DRM devices that niri will ignore.
Useful for GPU passthrough when you don't want niri to open a certain device.

```kdl
debug {
    ignore-drm-device "/dev/dri/renderD128"
    ignore-drm-device "/dev/dri/renderD130"
}
```

### `force-pipewire-invalid-modifier`

<sup>Since: 25.01</sup>

Forces PipeWire screencasting to use the invalid modifier, even when DRM offers more modifiers.

Useful for testing the invalid modifier code path that is hit by drivers that don't support modifiers.

```kdl
debug {
    force-pipewire-invalid-modifier
}
```

### `dbus-interfaces-in-non-session-instances`

Make niri create its D-Bus interfaces even if it's not running as a `--session`.

Useful for testing screencasting changes without having to relogin.

The main niri instance will *not* currently take back the interfaces when you close the test instance, so you will need to relogin in the end to make screencasting work again.

```kdl
debug {
    dbus-interfaces-in-non-session-instances
}
```

### `wait-for-frame-completion-before-queueing`

Wait until every frame is done rendering before handing it over to DRM.

Useful for diagnosing certain synchronization and performance problems.

```kdl
debug {
    wait-for-frame-completion-before-queueing
}
```

### `emulate-zero-presentation-time`

Emulate zero (unknown) presentation time returned from DRM.

This is a thing on NVIDIA proprietary drivers, so this flag can be used to test that niri doesn't break too hard on those systems.

```kdl
debug {
    emulate-zero-presentation-time
}
```

### `disable-resize-throttling`

<sup>Since: 0.1.9</sup>

Disable throttling resize events sent to windows.

By default, when resizing quickly (e.g. interactively), a window will only receive the next size once it has made a commit for the previously requested size.
This is required for resize transactions to work properly, and it also helps certain clients which don't batch incoming resizes from the compositor.

Disabling resize throttling will send resizes to windows as fast as possible, which is potentially very fast (for example, on a 1000 Hz mouse).

```kdl
debug {
    disable-resize-throttling
}
```

### `disable-transactions`

<sup>Since: 0.1.9</sup>

Disable transactions (resize and close).

By default, windows which must resize together, do resize together.
For example, all windows in a column must resize at the same time to maintain the combined column height equal to the screen height, and to maintain the same window width.

Transactions make niri wait until all windows finish resizing before showing them all on screen in one, synchronized frame.
For them to work properly, resize throttling shouldn't be disabled (with the previous debug flag).

```kdl
debug {
    disable-transactions
}
```

### `keep-laptop-panel-on-when-lid-is-closed`

<sup>Since: 0.1.10</sup>

By default, niri will disable the internal laptop monitor when the laptop lid is closed.
This flag turns off this behavior and will leave the internal laptop monitor on.

```kdl
debug {
    keep-laptop-panel-on-when-lid-is-closed
}
```

### `disable-monitor-names`

<sup>Since: 0.1.10</sup>

Disables the make/model/serial monitor names, as if niri fails to read them from the EDID.

Use this flag to work around a crash present in 0.1.9 and 0.1.10 when connecting two monitors with matching make/model/serial.

```kdl
debug {
    disable-monitor-names
}
```

### `strict-new-window-focus-policy`

<sup>Since: 25.01</sup>

Disables heuristic automatic focusing for new windows.
Only windows that activate themselves with a valid xdg-activation token will be focused.

```kdl
debug {
    strict-new-window-focus-policy
}
```

### `honor-xdg-activation-with-invalid-serial`

<sup>Since: 25.05</sup>

Widely-used clients such as Discord and Telegram make fresh xdg-activation tokens upon clicking on their tray icon or on their notification.
Most of the time, these fresh tokens will have invalid serials, because the app needs to be focused to get a valid serial, and if the user clicks on a tray icon or a notification, it is usually because the app *isn't* focused, and the user wants to focus it.

By default, niri ignores xdg-activation tokens with invalid serials, to prevent windows from randomly stealing focus.
This debug flag makes niri honor such tokens, making the aforementioned widely-used apps get focus when clicking on their tray icon or notification.

Amusingly, clicking on a notification sends the app a perfectly valid activation token from the notification daemon, but these apps seem to simply ignore it.
Maybe in the future these apps/toolkits (Electron, Qt) are fixed, making this debug flag unnecessary.

```kdl
debug {
    honor-xdg-activation-with-invalid-serial
}
```

### `skip-cursor-only-updates-during-vrr`

<sup>Since: 25.08</sup>

Skips redrawing the screen from cursor input while variable refresh rate is active.

Useful for games where the cursor isn't drawn internally to prevent erratic VRR shifts in response to cursor movement.

Note that the current implementation has some issues, for example when there's nothing redrawing the screen (like a game), the rendering will appear to completely freeze (since cursor movements won't cause redraws).

```kdl
debug {
    skip-cursor-only-updates-during-vrr
}
```

### `deactivate-unfocused-windows`

<sup>Since: 25.08</sup>

Some clients (notably, Chromium- and Electron-based, like Teams or Slack) erroneously use the Activated xdg window state instead of keyboard focus for things like deciding whether to send notifications for new messages, or for picking where to show an IME popup.
Niri keeps the Activated state on unfocused workspaces and invisible tabbed windows (to reduce unwanted animations), surfacing bugs in these applications.

Set this debug flag to work around these problems.
It will cause niri to drop the Activated state for all unfocused windows.

```kdl
debug {
    deactivate-unfocused-windows
}
```

### `keep-max-bpc-unchanged`

<sup>Since: 25.08</sup>

When connecting monitors, niri sets their max bpc to 8 in order to reduce display bandwidth and to potentially allow more monitors to be connected at once.
Restricting bpc to 8 is not a problem since we don't support HDR or color management yet and can't really make use of higher bpc.

Apparently, setting max bpc to 8 breaks some displays driven by AMDGPU.
If this happens to you, set this debug flag, which will prevent niri from changing max bpc.
AMDGPU bug report: https://gitlab.freedesktop.org/drm/amd/-/issues/4487.

<sup>Since: 25.11</sup>
This setting is deprecated and does nothing: niri no longer sets max bpc.
The old niri behavior with this setting enabled matches the new behavior.

```kdl
debug {
    keep-max-bpc-unchanged
}
```

### Key Bindings

These are not debug options, but rather key bindings.

#### `toggle-debug-tint`

Tints all surfaces green, unless they are being directly scanned out.

Useful to check if direct scanout is working.

```kdl
binds {
    Mod+Shift+Ctrl+T { toggle-debug-tint; }
}
```

#### `debug-toggle-opaque-regions`

<sup>Since: 0.1.6</sup>

Tints regions marked as opaque with blue and the rest of the render elements with red.

Useful to check how Wayland surfaces and internal render elements mark their parts as opaque, which is a rendering performance optimization.

```kdl
binds {
    Mod+Shift+Ctrl+O { debug-toggle-opaque-regions; }
}
```

#### `debug-toggle-damage`

<sup>Since: 0.1.6</sup>

Tints damaged regions with red.

```kdl
binds {
    Mod+Shift+Ctrl+D { debug-toggle-damage; }
}
```


================================================
FILE: docs/wiki/Configuration:-Gestures.md
================================================
### Overview

<sup>Since: 25.02</sup>

The `gestures` config section contains gesture settings.
For an overview of all niri gestures, see the [Gestures](./Gestures.md) wiki page.

Here's a quick glance at the available settings along with their default values.

```kdl
gestures {
    dnd-edge-view-scroll {
        trigger-width 30
        delay-ms 100
        max-speed 1500
    }

    dnd-edge-workspace-switch {
        trigger-height 50
        delay-ms 100
        max-speed 1500
    }

    hot-corners {
        // off
        top-left
        // top-right
        // bottom-left
        // bottom-right
    }
}
```

### `dnd-edge-view-scroll`

Scroll the tiling view when moving the mouse cursor against a monitor edge during drag-and-drop (DnD).
Also works on a touchscreen.

This will work for regular drag-and-drop (e.g. dragging a file from a file manager), and for window interactive move when targeting the tiling layout.

The options are:

- `trigger-width`: size of the area near the monitor edge that will trigger the scrolling, in logical pixels.
- `delay-ms`: delay in milliseconds before the scrolling starts.
Avoids unwanted scrolling when dragging things across monitors.
- `max-speed`: maximum scrolling speed in logical pixels per second.
The scrolling speed increases linearly as you move your mouse cursor from `trigger-width` to the very edge of the monitor.

```kdl
gestures {
    // Increase the trigger area and maximum speed.
    dnd-edge-view-scroll {
        trigger-width 100
        max-speed 3000
    }
}
```

### `dnd-edge-workspace-switch`

<sup>Since: 25.05</sup>

Scroll the workspaces up/down when moving the mouse cursor against a monitor edge during drag-and-drop (DnD) while in the overview.
Also works on a touchscreen.

The options are:

- `trigger-height`: size of the area near the monitor edge that will trigger the scrolling, in logical pixels.
- `delay-ms`: delay in milliseconds before the scrolling starts.
Avoids unwanted scrolling when dragging things across monitors.
- `max-speed`: maximum scrolling speed; 1500 corresponds to one screen height per second.
The scrolling speed increases linearly as you move your mouse cursor from `trigger-width` to the very edge of the monitor.

```kdl
gestures {
    // Increase the trigger area and maximum speed.
    dnd-edge-workspace-switch {
        trigger-height 100
        max-speed 3000
    }
}
```

### `hot-corners`

<sup>Since: 25.05</sup>

Put your mouse at the very top-left corner of a monitor to toggle the overview.
Also works during drag-and-dropping something.

`off` disables the hot corners.

```kdl
// Disable the hot corners.
gestures {
    hot-corners {
        off
    }
}
```

<sup>Since: 25.11</sup> You can choose specific hot corners by name: `top-left`, `top-right`, `bottom-left`, `bottom-right`.
If no corners are explicitly set, the top-left corner will be active by default.

```kdl
// Enable the top-right and bottom-right hot corners.
gestures {
    hot-corners {
        top-right
        bottom-right
    }
}
```

You can also customize hot corners per-output [in the output config](./Configuration:-Outputs.md#hot-corners).


================================================
FILE: docs/wiki/Configuration:-Include.md
================================================
<sup>Since: 25.11</sup>

You can include other files at the top level of the config.

```kdl,must-fail
// Some settings...

include "colors.kdl"

// Some more settings...
```

Included files have the same structure as the main config file.
Settings from included files will be merged with the settings from the main config file.

Included config files can in turn include more files.
All included files are watched for changes, and the config live-reloads when any of them change.

Includes work only at the top level of the config:

```kdl,must-fail
// All good: include at the top level.
include "something.kdl"

layout {
    // NOT allowed: include inside some other section.
    include "other.kdl"
}
```

### Positionality

Includes are *positional*.
They will override options set *prior* to them.
Window rules from included files will be inserted at the position of the `include` line.
For example:

```kdl
// colors.kdl
layout {
    border {
        active-color "green"
    }
}

overview {
    backdrop-color "green"
}
```

```kdl,must-fail
// config.kdl
layout {
    border {
        active-color "red"
    }
}

// This overrides the border color and the backdrop color to green.
include "colors.kdl"

// This sets the overview backdrop color to red again.
overview {
    backdrop-color "red"
}
```

The end result:

- the border color is green (from `colors.kdl`),
- the overview backdrop color is red (it was set *after* `colors.kdl`).

Another example:

```kdl
// rules.kdl
window-rule {
    match app-id="Alacritty"
    open-maximized false
}
```

```kdl,must-fail
// config.kdl
window-rule {
    open-maximized true
}

// Window rules get inserted at this position.
include "rules.kdl"

window-rule {
    match app-id="firefox$"
    open-maximized true
}
```

This is equivalent to the following config file:

```kdl
window-rule {
    open-maximized true
}

// Included from rules.kdl.
window-rule {
    match app-id="Alacritty"
    open-maximized false
}

window-rule {
    match app-id="firefox$"
    open-maximized true
}
```

### Optional includes

<sup>Since: next release</sup>

By default, including a nonexistent file will cause an error.
You can allow nonexistent includes by setting `optional=true`:

```kdl,must-fail
// Won't fail if this file doesn't exist.
include optional=true "optional-config.kdl"

// Regular include, will fail if the file doesn't exist.
include "required-config.kdl"
```

When an optional include file is missing, niri will emit a warning in the logs on every config reload.
This reminds you that the file is missing while still loading the config successfully.

The optional file is still watched for changes, so if you create it later, the config will automatically reload and apply the new settings.

Note that `optional` only affects whether a missing file causes an error.
If the file exists but contains invalid syntax or other errors, those errors will still cause a parsing failure.


### Merging

Most config sections are merged between includes, meaning that you can set only a few properties, and only those properties will change.

```kdl
// colors.kdl
layout {
    // Does not affect gaps, border width, etc.
    // Only changes colors as written.
    focus-ring {
        active-color "blue"
    }

    border {
        active-color "green"
    }
}
```

```kdl,must-fail
// config.kdl
include "colors.kdl"

layout {
    // Does not set border and focus-ring colors,
    // so colors from colors.kdl are used.
    gaps 8

    border {
        width 8
    }
}
```

#### Multipart sections

Multipart sections like `window-rule`, `output`, or `workspace` are inserted as is without merging:

```kdl
// laptop.kdl
output "eDP-1" {
    // ...
}
```

```kdl,must-fail
// config.kdl
output "DP-2" {
    // ...
}

include "laptop.kdl"

// End result: both DP-2 and eDP-1 settings.
```

#### Binds

`binds` will override previously-defined conflicting keys:

```kdl
// binds.kdl
binds {
    Mod+T { spawn "alacritty"; }
}
```

```kdl,must-fail
// config.kdl
include "binds.kdl"

binds {
    // Overrides Mod+T from binds.kdl.
    Mod+T { spawn "foot"; }
}
```

#### Flags

Most flags can be disabled with `false`:

```kdl
// csd.kdl

// Write "false" to explicitly disable.
prefer-no-csd false
```

```kdl,must-fail
// config.kdl

// Enable prefer-no-csd in the main config.
prefer-no-csd

// Including csd.kdl will disable it again.
include "csd.kdl"
```

#### Non-merging sections

Some sections where the contents represent a combined structure are not merged.
Examples are `struts`, `preset-column-widths`, individual subsections in `animations`, pointing device sections in `input`.

```kdl
// struts.kdl
layout {
    struts {
        left 64
        right 64
    }
}
```

```kdl,must-fail
// config.kdl
layout {
    struts {
        top 64
        bottom 64
    }
}

include "struts.kdl"

// Struts are not merged.
// End result is only left and right struts.
```

### Border special case

There's one special case that differs between the main config and included configs.

Writing `layout { border {} }` in an included config does nothing (since no properties are changed).
However, writing the same in the main config will *enable* the border, i.e. it's equivalent to `layout { border { on; } }`.

So, if you want to move your layout configuration from the main config to a separate file, remember to add `on` to the border section, for example:

```kdl
// separate.kdl
layout {
    border {
        // Add this line:
        on

        width 4
        active-color "#ffc87f"
        inactive-color "#505050"
    }
}
```

The reason for this special case is that this is how it historically worked: back when I added borders, we didn't have any `on` flags, so I made writing the `border {}` section enable the border, with an explicit `off` to disable it.
It wouldn't be too problematic to change it, however the default config always had a pre-filled `layout { border { off; } }` section with a note saying that commenting out the `off` is enough to enable the border.
Many people likely have this part of the default config embedded in their configs now, so changing how it works would just cause a lot of confusion.


================================================
FILE: docs/wiki/Configuration:-Input.md
================================================
### Overview

In this section you can configure input devices like keyboard and mouse, and some input-related options.

There's a section for each device type: `keyboard`, `touchpad`, `mouse`, `trackpoint`, `trackball`, `tablet`, `touch`.
Settings in those sections will apply to every device of that type.
Currently, there's no way to configure specific devices individually (but that is planned).

All settings at a glance:

```kdl
input {
    keyboard {
        xkb {
            // layout "us"
            // variant "colemak_dh_ortho"
            // options "compose:ralt,ctrl:nocaps"
            // model ""
            // rules ""
            // file "~/.config/keymap.xkb"
        }

        // repeat-delay 600
        // repeat-rate 25
        // track-layout "global"
        numlock
    }

    touchpad {
        // off
        tap
        // dwt
        // dwtp
        // drag false
        // drag-lock
        natural-scroll
        // accel-speed 0.2
        // accel-profile "flat"
        // scroll-factor 1.0
        // scroll-factor vertical=1.0 horizontal=-2.0
        // scroll-method "two-finger"
        // scroll-button 273
        // scroll-button-lock
        // tap-button-map "left-middle-right"
        // click-method "clickfinger"
        // left-handed
        // disabled-on-external-mouse
        // middle-emulation
    }

    mouse {
        // off
        // natural-scroll
        // accel-speed 0.2
        // accel-profile "flat"
        // scroll-factor 1.0
        // scroll-factor vertical=1.0 horizontal=-2.0
        // scroll-method "no-scroll"
        // scroll-button 273
        // scroll-button-lock
        // left-handed
        // middle-emulation
    }

    trackpoint {
        // off
        // natural-scroll
        // accel-speed 0.2
        // accel-profile "flat"
        // scroll-method "on-button-down"
        // scroll-button 273
        // scroll-button-lock
        // left-handed
        // middle-emulation
    }

    trackball {
        // off
        // natural-scroll
        // accel-speed 0.2
        // accel-profile "flat"
        // scroll-method "on-button-down"
        // scroll-button 273
        // scroll-button-lock
        // left-handed
        // middle-emulation
    }

    tablet {
        // off
        map-to-output "eDP-1"
        // left-handed
        // calibration-matrix 1.0 0.0 0.0 0.0 1.0 0.0
    }

    touch {
        // off
        map-to-output "eDP-1"
        // calibration-matrix 1.0 0.0 0.0 0.0 1.0 0.0
    }

    // disable-power-key-handling
    // warp-mouse-to-focus
    // focus-follows-mouse max-scroll-amount="0%"
    // workspace-auto-back-and-forth

    // mod-key "Super"
    // mod-key-nested "Alt"
}
```

### Keyboard

#### Layout

In the `xkb` section, you can set layout, variant, options, model and rules.
These are passed directly to libxkbcommon, which is also used by most other Wayland compositors.
See the `xkeyboard-config(7)` manual for more information.

```kdl
input {
    keyboard {
        xkb {
            layout "us"
            variant "colemak_dh_ortho"
            options "compose:ralt,ctrl:nocaps"
        }
    }
}
```

> [!TIP]
>
> <sup>Since: 25.02</sup>
>
> Alternatively, you can directly set a path to a .xkb file containing an xkb keymap.
> This overrides all other xkb settings.
>
> ```kdl
> input {
>     keyboard {
>         xkb {
>             file "~/.config/keymap.xkb"
>         }
>     }
> }
> ```

> [!NOTE]
>
> <sup>Since: 25.08</sup>
>
> If the `xkb` section is empty (like it is by default), niri will fetch xkb settings from systemd-localed at `org.freedesktop.locale1` over D-Bus.
> This way, for example, system installers can dynamically set the niri keyboard layout.
> You can see this layout in `localectl` and change it with `localectl set-x11-keymap`, for example:
>
> ```sh
> $ localectl set-x11-keymap "us" "" "colemak_dh_ortho" "compose:ralt,ctrl:nocaps"
> $ localectl
> System Locale: LANG=en_US.UTF-8
>                LC_NUMERIC=ru_RU.UTF-8
>                LC_TIME=ru_RU.UTF-8
>                LC_MONETARY=ru_RU.UTF-8
>                LC_PAPER=ru_RU.UTF-8
>                LC_MEASUREMENT=ru_RU.UTF-8
>     VC Keymap: us-colemak_dh_ortho
>    X11 Layout: us
>   X11 Variant: colemak_dh_ortho
>   X11 Options: compose:ralt,ctrl:nocaps
> ```
>
> By default, `localectl` will set the TTY keymap to the closest match of the XKB keymap.
> You can prevent that with a `--no-convert` flag, for example: `localectl set-x11-keymap --no-convert "us,ru"`.
>
> These settings are picked up by some other programs too, like GDM.

When using multiple layouts, niri can remember the current layout globally (the default) or per-window.
You can control this with the `track-layout` option.

- `global`: layout change is global for all windows.
- `window`: layout is tracked for each window individually.

```kdl
input {
    keyboard {
        track-layout "global"
    }
}
```

#### Repeat

Delay is in milliseconds before the keyboard repeat starts.
Rate is in characters per second.

```kdl
input {
    keyboard {
        repeat-delay 600
        repeat-rate 25
    }
}
```

#### Num Lock

<sup>Since: 25.05</sup>

Set the `numlock` flag to turn on Num Lock automatically at startup.

You might want to disable (comment out) `numlock` if you're using a laptop with a keyboard that overlays Num Lock keys on top of regular keys.

```kdl
input {
    keyboard {
        numlock
    }
}
```

### Pointing Devices

Most settings for the pointing devices are passed directly to libinput.
Other Wayland compositors also use libinput, so it's likely you will find the same settings there.
For flags like `tap`, omit them or comment them out to disable the setting.

A few settings are common between input devices:

- `off`: if set, no events will be sent from this device.

A few settings are common between `touchpad`, `mouse`, `trackpoint`, and `trackball`:

- `natural-scroll`: if set, inverts the scrolling direction.
- `accel-speed`: pointer acceleration speed, valid values are from `-1.0` to `1.0` where the default is `0.0`.
- `accel-profile`: can be `adaptive` (the default) or `flat` (disables pointer acceleration).
- `scroll-method`: when to generate scroll events instead of pointer motion events, can be `no-scroll`, `two-finger`, `edge`, or `on-button-down`.
  The default and supported methods vary depending on the device type.
- `scroll-button`: <sup>Since: 0.1.10</sup> the button code used for the `on-button-down` scroll method. You can find it in `libinput debug-events`.
- `scroll-button-lock`: <sup>Since: 25.08</sup> when enabled, the button does not need to be held down. Pressing once engages scrolling, pressing a second time disengages it, and double click acts as single click of the the underlying button.
- `left-handed`: if set, changes the device to left-handed mode.
- `middle-emulation`: emulate a middle mouse click by pressing left and right mouse buttons at once.

Settings specific to `touchpad`s:

- `tap`: tap-to-click.
- `dwt`: disable-when-typing.
- `dwtp`: disable-when-trackpointing.
- `drag`: <sup>Since: 25.05</sup> can be `true` or `false`, controls if tap-and-drag is enabled.
- `drag-lock`: <sup>Since: 25.02</sup> if set, lifting the finger off for a short time while dragging will not drop the dragged item. See the [libinput documentation](https://wayland.freedesktop.org/libinput/doc/latest/tapping.html#tap-and-drag).
- `tap-button-map`: can be `left-right-middle` or `left-middle-right`, controls which button corresponds to a two-finger tap and a three-finger tap.
- `click-method`: can be `button-areas` or `clickfinger`, changes the [click method](https://wayland.freedesktop.org/libinput/doc/latest/clickpad-softbuttons.html).
- `disabled-on-external-mouse`: do not send events while external pointer device is plugged in.

Settings specific to `touchpad` and `mouse`:

- `scroll-factor`: <sup>Since: 0.1.10</sup> scales the scrolling speed by this value.

    <sup>Since: 25.08</sup> You can also override horizontal and vertical scroll factor separately like so: `scroll-factor horizontal=2.0 vertical=-1.0`

Settings specific to `tablet` and `touch`:

- `calibration-matrix`: set to six floating point numbers to change the calibration matrix. See the [`LIBINPUT_CALIBRATION_MATRIX` documentation](https://wayland.freedesktop.org/libinput/doc/latest/device-configuration-via-udev.html) for examples.
    - <sup>Since: 25.02</sup> for `tablet`
    - <sup>Since: 25.11</sup> for `touch`

Tablets and touchscreens are absolute pointing devices that can be mapped to a specific output like so:

```kdl
input {
    tablet {
        map-to-output "eDP-1"
    }

    touch {
        map-to-output "eDP-1"
    }
}
```

Valid output names are the same as the ones used for output configuration.

<sup>Since: 0.1.7</sup> When a tablet is not mapped to any output, it will map to the union of all connected outputs, without aspect ratio correction.

### General Settings

These settings are not specific to a particular input device.

#### `disable-power-key-handling`

By default, niri will take over the power button to make it sleep instead of power off.
Set this if you would like to configure the power button elsewhere (i.e. `logind.conf`).

```kdl
input {
    disable-power-key-handling
}
```

#### `warp-mouse-to-focus`

Makes the mouse warp to newly focused windows.

Does not make the cursor visible if it had been hidden.

```kdl
input {
    warp-mouse-to-focus
}
```

By default, the cursor warps *separately* horizontally and vertically.
I.e. if moving the mouse only horizontally is enough to put it inside the newly focused window, then the mouse will move only horizontally, and not vertically.

<sup>Since: 25.05</sup> You can customize this with the `mode` property.

- `mode="center-xy"`: warps by both X and Y coordinates together.
So if the mouse was anywhere outside the newly focused window, it will warp to the center of the window.
- `mode="center-xy-always"`: warps by both X and Y coordinates together, even if the mouse was already somewhere inside the newly focused window.

```kdl
input {
    warp-mouse-to-focus mode="center-xy"
}
```

#### `focus-follows-mouse`

Focuses windows and outputs automatically when moving the mouse over them.

```kdl
input {
    focus-follows-mouse
}
```

<sup>Since: 0.1.8</sup> You can optionally set `max-scroll-amount`.
Then, focus-follows-mouse won't focus a window if it will result in the view scrolling more than the set amount.
The value is a percentage of the working area width.

```kdl
input {
    // Allow focus-follows-mouse when it results in scrolling at most 10% of the screen.
    focus-follows-mouse max-scroll-amount="10%"
}
```

```kdl
input {
    // Allow focus-follows-mouse only when it will not scroll the view.
    focus-follows-mouse max-scroll-amount="0%"
}
```

#### `workspace-auto-back-and-forth`

Normally, switching to the same workspace by index twice will do nothing (since you're already on that workspace).
If this flag is enabled, switching to the same workspace by index twice will switch back to the previous workspace.

Niri will correctly switch to the workspace you came from, even if workspaces were reordered in the meantime.

```kdl
input {
    workspace-auto-back-and-forth
}
```

#### `mod-key`, `mod-key-nested`

<sup>Since: 25.05</sup>

Customize the `Mod` key for [key bindings](./Configuration:-Key-Bindings.md).
Only valid modifiers are allowed, e.g. `Super`, `Alt`, `Mod3`, `Mod5`, `Ctrl`, `Shift`.

By default, `Mod` is equal to `Super` when running niri on a TTY, and to `Alt` when running niri as a nested winit window.

> [!NOTE]
> There are a lot of default bindings with Mod, none of them "make it through" to the underlying window.
> You probably don't want to set `mod-key` to Ctrl or Shift, since Ctrl is commonly used for app hotkeys, and Shift is used for, well, regular typing.

```kdl
// Switch the mod keys around: use Alt normally, and Super inside a nested window.
input {
    mod-key "Alt"
    mod-key-nested "Super"
}
```


================================================
FILE: docs/wiki/Configuration:-Introduction.md
================================================
### Per-Section Documentation

You can find documentation for various sections of the config on these wiki pages:

* [`input {}`](./Configuration:-Input.md)
* [`output "eDP-1" {}`](./Configuration:-Outputs.md)
* [`binds {}`](./Configuration:-Key-Bindings.md)
* [`switch-events {}`](./Configuration:-Switch-Events.md)
* [`layout {}`](./Configuration:-Layout.md)
* [top-level options](./Configuration:-Miscellaneous.md)
* [`window-rule {}`](./Configuration:-Window-Rules.md)
* [`layer-rule {}`](./Configuration:-Layer-Rules.md)
* [`animations {}`](./Configuration:-Animations.md)
* [`gestures {}`](./Configuration:-Gestures.md)
* [`recent-windows {}`](./Configuration:-Recent-Windows.md)
* [`debug {}`](./Configuration:-Debug-Options.md)
* [`include "other.kdl"`](./Configuration:-Include.md)

### Loading

Niri will load configuration from `$XDG_CONFIG_HOME/niri/config.kdl` or `~/.config/niri/config.kdl`, falling back to `/etc/niri/config.kdl`.
If both of these files are missing, niri will create `$XDG_CONFIG_HOME/niri/config.kdl` with the contents of [the default configuration file](https://github.com/niri-wm/niri/blob/main/resources/default-config.kdl), which are embedded into the niri binary at build time.
Please use the default configuration file as the starting point for your custom configuration.

The configuration is live-reloaded.
Simply edit and save the config file, and your changes will be applied.
This includes key bindings, output settings like mode, window rules, and everything else.

You can run `niri validate` to parse the config and see any errors.

To use a different config file path, pass it in the `--config` or `-c` argument to `niri`.

You can also set `$NIRI_CONFIG` to the path of the config file.
`--config` always takes precedence.
If `--config` or `$NIRI_CONFIG` doesn't point to a real file, the config will not be loaded.
If `$NIRI_CONFIG` is set to an empty string, it is ignored and the default config location is used instead.

### Syntax

The config is written in [KDL].

#### Comments

Lines starting with `//` are comments; they are ignored.

Also, you can put `/-` in front of a section to comment out the entire section:

```kdl
/-output "eDP-1" {
    // Everything inside here is ignored.
    // The display won't be turned off
    // as the whole section is commented out.
    off
}
```

#### Flags

Toggle options in niri are commonly represented as flags.
Writing out the flag enables it, and omitting it or commenting it out disables it.
For example:

```kdl
// "Focus follows mouse" is enabled.
input {
    focus-follows-mouse

    // Other settings...
}
```

```kdl
// "Focus follows mouse" is disabled.
input {
    // focus-follows-mouse

    // Other settings...
}
```

#### Sections

Most sections cannot be repeated. For example:

```kdl
// This is valid: every section appears once.
input {
    keyboard {
        // ...
    }

    touchpad {
        // ...
    }
}
```

```kdl,must-fail
// This is NOT valid: input section appears twice.
input {
    keyboard {
        // ...
    }
}

input {
    touchpad {
        // ...
    }
}
```

Exceptions are, for example, sections that configure different devices by name:

<!-- NOTE: this may break in the future -->
```kdl
output "eDP-1" {
    // ...
}

// This is valid: this section configures a different output.
output "HDMI-A-1" {
    // ...
}

// This is NOT valid: "eDP-1" already appeared above.
// It will either throw a config parsing error, or otherwise not work.
output "eDP-1" {
    // ...
}
```

### Defaults

Omitting most of the sections of the config file will leave you with the default values for that section.
A notable exception is [`binds {}`](./Configuration:-Key-Bindings.md): they do not get filled with defaults, so make sure you do not erase this section.

### Breaking Change Policy

As a rule, niri updates should not break existing config files.
(For example, the default config from niri v0.1.0 still parses fine on v25.02 as I'm writing this.)

Exceptions can be made for parsing bugs.
For example, niri used to accept multiple binds to the same key, but this was not intended and did not do anything (the first bind was always used).
A patch release changed niri from silently accepting this to causing a parsing failure.
This is not a blanket rule, I will consider the potential impact of every breaking change like this before deciding to carry on with it.

Keep in mind that the breaking change policy applies only to niri releases.
Commits between releases can and do occasionally break the config as new features are ironed out.
However, I do try to limit these, since several people are running git builds.

[KDL]: https://kdl.dev/


================================================
FILE: docs/wiki/Configuration:-Key-Bindings.md
================================================
### Overview

Key bindings are declared in the `binds {}` section of the config.

> [!NOTE]
> This is one of the few sections that *does not* get automatically filled with defaults if you omit it, so make sure to copy it from the default config.

Each bind is a hotkey followed by one action enclosed in curly brackets.
For example:

```kdl
binds {
    Mod+Left { focus-column-left; }
    Super+Alt+L { spawn "swaylock"; }
}
```

The hotkey consists of modifiers separated by `+` signs, followed by an XKB key name in the end.

Valid modifiers are:

- `Ctrl` or `Control`;
- `Shift`;
- `Alt`;
- `Super` or `Win`;
- `ISO_Level3_Shift` or `Mod5`—this is the AltGr key on certain layouts;
- `ISO_Level5_Shift`: can be used with an xkb lv5 option like `lv5:caps_switch`;
- `Mod`.

`Mod` is a special modifier that is equal to `Super` when running niri on a TTY, and to `Alt` when running niri as a nested winit window.
This way, you can test niri in a window without causing too many conflicts with the host compositor's key bindings.
For this reason, most of the default keys use the `Mod` modifier.

<sup>Since: 25.05</sup> You can customize the `Mod` key [in the `input` section of the config](./Configuration:-Input.md#mod-key-mod-key-nested).

> [!TIP]
> To find an XKB name for a particular key, you may use a program like [`wev`](https://git.sr.ht/~sircmpwn/wev).
>
> Open it from a terminal and press the key that you want to detect.
> In the terminal, you will see output like this:
>
> ```
> [14:     wl_keyboard] key: serial: 757775; time: 44940343; key: 113; state: 1 (pressed)
>                       sym: Left         (65361), utf8: ''
> [14:     wl_keyboard] key: serial: 757776; time: 44940432; key: 113; state: 0 (released)
>                       sym: Left         (65361), utf8: ''
> [14:     wl_keyboard] key: serial: 757777; time: 44940753; key: 114; state: 1 (pressed)
>                       sym: Right        (65363), utf8: ''
> [14:     wl_keyboard] key: serial: 757778; time: 44940846; key: 114; state: 0 (released)
>                       sym: Right        (65363), utf8: ''
> ```
>
> Here, look at `sym: Left` and `sym: Right`: these are the key names.
> I was pressing the left and the right arrow in this example.
>
> Keep in mind that binding shifted keys requires spelling out Shift and the unshifted version of the key, according to your XKB layout.
> For example, on the US QWERTY layout, <kbd>&lt;</kbd> is on <kbd>Shift</kbd> + <kbd>,</kbd>, so to bind it, you spell out something like `Mod+Shift+Comma`.
>
> As another example, if you've configured the French [BÉPO](https://en.wikipedia.org/wiki/B%C3%89PO) XKB layout, your <kbd>&lt;</kbd> is on <kbd>AltGr</kbd> + <kbd>«</kbd>.
> <kbd>AltGr</kbd> is `ISO_Level3_Shift`, or equivalently `Mod5`, so to bind it, you spell out something like `Mod+Mod5+guillemotleft`.
>
> When resolving latin keys, niri will search for the *first* configured XKB layout that has the latin key.
> So for example with US QWERTY and RU layouts configured, US QWERTY will be used for latin binds.

<sup>Since: 0.1.8</sup> Binds will repeat by default (i.e. holding down a bind will make it trigger repeatedly).
You can disable that for specific binds with `repeat=false`:

```kdl
binds {
    Mod+T repeat=false { spawn "alacritty"; }
}
```

Binds can also have a cooldown, which will rate-limit the bind and prevent it from repeatedly triggering too quickly.

```kdl
binds {
    Mod+T cooldown-ms=500 { spawn "alacritty"; }
}
```

This is mostly useful for the scroll bindings.

### Scroll Bindings

You can bind mouse wheel scroll ticks using the following syntax.
These binds will change direction based on the `natural-scroll` setting.

```kdl
binds {
    Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; }
    Mod+WheelScrollUp   cooldown-ms=150 { focus-workspace-up; }
    Mod+WheelScrollRight                { focus-column-right; }
    Mod+WheelScrollLeft                 { focus-column-left; }
}
```

Similarly, you can bind touchpad scroll "ticks".
Touchpad scrolling is continuous, so for these binds it is split into discrete intervals based on distance travelled.

These binds are also affected by touchpad's `natural-scroll`, so these example binds are "inverted", since niri has `natural-scroll` enabled for touchpads by default.

```kdl
binds {
    Mod+TouchpadScrollDown { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02+"; }
    Mod+TouchpadScrollUp   { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02-"; }
}
```

Both mouse wheel and touchpad scroll binds will prevent applications from receiving any scroll events when their modifiers are held down.
For example, if you have a `Mod+WheelScrollDown` bind, then while holding `Mod`, all mouse wheel scrolling will be consumed by niri.

### Mouse Click Bindings

<sup>Since: 25.01</sup>

You can bind mouse clicks using the following syntax.

```kdl
binds {
    Mod+MouseLeft    { close-window; }
    Mod+MouseRight   { close-window; }
    Mod+MouseMiddle  { close-window; }
    Mod+MouseForward { close-window; }
    Mod+MouseBack    { close-window; }
}
```

Mouse clicks operate on the window that was focused at the time of the click, not the window you're clicking.

Note that binding `Mod+MouseLeft` or `Mod+MouseRight` will override the corresponding gesture (moving or resizing the window).

### Custom Hotkey Overlay Titles

<sup>Since: 25.02</sup>

The hotkey overlay (the Important Hotkeys dialog) shows a hardcoded list of binds.
You can customize this list using the `hotkey-overlay-title` property.

To add a bind to the hotkey overlay, set the property to the title that you want to show:
```kdl
binds {
    Mod+Shift+S hotkey-overlay-title="Toggle Dark/Light Style" { spawn "some-script.sh"; }
}
```

Binds with custom titles are listed after the hardcoded binds and before non-customized Spawn binds.

To remove a hardcoded bind from the hotkey overlay, set the property to null:
```kdl
binds {
    Mod+Q hotkey-overlay-title=null { close-window; }
}
```

> [!TIP]
> When multiple key combinations are bound to the same action:
> - If any of the binds has a custom hotkey overlay title, niri will show that bind.
> - Otherwise, if any of the binds has a null title, niri will hide the bind.
> - Otherwise, niri will show the first key combination.

Custom titles support [Pango markup](https://docs.gtk.org/Pango/pango_markup.html):

```kdl
binds {
    Mod+Shift+S hotkey-overlay-title="<b>Toggle</b> <span foreground='red'>Dark</span>/Light Style" { spawn "some-script.sh"; }
}
```

![Custom markup example.](https://github.com/user-attachments/assets/2a2ba914-bfa7-4dfa-bb5e-49839034765d)

### Actions

Every action that you can bind is also available for programmatic invocation via `niri msg action`.
Run `niri msg action` to get a full list of actions along with their short descriptions.

Here are a few actions that benefit from more explanation.

#### `spawn`

Run a program.

`spawn` accepts a path to the program binary as the first argument, followed by arguments to the program.
For example:

```kdl
binds {
    // Run alacritty.
    Mod+T { spawn "alacritty"; }

    // Run `wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1+`.
    XF86AudioRaiseVolume { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1+"; }
}
```

> [!TIP]
>
> <sup>Since: 0.1.5</sup>
>
> Spawn bindings have a special `allow-when-locked=true` property that makes them work even while the session is locked:
>
> ```kdl
> binds {
>     // This mute bind will work even when the session is locked.
>     XF86AudioMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; }
> }
> ```

For `spawn`, niri *does not* use a shell to run commands, which means that you need to manually separate arguments.
See [`spawn-sh`](#spawn-sh) below for an action that uses a shell.

```kdl
binds {
    // Correct: every argument is in its own quotes.
    Mod+T { spawn "alacritty" "-e" "/usr/bin/fish"; }

    // Wrong: will interpret the whole `alacritty -e /usr/bin/fish` string as the binary path.
    Mod+D { spawn "alacritty -e /usr/bin/fish"; }

    // Wrong: will pass `-e /usr/bin/fish` as one argument, which alacritty won't understand.
    Mod+Q { spawn "alacritty" "-e /usr/bin/fish"; }
}
```

This also means that you cannot expand environment variables or `~`.
If you need this, you can run the command through a shell manually.

```kdl
binds {
    // Wrong: no shell expansion here. These strings will be passed literally to the program.
    Mod+T { spawn "grim" "-o" "$MAIN_OUTPUT" "~/screenshot.png"; }

    // Correct: run this through a shell manually so that it can expand the arguments.
    // Note that the entire command is passed as a SINGLE argument,
    // because shell will do its own argument splitting by whitespace.
    Mod+D { spawn "sh" "-c" "grim -o $MAIN_OUTPUT ~/screenshot.png"; }

    // You can also use a shell to run multiple commands,
    // use pipes, process substitution, and so on.
    Mod+Q { spawn "sh" "-c" "notify-send clipboard \"$(wl-paste)\""; }
}
```

As a special case, niri will expand `~` to the home directory *only* at the beginning of the program name.

```kdl
binds {
    // This will work: one ~ at the very beginning.
    Mod+T { spawn "~/scripts/do-something.sh"; }
}
```

#### `spawn-sh`

<sup>Since: 25.08</sup>

Run a command through the shell.

The argument is a single string that is passed verbatim to `sh`.
You can use shell variables, pipelines, `~` expansion, and everything else as expected.

```kdl
binds {
    // Works with spawn-sh: all arguments in the same string.
    Mod+D { spawn-sh "alacritty -e /usr/bin/fish"; }

    // Works with spawn-sh: shell variable ($MAIN_OUTPUT), ~ expansion.
    Mod+T { spawn-sh "grim -o $MAIN_OUTPUT ~/screenshot.png"; }

    // Works with spawn-sh: process substitution.
    Mod+Q { spawn-sh "notify-send clipboard \"$(wl-paste)\""; }

    // Works with spawn-sh: multiple commands.
    Super+Alt+S { spawn-sh "pkill orca || exec orca"; }
}
```

`spawn-sh "some command"` is equivalent to `spawn "sh" "-c" "some command"`—it's just a less confusing shorthand.
Keep in mind that going through the shell incurs a tiny performance penalty compared to directly `spawn`ing some binary.

Using `sh` is hardcoded, consistent with other compositors.
If you want a different shell, write it out using `spawn`, e.g. `spawn "fish" "-c" "some fish command"`.

#### `quit`

Exit niri after showing a confirmation dialog to avoid accidentally triggering it.

```kdl
binds {
    Mod+Shift+E { quit; }
}
```

If you want to skip the confirmation dialog, set the flag like so:

```kdl
binds {
    Mod+Shift+E { quit skip-confirmation=true; }
}
```

#### `do-screen-transition`

<sup>Since: 0.1.6</sup>

Freeze the screen for a brief moment then crossfade to the new contents.

```kdl
binds {
    Mod+Return { do-screen-transition; }
}
```

This action is mainly useful to trigger from scripts changing the system theme or style (between light and dark for example).
It makes transitions like this, where windows change their style one by one, look smooth and synchronized.

For example, using the GNOME color scheme setting:

```shell
niri msg action do-screen-transition
dconf write /org/gnome/desktop/interface/color-scheme "\"prefer-dark\""
```

By default, the screen is frozen for 250 ms to give windows time to redraw, before the crossfade.
You can set this delay like this:

```kdl
binds {
    Mod+Return { do-screen-transition delay-ms=100; }
}
```

Or, in scripts:

```shell
niri msg action do-screen-transition --delay-ms 100
```

#### `toggle-window-rule-opacity`

<sup>Since: 25.02</sup>

Toggle the opacity window rule of the focused window.
This only has an effect if the window's opacity window rule is already set to semitransparent.

```kdl
binds {
    Mod+O { toggle-window-rule-opacity; }
}
```

#### `screenshot`, `screenshot-screen`, `screenshot-window`

Actions for taking screenshots.

- `screenshot`: opens the built-in interactive screenshot UI.
- `screenshot-screen`, `screenshot-window`: takes a screenshot of the focused screen or window respectively.

The screenshot is both stored to the clipboard and saved to disk, according to the [`screenshot-path` option](./Configuration:-Miscellaneous.md#screenshot-path).

<sup>Since: 25.02</sup> You can disable saving to disk for a specific bind with the `write-to-disk=false` property:

```kdl
binds {
    Ctrl+Print { screenshot-screen write-to-disk=false; }
    Alt+Print { screenshot-window write-to-disk=false; }
}
```

In the interactive screenshot UI, pressing <kbd>Ctrl</kbd><kbd>C</kbd> will copy the screenshot to the clipboard without writing it to disk.

<sup>Since: 25.05</sup> You can hide the mouse pointer in screenshots with the `show-pointer=false` property:

```kdl
binds {
    // The pointer will be hidden by default
    // (you can still show it by pressing P).
    Print { screenshot show-pointer=false; }

    // The pointer will be hidden on the screenshot.
    Ctrl+Print { screenshot-screen show-pointer=false; }
}
```

<sup>Since: next release</sup> You can show the mouse pointer on window screenshots with the `show-pointer=true` property.
The pointer will be included only if the window is currently receiving pointer input (usually this means the pointer is on top of the window).

```kdl
binds {
    // The pointer will be visible on the screenshot
    // if it's on top of the window.
    Alt+Print { screenshot-window show-pointer=true; }
}
```

#### `toggle-keyboard-shortcuts-inhibit`

<sup>Since: 25.02</sup>

Applications such as remote-desktop clients and software KVM switches may request that niri stops processing its keyboard shortcuts so that they may, for example, forward the key presses as-is to a remote machine.
`toggle-keyboard-shortcuts-inhibit` is an escape hatch that toggles the inhibitor.
It's a good idea to bind it, so a buggy application can't hold your session hostage.

```kdl
binds {
    Mod+Escape { toggle-keyboard-shortcuts-inhibit; }
}
```

You can also make certain binds ignore inhibiting with the `allow-inhibiting=false` property.
They will always be handled by niri and never passed to the window.

```kdl
binds {
    // This bind will always work, even when using a virtual machine.
    Super+Alt+L allow-inhibiting=false { spawn "swaylock"; }
}
```


================================================
FILE: docs/wiki/Configuration:-Layer-Rules.md
================================================
### Overview

<sup>Since: 25.01</sup>

Layer rules let you adjust behavior for individual layer-shell surfaces.
They have `match` and `exclude` directives that control which layer-shell surfaces the rule should apply to, and a number of properties that you can set.

Layer rules are processed and work very similarly to window rules, just with different matchers and properties.
Please read the [window rules wiki page](./Configuration:-Window-Rules.md) to learn how matching works.

Here are all matchers and properties that a layer rule could have:

```kdl
layer-rule {
    match namespace="waybar"
    match at-startup=true

    // Properties that apply continuously.
    opacity 0.5
    block-out-from "screencast"
    // block-out-from "screen-capture"

    shadow {
        on
        // off
        softness 40
        spread 5
        offset x=0 y=5
        draw-behind-window true
        color "#00000064"
        // inactive-color "#00000064"
    }

    geometry-corner-radius 12
    place-within-backdrop true
    baba-is-float true
}
```

### Layer Surface Matching

Let's look at the matchers in more detail.

#### `namespace`

This is a regular expression that should match anywhere in the surface namespace.
You can read about the supported regular expression syntax [here](https://docs.rs/regex/latest/regex/#syntax).

```kdl
// Match surfaces with namespace containing "waybar",
layer-rule {
    match namespace="waybar"
}
```

You can find the namespaces of all open layer-shell surfaces by running `niri msg layers`.

#### `at-startup`

Can be `true` or `false`.
Matches during the first 60 seconds after starting niri.

```kdl
// Show layer-shell surfaces with 0.5 opacity at niri startup, but not afterwards.
layer-rule {
    match at-startup=true

    opacity 0.5
}
```

### Dynamic Properties

These properties apply continuously to open layer-shell surfaces.

#### `block-out-from`

You can block out surfaces from xdg-desktop-portal screencasts or all screen captures.
They will be replaced with solid black rectangles.

This can be useful for notifications.

The same caveats and instructions apply as for the [`block-out-from` window rule](./Configuration:-Window-Rules.md#block-out-from), so check the documentation there.

![Screenshot showing a notification visible normally, but blocked out on OBS.](./img/layer-block-out-from-screencast.png)

```kdl
// Block out mako notifications from screencasts.
layer-rule {
    match namespace="^notifications$"

    block-out-from "screencast"
}
```

#### `opacity`

Set the opacity of the surface.
`0.0` is fully transparent, `1.0` is fully opaque.
This is applied on top of the surface's own opacity, so semitransparent surfaces will become even more transparent.

Opacity is applied to every child of the layer-shell surface individually, so subsurfaces and pop-up menus will show window content behind them.

```kdl
// Make fuzzel semitransparent.
layer-rule {
    match namespace="^launcher$"

    opacity 0.95
}
```

#### `shadow`

<sup>Since: 25.02</sup>

Override the shadow options for the surface.

These rules have the same options as the normal [`shadow` config in the layout section](./Configuration:-Layout.md#shadow), so check the documentation there.

Unlike window shadows, layer surface shadows always need to be enabled with a layer rule.
That is, enabling shadows in the layout config section won't automatically enable them for layer surfaces.

> [!NOTE]
> Layer surfaces have no way to tell niri about their *visual geometry*.
> For example, if a layer surface includes some invisible margins (like mako), niri has no way of knowing that, and will draw the shadow behind the entire surface, including the invisible margins.
>
> So to use niri shadows, you'll need to configure layer-shell clients to remove their own margins or shadows.

```kdl
// Add a shadow for fuzzel.
layer-rule {
    match namespace="^launcher$"

    shadow {
        on
    }

    // Fuzzel defaults to 10 px rounded corners.
    geometry-corner-radius 10
}
```

#### `geometry-corner-radius`

<sup>Since: 25.02</sup>

Set the corner radius of the surface.

This setting will only affect the shadow—it will round its corners to match the geometry corner radius.

```kdl
layer-rule {
    match namespace="^launcher$"

    geometry-corner-radius 12
}
```

#### `place-within-backdrop`

<sup>Since: 25.05</sup>

Set to `true` to place the surface into the backdrop visible in the [Overview](./Overview.md) and between workspaces.

This will only work for *background* layer surfaces that ignore exclusive zones (typical for wallpaper tools).
Layers within the backdrop will ignore all input.

```kdl
// Put swaybg inside the overview backdrop.
layer-rule {
    match namespace="^wallpaper$"

    place-within-backdrop true
}
```

#### `baba-is-float`

<sup>Since: 25.05</sup>

Make your layer surfaces FLOAT up and down.

This is a natural extension of the [April Fools' 2025 feature](./Configuration:-Window-Rules.md#baba-is-float).

```kdl
// Make fuzzel FLOAT.
layer-rule {
    match namespace="^launcher$"

    baba-is-float true
}
```


================================================
FILE: docs/wiki/Configuration:-Layout.md
================================================
### Overview

In the `layout {}` section you can change various settings that influence how windows are positioned and sized.

Here are the contents of this section at a glance:

```kdl
layout {
    gaps 16
    center-focused-column "never"
    always-center-single-column
    empty-workspace-above-first
    default-column-display "tabbed"
    background-color "#003300"

    preset-column-widths {
        proportion 0.33333
        proportion 0.5
        proportion 0.66667
    }

    default-column-width { proportion 0.5; }

    preset-window-heights {
        proportion 0.33333
        proportion 0.5
        proportion 0.66667
    }

    focus-ring {
        // off
        on
        width 4
        active-color "#7fc8ff"
        inactive-color "#505050"
        urgent-color "#9b0000"
        // active-gradient from="#80c8ff" to="#bbddff" angle=45
        // inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view"
        // urgent-gradient from="#800" to="#a33" angle=45
    }

    border {
        off
        // on
        width 4
        active-color "#ffc87f"
        inactive-color "#505050"
        urgent-color "#9b0000"
        // active-gradient from="#ffbb66" to="#ffc880" angle=45 relative-to="workspace-view"
        // inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view" in="srgb-linear"
        // urgent-gradient from="#800" to="#a33" angle=45
    }

    shadow {
        off
        // on
        softness 30
        spread 5
        offset x=0 y=5
        draw-behind-window true
        color "#00000070"
        // inactive-color "#00000054"
    }

    tab-indicator {
        // off
        on
        hide-when-single-tab
        place-within-column
        gap 5
        width 4
        length total-proportion=1.0
        position "right"
        gaps-between-tabs 2
        corner-radius 8
        active-color "red"
        inactive-color "gray"
        urgent-color "blue"
        // active-gradient from="#80c8ff" to="#bbddff" angle=45
        // inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view"
        // urgent-gradient from="#800" to="#a33" angle=45
    }

    insert-hint {
        // off
        on
        color "#ffc87f80"
        // gradient from="#ffbb6680" to="#ffc88080" angle=45 relative-to="workspace-view"
    }

    struts {
        // left 64
        // right 64
        // top 64
        // bottom 64
    }
}
```

<sup>Since: 25.11</sup> You can override these settings for specific [outputs](./Configuration:-Outputs.md#layout-config-overrides) and [named workspaces](./Configuration:-Named-Workspaces.md#layout-config-overrides).

### `gaps`

Set gaps around (inside and outside) windows in logical pixels.

<sup>Since: 0.1.7</sup> You can use fractional values.
The value will be rounded to physical pixels according to the scale factor of every output.
For example, `gaps 0.5` on an output with `scale 2` will result in one physical-pixel wide gaps.

<sup>Since: 0.1.8</sup> You can emulate "inner" vs. "outer" gaps with negative `struts` values (see the struts section below).

```kdl
layout {
    gaps 16
}
```

### `center-focused-column`

When to center a column when changing focus.
This can be set to:

- `"never"`: no special centering, focusing an off-screen column will scroll it to the left or right edge of the screen. This is the default.
- `"always"`, the focused column will always be centered.
- `"on-overflow"`, focusing a column will center it if it doesn't fit on screen together with the previously focused column.

```kdl
layout {
    center-focused-column "always"
}
```

### `always-center-single-column`

<sup>Since: 0.1.9</sup>

If set, niri will always center a single column on a workspace, regardless of the `center-focused-column` option.

```kdl
layout {
    always-center-single-column
}
```

### `empty-workspace-above-first`

<sup>Since: 25.01</sup>

If set, niri will always add an empty workspace at the very start, in addition to the empty workspace at the very end.

```kdl
layout {
    empty-workspace-above-first
}
```

### `default-column-display`

<sup>Since: 25.02</sup>

Sets the default display mode for new columns.
Can be `normal` or `tabbed`.

```kdl
// Make all new columns tabbed by default.
layout {
    default-column-display "tabbed"

    // You may also want to hide the tab indicator
    // when there's only a single window in a column.
    tab-indicator {
        hide-when-single-tab
    }
}
```

### `preset-column-widths`

Set the widths that the `switch-preset-column-width` action (Mod+R) toggles between.

`proportion` sets the width as a fraction of the output width, taking gaps into account.
For example, you can perfectly fit four windows sized `proportion 0.25` on an output, regardless of the gaps setting.
The default preset widths are <sup>1</sup>&frasl;<sub>3</sub>, <sup>1</sup>&frasl;<sub>2</sub> and <sup>2</sup>&frasl;<sub>3</sub> of the output.

`fixed` sets the window width in logical pixels exactly.

```kdl
layout {
    // Cycle between 1/3, 1/2, 2/3 of the output, and a fixed 1280 logical pixels.
    preset-column-widths {
        proportion 0.33333
        proportion 0.5
        proportion 0.66667
        fixed 1280
    }
}
```

### `default-column-width`

Set the default width of the new windows.

The syntax is the same as in `preset-column-widths` above.

```kdl
layout {
    // Open new windows sized 1/3 of the output.
    default-column-width { proportion 0.33333; }
}
```

You can also leave the brackets empty, then the windows themselves will decide their initial width.

```kdl
layout {
    // New windows decide their initial width themselves.
    default-column-width {}
}
```

> [!NOTE]
> `default-column-width {}` causes niri to send a (0, H) size in the initial configure request.
>
> This is a bit [unclearly defined](https://gitlab.freedesktop.org/wayland/wayland-protocols/-/issues/155) in the Wayland protocol, so some clients may misinterpret it.
> Either way, `default-column-width {}` is most useful for specific windows, in form of a [window rule](./Configuration:-Window-Rules.md#default-column-width) with the same syntax.

### `preset-window-heights`

<sup>Since: 0.1.9</sup>

Set the heights that the `switch-preset-window-height` action (Mod+Shift+R) toggles between.

`proportion` sets the height as a fraction of the output height, taking gaps into account.
The default preset heights are <sup>1</sup>&frasl;<sub>3</sub>, <sup>1</sup>&frasl;<sub>2</sub> and <sup>2</sup>&frasl;<sub>3</sub> of the output.

`fixed` sets the height in logical pixels exactly.

```kdl
layout {
    // Cycle between 1/3, 1/2, 2/3 of the output, and a fixed 720 logical pixels.
    preset-window-heights {
        proportion 0.33333
        proportion 0.5
        proportion 0.66667
        fixed 720
    }
}
```

### `focus-ring` and `border`

Focus ring and border are drawn around windows and indicate the active window.
They are very similar and have the same options.

The difference is that the focus ring is drawn only around the active window, whereas borders are drawn around all windows and affect their sizes (windows shrink to make space for the borders).

| Focus Ring                | Border                |
| ------------------------- | --------------------- |
| ![Screenshot showing a focused image in the center row using focus ring](./img/focus-ring.png) | ![Screenshot showing a focused image in the center row using border, while top and bottom windows have the inactive color](./img/border.png) |

> [!TIP]
> By default, focus ring and border are rendered as a solid background rectangle behind windows.
> That is, they will show up through semitransparent windows.
> This is because windows using client-side decorations can have an arbitrary shape.
>
> If you don't like that, you should uncomment the [`prefer-no-csd` setting](./Configuration:-Miscellaneous.md#prefer-no-csd) at the top level of the config.
> Niri will draw focus rings and borders *around* windows that agree to omit their client-side decorations.
>
> Alternatively, you can override this behavior with the [`draw-border-with-background` window rule](./Configuration:-Window-Rules.md#draw-border-with-background).

Focus ring and border have the following options.

```kdl
layout {
    // focus-ring has the same options.
    border {
        // Uncomment this line to disable the border.
        // off

        // Width of the border in logical pixels.
        width 4

        active-color "#ffc87f"
        inactive-color "#505050"

        // Color of the border around windows that request your attention.
        urgent-color "#9b0000"

        // active-gradient from="#ffbb66" to="#ffc880" angle=45 relative-to="workspace-view"
        // inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view" in="srgb-linear"
    }
}
```

#### Width

Set the thickness of the border in logical pixels.

<sup>Since: 0.1.7</sup> You can use fractional values.
The value will be rounded to physical pixels according to the scale factor of every output.
For example, `width 0.5` on an output with `scale 2` will result in one physical-pixel thick borders.

```kdl
layout {
    border {
        width 2
    }
}
```

#### Colors

Colors can be set in a variety of ways:

- CSS named colors: `"red"`
- RGB hex: `"#rgb"`, `"#rgba"`, `"#rrggbb"`, `"#rrggbbaa"`
- CSS-like notation: `"rgb(255, 127, 0)"`, `"rgba()"`, `"hsl()"` and a few others.

`active-color` is the color of the focus ring / border around the active window, and `inactive-color` is the color of the focus ring / border around all other windows.

The *focus ring* is only drawn around the active window on each monitor, so with a single monitor you will never see its `inactive-color`.
You will see it if you have multiple monitors, though.

There's also a *deprecated* syntax for setting colors with four numbers representing R, G, B and A: `active-color 127 200 255 255`.

#### Gradients

Similarly to colors, you can set `active-gradient` and `inactive-gradient`, which will take precedence.

Gradients are rendered the same as CSS [`linear-gradient(angle, from, to)`](https://developer.mozilla.org/en-US/docs/Web/CSS/gradient/linear-gradient).
The angle works the same as in `linear-gradient`, and is optional, defaulting to `180` (top-to-bottom gradient).
You can use any CSS linear-gradient tool on the web to set these up, like [css-gradient.com](https://www.css-gradient.com/).

```kdl
layout {
    focus-ring {
        active-gradient from="#80c8ff" to="#bbddff" angle=45
    }
}
```

Gradients can be colored relative to windows individually (the default), or to the whole view of the workspace.
To do that, set `relative-to="workspace-view"`.
Here's a visual example:

| Default                          | `relative-to="workspace-view"`                      |
| -------------------------------- | --------------------------------------------------- |
| ![Screenshot displaying 4 windows, each with individual gradient borders](./img/gradients-default.png) | ![Screenshot displaying 4 windows, with a shared gradient across their borders](./img/gradients-relative-to-workspace-view.png) |

```kdl
layout {
    border {
        active-gradient from="#ffbb66" to="#ffc880" angle=45 relative-to="workspace-view"
        inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view"
    }
}
```

<sup>Since: 0.1.8</sup> You can set the gradient interpolation color space using syntax like `in="srgb-linear"` or `in="oklch longer hue"`.
Supported color spaces are:

- `srgb` (the default),
- `srgb-linear`,
- `oklab`,
- `oklch` with `shorter hue` or `longer hue` or `increasing hue` or `decreasing hue`.

They are rendered the same as CSS.
For example, `active-gradient from="#f00f" to="#0f05" angle=45 in="oklch longer hue"` will look the same as CSS `linear-gradient(45deg in oklch longer hue, #f00f, #0f05)`.

![Screenshot showing a window with a border using a gradient in the oklch color space](./img/gradients-oklch.png)

```kdl
layout {
    border {
        active-gradient from="#f00f" to="#0f05" angle=45 in="oklch longer hue"
    }
}
```

### `shadow`

<sup>Since: 25.02</sup>

Shadow rendered behind a window.

Set `on` to enable the shadow.

`softness` controls the shadow softness/size in logical pixels, same as [CSS box-shadow] *blur radius*.
Setting `softness 0` will give you hard shadows.

`spread` is the distance to expand the window rectangle in logical pixels, same as CSS box-shadow spread.
<sup>Since: 25.05</sup> Spread can be negative.

`offset` moves the shadow relative to the window in logical pixels, same as CSS box-shadow offset.
For example, `offset x=2 y=2` will move the shadow 2 logical pixels downwards and to the right.

Set `draw-behind-window` to `true` to make shadows draw behind the window rather than just around it.
Note that niri has no way of knowing about the CSD window corner radius.
It has to assume that windows have square corners, leading to shadow artifacts inside the CSD rounded corners.
This setting fixes those artifacts.

However, instead you may want to set `prefer-no-csd` and/or `geometry-corner-radius`.
Then, niri will know the corner radius and draw the shadow correctly, without having to draw it behind the window.
These will also remove client-side shadows if the window draws any.

`color` is the shadow color and opacity.

`inactive-color` lets you override the shadow color for inactive windows; by default, a more transparent `color` is used.

Shadow drawing will follow the window corner radius set with the [`geometry-corner-radius` window rule](./Configuration:-Window-Rules.md#geometry-corner-radius).

> [!NOTE]
> Currently, shadow drawing only supports matching radius for all corners. If you set `geometry-corner-radius` to four values instead of one, the first (top-left) corner radius will be used for shadows.

```kdl
// Enable shadows.
layout {
    shadow {
        on
    }
}

// Also ask windows to omit client-side decorations, so that
// they don't draw their own window shadows.
prefer-no-csd
```

[CSS box-shadow]: https://developer.mozilla.org/en-US/docs/Web/CSS/box-shadow

### `tab-indicator`

<sup>Since: 25.02</sup>

Controls the appearance of the tab indicator that appears next to columns in tabbed display mode.

Set `off` to hide the tab indicator.

Set `hide-when-single-tab` to hide the indicator for tabbed columns that only have a single window.

Set `place-within-column` to put the tab indicator "within" the column, rather than outside.
This will include it in column sizing and avoid overlaying adjacent columns.

`gap` sets the gap between the tab indicator and the window in logical pixels.
The gap can be negative, this will put the tab indicator on top of the window.

`width` sets the thickness of the indicator in logical pixels.

`length` controls the length of the indicator.
Set the `total-proportion` property to make tabs take up this much length relative to the window size.
By default, the tab indicator has length equal to half of the window size, or `length total-proportion=0.5`.

`position` sets the position of the tab indicator relative to the window.
It can be `left`, `right`, `top`, or `bottom`.

`gaps-between-tabs` controls the gap between individual tabs in logical pixels.

`corner-radius` sets the rounded corner radius for tabs in the indicator in logical pixels.
When `gaps-between-tabs` is zero, only the first and the last tabs have rounded corners, otherwise all tabs do.

`active-color`, `inactive-color`, `urgent-color`, `active-gradient`, `inactive-gradient`, `urgent-gradient` let you override the colors for the tabs.
They have the same semantics as the border and focus ring colors and gradients.

Tab colors are picked in this order:

1. Colors from the `tab-indicator` window rule, if set.
1. Colors from the `tab-indicator` layout options, if set (you're here).
1. If neither are set, niri picks the color matching the window border or focus ring, whichever one is active.

```kdl
// Make the tab indicator wider and match the window height,
// also put it at the top and within the column.
layout {
    tab-indicator {
        width 8
        gap 8
        length total-proportion=1.0
        position "top"
        place-within-column
    }
}
```

### `insert-hint`

<sup>Since: 0.1.10</sup> 

Settings for the window insert position hint during an interactive window move.

`off` disables the insert hint altogether.

`color` and `gradient` let you change the color of the hint and have the same syntax as colors and gradients in border and focus ring.

```kdl
layout {
    insert-hint {
        // off
        color "#ffc87f80"
        gradient from="#ffbb6680" to="#ffc88080" angle=45 relative-to="workspace-view"
    }
}
```

### `struts`

Struts shrink the area occupied by windows, similarly to layer-shell panels.
You can think of them as a kind of outer gaps.
They are set in logical pixels.

Left and right struts will cause the next window to the side to always peek out slightly.
Top and bottom struts will simply add outer gaps in addition to the area occupied by layer-shell panels and regular gaps.

<sup>Since: 0.1.7</sup> You can use fractional values.
The value will be rounded to physical pixels according to the scale factor of every output.
For example, `top 0.5` on an output with `scale 2` will result in one physical-pixel wide top strut.

```kdl
layout {
    struts {
        left 64
        right 64
        top 64
        bottom 64
    }
}
```

![A screenshot illustrating the effects of struts, as explained in the second paragraph in this section](./img/struts.png)

<sup>Since: 0.1.8</sup> You can use negative values.
They will push the windows outwards, even outside the edges of the screen.

You can use negative struts with matching gaps value to emulate "inner" vs. "outer" gaps.
For example, use this for inner gaps without outer gaps:

```kdl
layout {
    gaps 16

    struts {
        left -16
        right -16
        top -16
        bottom -16
    }
}
```

### `background-color`

<sup>Since: 25.05</sup>

Set the default background color that niri draws for workspaces.
This is visible when you're not using any background tools like swaybg.

```kdl
layout {
    background-color "#003300"
}
```

You can also set the color per-output [in the output config](./Configuration:-Outputs.md#layout-config-overrides).


================================================
FILE: docs/wiki/Configuration:-Miscellaneous.md
================================================
This page documents all top-level options that don't otherwise have dedicated pages.

Here are all of these options at a glance:

```kdl
spawn-at-startup "waybar"
spawn-at-startup "alacritty"
spawn-sh-at-startup "qs -c ~/source/qs/MyAwesomeShell"

prefer-no-csd

screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png"

environment {
    QT_QPA_PLATFORM "wayland"
    DISPLAY null
}

cursor {
    xcursor-theme "breeze_cursors"
    xcursor-size 48

    hide-when-typing
    hide-after-inactive-ms 1000
}

overview {
    zoom 0.5
    backdrop-color "#262626"

    workspace-shadow {
        // off
        softness 40
        spread 10
        offset x=0 y=10
        color "#00000050"
    }
}

xwayland-satellite {
    // off
    path "xwayland-satellite"
}

clipboard {
    disable-primary
}

hotkey-overlay {
    skip-at-startup
    hide-not-bound
}

config-notification {
    disable-failed
}
```

### `spawn-at-startup`

Add lines like this to spawn processes at niri startup.

`spawn-at-startup` accepts a path to the program binary as the first argument, followed by arguments to the program.

This option works the same way as the [`spawn` key binding action](./Configuration:-Key-Bindings.md#spawn), so please read about all its subtleties there.

```kdl
spawn-at-startup "waybar"
spawn-at-startup "alacritty"
```

Note that running niri as a systemd session supports xdg-desktop-autostart out of the box, which may be more convenient to use.
Thanks to this, apps that you configured to autostart in GNOME will also "just work" in niri, without any manual `spawn-at-startup` configuration.

### `spawn-sh-at-startup`

<sup>Since: 25.08</sup>

Add lines like this to run shell commands at niri startup.

The argument is a single string that is passed verbatim to `sh`.
You can use shell variables, pipelines, `~` expansion and everything else as expected.

See detailed description in the docs for the [`spawn-sh` key binding action](./Configuration:-Key-Bindings.md#spawn-sh).

```kdl
// Pass all arguments in the same string.
spawn-sh-at-startup "qs -c ~/source/qs/MyAwesomeShell"
```

### `prefer-no-csd`

This flag will make niri ask the applications to omit their client-side decorations.

If an application will specifically ask for CSD, the request will be honored.
Additionally, clients will be informed that they are tiled, removing some rounded corners.

With `prefer-no-csd` set, applications that negotiate server-side decorations through the xdg-decoration protocol will have focus ring and border drawn around them *without* a solid colored background.

> [!NOTE]
> Unlike most other options, changing `prefer-no-csd` will not entirely affect already running applications.
> It will make some windows rectangular, but won't remove the title bars.
> This mainly has to do with niri working around a [bug in SDL2](https://github.com/libsdl-org/SDL/issues/8173) that prevents SDL2 applications from starting.
>
> Restart applications after changing `prefer-no-csd` in the config to fully apply it.

```kdl
prefer-no-csd
```

### `screenshot-path`

Set the path where screenshots are saved.
A `~` at the front will be expanded to the home directory.

The path is formatted with `strftime(3)` to give you the screenshot date and time.

Niri will create the last folder of the path if it doesn't exist.

```kdl
screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png"
```

You can also set this option to `null` to disable saving screenshots to disk.

```kdl
screenshot-path null
```

### `environment`

Override environment variables for processes spawned by niri.

```kdl
environment {
    // Set a variable like this:
    // QT_QPA_PLATFORM "wayland"

    // Remove a variable by using null as the value:
    // DISPLAY null
}
```

Note that these variables do not propagate to the systemd global environment, so tools and applications started by systemd do not see them.
In particular, if you start a desktop shell like DankMaterialShell through systemd, then use its built-in application launcher, the apps won't see these environment variables.

If you want all processes to see the environment variables, you can set them in your login shell config instead (i.e. `~/.bash_profile`).
The `niri-session` shell script runs through the login shell and imports all environment variables to systemd before starting niri.
Keep in mind that all compositors will see variables set in the login shell, not just niri.

### `cursor`

Change the theme and size of the cursor as well as set the `XCURSOR_THEME` and `XCURSOR_SIZE` environment variables.

```kdl
cursor {
    xcursor-theme "breeze_cursors"
    xcursor-size 48
}
```

#### `hide-when-typing`

<sup>Since: 0.1.10</sup>

If set, hides the cursor when pressing a key on the keyboard.

> [!NOTE]
> This setting might interfere with games running in Wine in native Wayland mode that use mouselook, such as first-person games.
> If your character's point of view jumps down when you press a key and move the mouse simultaneously, try disabling this setting.

```kdl
cursor {
    hide-when-typing
}
```

#### `hide-after-inactive-ms`

<sup>Since: 0.1.10</sup>

If set, the cursor will automatically hide once this number of milliseconds passes since the last cursor movement.

```kdl
cursor {
    // Hide the cursor after one second of inactivity.
    hide-after-inactive-ms 1000
}
```

### `overview`

<sup>Since: 25.05</sup>

Settings for the [Overview](./Overview.md).

#### `zoom`

Control how much the workspaces zoom out in the overview.
`zoom` ranges from 0 to 0.75 where lower values make everything smaller.

```kdl
// Make workspaces four times smaller than normal in the overview.
overview {
    zoom 0.25
}
```

#### `backdrop-color`

Set the backdrop color behind workspaces in the overview.
The backdrop is also visible between workspaces when switching.

The alpha channel for this color will be ignored.

```kdl
// Make the backdrop light.
overview {
    backdrop-color "#777777"
}
```

You can also set the color per-output [in the output config](./Configuration:-Outputs.md#backdrop-color).

#### `workspace-shadow`

Control the shadow behind workspaces visible in the overview.

Settings here mirror the normal [`shadow` config in the layout section](./Configuration:-Layout.md#shadow), so check the documentation there.

Workspace shadows are configured for a workspace size normalized to 1080 pixels tall, then zoomed out together with the workspace.
Practically, this means that you'll want bigger spread, offset, and softness compared to window shadows.

```kdl
// Disable workspace shadows in the overview.
overview {
    workspace-shadow {
        off
    }
}
```

### `xwayland-satellite`

<sup>Since: 25.08</sup>

Settings for integration with [xwayland-satellite](https://github.com/Supreeeme/xwayland-satellite).

When a recent enough xwayland-satellite is detected, niri will create the X11 sockets and set `DISPLAY`, then automatically spawn `xwayland-satellite` when an X11 client tries to connect.
If Xwayland dies, niri will keep watching the X11 socket and restart `xwayland-satellite` as needed.
This is very similar to how built-in Xwayland works in other compositors.

`off` disables the integration: niri won't create an X11 socket and won't set the `DISPLAY` environment variable.

`path` sets the path to the `xwayland-satellite` binary.
By default, it's just `xwayland-satellite`, so it's looked up like any other non-absolute program name.

```kdl
// Use a custom build of xwayland-satellite.
xwayland-satellite {
    path "~/source/rs/xwayland-satellite/target/release/xwayland-satellite"
}
```

### `clipboard`

<sup>Since: 25.02</sup>

Clipboard settings.

Set the `disable-primary` flag to disable the primary clipboard (middle-click paste).
Toggling this flag will only apply to applications started afterward.

```kdl
clipboard {
    disable-primary
}
```

### `hotkey-overlay`

Settings for the "Important Hotkeys" overlay.

#### `skip-at-startup`

Set the `skip-at-startup` flag if you don't want to see the hotkey help at niri startup.

```kdl
hotkey-overlay {
    skip-at-startup
}
```

#### `hide-not-bound`

<sup>Since: 25.08</sup>

By default, niri will show the most important actions even if they aren't bound to any key, to prevent confusion.
Set the `hide-not-bound` flag if you want to hide all actions not bound to any key.

```kdl
hotkey-overlay {
    hide-not-bound
}
```

You can customize which binds the hotkey overlay shows using the [`hotkey-overlay-title` property](./Configuration:-Key-Bindings.md#custom-hotkey-overlay-titles).

### `config-notification`

<sup>Since: 25.08</sup>

Settings for the config created/failed notification.

Set the `disable-failed` flag to disable the "Failed to parse the config file" notification.
For example, if you have a custom one.

```kdl
config-notification {
    disable-failed
}
```


================================================
FILE: docs/wiki/Configuration:-Named-Workspaces.md
================================================
### Overview

<sup>Since: 0.1.6</sup>

You can declare named workspaces at the top level of the config:

```kdl
workspace "browser"

workspace "chat" {
    open-on-output "Some Company CoolMonitor 1234"
}
```

Contrary to normal dynamic workspaces, named workspaces always exist, even when they have no windows.
Otherwise, they behave like any other workspace: you can move them around, move to a different monitor, and so on.

Actions like `focus-workspace` or `move-column-to-workspace` can refer to workspaces by name.
Also, you can use an `open-on-workspace` window rule to make a window open on a specific named workspace:

```kdl
// Declare a workspace named "chat" that opens on the "DP-2" output.
workspace "chat" {
    open-on-output "DP-2"
}

// Open Fractal on the "chat" workspace, if it runs at niri startup.
window-rule {
    match at-startup=true app-id=r#"^org\.gnome\.Fractal$"#
    open-on-workspace "chat"
}
```

Named workspaces initially appear in the order they are declared in the config file.
When editing the config while niri is running, newly declared named workspaces will appear at the very top of a monitor.

If you delete some named workspace from the config, the workspace will become normal (unnamed), and if there are no windows on it, it will be removed (as any other normal workspace).
There's no way to give a name to an already existing workspace, but you can simply move windows that you want to a new, empty named workspace.

<sup>Since: 0.1.9</sup> `open-on-output` can now use monitor manufacturer, model, and serial.
Before, it could only use the connector name.

<sup>Since: 25.01</sup> You can use `set-workspace-name` and `unset-workspace-name` actions to change workspace names dynamically.

<sup>Since: 25.02</sup> Named workspaces no longer update/forget their original output when opening a new window on them (unnamed workspaces will keep doing that).
This means that named workspaces "stick" to their original output in more cases, reflecting their more permanent nature.
Explicitly moving a named workspace to a different monitor will still update its original output.

### Layout config overrides

<sup>Since: 25.11</sup>

You can customize layout settings for named workspaces with a `layout {}` block:

```kdl
workspace "aesthetic" {
    // Layout config overrides just for this named workspace.
    layout {
        gaps 32

        struts {
            left 64
            right 64
            bottom 64
            top 64
        }

        border {
            on
            width 4
        }

        // ...any other setting.
    }
}
```

It accepts all the same options as [the top-level `layout {}` block](./Configuration:-Layout.md), except:

- `empty-workspace-above-first`: this is an output-level setting, doesn't make sense on a workspace.
- `insert-hint`: currently we always draw these at the output level, so it's not customizable per-workspace.

In order to unset a flag, write it with `false`, e.g.:

```kdl
layout {
    // Enabled globally.
    always-center-single-column
}

workspace "uncentered" {
    layout {
        // Unset on this workspace.
        always-center-single-column false
    }
}
```


================================================
FILE: docs/wiki/Configuration:-Outputs.md
================================================
### Overview

By default, niri will attempt to turn on all connected monitors using their preferred modes.
You can disable or adjust this with `output` sections.

Here's what it looks like with all properties written out:

```kdl
output "eDP-1" {
    // off
    mode "1920x1080@120.030"
    scale 2.0
    transform "90"
    position x=1280 y=0
    variable-refresh-rate // on-demand=true
    focus-at-startup
    backdrop-color "#001100"

    hot-corners {
        // off
        top-left
        // top-right
        // bottom-left
        // bottom-right
    }

    layout {
        // ...layout settings for eDP-1...
    }

    // Custom modes. Caution: may damage your display.
    // mode custom=true "1920x1080@100"
    // modeline 173.00  1920 2048 2248 2576  1080 1083 1088 1120 "-hsync" "+vsync"
}

output "HDMI-A-1" {
    // ...settings for HDMI-A-1...
}

output "Some Company CoolMonitor 1234" {
    // ...settings for CoolMonitor...
}
```

Outputs are matched by connector name (i.e. `eDP-1`, `HDMI-A-1`), or by monitor manufacturer, model, and serial, separated by a single space each.
You can find all of these by running `niri msg outputs`.

Usually, the built-in monitor in laptops will be called `eDP-1`.

<sup>Since: 0.1.6</sup> The output name is case-insensitive.

<sup>Since: 0.1.9</sup> Outputs can be matched by manufacturer, model, and serial.
Before, they could be matched only by the connector name.

### `off`

This flag turns off that output entirely.

```kdl
// Turn off that monitor.
output "HDMI-A-1" {
    off
}
```

### `mode`

Set the monitor resolution and refresh rate.

The format is `<width>x<height>` or `<width>x<height>@<refresh rate>`.
If the refresh rate is omitted, niri will pick the highest refresh rate for the resolution.

If the mode is omitted altogether or doesn't work, niri will try to pick one automatically.

Run `niri msg outputs` while inside a niri instance to list all outputs and their modes.
The refresh rate that you set here must match *exactly*, down to the three decimal digits, to what you see in `niri msg outputs`.

```kdl
// Set a high refresh rate for this monitor.
// High refresh rate monitors tend to use 60 Hz as their preferred mode,
// requiring a manual mode setting.
output "HDMI-A-1" {
    mode "2560x1440@143.912"
}

// Use a lower resolution on the built-in laptop monitor
// (for example, for testing purposes).
output "eDP-1" {
    mode "1280x720"
}
```

#### `mode custom=true`

<sup>Since: 25.11</sup>

You can configure a custom mode (not offered by the monitor) by setting `custom=true`.
In this case, the refresh rate is mandatory.

Custom modes are not guaranteed to work.
Niri is asking the monitor to run in a mode that is not supported by the manufacturer.
Use at your own risk.

> [!CAUTION]
> Custom modes may damage your monitor, especially if it's a CRT.
> Follow the maximum supported limits in your monitor's instructions.

```kdl
// Use a custom mode for this display.
output "HDMI-A-1" {
    mode custom=true "2560x1440@143.912"
}
```

### `modeline`

<sup>Since: 25.11</sup>

Directly configures the monitor's mode via a modeline, overriding any configured `mode`.
The modeline can be calculated via utilities such as [cvt](https://man.archlinux.org/man/cvt.1.en) or [gtf](https://man.archlinux.org/man/gtf.1.en).

Modelines are not guaranteed to work.
Niri is asking the monitor to run in a mode not supported by the manufacturer.
Use at your own risk.

> [!CAUTION]
> Out of spec modelines may damage your monitor, especially if it's a CRT.
> Follow the maximum supported limits in your monitor's instructions.

```kdl
// Use a modeline for this display.
output "eDP-3" {
    modeline 173.00  1920 2048 2248 2576  1080 1083 1088 1120 "-hsync" "+vsync"
}
```

### `scale`

Set the scale of the monitor.

<sup>Since: 0.1.6</sup> If scale is unset, niri will guess an appropriate scale based on the physical dimensions and the resolution of the monitor.

<sup>Since: 0.1.7</sup> You can use fractional scale values, for example `scale 1.5` for 150% scale.

<sup>Since: 0.1.7</sup> Dot is no longer needed for integer scale, for example you can write `scale 2` instead of `scale 2.0`.

<sup>Since: 0.1.7</sup> Scale below 0 and above 10 will now fail during config parsing. Scale was previously clamped to these values anyway.

```kdl
output "eDP-1" {
    scale 2.0
}
```

### `transform`

Rotate the output counter-clockwise.

Valid values are: `"normal"`, `"90"`, `"180"`, `"270"`, `"flipped"`, `"flipped-90"`, `"flipped-180"` and `"flipped-270"`.
Values with `flipped` additionally flip the output.

```kdl
output "HDMI-A-1" {
    transform "90"
}
```

### `position`

Set the position of the output in the global coordinate space.

This affects directional monitor actions like `focus-monitor-left`, and cursor movement.
The cursor can only move between directly adjacent outputs.

> [!NOTE]
> Output scale and rotation has to be taken into account for positioning: outputs are sized in logical, or scaled, pixels.
> For example, a 3840×2160 output with scale 2.0 will have a logical size of 1920×1080, so to put another output directly adjacent to it on the right, set its x to 1920.
> If the position is unset or results in an overlap, the output is instead placed automatically.

```kdl
output "HDMI-A-1" {
    position x=1280 y=0
}
```

#### Automatic Positioning

Niri repositions outputs from scratch every time the output configuration changes (which includes monitors disconnecting and connecting).
The following algorithm is used for positioning outputs.

1. Collect all connected monitors and their logical sizes.
1. Sort them by their name. This makes it so the automatic positioning does not depend on the order the monitors are connected. This is important because the connection order is non-deterministic at compositor startup.
1. Try to place every output with explicitly configured `position`, in order. If the output overlaps previously placed outputs, place it to the right of all previously placed outputs. In this case, niri will also print a warning.
1. Place every output without explicitly configured `position` by putting it to the right of all previously placed outputs.

### `variable-refresh-rate`

<sup>Since: 0.1.5</sup>

This flag enables variable refresh rate (VRR, also known as adaptive sync, FreeSync, or G-Sync), if the output supports it.

You can check whether an output supports VRR in `niri msg outputs`.

> [!NOTE]
> Some drivers have various issues with VRR.
>
> If the cursor moves at a low framerate with VRR, try setting the [`disable-cursor-plane` debug flag](./Configuration:-Debug-Options.md#disable-cursor-plane) and reconnecting the monitor.
>
> If a monitor is not detected as VRR-capable when it should, sometimes unplugging a different monitor fixes it.
>
> Some monitors will continuously modeset (flash black) with VRR enabled; I'm not sure if there's a way to fix it.

```kdl
output "HDMI-A-1" {
    variable-refresh-rate
}
```

<sup>Since: 0.1.9</sup> You can also set the `on-demand=true` property, which will only enable VRR when this output shows a window matching the `variable-refresh-rate` window rule.
This is helpful to avoid various issues with VRR, since it can be disabled most of the time, and only enabled for specific windows, like games or video players.

```kdl
output "HDMI-A-1" {
    variable-refresh-rate on-demand=true
}
```

### `focus-at-startup`

<sup>Since: 25.05</sup>

Focus this output by default when niri starts.

If multiple outputs with `focus-at-startup` are connected, they are prioritized in the order that they appear in the config.

When none of the connected outputs are explicitly `focus-at-startup`, niri will focus the first one sorted by name (same output sorting a
Download .txt
Showing preview only (501K chars total). Download the full file or copy to clipboard to get everything.
gitextract_heky1qt6/

├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── config.yml
│   ├── dependabot.yml
│   └── workflows/
│       ├── ci.yml
│       └── release.yml
├── .gitignore
├── CONTRIBUTING.md
├── Cargo.toml
├── LICENSE
├── README.md
├── build.rs
├── clippy.toml
├── docs/
│   ├── .gitignore
│   ├── hooks/
│   │   ├── remove-must-fail.py
│   │   └── shortcodes.py
│   ├── mkdocs.yaml
│   ├── pyproject.toml
│   └── wiki/
│       ├── Accessibility.md
│       ├── Application-Issues.md
│       ├── Configuration:-Animations.md
│       ├── Configuration:-Debug-Options.md
│       ├── Configuration:-Gestures.md
│       ├── Configuration:-Include.md
│       ├── Configuration:-Input.md
│       ├── Configuration:-Introduction.md
│       ├── Configuration:-Key-Bindings.md
│       ├── Configuration:-Layer-Rules.md
│       ├── Configuration:-Layout.md
│       ├── Configuration:-Miscellaneous.md
│       ├── Configuration:-Named-Workspaces.md
│       ├── Configuration:-Outputs.md
│       ├── Configuration:-Overview.md
│       ├── Configuration:-Recent-Windows.md
│       ├── Configuration:-Switch-Events.md
│       ├── Configuration:-Window-Rules.md
│       ├── Development:-Animation-Timing.md
│       ├── Development:-Design-Principles.md
│       ├── Development:-Developing-niri.md
│       ├── Development:-Documenting-niri.md
│       ├── Development:-Fractional-Layout.md
│       ├── Development:-Redraw-Loop.md
│       ├── Example-systemd-Setup.md
│       ├── FAQ.md
│       ├── Floating-Windows.md
│       ├── Fullscreen-and-Maximize.md
│       ├── Gestures.md
│       ├── Getting-Started.md
│       ├── IPC.md
│       ├── Important-Software.md
│       ├── Integrating-niri.md
│       ├── Layer‐Shell-Components.md
│       ├── Name-and-Logo.md
│       ├── Nvidia.md
│       ├── Overview.md
│       ├── Packaging-niri.md
│       ├── README.md
│       ├── Screencasting.md
│       ├── Tabs.md
│       ├── Workspaces.md
│       ├── Xwayland.md
│       ├── _Sidebar.md
│       ├── _assets/
│       │   └── stylesheets/
│       │       └── niri.css
│       └── examples/
│           ├── close_custom_shader.frag
│           ├── open_custom_shader.frag
│           └── resize_custom_shader.frag
├── flake.nix
├── niri-config/
│   ├── Cargo.toml
│   ├── src/
│   │   ├── animations.rs
│   │   ├── appearance.rs
│   │   ├── binds.rs
│   │   ├── debug.rs
│   │   ├── error.rs
│   │   ├── gestures.rs
│   │   ├── input.rs
│   │   ├── layer_rule.rs
│   │   ├── layout.rs
│   │   ├── lib.rs
│   │   ├── macros.rs
│   │   ├── misc.rs
│   │   ├── output.rs
│   │   ├── recent_windows.rs
│   │   ├── utils/
│   │   │   └── merge_with.rs
│   │   ├── utils.rs
│   │   ├── window_rule.rs
│   │   └── workspace.rs
│   └── tests/
│       └── wiki-parses.rs
├── niri-ipc/
│   ├── Cargo.toml
│   ├── README.md
│   └── src/
│       ├── lib.rs
│       ├── socket.rs
│       └── state.rs
├── niri-visual-tests/
│   ├── Cargo.toml
│   ├── README.md
│   ├── resources/
│   │   └── style.css
│   └── src/
│       ├── cases/
│       │   ├── gradient_angle.rs
│       │   ├── gradient_area.rs
│       │   ├── gradient_oklab.rs
│       │   ├── gradient_oklab_alpha.rs
│       │   ├── gradient_oklch_alpha.rs
│       │   ├── gradient_oklch_decreasing.rs
│       │   ├── gradient_oklch_increasing.rs
│       │   ├── gradient_oklch_longer.rs
│       │   ├── gradient_oklch_shorter.rs
│       │   ├── gradient_srgb.rs
│       │   ├── gradient_srgb_alpha.rs
│       │   ├── gradient_srgblinear.rs
│       │   ├── gradient_srgblinear_alpha.rs
│       │   ├── layout.rs
│       │   ├── mod.rs
│       │   ├── tile.rs
│       │   └── window.rs
│       ├── main.rs
│       ├── smithay_view.rs
│       └── test_window.rs
├── niri.spec.rpkg
├── resources/
│   ├── cursor.rgba
│   ├── default-config.kdl
│   ├── dinit/
│   │   ├── niri
│   │   └── niri.target
│   ├── mutter-x11-interop.xml
│   ├── niri-portals.conf
│   ├── niri-session
│   ├── niri-shutdown.target
│   ├── niri.desktop
│   ├── niri.service
│   └── rustdoc-index.html
├── rustfmt.toml
├── src/
│   ├── a11y.rs
│   ├── animation/
│   │   ├── bezier.rs
│   │   ├── clock.rs
│   │   ├── mod.rs
│   │   └── spring.rs
│   ├── backend/
│   │   ├── headless.rs
│   │   ├── mod.rs
│   │   ├── tty.rs
│   │   └── winit.rs
│   ├── cli.rs
│   ├── cursor.rs
│   ├── dbus/
│   │   ├── freedesktop_a11y.rs
│   │   ├── freedesktop_locale1.rs
│   │   ├── freedesktop_login1.rs
│   │   ├── freedesktop_screensaver.rs
│   │   ├── gnome_shell_introspect.rs
│   │   ├── gnome_shell_screenshot.rs
│   │   ├── mod.rs
│   │   ├── mutter_display_config.rs
│   │   ├── mutter_screen_cast.rs
│   │   └── mutter_service_channel.rs
│   ├── frame_clock.rs
│   ├── handlers/
│   │   ├── compositor.rs
│   │   ├── layer_shell.rs
│   │   ├── mod.rs
│   │   └── xdg_shell.rs
│   ├── input/
│   │   ├── backend_ext.rs
│   │   ├── mod.rs
│   │   ├── move_grab.rs
│   │   ├── pick_color_grab.rs
│   │   ├── pick_window_grab.rs
│   │   ├── resize_grab.rs
│   │   ├── scroll_swipe_gesture.rs
│   │   ├── scroll_tracker.rs
│   │   ├── spatial_movement_grab.rs
│   │   ├── swipe_tracker.rs
│   │   ├── touch_overview_grab.rs
│   │   └── touch_resize_grab.rs
│   ├── ipc/
│   │   ├── client.rs
│   │   ├── mod.rs
│   │   └── server.rs
│   ├── layer/
│   │   ├── mapped.rs
│   │   └── mod.rs
│   ├── layout/
│   │   ├── closing_window.rs
│   │   ├── floating.rs
│   │   ├── focus_ring.rs
│   │   ├── insert_hint_element.rs
│   │   ├── mod.rs
│   │   ├── monitor.rs
│   │   ├── opening_window.rs
│   │   ├── scrolling.rs
│   │   ├── shadow.rs
│   │   ├── tab_indicator.rs
│   │   ├── tests/
│   │   │   ├── animations.rs
│   │   │   └── fullscreen.rs
│   │   ├── tests.rs
│   │   ├── tile.rs
│   │   └── workspace.rs
│   ├── lib.rs
│   ├── main.rs
│   ├── niri.rs
│   ├── protocols/
│   │   ├── ext_workspace.rs
│   │   ├── foreign_toplevel.rs
│   │   ├── gamma_control.rs
│   │   ├── mod.rs
│   │   ├── mutter_x11_interop.rs
│   │   ├── output_management.rs
│   │   ├── raw.rs
│   │   ├── screencopy.rs
│   │   └── virtual_pointer.rs
│   ├── render_helpers/
│   │   ├── border.rs
│   │   ├── clipped_surface.rs
│   │   ├── damage.rs
│   │   ├── debug.rs
│   │   ├── gradient_fade_texture.rs
│   │   ├── memory.rs
│   │   ├── mod.rs
│   │   ├── offscreen.rs
│   │   ├── primary_gpu_texture.rs
│   │   ├── render_elements.rs
│   │   ├── renderer.rs
│   │   ├── resize.rs
│   │   ├── resources.rs
│   │   ├── shader_element.rs
│   │   ├── shaders/
│   │   │   ├── border.frag
│   │   │   ├── clipped_surface.frag
│   │   │   ├── close_epilogue.frag
│   │   │   ├── close_prelude.frag
│   │   │   ├── gradient_fade.frag
│   │   │   ├── mod.rs
│   │   │   ├── open_epilogue.frag
│   │   │   ├── open_prelude.frag
│   │   │   ├── resize.frag
│   │   │   ├── resize_epilogue.frag
│   │   │   ├── resize_prelude.frag
│   │   │   ├── shadow.frag
│   │   │   └── texture.vert
│   │   ├── shadow.rs
│   │   ├── snapshot.rs
│   │   ├── solid_color.rs
│   │   ├── surface.rs
│   │   └── texture.rs
│   ├── rubber_band.rs
│   ├── screencasting/
│   │   ├── mod.rs
│   │   └── pw_utils.rs
│   ├── tests/
│   │   ├── animations.rs
│   │   ├── client.rs
│   │   ├── fixture.rs
│   │   ├── floating.rs
│   │   ├── fullscreen.rs
│   │   ├── layer_shell.rs
│   │   ├── mod.rs
│   │   ├── server.rs
│   │   ├── snapshots/
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsAN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsAN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsAN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsAN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsAU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsAU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsAU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsAU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsBN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsBN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsBN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsBN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsBU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsBU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsBU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsBU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmF.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsAN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsAN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsAN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsAN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsAU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsAU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsAU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsAU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsBN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsBN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsBN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsBN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsBU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsBU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsBU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsBU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-tmT.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsAN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsAN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsAN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsAN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsAU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsAU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsAU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsAU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsBN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsBN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsBN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsBN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsBU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsBU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsBU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsBU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsF.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsAN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsAN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsAN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsAN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsAU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsAU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsAU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsAU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsBN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsBN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsBN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsBN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsBU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsBU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsBU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsBU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmF.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsAN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsAN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsAN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsAN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsAU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsAU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsAU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsAU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsBN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsBN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsBN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsBN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsBU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsBU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsBU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsBU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-tmT.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsAN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsAN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsAN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsAN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsAU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsAU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsAU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsAU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsBN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsBN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsBN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsBN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsBU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsBU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsBU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsBU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@fsT.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsAN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsAN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsAN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsAN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsAU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsAU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsAU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsAU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsBN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsBN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsBN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsBN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsBU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsBU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsBU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsBU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmF.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsAN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsAN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsAN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsAN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsAU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsAU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsAU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsAU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsBN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsBN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsBN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsBN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsBU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsBU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsBU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsBU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@tmT.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsAN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsAN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsAN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsAN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsAU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsAU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsAU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsAU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsBN-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsBN-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsBN-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsBN-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsBU-wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsBU-wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsBU-wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsBU-wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wmA.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wmAU.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wmB.snap
│   │   │   ├── niri__tests__window_opening__check_fullscreen_maximize@wmBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsF.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@fsT.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsF.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-fsT.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsF.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-fsT.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@out2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsF.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-fsT.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsF.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-fsT.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsF.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-fsT.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-out2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsF.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-fsT.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsF.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-fsT.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsF.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-fsT.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-out2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsA1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsA1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsA1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsA1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsA2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsA2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsA2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsA2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsAN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsAN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsAN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsAN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsAU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsAU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsAU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsAU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsB1-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsB1-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsB1-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsB1-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsB2-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsB2-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsB2-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsB2-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsBN-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsBN-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsBN-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsBN-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsBU-spA1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsBU-spA2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsBU-spB1.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsBU-spB2.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_output_and_workspace@ws2.snap
│   │   │   ├── niri__tests__window_opening__check_target_size.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhF500.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhP0.5.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dhU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhF500.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhP0.5.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-dhU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwF1000.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhF500.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhP0.5.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-dhU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwP0.25.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhF500.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhP0.5.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-dhU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@dwU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhF500.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhP0.5.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dhU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhF500.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhP0.5.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-dhU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwF1000.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhF500.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhP0.5.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-dhU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwP0.25.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-b.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-dhF500-b-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-dhF500-b-wfsAN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-dhF500-b-wfsAN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-dhF500-b-wfsAU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-dhF500-b-wfsAU.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-dhF500-b-wfsBN-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-dhF500-b-wfsBN.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-dhF500-b-wfsBU-t.snap
│   │   │   ├── niri__tests__window_opening__check_target_size@fsF-dwU-dhF500-b-wfsBU.snap
│   │   │   ├── niri__tests__window_opening__check_target
Download .txt
Showing preview only (324K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3867 symbols across 161 files)

FILE: build.rs
  function main (line 1) | fn main() {

FILE: docs/hooks/remove-must-fail.py
  function on_page_markdown (line 13) | def on_page_markdown(

FILE: docs/hooks/shortcodes.py
  function on_page_markdown (line 25) | def on_page_markdown(
  function _badge_for_version (line 38) | def _badge_for_version(preposition: str, version: str):

FILE: niri-config/src/animations.rs
  type Animations (line 8) | pub struct Animations {
    method merge_with (line 77) | fn merge_with(&mut self, part: &AnimationsPart) {
  method default (line 25) | fn default() -> Self {
  type AnimationsPart (line 45) | pub struct AnimationsPart {
  type Animation (line 105) | pub struct Animation {
    method new_off (line 528) | pub fn new_off() -> Self {
    method decode_node (line 538) | fn decode_node<S: knuffel::traits::ErrorSpan>(
  type Kind (line 111) | pub enum Kind {
  type EasingParams (line 117) | pub struct EasingParams {
  type Curve (line 123) | pub enum Curve {
  type SpringParams (line 132) | pub struct SpringParams {
    method decode_node (line 759) | fn decode_node(
  type WorkspaceSwitchAnim (line 139) | pub struct WorkspaceSwitchAnim(pub Animation);
    method decode_node (line 333) | fn decode_node(
  method default (line 142) | fn default() -> Self {
  type WindowOpenAnim (line 155) | pub struct WindowOpenAnim {
    method decode_node (line 378) | fn decode_node(
  method default (line 161) | fn default() -> Self {
  type WindowCloseAnim (line 176) | pub struct WindowCloseAnim {
    method decode_node (line 404) | fn decode_node(
  method default (line 182) | fn default() -> Self {
  type HorizontalViewMovementAnim (line 197) | pub struct HorizontalViewMovementAnim(pub Animation);
    method decode_node (line 348) | fn decode_node(
  method default (line 200) | fn default() -> Self {
  type WindowMovementAnim (line 213) | pub struct WindowMovementAnim(pub Animation);
    method decode_node (line 363) | fn decode_node(
  method default (line 216) | fn default() -> Self {
  type WindowResizeAnim (line 229) | pub struct WindowResizeAnim {
    method decode_node (line 430) | fn decode_node(
  method default (line 235) | fn default() -> Self {
  type ConfigNotificationOpenCloseAnim (line 251) | pub struct ConfigNotificationOpenCloseAnim(pub Animation);
    method decode_node (line 456) | fn decode_node(
  method default (line 254) | fn default() -> Self {
  type ExitConfirmationOpenCloseAnim (line 267) | pub struct ExitConfirmationOpenCloseAnim(pub Animation);
    method decode_node (line 471) | fn decode_node(
  method default (line 270) | fn default() -> Self {
  type ScreenshotUiOpenAnim (line 283) | pub struct ScreenshotUiOpenAnim(pub Animation);
    method decode_node (line 486) | fn decode_node(
  method default (line 286) | fn default() -> Self {
  type OverviewOpenCloseAnim (line 298) | pub struct OverviewOpenCloseAnim(pub Animation);
    method decode_node (line 501) | fn decode_node(
  method default (line 301) | fn default() -> Self {
  type RecentWindowsCloseAnim (line 314) | pub struct RecentWindowsCloseAnim(pub Animation);
    method decode_node (line 516) | fn decode_node(
  method default (line 317) | fn default() -> Self {

FILE: niri-config/src/appearance.rs
  constant DEFAULT_BACKGROUND_COLOR (line 11) | pub const DEFAULT_BACKGROUND_COLOR: Color = Color::from_array_unpremul([...
  constant DEFAULT_BACKDROP_COLOR (line 12) | pub const DEFAULT_BACKDROP_COLOR: Color = Color::from_array_unpremul([0....
  type Color (line 16) | pub struct Color {
    method new_unpremul (line 24) | pub const fn new_unpremul(r: f32, g: f32, b: f32, a: f32) -> Self {
    method from_rgba8_unpremul (line 28) | pub fn from_rgba8_unpremul(r: u8, g: u8, b: u8, a: u8) -> Self {
    method from_array_premul (line 32) | pub fn from_array_premul([r, g, b, a]: [f32; 4]) -> Self {
    method from_array_unpremul (line 47) | pub const fn from_array_unpremul([r, g, b, a]: [f32; 4]) -> Self {
    method from_color32f (line 51) | pub fn from_color32f(color: Color32F) -> Self {
    method to_array_unpremul (line 55) | pub fn to_array_unpremul(self) -> [f32; 4] {
    method to_array_premul (line 59) | pub fn to_array_premul(self) -> [f32; 4] {
    type Output (line 66) | type Output = Self;
    method mul (line 68) | fn mul(mut self, rhs: f32) -> Self::Output {
    method mul_assign (line 75) | fn mul_assign(&mut self, rhs: f32) {
    method from (line 811) | fn from(value: ColorRgba) -> Self {
    method decode_node (line 822) | fn decode_node(
  method from (line 81) | fn from(value: Color) -> Self {
  type Gradient (line 87) | pub struct Gradient {
    method from (line 101) | fn from(value: Color) -> Self {
  type GradientRelativeTo (line 113) | pub enum GradientRelativeTo {
  type GradientInterpolation (line 120) | pub struct GradientInterpolation {
  type GradientColorSpace (line 126) | pub enum GradientColorSpace {
  type HueInterpolation (line 135) | pub enum HueInterpolation {
  type CornerRadius (line 144) | pub struct CornerRadius {
    method from (line 163) | fn from(value: f32) -> Self {
    method fit_to (line 174) | pub fn fit_to(self, width: f32, height: f32) -> Self {
    method expanded_by (line 196) | pub fn expanded_by(mut self, width: f32) -> Self {
    method scaled_by (line 221) | pub fn scaled_by(self, scale: f32) -> Self {
    method decode_node (line 894) | fn decode_node(
  function from (line 152) | fn from(value: CornerRadius) -> Self {
  type FocusRing (line 232) | pub struct FocusRing {
    method from (line 286) | fn from(value: Border) -> Self {
    method merge_with (line 334) | fn merge_with(&mut self, part: &BorderRule) {
  method default (line 244) | fn default() -> Self {
  type Border (line 259) | pub struct Border {
    method from (line 301) | fn from(value: FocusRing) -> Self {
    method merge_with (line 316) | fn merge_with(&mut self, part: &BorderRule) {
  method default (line 271) | fn default() -> Self {
  type Shadow (line 342) | pub struct Shadow {
    method merge_with (line 370) | fn merge_with(&mut self, part: &ShadowRule) {
    method from (line 417) | fn from(value: WorkspaceShadow) -> Self {
  method default (line 353) | fn default() -> Self {
  type ShadowOffset (line 385) | pub struct ShadowOffset {
  type WorkspaceShadow (line 393) | pub struct WorkspaceShadow {
    method merge_with (line 447) | fn merge_with(&mut self, part: &WorkspaceShadowPart) {
  method default (line 402) | fn default() -> Self {
  type WorkspaceShadowPart (line 431) | pub struct WorkspaceShadowPart {
  type TabIndicator (line 459) | pub struct TabIndicator {
    method merge_with (line 502) | fn merge_with(&mut self, part: &TabIndicatorPart) {
  method default (line 478) | fn default() -> Self {
  type TabIndicatorPart (line 530) | pub struct TabIndicatorPart {
  type TabIndicatorLength (line 566) | pub struct TabIndicatorLength {
  type TabIndicatorPosition (line 572) | pub enum TabIndicatorPosition {
  type InsertHint (line 580) | pub struct InsertHint {
    method merge_with (line 597) | fn merge_with(&mut self, part: &InsertHintPart) {
  method default (line 587) | fn default() -> Self {
  type InsertHintPart (line 608) | pub struct InsertHintPart {
  type BlockOutFrom (line 620) | pub enum BlockOutFrom {
  type BorderRule (line 626) | pub struct BorderRule {
    method merge_with (line 684) | fn merge_with(&mut self, part: &Self) {
  type ShadowRule (line 648) | pub struct ShadowRule {
    method merge_with (line 699) | fn merge_with(&mut self, part: &Self) {
  type TabIndicatorRule (line 668) | pub struct TabIndicatorRule {
    method merge_with (line 715) | fn merge_with(&mut self, part: &Self) {
  type Err (line 726) | type Err = miette::Error;
  method from_str (line 728) | fn from_str(s: &str) -> Result<Self, Self::Err> {
  type Err (line 787) | type Err = miette::Error;
  method from_str (line 789) | fn from_str(s: &str) -> Result<Self, Self::Err> {
  type ColorRgba (line 799) | struct ColorRgba {
  function parse_gradient_interpolation (line 1017) | fn parse_gradient_interpolation() {
  function test_border_rule_on_off_merging (line 1092) | fn test_border_rule_on_off_merging() {
  function rule_color_can_override_base_gradient (line 1134) | fn rule_color_can_override_base_gradient() {
  function rule_color_can_override_rule_gradient (line 1181) | fn rule_color_can_override_rule_gradient() {

FILE: niri-config/src/binds.rs
  type Binds (line 19) | pub struct Binds(pub Vec<Bind>);
    method decode_node (line 766) | fn decode_node(
  type Bind (line 22) | pub struct Bind {
    method decode_node (line 828) | fn decode_node(
  type Key (line 33) | pub struct Key {
  type Trigger (line 39) | pub enum Trigger {
  type SwitchBinds (line 70) | pub struct SwitchBinds {
    method merge_with (line 82) | fn merge_with(&mut self, part: &SwitchBinds) {
  type SwitchAction (line 94) | pub struct SwitchAction {
  type Action (line 101) | pub enum Action {
    method from (line 395) | fn from(value: niri_ipc::Action) -> Self {
  type WorkspaceReference (line 708) | pub enum WorkspaceReference {
    method from (line 715) | fn from(reference: WorkspaceReferenceArg) -> WorkspaceReference {
    method type_check (line 725) | fn type_check(
    method raw_decode (line 738) | fn raw_decode(
  type Err (line 956) | type Err = miette::Error;
  method from_str (line 958) | fn from_str(s: &str) -> Result<Self, Self::Err> {
  function parse_xf86_screensaver (line 1059) | fn parse_xf86_screensaver() {
  function parse_iso_level_shifts (line 1084) | fn parse_iso_level_shifts() {

FILE: niri-config/src/debug.rs
  type Debug (line 6) | pub struct Debug {
    method merge_with (line 77) | fn merge_with(&mut self, part: &DebugPart) {
  type DebugPart (line 31) | pub struct DebugPart {
  type PreviewRender (line 108) | pub enum PreviewRender {

FILE: niri-config/src/error.rs
  type ConfigParseResult (line 8) | pub struct ConfigParseResult<T, E> {
  type ConfigIncludeError (line 23) | pub struct ConfigIncludeError {
    method fmt (line 48) | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
  function from_err (line 29) | pub fn from_err(err: E) -> Self {
  function map_config_res (line 36) | pub fn map_config_res<U, V>(
  method source (line 54) | fn source(&self) -> Option<&(dyn Error + 'static)> {
  method code (line 60) | fn code<'a>(&'a self) -> Option<Box<dyn fmt::Display + 'a>> {
  method severity (line 64) | fn severity(&self) -> Option<miette::Severity> {
  method help (line 68) | fn help<'a>(&'a self) -> Option<Box<dyn fmt::Display + 'a>> {
  method url (line 72) | fn url<'a>(&'a self) -> Option<Box<dyn fmt::Display + 'a>> {
  method source_code (line 76) | fn source_code(&self) -> Option<&dyn miette::SourceCode> {
  method labels (line 80) | fn labels(&self) -> Option<Box<dyn Iterator<Item = miette::LabeledSpan> ...
  method diagnostic_source (line 84) | fn diagnostic_source(&self) -> Option<&dyn Diagnostic> {
  method related (line 88) | fn related<'a>(&'a self) -> Option<Box<dyn Iterator<Item = &'a dyn Diagn...

FILE: niri-config/src/gestures.rs
  type Gestures (line 5) | pub struct Gestures {
    method merge_with (line 22) | fn merge_with(&mut self, part: &GesturesPart) {
  type GesturesPart (line 12) | pub struct GesturesPart {
  type DndEdgeViewScroll (line 33) | pub struct DndEdgeViewScroll {
    method merge_with (line 60) | fn merge_with(&mut self, part: &DndEdgeViewScrollPart) {
  method default (line 40) | fn default() -> Self {
  type DndEdgeViewScrollPart (line 50) | pub struct DndEdgeViewScrollPart {
  type DndEdgeWorkspaceSwitch (line 67) | pub struct DndEdgeWorkspaceSwitch {
    method merge_with (line 94) | fn merge_with(&mut self, part: &DndEdgeWorkspaceSwitchPart) {
  method default (line 74) | fn default() -> Self {
  type DndEdgeWorkspaceSwitchPart (line 84) | pub struct DndEdgeWorkspaceSwitchPart {
  type HotCorners (line 101) | pub struct HotCorners {

FILE: niri-config/src/input.rs
  type Input (line 12) | pub struct Input {
    method merge_with (line 59) | fn merge_with(&mut self, part: &InputPart) {
  type InputPart (line 29) | pub struct InputPart {
  type Keyboard (line 88) | pub struct Keyboard {
    method merge_with (line 124) | fn merge_with(&mut self, part: &KeyboardPart) {
  method default (line 97) | fn default() -> Self {
  type KeyboardPart (line 110) | pub struct KeyboardPart {
  type Xkb (line 131) | pub struct Xkb {
    method to_xkb_config (line 147) | pub fn to_xkb_config(&self) -> XkbConfig<'_> {
  type TrackLayout (line 159) | pub enum TrackLayout {
  type ScrollFactor (line 168) | pub struct ScrollFactor {
    method h_v_factors (line 178) | pub fn h_v_factors(&self) -> (f64, f64) {
  type Touchpad (line 187) | pub struct Touchpad {
  type Mouse (line 227) | pub struct Mouse {
  type Trackpoint (line 251) | pub struct Trackpoint {
  type Trackball (line 273) | pub struct Trackball {
  type ClickMethod (line 295) | pub enum ClickMethod {
  function from (line 301) | fn from(value: ClickMethod) -> Self {
  type AccelProfile (line 310) | pub enum AccelProfile {
  function from (line 316) | fn from(value: AccelProfile) -> Self {
  type ScrollMethod (line 325) | pub enum ScrollMethod {
  function from (line 333) | fn from(value: ScrollMethod) -> Self {
  type TapButtonMap (line 344) | pub enum TapButtonMap {
  function from (line 350) | fn from(value: TapButtonMap) -> Self {
  type Tablet (line 359) | pub struct Tablet {
  type Touch (line 371) | pub struct Touch {
  type FocusFollowsMouse (line 381) | pub struct FocusFollowsMouse {
  type WarpMouseToFocus (line 387) | pub struct WarpMouseToFocus {
  type WarpMouseToFocusMode (line 393) | pub enum WarpMouseToFocusMode {
  type Err (line 399) | type Err = miette::Error;
  method from_str (line 401) | fn from_str(s: &str) -> Result<Self, Self::Err> {
  type ModKey (line 413) | pub enum ModKey {
    method to_modifiers (line 423) | pub fn to_modifiers(&self) -> Modifiers {
  type Err (line 436) | type Err = miette::Error;
  method from_str (line 438) | fn from_str(s: &str) -> Result<Self, Self::Err> {
  type Err (line 452) | type Err = miette::Error;
  method from_str (line 454) | fn from_str(s: &str) -> Result<Self, Self::Err> {
  type Err (line 466) | type Err = miette::Error;
  method from_str (line 468) | fn from_str(s: &str) -> Result<Self, Self::Err> {
  type Err (line 480) | type Err = miette::Error;
  method from_str (line 482) | fn from_str(s: &str) -> Result<Self, Self::Err> {
  type Err (line 496) | type Err = miette::Error;
  method from_str (line 498) | fn from_str(s: &str) -> Result<Self, Self::Err> {
  function do_parse (line 516) | fn do_parse(text: &str) -> Input {
  function parse_scroll_factor_combined (line 524) | fn parse_scroll_factor_combined() {
  function parse_scroll_factor_split (line 566) | fn parse_scroll_factor_split() {
  function parse_scroll_factor_partial (line 616) | fn parse_scroll_factor_partial() {
  function parse_scroll_factor_mixed (line 658) | fn parse_scroll_factor_mixed() {
  function scroll_factor_h_v_factors (line 708) | fn scroll_factor_h_v_factors() {

FILE: niri-config/src/layer_rule.rs
  type LayerRule (line 5) | pub struct LayerRule {
  type Match (line 26) | pub struct Match {

FILE: niri-config/src/layout.rs
  type Layout (line 11) | pub struct Layout {
    method merge_with (line 60) | fn merge_with(&mut self, part: &LayoutPart) {
  method default (line 30) | fn default() -> Self {
  type LayoutPart (line 98) | pub struct LayoutPart {
  type PresetSize (line 132) | pub enum PresetSize {
  method from (line 138) | fn from(value: PresetSize) -> Self {
  type DefaultPresetSize (line 147) | pub struct DefaultPresetSize(pub Option<PresetSize>);
    method decode_node (line 177) | fn decode_node(
  type Struts (line 150) | pub struct Struts {
  type CenterFocusedColumn (line 162) | pub enum CenterFocusedColumn {

FILE: niri-config/src/lib.rs
  constant RECURSION_LIMIT (line 65) | const RECURSION_LIMIT: u8 = 10;
  type Config (line 68) | pub struct Config {
    method load_default (line 445) | pub fn load_default() -> Self {
    method load (line 460) | pub fn load(path: &Path) -> ConfigParseResult<Self, miette::Report> {
    method parse (line 477) | pub fn parse(path: &Path, text: &str) -> ConfigParseResult<Self, Confi...
    method parse_mem (line 516) | pub fn parse_mem(text: &str) -> Result<Self, ConfigIncludeError> {
  type ConfigPath (line 95) | pub enum ConfigPath {
    method load (line 523) | pub fn load(&self) -> ConfigParseResult<Config, miette::Report> {
    method load_or_create (line 540) | pub fn load_or_create(&self) -> (Option<&Path>, ConfigParseResult<Conf...
    method load_inner (line 556) | fn load_inner<'a>(
    method create (line 581) | fn create<'a>(path: &'a Path, created_at: &mut Option<&'a Path>) -> mi...
  type BasePath (line 114) | struct BasePath(PathBuf);
  type RootBase (line 115) | struct RootBase(PathBuf);
  type Recursion (line 116) | struct Recursion(u8);
  type Includes (line 118) | struct Includes(Vec<PathBuf>);
  type IncludeErrors (line 120) | struct IncludeErrors(Vec<knuffel::Error>);
  type IncludeStack (line 124) | struct IncludeStack(HashSet<PathBuf>);
  type SawMruBinds (line 125) | struct SawMruBinds(Rc<Cell<bool>>);
  type ConfigPart (line 132) | pub struct ConfigPart;
    method decode_children (line 138) | fn decode_children(
  function can_create_default_config (line 622) | fn can_create_default_config() {
  function default_repeat_params (line 627) | fn default_repeat_params() {
  function do_parse (line 634) | fn do_parse(text: &str) -> Config {
  function parse (line 641) | fn parse() {
  function diff_lines (line 2330) | fn diff_lines(expected: &str, actual: &str) -> String {
  function diff_empty_to_default (line 2364) | fn diff_empty_to_default() {

FILE: niri-config/src/misc.rs
  type SpawnAtStartup (line 6) | pub struct SpawnAtStartup {
  type SpawnShAtStartup (line 12) | pub struct SpawnShAtStartup {
  type Cursor (line 18) | pub struct Cursor {
    method merge_with (line 49) | fn merge_with(&mut self, part: &CursorPart) {
  method default (line 26) | fn default() -> Self {
  type CursorPart (line 37) | pub struct CursorPart {
  type ScreenshotPath (line 57) | pub struct ScreenshotPath(#[knuffel(argument)] pub Option<String>);
  method default (line 60) | fn default() -> Self {
  type HotkeyOverlay (line 68) | pub struct HotkeyOverlay {
    method merge_with (line 82) | fn merge_with(&mut self, part: &HotkeyOverlayPart) {
  type HotkeyOverlayPart (line 74) | pub struct HotkeyOverlayPart {
  type ConfigNotification (line 88) | pub struct ConfigNotification {
    method merge_with (line 99) | fn merge_with(&mut self, part: &ConfigNotificationPart) {
  type ConfigNotificationPart (line 93) | pub struct ConfigNotificationPart {
  type Clipboard (line 105) | pub struct Clipboard {
    method merge_with (line 116) | fn merge_with(&mut self, part: &ClipboardPart) {
  type ClipboardPart (line 110) | pub struct ClipboardPart {
  type Overview (line 122) | pub struct Overview {
    method merge_with (line 149) | fn merge_with(&mut self, part: &OverviewPart) {
  method default (line 129) | fn default() -> Self {
  type OverviewPart (line 139) | pub struct OverviewPart {
  type Environment (line 156) | pub struct Environment(#[knuffel(children)] pub Vec<EnvironmentVariable>);
  type EnvironmentVariable (line 159) | pub struct EnvironmentVariable {
  type XwaylandSatellite (line 167) | pub struct XwaylandSatellite {
    method merge_with (line 192) | fn merge_with(&mut self, part: &XwaylandSatellitePart) {
  method default (line 173) | fn default() -> Self {
  type XwaylandSatellitePart (line 182) | pub struct XwaylandSatellitePart {

FILE: niri-config/src/output.rs
  type Outputs (line 14) | pub struct Outputs(pub Vec<Output>);
    method from_iter (line 138) | fn from_iter<T: IntoIterator<Item = Output>>(iter: T) -> Self {
    method find (line 144) | pub fn find(&self, name: &OutputName) -> Option<&Output> {
    method find_mut (line 148) | pub fn find_mut(&mut self, name: &OutputName) -> Option<&mut Output> {
  type Mode (line 17) | pub struct Mode {
    method decode_node (line 261) | fn decode_node(node: &SpannedNode<S>, ctx: &mut Context<S>) -> Result<...
  type Modeline (line 23) | pub struct Modeline {
    method decode_node (line 345) | fn decode_node(node: &SpannedNode<S>, ctx: &mut Context<S>) -> Result<...
  type Output (line 51) | pub struct Output {
    method is_vrr_always_on (line 82) | pub fn is_vrr_always_on(&self) -> bool {
    method is_vrr_on_demand (line 86) | pub fn is_vrr_on_demand(&self) -> bool {
    method is_vrr_always_off (line 90) | pub fn is_vrr_always_off(&self) -> bool {
  method default (line 96) | fn default() -> Self {
  type OutputName (line 116) | pub struct OutputName {
    method from_ipc_output (line 154) | pub fn from_ipc_output(output: &niri_ipc::Output) -> Self {
    method format_description (line 164) | pub fn format_description(&self) -> String {
    method format_make_model_serial_or_connector (line 175) | pub fn format_make_model_serial_or_connector(&self) -> String {
    method format_make_model_serial (line 183) | pub fn format_make_model_serial(&self) -> String {
    method matches (line 190) | pub fn matches(&self, target: &str) -> bool {
    method compare (line 241) | pub fn compare(&self, other: &Self) -> std::cmp::Ordering {
  type Position (line 124) | pub struct Position {
  type Vrr (line 132) | pub struct Vrr {
  function parse_mode (line 503) | fn parse_mode() {
  function make_output_name (line 528) | fn make_output_name(
  function test_output_name_match (line 543) | fn test_output_name_match() {
  function test_output_name_sorting (line 604) | fn test_output_name_sorting() {

FILE: niri-config/src/recent_windows.rs
  type RecentWindows (line 10) | pub struct RecentWindows {
    method merge_with (line 51) | fn merge_with(&mut self, part: &RecentWindowsPart) {
  method default (line 20) | fn default() -> Self {
  type RecentWindowsPart (line 33) | pub struct RecentWindowsPart {
  type MruHighlight (line 71) | pub struct MruHighlight {
    method merge_with (line 102) | fn merge_with(&mut self, part: &MruHighlightPart) {
  method default (line 79) | fn default() -> Self {
  type MruHighlightPart (line 90) | pub struct MruHighlightPart {
  type MruPreviews (line 109) | pub struct MruPreviews {
    method merge_with (line 132) | fn merge_with(&mut self, part: &MruPreviewsPart) {
  method default (line 115) | fn default() -> Self {
  type MruPreviewsPart (line 124) | pub struct MruPreviewsPart {
  type MruBind (line 138) | pub struct MruBind {
    method decode_node (line 297) | fn decode_node(
  method from (line 148) | fn from(x: MruBind) -> Self {
  type MruDirection (line 162) | pub enum MruDirection {
  type MruScope (line 171) | pub enum MruScope {
  type MruFilter (line 182) | pub enum MruFilter {
  type MruAction (line 192) | pub enum MruAction {
  method from (line 204) | fn from(x: MruAction) -> Self {
  type MruBinds (line 221) | pub struct MruBinds(pub Vec<MruBind>);
    method decode_node (line 259) | fn decode_node(
  function default_binds (line 223) | fn default_binds() -> Vec<Bind> {

FILE: niri-config/src/utils.rs
  type Percent (line 11) | pub struct Percent(pub f64);
  type FloatOrInt (line 15) | pub struct FloatOrInt<const MIN: i32, const MAX: i32>(pub f64);
  type Flag (line 24) | pub struct Flag(#[knuffel(argument, default = true)] pub bool);
  type RegexEq (line 28) | pub struct RegexEq(pub Regex);
  method eq (line 31) | fn eq(&self, other: &Self) -> bool {
  type Err (line 39) | type Err = <Regex as FromStr>::Err;
  method from_str (line 41) | fn from_str(s: &str) -> Result<Self, Self::Err> {
  type Err (line 47) | type Err = miette::Error;
  method from_str (line 49) | fn from_str(s: &str) -> Result<Self, Self::Err> {
  function merge_with (line 64) | fn merge_with(&mut self, part: &FloatOrInt<MIN, MAX>) {
  function merge_with (line 70) | fn merge_with(&mut self, part: &Flag) {
  function type_check (line 78) | fn type_check(
  function raw_decode (line 91) | fn raw_decode(
  function expect_only_children (line 141) | pub fn expect_only_children<S>(
  function parse_arg_node (line 172) | pub fn parse_arg_node<S: knuffel::traits::ErrorSpan, T: knuffel::traits:...

FILE: niri-config/src/utils/merge_with.rs
  type MergeWith (line 1) | pub trait MergeWith<T> {
    method merge_with (line 2) | fn merge_with(&mut self, part: &T);
    method merged_with (line 4) | fn merged_with(mut self, part: &T) -> Self
    method from_part (line 12) | fn from_part(part: &T) -> Self

FILE: niri-config/src/window_rule.rs
  type WindowRule (line 9) | pub struct WindowRule {
  type Match (line 78) | pub struct Match {
  type FloatingPosition (line 100) | pub struct FloatingPosition {
  type RelativeTo (line 110) | pub enum RelativeTo {

FILE: niri-config/src/workspace.rs
  type Workspace (line 6) | pub struct Workspace {
  type WorkspaceName (line 16) | pub struct WorkspaceName(pub String);
    method type_check (line 49) | fn type_check(
    method raw_decode (line 62) | fn raw_decode(
  type WorkspaceLayoutPart (line 19) | pub struct WorkspaceLayoutPart(pub LayoutPart);
    method decode_node (line 22) | fn decode_node(

FILE: niri-config/tests/wiki-parses.rs
  type KdlCodeBlock (line 4) | struct KdlCodeBlock {
  function extract_kdl_from_file (line 11) | fn extract_kdl_from_file(file_contents: &str, filename: &str) -> Vec<Kdl...
  function wiki_docs_parses (line 58) | fn wiki_docs_parses() {

FILE: niri-ipc/src/lib.rs
  type Request (line 67) | pub enum Request {
  type Reply (line 132) | pub type Reply = Result<Response, String>;
  type Response (line 137) | pub enum Response {
  type Overview (line 173) | pub struct Overview {
  type PickedColor (line 181) | pub struct PickedColor {
  type Action (line 194) | pub enum Action {
  type SizeChange (line 951) | pub enum SizeChange {
  type PositionChange (line 965) | pub enum PositionChange {
  type WorkspaceReferenceArg (line 979) | pub enum WorkspaceReferenceArg {
  type LayoutSwitchTarget (line 991) | pub enum LayoutSwitchTarget {
  type ColumnDisplay (line 1003) | pub enum ColumnDisplay {
  type OutputAction (line 1018) | pub enum OutputAction {
    method validate (line 1959) | pub fn validate(&self) -> Result<(), String> {
  type ModeToSet (line 1105) | pub enum ModeToSet {
  type ConfiguredMode (line 1115) | pub struct ConfiguredMode {
  type HSyncPolarity (line 1127) | pub enum HSyncPolarity {
  type VSyncPolarity (line 1137) | pub enum VSyncPolarity {
  type ScaleToSet (line 1147) | pub enum ScaleToSet {
  type PositionToSet (line 1160) | pub enum PositionToSet {
  type ConfiguredPosition (line 1173) | pub struct ConfiguredPosition {
  type VrrToSet (line 1184) | pub struct VrrToSet {
  type Output (line 1204) | pub struct Output {
  type Mode (line 1236) | pub struct Mode {
  type LogicalOutput (line 1250) | pub struct LogicalOutput {
  type Transform (line 1269) | pub enum Transform {
  type Window (line 1297) | pub struct Window {
  type Timestamp (line 1342) | pub struct Timestamp {
    method from (line 1711) | fn from(value: Duration) -> Self {
  type WindowLayout (line 1367) | pub struct WindowLayout {
  type OutputConfigChanged (line 1398) | pub enum OutputConfigChanged {
  type Workspace (line 1408) | pub struct Workspace {
  type KeyboardLayouts (line 1449) | pub struct KeyboardLayouts {
  type Layer (line 1459) | pub enum Layer {
  type LayerSurfaceKeyboardInteractivity (line 1473) | pub enum LayerSurfaceKeyboardInteractivity {
  type LayerSurface (line 1485) | pub struct LayerSurface {
  type Cast (line 1499) | pub struct Cast {
  type CastKind (line 1538) | pub enum CastKind {
  type CastTarget (line 1553) | pub enum CastTarget {
  type Event (line 1571) | pub enum Event {
  method from (line 1720) | fn from(value: Timestamp) -> Self {
  type Err (line 1726) | type Err = &'static str;
  method from_str (line 1728) | fn from_str(s: &str) -> Result<Self, Self::Err> {
  type Err (line 1744) | type Err = &'static str;
  method from_str (line 1746) | fn from_str(s: &str) -> Result<Self, Self::Err> {
  type Err (line 1784) | type Err = &'static str;
  method from_str (line 1786) | fn from_str(s: &str) -> Result<Self, Self::Err> {
  type Err (line 1824) | type Err = &'static str;
  method from_str (line 1826) | fn from_str(s: &str) -> Result<Self, Self::Err> {
  type Err (line 1839) | type Err = &'static str;
  method from_str (line 1841) | fn from_str(s: &str) -> Result<Self, Self::Err> {
  type Err (line 1851) | type Err = &'static str;
  method from_str (line 1853) | fn from_str(s: &str) -> Result<Self, Self::Err> {
  type Err (line 1872) | type Err = &'static str;
  method from_str (line 1874) | fn from_str(s: &str) -> Result<Self, Self::Err> {
  type Err (line 1885) | type Err = &'static str;
  method from_str (line 1887) | fn from_str(s: &str) -> Result<Self, Self::Err> {
  type Err (line 1913) | type Err = &'static str;
  method from_str (line 1915) | fn from_str(s: &str) -> Result<Self, Self::Err> {
  type Err (line 1925) | type Err = &'static str;
  method from_str (line 1927) | fn from_str(s: &str) -> Result<Self, Self::Err> {
  type Err (line 1937) | type Err = &'static str;
  method from_str (line 1939) | fn from_str(s: &str) -> Result<Self, Self::Err> {
  function parse_size_change (line 2035) | fn parse_size_change() {
  function parse_position_change (line 2066) | fn parse_position_change() {

FILE: niri-ipc/src/socket.rs
  constant SOCKET_PATH_ENV (line 12) | pub const SOCKET_PATH_ENV: &str = "NIRI_SOCKET";
  type Socket (line 18) | pub struct Socket {
    method connect (line 27) | pub fn connect() -> io::Result<Self> {
    method connect_to (line 38) | pub fn connect_to(path: impl AsRef<Path>) -> io::Result<Self> {
    method send (line 51) | pub fn send(&mut self, request: Request) -> io::Result<Reply> {
    method read_events (line 89) | pub fn read_events(self) -> impl FnMut() -> io::Result<Event> {

FILE: niri-ipc/src/state.rs
  type EventStreamStatePart (line 15) | pub trait EventStreamStatePart {
    method replicate (line 17) | fn replicate(&self) -> Vec<Event>;
    method apply (line 23) | fn apply(&mut self, event: Event) -> Option<Event>;
    method replicate (line 97) | fn replicate(&self) -> Vec<Event> {
    method apply (line 108) | fn apply(&mut self, event: Event) -> Option<Event> {
    method replicate (line 120) | fn replicate(&self) -> Vec<Event> {
    method apply (line 125) | fn apply(&mut self, event: Event) -> Option<Event> {
    method replicate (line 168) | fn replicate(&self) -> Vec<Event> {
    method apply (line 173) | fn apply(&mut self, event: Event) -> Option<Event> {
    method replicate (line 241) | fn replicate(&self) -> Vec<Event> {
    method apply (line 249) | fn apply(&mut self, event: Event) -> Option<Event> {
    method replicate (line 266) | fn replicate(&self) -> Vec<Event> {
    method apply (line 272) | fn apply(&mut self, event: Event) -> Option<Event> {
    method replicate (line 284) | fn replicate(&self) -> Vec<Event> {
    method apply (line 290) | fn apply(&mut self, event: Event) -> Option<Event> {
    method replicate (line 302) | fn replicate(&self) -> Vec<Event> {
    method apply (line 307) | fn apply(&mut self, event: Event) -> Option<Event> {
  type EventStreamState (line 34) | pub struct EventStreamState {
  type WorkspacesState (line 56) | pub struct WorkspacesState {
  type WindowsState (line 63) | pub struct WindowsState {
  type KeyboardLayoutsState (line 70) | pub struct KeyboardLayoutsState {
  type OverviewState (line 77) | pub struct OverviewState {
  type ConfigState (line 84) | pub struct ConfigState {
  type CastsState (line 91) | pub struct CastsState {

FILE: niri-visual-tests/src/cases/gradient_angle.rs
  type GradientAngle (line 12) | pub struct GradientAngle {
    method new (line 18) | pub fn new(_args: Args) -> Self {
  method are_animations_ongoing (line 27) | fn are_animations_ongoing(&self) -> bool {
  method advance_animations (line 31) | fn advance_animations(&mut self, current_time: Duration) {
  method render (line 46) | fn render(

FILE: niri-visual-tests/src/cases/gradient_area.rs
  type GradientArea (line 13) | pub struct GradientArea {
    method new (line 20) | pub fn new(_args: Args) -> Self {
  method are_animations_ongoing (line 41) | fn are_animations_ongoing(&self) -> bool {
  method advance_animations (line 45) | fn advance_animations(&mut self, current_time: Duration) {
  method render (line 60) | fn render(

FILE: niri-visual-tests/src/cases/gradient_oklab.rs
  type GradientOklab (line 11) | pub struct GradientOklab {
    method new (line 16) | pub fn new(_args: Args) -> Self {
  method render (line 27) | fn render(

FILE: niri-visual-tests/src/cases/gradient_oklab_alpha.rs
  type GradientOklabAlpha (line 9) | pub struct GradientOklabAlpha {
    method new (line 14) | pub fn new(_args: Args) -> Self {
  method render (line 25) | fn render(

FILE: niri-visual-tests/src/cases/gradient_oklch_alpha.rs
  type GradientOklchAlpha (line 11) | pub struct GradientOklchAlpha {
    method new (line 16) | pub fn new(_args: Args) -> Self {
  method render (line 27) | fn render(

FILE: niri-visual-tests/src/cases/gradient_oklch_decreasing.rs
  type GradientOklchDecreasing (line 11) | pub struct GradientOklchDecreasing {
    method new (line 16) | pub fn new(_args: Args) -> Self {
  method render (line 27) | fn render(

FILE: niri-visual-tests/src/cases/gradient_oklch_increasing.rs
  type GradientOklchIncreasing (line 11) | pub struct GradientOklchIncreasing {
    method new (line 16) | pub fn new(_args: Args) -> Self {
  method render (line 27) | fn render(

FILE: niri-visual-tests/src/cases/gradient_oklch_longer.rs
  type GradientOklchLonger (line 11) | pub struct GradientOklchLonger {
    method new (line 16) | pub fn new(_args: Args) -> Self {
  method render (line 27) | fn render(

FILE: niri-visual-tests/src/cases/gradient_oklch_shorter.rs
  type GradientOklchShorter (line 11) | pub struct GradientOklchShorter {
    method new (line 16) | pub fn new(_args: Args) -> Self {
  method render (line 27) | fn render(

FILE: niri-visual-tests/src/cases/gradient_srgb.rs
  type GradientSrgb (line 11) | pub struct GradientSrgb {
    method new (line 16) | pub fn new(_args: Args) -> Self {
  method render (line 27) | fn render(

FILE: niri-visual-tests/src/cases/gradient_srgb_alpha.rs
  type GradientSrgbAlpha (line 9) | pub struct GradientSrgbAlpha {
    method new (line 14) | pub fn new(_args: Args) -> Self {
  method render (line 25) | fn render(

FILE: niri-visual-tests/src/cases/gradient_srgblinear.rs
  type GradientSrgbLinear (line 11) | pub struct GradientSrgbLinear {
    method new (line 16) | pub fn new(_args: Args) -> Self {
  method render (line 27) | fn render(

FILE: niri-visual-tests/src/cases/gradient_srgblinear_alpha.rs
  type GradientSrgbLinearAlpha (line 9) | pub struct GradientSrgbLinearAlpha {
    method new (line 14) | pub fn new(_args: Args) -> Self {
  method render (line 25) | fn render(

FILE: niri-visual-tests/src/cases/layout.rs
  type DynStepFn (line 17) | type DynStepFn = Box<dyn FnOnce(&mut Layout)>;
  type Layout (line 19) | pub struct Layout {
    method new (line 29) | pub fn new(args: Args) -> Self {
    method open_in_between (line 89) | pub fn open_in_between(args: Args) -> Self {
    method open_multiple_quickly (line 105) | pub fn open_multiple_quickly(args: Args) -> Self {
    method open_multiple_quickly_big (line 119) | pub fn open_multiple_quickly_big(args: Args) -> Self {
    method open_to_the_left (line 133) | pub fn open_to_the_left(args: Args) -> Self {
    method open_to_the_left_big (line 149) | pub fn open_to_the_left_big(args: Args) -> Self {
    method add_window (line 165) | fn add_window(&mut self, mut window: TestWindow, width: Option<PresetS...
    method add_window_right_of (line 189) | fn add_window_right_of(
    method add_step (line 218) | fn add_step(&mut self, delay_ms: u64, f: impl FnOnce(&mut Self) + 'sta...
  method resize (line 225) | fn resize(&mut self, width: i32, height: i32) {
  method are_animations_ongoing (line 240) | fn are_animations_ongoing(&self) -> bool {
  method advance_animations (line 244) | fn advance_animations(&mut self, _current_time: Duration) {
  method render (line 265) | fn render(

FILE: niri-visual-tests/src/cases/mod.rs
  type Args (line 25) | pub struct Args {
  type TestCase (line 30) | pub trait TestCase {
    method resize (line 31) | fn resize(&mut self, _width: i32, _height: i32) {}
    method are_animations_ongoing (line 32) | fn are_animations_ongoing(&self) -> bool {
    method advance_animations (line 35) | fn advance_animations(&mut self, _current_time: Duration) {}
    method render (line 36) | fn render(

FILE: niri-visual-tests/src/cases/tile.rs
  type Tile (line 14) | pub struct Tile {
    method freeform (line 20) | pub fn freeform(args: Args) -> Self {
    method fixed_size (line 25) | pub fn fixed_size(args: Args) -> Self {
    method fixed_size_with_csd_shadow (line 30) | pub fn fixed_size_with_csd_shadow(args: Args) -> Self {
    method freeform_open (line 36) | pub fn freeform_open(args: Args) -> Self {
    method fixed_size_open (line 43) | pub fn fixed_size_open(args: Args) -> Self {
    method fixed_size_with_csd_shadow_open (line 50) | pub fn fixed_size_with_csd_shadow_open(args: Args) -> Self {
    method with_window (line 57) | pub fn with_window(args: Args, window: TestWindow) -> Self {
  method resize (line 93) | fn resize(&mut self, width: i32, height: i32) {
  method are_animations_ongoing (line 101) | fn are_animations_ongoing(&self) -> bool {
  method advance_animations (line 105) | fn advance_animations(&mut self, _current_time: Duration) {
  method render (line 109) | fn render(

FILE: niri-visual-tests/src/cases/window.rs
  type Window (line 10) | pub struct Window {
    method freeform (line 15) | pub fn freeform(args: Args) -> Self {
    method fixed_size (line 22) | pub fn fixed_size(args: Args) -> Self {
    method fixed_size_with_csd_shadow (line 29) | pub fn fixed_size_with_csd_shadow(args: Args) -> Self {
  method resize (line 39) | fn resize(&mut self, width: i32, height: i32) {
  method render (line 45) | fn render(

FILE: niri-visual-tests/src/main.rs
  function main (line 35) | fn main() -> glib::ExitCode {
  function on_startup (line 50) | fn on_startup(_app: &adw::Application) {
  function build_ui (line 63) | fn build_ui(app: &adw::Application) {

FILE: niri-visual-tests/src/smithay_view.rs
  type DynMakeTestCase (line 27) | type DynMakeTestCase = Box<dyn Fn(Args) -> Box<dyn TestCase>>;
  type RendererData (line 29) | struct RendererData {
  type SmithayView (line 35) | pub struct SmithayView {
    method resize (line 116) | fn resize(&self, width: i32, height: i32) {
    method render (line 124) | fn render(&self, _gl_context: &gdk::GLContext) -> anyhow::Result<()> {
    method new (line 263) | pub fn new<T: TestCase + 'static>(
  constant NAME (line 46) | const NAME: &'static str = "NiriSmithayView";
  type Type (line 47) | type Type = super::SmithayView;
  type ParentType (line 48) | type ParentType = gtk::Widget;
  method class_init (line 50) | fn class_init(klass: &mut Self::Class) {
  method constructed (line 56) | fn constructed(&self) {
  method dispose (line 98) | fn dispose(&self) {
  method unmap (line 104) | fn unmap(&self) {
  method unrealize (line 109) | fn unrealize(&self) {
  function create_renderer (line 219) | unsafe fn create_renderer() -> anyhow::Result<RendererData> {

FILE: niri-visual-tests/src/test_window.rs
  type TestWindowInner (line 21) | struct TestWindowInner {
  type TestWindow (line 33) | pub struct TestWindow {
    method freeform (line 40) | pub fn freeform(id: usize) -> Self {
    method fixed_size (line 62) | pub fn fixed_size(id: usize) -> Self {
    method set_min_size (line 71) | pub fn set_min_size(&self, size: Size<i32, Logical>) {
    method set_max_size (line 75) | pub fn set_max_size(&self, size: Size<i32, Logical>) {
    method set_color (line 79) | pub fn set_color(&self, color: [f32; 4]) {
    method set_csd_shadow_width (line 83) | pub fn set_csd_shadow_width(&self, width: i32) {
    method communicate (line 87) | pub fn communicate(&self) -> bool {
  type Id (line 134) | type Id = usize;
  method id (line 136) | fn id(&self) -> &Self::Id {
  method size (line 140) | fn size(&self) -> Size<i32, Logical> {
  method buf_loc (line 144) | fn buf_loc(&self) -> Point<i32, Logical> {
  method is_in_input_region (line 148) | fn is_in_input_region(&self, _point: Point<f64, Logical>) -> bool {
  method render_normal (line 152) | fn render_normal<R: NiriRenderer>(
  method request_size (line 178) | fn request_size(
  method min_size (line 189) | fn min_size(&self) -> Size<i32, Logical> {
  method max_size (line 193) | fn max_size(&self) -> Size<i32, Logical> {
  method is_wl_surface (line 197) | fn is_wl_surface(&self, _wl_surface: &WlSurface) -> bool {
  method set_preferred_scale_transform (line 201) | fn set_preferred_scale_transform(&self, _scale: output::Scale, _transfor...
  method has_ssd (line 203) | fn has_ssd(&self) -> bool {
  method output_enter (line 207) | fn output_enter(&self, _output: &Output) {}
  method output_leave (line 209) | fn output_leave(&self, _output: &Output) {}
  method set_offscreen_data (line 211) | fn set_offscreen_data(&self, _data: Option<OffscreenData>) {}
  method set_activated (line 213) | fn set_activated(&mut self, _active: bool) {}
  method set_active_in_column (line 215) | fn set_active_in_column(&mut self, _active: bool) {}
  method set_floating (line 217) | fn set_floating(&mut self, _floating: bool) {}
  method set_bounds (line 219) | fn set_bounds(&self, _bounds: Size<i32, Logical>) {}
  method is_ignoring_opacity_window_rule (line 221) | fn is_ignoring_opacity_window_rule(&self) -> bool {
  method configure_intent (line 225) | fn configure_intent(&self) -> ConfigureIntent {
  method send_pending_configure (line 229) | fn send_pending_configure(&mut self) {}
  method pending_sizing_mode (line 231) | fn pending_sizing_mode(&self) -> SizingMode {
  method sizing_mode (line 235) | fn sizing_mode(&self) -> SizingMode {
  method requested_size (line 239) | fn requested_size(&self) -> Option<Size<i32, Logical>> {
  method is_child_of (line 243) | fn is_child_of(&self, _parent: &Self) -> bool {
  method refresh (line 247) | fn refresh(&self) {}
  method rules (line 249) | fn rules(&self) -> &ResolvedWindowRules {
  method take_animation_snapshot (line 253) | fn take_animation_snapshot(&mut self) -> Option<LayoutElementRenderSnaps...
  method set_interactive_resize (line 257) | fn set_interactive_resize(&mut self, _data: Option<InteractiveResizeData...
  method cancel_interactive_resize (line 259) | fn cancel_interactive_resize(&mut self) {}
  method on_commit (line 261) | fn on_commit(&mut self, _serial: Serial) {}
  method interactive_resize_data (line 263) | fn interactive_resize_data(&self) -> Option<InteractiveResizeData> {
  method is_urgent (line 267) | fn is_urgent(&self) -> bool {

FILE: src/a11y.rs
  constant ID_ROOT (line 17) | const ID_ROOT: NodeId = NodeId(0);
  constant ID_ANNOUNCEMENT (line 18) | const ID_ANNOUNCEMENT: NodeId = NodeId(1);
  constant ID_SCREENSHOT_UI (line 19) | const ID_SCREENSHOT_UI: NodeId = NodeId(2);
  constant ID_EXIT_CONFIRM_DIALOG (line 20) | const ID_EXIT_CONFIRM_DIALOG: NodeId = NodeId(3);
  constant ID_OVERVIEW (line 21) | const ID_OVERVIEW: NodeId = NodeId(4);
  constant ID_MRU (line 22) | const ID_MRU: NodeId = NodeId(5);
  type A11y (line 24) | pub struct A11y {
    method new (line 42) | pub fn new(event_loop: LoopHandle<'static, State>) -> Self {
    method start (line 55) | pub fn start(&mut self) {
    method update_tree (line 90) | fn update_tree(&mut self, tree: TreeUpdate) {
  type Msg (line 35) | enum Msg {
  method refresh_a11y (line 112) | pub fn refresh_a11y(&mut self) {
  method a11y_announce (line 230) | pub fn a11y_announce(&mut self, mut announcement: String) {
  method a11y_announce_config_error (line 257) | pub fn a11y_announce_config_error(&mut self) {
  method a11y_announce_hotkey_overlay (line 265) | pub fn a11y_announce_hotkey_overlay(&mut self) {
  method a11y_focus (line 273) | fn a11y_focus(&self) -> NodeId {
  method on_a11y_msg (line 283) | fn on_a11y_msg(&mut self, msg: Msg) {
  method a11y_build_full_tree (line 299) | fn a11y_build_full_tree(&self) -> TreeUpdate {
  type Handler (line 351) | struct Handler {
  method request_initial_tree (line 356) | fn request_initial_tree(&mut self) -> Option<TreeUpdate> {
  method deactivate_accessibility (line 363) | fn deactivate_accessibility(&mut self) {
  method do_action (line 369) | fn do_action(&mut self, request: ActionRequest) {

FILE: src/animation/bezier.rs
  type CubicBezier (line 4) | pub struct CubicBezier {
    method new (line 12) | pub fn new(x1: f64, y1: f64, x2: f64, y2: f64) -> Self {
    method x_for_t (line 19) | fn x_for_t(&self, t: f64) -> f64 {
    method y_for_t (line 24) | fn y_for_t(&self, t: f64) -> f64 {
    method t_for_x (line 29) | fn t_for_x(&self, x: f64) -> f64 {
  method y (line 49) | fn y(&self, x: f64) -> f64 {

FILE: src/animation/clock.rs
  type Clock (line 12) | pub struct Clock {
    method with_time (line 33) | pub fn with_time(time: Duration) -> Self {
    method now (line 41) | pub fn now(&self) -> Duration {
    method now_unadjusted (line 46) | pub fn now_unadjusted(&self) -> Duration {
    method set_unadjusted (line 51) | pub fn set_unadjusted(&mut self, time: Duration) {
    method clear (line 56) | pub fn clear(&mut self) {
    method rate (line 61) | pub fn rate(&self) -> f64 {
    method set_rate (line 66) | pub fn set_rate(&mut self, rate: f64) {
    method should_complete_instantly (line 71) | pub fn should_complete_instantly(&self) -> bool {
    method set_complete_instantly (line 76) | pub fn set_complete_instantly(&mut self, value: bool) {
  type LazyClock (line 17) | struct LazyClock {
    method with_time (line 90) | pub fn with_time(time: Duration) -> Self {
    method clear (line 94) | pub fn clear(&mut self) {
    method set (line 98) | pub fn set(&mut self, time: Duration) {
    method now (line 102) | pub fn now(&mut self) -> Duration {
  type AdjustableClock (line 23) | struct AdjustableClock {
    method new (line 108) | pub fn new(mut inner: LazyClock) -> Self {
    method rate (line 119) | pub fn rate(&self) -> f64 {
    method set_rate (line 123) | pub fn set_rate(&mut self, rate: f64) {
    method should_complete_instantly (line 127) | pub fn should_complete_instantly(&self) -> bool {
    method set_complete_instantly (line 131) | pub fn set_complete_instantly(&mut self, value: bool) {
    method now (line 135) | pub fn now(&mut self) -> Duration {
  method eq (line 82) | fn eq(&self, other: &Self) -> bool {
  method default (line 158) | fn default() -> Self {
  function frozen_clock (line 168) | fn frozen_clock() {
  function rate_change (line 180) | fn rate_change() {

FILE: src/animation/mod.rs
  type Animation (line 16) | pub struct Animation {
    method new (line 53) | pub fn new(
    method replace_config (line 73) | pub fn replace_config(&mut self, config: niri_config::Animation) {
    method restarted (line 111) | pub fn restarted(&self, from: f64, to: f64, initial_velocity: f64) -> ...
    method ease (line 153) | pub fn ease(
    method spring (line 178) | pub fn spring(clock: Clock, spring: Spring) -> Self {
    method decelerate (line 198) | pub fn decelerate(
    method is_done (line 233) | pub fn is_done(&self) -> bool {
    method is_clamped_done (line 241) | pub fn is_clamped_done(&self) -> bool {
    method value_at (line 249) | pub fn value_at(&self, at: Duration) -> f64 {
    method value (line 296) | pub fn value(&self) -> f64 {
    method clamped_value (line 303) | pub fn clamped_value(&self) -> f64 {
    method to (line 311) | pub fn to(&self) -> f64 {
    method from (line 315) | pub fn from(&self) -> f64 {
    method start_time (line 319) | pub fn start_time(&self) -> Duration {
    method end_time (line 323) | pub fn end_time(&self) -> Duration {
    method duration (line 327) | pub fn duration(&self) -> Duration {
    method offset (line 331) | pub fn offset(&mut self, offset: f64) {
  type Kind (line 32) | enum Kind {
  type Curve (line 44) | pub enum Curve {
    method y (line 343) | pub fn y(self, x: f64) -> f64 {
    method from (line 355) | fn from(value: niri_config::animations::Curve) -> Self {

FILE: src/animation/spring.rs
  type SpringParams (line 4) | pub struct SpringParams {
    method new (line 20) | pub fn new(damping_ratio: f64, stiffness: f64, epsilon: f64) -> Self {
  type Spring (line 12) | pub struct Spring {
    method value_at (line 39) | pub fn value_at(&self, t: Duration) -> f64 {
    method duration (line 48) | pub fn duration(&self) -> Duration {
    method clamped_duration (line 110) | pub fn clamped_duration(&self) -> Option<Duration> {
    method oscillate (line 141) | fn oscillate(&self, t: f64) -> f64 {
  function overdamped_spring_equal_from_to_nan (line 185) | fn overdamped_spring_equal_from_to_nan() {
  function overdamped_spring_duration_panic (line 198) | fn overdamped_spring_duration_panic() {

FILE: src/backend/headless.rs
  type Headless (line 26) | pub struct Headless {
    method new (line 32) | pub fn new() -> Self {
    method init (line 39) | pub fn init(&mut self, _niri: &mut Niri) {}
    method add_renderer (line 41) | pub fn add_renderer(&mut self) -> anyhow::Result<()> {
    method add_output (line 61) | pub fn add_output(&mut self, niri: &mut Niri, n: u8, size: (u16, u16)) {
    method seat_name (line 118) | pub fn seat_name(&self) -> String {
    method with_primary_renderer (line 122) | pub fn with_primary_renderer<T>(
    method render (line 129) | pub fn render(&mut self, niri: &mut Niri, output: &Output) -> RenderRe...
    method import_dmabuf (line 155) | pub fn import_dmabuf(&mut self, _dmabuf: &Dmabuf) -> bool {
    method ipc_outputs (line 159) | pub fn ipc_outputs(&self) -> Arc<Mutex<IpcOutputMap>> {
  method default (line 165) | fn default() -> Self {

FILE: src/backend/mod.rs
  type Backend (line 24) | pub enum Backend {
    method init (line 58) | pub fn init(&mut self, niri: &mut Niri) {
    method seat_name (line 67) | pub fn seat_name(&self) -> String {
    method with_primary_renderer (line 75) | pub fn with_primary_renderer<T>(
    method render (line 86) | pub fn render(
    method mod_key (line 99) | pub fn mod_key(&self, config: &Config) -> ModKey {
    method change_vt (line 112) | pub fn change_vt(&mut self, vt: i32) {
    method suspend (line 120) | pub fn suspend(&mut self) {
    method toggle_debug_tint (line 128) | pub fn toggle_debug_tint(&mut self) {
    method import_dmabuf (line 136) | pub fn import_dmabuf(&mut self, dmabuf: &Dmabuf) -> bool {
    method early_import (line 144) | pub fn early_import(&mut self, surface: &WlSurface) {
    method ipc_outputs (line 152) | pub fn ipc_outputs(&self) -> Arc<Mutex<IpcOutputMap>> {
    method gbm_device (line 161) | pub fn gbm_device(
    method set_monitors_active (line 172) | pub fn set_monitors_active(&mut self, active: bool) {
    method set_output_on_demand_vrr (line 180) | pub fn set_output_on_demand_vrr(&mut self, niri: &mut Niri, output: &O...
    method update_ignored_nodes_config (line 188) | pub fn update_ignored_nodes_config(&mut self, niri: &mut Niri) {
    method on_output_config_changed (line 196) | pub fn on_output_config_changed(&mut self, niri: &mut Niri) {
    method tty_checked (line 204) | pub fn tty_checked(&mut self) -> Option<&mut Tty> {
    method tty (line 212) | pub fn tty(&mut self) -> &mut Tty {
    method winit (line 220) | pub fn winit(&mut self) -> &mut Winit {
    method headless (line 228) | pub fn headless(&mut self) -> &mut Headless {
  type RenderResult (line 31) | pub enum RenderResult {
  type IpcOutputMap (line 40) | pub type IpcOutputMap = HashMap<OutputId, niri_ipc::Output>;
  type OutputId (line 45) | pub struct OutputId(u64);
    method next (line 48) | fn next() -> OutputId {
    method get (line 52) | pub fn get(self) -> u64 {

FILE: src/backend/tty.rs
  constant SUPPORTED_COLOR_FORMATS (line 73) | const SUPPORTED_COLOR_FORMATS: [Fourcc; 4] = [
  type Tty (line 80) | pub struct Tty {
    method new (line 414) | pub fn new(
    method init (line 513) | pub fn init(&mut self, niri: &mut Niri) {
    method on_udev_event (line 543) | fn on_udev_event(&mut self, niri: &mut Niri, event: UdevEvent) {
    method on_session_event (line 576) | fn on_session_event(&mut self, niri: &mut Niri, event: SessionEvent) {
    method device_added (line 722) | fn device_added(
    method device_changed (line 916) | fn device_changed(&mut self, device_id: dev_t, niri: &mut Niri, cleanu...
    method device_removed (line 1106) | fn device_removed(&mut self, device_id: dev_t, niri: &mut Niri) {
    method connector_connected (line 1213) | fn connector_connected(
    method connector_disconnected (line 1543) | fn connector_disconnected(&mut self, niri: &mut Niri, node: DrmNode, c...
    method on_vblank (line 1590) | fn on_vblank(
    method on_estimated_vblank_timer (line 1778) | fn on_estimated_vblank_timer(&self, niri: &mut Niri, output: Output) {
    method seat_name (line 1811) | pub fn seat_name(&self) -> String {
    method with_primary_renderer (line 1815) | pub fn with_primary_renderer<T>(
    method render (line 1826) | pub fn render(
    method change_vt (line 1985) | pub fn change_vt(&mut self, vt: i32) {
    method suspend (line 1991) | pub fn suspend(&self) {
    method toggle_debug_tint (line 1998) | pub fn toggle_debug_tint(&mut self) {
    method import_dmabuf (line 2012) | pub fn import_dmabuf(&mut self, dmabuf: &Dmabuf) -> bool {
    method early_import (line 2033) | pub fn early_import(&mut self, surface: &WlSurface) {
    method get_gamma_size (line 2043) | pub fn get_gamma_size(&self, output: &Output) -> anyhow::Result<u32> {
    method set_gamma (line 2064) | pub fn set_gamma(&mut self, output: &Output, ramp: Option<Vec<u16>>) -...
    method refresh_ipc_outputs (line 2088) | fn refresh_ipc_outputs(&self, niri: &mut Niri) {
    method ipc_outputs (line 2199) | pub fn ipc_outputs(&self) -> Arc<Mutex<IpcOutputMap>> {
    method primary_gbm_device (line 2204) | pub fn primary_gbm_device(&self) -> Option<GbmDevice<DrmDeviceFd>> {
    method set_monitors_active (line 2216) | pub fn set_monitors_active(&mut self, active: bool) {
    method set_output_on_demand_vrr (line 2235) | pub fn set_output_on_demand_vrr(&mut self, niri: &mut Niri, output: &O...
    method update_ignored_nodes_config (line 2265) | pub fn update_ignored_nodes_config(&mut self, niri: &mut Niri) {
    method should_disable_laptop_panels (line 2318) | fn should_disable_laptop_panels(&self, is_lid_closed: bool) -> bool {
    method on_output_config_changed (line 2338) | pub fn on_output_config_changed(&mut self, niri: &mut Niri) {
    method get_device_from_node (line 2530) | pub fn get_device_from_node(&mut self, node: DrmNode) -> Option<&mut O...
    method disconnected_connector_name_by_name_match (line 2534) | pub fn disconnected_connector_name_by_name_match(&self, target: &str) ...
  type TtyRenderer (line 108) | pub type TtyRenderer<'render> = MultiRenderer<
  type TtyFrame (line 115) | pub type TtyFrame<'render, 'frame, 'buffer> = MultiFrame<
  type TtyRendererError (line 124) | pub type TtyRendererError<'render> = <TtyRenderer<'render> as RendererSu...
  type GbmDrmCompositor (line 126) | type GbmDrmCompositor = DrmCompositor<
  type OutputDevice (line 133) | pub struct OutputDevice {
    method lease_request (line 160) | pub fn lease_request(
    method new_lease (line 191) | pub fn new_lease(&mut self, lease: DrmLease) {
    method remove_lease (line 195) | pub fn remove_lease(&mut self, lease_id: u32) {
    method known_crtc_name (line 199) | pub fn known_crtc_name(
    method cleanup_mismatching_resources (line 228) | fn cleanup_mismatching_resources(
  type CrtcInfo (line 154) | pub struct CrtcInfo {
  type TtyOutputState (line 371) | struct TtyOutputState {
  type Surface (line 376) | struct Surface {
  type SurfaceDmabufFeedback (line 395) | pub struct SurfaceDmabufFeedback {
  type GammaProps (line 400) | struct GammaProps {
    method new (line 2564) | fn new(device: &DrmDevice, crtc: crtc::Handle) -> anyhow::Result<Self> {
    method gamma_size (line 2610) | fn gamma_size(&self, device: &DrmDevice) -> anyhow::Result<u32> {
    method set_gamma (line 2616) | fn set_gamma(&mut self, device: &DrmDevice, gamma: Option<&[u16]>) -> ...
    method restore_gamma (line 2685) | fn restore_gamma(&self, device: &DrmDevice) -> anyhow::Result<()> {
  type ConnectorProperties (line 407) | struct ConnectorProperties<'a> {
  function primary_node_from_render_node (line 2701) | fn primary_node_from_render_node(path: &Path) -> Option<(DrmNode, DrmNod...
  function primary_node_from_config (line 2736) | fn primary_node_from_config(config: &Config) -> Option<(DrmNode, DrmNode...
  function ignored_nodes_from_config (line 2743) | fn ignored_nodes_from_config(config: &Config) -> HashSet<DrmNode> {
  function surface_dmabuf_feedback (line 2756) | fn surface_dmabuf_feedback(
  function find_drm_property (line 2830) | fn find_drm_property(
  function get_drm_property (line 2851) | fn get_drm_property(
  function refresh_interval (line 2869) | fn refresh_interval(mode: DrmMode) -> Duration {
  function suspend (line 2894) | fn suspend() -> anyhow::Result<()> {
  function queue_estimated_vblank_timer (line 2909) | fn queue_estimated_vblank_timer(
  function calculate_drm_mode_from_modeline (line 2955) | pub fn calculate_drm_mode_from_modeline(modeline: &Modeline) -> anyhow::...
  function calculate_mode_cvt (line 3039) | pub fn calculate_mode_cvt(width: u16, height: u16, refresh: f64) -> DrmM...
  function modeinfo_name_slice_from_string (line 3104) | fn modeinfo_name_slice_from_string(mode_name: &str) -> [core::ffi::c_cha...
  function pick_mode (line 3115) | fn pick_mode(
  function get_edid_info (line 3192) | fn get_edid_info(
  function try_new (line 3210) | fn try_new(device: &'a DrmDevice, connector: connector::Handle) -> anyho...
  function find (line 3232) | fn find(&self, name: &std::ffi::CStr) -> anyhow::Result<&(property::Info...
  constant DRM_MODE_COLORIMETRY_DEFAULT (line 3243) | const DRM_MODE_COLORIMETRY_DEFAULT: u64 = 0;
  function reset_hdr (line 3245) | fn reset_hdr(props: &ConnectorProperties) -> anyhow::Result<()> {
  function is_vrr_capable (line 3272) | fn is_vrr_capable(device: &DrmDevice, connector: connector::Handle) -> O...
  function get_panel_orientation (line 3277) | fn get_panel_orientation(props: &ConnectorProperties) -> anyhow::Result<...
  function set_gamma_for_crtc (line 3295) | pub fn set_gamma_for_crtc(
  function format_connector_name (line 3340) | fn format_connector_name(connector: &connector::Info) -> String {
  function make_output_name (line 3348) | fn make_output_name(
  function init_libinput_plugin_system (line 3370) | unsafe fn init_libinput_plugin_system(libinput: &Libinput) {
  function test_calculate_drmmode_from_modeline (line 3417) | fn test_calculate_drmmode_from_modeline() {
  function test_calc_cvt (line 3499) | fn test_calc_cvt() {

FILE: src/backend/winit.rs
  type Winit (line 27) | pub struct Winit {
    method new (line 36) | pub fn new(
    method init (line 144) | pub fn init(&mut self, niri: &mut Niri) {
    method seat_name (line 170) | pub fn seat_name(&self) -> String {
    method with_primary_renderer (line 174) | pub fn with_primary_renderer<T>(
    method render (line 181) | pub fn render(&mut self, niri: &mut Niri, output: &Output) -> RenderRe...
    method toggle_debug_tint (line 261) | pub fn toggle_debug_tint(&mut self) {
    method import_dmabuf (line 266) | pub fn import_dmabuf(&mut self, dmabuf: &Dmabuf) -> bool {
    method ipc_outputs (line 276) | pub fn ipc_outputs(&self) -> Arc<Mutex<IpcOutputMap>> {

FILE: src/cli.rs
  type Cli (line 15) | pub struct Cli {
  type Sub (line 38) | pub enum Sub {
  type Msg (line 63) | pub enum Msg {
  type CompletionShell (line 115) | pub enum CompletionShell {
  type Error (line 125) | type Error = &'static str;
  method try_from (line 127) | fn try_from(shell: CompletionShell) -> Result<Self, Self::Error> {

FILE: src/cursor.rs
  type XCursorCache (line 21) | type XCursorCache = HashMap<(CursorIcon, i32), Option<Rc<XCursor>>>;
  type CursorManager (line 23) | pub struct CursorManager {
    method new (line 31) | pub fn new(theme: &str, size: u8) -> Self {
    method reload (line 45) | pub fn reload(&mut self, theme: &str, size: u8) {
    method check_cursor_image_surface_alive (line 53) | pub fn check_cursor_image_surface_alive(&mut self) {
    method get_render_cursor (line 62) | pub fn get_render_cursor(&self, scale: i32) -> RenderCursor {
    method get_render_cursor_named (line 82) | fn get_render_cursor_named(&self, icon: CursorIcon, scale: i32) -> Ren...
    method is_current_cursor_animated (line 96) | pub fn is_current_cursor_animated(&self, scale: i32) -> bool {
    method get_cursor_with_name (line 108) | pub fn get_cursor_with_name(&self, icon: CursorIcon, scale: i32) -> Op...
    method get_default_cursor (line 141) | pub fn get_default_cursor(&self, scale: i32) -> Rc<XCursor> {
    method cursor_image (line 148) | pub fn cursor_image(&self) -> &CursorImageStatus {
    method set_cursor_image (line 153) | pub fn set_cursor_image(&mut self, cursor: CursorImageStatus) {
    method load_xcursor (line 159) | fn load_xcursor(theme: &CursorTheme, name: &str, size: i32) -> anyhow:...
    method ensure_env (line 190) | fn ensure_env(theme: &str, size: u8) {
    method fallback_cursor (line 195) | fn fallback_cursor() -> XCursor {
  type RenderCursor (line 215) | pub enum RenderCursor {
  type TextureCache (line 228) | type TextureCache = HashMap<(CursorIcon, i32), Vec<MemoryRenderBuffer>>;
  type CursorTextureCache (line 231) | pub struct CursorTextureCache {
    method clear (line 236) | pub fn clear(&mut self) {
    method get (line 240) | pub fn get(
  type XCursor (line 273) | pub struct XCursor {
    method frame (line 285) | pub fn frame(&self, mut millis: u32) -> (usize, &Image) {
    method frames (line 305) | pub fn frames(&self) -> &[Image] {
    method is_animated_cursor (line 310) | pub fn is_animated_cursor(&self) -> bool {
    method hotspot (line 315) | pub fn hotspot(image: &Image) -> Point<i32, Physical> {

FILE: src/dbus/freedesktop_a11y.rs
  type Data (line 25) | struct Data {
    method rebuild_grabbed_mods (line 318) | fn rebuild_grabbed_mods(&mut self) {
  type Client (line 34) | struct Client {
    method should_grab_keypress (line 327) | fn should_grab_keypress(
    method should_watch_keypress (line 355) | fn should_watch_keypress(
  type KeyboardMonitor (line 42) | pub struct KeyboardMonitor {
    method grab_keyboard (line 71) | async fn grab_keyboard(&self, #[zbus(header)] hdr: Header<'_>) -> fdo:...
    method ungrab_keyboard (line 91) | async fn ungrab_keyboard(&self, #[zbus(header)] hdr: Header<'_>) -> fd...
    method watch_keyboard (line 112) | async fn watch_keyboard(&self, #[zbus(header)] hdr: Header<'_>) -> fdo...
    method unwatch_keyboard (line 131) | async fn unwatch_keyboard(&self, #[zbus(header)] hdr: Header<'_>) -> f...
    method set_key_grabs (line 165) | async fn set_key_grabs(
    method key_event (line 196) | pub async fn key_event(
    method new (line 208) | pub fn new() -> Self {
    method process_key (line 216) | pub fn process_key(
  type KbMonBlock (line 49) | pub enum KbMonBlock {
  function monitor_disappeared_clients (line 369) | async fn monitor_disappeared_clients(
  method start (line 407) | fn start(self) -> anyhow::Result<zbus::blocking::Connection> {
  method a11y_process_key (line 450) | pub fn a11y_process_key(

FILE: src/dbus/freedesktop_locale1.rs
  type Locale1ToNiri (line 6) | pub enum Locale1ToNiri {
  function start (line 10) | pub fn start(

FILE: src/dbus/freedesktop_login1.rs
  type Login1ToNiri (line 5) | pub enum Login1ToNiri {
  function start (line 9) | pub fn start(

FILE: src/dbus/freedesktop_screensaver.rs
  type ScreenSaver (line 17) | pub struct ScreenSaver {
    method inhibit (line 27) | async fn inhibit(
    method un_inhibit (line 64) | async fn un_inhibit(&mut self, cookie: u32) -> fdo::Result<()> {
    method new (line 82) | pub fn new(is_inhibited: Arc<AtomicBool>) -> Self {
  function monitor_disappeared_clients (line 94) | async fn monitor_disappeared_clients(
  method start (line 132) | fn start(self) -> anyhow::Result<zbus::blocking::Connection> {

FILE: src/dbus/gnome_shell_introspect.rs
  type Introspect (line 10) | pub struct Introspect {
    method get_windows (line 39) | async fn get_windows(&self) -> fdo::Result<HashMap<u64, WindowProperti...
    method windows_changed (line 57) | pub async fn windows_changed(ctxt: &SignalEmitter<'_>) -> zbus::Result...
    method new (line 61) | pub fn new(
  type IntrospectToNiri (line 15) | pub enum IntrospectToNiri {
  type NiriToIntrospect (line 19) | pub enum NiriToIntrospect {
  type WindowProperties (line 25) | pub struct WindowProperties {
  method start (line 70) | fn start(self) -> anyhow::Result<zbus::blocking::Connection> {

FILE: src/dbus/gnome_shell_screenshot.rs
  type Screenshot (line 11) | pub struct Screenshot {
    method screenshot (line 27) | async fn screenshot(
    method pick_color (line 55) | async fn pick_color(&self) -> fdo::Result<HashMap<String, OwnedValue>> {
    method new (line 85) | pub fn new(
  type ScreenshotToNiri (line 16) | pub enum ScreenshotToNiri {
  type NiriToScreenshot (line 21) | pub enum NiriToScreenshot {
  method start (line 94) | fn start(self) -> anyhow::Result<zbus::blocking::Connection> {

FILE: src/dbus/mod.rs
  type Start (line 26) | trait Start: Interface {
    method start (line 27) | fn start(self) -> anyhow::Result<zbus::blocking::Connection>;
  type DBusServers (line 31) | pub struct DBusServers {
    method start (line 45) | pub fn start(state: &mut State, is_session_instance: bool) {
  function try_start (line 177) | fn try_start<I: Start>(iface: I) -> Option<Connection> {

FILE: src/dbus/mutter_display_config.rs
  type DisplayConfig (line 17) | pub struct DisplayConfig {
    method get_current_state (line 64) | async fn get_current_state(
    method apply_monitors_config (line 174) | async fn apply_monitors_config(
    method monitors_changed (line 256) | pub async fn monitors_changed(ctxt: &SignalEmitter<'_>) -> zbus::Resul...
    method power_save_mode (line 259) | fn power_save_mode(&self) -> i32 {
    method set_power_save_mode (line 264) | fn set_power_save_mode(&self, _mode: i32) -> zbus::Result<()> {
    method panel_orientation_managed (line 269) | fn panel_orientation_managed(&self) -> bool {
    method apply_monitors_config_allowed (line 274) | fn apply_monitors_config_allowed(&self) -> bool {
    method night_light_supported (line 279) | fn night_light_supported(&self) -> bool {
    method new (line 285) | pub fn new(
  type Monitor (line 23) | pub struct Monitor {
  type Mode (line 30) | pub struct Mode {
  type LogicalMonitor (line 41) | pub struct LogicalMonitor {
  type LogicalMonitorConfiguration (line 53) | pub struct LogicalMonitorConfiguration {
  method start (line 297) | fn start(self) -> anyhow::Result<zbus::blocking::Connection> {
  function make_display_name (line 312) | fn make_display_name(output: &niri_ipc::Output, is_laptop_panel: bool) -...
  function format_diagonal (line 331) | fn format_diagonal(diagonal_inches: f64) -> String {
  function test_format_diagonal (line 347) | fn test_format_diagonal() {

FILE: src/dbus/mutter_screen_cast.rs
  type ScreenCast (line 17) | pub struct ScreenCast {
    method create_session (line 109) | async fn create_session(
    method version (line 142) | async fn version(&self) -> i32 {
    method new (line 309) | pub fn new(
  type Session (line 25) | pub struct Session {
    method start (line 149) | async fn start(&self) {
    method stop (line 157) | pub async fn stop(
    method record_monitor (line 188) | async fn record_monitor(
    method record_window (line 238) | async fn record_window(
    method closed (line 278) | async fn closed(ctxt: &SignalEmitter<'_>) -> zbus::Result<()>;
    method new (line 337) | pub fn new(
  type CursorMode (line 35) | pub enum CursorMode {
  type RecordMonitorProperties (line 44) | struct RecordMonitorProperties {
  type RecordWindowProperties (line 53) | struct RecordWindowProperties {
  type Stream (line 63) | pub struct Stream {
    method pipe_wire_stream_added (line 284) | pub async fn pipe_wire_stream_added(ctxt: &SignalEmitter<'_>, node_id:...
    method parameters (line 288) | async fn parameters(&self) -> StreamParameters {
    method new (line 361) | fn new(
    method start (line 378) | fn start(&self, ctxt: SignalEmitter<'static>) {
  type StreamTarget (line 73) | enum StreamTarget {
    method make_id (line 398) | fn make_id(&self) -> StreamTargetId {
  type StreamTargetId (line 80) | pub enum StreamTargetId {
  type StreamParameters (line 87) | struct StreamParameters {
  type ScreenCastToNiri (line 94) | pub enum ScreenCastToNiri {
  method start (line 322) | fn start(self) -> anyhow::Result<zbus::blocking::Connection> {
  method drop (line 353) | fn drop(&mut self) {

FILE: src/dbus/mutter_service_channel.rs
  type ServiceChannel (line 8) | pub struct ServiceChannel {
    method open_wayland_service_connection (line 14) | async fn open_wayland_service_connection(
    method new (line 41) | pub fn new(to_niri: calloop::channel::Sender<NewClient>) -> Self {
  method start (line 47) | fn start(self) -> anyhow::Result<zbus::blocking::Connection> {

FILE: src/frame_clock.rs
  type FrameClock (line 7) | pub struct FrameClock {
    method new (line 14) | pub fn new(refresh_interval: Option<Duration>, vrr: bool) -> Self {
    method refresh_interval (line 29) | pub fn refresh_interval(&self) -> Option<Duration> {
    method set_vrr (line 34) | pub fn set_vrr(&mut self, vrr: bool) {
    method vrr (line 43) | pub fn vrr(&self) -> bool {
    method presented (line 47) | pub fn presented(&mut self, presentation_time: Duration) {
    method next_presentation_time (line 56) | pub fn next_presentation_time(&self) -> Duration {

FILE: src/handlers/compositor.rs
  method compositor_state (line 30) | fn compositor_state(&mut self) -> &mut CompositorState {
  method client_compositor_state (line 34) | fn client_compositor_state<'a>(&self, client: &'a Client) -> &'a Composi...
  method new_subsurface (line 38) | fn new_subsurface(&mut self, surface: &WlSurface, parent: &WlSurface) {
  method new_surface (line 53) | fn new_surface(&mut self, surface: &WlSurface) {
  method commit (line 57) | fn commit(&mut self, surface: &WlSurface) {
  method destroyed (line 478) | fn destroyed(&mut self, surface: &WlSurface) {
  method buffer_destroyed (line 515) | fn buffer_destroyed(&mut self, _buffer: &wl_buffer::WlBuffer) {}
  method shm_state (line 519) | fn shm_state(&self) -> &ShmState {
  method add_default_dmabuf_pre_commit_hook (line 528) | pub fn add_default_dmabuf_pre_commit_hook(&mut self, surface: &WlSurface) {
  method remove_default_dmabuf_pre_commit_hook (line 577) | pub fn remove_default_dmabuf_pre_commit_hook(&mut self, surface: &WlSurf...

FILE: src/handlers/layer_shell.rs
  method shell_state (line 18) | fn shell_state(&mut self) -> &mut WlrLayerShellState {
  method new_layer_surface (line 22) | fn new_layer_surface(
  method layer_destroyed (line 49) | fn layer_destroyed(&mut self, surface: WlrLayerSurface) {
  method new_popup (line 73) | fn new_popup(&mut self, _parent: WlrLayerSurface, popup: PopupSurface) {
  method layer_shell_handle_commit (line 80) | pub fn layer_shell_handle_commit(&mut self, surface: &WlSurface) -> bool {

FILE: src/handlers/mod.rs
  constant XDG_ACTIVATION_TOKEN_TIMEOUT (line 98) | pub const XDG_ACTIVATION_TOKEN_TIMEOUT: Duration = Duration::from_secs(10);
  type KeyboardFocus (line 101) | type KeyboardFocus = WlSurface;
  type PointerFocus (line 102) | type PointerFocus = WlSurface;
  type TouchFocus (line 103) | type TouchFocus = WlSurface;
  method seat_state (line 105) | fn seat_state(&mut self) -> &mut SeatState<State> {
  method cursor_image (line 109) | fn cursor_image(&mut self, _seat: &Seat<Self>, mut image: CursorImageSta...
  method focus_changed (line 120) | fn focus_changed(&mut self, seat: &Seat<Self>, focused: Option<&WlSurfac...
  method led_state_changed (line 127) | fn led_state_changed(&mut self, _seat: &Seat<Self>, led_state: keyboard:...
  method tablet_tool_image (line 147) | fn tablet_tool_image(&mut self, _tool: &TabletToolDescriptor, image: Cur...
  method new_constraint (line 157) | fn new_constraint(&mut self, _surface: &WlSurface, _pointer: &PointerHan...
  method cursor_position_hint (line 165) | fn cursor_position_hint(
  method new_popup (line 222) | fn new_popup(&mut self, surface: PopupSurface) {
  method popup_repositioned (line 240) | fn popup_repositioned(&mut self, surface: PopupSurface) {
  method dismiss_popup (line 245) | fn dismiss_popup(&mut self, surface: PopupSurface) {
  method parent_geometry (line 251) | fn parent_geometry(&self, parent: &WlSurface) -> Rectangle<i32, Logical> {
  method keyboard_shortcuts_inhibit_state (line 261) | fn keyboard_shortcuts_inhibit_state(&mut self) -> &mut KeyboardShortcuts...
  method new_inhibitor (line 265) | fn new_inhibitor(&mut self, inhibitor: KeyboardShortcutsInhibitor) {
  method inhibitor_destroyed (line 273) | fn inhibitor_destroyed(&mut self, inhibitor: KeyboardShortcutsInhibitor) {
  type SelectionUserData (line 285) | type SelectionUserData = Arc<[u8]>;
  method send_selection (line 287) | fn send_selection(
  method data_device_state (line 311) | fn data_device_state(&mut self) -> &mut DataDeviceState {
  method dnd_requested (line 317) | fn dnd_requested<S: dnd::Source>(
  method dropped (line 352) | fn dropped(
  method primary_selection_state (line 395) | fn primary_selection_state(&mut self) -> &mut PrimarySelectionState {
  method data_control_state (line 402) | fn data_control_state(&mut self) -> &mut WlrDataControlState {
  method data_control_state (line 410) | fn data_control_state(&mut self) -> &mut ExtDataControlState {
  method output_bound (line 418) | fn output_bound(&mut self, output: Output, wl_output: WlOutput) {
  method dmabuf_state (line 428) | fn dmabuf_state(&mut self) -> &mut DmabufState {
  method dmabuf_imported (line 432) | fn dmabuf_imported(
  method lock_state (line 448) | fn lock_state(&mut self) -> &mut SessionLockManagerState {
  method lock (line 452) | fn lock(&mut self, confirmation: SessionLocker) {
  method unlock (line 456) | fn unlock(&mut self) {
  method new_surface (line 462) | fn new_surface(&mut self, surface: LockSurface, output: WlOutput) {
  function configure_lock_surface (line 474) | pub fn configure_lock_surface(surface: &LockSurface, output: &Output) {
  method context_created (line 489) | fn context_created(&mut self, source: SecurityContextListenerSource, con...
  method idle_notifier_state (line 506) | fn idle_notifier_state(&mut self) -> &mut IdleNotifierState<Self> {
  method inhibit (line 513) | fn inhibit(&mut self, surface: WlSurface) {
  method uninhibit (line 517) | fn uninhibit(&mut self, surface: WlSurface) {
  method foreign_toplevel_manager_state (line 524) | fn foreign_toplevel_manager_state(&mut self) -> &mut ForeignToplevelMana...
  method activate (line 528) | fn activate(&mut self, wl_surface: WlSurface) {
  method close (line 537) | fn close(&mut self, wl_surface: WlSurface) {
  method set_fullscreen (line 543) | fn set_fullscreen(&mut self, wl_surface: WlSurface, wl_output: Option<Wl...
  method unset_fullscreen (line 563) | fn unset_fullscreen(&mut self, wl_surface: WlSurface) {
  method set_maximized (line 570) | fn set_maximized(&mut self, wl_surface: WlSurface) {
  method unset_maximized (line 577) | fn unset_maximized(&mut self, wl_surface: WlSurface) {
  method ext_workspace_manager_state (line 587) | fn ext_workspace_manager_state(&mut self) -> &mut ExtWorkspaceManagerSta...
  method activate_workspace (line 591) | fn activate_workspace(&mut self, id: WorkspaceId) {
  method assign_workspace (line 611) | fn assign_workspace(&mut self, ws_id: WorkspaceId, output: Output) {
  method frame (line 623) | fn frame(&mut self, manager: &ZwlrScreencopyManagerV1, screencopy: Scree...
  method screencopy_state (line 640) | fn screencopy_state(&mut self) -> &mut ScreencopyManagerState {
  method virtual_pointer_manager_state (line 647) | fn virtual_pointer_manager_state(&mut self) -> &mut VirtualPointerManage...
  method on_virtual_pointer_motion (line 651) | fn on_virtual_pointer_motion(&mut self, event: VirtualPointerMotionEvent) {
  method on_virtual_pointer_motion_absolute (line 655) | fn on_virtual_pointer_motion_absolute(&mut self, event: VirtualPointerMo...
  method on_virtual_pointer_button (line 661) | fn on_virtual_pointer_button(&mut self, event: VirtualPointerButtonEvent) {
  method on_virtual_pointer_axis (line 665) | fn on_virtual_pointer_axis(&mut self, event: VirtualPointerAxisEvent) {
  method drm_lease_state (line 672) | fn drm_lease_state(&mut self, node: DrmNode) -> &mut DrmLeaseState {
  method lease_request (line 682) | fn lease_request(
  method new_active_lease (line 698) | fn new_active_lease(&mut self, node: DrmNode, lease: DrmLease) {
  method lease_destroyed (line 707) | fn lease_destroyed(&mut self, node: DrmNode, lease_id: u32) {
  method gamma_control_manager_state (line 721) | fn gamma_control_manager_state(&mut self) -> &mut GammaControlManagerSta...
  method get_gamma_size (line 725) | fn get_gamma_size(&mut self, output: &Output) -> Option<u32> {
  method set_gamma (line 739) | fn set_gamma(&mut self, output: &Output, ramp: Option<Vec<u16>>) -> Opti...
  type UrgentOnlyMarker (line 751) | struct UrgentOnlyMarker;
  method activation_state (line 754) | fn activation_state(&mut self) -> &mut XdgActivationState {
  method token_created (line 758) | fn token_created(&mut self, _token: XdgActivationToken, data: XdgActivat...
  method request_activation (line 798) | fn request_activation(
  method output_management_state (line 829) | fn output_management_state(&mut self) -> &mut OutputManagementManagerSta...
  method apply_output_config (line 833) | fn apply_output_config(&mut self, config: niri_config::Outputs) {

FILE: src/handlers/xdg_shell.rs
  method xdg_shell_state (line 53) | fn xdg_shell_state(&mut self) -> &mut XdgShellState {
  method new_toplevel (line 57) | fn new_toplevel(&mut self, surface: ToplevelSurface) {
  method new_popup (line 64) | fn new_popup(&mut self, surface: PopupSurface, _positioner: PositionerSt...
  method move_request (line 73) | fn move_request(&mut self, surface: ToplevelSurface, _seat: WlSeat, seri...
  method resize_request (line 151) | fn resize_request(
  method reposition_request (line 254) | fn reposition_request(
  method grab (line 269) | fn grab(&mut self, surface: PopupSurface, _seat: WlSeat, serial: Serial) {
  method maximize_request (line 409) | fn maximize_request(&mut self, toplevel: ToplevelSurface) {
  method unmaximize_request (line 491) | fn unmaximize_request(&mut self, toplevel: ToplevelSurface) {
  method fullscreen_request (line 610) | fn fullscreen_request(
  method unfullscreen_request (line 702) | fn unfullscreen_request(&mut self, toplevel: ToplevelSurface) {
  method toplevel_destroyed (line 820) | fn toplevel_destroyed(&mut self, surface: ToplevelSurface) {
  method popup_destroyed (line 892) | fn popup_destroyed(&mut self, surface: PopupSurface) {
  method app_id_changed (line 898) | fn app_id_changed(&mut self, toplevel: ToplevelSurface) {
  method title_changed (line 902) | fn title_changed(&mut self, toplevel: ToplevelSurface) {
  method parent_changed (line 906) | fn parent_changed(&mut self, toplevel: ToplevelSurface) {
  method new_decoration (line 926) | fn new_decoration(&mut self, toplevel: ToplevelSurface) {
  method request_mode (line 933) | fn request_mode(&mut self, toplevel: ToplevelSurface, mode: zxdg_topleve...
  method unset_mode (line 959) | fn unset_mode(&mut self, toplevel: ToplevelSurface) {
  type KdeDecorationsModeState (line 982) | pub struct KdeDecorationsModeState {
    method is_server (line 987) | pub fn is_server(&self) -> bool {
  method kde_decoration_state (line 993) | fn kde_decoration_state(&self) -> &KdeDecorationState {
  method request_mode (line 997) | fn request_mode(
  method xdg_foreign_state (line 1022) | fn xdg_foreign_state(&mut self) -> &mut XdgForeignState {
  method send_initial_configure (line 1029) | pub fn send_initial_configure(&mut self, toplevel: &ToplevelSurface) {
  method queue_initial_configure (line 1186) | pub fn queue_initial_configure(&self, toplevel: ToplevelSurface) {
  method popups_handle_commit (line 1203) | pub fn popups_handle_commit(&mut self, surface: &WlSurface) {
  method output_for_popup (line 1230) | pub fn output_for_popup(&self, popup: &PopupKind) -> Option<&Output> {
  method unconstrain_popup (line 1235) | pub fn unconstrain_popup(&self, popup: &PopupKind) {
  method unconstrain_window_popup (line 1256) | fn unconstrain_window_popup(&self, popup: &PopupKind, window: &Window) {
  method unconstrain_layer_shell_popup (line 1265) | pub fn unconstrain_layer_shell_popup(
  method position_popup_within_rect (line 1300) | fn position_popup_within_rect(
  method update_reactive_popups (line 1349) | pub fn update_reactive_popups(&self, window: &Window) {
  method update_window_rules (line 1369) | pub fn update_window_rules(&mut self, toplevel: &ToplevelSurface) {
  function unconstrain_with_padding (line 1401) | fn unconstrain_with_padding(
  function add_mapped_toplevel_pre_commit_hook (line 1442) | pub fn add_mapped_toplevel_pre_commit_hook(toplevel: &ToplevelSurface) -...

FILE: src/input/backend_ext.rs
  type NiriInputBackend (line 9) | pub trait NiriInputBackend: input::InputBackend<Device = Self::NiriDevic...
    type NiriDevice (line 16) | type NiriDevice = Self::Device;
  type NiriInputDevice (line 19) | pub trait NiriInputDevice: input::Device {
    method output (line 23) | fn output(&self, state: &State) -> Option<Output>;
    method output (line 27) | fn output(&self, _state: &State) -> Option<Output> {
    method output (line 34) | fn output(&self, _state: &State) -> Option<Output> {
    method output (line 48) | fn output(&self, _: &State) -> Option<Output> {

FILE: src/input/mod.rs
  constant DOUBLE_CLICK_TIME (line 70) | pub const DOUBLE_CLICK_TIME: Duration = Duration::from_millis(400);
  type TabletData (line 73) | pub struct TabletData {
  type PointerOrTouchStartData (line 77) | pub enum PointerOrTouchStartData<D: SeatHandler> {
  function location (line 83) | pub fn location(&self) -> Point<f64, Logical> {
  function unwrap_pointer (line 90) | pub fn unwrap_pointer(&self) -> &PointerGrabStartData<D> {
  function unwrap_touch (line 97) | pub fn unwrap_touch(&self) -> &TouchGrabStartData<D> {
  function is_pointer (line 104) | pub fn is_pointer(&self) -> bool {
  function is_touch (line 108) | pub fn is_touch(&self) -> bool {
  method process_input_event (line 114) | pub fn process_input_event<I: InputBackend + 'static>(&mut self, event: ...
  method process_libinput_event (line 196) | pub fn process_libinput_event(&mut self, event: &mut InputEvent<Libinput...
  method on_device_added (line 242) | fn on_device_added(&mut self, device: impl Device) {
  method on_device_removed (line 254) | fn on_device_removed(&mut self, device: impl Device) {
  method global_bounding_rectangle (line 272) | fn global_bounding_rectangle(&self) -> Option<Rectangle<i32, Logical>> {
  method compute_tablet_position (line 288) | fn compute_tablet_position<I: InputBackend>(
  method is_inhibiting_shortcuts (line 351) | fn is_inhibiting_shortcuts(&self) -> bool {
  method on_keyboard (line 363) | fn on_keyboard<I: InputBackend>(
  method start_key_repeat (line 560) | fn start_key_repeat(&mut self, bind: Bind) {
  method hide_cursor_if_needed (line 594) | fn hide_cursor_if_needed(&mut self) {
  method handle_bind (line 616) | pub fn handle_bind(&mut self, bind: Bind) {
  method do_action (line 649) | pub fn do_action(&mut self, action: Action, allow_when_locked: bool) {
  method on_pointer_motion (line 2387) | fn on_pointer_motion<I: InputBackend>(&mut self, event: I::PointerMotion...
  method on_pointer_motion_absolute (line 2637) | fn on_pointer_motion_absolute<I: InputBackend>(
  method on_pointer_button (line 2735) | fn on_pointer_button<I: InputBackend>(&mut self, event: I::PointerButton...
  method on_pointer_axis (line 3057) | fn on_pointer_axis<I: InputBackend>(&mut self, event: I::PointerAxisEven...
  method on_tablet_tool_axis (line 3506) | fn on_tablet_tool_axis<I: InputBackend>(&mut self, event: I::TabletToolA...
  method on_tablet_tool_tip (line 3579) | fn on_tablet_tool_tip<I: InputBackend>(&mut self, event: I::TabletToolTi...
  method on_tablet_tool_proximity (line 3677) | fn on_tablet_tool_proximity<I: InputBackend>(&mut self, event: I::Tablet...
  method on_tablet_tool_button (line 3727) | fn on_tablet_tool_button<I: InputBackend>(&mut self, event: I::TabletToo...
  method on_gesture_swipe_begin (line 3740) | fn on_gesture_swipe_begin<I: InputBackend>(&mut self, event: I::GestureS...
  method on_gesture_swipe_update (line 3776) | fn on_gesture_swipe_update<I: InputBackend + 'static>(
  method on_gesture_swipe_end (line 3897) | fn on_gesture_swipe_end<I: InputBackend>(&mut self, event: I::GestureSwi...
  method on_gesture_pinch_begin (line 3941) | fn on_gesture_pinch_begin<I: InputBackend>(&mut self, event: I::GestureP...
  method on_gesture_pinch_update (line 3959) | fn on_gesture_pinch_update<I: InputBackend>(&mut self, event: I::Gesture...
  method on_gesture_pinch_end (line 3977) | fn on_gesture_pinch_end<I: InputBackend>(&mut self, event: I::GesturePin...
  method on_gesture_hold_begin (line 3995) | fn on_gesture_hold_begin<I: InputBackend>(&mut self, event: I::GestureHo...
  method on_gesture_hold_end (line 4013) | fn on_gesture_hold_end<I: InputBackend>(&mut self, event: I::GestureHold...
  method compute_absolute_location (line 4031) | fn compute_absolute_location<I: InputBackend>(
  method compute_touch_location (line 4050) | fn compute_touch_location<I: InputBackend>(
  method on_touch_down (line 4057) | fn on_touch_down<I: InputBackend>(&mut self, evt: I::TouchDownEvent) {
  method on_touch_up (line 4188) | fn on_touch_up<I: InputBackend>(&mut self, evt: I::TouchUpEvent) {
  method on_touch_motion (line 4212) | fn on_touch_motion<I: InputBackend>(&mut self, evt: I::TouchMotionEvent) {
  method on_touch_frame (line 4259) | fn on_touch_frame<I: InputBackend>(&mut self, _evt: I::TouchFrameEvent) {
  method on_touch_cancel (line 4265) | fn on_touch_cancel<I: InputBackend>(&mut self, _evt: I::TouchCancelEvent) {
  method on_switch_toggle (line 4272) | fn on_switch_toggle<I: InputBackend>(&mut self, evt: I::SwitchToggleEven...
  method is_dnd_grab (line 4293) | pub fn is_dnd_grab(grab: &dyn Any) -> bool {
  function should_intercept_key (line 4305) | fn should_intercept_key<'a>(
  function find_bind (line 4389) | fn find_bind<'a>(
  function find_configured_bind (line 4435) | fn find_configured_bind<'a>(
  function find_configured_switch_action (line 4469) | fn find_configured_switch_action(
  function modifiers_from_state (line 4486) | fn modifiers_from_state(mods: ModifiersState) -> Modifiers {
  function should_activate_monitors (line 4509) | fn should_activate_monitors<I: InputBackend>(event: &InputEvent<I>) -> b...
  function should_hide_hotkey_overlay (line 4530) | fn should_hide_hotkey_overlay<I: InputBackend>(event: &InputEvent<I>) ->...
  function should_hide_exit_confirm_dialog (line 4545) | fn should_hide_exit_confirm_dialog<I: InputBackend>(event: &InputEvent<I...
  function should_notify_activity (line 4560) | fn should_notify_activity<I: InputBackend>(event: &InputEvent<I>) -> bool {
  function should_reset_pointer_inactivity_timer (line 4567) | fn should_reset_pointer_inactivity_timer<I: InputBackend>(event: &InputE...
  function allowed_when_locked (line 4581) | fn allowed_when_locked(action: &Action) -> bool {
  function allowed_during_screenshot (line 4594) | fn allowed_during_screenshot(action: &Action) -> bool {
  function hardcoded_overview_bind (line 4631) | fn hardcoded_overview_bind(raw: Keysym, mods: ModifiersState) -> Option<...
  function apply_libinput_settings (line 4666) | pub fn apply_libinput_settings(config: &niri_config::Input, device: &mut...
  function mods_with_binds (line 4952) | pub fn mods_with_binds(mod_key: ModKey, binds: &Binds, triggers: &[Trigg...
  function mods_with_mouse_binds (line 4971) | pub fn mods_with_mouse_binds(mod_key: ModKey, binds: &Binds) -> HashSet<...
  function mods_with_wheel_binds (line 4985) | pub fn mods_with_wheel_binds(mod_key: ModKey, binds: &Binds) -> HashSet<...
  function mods_with_finger_scroll_binds (line 4998) | pub fn mods_with_finger_scroll_binds(mod_key: ModKey, binds: &Binds) -> ...
  function grab_allows_hot_corner (line 5011) | fn grab_allows_hot_corner(grab: &(dyn PointerGrab<State> + 'static)) -> ...
  function make_binds_iter (line 5039) | fn make_binds_iter<'a>(
  function bindings_suppress_keys (line 5067) | fn bindings_suppress_keys() {
  function comp_mod_handling (line 5253) | fn comp_mod_handling() {

FILE: src/input/move_grab.rs
  type MoveGrab (line 23) | pub struct MoveGrab {
    method new (line 47) | pub fn new(
    method is_move (line 73) | pub fn is_move(&self) -> bool {
    method view_offset_output (line 77) | pub fn view_offset_output(&self) -> Option<&Output> {
    method on_ungrab (line 81) | fn on_ungrab(&mut self, data: &mut State) {
    method begin_move (line 118) | fn begin_move(&mut self, data: &mut State) -> bool {
    method begin_view_offset (line 139) | fn begin_view_offset(&mut self, data: &mut State) -> bool {
    method on_frame (line 172) | fn on_frame(&mut self, data: &mut State) -> bool {
    method on_toggle_floating (line 261) | fn on_toggle_floating(&mut self, data: &mut State) -> bool {
    method motion (line 298) | fn motion(
    method relative_motion (line 316) | fn relative_motion(
    method button (line 330) | fn button(
    method axis (line 361) | fn axis(
    method frame (line 370) | fn frame(&mut self, data: &mut State, handle: &mut PointerInnerHandle<...
    method gesture_swipe_begin (line 385) | fn gesture_swipe_begin(
    method gesture_swipe_update (line 394) | fn gesture_swipe_update(
    method gesture_swipe_end (line 403) | fn gesture_swipe_end(
    method gesture_pinch_begin (line 412) | fn gesture_pinch_begin(
    method gesture_pinch_update (line 421) | fn gesture_pinch_update(
    method gesture_pinch_end (line 430) | fn gesture_pinch_end(
    method gesture_hold_begin (line 439) | fn gesture_hold_begin(
    method gesture_hold_end (line 448) | fn gesture_hold_end(
    method start_data (line 457) | fn start_data(&self) -> &PointerGrabStartData<State> {
    method unset (line 461) | fn unset(&mut self, data: &mut State) {
    method down (line 467) | fn down(
    method up (line 486) | fn up(
    method motion (line 500) | fn motion(
    method frame (line 518) | fn frame(&mut self, data: &mut State, handle: &mut TouchInnerHandle<'_...
    method cancel (line 527) | fn cancel(&mut self, data: &mut State, handle: &mut TouchInnerHandle<'...
    method shape (line 532) | fn shape(
    method orientation (line 542) | fn orientation(
    method start_data (line 552) | fn start_data(&self) -> &TouchGrabStartData<State> {
    method unset (line 556) | fn unset(&mut self, data: &mut State) {
  type GestureState (line 40) | enum GestureState {

FILE: src/input/pick_color_grab.rs
  type PickColorGrab (line 18) | pub struct PickColorGrab {
    method new (line 23) | pub fn new(start_data: PointerGrabStartData<State>) -> Self {
    method on_ungrab (line 27) | fn on_ungrab(&mut self, state: &mut State) {
    method pick_color_at_point (line 38) | fn pick_color_at_point(location: Point<f64, Logical>, data: &mut State...
    method motion (line 99) | fn motion(
    method relative_motion (line 109) | fn relative_motion(
    method button (line 119) | fn button(
    method axis (line 140) | fn axis(
    method frame (line 149) | fn frame(&mut self, data: &mut State, handle: &mut PointerInnerHandle<...
    method gesture_swipe_begin (line 153) | fn gesture_swipe_begin(
    method gesture_swipe_update (line 162) | fn gesture_swipe_update(
    method gesture_swipe_end (line 171) | fn gesture_swipe_end(
    method gesture_pinch_begin (line 180) | fn gesture_pinch_begin(
    method gesture_pinch_update (line 189) | fn gesture_pinch_update(
    method gesture_pinch_end (line 198) | fn gesture_pinch_end(
    method gesture_hold_begin (line 207) | fn gesture_hold_begin(
    method gesture_hold_end (line 216) | fn gesture_hold_end(
    method start_data (line 225) | fn start_data(&self) -> &PointerGrabStartData<State> {
    method unset (line 229) | fn unset(&mut self, data: &mut State) {

FILE: src/input/pick_window_grab.rs
  type PickWindowGrab (line 14) | pub struct PickWindowGrab {
    method new (line 19) | pub fn new(start_data: PointerGrabStartData<State>) -> Self {
    method on_ungrab (line 23) | fn on_ungrab(&mut self, state: &mut State) {
    method motion (line 37) | fn motion(
    method relative_motion (line 47) | fn relative_motion(
    method button (line 57) | fn button(
    method axis (line 81) | fn axis(
    method frame (line 90) | fn frame(&mut self, data: &mut State, handle: &mut PointerInnerHandle<...
    method gesture_swipe_begin (line 94) | fn gesture_swipe_begin(
    method gesture_swipe_update (line 103) | fn gesture_swipe_update(
    method gesture_swipe_end (line 112) | fn gesture_swipe_end(
    method gesture_pinch_begin (line 121) | fn gesture_pinch_begin(
    method gesture_pinch_update (line 130) | fn gesture_pinch_update(
    method gesture_pinch_end (line 139) | fn gesture_pinch_end(
    method gesture_hold_begin (line 148) | fn gesture_hold_begin(
    method gesture_hold_end (line 157) | fn gesture_hold_end(
    method start_data (line 166) | fn start_data(&self) -> &PointerGrabStartData<State> {
    method unset (line 170) | fn unset(&mut self, data: &mut State) {

FILE: src/input/resize_grab.rs
  type ResizeGrab (line 13) | pub struct ResizeGrab {
    method new (line 19) | pub fn new(start_data: PointerGrabStartData<State>, window: Window) ->...
    method on_ungrab (line 23) | fn on_ungrab(&mut self, state: &mut State) {
    method motion (line 33) | fn motion(
    method relative_motion (line 58) | fn relative_motion(
    method button (line 69) | fn button(
    method axis (line 83) | fn axis(
    method frame (line 92) | fn frame(&mut self, data: &mut State, handle: &mut PointerInnerHandle<...
    method gesture_swipe_begin (line 96) | fn gesture_swipe_begin(
    method gesture_swipe_update (line 105) | fn gesture_swipe_update(
    method gesture_swipe_end (line 114) | fn gesture_swipe_end(
    method gesture_pinch_begin (line 123) | fn gesture_pinch_begin(
    method gesture_pinch_update (line 132) | fn gesture_pinch_update(
    method gesture_pinch_end (line 141) | fn gesture_pinch_end(
    method gesture_hold_begin (line 150) | fn gesture_hold_begin(
    method gesture_hold_end (line 159) | fn gesture_hold_end(
    method start_data (line 168) | fn start_data(&self) -> &PointerGrabStartData<State> {
    method unset (line 172) | fn unset(&mut self, data: &mut State) {

FILE: src/input/scroll_swipe_gesture.rs
  type ScrollSwipeGesture (line 8) | pub struct ScrollSwipeGesture {
    method new (line 21) | pub const fn new() -> Self {
    method update (line 28) | pub fn update(&mut self, dx: f64, dy: f64) -> Action {
    method reset (line 41) | pub fn reset(&mut self) -> bool {
    method is_vertical (line 50) | pub fn is_vertical(&self) -> bool {
  type Action (line 14) | pub enum Action {
    method begin (line 62) | pub fn begin(self) -> bool {
    method end (line 66) | pub fn end(self) -> bool {
  method default (line 56) | fn default() -> Self {

FILE: src/input/scroll_tracker.rs
  type ScrollTracker (line 1) | pub struct ScrollTracker {
    method new (line 9) | pub fn new(tick: i8) -> Self {
    method accumulate (line 17) | pub fn accumulate(&mut self, amount: f64) -> i8 {
    method reset (line 36) | pub fn reset(&mut self) {

FILE: src/input/spatial_movement_grab.rs
  type SpatialMovementGrab (line 17) | pub struct SpatialMovementGrab {
    method new (line 38) | pub fn new(
    method view_offset_output (line 63) | pub fn view_offset_output(&self) -> Option<&Output> {
    method workspace_switch_output (line 67) | pub fn workspace_switch_output(&self) -> Option<&Output> {
    method on_frame (line 71) | fn on_frame(&mut self, data: &mut State) -> bool {
    method on_ungrab (line 128) | fn on_ungrab(&mut self, state: &mut State) {
    method motion (line 148) | fn motion(
    method relative_motion (line 166) | fn relative_motion(
    method button (line 180) | fn button(
    method axis (line 194) | fn axis(
    method frame (line 203) | fn frame(&mut self, data: &mut State, handle: &mut PointerInnerHandle<...
    method gesture_swipe_begin (line 218) | fn gesture_swipe_begin(
    method gesture_swipe_update (line 227) | fn gesture_swipe_update(
    method gesture_swipe_end (line 236) | fn gesture_swipe_end(
    method gesture_pinch_begin (line 245) | fn gesture_pinch_begin(
    method gesture_pinch_update (line 254) | fn gesture_pinch_update(
    method gesture_pinch_end (line 263) | fn gesture_pinch_end(
    method gesture_hold_begin (line 272) | fn gesture_hold_begin(
    method gesture_hold_end (line 281) | fn gesture_hold_end(
    method start_data (line 290) | fn start_data(&self) -> &PointerGrabStartData<State> {
    method unset (line 294) | fn unset(&mut self, data: &mut State) {
  type GestureState (line 31) | enum GestureState {

FILE: src/input/swipe_tracker.rs
  constant HISTORY_LIMIT (line 4) | const HISTORY_LIMIT: Duration = Duration::from_millis(150);
  constant DECELERATION_TOUCHPAD (line 5) | const DECELERATION_TOUCHPAD: f64 = 0.997;
  type SwipeTracker (line 8) | pub struct SwipeTracker {
    method new (line 21) | pub fn new() -> Self {
    method push (line 29) | pub fn push(&mut self, delta: f64, timestamp: Duration) {
    method pos (line 49) | pub fn pos(&self) -> f64 {
    method velocity (line 54) | pub fn velocity(&self) -> f64 {
    method projected_end_pos (line 69) | pub fn projected_end_pos(&self) -> f64 {
    method trim_history (line 74) | fn trim_history(&mut self) {
  type Event (line 14) | struct Event {

FILE: src/input/touch_overview_grab.rs
  constant INTERACTIVE_MOVE_THRESHOLD (line 17) | const INTERACTIVE_MOVE_THRESHOLD: Duration = Duration::from_millis(500);
  type TouchOverviewGrab (line 19) | pub struct TouchOverviewGrab {
    method new (line 40) | pub fn new(
    method on_ungrab (line 62) | fn on_ungrab(&mut self, state: &mut State) {
    method down (line 117) | fn down(
    method up (line 139) | fn up(
    method motion (line 155) | fn motion(
    method frame (line 249) | fn frame(&mut self, data: &mut State, handle: &mut TouchInnerHandle<'_...
    method cancel (line 253) | fn cancel(&mut self, data: &mut State, handle: &mut TouchInnerHandle<'...
    method shape (line 258) | fn shape(
    method orientation (line 268) | fn orientation(
    method start_data (line 278) | fn start_data(&self) -> &TouchGrabStartData<State> {
    method unset (line 282) | fn unset(&mut self, data: &mut State) {
  type GestureState (line 32) | enum GestureState {

FILE: src/input/touch_resize_grab.rs
  type TouchResizeGrab (line 11) | pub struct TouchResizeGrab {
    method new (line 17) | pub fn new(start_data: TouchGrabStartData<State>, window: Window) -> S...
    method on_ungrab (line 21) | fn on_ungrab(&mut self, state: &mut State) {
    method down (line 27) | fn down(
    method up (line 38) | fn up(
    method motion (line 54) | fn motion(
    method frame (line 83) | fn frame(&mut self, data: &mut State, handle: &mut TouchInnerHandle<'_...
    method cancel (line 87) | fn cancel(&mut self, data: &mut State, handle: &mut TouchInnerHandle<'...
    method shape (line 92) | fn shape(
    method orientation (line 102) | fn orientation(
    method start_data (line 112) | fn start_data(&self) -> &TouchGrabStartData<State> {
    method unset (line 116) | fn unset(&mut self, data: &mut State) {

FILE: src/ipc/client.rs
  function handle_msg (line 18) | pub fn handle_msg(mut msg: Msg, json: bool) -> anyhow::Result<()> {
  function print_output (line 558) | fn print_output(output: Output) -> anyhow::Result<()> {
  function print_window (line 672) | fn print_window(window: &Window) {
  function print_cast (line 741) | fn print_cast(cast: &Cast) {
  function fmt_rounded (line 777) | fn fmt_rounded(x: f64) -> String {
  function ensure_absolute_path (line 786) | fn ensure_absolute_path(path: &mut String) -> anyhow::Result<()> {
  function test_fmt_rounded (line 806) | fn test_fmt_rounded() {

FILE: src/ipc/server.rs
  constant EVENT_STREAM_BUFFER_SIZE (line 42) | const EVENT_STREAM_BUFFER_SIZE: usize = 64;
  type IpcServer (line 44) | pub struct IpcServer {
    method start (line 73) | pub fn start(
    method send_event (line 115) | fn send_event(&self, event: Event) {
  type ClientCtx (line 53) | struct ClientCtx {
  type EventStreamClient (line 61) | struct EventStreamClient {
  type EventStreamSender (line 67) | struct EventStreamSender {
  method drop (line 140) | fn drop(&mut self) {
  function socket_dir (line 147) | fn socket_dir() -> PathBuf {
  function on_new_ipc_client (line 155) | fn on_new_ipc_client(state: &mut State, stream: UnixStream) {
  function handle_client (line 187) | async fn handle_client(ctx: ClientCtx, stream: Async<'static, UnixStream...
  function process (line 271) | async fn process(ctx: &ClientCtx, request: Request) -> Reply {
  function validate_action (line 463) | fn validate_action(action: &Action) -> Result<(), String> {
  function handle_event_stream_client (line 488) | async fn handle_event_stream_client(client: EventStreamClient) -> anyhow...
  function make_ipc_window (line 515) | fn make_ipc_window(
  method ipc_keyboard_layouts_changed (line 535) | pub fn ipc_keyboard_layouts_changed(&mut self) {
  method ipc_refresh_keyboard_layout_index (line 560) | pub fn ipc_refresh_keyboard_layout_index(&mut self) {
  method ipc_refresh_layout (line 583) | pub fn ipc_refresh_layout(&mut self) {
  method ipc_refresh_workspaces (line 589) | fn ipc_refresh_workspaces(&mut self) {
  method ipc_refresh_windows (line 688) | fn ipc_refresh_windows(&mut self) {
  method ipc_refresh_overview (line 791) | pub fn ipc_refresh_overview(&mut self) {
  method ipc_refresh_casts (line 809) | pub fn ipc_refresh_casts(&mut self) {
  method ipc_config_loaded (line 924) | pub fn ipc_config_loaded(&mut self, failed: bool) {
  method ipc_screenshot_taken (line 935) | pub fn ipc_screenshot_taken(&mut self, path: Option<String>) {

FILE: src/layer/mapped.rs
  type MappedLayer (line 21) | pub struct MappedLayer {
    method new (line 53) | pub fn new(
    method update_config (line 77) | pub fn update_config(&mut self, config: &Config) {
    method update_shaders (line 85) | pub fn update_shaders(&mut self) {
    method update_sizes (line 89) | pub fn update_sizes(&mut self, view_size: Size<f64, Logical>, scale: f...
    method update_render_elements (line 94) | pub fn update_render_elements(&mut self, size: Size<f64, Logical>) {
    method are_animations_ongoing (line 108) | pub fn are_animations_ongoing(&self) -> bool {
    method surface (line 112) | pub fn surface(&self) -> &LayerSurface {
    method rules (line 116) | pub fn rules(&self) -> &ResolvedLayerRules {
    method recompute_layer_rules (line 121) | pub fn recompute_layer_rules(&mut self, rules: &[LayerRule], is_at_sta...
    method place_within_backdrop (line 131) | pub fn place_within_backdrop(&self) -> bool {
    method bob_offset (line 148) | pub fn bob_offset(&self) -> Point<f64, Logical> {
    method render_normal (line 158) | pub fn render_normal<R: NiriRenderer>(
    method render_popups (line 202) | pub fn render_popups<R: NiriRenderer>(

FILE: src/layer/mod.rs
  type ResolvedLayerRules (line 11) | pub struct ResolvedLayerRules {
    method compute (line 32) | pub fn compute(rules: &[LayerRule], surface: &LayerSurface, is_at_star...
  function surface_matches (line 79) | fn surface_matches(surface: &LayerSurface, m: &Match) -> bool {

FILE: src/layout/closing_window.rs
  type ClosingWindow (line 28) | pub struct ClosingWindow {
    method new (line 88) | pub fn new<E: RenderElement<GlesRenderer>>(
    method advance_animations (line 141) | pub fn advance_animations(&mut self) {
    method are_animations_ongoing (line 153) | pub fn are_animations_ongoing(&self) -> bool {
    method render (line 160) | pub fn render(
  type AnimationState (line 65) | enum AnimationState {
    method new (line 75) | pub fn new(blocker: TransactionBlocker, anim: Animation) -> Self {

FILE: src/layout/floating.rs
  constant DIRECTIONAL_MOVE_PX (line 30) | pub const DIRECTIONAL_MOVE_PX: f64 = 50.;
  type FloatingSpace (line 34) | pub struct FloatingSpace<W: LayoutElement> {
  type Data (line 80) | struct Data {
    method new (line 97) | pub fn new<W: LayoutElement>(
    method scale_by_working_area (line 113) | pub fn scale_by_working_area(
    method logical_to_size_frac_in_working_area (line 124) | pub fn logical_to_size_frac_in_working_area(
    method recompute_logical_pos (line 135) | fn recompute_logical_pos(&mut self) {
    method update_config (line 160) | pub fn update_config(&mut self, working_area: Rectangle<f64, Logical>) {
    method update (line 169) | pub fn update<W: LayoutElement>(&mut self, tile: &Tile<W>) {
    method set_logical_pos (line 179) | pub fn set_logical_pos(&mut self, logical_pos: Point<f64, Logical>) {
    method center (line 186) | pub fn center(&self) -> Point<f64, Logical> {
    method verify_invariants (line 191) | fn verify_invariants(&self) {
  function new (line 202) | pub fn new(
  function update_config (line 223) | pub fn update_config(
  function update_shaders (line 242) | pub fn update_shaders(&mut self) {
  function advance_animations (line 248) | pub fn advance_animations(&mut self) {
  function are_animations_ongoing (line 259) | pub fn are_animations_ongoing(&self) -> bool {
  function are_transitions_ongoing (line 263) | pub fn are_transitions_ongoing(&self) -> bool {
  function update_render_elements (line 267) | pub fn update_render_elements(&mut self, is_active: bool, view_rect: Rec...
  function tiles (line 279) | pub fn tiles(&self) -> impl Iterator<Item = &Tile<W>> + '_ {
  function tiles_mut (line 283) | pub fn tiles_mut(&mut self) -> impl Iterator<Item = &mut Tile<W>> + '_ {
  function tiles_with_offsets (line 287) | pub fn tiles_with_offsets(&self) -> impl Iterator<Item = (&Tile<W>, Poin...
  function tiles_with_offsets_mut (line 292) | pub fn tiles_with_offsets_mut(
  function tiles_with_render_positions (line 299) | pub fn tiles_with_render_positions(
  function tiles_with_render_positions_mut (line 311) | pub fn tiles_with_render_positions_mut(
  function tiles_with_ipc_layouts (line 326) | pub fn tiles_with_ipc_layouts(&self) -> impl Iterator<Item = (&Tile<W>, ...
  function new_window_toplevel_bounds (line 342) | pub fn new_window_toplevel_bounds(&self, rules: &ResolvedWindowRules) ->...
  function active_tile_visual_rectangle (line 350) | pub fn active_tile_visual_rectangle(&self) -> Option<Rectangle<f64, Logi...
  function popup_target_rect (line 359) | pub fn popup_target_rect(&self, id: &W::Id) -> Option<Rectangle<f64, Log...
  function idx_of (line 373) | fn idx_of(&self, id: &W::Id) -> Option<usize> {
  function contains (line 377) | fn contains(&self, id: &W::Id) -> bool {
  function active_window (line 381) | pub fn active_window(&self) -> Option<&W> {
  function active_window_mut (line 389) | pub fn active_window_mut(&mut self) -> Option<&mut W> {
  function has_window (line 397) | pub fn has_window(&self, id: &W::Id) -> bool {
  function is_empty (line 401) | pub fn is_empty(&self) -> bool {
  function add_tile (line 405) | pub fn add_tile(&mut self, tile: Tile<W>, activate: bool) {
  function add_tile_at (line 409) | fn add_tile_at(&mut self, mut idx: usize, mut tile: Tile<W>, activate: b...
  function add_tile_above (line 458) | pub fn add_tile_above(&mut self, above: &W::Id, mut tile: Tile<W>, activ...
  function bring_up_descendants_of (line 471) | fn bring_up_descendants_of(&mut self, idx: usize) {
  function remove_active_tile (line 498) | pub fn remove_active_tile(&mut self) -> Option<RemovedTile<W>> {
  function remove_tile (line 503) | pub fn remove_tile(&mut self, id: &W::Id) -> RemovedTile<W> {
  function remove_tile_by_idx (line 508) | fn remove_tile_by_idx(&mut self, idx: usize) -> RemovedTile<W> {
  function start_close_animation_for_window (line 542) | pub fn start_close_animation_for_window(
  function activate_window_without_raising (line 562) | pub fn activate_window_without_raising(&mut self, id: &W::Id) -> bool {
  function activate_window (line 571) | pub fn activate_window(&mut self, id: &W::Id) -> bool {
  function raise_window (line 583) | fn raise_window(&mut self, from_idx: usize, to_idx: usize) {
  function start_close_animation_for_tile (line 592) | pub fn start_close_animation_for_tile(
  function toggle_window_width (line 628) | pub fn toggle_window_width(&mut self, id: Option<&W::Id>, forwards: bool) {
  function start_open_animation (line 680) | pub fn start_open_animation(&mut self, id: &W::Id) -> bool {
  function toggle_window_height (line 689) | pub fn toggle_window_height(&mut self, id: Option<&W::Id>, forwards: boo...
  function set_window_width (line 742) | pub fn set_window_width(&mut self, id: Option<&W::Id>, change: SizeChang...
  function set_window_height (line 789) | pub fn set_window_height(&mut self, id: Option<&W::Id>, change: SizeChan...
  function focus_directional (line 836) | fn focus_directional(
  function focus_left (line 860) | pub fn focus_left(&mut self) -> bool {
  function focus_right (line 864) | pub fn focus_right(&mut self) -> bool {
  function focus_up (line 868) | pub fn focus_up(&mut self) -> bool {
  function focus_down (line 872) | pub fn focus_down(&mut self) -> bool {
  function focus_leftmost (line 876) | pub fn focus_leftmost(&mut self) {
  function focus_rightmost (line 886) | pub fn focus_rightmost(&mut self) {
  function focus_topmost (line 896) | pub fn focus_topmost(&mut self) {
  function focus_bottommost (line 906) | pub fn focus_bottommost(&mut self) {
  function move_to (line 916) | fn move_to(&mut self, idx: usize, new_pos: Point<f64, Logical>, animate:...
  function move_by (line 926) | fn move_by(&mut self, amount: Point<f64, Logical>) {
  function move_left (line 936) | pub fn move_left(&mut self) {
  function move_right (line 940) | pub fn move_right(&mut self) {
  function move_up (line 944) | pub fn move_up(&mut self) {
  function move_down (line 948) | pub fn move_down(&mut self) {
  function move_window (line 952) | pub fn move_window(
  function center_window (line 1002) | pub fn center_window(&mut self, id: Option<&W::Id>) {
  function descendants_added (line 1012) | pub fn descendants_added(&mut self, id: &W::Id) -> bool {
  function update_window (line 1021) | pub fn update_window(&mut self, id: &W::Id, serial: Option<Serial>) -> b...
  function render (line 1056) | pub fn render<R: NiriRenderer>(
  function interactive_resize_begin (line 1085) | pub fn interactive_resize_begin(&mut self, window: W::Id, edges: ResizeE...
  function interactive_resize_update (line 1108) | pub fn interactive_resize_update(
  function interactive_resize_end (line 1147) | pub fn interactive_resize_end(&mut self, window: Option<&W::Id>) {
  function refresh (line 1161) | pub fn refresh(&mut self, is_active: bool, is_focused: bool) {
  function clamp_within_working_area (line 1205) | pub fn clamp_within_working_area(
  function scale_by_working_area (line 1215) | pub fn scale_by_working_area(&self, pos: Point<f64, SizeFrac>) -> Point<...
  function logical_to_size_frac (line 1219) | pub fn logical_to_size_frac(&self, logical_pos: Point<f64, Logical>) -> ...
  function move_and_animate (line 1223) | fn move_and_animate(&mut self, idx: usize, new_pos: Point<f64, Logical>) {
  function new_window_size (line 1240) | pub fn new_window_size(
  function stored_or_default_tile_pos (line 1272) | pub fn stored_or_default_tile_pos(&self, tile: &Tile<W>) -> Option<Point...
  function view_size (line 1306) | pub fn view_size(&self) -> Size<f64, Logical> {
  function working_area (line 1310) | pub fn working_area(&self) -> Rectangle<f64, Logical> {
  function scale (line 1315) | pub fn scale(&self) -> f64 {
  function clock (line 1320) | pub fn clock(&self) -> &Clock {
  function options (line 1325) | pub fn options(&self) -> &Rc<Options> {
  function verify_invariants (line 1330) | pub fn verify_invariants(&self) {
  function compute_toplevel_bounds (line 1388) | fn compute_toplevel_bounds(
  function resolve_preset_size (line 1404) | fn resolve_preset_size(preset: PresetSize, view_size: f64) -> ResolvedSi...

FILE: src/layout/focus_ring.rs
  type FocusRing (line 13) | pub struct FocusRing {
    method new (line 33) | pub fn new(config: niri_config::FocusRing) -> Self {
    method update_config (line 47) | pub fn update_config(&mut self, config: niri_config::FocusRing) {
    method update_shaders (line 51) | pub fn update_shaders(&mut self) {
    method update_render_elements (line 58) | pub fn update_render_elements(
    method render (line 218) | pub fn render(
    method width (line 261) | pub fn width(&self) -> f64 {
    method is_off (line 265) | pub fn is_off(&self) -> bool {
    method set_thicken_corners (line 269) | pub fn set_thicken_corners(&mut self, value: bool) {
    method config (line 273) | pub fn config(&self) -> &niri_config::FocusRing {

FILE: src/layout/insert_hint_element.rs
  type InsertHintElement (line 8) | pub struct InsertHintElement {
    method new (line 15) | pub fn new(config: niri_config::InsertHint) -> Self {
    method update_config (line 30) | pub fn update_config(&mut self, config: niri_config::InsertHint) {
    method update_shaders (line 43) | pub fn update_shaders(&mut self) {
    method update_render_elements (line 47) | pub fn update_render_elements(
    method render (line 58) | pub fn render(
  type InsertHintRenderElement (line 12) | pub type InsertHintRenderElement = FocusRingRenderElement;

FILE: src/layout/mod.rs
  constant RESIZE_ANIMATION_THRESHOLD (line 92) | pub const RESIZE_ANIMATION_THRESHOLD: f64 = 10.;
  constant INTERACTIVE_MOVE_START_THRESHOLD (line 95) | const INTERACTIVE_MOVE_START_THRESHOLD: f64 = 256. * 256.;
  constant INTERACTIVE_MOVE_ALPHA (line 98) | const INTERACTIVE_MOVE_ALPHA: f64 = 0.75;
  constant OVERVIEW_GESTURE_MOVEMENT (line 101) | const OVERVIEW_GESTURE_MOVEMENT: f64 = 300.;
  constant OVERVIEW_GESTURE_RUBBER_BAND (line 103) | const OVERVIEW_GESTURE_RUBBER_BAND: RubberBand = RubberBand {
  type SizeFrac (line 109) | pub struct SizeFrac;
  type LayoutElementRenderSnapshot (line 118) | pub type LayoutElementRenderSnapshot =
  type SizingMode (line 122) | pub enum SizingMode {
    method is_normal (line 521) | pub fn is_normal(&self) -> bool {
    method is_fullscreen (line 526) | pub fn is_fullscreen(&self) -> bool {
    method is_maximized (line 531) | pub fn is_maximized(&self) -> bool {
  type LayoutElement (line 128) | pub trait LayoutElement {
    method id (line 133) | fn id(&self) -> &Self::Id;
    method size (line 139) | fn size(&self) -> Size<i32, Logical>;
    method buf_loc (line 144) | fn buf_loc(&self) -> Point<i32, Logical>;
    method is_in_input_region (line 149) | fn is_in_input_region(&self, point: Point<f64, Logical>) -> bool;
    method render (line 155) | fn render<R: NiriRenderer>(
    method render_normal (line 169) | fn render_normal<R: NiriRenderer>(
    method render_popups (line 182) | fn render_popups<R: NiriRenderer>(
    method request_size (line 198) | fn request_size(
    method request_size_once (line 207) | fn request_size_once(&mut self, size: Size<i32, Logical>, animate: boo...
    method min_size (line 211) | fn min_size(&self) -> Size<i32, Logical>;
    method max_size (line 212) | fn max_size(&self) -> Size<i32, Logical>;
    method is_wl_surface (line 213) | fn is_wl_surface(&self, wl_surface: &WlSurface) -> bool;
    method has_ssd (line 214) | fn has_ssd(&self) -> bool;
    method set_preferred_scale_transform (line 215) | fn set_preferred_scale_transform(&self, scale: output::Scale, transfor...
    method output_enter (line 216) | fn output_enter(&self, output: &Output);
    method output_leave (line 217) | fn output_leave(&self, output: &Output);
    method set_offscreen_data (line 218) | fn set_offscreen_data(&self, data: Option<OffscreenData>);
    method set_activated (line 219) | fn set_activated(&mut self, active: bool);
    method set_active_in_column (line 220) | fn set_active_in_column(&mut self, active: bool);
    method set_floating (line 221) | fn set_floating(&mut self, floating: bool);
    method set_bounds (line 222) | fn set_bounds(&self, bounds: Size<i32, Logical>);
    method is_ignoring_opacity_window_rule (line 223) | fn is_ignoring_opacity_window_rule(&self) -> bool;
    method is_urgent (line 225) | fn is_urgent(&self) -> bool;
    method configure_intent (line 227) | fn configure_intent(&self) -> ConfigureIntent;
    method send_pending_configure (line 228) | fn send_pending_configure(&mut self);
    method sizing_mode (line 233) | fn sizing_mode(&self) -> SizingMode;
    method pending_sizing_mode (line 238) | fn pending_sizing_mode(&self) -> SizingMode;
    method requested_size (line 241) | fn requested_size(&self) -> Option<Size<i32, Logical>>;
    method expected_size (line 255) | fn expected_size(&self) -> Option<Size<i32, Logical>> {
    method is_pending_windowed_fullscreen (line 271) | fn is_pending_windowed_fullscreen(&self) -> bool {
    method request_windowed_fullscreen (line 274) | fn request_windowed_fullscreen(&mut self, value: bool) {
    method is_child_of (line 278) | fn is_child_of(&self, parent: &Self) -> bool;
    method rules (line 280) | fn rules(&self) -> &ResolvedWindowRules;
    method refresh (line 283) | fn refresh(&self);
    method take_animation_snapshot (line 285) | fn take_animation_snapshot(&mut self) -> Option<LayoutElementRenderSna...
    method set_interactive_resize (line 287) | fn set_interactive_resize(&mut self, data: Option<InteractiveResizeDat...
    method cancel_interactive_resize (line 288) | fn cancel_interactive_resize(&mut self);
    method interactive_resize_data (line 289) | fn interactive_resize_data(&self) -> Option<InteractiveResizeData>;
    method on_commit (line 291) | fn on_commit(&mut self, serial: Serial);
  type Layout (line 295) | pub struct Layout<W: LayoutElement> {
  type MonitorSet (line 331) | enum MonitorSet<W: LayoutElement> {
  type Options (line 349) | pub struct Options {
    method from_config (line 608) | fn from_config(config: &Config) -> Self {
    method with_merged_layout (line 620) | fn with_merged_layout(mut self, part: Option<&niri_config::LayoutPart>...
    method adjusted_for_scale (line 627) | fn adjusted_for_scale(mut self, scale: f64) -> Self {
  type InteractiveMoveState (line 362) | enum InteractiveMoveState<W: LayoutElement> {
  type InteractiveMoveData (line 379) | struct InteractiveMoveData<W: LayoutElement> {
  type DndData (line 409) | pub struct DndData<W: LayoutElement> {
  type DndHold (line 419) | struct DndHold<W: LayoutElement> {
  type DndHoldTarget (line 426) | enum DndHoldTarget<WindowId> {
  type InteractiveResizeData (line 432) | pub struct InteractiveResizeData {
  type ConfigureIntent (line 437) | pub enum ConfigureIntent {
  type RemovedTile (line 450) | pub struct RemovedTile<W: LayoutElement> {
  type ActivateWindow (line 462) | pub enum ActivateWindow {
    method map_smart (line 569) | pub fn map_smart(self, f: impl FnOnce() -> bool) -> bool {
  type AddWindowTarget (line 474) | pub enum AddWindowTarget<'a, W: LayoutElement> {
  type HitType (line 488) | pub enum HitType {
    method offset_win_pos (line 579) | pub fn offset_win_pos(mut self, offset: Point<f64, Logical>) -> Self {
    method hit_tile (line 587) | pub fn hit_tile<W: LayoutElement>(
    method to_activate (line 597) | pub fn to_activate(self) -> Self {
  type OverviewProgress (line 504) | enum OverviewProgress {
    method value (line 634) | fn value(&self) -> f64 {
    method is_animation (line 642) | fn is_animation(&self) -> bool {
  type OverviewGesture (line 511) | struct OverviewGesture {
  function moving (line 537) | fn moving(&self) -> Option<&InteractiveMoveData<W>> {
  function moving_mut (line 544) | fn moving_mut(&mut self) -> Option<&mut InteractiveMoveData<W>> {
  function tile_render_location (line 553) | fn tile_render_location(&self, zoom: f64) -> Point<f64, Logical> {
  function new (line 648) | pub fn new(clock: Clock, config: &Config) -> Self {
  function with_options (line 652) | pub fn with_options(clock: Clock, options: Options) -> Self {
  function with_options_and_workspaces (line 667) | fn with_options_and_workspaces(clock: Clock, config: &Config, options: O...
  function add_output (line 692) | pub fn add_output(&mut self, output: Output, layout_config: Option<Layou...
  function remove_output (line 800) | pub fn remove_output(&mut self, output: &Output) {
  function add_column_by_idx (line 858) | pub fn add_column_by_idx(
  function add_window (line 885) | pub fn add_window(
  function remove_window (line 1069) | pub fn remove_window(
  function descendants_added (line 1164) | pub fn descendants_added(&mut self, id: &W::Id) -> bool {
  function update_window (line 1174) | pub fn update_window(&mut self, window: &W::Id, serial: Option<Serial>) {
  function find_workspace_by_id (line 1209) | pub fn find_workspace_by_id(&self, id: WorkspaceId) -> Option<(usize, &W...
  function find_workspace_by_name (line 1235) | pub fn find_workspace_by_name(&self, workspace_name: &str) -> Option<(us...
  function find_workspace_by_ref (line 1264) | pub fn find_workspace_by_ref(
  function unname_workspace (line 1285) | pub fn unname_workspace(&mut self, workspace_name: &str) {
  function unname_workspace_by_ref (line 1289) | pub fn unname_workspace_by_ref(&mut self, reference: WorkspaceReference) {
  function unname_workspace_by_id (line 1296) | pub fn unname_workspace_by_id(&mut self, id: WorkspaceId) {
  function find_window_and_output (line 1322) | pub fn find_window_and_output(&self, wl_surface: &WlSurface) -> Option<(...
  function find_window_and_output_mut (line 1351) | pub fn find_window_and_output_mut(
  function popup_target_rect (line 1386) | pub fn popup_target_rect(&self, window: &W::Id) -> Rectangle<f64, Logica...
  function update_output_size (line 1407) | pub fn update_output_size(&mut self, output: &Output) {
  function scroll_amount_to_activate (line 1418) | pub fn scroll_amount_to_activate(&self, window: &W::Id) -> f64 {
  function should_trigger_focus_follows_mouse_on (line 1436) | pub fn should_trigger_focus_follows_mouse_on(&self, window: &W::Id) -> b...
  function activate_window (line 1471) | pub fn activate_window(&mut self, window: &W::Id) {
  function activate_window_without_raising (line 1507) | pub fn activate_window_without_raising(&mut self, window: &W::Id) {
  function active_output (line 1543) | pub fn active_output(&self) -> Option<&Output> {
  function active_workspace (line 1556) | pub fn active_workspace(&self) -> Option<&Workspace<W>> {
  function active_workspace_mut (line 1570) | pub fn active_workspace_mut(&mut self) -> Option<&mut Workspace<W>> {
  function windows_for_output (line 1584) | pub fn windows_for_output(&self, output: &Output) -> impl Iterator<Item ...
  function windows_for_output_mut (line 1603) | pub fn windows_for_output_mut(&mut self, output: &Output) -> impl Iterat...
  function with_windows (line 1625) | pub fn with_windows(
  function with_windows_mut (line 1655) | pub fn with_windows_mut(&mut self, mut f: impl FnMut(&mut W, Option<&Out...
  function active_monitor (line 1680) | fn active_monitor(&mut self) -> Option<&mut Monitor<W>> {
  function active_monitor_ref (line 1693) | pub fn active_monitor_ref(&self) -> Option<&Monitor<W>> {
  function monitors (line 1706) | pub fn monitors(&self) -> impl Iterator<Item = &Monitor<W>> + '_ {
  function monitors_mut (line 1716) | pub fn monitors_mut(&mut self) -> impl Iterator<Item = &mut Monitor<W>> ...
  function monitor_for_output (line 1726) | pub fn monitor_for_output(&self, output: &Output) -> Option<&Monitor<W>> {
  function monitor_for_output_mut (line 1730) | pub fn monitor_for_output_mut(&mut self, output: &Output) -> Option<&mut...
  function monitor_for_workspace (line 1734) | pub fn monitor_for_workspace(&self, workspace_name: &str) -> Option<&Mon...
  function outputs (line 1744) | pub fn outputs(&self) -> impl Iterator<Item = &Output> + '_ {
  function move_left (line 1748) | pub fn move_left(&mut self) {
  function move_right (line 1755) | pub fn move_right(&mut self) {
  function move_column_to_first (line 1762) | pub fn move_column_to_first(&mut self) {
  function move_column_to_last (line 1769) | pub fn move_column_to_last(&mut self) {
  function move_column_left_or_to_output (line 1776) | pub fn move_column_left_or_to_output(&mut self, output: &Output) -> bool {
  function move_column_right_or_to_output (line 1787) | pub fn move_column_right_or_to_output(&mut self, output: &Output) -> bool {
  function move_column_to_index (line 1798) | pub fn move_column_to_index(&mut self, index: usize) {
  function move_down (line 1805) | pub fn move_down(&mut self) {
  function move_up (line 1812) | pub fn move_up(&mut self) {
  function move_down_or_to_workspace_down (line 1819) | pub fn move_down_or_to_workspace_down(&mut self) {
  function move_up_or_to_workspace_up (line 1826) | pub fn move_up_or_to_workspace_up(&mut self) {
  function consume_or_expel_window_left (line 1833) | pub fn consume_or_expel_window_left(&mut self, window: Option<&W::Id>) {
  function consume_or_expel_window_right (line 1856) | pub fn consume_or_expel_window_right(&mut self, window: Option<&W::Id>) {
  function focus_left (line 1879) | pub fn focus_left(&mut self) {
  function focus_right (line 1886) | pub fn focus_right(&mut self) {
  function focus_column_first (line 1893) | pub fn focus_column_first(&mut self) {
  function focus_column_last (line 1900) | pub fn focus_column_last(&mut self) {
  function focus_column_right_or_first (line 1907) | pub fn focus_column_right_or_first(&mut self) {
  function focus_column_left_or_last (line 1914) | pub fn focus_column_left_or_last(&mut self) {
  function focus_column (line 1921) | pub fn focus_column(&mut self, index: usize) {
  function focus_window_up_or_output (line 1928) | pub fn focus_window_up_or_output(&mut self, output: &Output) -> bool {
  function focus_window_down_or_output (line 1939) | pub fn focus_window_down_or_output(&mut self, output: &Output) -> bool {
  function focus_column_left_or_output (line 1950) | pub fn focus_column_left_or_output(&mut self, output: &Output) -> bool {
  function focus_column_right_or_output (line 1961) | pub fn focus_column_right_or_output(&mut self, output: &Output) -> bool {
  function focus_window_in_column (line 1972) | pub fn focus_window_in_column(&mut self, index: u8) {
  function focus_down (line 1979) | pub fn focus_down(&mut self) {
  function focus_up (line 1986) | pub fn focus_up(&mut self) {
  function focus_down_or_left (line 1993) | pub fn focus_down_or_left(&mut self) {
  function focus_down_or_right (line 2000) | pub fn focus_down_or_right(&mut self) {
  function focus_up_or_left (line 2007) | pub fn focus_up_or_left(&mut self) {
  function focus_up_or_right (line 2014) | pub fn focus_up_or_right(&mut self) {
  function focus_window_or_workspace_down (line 2021) | pub fn focus_window_or_workspace_down(&mut self) {
  function focus_window_or_workspace_up (line 2028) | pub fn focus_window_or_workspace_up(&mut self) {
  function focus_window_top (line 2035) | pub fn focus_window_top(&mut self) {
  function focus_window_bottom (line 2042) | pub fn focus_window_bottom(&mut self) {
  function focus_window_down_or_top (line 2049) | pub fn focus_window_down_or_top(&mut self) {
  function focus_window_up_or_bottom (line 2056) | pub fn focus_window_up_or_bottom(&mut self) {
  function move_to_workspace_up (line 2063) | pub fn move_to_workspace_up(&mut self, focus: bool) {
  function move_to_workspace_down (line 2070) | pub fn move_to_workspace_down(&mut self, focus: bool) {
  function move_to_workspace (line 2077) | pub fn move_to_workspace(
  function move_column_to_workspace_up (line 2108) | pub fn move_column_to_workspace_up(&mut self, activate: bool) {
  function move_column_to_workspace_down (line 2115) | pub fn move_column_to_workspace_down(&mut self, activate: bool) {
  function move_column_to_workspace (line 2122) | pub fn move_column_to_workspace(&mut self, idx: usize, activate: bool) {
  function switch_workspace_up (line 2129) | pub fn switch_workspace_up(&mut self) {
  function switch_workspace_down (line 2136) | pub fn switch_workspace_down(&mut self) {
  function switch_workspace (line 2143) | pub fn switch_workspace(&mut self, idx: usize) {
  function switch_workspace_auto_back_and_forth (line 2150) | pub fn switch_workspace_auto_back_and_forth(&mut self, idx: usize) {
  function switch_workspace_previous (line 2157) | pub fn switch_workspace_previous(&mut self) {
  function consume_into_column (line 2164) | pub fn consume_into_column(&mut self) {
  function expel_from_column (line 2171) | pub fn expel_from_column(&mut self) {
  function swap_window_in_direction (line 2178) | pub fn swap_window_in_direction(&mut self, direction: ScrollDirection) {
  function toggle_column_tabbed_display (line 2185) | pub fn toggle_column_tabbed_display(&mut self) {
  function set_column_display (line 2192) | pub fn set_column_display(&mut self, display: ColumnDisplay) {
  function center_column (line 2199) | pub fn center_column(&mut self) {
  function center_window (line 2206) | pub fn center_window(&mut self, id: Option<&W::Id>) {
  function center_visible_columns (line 2225) | pub fn center_visible_columns(&mut self) {
  function focus (line 2232) | pub fn focus(&self) -> Option<&W> {
  function focus_with_output (line 2236) | pub fn focus_with_output(&self) -> Option<(&W, &Output)> {
  function interactive_moved_window_under (line 2254) | pub fn interactive_moved_window_under(
  function window_under (line 2283) | pub fn window_under(
  function resize_edges_under (line 2292) | pub fn resize_edges_under(
  function workspace_under (line 2301) | pub fn workspace_under(
  function overview_zoom (line 2322) | pub fn overview_zoom(&self) -> f64 {
  function verify_invariants (line 2328) | fn verify_invariants(&self) {
  function advance_animations (line 2540) | pub fn advance_animations(&mut self) {
  function are_animations_ongoing (line 2684) | pub fn are_animations_ongoing(&self, output: Option<&Output>) -> bool {
  function update_render_elements (line 2726) | pub fn update_render_elements(&mut self, output: Option<&Output>) {
  function update_shaders (line 2764) | pub fn update_shaders(&mut self) {
  function update_insert_hint (line 2783) | fn update_insert_hint(&mut self, output: Option<&Output>) {
  function ensure_named_workspace (line 2852) | pub fn ensure_named_workspace(&mut self, ws_config: &WorkspaceConfig) {
  function update_config (line 2894) | pub fn update_config(&mut self, config: &Config) {
  function update_options (line 2906) | fn update_options(&mut self, options: Options) {
  function toggle_width (line 2935) | pub fn toggle_width(&mut self, forwards: bool) {
  function toggle_window_width (line 2942) | pub fn toggle_window_width(&mut self, window: Option<&W::Id>, forwards: ...
  function toggle_window_height (line 2965) | pub fn toggle_window_height(&mut self, window: Option<&W::Id>, forwards:...
  function toggle_full_width (line 2988) | pub fn toggle_full_width(&mut self) {
  function set_column_width (line 2995) | pub fn set_column_width(&mut self, change: SizeChange) {
  function set_window_width (line 3002) | pub fn set_window_width(&mut self, window: Option<&W::Id>, change: SizeC...
  function set_window_height (line 3025) | pub fn set_window_height(&mut self, window: Option<&W::Id>, change: Size...
  function reset_window_height (line 3048) | pub fn reset_window_height(&mut self, window: Option<&W::Id>) {
  function expand_column_to_available_width (line 3071) | pub fn expand_column_to_available_width(&mut self) {
  function toggle_window_floating (line 3078) | pub fn toggle_window_floating(&mut self, window: Option<&W::Id>) {
  function set_window_floating (line 3141) | pub fn set_window_floating(&mut self, window: Option<&W::Id>, floating: ...
  function focus_floating (line 3167) | pub fn focus_floating(&mut self) {
  function focus_tiling (line 3174) | pub fn focus_tiling(&mut self) {
  function switch_focus_floating_tiling (line 3181) | pub fn switch_focus_floating_tiling(&mut self) {
  function move_floating_window (line 3188) | pub fn move_floating_window(
  function focus_output (line 3213) | pub fn focus_output(&mut self, output: &Output) {
  function move_to_output (line 3229) | pub fn move_to_output(
  function move_column_to_output (line 3331) | pub fn move_column_to_output(
  function move_workspace_to_output (line 3367) | pub fn move_workspace_to_output(&mut self, output: &Output) -> bool {
  function move_workspace_to_output_by_id (line 3382) | pub fn move_workspace_to_output_by_id(
  function set_fullscreen (line 3442) | pub fn set_fullscreen(&mut self, id: &W::Id, is_fullscreen: bool) {
  function toggle_fullscreen (line 3471) | pub fn toggle_fullscreen(&mut self, id: &W::Id) {
  function toggle_windowed_fullscreen (line 3486) | pub fn toggle_windowed_fullscreen(&mut self, id: &W::Id) {
  function set_maximized (line 3506) | pub fn set_maximized(&mut self, id: &W::Id, maximize: bool) {
  function toggle_maximized (line 3521) | pub fn toggle_maximized(&mut self, id: &W::Id) {
  function workspace_switch_gesture_begin (line 3536) | pub fn workspace_switch_gesture_begin(&mut self, output: &Output, is_tou...
  function workspace_switch_gesture_update (line 3553) | pub fn workspace_switch_gesture_update(
  function workspace_switch_gesture_end (line 3579) | pub fn workspace_switch_gesture_end(&mut self, is_touchpad: Option<bool>...
  function view_offset_gesture_begin (line 3594) | pub fn view_offset_gesture_begin(
  function view_offset_gesture_update (line 3620) | pub fn view_offset_gesture_update(
  function view_offset_gesture_end (line 3651) | pub fn view_offset_gesture_end(&mut self, is_touchpad: Option<bool>) -> ...
  function overview_gesture_begin (line 3668) | pub fn overview_gesture_begin(&mut self) {
  function overview_gesture_update (line 3682) | pub fn overview_gesture_update(&mut self, delta_y: f64, timestamp: Durat...
  function overview_gesture_end (line 3704) | pub fn overview_gesture_end(&mut self) -> bool {
  function interactive_move_begin (line 3739) | pub fn interactive_move_begin(
  function interactive_move_update (line 3800) | pub fn interactive_move_update(
  function interactive_move_end (line 4027) | pub fn interactive_move_end(&mut self, window: &W::Id) {
  function interactive_move_is_moving_above_output (line 4293) | pub fn interactive_move_is_moving_above_output(&self, output: &Output) -...
  function dnd_update (line 4301) | pub fn dnd_update(&mut self, output: Output, pointer_pos_within_output: ...
  function dnd_end (line 4321) | pub fn dnd_end(&mut self) {
  function interactive_resize_begin (line 4337) | pub fn interactive_resize_begin(&mut self, window: W::Id, edges: ResizeE...
  function interactive_resize_update (line 4360) | pub fn interactive_resize_update(
  function interactive_resize_end (line 4393) | pub fn interactive_resize_end(&mut self, window: &W::Id) {
  function move_workspace_down (line 4422) | pub fn move_workspace_down(&mut self) {
  function move_workspace_up (line 4429) | pub fn move_workspace_up(&mut self) {
  function move_workspace_to_idx (line 4436) | pub fn move_workspace_to_idx(
  function set_workspace_name (line 4467) | pub fn set_workspace_name(&mut self, name: String, reference: Option<Wor...
  function unset_workspace_name (line 4517) | pub fn unset_workspace_name(&mut self, reference: Option<WorkspaceRefere...
  function set_monitors_overview_state (line 4531) | pub fn set_monitors_overview_state(&mut self) {
  function toggle_overview (line 4542) | pub fn toggle_overview(&mut self) {
  function open_overview (line 4559) | pub fn open_overview(&mut self) -> bool {
  function close_overview (line 4568) | pub fn close_overview(&mut self) -> bool {
  function toggle_overview_to_workspace (line 4577) | pub fn toggle_overview_to_workspace(&mut self, ws_idx: usize) {
  function start_open_animation_for_window (line 4585) | pub fn start_open_animation_for_window(&mut self, window: &W::Id) {
  function store_unmap_snapshot (line 4599) | pub fn store_unmap_snapshot(&mut self, renderer: &mut GlesRenderer, wind...
  function clear_unmap_snapshot (line 4631) | pub fn clear_unmap_snapshot(&mut self, window: &W::Id) {
  function start_close_animation_for_window (line 4661) | pub fn start_close_animation_for_window(
  function render_interactive_move_for_output (line 4722) | pub fn render_interactive_move_for_output<R: NiriRenderer>(
  function refresh (line 4755) | pub fn refresh(&mut self, is_active: bool) {
  function workspaces (line 4836) | pub fn workspaces(
  function workspaces_mut (line 4870) | pub fn workspaces_mut(&mut self) -> impl Iterator<Item = &mut Workspace<...
  function windows (line 4896) | pub fn windows(&self) -> impl Iterator<Item = (Option<&Monitor<W>>, &W)> {
  function has_window (line 4911) | pub fn has_window(&self, window: &W::Id) -> bool {
  function is_overview_open (line 4915) | pub fn is_overview_open(&self) -> bool {
  method default (line 4921) | fn default() -> Self {
  function compute_overview_zoom (line 4926) | fn compute_overview_zoom(options: &Options, overview_progress: Option<f6...

FILE: src/layout/monitor.rs
  constant WORKSPACE_GESTURE_MOVEMENT (line 35) | const WORKSPACE_GESTURE_MOVEMENT: f64 = 300.;
  constant WORKSPACE_GESTURE_RUBBER_BAND (line 37) | const WORKSPACE_GESTURE_RUBBER_BAND: RubberBand = RubberBand {
  constant WORKSPACE_DND_EDGE_SCROLL_MOVEMENT (line 45) | const WORKSPACE_DND_EDGE_SCROLL_MOVEMENT: f64 = 1500.;
  type Monitor (line 48) | pub struct Monitor<W: LayoutElement> {
  type WorkspaceSwitch (line 93) | pub enum WorkspaceSwitch {
    method current_idx (line 199) | pub fn current_idx(&self) -> f64 {
    method target_idx (line 208) | pub fn target_idx(&self) -> f64 {
    method offset (line 215) | pub fn offset(&mut self, delta: isize) {
    method is_animation_ongoing (line 230) | fn is_animation_ongoing(&self) -> bool {
  type WorkspaceSwitchGesture (line 99) | pub struct WorkspaceSwitchGesture {
    method min_max (line 239) | fn min_max(&self, workspace_count: usize) -> (f64, f64) {
    method animate_from (line 249) | fn animate_from(&mut self, from: f64, clock: Clock, config: niri_confi...
  type InsertPosition (line 129) | pub(super) enum InsertPosition {
  type InsertWorkspace (line 136) | pub(super) enum InsertWorkspace {
    method existing_id (line 256) | fn existing_id(self) -> Option<WorkspaceId> {
  type InsertHint (line 142) | pub(super) struct InsertHint {
  type InsertHintRenderLoc (line 149) | struct InsertHintRenderLoc {
  type OverviewProgress (line 155) | pub(super) enum OverviewProgress {
    method value (line 265) | pub fn value(&self) -> f64 {
    method clamped_value (line 272) | pub fn clamped_value(&self) -> f64 {
    method from (line 281) | fn from(value: &super::OverviewProgress) -> Self {
  type MonitorAddWindowTarget (line 162) | pub enum MonitorAddWindowTarget<'a, W: LayoutElement> {
  method clone (line 180) | fn clone(&self) -> Self {
  type MonitorRenderElement (line 195) | pub type MonitorRenderElement<R> =
  function new (line 291) | pub fn new(
  function into_workspaces (line 351) | pub fn into_workspaces(mut self) -> Vec<Workspace<W>> {
  function output (line 361) | pub fn output(&self) -> &Output {
  function output_name (line 365) | pub fn output_name(&self) -> &String {
  function active_workspace_idx (line 369) | pub fn active_workspace_idx(&self) -> usize {
  function active_workspace_ref (line 373) | pub fn active_workspace_ref(&self) -> &Workspace<W> {
  function find_named_workspace (line 377) | pub fn find_named_workspace(&self, workspace_name: &str) -> Option<&Work...
  function find_named_workspace_index (line 385) | pub fn find_named_workspace_index(&self, workspace_name: &str) -> Option...
  function active_workspace (line 393) | pub fn active_workspace(&mut self) -> &mut Workspace<W> {
  function windows (line 397) | pub fn windows(&self) -> impl Iterator<Item = &W> {
  function has_window (line 401) | pub fn has_window(&self, window: &W::Id) -> bool {
  function add_workspace_at (line 405) | pub fn add_workspace_at(&mut self, idx: usize) {
  function add_workspace_top (line 424) | pub fn add_workspace_top(&mut self) {
  function add_workspace_bottom (line 428) | pub fn add_workspace_bottom(&mut self) {
  function activate_workspace (line 432) | pub fn activate_workspace(&mut self, idx: usize) {
  function activate_workspace_with_anim_config (line 436) | pub fn activate_workspace_with_anim_config(
  function resolve_add_window_target (line 484) | pub(super) fn resolve_add_window_target<'a>(
  function add_window (line 512) | pub fn add_window(
  function add_column (line 536) | pub fn add_column(&mut self, mut workspace_idx: usize, column: Column<W>...
  function add_tile (line 560) | pub fn add_tile(
  function add_tile_to_column (line 597) | pub fn add_tile_to_column(
  function clean_up_workspaces (line 624) | pub fn clean_up_workspaces(&mut self) {
  function unname_workspace (line 655) | pub fn unname_workspace(&mut self, id: WorkspaceId) -> bool {
  function remove_workspace_by_idx (line 669) | pub fn remove_workspace_by_idx(&mut self, mut idx: usize) -> Workspace<W> {
  function insert_workspace (line 694) | pub fn insert_workspace(&mut self, mut ws: Workspace<W>, mut idx: usize,...
  function append_workspaces (line 723) | pub fn append_workspaces(&mut self, mut workspaces: Vec<Workspace<W>>) {
  function move_down_or_to_workspace_down (line 760) | pub fn move_down_or_to_workspace_down(&mut self) {
  function move_up_or_to_workspace_up (line 766) | pub fn move_up_or_to_workspace_up(&mut self) {
  function focus_window_or_workspace_down (line 772) | pub fn focus_window_or_workspace_down(&mut self) {
  function focus_window_or_workspace_up (line 778) | pub fn focus_window_or_workspace_up(&mut self) {
  function move_to_workspace_up (line 784) | pub fn move_to_workspace_up(&mut self, focus: bool) {
  function move_to_workspace_down (line 818) | pub fn move_to_workspace_down(&mut self, focus: bool) {
  function move_to_workspace (line 852) | pub fn move_to_workspace(
  function move_column_to_workspace_up (line 909) | pub fn move_column_to_workspace_up(&mut self, activate: bool) {
  function move_column_to_workspace_down (line 930) | pub fn move_column_to_workspace_down(&mut self, activate: bool) {
  function move_column_to_workspace (line 951) | pub fn move_column_to_workspace(&mut self, idx: usize, activate: bool) {
  function switch_workspace_up (line 977) | pub fn switch_workspace_up(&mut self) {
  function switch_workspace_down (line 991) | pub fn switch_workspace_down(&mut self) {
  function previous_workspace_idx (line 1005) | fn previous_workspace_idx(&self) -> Option<usize> {
  function switch_workspace (line 1010) | pub fn switch_workspace(&mut self, idx: usize) {
  function switch_workspace_auto_back_and_forth (line 1014) | pub fn switch_workspace_auto_back_and_forth(&mut self, idx: usize) {
  function switch_workspace_previous (line 1026) | pub fn switch_workspace_previous(&mut self) {
  function active_window (line 1032) | pub fn active_window(&self) -> Option<&W> {
  function advance_animations (line 1036) | pub fn advance_animations(&mut self) {
  function are_animations_ongoing (line 1076) | pub(super) fn are_animations_ongoing(&self) -> bool {
  function are_transitions_ongoing (line 1083) | pub fn are_transitions_ongoing(&self) -> bool {
  function update_render_elements (line 1091) | pub fn update_render_elements(&mut self, is_active: bool) {
  function update_config (line 1185) | pub fn update_config(&mut self, base_options: Rc<Options>) {
  function update_layout_config (line 1212) | pub fn update_layout_config(&mut self, layout_config: Option<niri_config...
  function update_shaders (line 1223) | pub fn update_shaders(&mut self) {
  function update_output_size (line 1231) | pub fn update_output_size(&mut self) {
  function move_workspace_down (line 1241) | pub fn move_workspace_down(&mut self) {
  function move_workspace_up (line 1267) | pub fn move_workspace_up(&mut self) {
  function move_workspace_to_idx (line 1293) | pub fn move_workspace_to_idx(&mut self, old_idx: usize, new_idx: usize) {
  function active_tile_visual_rectangle (line 1347) | pub fn active_tile_visual_rectangle(&self) -> Option<Rectangle<f64, Logi...
  function workspace_size (line 1355) | fn workspace_size(&self, zoom: f64) -> Size<f64, Logical> {
  function workspace_gap (line 1361) | fn workspace_gap(&self, zoom: f64) -> f64 {
  function workspace_size_with_gap (line 1367) | fn workspace_size_with_gap(&self, zoom: f64) -> Size<f64, Logical> {
  function overview_zoom (line 1372) | pub fn overview_zoom(&self) -> f64 {
  function set_overview_progress (line 1377) | pub(super) fn set_overview_progress(&mut self, progress: Option<&super::...
  function overview_progress_value (line 1394) | pub(super) fn overview_progress_value(&self) -> Option<f64> {
  function workspace_render_idx (line 1398) | pub fn workspace_render_idx(&self) -> f64 {
  function workspaces_render_geo (line 1473) | pub fn workspaces_render_geo(&self) -> impl Iterator<Item = Rectangle<f6...
  function workspaces_with_render_geo (line 1504) | pub fn workspaces_with_render_geo(
  function workspaces_with_render_geo_idx (line 1515) | pub fn workspaces_with_render_geo_idx(
  function workspaces_with_render_geo_mut (line 1526) | pub fn workspaces_with_render_geo_mut(
  function workspace_under (line 1538) | pub fn workspace_under(
  function workspace_under_narrow (line 1553) | pub fn workspace_under_narrow(
  function window_under (line 1561) | pub fn window_under(&self, pos_within_output: Point<f64, Logical>) -> Op...
  function resize_edges_under (line 1577) | pub fn resize_edges_under(&self, pos_within_output: Point<f64, Logical>)...
  function insert_position (line 1586) | pub(super) fn insert_position(
  function render_above_top_layer (line 1635) | pub fn render_above_top_layer(&self) -> bool {
  function render_insert_hint_between_workspaces (line 1645) | pub fn render_insert_hint_between_workspaces<R: NiriRenderer>(
  function render_workspaces (line 1670) | pub fn render_workspaces<R: NiriRenderer>(
  function render_workspace_shadows (line 1750) | pub fn render_workspace_shadows<R: NiriRenderer>(
  function workspace_switch_gesture_begin (line 1780) | pub fn workspace_switch_gesture_begin(&mut self, is_touchpad: bool) {
  function dnd_scroll_gesture_begin (line 1798) | pub fn dnd_scroll_gesture_begin(&mut self) {
  function workspace_switch_gesture_update (line 1830) | pub fn workspace_switch_gesture_update(
  function dnd_scroll_gesture_scroll (line 1882) | pub fn dnd_scroll_gesture_scroll(&mut self, pos: Point<f64, Logical>, sp...
  function workspace_switch_gesture_end (line 1967) | pub fn workspace_switch_gesture_end(&mut self, is_touchpad: Option<bool>...
  function dnd_scroll_gesture_end (line 2024) | pub fn dnd_scroll_gesture_end(&mut self) {
  function scale (line 2039) | pub fn scale(&self) -> smithay::output::Scale {
  function view_size (line 2043) | pub fn view_size(&self) -> Size<f64, Logical> {
  function working_area (line 2047) | pub fn working_area(&self) -> Rectangle<f64, Logical> {
  function layout_config (line 2051) | pub fn layout_config(&self) -> Option<&niri_config::LayoutPart> {
  function verify_invariants (line 2056) | pub(super) fn verify_invariants(&self) {

FILE: src/layout/opening_window.rs
  type OpenAnimation (line 21) | pub struct OpenAnimation {
    method new (line 35) | pub fn new(anim: Animation) -> Self {
    method is_done (line 43) | pub fn is_done(&self) -> bool {
    method render (line 49) | pub fn render(

FILE: src/layout/scrolling.rs
  constant VIEW_GESTURE_WORKING_AREA_MOVEMENT (line 30) | const VIEW_GESTURE_WORKING_AREA_MOVEMENT: f64 = 1200.;
  type ScrollingSpace (line 34) | pub struct ScrollingSpace<W: LayoutElement> {
  type ColumnData (line 106) | struct ColumnData {
    method new (line 3879) | pub fn new<W: LayoutElement>(column: &Column<W>) -> Self {
    method update (line 3885) | pub fn update<W: LayoutElement>(&mut self, column: &Column<W>) {
  type ViewOffset (line 112) | pub(super) enum ViewOffset {
    method current (line 3795) | pub fn current(&self) -> f64 {
    method target (line 3807) | pub fn target(&self) -> f64 {
    method stationary (line 3819) | fn stationary(&self) -> f64 {
    method is_static (line 3828) | pub fn is_static(&self) -> bool {
    method is_gesture (line 3832) | pub fn is_gesture(&self) -> bool {
    method is_dnd_scroll (line 3836) | pub fn is_dnd_scroll(&self) -> bool {
    method is_animation_ongoing (line 3840) | pub fn is_animation_ongoing(&self) -> bool {
    method offset (line 3848) | pub fn offset(&mut self, delta: f64) {
    method cancel_gesture (line 3860) | pub fn cancel_gesture(&mut self) {
    method stop_anim_and_gesture (line 3866) | pub fn stop_anim_and_gesture(&mut self) {
  type ViewGesture (line 122) | pub(super) struct ViewGesture {
    method animate_from (line 3872) | fn animate_from(&mut self, from: f64, clock: Clock, config: niri_confi...
  type Column (line 145) | pub struct Column<W: LayoutElement> {
  type TileData (line 220) | struct TileData {
    method new (line 3891) | pub fn new<W: LayoutElement>(tile: &Tile<W>, height: WindowHeight) -> ...
    method update (line 3901) | pub fn update<W: LayoutElement>(&mut self, tile: &Tile<W>) {
  type ColumnWidth (line 235) | pub enum ColumnWidth {
    method from (line 3911) | fn from(value: PresetSize) -> Self {
  type WindowHeight (line 256) | pub enum WindowHeight {
    method auto_1 (line 3920) | const fn auto_1() -> Self {
  type ScrollDirection (line 273) | pub enum ScrollDirection {
  type MoveAnimation (line 279) | struct MoveAnimation {
  function new (line 285) | pub fn new(
  function update_config (line 312) | pub fn update_config(
  function update_shaders (line 338) | pub fn update_shaders(&mut self) {
  function advance_animations (line 344) | pub fn advance_animations(&mut self) {
  function are_animations_ongoing (line 386) | pub fn are_animations_ongoing(&self) -> bool {
  function are_transitions_ongoing (line 392) | pub fn are_transitions_ongoing(&self) -> bool {
  function update_render_elements (line 398) | pub fn update_render_elements(&mut self, is_active: bool) {
  function tiles (line 411) | pub fn tiles(&self) -> impl Iterator<Item = &Tile<W>> + '_ {
  function tiles_mut (line 415) | pub fn tiles_mut(&mut self) -> impl Iterator<Item = &mut Tile<W>> + '_ {
  function is_empty (line 419) | pub fn is_empty(&self) -> bool {
  function active_window (line 423) | pub fn active_window(&self) -> Option<&W> {
  function active_window_mut (line 432) | pub fn active_window_mut(&mut self) -> Option<&mut W> {
  function active_tile_mut (line 441) | pub fn active_tile_mut(&mut self) -> Option<&mut Tile<W>> {
  function is_active_pending_fullscreen (line 450) | pub fn is_active_pending_fullscreen(&self) -> bool {
  function new_window_toplevel_bounds (line 459) | pub fn new_window_toplevel_bounds(&self, rules: &ResolvedWindowRules) ->...
  function new_window_size (line 480) | pub fn new_window_size(
  function is_centering_focused_column (line 539) | pub fn is_centering_focused_column(&self) -> bool {
  function compute_new_view_offset_fit (line 544) | fn compute_new_view_offset_fit(
  function compute_new_view_offset_centered (line 570) | fn compute_new_view_offset_centered(
  function compute_new_view_offset_for_column_fit (line 595) | fn compute_new_view_offset_for_column_fit(&self, target_x: Option<f64>, ...
  function compute_new_view_offset_for_column_centered (line 605) | fn compute_new_view_offset_for_column_centered(
  function compute_new_view_offset_for_column (line 619) | fn compute_new_view_offset_for_column(
  function animate_view_offset (line 679) | fn animate_view_offset(&mut self, idx: usize, new_view_offset: f64) {
  function animate_view_offset_with_config (line 687) | fn animate_view_offset_with_config(
  function animate_view_offset_to_column_centered (line 733) | fn animate_view_offset_to_column_centered(
  function animate_view_offset_to_column_with_config (line 743) | fn animate_view_offset_to_column_with_config(
  function animate_view_offset_to_column (line 754) | fn animate_view_offset_to_column(
  function activate_column (line 768) | fn activate_column(&mut self, idx: usize) {
  function activate_column_with_anim_config (line 775) | fn activate_column_with_anim_config(&mut self, idx: usize, config: niri_...
  function insert_position (line 800) | pub(super) fn insert_position(&self, pos: Point<f64, Logical>) -> Insert...
  function add_tile (line 867) | pub fn add_tile(
  function add_tile_to_column (line 889) | pub fn add_tile_to_column(
  function add_tile_right_of (line 944) | pub fn add_tile_right_of(
  function add_column (line 962) | pub fn add_column(
  function remove_active_tile (line 1025) | pub fn remove_active_tile(&mut self, transaction: Transaction) -> Option...
  function remove_tile (line 1039) | pub fn remove_tile(&mut self, window: &W::Id, transaction: Transaction) ...
  function remove_tile_by_idx (line 1051) | pub fn remove_tile_by_idx(
  function remove_active_column (line 1153) | pub fn remove_active_column(&mut self) -> Option<Column<W>> {
  function remove_column_by_idx (line 1161) | pub fn remove_column_by_idx(
  function update_window (line 1247) | pub fn update_window(&mut self, window: &W::Id, serial: Option<Serial>) {
  function scroll_amount_to_activate (line 1409) | pub fn scroll_amount_to_activate(&self, window: &W::Id) -> f64 {
  function activate_window (line 1434) | pub fn activate_window(&mut self, window: &W::Id) -> bool {
  function start_close_animation_for_window (line 1447) | pub fn start_close_animation_for_window(
  function start_close_animation_for_tile (line 1508) | fn start_close_animation_for_tile(
  function start_open_animation (line 1544) | pub fn start_open_animation(&mut self, id: &W::Id) -> bool {
  function focus_left (line 1550) | pub fn focus_left(&mut self) -> bool {
  function focus_right (line 1558) | pub fn focus_right(&mut self) -> bool {
  function focus_column_first (line 1567) | pub fn focus_column_first(&mut self) {
  function focus_column_last (line 1571) | pub fn focus_column_last(&mut self) {
  function focus_column (line 1579) | pub fn focus_column(&mut self, index: usize) {
  function focus_window_in_column (line 1587) | pub fn focus_window_in_column(&mut self, index: u8) {
  function focus_down (line 1595) | pub fn focus_down(&mut self) -> bool {
  function focus_up (line 1603) | pub fn focus_up(&mut self) -> bool {
  function focus_down_or_left (line 1611) | pub fn focus_down_or_left(&mut self) {
  function focus_down_or_right (line 1622) | pub fn focus_down_or_right(&mut self) {
  function focus_up_or_left (line 1633) | pub fn focus_up_or_left(&mut self) {
  function focus_up_or_right (line 1644) | pub fn focus_up_or_right(&mut self) {
  function focus_top (line 1655) | pub fn focus_top(&mut self) {
  function focus_bottom (line 1663) | pub fn focus_bottom(&mut self) {
  function move_column_to_index (line 1671) | pub fn move_column_to_index(&mut self, index: usize) {
  function move_column_to (line 1679) | fn move_column_to(&mut self, new_idx: usize) {
  function move_left (line 1716) | pub fn move_left(&mut self) -> bool {
  function move_right (line 1725) | pub fn move_right(&mut self) -> bool {
  function move_column_to_first (line 1735) | pub fn move_column_to_first(&mut self) {
  function move_column_to_last (line 1739) | pub fn move_column_to_last(&mut self) {
  function move_down (line 1748) | pub fn move_down(&mut self) -> bool {
  function move_up (line 1756) | pub fn move_up(&mut self) -> bool {
  function consume_or_expel_window_left (line 1764) | pub fn consume_or_expel_window_left(&mut self, window: Option<&W::Id>) {
  function consume_or_expel_window_right (line 1872) | pub fn consume_or_expel_window_right(&mut self, window: Option<&W::Id>) {
  function consume_into_column (line 1964) | pub fn consume_into_column(&mut self) {
  function expel_from_column (line 1993) | pub fn expel_from_column(&mut self) {
  function swap_window_in_direction (line 2031) | pub fn swap_window_in_direction(&mut self, direction: ScrollDirection) {
  function toggle_column_tabbed_display (line 2159) | pub fn toggle_column_tabbed_display(&mut self) {
  function set_column_display (line 2173) | pub fn set_column_display(&mut self, display: ColumnDisplay) {
  function center_column (line 2198) | pub fn center_column(&mut self) {
  function center_window (line 2213) | pub fn center_window(&mut self, window: Option<&W::Id>) {
  function center_visible_columns (line 2235) | pub fn center_visible_columns(&mut self) {
  function view_pos (line 2293) | pub fn view_pos(&self) -> f64 {
  function target_view_pos (line 2297) | pub fn target_view_pos(&self) -> f64 {
  function column_xs (line 2303) | fn column_xs(&self, data: impl Iterator<Item = ColumnData>) -> impl Iter...
  function column_x (line 2318) | fn column_x(&self, column_idx: usize) -> f64 {
  function column_xs_in_render_order (line 2324) | fn column_xs_in_render_order(
  function columns (line 2337) | pub fn columns(&self) -> impl Iterator<Item = &Column<W>> {
  function columns_mut (line 2341) | fn columns_mut(&mut self) -> impl Iterator<Item = (&mut Column<W>, f64)>...
  function columns_in_render_order (line 2346) | fn columns_in_render_order(&self) -> impl Iterator<Item = (&Column<W>, f...
  function columns_in_render_order_mut (line 2361) | fn columns_in_render_order_mut(&mut self) -> impl Iterator<Item = (&mut ...
  function tiles_with_render_positions (line 2376) | pub fn tiles_with_render_positions(
  function tiles_with_render_positions_mut (line 2396) | pub fn tiles_with_render_positions_mut(
  function tiles_with_ipc_layouts (line 2419) | pub fn tiles_with_ipc_layouts(&self) -> impl Iterator<Item = (&Tile<W>, ...
  function insert_hint_area (line 2435) | pub(super) fn insert_hint_area(
  function active_tile_visual_rectangle (line 2545) | pub fn active_tile_visual_rectangle(&self) -> Option<Rectangle<f64, Logi...
  function popup_target_rect (line 2561) | pub fn popup_target_rect(&self, id: &W::Id) -> Option<Rectangle<f64, Log...
  function toggle_width (line 2584) | pub fn toggle_width(&mut self, forwards: bool) {
  function toggle_full_width (line 2595) | pub fn toggle_full_width(&mut self) {
  function set_window_width (line 2606) | pub fn set_window_width(&mut self, window: Option<&W::Id>, change: SizeC...
  function set_window_height (line 2630) | pub fn set_window_height(&mut self, window: Option<&W::Id>, change: Size...
  function reset_window_height (line 2654) | pub fn reset_window_height(&mut self, window: Option<&W::Id>) {
  function toggle_window_width (line 2678) | pub fn toggle_window_width(&mut self, window: Option<&W::Id>, forwards: ...
  function toggle_window_height (line 2702) | pub fn toggle_window_height(&mut self, window: Option<&W::Id>, forwards:...
  function expand_column_to_available_width (line 2726) | pub fn expand_column_to_available_width(&mut self) {
  function set_fullscreen (line 2823) | pub fn set_fullscreen(&mut self, window: &W::Id, is_fullscreen: bool) ->...
  function set_maximized (line 2854) | pub fn set_maximized(&mut self, window: &W::Id, maximize: bool) -> bool {
  function render_above_top_layer (line 2885) | pub fn render_above_top_layer(&self) -> bool {
  function render (line 2900) | pub fn render<R: NiriRenderer>(
  function window_under (line 2965) | pub fn window_under(&self, pos: Point<f64, Logical>) -> Option<(&W, HitT...
  function view_offset_gesture_begin (line 3010) | pub fn view_offset_gesture_begin(&mut self, is_touchpad: bool) {
  function dnd_scroll_gesture_begin (line 3032) | pub fn dnd_scroll_gesture_begin(&mut self) {
  function view_offset_gesture_update (line 3057) | pub fn view_offset_gesture_update(
  function dnd_scroll_gesture_scroll (line 3085) | pub fn dnd_scroll_gesture_scroll(&mut self, delta: f64) -> bool {
  function view_offset_gesture_end (line 3159) | pub fn view_offset_gesture_end(&mut self, is_touchpad: Option<bool>) -> ...
  function dnd_scroll_gesture_end (line 3487) | pub fn dnd_scroll_gesture_end(&mut self) {
  function interactive_resize_begin (line 3515) | pub fn interactive_resize_begin(&mut self, window: W::Id, edges: ResizeE...
  function interactive_resize_update (line 3550) | pub fn interactive_resize_update(
  function interactive_resize_end (line 3611) | pub fn interactive_resize_end(&mut self, window: Option<&W::Id>) {
  function refresh (line 3630) | pub fn refresh(&mut self, is_active: bool, is_focused: bool) {
  function view_size (line 3715) | pub fn view_size(&self) -> Size<f64, Logical> {
  function parent_area (line 3720) | pub fn parent_area(&self) -> Rectangle<f64, Logical> {
  function clock (line 3725) | pub fn clock(&self) -> &Clock {
  function options (line 3730) | pub fn options(&self) -> &Rc<Options> {
  function active_column_idx (line 3735) | pub fn active_column_idx(&self) -> usize {
  function view_offset (line 3740) | pub(super) fn view_offset(&self) -> &ViewOffset {
  function verify_invariants (line 3745) | pub fn verify_invariants(&self) {
  function new_with_tile (line 3927) | fn new_with_tile(
  function update_config (line 4004) | fn update_config(
  function update_shaders (line 4064) | pub fn update_shaders(&mut self) {
  function advance_animations (line 4072) | pub fn advance_animations(&mut self) {
  function are_animations_ongoing (line 4086) | pub fn are_animations_ongoing(&self) -> bool {
  function are_transitions_ongoing (line 4092) | pub fn are_transitions_ongoing(&self) -> bool {
  function update_render_elements (line 4098) | pub fn update_render_elements(&mut self, is_active: bool, view_rect: Rec...
  function is_pending_fullscreen (line 4136) | pub fn is_pending_fullscreen(&self) -> bool {
  function is_pending_maximized (line 4140) | pub fn is_pending_maximized(&self) -> bool {
  function pending_sizing_mode (line 4144) | pub fn pending_sizing_mode(&self) -> SizingMode {
  function render_offset (line 4154) | pub fn render_offset(&self) -> Point<f64, Logical> {
  function animate_move_from (line 4164) | pub fn animate_move_from(&mut self, from_x_offset: f64) {
  function animate_move_from_with_config (line 4171) | pub fn animate_move_from_with_config(
  function offset_move_anim_current (line 4188) | pub fn offset_move_anim_current(&mut self, offset: f64) {
  function sizing_mode (line 4227) | fn sizing_mode(&self) -> SizingMode {
  function contains (line 4264) | pub fn contains(&self, window: &W::Id) -> bool {
  function position (line 4271) | pub fn position(&self, window: &W::Id) -> Option<usize> {
  function activate_idx (line 4278) | fn activate_idx(&mut self, idx: usize) -> bool {
  function activate_window (line 4290) | fn activate_window(&mut self, window: &W::Id) {
  function add_tile_at (line 4295) | fn add_tile_at(&mut self, idx: usize, mut tile: Tile<W>) {
  function update_window (line 4324) | fn update_window(&mut self, window: &W::Id) {
  function extra_size (line 4381) | fn extra_size(&self) -> Size<f64, Logical> {
  function resolve_preset_width (line 4389) | fn resolve_preset_width(&self, preset: PresetSize) -> ResolvedSize {
  function resolve_preset_height (line 4394) | fn resolve_preset_height(&self, preset: PresetSize) -> ResolvedSize {
  function resolve_column_width (line 4399) | fn resolve_column_width(&self, width: ColumnWidth) -> f64 {
  function update_tile_sizes (line 4412) | fn update_tile_sizes(&mut self, animate: bool) {
  function update_tile_sizes_with_transaction (line 4416) | fn update_tile_sizes_with_transaction(&mut self, animate: bool, transact...
  function width (line 4710) | fn width(&self) -> f64 {
  function focus_index (line 4727) | fn focus_index(&mut self, index: u8) {
  function focus_up (line 4732) | fn focus_up(&mut self) -> bool {
  function focus_down (line 4736) | fn focus_down(&mut self) -> bool {
  function focus_top (line 4740) | fn focus_top(&mut self) {
  function focus_bottom (line 4744) | fn focus_bottom(&mut self) {
  function move_up (line 4748) | fn move_up(&mut self) -> bool {
  function move_down (line 4771) | fn move_down(&mut self) -> bool {
  function toggle_width (line 4794) | fn toggle_width(&mut self, tile_idx: Option<usize>, forwards: bool) {
  function toggle_full_width (line 4845) | fn toggle_full_width(&mut self) {
  function set_column_width (line 4857) | fn set_column_width(&mut self, change: SizeChange, tile_idx: Option<usiz...
  function set_window_height (line 4912) | fn set_window_height(&mut self, change: SizeChange, tile_idx: Option<usi...
  function reset_window_height (line 4991) | fn reset_window_height(&mut self, tile_idx: Option<usize>) {
  function toggle_window_height (line 5006) | fn toggle_window_height(&mut self, tile_idx: Option<usize>, forwards: bo...
  function convert_heights_to_auto (line 5068) | fn convert_heights_to_auto(&mut self) {
  function set_fullscreen (line 5083) | fn set_fullscreen(&mut self, is_fullscreen: bool) {
  function set_maximized (line 5096) | fn set_maximized(&mut self, maximize: bool) {
  function set_column_display (line 5109) | fn set_column_display(&mut self, display: ColumnDisplay) {
  function tiles_origin (line 5167) | fn tiles_origin(&self) -> Point<f64, Logical> {
  function tile_offsets_iter (line 5192) | fn tile_offsets_iter(
  function tile_offsets (line 5239) | fn tile_offsets(&self) -> impl Iterator<Item = Point<f64, Logical>> + '_ {
  function tile_offset (line 5243) | fn tile_offset(&self, tile_idx: usize) -> Point<f64, Logical> {
  function tile_offsets_in_render_order (line 5247) | fn tile_offsets_in_render_order(
  function tiles (line 5260) | pub fn tiles(&self) -> impl Iterator<Item = (&Tile<W>, Point<f64, Logica...
  function tiles_mut (line 5265) | fn tiles_mut(&mut self) -> impl Iterator<Item = (&mut Tile<W>, Point<f64...
  function tiles_in_render_order (line 5270) | fn tiles_in_render_order(
  function tiles_in_render_order_mut (line 5288) | fn tiles_in_render_order_mut(
  function tab_indicator_area (line 5300) | fn tab_indicator_area(&self) -> Rectangle<f64, Logical> {
  function start_open_animation (line 5328) | pub fn start_open_animation(&mut self, id: &W::Id) -> bool {
  function verify_invariants (line 5353) | fn verify_invariants(&self) {
  function compute_new_view_offset (line 5455) | fn compute_new_view_offset(
  function compute_working_area (line 5489) | fn compute_working_area(
  function compute_toplevel_bounds (line 5519) | fn compute_toplevel_bounds(
  function cancel_resize_for_column (line 5537) | fn cancel_resize_for_column<W: LayoutElement>(
  function resolve_preset_size (line 5552) | fn resolve_preset_size(
  function working_area_starts_at_physical_pixel (line 5574) | fn working_area_starts_at_physical_pixel() {
  function large_fractional_strut (line 5590) | fn large_fractional_strut() {

FILE: src/layout/shadow.rs
  type Shadow (line 10) | pub struct Shadow {
    method new (line 17) | pub fn new(config: niri_config::Shadow) -> Self {
    method update_config (line 25) | pub fn update_config(&mut self, config: niri_config::Shadow) {
    method update_shaders (line 29) | pub fn update_shaders(&mut self) {
    method update_render_elements (line 35) | pub fn update_render_elements(
    method render (line 165) | pub fn render(

FILE: src/layout/tab_indicator.rs
  type TabIndicator (line 18) | pub struct TabIndicator {
    method new (line 40) | pub fn new(config: niri_config::TabIndicator) -> Self {
    method update_config (line 49) | pub fn update_config(&mut self, config: niri_config::TabIndicator) {
    method update_shaders (line 53) | pub fn update_shaders(&mut self) {
    method advance_animations (line 59) | pub fn advance_animations(&mut self) {
    method are_animations_ongoing (line 67) | pub fn are_animations_ongoing(&self) -> bool {
    method start_open_animation (line 71) | pub fn start_open_animation(&mut self, clock: Clock, config: niri_conf...
    method tab_rects (line 75) | fn tab_rects(
    method update_render_elements (line 158) | pub fn update_render_elements(
    method hit (line 272) | pub fn hit(
    method render (line 293) | pub fn render(
    method extra_size (line 311) | pub fn extra_size(&self, tab_count: usize, scale: f64) -> Size<f64, Lo...
    method content_offset (line 334) | pub fn content_offset(&self, tab_count: usize, scale: f64) -> Point<f6...
    method config (line 343) | pub fn config(&self) -> niri_config::TabIndicator {
  type TabInfo (line 26) | pub struct TabInfo {
    method from_tile (line 349) | pub fn from_tile<W: LayoutElement>(

FILE: src/layout/tests.rs
  method default (line 20) | fn default() -> Self {
  type TestWindowInner (line 26) | struct TestWindowInner {
  type TestWindow (line 47) | struct TestWindow(Rc<TestWindowInner>);
    method new (line 78) | fn new(params: TestWindowParams) -> Self {
    method communicate (line 99) | fn communicate(&self) -> bool {
  type TestWindowParams (line 50) | struct TestWindowParams {
    method new (line 65) | pub fn new(id: usize) -> Self {
  type Id (line 151) | type Id = usize;
  method id (line 153) | fn id(&self) -> &Self::Id {
  method size (line 157) | fn size(&self) -> Size<i32, Logical> {
  method buf_loc (line 161) | fn buf_loc(&self) -> Point<i32, Logical> {
  method is_in_input_region (line 165) | fn is_in_input_region(&self, _point: Point<f64, Logical>) -> bool {
  method request_size (line 169) | fn request_size(
  method min_size (line 188) | fn min_size(&self) -> Size<i32, Logical> {
  method max_size (line 192) | fn max_size(&self) -> Size<i32, Logical> {
  method is_wl_surface (line 196) | fn is_wl_surface(&self, _wl_surface: &WlSurface) -> bool {
  method set_preferred_scale_transform (line 200) | fn set_preferred_scale_transform(&self, _scale: output::Scale, _transfor...
  method has_ssd (line 202) | fn has_ssd(&self) -> bool {
  method output_enter (line 206) | fn output_enter(&self, _output: &Output) {}
  method output_leave (line 208) | fn output_leave(&self, _output: &Output) {}
  method set_offscreen_data (line 210) | fn set_offscreen_data(&self, _data: Option<OffscreenData>) {}
  method set_activated (line 212) | fn set_activated(&mut self, active: bool) {
  method set_bounds (line 216) | fn set_bounds(&self, _bounds: Size<i32, Logical>) {}
  method is_ignoring_opacity_window_rule (line 218) | fn is_ignoring_opacity_window_rule(&self) -> bool {
  method configure_intent (line 222) | fn configure_intent(&self) -> ConfigureIntent {
  method send_pending_configure (line 226) | fn send_pending_configure(&mut self) {}
  method set_active_in_column (line 228) | fn set_active_in_column(&mut self, _active: bool) {}
  method set_floating (line 230) | fn set_floating(&mut self, _floating: bool) {}
  method sizing_mode (line 232) | fn sizing_mode(&self) -> SizingMode {
  method pending_sizing_mode (line 236) | fn pending_sizing_mode(&self) -> SizingMode {
  method requested_size (line 240) | fn requested_size(&self) -> Option<Size<i32, Logical>> {
  method is_pending_windowed_fullscreen (line 244) | fn is_pending_windowed_fullscreen(&self) -> bool {
  method request_windowed_fullscreen (line 248) | fn request_windowed_fullscreen(&mut self, value: bool) {
  method is_child_of (line 252) | fn is_child_of(&self, parent: &Self) -> bool {
  method refresh (line 256) | fn refresh(&self) {}
  method rules (line 258) | fn rules(&self) -> &ResolvedWindowRules {
  method take_animation_snapshot (line 262) | fn take_animation_snapshot(&mut self) -> Option<LayoutElementRenderSnaps...
  method set_interactive_resize (line 266) | fn set_interactive_resize(&mut self, _data: Option<InteractiveResizeData...
  method cancel_interactive_resize (line 268) | fn cancel_interactive_resize(&mut self) {}
  method on_commit (line 270) | fn on_commit(&mut self, _serial: Serial) {}
  method interactive_resize_data (line 272) | fn interactive_resize_data(&self) -> Option<InteractiveResizeData> {
  method is_urgent (line 276) | fn is_urgent(&self) -> bool {
  function arbitrary_size (line 281) | fn arbitrary_size() -> impl Strategy<Value = Size<i32, Logical>> {
  function arbitrary_bbox (line 285) | fn arbitrary_bbox() -> impl Strategy<Value = Rectangle<i32, Logical>> {
  function arbitrary_size_change (line 293) | fn arbitrary_size_change() -> impl Strategy<Value = SizeChange> {
  function arbitrary_position_change (line 304) | fn arbitrary_position_change() -> impl Strategy<Value = PositionChange> {
  function arbitrary_min_max (line 315) | fn arbitrary_min_max() -> impl Strategy<Value = (i32, i32)> {
  function arbitrary_min_max_size (line 325) | fn arbitrary_min_max_size() -> impl Strategy<Value = (Size<i32, Logical>...
  function arbitrary_view_offset_gesture_delta (line 354) | fn arbitrary_view_offset_gesture_delta() -> impl Strategy<Value = f64> {
  function arbitrary_resize_edge (line 358) | fn arbitrary_resize_edge() -> impl Strategy<Value = ResizeEdge> {
  function arbitrary_scale (line 372) | fn arbitrary_scale() -> impl Strategy<Value = f64> {
  function arbitrary_msec_delta (line 376) | fn arbitrary_msec_delta() -> impl Strategy<Value = i32> {
  function arbitrary_parent_id (line 386) | fn arbitrary_parent_id() -> impl Strategy<Value = Option<usize>> {
  function arbitrary_scroll_direction (line 393) | fn arbitrary_scroll_direction() -> impl Strategy<Value = ScrollDirection> {
  function arbitrary_column_display (line 397) | fn arbitrary_column_display() -> impl Strategy<Value = ColumnDisplay> {
  type Op (line 402) | enum Op {
    method apply (line 753) | fn apply(self, layout: &mut Layout<TestWindow>) {
  function check_ops_on_layout (line 1627) | fn check_ops_on_layout(layout: &mut Layout<TestWindow>, ops: impl IntoIt...
  function check_ops (line 1635) | fn check_ops(ops: impl IntoIterator<Item = Op>) -> Layout<TestWindow> {
  function check_ops_with_options (line 1642) | fn check_ops_with_options(
  function operations_dont_panic (line 1652) | fn operations_dont_panic() {
  function operations_from_starting_state_dont_panic (line 1766) | fn operations_from_starting_state_dont_panic() {
  function primary_active_workspace_idx_not_updated_on_output_add (line 1950) | fn primary_active_workspace_idx_not_updated_on_output_add() {
  function window_closed_on_previous_workspace (line 1971) | fn window_closed_on_previous_workspace() {
  function removing_output_must_keep_empty_focus_on_primary (line 1985) | fn removing_output_must_keep_empty_focus_on_primary() {
  function move_to_workspace_by_idx_does_not_leave_empty_workspaces (line 2007) | fn move_to_workspace_by_idx_does_not_leave_empty_workspaces() {
  function empty_workspaces_dont_move_back_to_original_output (line 2035) | fn empty_workspaces_dont_move_back_to_original_output() {
  function named_workspaces_dont_update_original_output_on_adding_window (line 2056) | fn named_workspaces_dont_update_original_output_on_adding_window() {
  function workspaces_update_original_output_on_moving_to_same_output (line 2086) | fn workspaces_update_original_output_on_moving_to_same_output() {
  function workspaces_update_original_output_on_moving_to_same_monitor (line 2111) | fn workspaces_update_original_output_on_moving_to_same_monitor() {
  function large_negative_height_change (line 2139) | fn large_negative_height_change() {
  function large_max_size (line 2159) | fn large_max_size() {
  function workspace_cleanup_during_switch (line 2178) | fn workspace_cleanup_during_switch() {
  function workspace_transfer_during_switch (line 2192) | fn workspace_transfer_during_switch() {
  function workspace_transfer_during_switch_from_last (line 2213) | fn workspace_transfer_during_switch_from_last() {
  function workspace_transfer_during_switch_gets_cleaned_up (line 2229) | fn workspace_transfer_during_switch_gets_cleaned_up() {
  function move_workspace_to_output (line 2246) | fn move_workspace_to_output() {
  function open_right_of_on_different_workspace (line 2277) | fn open_right_of_on_different_workspace() {
  function open_right_of_on_different_workspace_ewaf (line 2313) | fn open_right_of_on_different_workspace_ewaf() {
  function removing_all_outputs_preserves_empty_named_workspaces (line 2355) | fn removing_all_outputs_preserves_empty_named_workspaces() {
  function config_change_updates_cached_sizes (line 2381) | fn config_change_updates_cached_sizes() {
  function preset_height_change_removes_preset (line 2404) | fn preset_height_change_removes_preset() {
  function set_window_height_recomputes_to_auto (line 2435) | fn set_window_height_recomputes_to_auto() {
  function one_window_in_column_becomes_weight_1 (line 2464) | fn one_window_in_column_becomes_weight_1() {
  function fixed_height_takes_max_non_auto_into_account (line 2497) | fn fixed_height_takes_max_non_auto_into_account() {
  function start_interactive_move_then_remove_window (line 2529) | fn start_interactive_move_then_remove_window() {
  function interactive_move_onto_empty_output (line 2548) | fn interactive_move_onto_empty_output() {
  function interactive_move_onto_empty_output_ewaf (line 2576) | fn interactive_move_onto_empty_output_ewaf() {
  function interactive_move_onto_last_workspace (line 2611) | fn interactive_move_onto_last_workspace() {
  function interactive_move_onto_first_empty_workspace (line 2640) | fn interactive_move_onto_first_empty_workspace() {
  function output_active_workspace_is_preserved (line 2675) | fn output_active_workspace_is_preserved() {
  function output_active_workspace_is_preserved_with_other_outputs (line 2699) | fn output_active_workspace_is_preserved_with_other_outputs() {
  function named_workspace_to_output (line 2724) | fn named_workspace_to_output() {
  function named_workspace_to_output_ewaf (line 2740) | fn named_workspace_to_output_ewaf() {
  function move_window_to_empty_workspace_above_first (line 2761) | fn move_window_to_empty_workspace_above_first() {
  function move_window_to_different_output (line 2783) | fn move_window_to_different_output() {
  function close_window_empty_ws_above_first (line 2803) | fn close_window_empty_ws_above_first() {
  function add_and_remove_output (line 2822) | fn add_and_remove_output() {
  function switch_ewaf_on (line 2842) | fn switch_ewaf_on() {
  function switch_ewaf_off (line 2862) | fn switch_ewaf_off() {
  function interactive_move_drop_on_other_output_during_animation (line 2883) | fn interactive_move_drop_on_other_output_during_animation() {
  function add_window_next_to_only_interactively_moved_without_outputs (line 2912) | fn add_window_next_to_only_interactively_moved_without_outputs() {
  function interactive_move_toggle_floating_ends_dnd_gesture (line 2945) | fn interactive_move_toggle_floating_ends_dnd_gesture() {
  function interactive_move_from_workspace_with_layout_config (line 2974) | fn interactive_move_from_workspace_with_layout_config() {
  function set_width_fixed_negative (line 3033) | fn set_width_fixed_negative() {
  function set_height_fixed_negative (line 3046) | fn set_height_fixed_negative() {
  function interactive_resize_to_negative (line 3062) | fn interactive_resize_to_negative() {
  function windows_on_other_workspaces_remain_activated (line 3083) | fn windows_on_other_workspaces_remain_activated() {
  function stacking_add_parent_brings_up_child (line 3099) | fn stacking_add_parent_brings_up_child() {
  function stacking_add_parent_brings_up_descendants (line 3121) | fn stacking_add_parent_brings_up_descendants() {
  function stacking_activate_brings_up_descendants (line 3150) | fn stacking_activate_brings_up_descendants() {
  function stacking_set_parent_brings_up_child (line 3186) | fn stacking_set_parent_brings_up_child() {
  function move_window_to_workspace_with_different_active_output (line 3211) | fn move_window_to_workspace_with_different_active_output() {
  function set_first_workspace_name (line 3229) | fn set_first_workspace_name() {
  function set_first_workspace_name_ewaf (line 3242) | fn set_first_workspace_name_ewaf() {
  function set_last_workspace_name (line 3262) | fn set_last_workspace_name() {
  function move_workspace_to_same_monitor_doesnt_reorder (line 3279) | fn move_workspace_to_same_monitor_doesnt_reorder() {
  function removing_window_above_preserves_focused_window (line 3311) | fn removing_window_above_preserves_focused_window() {
  function preset_column_width_fixed_correct_with_border (line 3336) | fn preset_column_width_fixed_correct_with_border() {
  function preset_column_width_reset_after_set_width (line 3383) | fn preset_column_width_reset_after_set_width() {
  function move_column_to_workspace_unfocused_with_multiple_monitors (line 3410) | fn move_column_to_workspace_unfocused_with_multiple_monitors() {
  function move_column_to_workspace_down_focus_false_on_floating_window (line 3473) | fn move_column_to_workspace_down_focus_false_on_floating_window() {
  function move_column_to_workspace_focus_false_on_floating_window (line 3496) | fn move_column_to_workspace_focus_false_on_floating_window() {
  function restore_to_floating_persists_across_fullscreen_maximize (line 3519) | fn restore_to_floating_persists_across_fullscreen_maximize() {
  function unmaximize_during_fullscreen_does_not_float (line 3551) | fn unmaximize_during_fullscreen_does_not_float() {
  function move_column_to_workspace_maximize_and_fullscreen (line 3583) | fn move_column_to_workspace_maximize_and_fullscreen() {
  function move_window_to_workspace_maximize_and_fullscreen (line 3603) | fn move_window_to_workspace_maximize_and_fullscreen() {
  function tabs_with_different_border (line 3628) | fn tabs_with_different_border() {
  function expel_pending_left_from_fullscreen_tabbed_column (line 3667) | fn expel_pending_left_from_fullscreen_tabbed_column() {
  function workspace_render_geo_at_fractional_scale (line 3695) | fn workspace_render_geo_at_fractional_scale() {
  function parent_id_causes_loop (line 3729) | fn parent_id_causes_loop(layout: &Layout<TestWindow>, id: usize, mut par...
  function arbitrary_spacing (line 3758) | fn arbitrary_spacing() -> impl Strategy<Value = f64> {
  function arbitrary_spacing_neg (line 3766) | fn arbitrary_spacing_neg() -> impl Strategy<Value = f64> {
  function arbitrary_struts (line 3775) | fn arbitrary_struts() -> impl Strategy<Value = Struts> {
  function arbitrary_center_focused_column (line 3790) | fn arbitrary_center_focused_column() -> impl Strategy<Value = CenterFocu...
  function arbitrary_tab_indicator_position (line 3798) | fn arbitrary_tab_indicator_position() -> impl Strategy<Value = TabIndica...

FILE: src/layout/tests/animations.rs
  function format_tiles (line 8) | fn format_tiles(layout: &Layout<TestWindow>) -> String {
  function make_options (line 25) | fn make_options() -> Options {
  function set_up_two_in_column (line 44) | fn set_up_two_in_column() -> Layout<TestWindow> {
  function height_resize_animates_next_y (line 72) | fn height_resize_animates_next_y() {
  function clientside_height_change_doesnt_animate (line 117) | fn clientside_height_change_doesnt_animate() {
  function height_resize_and_back (line 146) | fn height_resize_and_back() {
  function height_resize_and_cancel (line 223) | fn height_resize_and_cancel() {
  function height_resize_and_back_during_another_y_anim (line 293) | fn height_resize_and_back_during_another_y_anim() {
  function height_resize_and_cancel_during_another_y_anim (line 426) | fn height_resize_and_cancel_during_another_y_anim() {
  function height_resize_before_another_y_anim_then_back (line 546) | fn height_resize_before_another_y_anim_then_back() {
  function height_resize_before_another_y_anim_then_cancel (line 661) | fn height_resize_before_another_y_anim_then_cancel() {
  function clientside_height_change_during_another_y_anim (line 759) | fn clientside_height_change_during_another_y_anim() {
  function height_resize_cancel_with_stationary_second_window (line 823) | fn height_resize_cancel_with_stationary_second_window() {
  function width_resize_and_cancel (line 921) | fn width_resize_and_cancel() {
  function width_resize_and_cancel_of_column_to_the_left (line 1012) | fn width_resize_and_cancel_of_column_to_the_left() {

FILE: src/layout/tests/fullscreen.rs
  function fullscreen (line 6) | fn fullscreen() {
  function unfullscreen_window_in_column (line 19) | fn unfullscreen_window_in_column() {
  function unfullscreen_view_offset_not_reset_on_removal (line 39) | fn unfullscreen_view_offset_not_reset_on_removal() {
  function unfullscreen_view_offset_not_reset_on_consume (line 56) | fn unfullscreen_view_offset_not_reset_on_consume() {
  function unfullscreen_view_offset_not_reset_on_quick_double_toggle (line 73) | fn unfullscreen_view_offset_not_reset_on_quick_double_toggle() {
  function unfullscreen_view_offset_set_on_fullscreening_inactive_tile_in_column (line 87) | fn unfullscreen_view_offset_set_on_fullscreening_inactive_tile_in_column...
  function unfullscreen_view_offset_not_reset_on_gesture (line 104) | fn unfullscreen_view_offset_not_reset_on_gesture() {
  function one_window_in_column_becomes_weight_1_after_fullscreen (line 128) | fn one_window_in_column_becomes_weight_1_after_fullscreen() {
  function disable_tabbed_mode_in_fullscreen (line 161) | fn disable_tabbed_mode_in_fullscreen() {
  function unfullscreen_with_large_border (line 180) | fn unfullscreen_with_large_border() {
  function fullscreen_to_windowed_fullscreen (line 205) | fn fullscreen_to_windowed_fullscreen() {
  function windowed_fullscreen_to_fullscreen (line 220) | fn windowed_fullscreen_to_fullscreen() {
  function move_pending_unfullscreen_window_out_of_active_column (line 236) | fn move_pending_unfullscreen_window_out_of_active_column() {
  function move_unfocused_pending_unfullscreen_window_out_of_active_column (line 257) | fn move_unfocused_pending_unfullscreen_window_out_of_active_column() {
  function interactive_resize_on_pending_unfullscreen_column (line 282) | fn interactive_resize_on_pending_unfullscreen_column() {
  function interactive_move_unfullscreen_to_floating_stops_dnd_scroll (line 304) | fn interactive_move_unfullscreen_to_floating_stops_dnd_scroll() {
  function interactive_move_restore_to_floating_animates_view_offset (line 342) | fn interactive_move_restore_to_floating_animates_view_offset() {
  function unfullscreen_view_offset_not_reset_during_dnd_gesture (line 401) | fn unfullscreen_view_offset_not_reset_during_dnd_gesture() {
  function unfullscreen_view_offset_not_reset_during_gesture (line 422) | fn unfullscreen_view_offset_not_reset_during_gesture() {
  function unfullscreen_view_offset_not_reset_during_ongoing_gesture (line 443) | fn unfullscreen_view_offset_not_reset_during_ongoing_gesture() {
  function unfullscreen_preserves_view_pos (line 464) | fn unfullscreen_preserves_view_pos() {
  function unfullscreen_of_tabbed_preserves_view_pos (line 502) | fn unfullscreen_of_tabbed_preserves_view_pos() {
  function unfullscreen_of_tabbed_via_change_to_normal_preserves_view_pos (line 555) | fn unfullscreen_of_tabbed_via_change_to_normal_preserves_view_pos() {
  function removing_only_fullscreen_tile_updates_view_offset (line 608) | fn removing_only_fullscreen_tile_updates_view_offset() {

FILE: src/layout/tile.rs
  type Tile (line 38) | pub struct Tile<W: LayoutElement> {
  type TileRenderSnapshot (line 136) | pub type TileRenderSnapshot =
  type ResizeAnimation (line 140) | struct ResizeAnimation {
  type MoveAnimation (line 157) | struct MoveAnimation {
  type AlphaAnimation (line 163) | pub(super) struct AlphaAnimation {
  function new (line 175) | pub fn new(
  function update_config (line 215) | pub fn update_config(
  function update_shaders (line 253) | pub fn update_shaders(&mut self) {
  function update_window (line 259) | pub fn update_window(&mut self) {
  function advance_animations (line 409) | pub fn advance_animations(&mut self) {
  function are_animations_ongoing (line 440) | pub fn are_animations_ongoing(&self) -> bool {
  function are_transitions_ongoing (line 444) | pub fn are_transitions_ongoing(&self) -> bool {
  function update_render_elements (line 455) | pub fn update_render_elements(&mut self, is_active: bool, view_rect: Rec...
  function scale (line 528) | pub fn scale(&self) -> f64 {
  function render_offset (line 532) | pub fn render_offset(&self) -> Point<f64, Logical> {
  function start_open_animation (line 547) | pub fn start_open_animation(&mut self) {
  function resize_animation (line 557) | pub fn resize_animation(&self) -> Option<&Animation> {
  function animate_move_from (line 561) | pub fn animate_move_from(&mut self, from: Point<f64, Logical>) {
  function animate_move_x_from (line 566) | pub fn animate_move_x_from(&mut self, from: f64) {
  function animate_move_x_from_with_config (line 570) | pub fn animate_move_x_from_with_config(&mut self, from: f64, config: nir...
  function animate_move_y_from (line 585) | pub fn animate_move_y_from(&mut self, from: f64) {
  function animate_move_y_from_with_config (line 589) | pub fn animate_move_y_from_with_config(&mut self, from: f64, config: nir...
  function offset_move_y_anim_current (line 604) | pub fn offset_move_y_anim_current(&mut self, offset: f64) {
  function stop_move_animations (line 615) | pub fn stop_move_animations(&mut self) {
  function animate_alpha (line 620) | pub fn animate_alpha(&mut self, from: f64, to: f64, config: niri_config:...
  function ensure_alpha_animates_to_1 (line 637) | pub fn ensure_alpha_animates_to_1(&mut self) {
  function hold_alpha_animation_after_done (line 647) | pub fn hold_alpha_animation_after_done(&mut self) {
  function window (line 653) | pub fn window(&self) -> &W {
  function window_mut (line 657) | pub fn window_mut(&mut self) -> &mut W {
  function sizing_mode (line 661) | pub fn sizing_mode(&self) -> SizingMode {
  function fullscreen_progress (line 665) | fn fullscreen_progress(&self) -> f64 {
  function expanded_progress (line 679) | fn expanded_progress(&self) -> f64 {
  function effective_border_width (line 694) | pub fn effective_border_width(&self) -> Option<f64> {
  function visual_border_width (line 706) | fn visual_border_width(&self) -> Option<f64> {
  function window_loc (line 726) | pub fn window_loc(&self) -> Point<f64, Logical> {
  function tile_size (line 751) | pub fn tile_size(&self) -> Size<f64, Logical> {
  function tile_expected_or_current_size (line 770) | pub fn tile_expected_or_current_size(&self) -> Size<f64, Logical> {
  function window_size (line 789) | pub fn window_size(&self) -> Size<f64, Logical> {
  function window_expected_or_current_size (line 797) | pub fn window_expected_or_current_size(&self) -> Size<f64, Logical> {
  function animated_window_size (line 806) | pub fn animated_window_size(&self) -> Size<f64, Logical> {
  function animated_tile_size (line 823) | pub fn animated_tile_size(&self) -> Size<f64, Logical> {
  function buf_loc (line 840) | pub fn buf_loc(&self) -> Point<f64, Logical> {
  function ipc_layout_template (line 850) | pub fn ipc_layout_template(&self) -> WindowLayout {
  function is_in_input_region (line 860) | fn is_in_input_region(&self, mut point: Point<f64, Logical>) -> bool {
  function is_in_activation_region (line 865) | fn is_in_activation_region(&self, point: Point<f64, Logical>) -> bool {
  function hit (line 870) | pub fn hit(&self, point: Point<f64, Logical>) -> Option<HitType> {
  function request_tile_size (line 886) | pub fn request_tile_size(
  function tile_width_for_window_width (line 910) | pub fn tile_width_for_window_width(&self, size: f64) -> f64 {
  function tile_height_for_window_height (line 918) | pub fn tile_height_for_window_height(&self, size: f64) -> f64 {
  function window_width_for_tile_width (line 926) | pub fn window_width_for_tile_width(&self, size: f64) -> f64 {
  function window_height_for_tile_height (line 934) | pub fn window_height_for_tile_height(&self, size: f64) -> f64 {
  function request_maximized (line 942) | pub fn request_maximized(
  function request_fullscreen (line 956) | pub fn request_fullscreen(&mut self, animate: bool, transaction: Option<...
  function min_size_nonfullscreen (line 965) | pub fn min_size_nonfullscreen(&self) -> Size<f64, Logical> {
  function max_size_nonfullscreen (line 982) | pub fn max_size_nonfullscreen(&self) -> Size<f64, Logical> {
  function bob_offset (line 1000) | pub fn bob_offset(&self) -> Point<f64, Logical> {
  function render_inner (line 1010) | fn render_inner<R: NiriRenderer>(
  function render (line 1288) | pub fn render<R: NiriRenderer>(
  function store_unmap_snapshot_if_empty (line 1367) | pub fn store_unmap_snapshot_if_empty(&mut self, renderer: &mut GlesRende...
  function render_snapshot (line 1375) | fn render_snapshot(&self, renderer: &mut GlesRenderer) -> TileRenderSnap...
  function take_unmap_snapshot (line 1407) | pub fn take_unmap_snapshot(&mut self) -> Option<TileRenderSnapshot> {
  function border (line 1411) | pub fn border(&self) -> &FocusRing {
  function focus_ring (line 1415) | pub fn focus_ring(&self) -> &FocusRing {
  function options (line 1419) | pub fn options(&self) -> &Rc<Options> {
  function view_size (line 1424) | pub fn view_size(&self) -> Size<f64, Logical> {
  function verify_invariants (line 1429) | pub fn verify_invariants(&self) {

FILE: src/layout/workspace.rs
  type Workspace (line 45) | pub struct Workspace<W: LayoutElement> {
  type OutputId (line 116) | pub struct OutputId(String);
    method matches (line 119) | pub fn matches(&self, output: &Output) -> bool {
    method new (line 195) | pub fn new(output: &Output) -> Self {
  type WorkspaceId (line 128) | pub struct WorkspaceId(u64);
    method next (line 131) | fn next() -> WorkspaceId {
    method get (line 135) | pub fn get(self) -> u64 {
    method specific (line 139) | pub fn specific(id: u64) -> Self {
  type InteractiveResize (line 152) | pub(super) struct InteractiveResize<W: LayoutElement> {
  type ResolvedSize (line 160) | pub enum ResolvedSize {
  type FloatingActive (line 169) | enum FloatingActive {
    method get (line 202) | fn get(self) -> bool {
  type WorkspaceAddWindowTarget (line 184) | pub enum WorkspaceAddWindowTarget<'a, W: LayoutElement> {
  function new (line 208) | pub fn new(output: Output, clock: Clock, options: Rc<Options>) -> Self {
  function new_with_config (line 212) | pub fn new_with_config(
  function new_with_config_no_outputs (line 276) | pub fn new_with_config_no_outputs(
  function new_no_outputs (line 340) | pub fn new_no_outputs(clock: Clock, options: Rc<Options>) -> Self {
  function id (line 344) | pub fn id(&self) -> WorkspaceId {
  function name (line 348) | pub fn name(&self) -> Option<&String> {
  function unname (line 352) | pub fn unname(&mut self) {
  function has_windows_or_name (line 356) | pub fn has_windows_or_name(&self) -> bool {
  function scale (line 360) | pub fn scale(&self) -> smithay::output::Scale {
  function advance_animations (line 364) | pub fn advance_animations(&mut self) {
  function are_animations_ongoing (line 369) | pub fn are_animations_ongoing(&self) -> bool {
  function are_transitions_ongoing (line 373) | pub fn are_transitions_ongoing(&self) -> bool {
  function update_render_elements (line 377) | pub fn update_render_elements(&mut self, is_active: bool) {
  function update_config (line 394) | pub fn update_config(&mut self, base_options: Rc<Options>) {
  function update_layout_config (line 427) | pub fn update_layout_config(&mut self, layout_config: Option<niri_config...
  function update_shaders (line 436) | pub fn update_shaders(&mut self) {
  function windows (line 442) | pub fn windows(&self) -> impl Iterator<Item = &W> + '_ {
  function windows_mut (line 446) | pub fn windows_mut(&mut self) -> impl Iterator<Item = &mut W> + '_ {
  function tiles (line 450) | pub fn tiles(&self) -> impl Iterator<Item = &Tile<W>> + '_ {
  function tiles_mut (line 456) | pub fn tiles_mut(&mut self) -> impl Iterator<Item = &mut Tile<W>> + '_ {
  function is_floating (line 462) | pub fn is_floating(&self, id: &W::Id) -> bool {
  function current_output (line 466) | pub fn current_output(&self) -> Option<&Output> {
  function active_window (line 470) | pub fn active_window(&self) -> Option<&W> {
  function active_window_mut (line 478) | pub fn active_window_mut(&mut self) -> Option<&mut W> {
  function is_active_pending_fullscreen (line 486) | pub fn is_active_pending_fullscreen(&self) -> bool {
  function set_output (line 490) | pub fn set_output(&mut self, output: Option<Output>) {
  function enter_output_for_window (line 517) | fn enter_output_for_window(&self, window: &W) {
  function update_output_size (line 524) | pub fn update_output_size(&mut self) {
  function set_view_size (line 533) | fn set_view_size(
  function view_size (line 586) | pub fn view_size(&self) -> Size<f64, Logical> {
  function make_tile (line 590) | pub fn make_tile(&self, window: W) -> Tile<W> {
  function add_tile (line 600) | pub fn add_tile(
  function add_tile_to_column (line 694) | pub fn add_tile_to_column(
  function add_column (line 710) | pub fn add_column(&mut self, column: Column<W>, activate: bool) {
  function update_focus_floating_tiling_after_removing (line 722) | fn update_focus_floating_tiling_after_removing(&mut self, removed_from_f...
  function remove_tile (line 735) | pub fn remove_tile(&mut self, id: &W::Id, transaction: Transaction) -> R...
  function remove_active_tile (line 753) | pub fn remove_active_tile(&mut self, transaction: Transaction) -> Option...
  function remove_active_column (line 770) | pub fn remove_active_column(&mut self) -> Option<Column<W>> {
  function resolve_default_width (line 789) | pub fn resolve_default_width(
  function resolve_default_height (line 802) | pub fn resolve_default_height(
  function new_window_size (line 816) | pub fn new_window_size(
  function configure_new_window (line 847) | pub fn configure_new_window(
  function resolve_scrolling_width (line 884) | pub(super) fn resolve_scrolling_width(
  function focus_left (line 907) | pub fn focus_left(&mut self) -> bool {
  function focus_right (line 915) | pu
Condensed preview — 5546 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (7,685K chars).
[
  {
    "path": ".gitattributes",
    "chars": 395,
    "preview": "# LFS configuration for images from the wiki\n*.png filter=lfs diff=lfs merge=lfs -text\n\n# Exclude LFS-tracked files from"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 15,
    "preview": "github: YaLTeR\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 1193,
    "preview": "---\nname: Bug report\nabout: Report a bug or a crash\ntitle: ''\nlabels: bug\nassignees: ''\n\n---\n\n<!-- Please describe the i"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 445,
    "preview": "contact_links:\n  - name: Feature request\n    url: https://github.com/niri-wm/niri/discussions/new?category=ideas\n    abo"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 467,
    "preview": "version: 2\nupdates:\n  - package-ecosystem: \"cargo\"\n    directory: \"/\"\n    schedule:\n      interval: \"weekly\"\n    groups:"
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 9396,
    "preview": "name: CI\n\non:\n  push:\n  pull_request:\n  workflow_dispatch:\n  schedule:\n    - cron: '0 0 1 * *' # Monthly\n\nenv:\n  DEPS_AP"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 1732,
    "preview": "name: Prepare release\n\non:\n  workflow_dispatch:\n    inputs:\n      version:\n        description: 'Public version'\n       "
  },
  {
    "path": ".gitignore",
    "chars": 22,
    "preview": "/target\n/result\n\n.idea"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 8440,
    "preview": "# Contributing to niri\n\nThanks for your interest in niri!\nThe project has grown quite a bit, and we could use all help t"
  },
  {
    "path": "Cargo.toml",
    "chars": 6295,
    "preview": "[workspace]\nmembers = [\n    \"niri-config\",\n    \"niri-ipc\",\n    \"niri-visual-tests\",\n]\n\n[workspace.package]\nversion = \"25"
  },
  {
    "path": "LICENSE",
    "chars": 35150,
    "preview": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
  },
  {
    "path": "README.md",
    "chars": 7620,
    "preview": "<h1 align=\"center\"><img alt=\"niri\" src=\"https://github.com/user-attachments/assets/07d05cd0-d5dc-4a28-9a35-51bae8f119a0\""
  },
  {
    "path": "build.rs",
    "chars": 274,
    "preview": "fn main() {\n    println!(\"cargo:rustc-check-cfg=cfg(have_libinput_plugin_system)\");\n    if pkg_config::Config::new()\n   "
  },
  {
    "path": "clippy.toml",
    "chars": 137,
    "preview": "ignore-interior-mutability = [\n    \"smithay::desktop::Window\",\n    \"smithay::output::Output\",\n    \"wayland_server::backe"
  },
  {
    "path": "docs/.gitignore",
    "chars": 16,
    "preview": "site\n__pycache__"
  },
  {
    "path": "docs/hooks/remove-must-fail.py",
    "chars": 521,
    "preview": "from __future__ import annotations\nimport re\n\n# todo: this could be done generically, so that any \n# ```language,annotat"
  },
  {
    "path": "docs/hooks/shortcodes.py",
    "chars": 1999,
    "preview": "# Copyright (c) 2016-2025 Martin Donath <martin.donath@squidfunk.com>\n\n# Permission is hereby granted, free of charge, t"
  },
  {
    "path": "docs/mkdocs.yaml",
    "chars": 3543,
    "preview": "site_name: niri\ndocs_dir: wiki\nsite_url: https://niri-wm.github.io/niri\nrepo_url: https://github.com/niri-wm/niri\nedit_u"
  },
  {
    "path": "docs/pyproject.toml",
    "chars": 437,
    "preview": "[project]\nname = \"niri-docs\"\nversion = \"0.1.0\"\nrequires-python = \">=3.10\"\ndependencies = [\n    \"markdown-callouts>=0.4.0"
  },
  {
    "path": "docs/wiki/Accessibility.md",
    "chars": 3354,
    "preview": "## Screen readers\n\n<sup>Since: 25.08</sup>\n\nNiri has basic support for screen readers (specifically, [Orca](https://orca"
  },
  {
    "path": "docs/wiki/Application-Issues.md",
    "chars": 5969,
    "preview": "### Electron applications\n\nElectron-based applications can run directly on Wayland, but it's not the default.\n\nFor Elect"
  },
  {
    "path": "docs/wiki/Configuration:-Animations.md",
    "chars": 13284,
    "preview": "### Overview\n\nNiri has several animations which you can configure in the same way.\nAdditionally, you can disable or slow"
  },
  {
    "path": "docs/wiki/Configuration:-Debug-Options.md",
    "chars": 11057,
    "preview": "### Overview\n\nNiri has several options that are only useful for debugging, or are experimental and have known issues.\nTh"
  },
  {
    "path": "docs/wiki/Configuration:-Gestures.md",
    "chars": 3156,
    "preview": "### Overview\n\n<sup>Since: 25.02</sup>\n\nThe `gestures` config section contains gesture settings.\nFor an overview of all n"
  },
  {
    "path": "docs/wiki/Configuration:-Include.md",
    "chars": 6184,
    "preview": "<sup>Since: 25.11</sup>\n\nYou can include other files at the top level of the config.\n\n```kdl,must-fail\n// Some settings."
  },
  {
    "path": "docs/wiki/Configuration:-Input.md",
    "chars": 12063,
    "preview": "### Overview\n\nIn this section you can configure input devices like keyboard and mouse, and some input-related options.\n\n"
  },
  {
    "path": "docs/wiki/Configuration:-Introduction.md",
    "chars": 4680,
    "preview": "### Per-Section Documentation\n\nYou can find documentation for various sections of the config on these wiki pages:\n\n* [`i"
  },
  {
    "path": "docs/wiki/Configuration:-Key-Bindings.md",
    "chars": 14352,
    "preview": "### Overview\n\nKey bindings are declared in the `binds {}` section of the config.\n\n> [!NOTE]\n> This is one of the few sec"
  },
  {
    "path": "docs/wiki/Configuration:-Layer-Rules.md",
    "chars": 5106,
    "preview": "### Overview\n\n<sup>Since: 25.01</sup>\n\nLayer rules let you adjust behavior for individual layer-shell surfaces.\nThey hav"
  },
  {
    "path": "docs/wiki/Configuration:-Layout.md",
    "chars": 18456,
    "preview": "### Overview\n\nIn the `layout {}` section you can change various settings that influence how windows are positioned and s"
  },
  {
    "path": "docs/wiki/Configuration:-Miscellaneous.md",
    "chars": 8904,
    "preview": "This page documents all top-level options that don't otherwise have dedicated pages.\n\nHere are all of these options at a"
  },
  {
    "path": "docs/wiki/Configuration:-Named-Workspaces.md",
    "chars": 3179,
    "preview": "### Overview\n\n<sup>Since: 0.1.6</sup>\n\nYou can declare named workspaces at the top level of the config:\n\n```kdl\nworkspac"
  },
  {
    "path": "docs/wiki/Configuration:-Outputs.md",
    "chars": 10483,
    "preview": "### Overview\n\nBy default, niri will attempt to turn on all connected monitors using their preferred modes.\nYou can disab"
  },
  {
    "path": "docs/wiki/Configuration:-Overview.md",
    "chars": 79,
    "preview": "This wiki page has moved to: [Introduction](./Configuration:-Introduction.md).\n"
  },
  {
    "path": "docs/wiki/Configuration:-Recent-Windows.md",
    "chars": 7152,
    "preview": "### Overview\n\n<sup>Since: 25.11</sup>\n\nIn this section you can configure the recent windows switcher (Alt-Tab).\n\nHere is"
  },
  {
    "path": "docs/wiki/Configuration:-Switch-Events.md",
    "chars": 1968,
    "preview": "### Overview\n\n<sup>Since: 0.1.10</sup>\n\nSwitch event bindings are declared in the `switch-events {}` section of the conf"
  },
  {
    "path": "docs/wiki/Configuration:-Window-Rules.md",
    "chars": 26645,
    "preview": "### Overview\n\nWindow rules let you adjust behavior for individual windows.\nThey have `match` and `exclude` directives th"
  },
  {
    "path": "docs/wiki/Development:-Animation-Timing.md",
    "chars": 4696,
    "preview": "> *Time, Dr. Freeman? Is it really that... time again?*\n\nA compositor deals with one or more monitors on mostly fixed re"
  },
  {
    "path": "docs/wiki/Development:-Design-Principles.md",
    "chars": 10432,
    "preview": "## General principles\n\nThese are some of the general principles that I try to follow throughout niri.\nThey can be sidest"
  },
  {
    "path": "docs/wiki/Development:-Developing-niri.md",
    "chars": 4318,
    "preview": "## Running a Local Build\n\nThe main way of testing niri during development is running it as a nested window. The second s"
  },
  {
    "path": "docs/wiki/Development:-Documenting-niri.md",
    "chars": 3213,
    "preview": "niri's documentation files are found in `docs/wiki/` and should be viewable and browsable in at least three systems:\n\n- "
  },
  {
    "path": "docs/wiki/Development:-Fractional-Layout.md",
    "chars": 3103,
    "preview": "There are two main coordinate spaces in niri: physical (pixels of every individual output) and logical (shared among all"
  },
  {
    "path": "docs/wiki/Development:-Redraw-Loop.md",
    "chars": 1729,
    "preview": "On a TTY, only one frame can be submitted to an output at a time, and the compositor must wait until the output repaints"
  },
  {
    "path": "docs/wiki/Example-systemd-Setup.md",
    "chars": 3387,
    "preview": "When starting niri from a display manager like GDM, or otherwise through the `niri-session` binary, it runs as a systemd"
  },
  {
    "path": "docs/wiki/FAQ.md",
    "chars": 8573,
    "preview": "### How to disable client-side decorations/make windows rectangular?\n\nUncomment the [`prefer-no-csd` setting](./Configur"
  },
  {
    "path": "docs/wiki/Floating-Windows.md",
    "chars": 992,
    "preview": "### Overview\n\n<sup>Since: 25.01</sup>\n\nFloating windows in niri always show on top of the tiled windows.\nThe floating la"
  },
  {
    "path": "docs/wiki/Fullscreen-and-Maximize.md",
    "chars": 5565,
    "preview": "There are several ways to make a window big on niri: maximizing the column, maximizing the window to edges, and fullscre"
  },
  {
    "path": "docs/wiki/Gestures.md",
    "chars": 2847,
    "preview": "### Overview\n\nThere are several gestures in niri.\n\nAlso see the [gestures configuration](./Configuration:-Gestures.md) w"
  },
  {
    "path": "docs/wiki/Getting-Started.md",
    "chars": 13418,
    "preview": "## Quick start\n\nUse these commands to install niri with [DankMaterialShell](https://github.com/AvengeMedia/DankMaterialS"
  },
  {
    "path": "docs/wiki/IPC.md",
    "chars": 3750,
    "preview": "You can communicate with the running niri instance over an IPC socket.\nCheck `niri msg --help` for available commands.\n\n"
  },
  {
    "path": "docs/wiki/Important-Software.md",
    "chars": 2802,
    "preview": "Since niri is not a complete desktop environment, you will very likely want to run the following software to make sure t"
  },
  {
    "path": "docs/wiki/Integrating-niri.md",
    "chars": 5110,
    "preview": "This page contains various bits of information helpful for integrating niri in a distribution.\nFirst, for creating a nir"
  },
  {
    "path": "docs/wiki/Layer‐Shell-Components.md",
    "chars": 921,
    "preview": "Things to keep in mind with layer-shell components (bars, launchers, etc.):\n\n1. When a [full-screen](./Fullscreen-and-Ma"
  },
  {
    "path": "docs/wiki/Name-and-Logo.md",
    "chars": 1147,
    "preview": "The name \"niri\" is canonically written in lower-case, but feel free to capitalize it if you'd like, especially at the st"
  },
  {
    "path": "docs/wiki/Nvidia.md",
    "chars": 2522,
    "preview": "### High VRAM usage fix\n\nPresently, there is a quirk in the NVIDIA drivers that affects niri's VRAM usage (the driver do"
  },
  {
    "path": "docs/wiki/Overview.md",
    "chars": 3816,
    "preview": "### Overview\n\n<sup>Since: 25.05</sup>\n\nThe Overview is a zoomed-out view of your workspaces and windows.\nIt lets you see"
  },
  {
    "path": "docs/wiki/Packaging-niri.md",
    "chars": 7550,
    "preview": "### Overview\n\nWhen building niri, check `Cargo.toml` for a list of build features.\nFor example, you can replace systemd "
  },
  {
    "path": "docs/wiki/README.md",
    "chars": 871,
    "preview": "Welcome to the niri documentation!\n\nFeel free to look through usage and [Getting started](./Getting-Started.md).\nIf you'"
  },
  {
    "path": "docs/wiki/Screencasting.md",
    "chars": 5824,
    "preview": "### Overview\n\nThe primary screencasting interface that niri offers is through portals and pipewire.\nIt is supported by ["
  },
  {
    "path": "docs/wiki/Tabs.md",
    "chars": 1748,
    "preview": "### Overview\n\n<sup>Since: 25.02</sup>\n\nYou can switch a column to present windows as tabs, rather than as vertical tiles"
  },
  {
    "path": "docs/wiki/Workspaces.md",
    "chars": 4533,
    "preview": "### Overview\n\nNiri has dynamic workspaces that can move between monitors.\n\nEach monitor contains an independent set of w"
  },
  {
    "path": "docs/wiki/Xwayland.md",
    "chars": 7759,
    "preview": "## Using xwayland-satellite\n\n<sup>Since: 25.08</sup> Niri integrates with [xwayland-satellite](https://github.com/Supree"
  },
  {
    "path": "docs/wiki/_Sidebar.md",
    "chars": 1873,
    "preview": "## Usage\n* [Getting Started](./Getting-Started.md)\n* [Example systemd Setup](./Example-systemd-Setup.md)\n* [Important So"
  },
  {
    "path": "docs/wiki/_assets/stylesheets/niri.css",
    "chars": 1272,
    "preview": ":root  > * {\n  --md-primary-fg-color: #1e97b5;\n  --md-primary-fg-color--dark: color-mix(in srgb, var(--md-primary-fg-col"
  },
  {
    "path": "docs/wiki/examples/close_custom_shader.frag",
    "chars": 5151,
    "preview": "// Your shader must contain one function (see the bottom of this file).\n//\n// It should not contain any uniform definiti"
  },
  {
    "path": "docs/wiki/examples/open_custom_shader.frag",
    "chars": 4312,
    "preview": "// Your shader must contain one function (see the bottom of this file).\n//\n// It should not contain any uniform definiti"
  },
  {
    "path": "docs/wiki/examples/resize_custom_shader.frag",
    "chars": 8315,
    "preview": "// Your shader must contain one function (see the bottom of this file).\n//\n// It should not contain any uniform definiti"
  },
  {
    "path": "flake.nix",
    "chars": 8256,
    "preview": "# This flake file is community maintained\n{\n  description = \"Niri: A scrollable-tiling Wayland compositor.\";\n\n  inputs ="
  },
  {
    "path": "niri-config/Cargo.toml",
    "chars": 620,
    "preview": "[package]\nname = \"niri-config\"\nversion.workspace = true\ndescription.workspace = true\nauthors.workspace = true\nlicense.wo"
  },
  {
    "path": "niri-config/src/animations.rs",
    "chars": 26957,
    "preview": "use knuffel::errors::DecodeError;\nuse knuffel::Decode as _;\n\nuse crate::utils::{expect_only_children, parse_arg_node, Me"
  },
  {
    "path": "niri-config/src/appearance.rs",
    "chars": 36691,
    "preview": "use std::ops::{Mul, MulAssign};\nuse std::str::FromStr;\n\nuse knuffel::errors::DecodeError;\nuse miette::{miette, IntoDiagn"
  },
  {
    "path": "niri-config/src/binds.rs",
    "chars": 45278,
    "preview": "use std::collections::HashSet;\nuse std::str::FromStr;\nuse std::time::Duration;\n\nuse bitflags::bitflags;\nuse knuffel::err"
  },
  {
    "path": "niri-config/src/debug.rs",
    "chars": 4067,
    "preview": "use std::path::PathBuf;\n\nuse crate::utils::{Flag, MergeWith};\n\n#[derive(Debug, Default, PartialEq)]\npub struct Debug {\n "
  },
  {
    "path": "niri-config/src/error.rs",
    "chars": 2684,
    "preview": "use std::error::Error;\nuse std::fmt;\nuse std::path::PathBuf;\n\nuse miette::Diagnostic;\n\n#[derive(Debug)]\npub struct Confi"
  },
  {
    "path": "niri-config/src/gestures.rs",
    "chars": 3113,
    "preview": "use crate::utils::MergeWith;\nuse crate::FloatOrInt;\n\n#[derive(Debug, Default, Clone, Copy, PartialEq)]\npub struct Gestur"
  },
  {
    "path": "niri-config/src/input.rs",
    "chars": 19968,
    "preview": "use std::str::FromStr;\n\nuse miette::miette;\nuse smithay::input::keyboard::XkbConfig;\nuse smithay::reexports::input;\n\nuse"
  },
  {
    "path": "niri-config/src/layer_rule.rs",
    "chars": 984,
    "preview": "use crate::appearance::{BlockOutFrom, CornerRadius, ShadowRule};\nuse crate::utils::RegexEq;\n\n#[derive(knuffel::Decode, D"
  },
  {
    "path": "niri-config/src/layout.rs",
    "chars": 6456,
    "preview": "use knuffel::errors::DecodeError;\nuse niri_ipc::{ColumnDisplay, SizeChange};\n\nuse crate::appearance::{\n    Border, Focus"
  },
  {
    "path": "niri-config/src/lib.rs",
    "chars": 87891,
    "preview": "//! niri config parsing.\n//!\n//! The config can be constructed from multiple files (includes). To support this, many typ"
  },
  {
    "path": "niri-config/src/macros.rs",
    "chars": 1711,
    "preview": "macro_rules! merge {\n    (($self:expr, $part:expr), $($field:ident),+ $(,)*) => {\n        $(\n            if let Some(x) "
  },
  {
    "path": "niri-config/src/misc.rs",
    "chars": 5315,
    "preview": "use crate::appearance::{Color, WorkspaceShadow, WorkspaceShadowPart, DEFAULT_BACKDROP_COLOR};\nuse crate::utils::{Flag, M"
  },
  {
    "path": "niri-config/src/output.rs",
    "chars": 20123,
    "preview": "use std::str::FromStr;\n\nuse knuffel::ast::SpannedNode;\nuse knuffel::decode::Context;\nuse knuffel::errors::DecodeError;\nu"
  },
  {
    "path": "niri-config/src/recent_windows.rs",
    "chars": 11753,
    "preview": "use std::collections::HashSet;\n\nuse knuffel::errors::DecodeError;\nuse smithay::input::keyboard::Keysym;\n\nuse crate::util"
  },
  {
    "path": "niri-config/src/utils/merge_with.rs",
    "chars": 333,
    "preview": "pub trait MergeWith<T> {\n    fn merge_with(&mut self, part: &T);\n\n    fn merged_with(mut self, part: &T) -> Self\n    whe"
  },
  {
    "path": "niri-config/src/utils.rs",
    "chars": 6324,
    "preview": "use std::str::FromStr;\n\nuse knuffel::errors::DecodeError;\nuse miette::miette;\nuse regex::Regex;\n\nmod merge_with;\npub use"
  },
  {
    "path": "niri-config/src/window_rule.rs",
    "chars": 3843,
    "preview": "use niri_ipc::ColumnDisplay;\n\nuse crate::appearance::{BlockOutFrom, BorderRule, CornerRadius, ShadowRule, TabIndicatorRu"
  },
  {
    "path": "niri-config/src/workspace.rs",
    "chars": 3393,
    "preview": "use knuffel::errors::DecodeError;\n\nuse crate::LayoutPart;\n\n#[derive(knuffel::Decode, Debug, Clone, PartialEq)]\npub struc"
  },
  {
    "path": "niri-config/tests/wiki-parses.rs",
    "chars": 2949,
    "preview": "use std::fs;\nuse std::path::{Path, PathBuf};\n\nstruct KdlCodeBlock {\n    filename: String,\n    code: String,\n    line_num"
  },
  {
    "path": "niri-ipc/Cargo.toml",
    "chars": 546,
    "preview": "[package]\nname = \"niri-ipc\"\nversion.workspace = true\nauthors.workspace = true\nlicense.workspace = true\nedition.workspace"
  },
  {
    "path": "niri-ipc/README.md",
    "chars": 440,
    "preview": "# niri-ipc\n\nTypes and helpers for interfacing with the [niri](https://github.com/niri-wm/niri) Wayland compositor.\n\n## B"
  },
  {
    "path": "niri-ipc/src/lib.rs",
    "chars": 75876,
    "preview": "//! Types for communicating with niri via IPC.\n//!\n//! After connecting to the niri socket, you can send [`Request`]s. N"
  },
  {
    "path": "niri-ipc/src/socket.rs",
    "chars": 3342,
    "preview": "//! Helper for blocking communication over the niri socket.\n\nuse std::env;\nuse std::io::{self, BufRead, BufReader, Write"
  },
  {
    "path": "niri-ipc/src/state.rs",
    "chars": 10899,
    "preview": "//! Helpers for keeping track of the event stream state.\n//!\n//! 1. Create an [`EventStreamState`] using `Default::defau"
  },
  {
    "path": "niri-visual-tests/Cargo.toml",
    "chars": 569,
    "preview": "[package]\nname = \"niri-visual-tests\"\nversion.workspace = true\ndescription.workspace = true\nauthors.workspace = true\nlice"
  },
  {
    "path": "niri-visual-tests/README.md",
    "chars": 431,
    "preview": "# niri-visual-tests\n\n> [!NOTE]\n>\n> This is a development-only app, you shouldn't package it.\n\nThis app contains a number"
  },
  {
    "path": "niri-visual-tests/resources/style.css",
    "chars": 41,
    "preview": ".anim-control-bar {\n    padding: 12px;\n}\n"
  },
  {
    "path": "niri-visual-tests/src/cases/gradient_angle.rs",
    "chars": 1994,
    "preview": "use std::f32::consts::{FRAC_PI_2, PI};\nuse std::time::Duration;\n\nuse niri::render_helpers::border::BorderRenderElement;\n"
  },
  {
    "path": "niri-visual-tests/src/cases/gradient_area.rs",
    "chars": 3393,
    "preview": "use std::f32::consts::{FRAC_PI_4, PI};\nuse std::time::Duration;\n\nuse niri::layout::focus_ring::FocusRing;\nuse niri::rend"
  },
  {
    "path": "niri-visual-tests/src/cases/gradient_oklab.rs",
    "chars": 1603,
    "preview": "use niri::render_helpers::border::BorderRenderElement;\nuse niri_config::{\n    Color, CornerRadius, GradientColorSpace, G"
  },
  {
    "path": "niri-visual-tests/src/cases/gradient_oklab_alpha.rs",
    "chars": 1586,
    "preview": "use niri::render_helpers::border::BorderRenderElement;\nuse niri_config::{Color, CornerRadius, GradientColorSpace, Gradie"
  },
  {
    "path": "niri-visual-tests/src/cases/gradient_oklch_alpha.rs",
    "chars": 1617,
    "preview": "use niri::render_helpers::border::BorderRenderElement;\nuse niri_config::{\n    Color, CornerRadius, GradientColorSpace, G"
  },
  {
    "path": "niri-visual-tests/src/cases/gradient_oklch_decreasing.rs",
    "chars": 1636,
    "preview": "use niri::render_helpers::border::BorderRenderElement;\nuse niri_config::{\n    Color, CornerRadius, GradientColorSpace, G"
  },
  {
    "path": "niri-visual-tests/src/cases/gradient_oklch_increasing.rs",
    "chars": 1636,
    "preview": "use niri::render_helpers::border::BorderRenderElement;\nuse niri_config::{\n    Color, CornerRadius, GradientColorSpace, G"
  },
  {
    "path": "niri-visual-tests/src/cases/gradient_oklch_longer.rs",
    "chars": 1620,
    "preview": "use niri::render_helpers::border::BorderRenderElement;\nuse niri_config::{\n    Color, CornerRadius, GradientColorSpace, G"
  },
  {
    "path": "niri-visual-tests/src/cases/gradient_oklch_shorter.rs",
    "chars": 1624,
    "preview": "use niri::render_helpers::border::BorderRenderElement;\nuse niri_config::{\n    Color, CornerRadius, GradientColorSpace, G"
  },
  {
    "path": "niri-visual-tests/src/cases/gradient_srgb.rs",
    "chars": 1599,
    "preview": "use niri::render_helpers::border::BorderRenderElement;\nuse niri_config::{\n    Color, CornerRadius, GradientColorSpace, G"
  },
  {
    "path": "niri-visual-tests/src/cases/gradient_srgb_alpha.rs",
    "chars": 1582,
    "preview": "use niri::render_helpers::border::BorderRenderElement;\nuse niri_config::{Color, CornerRadius, GradientColorSpace, Gradie"
  },
  {
    "path": "niri-visual-tests/src/cases/gradient_srgblinear.rs",
    "chars": 1623,
    "preview": "use niri::render_helpers::border::BorderRenderElement;\nuse niri_config::{\n    Color, CornerRadius, GradientColorSpace, G"
  },
  {
    "path": "niri-visual-tests/src/cases/gradient_srgblinear_alpha.rs",
    "chars": 1606,
    "preview": "use niri::render_helpers::border::BorderRenderElement;\nuse niri_config::{Color, CornerRadius, GradientColorSpace, Gradie"
  },
  {
    "path": "niri-visual-tests/src/cases/layout.rs",
    "chars": 8918,
    "preview": "use std::collections::HashMap;\nuse std::time::Duration;\n\nuse niri::animation::Clock;\nuse niri::layout::{ActivateWindow, "
  },
  {
    "path": "niri-visual-tests/src/cases/mod.rs",
    "chars": 1082,
    "preview": "use std::time::Duration;\n\nuse niri::animation::Clock;\nuse smithay::backend::renderer::element::RenderElement;\nuse smitha"
  },
  {
    "path": "niri-visual-tests/src/cases/tile.rs",
    "chars": 3842,
    "preview": "use std::rc::Rc;\nuse std::time::Duration;\n\nuse niri::layout::Options;\nuse niri::render_helpers::RenderTarget;\nuse niri_c"
  },
  {
    "path": "niri-visual-tests/src/cases/window.rs",
    "chars": 1972,
    "preview": "use niri::layout::{LayoutElement, SizingMode};\nuse niri::render_helpers::RenderTarget;\nuse smithay::backend::renderer::e"
  },
  {
    "path": "niri-visual-tests/src/main.rs",
    "chars": 6498,
    "preview": "#[macro_use]\nextern crate tracing;\n\nuse std::env;\n\nuse adw::prelude::{AdwApplicationWindowExt, NavigationPageExt};\nuse c"
  },
  {
    "path": "niri-visual-tests/src/smithay_view.rs",
    "chars": 10188,
    "preview": "use gtk::glib;\nuse gtk::prelude::*;\nuse gtk::subclass::prelude::*;\nuse smithay::utils::Size;\n\nuse crate::cases::{Args, T"
  },
  {
    "path": "niri-visual-tests/src/test_window.rs",
    "chars": 7324,
    "preview": "use std::cell::RefCell;\nuse std::cmp::{max, min};\nuse std::rc::Rc;\n\nuse niri::layout::{\n    ConfigureIntent, Interactive"
  },
  {
    "path": "niri.spec.rpkg",
    "chars": 5661,
    "preview": "%bcond_without check\n\n%global cargo_install_lib 0\n\n# We want panic backtraces to work without installing the debuginfo p"
  },
  {
    "path": "resources/default-config.kdl",
    "chars": 27190,
    "preview": "// This config is in the KDL format: https://kdl.dev\n// \"/-\" comments out the following node.\n// Check the wiki for a fu"
  },
  {
    "path": "resources/dinit/niri",
    "chars": 236,
    "preview": "type               = process\ncommand            = niri --session\nrestart            = false\nworking-dir        = $HOME\nr"
  },
  {
    "path": "resources/dinit/niri.target",
    "chars": 203,
    "preview": "type           = internal\nrestart        = false\ndepends-on:    niri\nwaits-for.d:   $XDG_CONFIG_HOME/dinit.d/niri.d/\nwai"
  },
  {
    "path": "resources/mutter-x11-interop.xml",
    "chars": 620,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<protocol name=\"mutter_x11_interop\">\n  <description summary=\"X11 interoperability"
  },
  {
    "path": "resources/niri-portals.conf",
    "chars": 167,
    "preview": "[preferred]\ndefault=gnome;gtk;\norg.freedesktop.impl.portal.Access=gtk;\norg.freedesktop.impl.portal.Notification=gtk;\norg"
  },
  {
    "path": "resources/niri-session",
    "chars": 3440,
    "preview": "#!/bin/sh\n\n# Detect if being run as a user service, which implies external session management,\n# exec compositor directl"
  },
  {
    "path": "resources/niri-shutdown.target",
    "chars": 219,
    "preview": "[Unit]\nDescription=Shutdown running niri session\nDefaultDependencies=no\nStopWhenUnneeded=true\n\nConflicts=graphical-sessi"
  },
  {
    "path": "resources/niri.desktop",
    "chars": 126,
    "preview": "[Desktop Entry]\nName=Niri\nComment=A scrollable-tiling Wayland compositor\nExec=niri-session\nType=Application\nDesktopNames"
  },
  {
    "path": "resources/niri.service",
    "chars": 333,
    "preview": "[Unit]\nDescription=A scrollable-tiling Wayland compositor\nBindsTo=graphical-session.target\nBefore=graphical-session.targ"
  },
  {
    "path": "resources/rustdoc-index.html",
    "chars": 124,
    "preview": "<!DOCTYPE html>\n<html>\n    <head>\n        <meta http-equiv=refresh content=0;url=niri_ipc/index.html />\n    </head>\n</ht"
  },
  {
    "path": "rustfmt.toml",
    "chars": 107,
    "preview": "imports_granularity = \"Module\"\ngroup_imports = \"StdExternalCrate\"\nwrap_comments = true\ncomment_width = 100\n"
  },
  {
    "path": "src/a11y.rs",
    "chars": 12151,
    "preview": "use std::sync::mpsc;\nuse std::thread;\n\nuse accesskit::{\n    ActionHandler, ActionRequest, ActivationHandler, Deactivatio"
  },
  {
    "path": "src/animation/bezier.rs",
    "chars": 1362,
    "preview": "use keyframe::EasingFunction;\n\n#[derive(Debug, Clone, Copy)]\npub struct CubicBezier {\n    x1: f64,\n    y1: f64,\n    x2: "
  },
  {
    "path": "src/animation/clock.rs",
    "chars": 5345,
    "preview": "use std::cell::RefCell;\nuse std::rc::Rc;\nuse std::time::Duration;\n\nuse crate::utils::get_monotonic_time;\n\n/// Shareable "
  },
  {
    "path": "src/animation/mod.rs",
    "chars": 10216,
    "preview": "use std::time::Duration;\n\nuse keyframe::functions::{EaseOutCubic, EaseOutQuad};\nuse keyframe::EasingFunction;\n\nmod bezie"
  },
  {
    "path": "src/animation/spring.rs",
    "chars": 6442,
    "preview": "use std::time::Duration;\n\n#[derive(Debug, Clone, Copy)]\npub struct SpringParams {\n    pub damping: f64,\n    pub mass: f6"
  },
  {
    "path": "src/backend/headless.rs",
    "chars": 5496,
    "preview": "//! Headless backend for tests.\n//!\n//! This can eventually grow into a more complete backend if needed, but for now it'"
  },
  {
    "path": "src/backend/mod.rs",
    "chars": 6638,
    "preview": "use std::collections::HashMap;\nuse std::sync::{Arc, Mutex};\nuse std::time::Duration;\n\nuse niri_config::{Config, ModKey};"
  },
  {
    "path": "src/backend/tty.rs",
    "chars": 129345,
    "preview": "use std::cell::RefCell;\nuse std::collections::{HashMap, HashSet};\nuse std::fmt::Write;\nuse std::iter::zip;\nuse std::num:"
  },
  {
    "path": "src/backend/winit.rs",
    "chars": 10157,
    "preview": "use std::cell::RefCell;\nuse std::collections::HashMap;\nuse std::mem;\nuse std::rc::Rc;\nuse std::sync::{Arc, Mutex};\n\nuse "
  },
  {
    "path": "src/cli.rs",
    "chars": 4260,
    "preview": "use std::ffi::OsString;\nuse std::path::PathBuf;\n\nuse clap::{Parser, Subcommand};\nuse clap_complete::Shell;\nuse niri_ipc:"
  },
  {
    "path": "src/cursor.rs",
    "chars": 9979,
    "preview": "use std::cell::RefCell;\nuse std::collections::HashMap;\nuse std::env;\nuse std::fs::File;\nuse std::io::Read;\nuse std::rc::"
  },
  {
    "path": "src/dbus/freedesktop_a11y.rs",
    "chars": 17118,
    "preview": "// References:\n// - https://invent.kde.org/plasma/kwin/-/blob/397fbbe52a8f2d855ad0c9817b51a9bdf06a68e2/src/a11ykeyboardm"
  },
  {
    "path": "src/dbus/freedesktop_locale1.rs",
    "chars": 4432,
    "preview": "use futures_util::StreamExt;\nuse niri_config::Xkb;\nuse zbus::names::InterfaceName;\nuse zbus::{fdo, zvariant};\n\npub enum "
  },
  {
    "path": "src/dbus/freedesktop_login1.rs",
    "chars": 3047,
    "preview": "use futures_util::StreamExt;\nuse zbus::fdo;\nuse zbus::names::InterfaceName;\n\npub enum Login1ToNiri {\n    LidClosedChange"
  },
  {
    "path": "src/dbus/freedesktop_screensaver.rs",
    "chars": 5804,
    "preview": "use std::collections::hash_map::Entry;\nuse std::collections::HashMap;\nuse std::sync::atomic::{AtomicBool, AtomicU32, Ord"
  },
  {
    "path": "src/dbus/gnome_shell_introspect.rs",
    "chars": 2593,
    "preview": "use std::collections::HashMap;\n\nuse zbus::fdo::{self, RequestNameFlags};\nuse zbus::interface;\nuse zbus::object_server::S"
  },
  {
    "path": "src/dbus/gnome_shell_screenshot.rs",
    "chars": 3313,
    "preview": "use std::collections::HashMap;\nuse std::path::PathBuf;\n\nuse niri_ipc::PickedColor;\nuse zbus::fdo::{self, RequestNameFlag"
  },
  {
    "path": "src/dbus/mod.rs",
    "chars": 7279,
    "preview": "use zbus::blocking::Connection;\nuse zbus::object_server::Interface;\n\nuse crate::niri::State;\n\npub mod freedesktop_a11y;\n"
  },
  {
    "path": "src/dbus/mutter_display_config.rs",
    "chars": 11800,
    "preview": "use std::collections::HashMap;\nuse std::str::FromStr;\nuse std::sync::{Arc, Mutex};\n\nuse serde::{Deserialize, Serialize};"
  },
  {
    "path": "src/dbus/mutter_screen_cast.rs",
    "chars": 11846,
    "preview": "use std::collections::HashMap;\nuse std::mem;\nuse std::sync::atomic::{AtomicBool, Ordering};\nuse std::sync::{Arc, Mutex};"
  },
  {
    "path": "src/dbus/mutter_service_channel.rs",
    "chars": 1599,
    "preview": "use std::os::unix::net::UnixStream;\n\nuse zbus::{fdo, interface, zvariant};\n\nuse super::Start;\nuse crate::niri::NewClient"
  },
  {
    "path": "src/frame_clock.rs",
    "chars": 2920,
    "preview": "use std::num::NonZeroU64;\nuse std::time::Duration;\n\nuse crate::utils::get_monotonic_time;\n\n#[derive(Debug)]\npub struct F"
  },
  {
    "path": "src/handlers/compositor.rs",
    "chars": 24829,
    "preview": "use std::collections::hash_map::Entry;\n\nuse niri_ipc::PositionChange;\nuse smithay::backend::renderer::utils::on_commit_b"
  },
  {
    "path": "src/handlers/layer_shell.rs",
    "chars": 7764,
    "preview": "use smithay::delegate_layer_shell;\nuse smithay::desktop::{layer_map_for_output, LayerSurface, PopupKind, WindowSurfaceTy"
  },
  {
    "path": "src/handlers/mod.rs",
    "chars": 30447,
    "preview": "mod compositor;\nmod layer_shell;\nmod xdg_shell;\n\nuse std::fs::File;\nuse std::io::Write;\nuse std::os::fd::OwnedFd;\nuse st"
  },
  {
    "path": "src/handlers/xdg_shell.rs",
    "chars": 63946,
    "preview": "use std::cell::Cell;\n\nuse calloop::Interest;\nuse niri_config::PresetSize;\nuse smithay::desktop::{\n    find_popup_root_su"
  },
  {
    "path": "src/input/backend_ext.rs",
    "chars": 1770,
    "preview": "use ::input as libinput;\nuse smithay::backend::input;\nuse smithay::backend::winit::WinitVirtualDevice;\nuse smithay::outp"
  },
  {
    "path": "src/input/mod.rs",
    "chars": 220198,
    "preview": "use std::any::Any;\nuse std::cmp::min;\nuse std::collections::hash_map::Entry;\nuse std::collections::HashSet;\nuse std::tim"
  },
  {
    "path": "src/input/move_grab.rs",
    "chars": 17110,
    "preview": "use std::time::Duration;\n\nuse smithay::backend::input::ButtonState;\nuse smithay::desktop::Window;\nuse smithay::input::po"
  },
  {
    "path": "src/input/pick_color_grab.rs",
    "chars": 7277,
    "preview": "use niri_ipc::PickedColor;\nuse smithay::backend::allocator::Fourcc;\nuse smithay::backend::input::ButtonState;\nuse smitha"
  },
  {
    "path": "src/input/pick_window_grab.rs",
    "chars": 4751,
    "preview": "use smithay::backend::input::ButtonState;\nuse smithay::input::pointer::{\n    AxisFrame, ButtonEvent, CursorImageStatus, "
  },
  {
    "path": "src/input/resize_grab.rs",
    "chars": 4890,
    "preview": "use smithay::desktop::Window;\nuse smithay::input::pointer::{\n    AxisFrame, ButtonEvent, CursorImageStatus, GestureHoldB"
  },
  {
    "path": "src/input/scroll_swipe_gesture.rs",
    "chars": 1455,
    "preview": "//! Swipe gesture from scroll events.\n//!\n//! Tracks when to begin, update, and end a swipe gesture from pointer axis ev"
  },
  {
    "path": "src/input/scroll_tracker.rs",
    "chars": 923,
    "preview": "pub struct ScrollTracker {\n    tick: f64,\n    last: f64,\n    acc: f64,\n}\n\nimpl ScrollTracker {\n    #[allow(clippy::new_w"
  },
  {
    "path": "src/input/spatial_movement_grab.rs",
    "chars": 9080,
    "preview": "use std::time::Duration;\n\nuse smithay::input::pointer::{\n    AxisFrame, ButtonEvent, CursorImageStatus, GestureHoldBegin"
  },
  {
    "path": "src/input/swipe_tracker.rs",
    "chars": 2321,
    "preview": "use std::collections::VecDeque;\nuse std::time::Duration;\n\nconst HISTORY_LIMIT: Duration = Duration::from_millis(150);\nco"
  },
  {
    "path": "src/input/touch_overview_grab.rs",
    "chars": 9415,
    "preview": "use std::time::Duration;\n\nuse smithay::desktop::Window;\nuse smithay::input::touch::{\n    DownEvent, GrabStartData as Tou"
  },
  {
    "path": "src/input/touch_resize_grab.rs",
    "chars": 3060,
    "preview": "use smithay::desktop::Window;\nuse smithay::input::touch::{\n    DownEvent, GrabStartData as TouchGrabStartData, MotionEve"
  },
  {
    "path": "src/ipc/client.rs",
    "chars": 28421,
    "preview": "use std::io::ErrorKind;\nuse std::iter::Peekable;\nuse std::path::Path;\nuse std::{env, slice};\n\nuse anyhow::{anyhow, bail,"
  },
  {
    "path": "src/ipc/mod.rs",
    "chars": 32,
    "preview": "pub mod client;\npub mod server;\n"
  },
  {
    "path": "src/ipc/server.rs",
    "chars": 34758,
    "preview": "use std::cell::RefCell;\nuse std::collections::HashSet;\nuse std::ffi::OsStr;\nuse std::os::unix::net::{UnixListener, UnixS"
  },
  {
    "path": "src/layer/mapped.rs",
    "chars": 7487,
    "preview": "use niri_config::utils::MergeWith as _;\nuse niri_config::{Config, LayerRule};\nuse smithay::backend::renderer::element::s"
  },
  {
    "path": "src/layer/mod.rs",
    "chars": 2601,
    "preview": "use niri_config::layer_rule::{LayerRule, Match};\nuse niri_config::utils::MergeWith as _;\nuse niri_config::{BlockOutFrom,"
  },
  {
    "path": "src/layout/closing_window.rs",
    "chars": 9792,
    "preview": "use std::collections::HashMap;\nuse std::rc::Rc;\n\nuse anyhow::Context as _;\nuse glam::{Mat3, Vec2};\nuse niri_config::Bloc"
  },
  {
    "path": "src/layout/floating.rs",
    "chars": 47780,
    "preview": "use std::cmp::max;\nuse std::iter::zip;\nuse std::rc::Rc;\n\nuse niri_config::utils::MergeWith as _;\nuse niri_config::{Prese"
  },
  {
    "path": "src/layout/focus_ring.rs",
    "chars": 9520,
    "preview": "use std::iter::zip;\n\nuse niri_config::{CornerRadius, Gradient, GradientRelativeTo};\nuse smithay::backend::renderer::elem"
  },
  {
    "path": "src/layout/insert_hint_element.rs",
    "chars": 1959,
    "preview": "use niri_config::CornerRadius;\nuse smithay::utils::{Logical, Point, Rectangle, Size};\n\nuse super::focus_ring::{FocusRing"
  },
  {
    "path": "src/layout/mod.rs",
    "chars": 172822,
    "preview": "//! Window layout logic.\n//!\n//! Niri implements scrollable tiling with dynamic workspaces. The scrollable tiling is mos"
  },
  {
    "path": "src/layout/monitor.rs",
    "chars": 75993,
    "preview": "use std::cmp::min;\nuse std::iter::zip;\nuse std::rc::Rc;\nuse std::time::Duration;\n\nuse niri_config::{CornerRadius, Layout"
  },
  {
    "path": "src/layout/opening_window.rs",
    "chars": 5382,
    "preview": "use std::collections::HashMap;\nuse std::rc::Rc;\n\nuse anyhow::Context as _;\nuse glam::{Mat3, Vec2};\nuse smithay::backend:"
  },
  {
    "path": "src/layout/scrolling.rs",
    "chars": 203704,
    "preview": "use std::cmp::{max, min};\nuse std::iter::{self, zip};\nuse std::rc::Rc;\nuse std::time::Duration;\n\nuse niri_config::utils:"
  },
  {
    "path": "src/layout/shadow.rs",
    "chars": 6232,
    "preview": "use std::iter::zip;\n\nuse niri_config::CornerRadius;\nuse smithay::utils::{Logical, Point, Rectangle, Size};\n\nuse crate::r"
  },
  {
    "path": "src/layout/tab_indicator.rs",
    "chars": 14455,
    "preview": "use std::iter::zip;\nuse std::mem;\n\nuse niri_config::{CornerRadius, Gradient, GradientRelativeTo, TabIndicatorPosition};\n"
  },
  {
    "path": "src/layout/tests/animations.rs",
    "chars": 32661,
    "preview": "use std::fmt::Write as _;\n\nuse insta::assert_snapshot;\nuse niri_config::animations::{Curve, EasingParams, Kind};\n\nuse su"
  },
  {
    "path": "src/layout/tests/fullscreen.rs",
    "chars": 17723,
    "preview": "use insta::assert_snapshot;\n\nuse super::*;\n\n#[test]\nfn fullscreen() {\n    let ops = [\n        Op::AddOutput(1),\n        "
  },
  {
    "path": "src/layout/tests.rs",
    "chars": 119250,
    "preview": "use std::cell::{Cell, OnceCell, RefCell};\n\nuse niri_config::utils::{Flag, MergeWith as _};\nuse niri_config::workspace::W"
  },
  {
    "path": "src/layout/tile.rs",
    "chars": 51820,
    "preview": "use core::f64;\nuse std::rc::Rc;\n\nuse niri_config::utils::MergeWith as _;\nuse niri_config::{Color, CornerRadius, Gradient"
  },
  {
    "path": "src/layout/workspace.rs",
    "chars": 68532,
    "preview": "use std::cmp::max;\nuse std::rc::Rc;\nuse std::time::Duration;\n\nuse niri_config::utils::MergeWith as _;\nuse niri_config::{"
  },
  {
    "path": "src/lib.rs",
    "chars": 487,
    "preview": "#[macro_use]\nextern crate tracing;\n\n#[cfg(feature = \"dbus\")]\npub mod a11y;\npub mod animation;\npub mod backend;\npub mod c"
  },
  {
    "path": "src/main.rs",
    "chars": 12268,
    "preview": "#[macro_use]\nextern crate tracing;\n\nuse std::fmt::Write as _;\nuse std::fs::File;\nuse std::io::{self, Write};\nuse std::os"
  },
  {
    "path": "src/niri.rs",
    "chars": 234884,
    "preview": "use std::cell::{Cell, OnceCell, RefCell};\nuse std::collections::{HashMap, HashSet};\nuse std::ffi::OsString;\nuse std::os:"
  },
  {
    "path": "src/protocols/ext_workspace.rs",
    "chars": 25006,
    "preview": "//! ext-workspace protocol implementation.\n//!\n//! This is how we map the protocol concepts to the niri concepts:\n//!\n//"
  },
  {
    "path": "src/protocols/foreign_toplevel.rs",
    "chars": 16716,
    "preview": "use std::collections::hash_map::Entry;\nuse std::collections::HashMap;\n\nuse arrayvec::ArrayVec;\nuse smithay::output::Outp"
  },
  {
    "path": "src/protocols/gamma_control.rs",
    "chars": 9485,
    "preview": "use std::collections::HashMap;\nuse std::fs::File;\nuse std::io::Read;\n\nuse smithay::output::Output;\nuse smithay::reexport"
  },
  {
    "path": "src/protocols/mod.rs",
    "chars": 186,
    "preview": "pub mod ext_workspace;\npub mod foreign_toplevel;\npub mod gamma_control;\npub mod mutter_x11_interop;\npub mod output_manag"
  },
  {
    "path": "src/protocols/mutter_x11_interop.rs",
    "chars": 3186,
    "preview": "use mutter_x11_interop::MutterX11Interop;\nuse smithay::reexports::wayland_server::{\n    Client, DataInit, Dispatch, Disp"
  },
  {
    "path": "src/protocols/output_management.rs",
    "chars": 38956,
    "preview": "use std::collections::hash_map::Entry;\nuse std::collections::HashMap;\nuse std::iter::zip;\nuse std::mem;\n\nuse niri_config"
  },
  {
    "path": "src/protocols/raw.rs",
    "chars": 922,
    "preview": "pub mod mutter_x11_interop {\n    pub mod v1 {\n        pub use self::generated::server;\n\n        mod generated {\n        "
  },
  {
    "path": "src/protocols/screencopy.rs",
    "chars": 24861,
    "preview": "use std::collections::{HashMap, HashSet};\nuse std::sync::atomic::{AtomicBool, Ordering};\nuse std::sync::Arc;\nuse std::ti"
  },
  {
    "path": "src/protocols/virtual_pointer.rs",
    "chars": 18807,
    "preview": "use std::collections::HashSet;\nuse std::sync::Mutex;\n\nuse smithay::backend::input::{\n    AbsolutePositionEvent, Axis, Ax"
  },
  {
    "path": "src/render_helpers/border.rs",
    "chars": 9889,
    "preview": "use std::collections::HashMap;\nuse std::rc::Rc;\n\nuse glam::{Mat3, Vec2};\nuse niri_config::{\n    Color, CornerRadius, Gra"
  },
  {
    "path": "src/render_helpers/clipped_surface.rs",
    "chars": 10069,
    "preview": "use glam::{Mat3, Vec2};\nuse niri_config::CornerRadius;\nuse smithay::backend::renderer::element::surface::WaylandSurfaceR"
  }
]

// ... and 5346 more files (download for full content)

About this extraction

This page contains the full source code of the niri-wm/niri GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 5546 files (6.4 MB), approximately 2.1M tokens, and a symbol index with 3867 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!