seat_get_focus() can return NULL when the focus stack is empty. a few call sites don't check for this and just dereference the result, which crashes sway. this happens when a client disconnects abruptly, leaving the seat with a stale has_focus flag or empty focus stack. whatever touches focus next dereferences NULL. the two confirmed crash sites were seat_set_workspace_focus and seat_set_focus_surface (coredumps below). seat_unfocus_unless_client has the same pattern so a check was added there too for safety. cannot remember how this one was triggered: ``` seat_send_unfocus () seat_set_workspace_focus () seat_set_focus () wl_signal_emit_mutable () container_begin_destroy () view_unmap () handle_unmap () wl_signal_emit_mutable () wlr_surface_unmap () destroy_xdg_toplevel () destroy_xdg_surface_role_object () destroy_xdg_surface () xdg_client_handle_resource_destroy () wl_client_destroy () ``` mouse click on empty container (clicked wallpaper, likely just after a wallpaper engine crash): ``` seat_send_unfocus () seat_set_workspace_focus () seat_set_focus () handle_button () wl_signal_emit_mutable () handle_pointer_button () handle_libinput_readable () wl_event_loop_dispatch () ``` IPC workspace switch (with noctalia workspace widget): ``` seat_send_unfocus () seat_set_workspace_focus () seat_set_focus () workspace_switch () cmd_workspace () execute_command () ipc_client_handle_command () ipc_client_handle_readable () wl_event_loop_dispatch () ``` layer surface teardown (restarted noctalia shell): ``` seat_send_unfocus () seat_set_focus_surface () seat_set_focus_layer () handle_node_destroy () wl_signal_emit_mutable () sway_scene_node_destroy () layer_surface_destroy () surface_handle_role_resource_destroy () ``` |
||
|---|---|---|
| .builds | ||
| .github/ISSUE_TEMPLATE | ||
| assets | ||
| client | ||
| common | ||
| completions | ||
| include | ||
| protocols | ||
| sway | ||
| swaybar | ||
| swaymsg | ||
| swaynag | ||
| .editorconfig | ||
| .gitignore | ||
| .mailmap | ||
| config.in | ||
| CONTRIBUTING.md | ||
| LICENSE | ||
| meson.build | ||
| meson_options.txt | ||
| README.ar.md | ||
| README.az.md | ||
| README.cs.md | ||
| README.de.md | ||
| README.dk.md | ||
| README.es.md | ||
| README.fr.md | ||
| README.ge.md | ||
| README.gr.md | ||
| README.hi.md | ||
| README.hu.md | ||
| README.ir.md | ||
| README.it.md | ||
| README.ja.md | ||
| README.ko.md | ||
| README.md | ||
| README.nl.md | ||
| README.no.md | ||
| README.pl.md | ||
| README.pt.md | ||
| README.ro.md | ||
| README.ru.md | ||
| README.sr.md | ||
| README.sv.md | ||
| README.tr.md | ||
| README.uk.md | ||
| README.zh-CN.md | ||
| README.zh-TW.md | ||
| release.sh | ||
| sway.desktop | ||
sway
English - عربي - Azərbaycanca - Česky - Deutsch - Dansk - Español - Français - ქართული - Ελληνικά - हिन्दी - Magyar - فارسی - Italiano - 日本語 - 한국어 - Nederlands - Norsk - Polski - Português - Română - Русский - Српски - Svenska - Türkçe - Українська - 中文-简体 - 中文-繁體
sway is an i3-compatible Wayland compositor. Read the FAQ. Join the IRC channel (#sway on irc.libera.chat).
Release Signatures
Releases are signed with E88F5E48 and published on GitHub.
Installation
From Packages
Sway is available in many distributions. Try installing the "sway" package for yours.
Compiling from Source
Check out this wiki page if you want to build the HEAD of sway and wlroots for testing or development.
Install dependencies:
- meson *
- wlroots
- wayland
- wayland-protocols *
- pcre2
- json-c
- pango
- cairo
- gdk-pixbuf2 (optional: additional image formats for system tray)
- swaybg (optional: wallpaper)
- scdoc (optional: man pages) *
- git (optional: version info) *
* Compile-time dep
Run these commands:
meson setup build/
ninja -C build/
sudo ninja -C build/ install
Configuration
If you already use i3, then copy your i3 config to ~/.config/sway/config and
it'll work out of the box. Otherwise, copy the sample configuration file to
~/.config/sway/config. It is usually located at /etc/sway/config.
Run man 5 sway for information on the configuration.
Running
Run sway from a TTY or from a display manager.