i3-compatible Wayland compositor
Go to file
Alexander Orzechowski bab6b79af2 Fix SIGSEGV on surface destroy
```
Program terminated with signal SIGSEGV, Segmentation fault.

warning: Section `.reg-xstate/3960717' in core file too small.
0  container_get_siblings (container=0x55bcde4797f0) at ../sway/tree/container.c:1228
1228		if (list_find(container->pending.workspace->tiling, container) != -1) {
[Current thread is 1 (Thread 0x7fa23b4a2940 (LWP 3960717))]
(gdb) bt full=
No symbol "full" in current context.
(gdb) bt full
0  container_get_siblings (container=0x55bcde4797f0) at ../sway/tree/container.c:1228
1  0x000055bcdb62c704 in edge_is_external (cont=0x55bcde4797f0, edge=(WLR_EDGE_TOP | WLR_EDGE_LEFT))
    at ../sway/input/seatop_default.c:54
        siblings = 0x55bcde4797f0
        index = 32766
        layout = L_NONE
        __PRETTY_FUNCTION__ = "edge_is_external"
2  0x000055bcdb62c96f in find_resize_edge (cont=0x55bcde4797f0, surface=0x0, cursor=0x55bcddd5c2e0)
    at ../sway/input/seatop_default.c:106
        edge = (WLR_EDGE_TOP | WLR_EDGE_LEFT)
3  0x000055bcdb620b3c in cursor_update_image (cursor=0x55bcddd5c2e0, node=0x55bcde4797f0) at ../sway/input/cursor.c:144
        edge = WLR_EDGE_NONE
4  0x000055bcdb62eb8f in handle_rebase (seat=0x55bcddd5a740, time_msec=488992944) at ../sway/input/seatop_default.c:773
        e = 0x55bcddd5c8e0
        cursor = 0x55bcddd5c2e0
        surface = 0x0
        sx = 0
        sy = 0
5  0x000055bcdb62c531 in seatop_rebase (seat=0x55bcddd5a740, time_msec=488992944) at ../sway/input/seat.c:1585
6  0x000055bcdb620a7d in cursor_rebase (cursor=0x55bcddd5c2e0) at ../sway/input/cursor.c:126
        time_msec = 488992944
7  0x000055bcdb620ac4 in cursor_rebase_all () at ../sway/input/cursor.c:136
        seat = 0x55bcddd5a740
8  0x000055bcdb61cc95 in transaction_apply (transaction=0x55bcde5b28c0) at ../sway/desktop/transaction.c:704
9  0x000055bcdb61ccdb in transaction_progress () at ../sway/desktop/transaction.c:716
10 0x000055bcdb61d1f9 in transaction_commit_pending () at ../sway/desktop/transaction.c:836
        transaction = 0x55bcde5b28c0
11 0x000055bcdb61d596 in _transaction_commit_dirty (server_request=true) at ../sway/desktop/transaction.c:912
12 0x000055bcdb61d5ac in transaction_commit_dirty () at ../sway/desktop/transaction.c:916
13 0x000055bcdb65f579 in view_unmap (view=0x55bcde2ff180) at ../sway/tree/view.c:847
        parent = 0x55bcde489010
        ws = 0x55bcdde19080
        seat = 0x55bcddd5a198
14 0x000055bcdb61e461 in handle_unmap (listener=0x55bcde2ff368, data=0x0) at ../sway/desktop/xdg_shell.c:394
        xdg_shell_view = 0x55bcde2ff180
        view = 0x55bcde2ff180
        __PRETTY_FUNCTION__ = "handle_unmap"
15 0x00007fa23c4ae87f in wlr_signal_emit_safe (signal=0x55bcde46cf38, data=0x0) at ../util/signal.c:29
        pos = 0x55bcde2ff368
        l = 0x55bcde2ff368
        cursor = {link = {prev = 0x55bcde2ff368, next = 0x7ffe240702a0}, notify = 0x7fa23c4ae7c9 <handle_noop>}
        end = {link = {prev = 0x7ffe24070280, next = 0x55bcde46cf38}, notify = 0x7fa23c4ae7c9 <handle_noop>}
16 0x00007fa23c47c3c7 in unmap_xdg_surface (surface=0x55bcde46ce30) at ../types/xdg_shell/wlr_xdg_surface.c:40
        __PRETTY_FUNCTION__ = "unmap_xdg_surface"
        popup = 0x55bcde46ce60
        popup_tmp = 0x55bcde46ce60
        configure = 0x7ffe24070360
        tmp = 0x55bcde488020
17 0x00007fa23c47cd47 in xdg_surface_role_precommit (wlr_surface=0x55bcde488020, state=0x55bcde4881a8)
    at ../types/xdg_shell/wlr_xdg_surface.c:330
        surface = 0x55bcde46ce30
18 0x00007fa23c4813b2 in surface_commit_state (surface=0x55bcde488020, next=0x55bcde4881a8) at ../types/wlr_compositor.c:407
        __PRETTY_FUNCTION__ = "surface_commit_state"
        invalid_buffer = false
        subsurface = 0xbd8e9aecae023300
--Type <RET> for more, q to quit, c to continue without paging--
19 0x00007fa23c48192a in surface_handle_commit (client=0x55bcde488850, resource=0x55bcde2fdb80) at ../types/wlr_compositor.c:523
        surface = 0x55bcde488020
20 0x00007fa23bb5ed4a in  () at /usr/lib/libffi.so.8
21 0x00007fa23bb5e267 in  () at /usr/lib/libffi.so.8
22 0x00007fa23c517323 in  () at /usr/lib/libwayland-server.so.0
23 0x00007fa23c5125cc in  () at /usr/lib/libwayland-server.so.0
24 0x00007fa23c5151ca in wl_event_loop_dispatch () at /usr/lib/libwayland-server.so.0
25 0x00007fa23c512d37 in wl_display_run () at /usr/lib/libwayland-server.so.0
26 0x000055bcdb616885 in server_run (server=0x55bcdb68c5c0 <server>) at ../sway/server.c:307
27 0x000055bcdb61594e in main (argc=3, argv=0x7ffe24070af8) at ../sway/main.c:433
```

It seems to be happening because of this set of events all happening
in the span of a single transaction:
1. You kill a tiled window that is the only window in a workplace.
2. Sway will destroy the workspace but not yet the container - this
   makes `con->pending.workspace` NULL.
3. Cursor glyphs get recomputed causing sway to recompute if the cursor
   is on a container edge. 
4. That computation causes an access to the NULL workspace. Crash.
2024-01-18 18:36:54 +03:00
.builds ci: add libdisplay-info dependency 2023-02-28 23:19:33 +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 Use shm_open instead of mkstemp 2022-11-25 00:05:12 +01:00
common common: move load_image to swaybar 2023-11-23 20:42:04 +01:00
completions build: move completions to separate file 2022-11-28 18:51:45 -05:00
include scene_graph: Implement toplevel clipping 2024-01-18 18:36:54 +03:00
protocols Chase wlroots!4440 2023-11-22 00:42:55 +03:00
sway Fix SIGSEGV on surface destroy 2024-01-18 18:36:54 +03:00
swaybar common: move load_image to swaybar 2023-11-23 20:42:04 +01:00
swaymsg fix typo 2023-02-25 10:50:43 +01:00
swaynag swaynag/config.c: fix build against gcc-14 (-Walloc-size) 2023-11-03 13:25:27 +01:00
.editorconfig Create .editorconfig 2016-07-04 14:12:32 +02:00
.gitignore gitignore: Ignore clangd-generated directory .cache/ 2023-10-23 11:05:08 +02:00
.mailmap Add a .mailmap file 2023-03-26 23:22:30 +02:00
config.in Use locale time format for default bar command 2023-11-21 17:42:09 +01: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 Detect Nvidia proprietary driver via drmGetVersion() 2023-12-12 10:04:14 -05:00
meson_options.txt Add meson options to enable/disable swaybar and swaynag 2021-07-21 18:24:09 +02:00
README.ar.md Translate README to Arabic 2023-09-14 13:37:50 +02:00
README.cs.md readme: Stop recommending setuid bit for non-logind systems 2023-09-13 10:21:59 +02:00
README.de.md Update README.de.md to match the EN one 2023-11-24 12:10:47 +01:00
README.dk.md readme: Stop recommending setuid bit for non-logind systems 2023-09-13 10:21:59 +02:00
README.es.md readme: Stop recommending setuid bit for non-logind systems 2023-09-13 10:21:59 +02:00
README.fr.md readme: Stop recommending setuid bit for non-logind systems 2023-09-13 10:21:59 +02:00
README.ge.md readme: Stop recommending setuid bit for non-logind systems 2023-09-13 10:21:59 +02:00
README.gr.md readme: Stop recommending setuid bit for non-logind systems 2023-09-13 10:21:59 +02:00
README.hi.md readme: Stop recommending setuid bit for non-logind systems 2023-09-13 10:21:59 +02:00
README.hu.md readme: Stop recommending setuid bit for non-logind systems 2023-09-13 10:21:59 +02:00
README.ir.md readme: Stop recommending setuid bit for non-logind systems 2023-09-13 10:21:59 +02:00
README.it.md readme: Stop recommending setuid bit for non-logind systems 2023-09-13 10:21:59 +02:00
README.ja.md Improve Japanese translation 2022-10-08 10:12:00 +02:00
README.ko.md readme: Stop recommending setuid bit for non-logind systems 2023-09-13 10:21:59 +02:00
README.md readme: add swaybg as optional dep 2024-01-02 14:08:18 +01:00
README.nl.md readme: Stop recommending setuid bit for non-logind systems 2023-09-13 10:21:59 +02:00
README.no.md readme: Stop recommending setuid bit for non-logind systems 2023-09-13 10:21:59 +02:00
README.pl.md readme: Stop recommending setuid bit for non-logind systems 2023-09-13 10:21:59 +02:00
README.pt.md readme: Stop recommending setuid bit for non-logind systems 2023-09-13 10:21:59 +02:00
README.ro.md readme: Stop recommending setuid bit for non-logind systems 2023-09-13 10:21:59 +02:00
README.ru.md readme: Stop recommending setuid bit for non-logind systems 2023-09-13 10:21:59 +02:00
README.sv.md readme: Stop recommending setuid bit for non-logind systems 2023-09-13 10:21:59 +02:00
README.tr.md readme: Stop recommending setuid bit for non-logind systems 2023-09-13 10:21:59 +02:00
README.uk.md readme: Stop recommending setuid bit for non-logind systems 2023-09-13 10:21:59 +02:00
README.zh-CN.md readme: Stop recommending setuid bit for non-logind systems 2023-09-13 10:21:59 +02:00
README.zh-TW.md readme: Stop recommending setuid bit for non-logind systems 2023-09-13 10:21:59 +02:00
sway.desktop Update language in sway.desktop & sway(1) 2019-03-10 15:09:52 -04:00

sway

English - عربي - Č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: system tray)
  • swaybg (optional: wallpaper)
  • scdoc (optional: man pages) *
  • git (optional: version info) *

* Compile-time dep

Run these commands:

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