i3-compatible Wayland compositor
Find a file
Thomas Hebb 4db1e52dd8 layer_shell: keep output non-NULL wherever possible
Our layer shell implementation assigns every layer surface to an output
on creation. It tracks this output using the output field on the
underlying wlr_layer_surface_v1 structure. As such, much of the existing
code assumes that output is always non-NULL and omits NULL checks
accordingly.

However, there are currently two cases where we destroy a
sway_layer_surface and output is NULL. The first is when we can't find
an output to assign the surface to and destroy it immediately after
creation. The second is when we destroy a surface in response to its
output getting destroyed, as we set output to NULL in
handle_output_destroy() before we call wlr_layer_surface_v1_destroy(),
which is what calls the appropriate unmap and destroy callbacks.

The former case doesn't cause any problems, since we haven't even
allocated a sway_layer_surface at that point or registered any
callbacks. The latter case, however, currently triggers a crash (#6120)
if a popup is visible, since our popup_handle_unmap() implementation
can't handle a NULL output.

To fix this issue, keep output set until right before we free the
sway_layer_surface. All we need to do is remove some of the cleanup
logic from handle_output_destroy(), since as of commit c9060bcc12
("layer-shell: replace close() with destroy()") that same logic is
guaranteed to be happen later when wlroots calls handle_destroy() as
part of wlr_layer_surface_v1_destroy().

This lets us remove some NULL checks from other unmap/destroy callbacks,
which is nice. We also don't need to check that the wlr_output points to
a valid sway_output anymore, since we unset that pointer after disabling
the output as of commit a0bbe67076 ("Address emersions comments on
output re-enabling") Just to be safe, I've added assertions that the
wlr_output is non-NULL wherever we use it.

Fixes #6120.
2022-02-06 13:11:08 -08:00
.builds Update URL to wlroots project (GitHub->GitLab) 2021-11-02 08:43:24 +01:00
.github/ISSUE_TEMPLATE github: don't truncate debug logs 2021-10-17 21:28:51 +02:00
assets License wallpapers as CC-0 2019-12-16 14:35:58 -05:00
client cairo: Replace <cairo/cairo.h> by <cairo.h> 2021-05-10 10:28:32 +02:00
common Add safety assert in parse_movement_unit 2022-01-09 10:17:02 +01:00
completions i3-compat: add GET_BINDING_STATE IPC command 2020-06-14 00:55:14 -04:00
contrib grimshot: Exit 1 on cancellation 2021-07-10 13:03:42 +02:00
include xwayland: listen to request_activate event 2022-01-31 11:23:36 +01:00
protocols Add support for linux-dmabuf surface hints 2021-12-13 09:59:33 -06:00
sway layer_shell: keep output non-NULL wherever possible 2022-02-06 13:11:08 -08:00
swaybar tray: do not render passive items 2022-01-19 09:20:27 +01:00
swaymsg swaymsg: add GET_TREE pretty-printing 2021-12-21 11:07:11 +01:00
swaynag swaynag: remove buffer destruction condition 2022-01-23 10:41:57 -05:00
.editorconfig Create .editorconfig 2016-07-04 14:12:32 +02:00
.gitignore Allocate minimum size necessary in pango text functions. (#3473) 2019-01-20 15:03:30 +01:00
config.in config.in: use swaynag -B instead of -b 2021-10-17 21:30:33 +02:00
CONTRIBUTING.md Fix IRC links in READMEs and templates 2021-05-26 08:25:13 +02:00
LICENSE MIT license 2017-01-06 13:45:48 -05:00
meson.build build: execute wlroots subproject before finding deps 2022-01-18 13:57:50 -05:00
meson_options.txt Add meson options to enable/disable swaybar and swaynag 2021-07-21 18:24:09 +02:00
README.de.md Update URL to wlroots project (GitHub->GitLab) 2021-11-02 08:43:24 +01:00
README.dk.md Update URL to wlroots project (GitHub->GitLab) 2021-11-02 08:43:24 +01:00
README.es.md Update URL to wlroots project (GitHub->GitLab) 2021-11-02 08:43:24 +01:00
README.fr.md Update URL to wlroots project (GitHub->GitLab) 2021-11-02 08:43:24 +01:00
README.gr.md Update URL to wlroots project (GitHub->GitLab) 2021-11-02 08:43:24 +01:00
README.hu.md Update URL to wlroots project (GitHub->GitLab) 2021-11-02 08:43:24 +01:00
README.ir.md readme: use right-to-left marks in ir translation 2021-12-07 15:26:57 +01:00
README.ja.md Update URL to wlroots project (GitHub->GitLab) 2021-11-02 08:43:24 +01:00
README.ko.md Update URL to wlroots project (GitHub->GitLab) 2021-11-02 08:43:24 +01:00
README.md Update URL to wlroots project (GitHub->GitLab) 2021-11-02 08:43:24 +01:00
README.nl.md Update URL to wlroots project (GitHub->GitLab) 2021-11-02 08:43:24 +01:00
README.pl.md Update URL to wlroots project (GitHub->GitLab) 2021-11-02 08:43:24 +01:00
README.pt.md Update URL to wlroots project (GitHub->GitLab) 2021-11-02 08:43:24 +01:00
README.ro.md Update URL to wlroots project (GitHub->GitLab) 2021-11-02 08:43:24 +01:00
README.ru.md Update URL to wlroots project (GitHub->GitLab) 2021-11-02 08:43:24 +01:00
README.tr.md Update URL to wlroots project (GitHub->GitLab) 2021-11-02 08:43:24 +01:00
README.uk.md Update URL to wlroots project (GitHub->GitLab) 2021-11-02 08:43:24 +01:00
README.zh-CN.md Update URL to wlroots project (GitHub->GitLab) 2021-11-02 08:43:24 +01:00
README.zh-TW.md Update URL to wlroots project (GitHub->GitLab) 2021-11-02 08:43:24 +01:00
sway.desktop Update language in sway.desktop & sway(1) 2019-03-10 15:09:52 -04:00

sway

English - 日本語 - Français - Українська - Español - Polski - 中文-简体 - Deutsch - Nederlands - Русский - 中文-繁體 - Português - Dansk - 한국어 - Română - Magyar - 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 *
  • pcre
  • json-c
  • pango
  • cairo
  • gdk-pixbuf2 (optional: system tray)
  • scdoc (optional: man pages) *
  • git (optional: version info) *

* Compile-time dep

Run these commands:

meson build/
ninja -C build/
sudo ninja -C build/ install

On systems without logind nor seatd, you need to suid the sway binary:

sudo chmod a+s /usr/local/bin/sway

Sway will drop root permissions shortly after startup.

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. Some display managers may work but are not supported by sway (gdm is known to work fairly well).