跳至內容

Sway

出自 Arch Linux 中文维基

Sway(縮寫自 SirCmpwn's Wayland compositor[1])是一款專為 Wayland 設計的合成器,旨在與 i3 完全兼容。根據官網所述:

Sway 是 Wayland 的合成器,也是 x11 的 i3 窗口管理器的替代品。它可以根據您現有的 i3 配置工作,並支持 i3 的大部分特性以及一些附加功能

若您喜歡視覺效果,也可以試試 swayfxAUR,這是一個帶有視覺效果的 Sway 分支。

Sway 的另一個分支 sway-scroll-gitAUR 具有滾動布局(如同 PaperWM 和 niri包)。還支持動畫效果、窗口內容縮放和概覽模式。

安裝

安裝 sway包。由於依賴關係緊密,請在更新 sway 時始終更新 wlroots。

注意:所有專有顯卡驅動程序都不受支持,包括 NVIDIA。在 NVIDIA 驅動程序版本 495 之後,需要啟用內核級顯示模式設置並在運行 sway 時附加 --unsupported-gpu 參數。

您還可以安裝 swaylock包、 swayidle包 和 swaybg包,用以鎖定屏幕、設定空閒管理和設置壁紙。

默認的應用程式啟動器為 wmenu包,默認的終端模擬器是 foot。在啟動 sway 之前,建議安裝它們或在配置文件中設置新的啟動器和終端。您可在 Sway wiki 的遷移指南上找到一些 i3 實用程序的其他 Wayland 兼容替代品。

啟動

Sway 在啟動之前需要訪問您的硬體設備(如鍵盤、滑鼠和顯卡),這些硬體設備的集合稱為 seat,如同 sd-login(3) § DEFINITION OF TERMS 的 seat 小節所述。

在 Arch Linux 上,Sway 可以使用以下任一方式訪問您的 seat。

若 polkit 已安裝在您的系統上, Sway 應會自動訪問你的 seat。

若 polkit 未安裝在您的系統上,並且您想使用 seatd 來替代,請將您添加到 seat 用戶組並啟用/啟動 seatd.service,然後重新登錄。

您可以選擇以下方法之一來啟動 Sway。

手動啟動

要啟動 Sway,只需在 Linux 終端執行 sway。

自動啟動

與 X 類似,可以通過將以下內容添加到 shell 初始化文件來啟動 Sway(請參閱命令行解釋器#登錄 Shell):

if [ -z "$WAYLAND_DISPLAY" ] && [ -n "$XDG_VTNR" ] && [ "$XDG_VTNR" -eq 1 ] ; then
   exec sway
fi

有關更多詳細信息,請參閱 Xinit#登錄時自動啟動 X。

使用顯示管理器啟動

Sway 會話位於 /usr/share/wayland-sessions/sway.desktop。它可以被 GDM 和 SDDM 等現代顯示管理器自動識別。

也可以將 systemd 用戶服務作為一個顯示管理器去運行 sway。

您還可以使用基於文本的顯示管理器,請參閱顯示管理器#控制台。

配置

若您已在使用 i3,則可以將 i3 配置文件複製到 ~/.config/sway/config,該文件開箱即用。否則,請將位於 /etc/sway/config 的示例配置文件複製到 ~/.config/sway/config。有關配置的信息參見 sway(5)。

注意:用戶配置文件中應當包含 include /etc/sway/config.d/* 一行,以便從引置文件(drop-in files)中讀取並應用配置。sway包 提供了一個引置文件 50-systemd-user.conf,其會將多個環境變量導入 systemd 用戶會話和 dbus。一些應用需要這些環境變量以正常運行(如xdg-desktop-portal-wlr包)。

鍵盤布局

默認情況下,sway 從 US QWERTY 鍵盤布局開始。配置多個鍵盤布局:

~/.config/sway/config
input * {
    xkb_layout "us,de,ru"
    xkb_variant "colemak,,typewriter"
    xkb_options "grp:win_space_toggle,caps:none"
}

input <identifier> xkb_model "pc101"

更多細節請參閱 xkeyboard-config(7) 與 sway-input(5)。

在啟動 sway 時,也可以使用環境變量(XKB_DEFAULT_LAYOUT、XKB_DEFAULT_VARIANT 等)配置鍵盤布局。配置選項優先於環境變量。

打字延遲和速率

要更改打字延遲和速率,您可以在 input 節添加以下行:

~/.config/sway/config
input <identifier> repeat_delay 300
input <identifier> repeat_rate 30

狀態欄

Sway 附帶了一個默認狀態欄,名為 swaybar ,可在純 Wayland 環境中運行。swaybar 可以調用 shell 腳本或其他程序來在狀態欄中顯示信息。有關詳細信息,請參閱 sway-bar(5) 與 swaybar-protocol(7)。

提示:swaybar 對托盤圖標的支持並不完整,請考慮使用 waybar包 等替代方案,在 bar 節設置 swaybar_command waybar 即可啟用。

i3status 是在 Wayland 下獲取實用的默認狀態欄的一個選項,您只需在 sway 配置的末尾添加以下代碼段:

~/.config/sway/config
bar {
    status_command i3status
}

欲為 i3status 啟用色彩輸出,請在 i3status 配置中調整以下部分:

~/.config/i3status/config
general {
    colors = true
    interval = 5
}

Output

sway 的 output 命令可以為不同的顯示輸出指定詳細配置,包括但不限於壁紙、縮放、位置等。如有需要,您可將不同的 output 命令整合到一行,例如:

~/.config/sway/config
output HDMI-A-1 mode 1920x1080 pos 1920 0 bg ~/wallpaper.png stretch

output 有多種方式匹配顯示輸出。可以使用其指定的輸出名稱,也可以使用 "*" 匹配所有顯示輸出,或是使用顯示器的不同名稱(由品牌、型號和序列號組成的字符串),例如:

~/.config/sway/config
output "Some Company ABC123 0x00000000" pos 1920 0

可以使用以下命令獲取輸出名稱和一些其他信息:

$ swaymsg -t get_outputs

要深入了解配置和附加選項,請參閱 sway-output(5)。

壁紙

sway 用專用程序處理壁紙,最簡單的例子是 swaybg包,其可直接由 sway 管理。若要運行 output ... bg 命令,請安裝 swaybg包。

可以將以下行附加在 sway 配置的任意位置,其會在所有顯示器上設置背景圖像:

~/.config/sway/config
output "*" bg /path/to/image fill

當然,/path/to/image 應當被替換為存在的圖像路徑。

如果只需要純色背景,可以按如下方式設置:

output * bg #000000 solid_color

請參閱 Sway wiki 以了解更多用於管理壁紙的工具。

HiDPI

注意:Xwayland 也會被縮放,且會降低解析度[2]。欲以原始解析度運行 Xwayland 下的程序,則需禁用縮放。您可使用一些工具臨時禁用縮放,如使用 swaymsg:
swaymsg output "*" scale 1
欲恢復到自動設定則設為 0。
自動設定

Sway 默認使用整數倍縮放。若滿足以下條件[3]:

  • 屏幕通過 EDID( Extended Display Identification Data,外部顯示設備標識數據)提供有效的物理顯示信息。
  • DPI(每英寸像素數)至少為 192。
  • 屏幕解析度的高至少為 1200 像素。

那麼 Sway 會使用 2 倍縮放。一些設備(如 Framework Laptop 16)的 DPI 近似(但不是)192,在這種情況下,您可能需要手動配置分數倍縮放。

手動設定

在配置文件裡用 output 命令設置縮放倍數。可以設置分數倍縮放,不過 HiDPI 屏幕通常為 2。

~/.config/sway/config
output <名稱> scale <倍數>

可以使用以下命令獲知顯示器名稱:

$ swaymsg -t get_outputs

撕裂

Sway 默認會同步幀更新(vsync,垂直同步)以使輸出畫面的每一幀都幀完整而不撕裂,但是會帶來一些延遲。在一些使用場景(如遊戲)下禁用垂直同步可以使輸出更為順暢:

~/.config/sway/config
output <name> allow_tearing yes
output * max_render_time off

輸入設備

可以調整特定輸入設備的配置。例如,若要為所有觸摸板啟用點擊以單擊和自然滾動,請使用以下配置:

~/.config/sway/config
input type:touchpad {
    tap enabled
    natural_scroll enabled
}

要為特定觸摸板設定配置,請使用 swaymsg -t get_inputs 獲取設備標識符並用其代替上述配置中的 type:touchpad。

注意:命令 swaymsg -t get_inputs 的輸出可能會使用\來轉義/等符號(如 "2:14:ETPS\/2_Elantech_Touchpad"),配置時需要刪除\。

關於更多文檔和選項(如加速度或完全禁用輸入),請參閱 sway-input(5)。

若您使用數位板,請參閱 Graphics tablet#Sway(英語:Graphics tablet#Sway)。

觸控螢幕映射

在多顯示器環境中,觸控螢幕的觸摸輸入目標可以僅被映射到該觸控螢幕。

~/.config/sway/config
set $display1      "Dell Inc. DELL P2414H VHVTW542165L"
set $display2      "Dell Inc. DELL P2418HT MYDM775F152L"
set $display2-touch "8146:24835:Melfas_LGD_AIT_Touch_Controller"

input $display2-touch map_to_output $display2

自定義快捷鍵

鍵盤上的特殊按鍵可用於執行命令,如控制音量、屏幕亮度和媒體播放:

~/.config/sway/config
# 將特定按鍵綁定到 pactl 以調整 PulseAudio 音量
bindsym --locked XF86AudioRaiseVolume exec pactl set-sink-volume @DEFAULT_SINK@ +5%
bindsym --locked XF86AudioLowerVolume exec pactl set-sink-volume @DEFAULT_SINK@ -5%
bindsym --locked XF86AudioMute exec pactl set-sink-mute @DEFAULT_SINK@ toggle
bindsym --locked XF86AudioMicMute exec pactl set-source-mute @DEFAULT_SOURCE@ toggle

# 將特定按鍵綁定到 playerctl 以控制媒體
bindsym --locked XF86AudioPlay exec playerctl play-pause
bindsym --locked XF86AudioPause exec playerctl play-pause
bindsym --locked XF86AudioPrev exec playerctl previous
bindsym --locked XF86AudioNext exec playerctl next
bindsym --locked XF86AudioStop exec playerctl stop

# 將特定按鍵綁定到 brightnessctl 以控制屏幕亮度
bindsym --locked XF86MonBrightnessDown exec brightnessctl set 5%-
bindsym --locked XF86MonBrightnessUp exec brightnessctl set 5%+

# 將特定按鍵綁定到 grim 以截圖
bindsym Print exec grim

# 將特定按鍵綁定到 wmenu-run 以啟動應用程式
bindsym XF86Search exec wmenu-run

有關詳細信息和替代實用程序,請參閱:

提示:bindsym 的 --locked 參數用於允許在鎖屏下執行快捷鍵。
提示:wev包 工具提供類似於 xorg-xev包 的功能,但運行於 Wayland。
注意:Systemd 會處理一些特殊按鍵,如電源鍵和蓋子打開/關閉事件。這可能會干擾在 sway 中配置的快捷鍵。請參閱 loginctl(1) 與 logind.conf(5) 以獲取有關如何在 systemd 中配置它們的詳細信息。

圖形指示條

在調整某些百分比值設置(如亮度或音量)時,可以顯示一個圖形指示條。在 Sway 中提供此工具的一個不錯的選擇是 wob包(或 wob-gitAUR),其是 Wayland 上 layer-shell 協議的實現,提供了流行的 X 工具 xobAUR 的部分功能。有關使用示例,請參閱項目網站。

工作區概覽

如果您在工作區開啟了很多窗口,導致難以分辨,那麼 sovAUR 可以派上用場。它是一個疊加層,可以顯示所有工作區的概覽,使 sway 導航更容易。其可以顯示程序名稱、窗口標題,支持多 output 配置。關於詳細信息,請參閱項目網站。

空閒管理

Sway 有一個名為 swayidle包 的專用空閒管理守護程序來處理空閒會話。可以用不同的方法來啟動和參數化守護程序。最簡單的方法是使用 sway 本身的配置。swayidle 接受大量參數來配置 timeout(超時,又名「空閒」)、resume(恢復,超時後從空閒中恢復)、before-sleep(睡眠前)等事件,請參閱 swayidle(1) 了解更多細節和事件的進一步解釋。然後,可以為每個事件分配一個操作。要為一個事件分配多個操作,只需重複觸發器即可。

以下配置可使 swayidle 在 30 分鐘後鎖定屏幕,並在 5 秒後將其關閉:

~/.config/sway/config
exec swayidle -w \
	timeout 1800 'swaylock -f' \
	timeout 1805 'swaymsg "output * power off"' \
		resume 'swaymsg "output * power on"'

要更快地關閉鎖定屏幕,例如在10秒後,請為鎖定管理器設置進程列表,並相應地執行 swaymsg "output * power off" ,如下:

timeout 10 'if pgrep -x swaylock; then swaymsg "output * power off"; fi' resume 'if pgrep -x swaylock; then swaymsg "output * power on"; fi' 

要在屏幕鎖定前掛起和暫停播放媒體,請將以下配置添加到 swayidle 命令:

before-sleep 'playerctl pause;swaylock -f'
注意:Systemd 也處理一些空閒事件,這些事件可能與在 sway 中配置的事件衝突。請參閱 loginctl(1) 和 logind.conf(5) 以獲取關於如何配置它們的詳細信息。

若您不希望在 Firefox、Chrome 或 VLC 播放視頻時觸發 swaylock,您可以用 idlehack-gitAUR 監聽 dbus 的 screensaver inhibit(阻止屏保)請求並調用 swayidle-inhibit。Firefox、Chrome 和 VLC 等程序會發出該事件以阻止系統空閒。

恢復時屏幕內容短暫顯示

使用 before-sleep swaylock 可能會使系統從睡眠中恢復時屏幕內容短暫顯示。欲緩解該問題,您可使 logind 忽略蓋子(lid)事件並改用 Sway 處理蓋子和電源按鈕事件。

/etc/systemd/logind.conf
[Login]
HandlePowerKey=ignore
HandlePowerKeyLongPress=ignore
HandleSuspendKey=ignore
HandleLidSwitch=ignore
HandleLidSwitchExternalPower=ignore
HandleLidSwitchDocked=ignore
~/.config/sway/config
bindswitch --locked lid:toggle exec swaylock --daemonize && systemctl sleep

exec swayidle -w \
          timeout 60  'if pgrep swaylock; then systemctl sleep; fi' \
          timeout 150 'swaylock --daemonize' \
          timeout 155 'systemctl sleep'

使用 --locked 選項以在屏幕鎖定時合蓋休眠系統。若要使筆記本在合蓋後依然工作,使用 unbindswitch lid:toggle。可以使用 pgrep swaylock 以使電腦被意外喚醒後再次休眠。

logind 集成 bug 較多且難以維護。另見 [4]。

懸浮窗口和窗口分配

要啟用懸浮窗口或窗口分配,請打開應用程式,然後使用 app_id、class、instance 和 title 屬性來啟用懸浮窗口/窗口分配。以下命令可以列出所有打開的窗口的屬性:

$ swaymsg -t get_tree

欲獲取所有打開的窗口的 app_id,請執行:

$ swaymsg -t get_tree | grep "app_id"

僅獲取當前選中窗口的 app_id,請執行:

$ swaymsg -t get_tree | jq -r '..|try select(.focused == true)'

X11 窗口沒有 app_id 屬性,要匹配它們,您可以使用 class、window_type、window_role 和/或 instance 等屬性。請在 swaymsg -t get_tree 命令的輸出中查找相關屬性並為窗口創建足夠詳細的規則。

~/.config/sway/config
for_window [app_id="galculator"] floating enable
for_window [window_type="dialog"] floating enable
for_window [window_role="dialog"] floating enable
assign [app_id="firefox"] 3
assign [class="^Urxvt$" instance="^htop$"] 9

這類似於在X11中使用 xorg-xprop包 查找 class 或 wm_name 屬性。

使用多個顯示器時,懸浮的 scratchpad(暫存器)窗口可能會變得很大,覆蓋多個顯示器。可以使用以下命令將懸浮窗口居中並調整為當前顯示器大小的 80%:

$ swaymsg move position center; swaymsg resize set 80ppt 80ppt

剪貼板

參見剪貼板。

Xresources

在 Sway 中使用 ~/.Xresources 需要把它拷貝到~/.Xdefaults。

Xwayland

請參閱 Wayland#Xwayland 以了解詳細信息和可用軟體包的概述。

默認情況下 Xwayland 處於啟用狀態。

欲完全禁用 Xwayland 並運行「純」Wayland 會話,請使用以下配置以禁用 Xwayland:

~/.config/sway/config
xwayland disable

若您想一眼知曉哪些窗口使用 Xwayland,可以使用以下配置:

~/.config/sway/config
for_window [shell="xwayland"] title_format "[XWayland] %title"
注意:一些程序需要特殊的環境變量或配置選項才能在原生 Wayland 下運行,而另一些程序(包括大多數專有應用程式)根本不支持 Wayland。目前,建議保持啟用 Xwayland,以便使用舊版應用程式。

使用另一個 wlroots 渲染器

要使用另一個渲染器如 Vulkan,請參閱 Wayland#在基於 wlroots 的混成器上使用另一個渲染器。

程序自啟動

參見 i3#自啟動程序章節,並將配置文件名調整為適用於 Sway 的版本。

提示和技巧

啟動時啟用 NumLock

Sway 在啟動時默認禁用 NumLock。欲使其自動啟用,請將鍵盤的 xkb_numlock 輸入配置設置為 enable。例如,欲使所有鍵盤如此,請將以下行添加到 Sway 配置:

~/.config/sway/config
input type:keyboard xkb_numlock enabled

任何情況下,都可以通過鍵盤上的相關按鍵來切換 NumLock 狀態。

提示:如需,也可以用 xkb_capslock 以相同方式設置 CapsLock。
注意:用通配符啟用這些可能會導致在重新加載 Sway 配置文件時 Firefox 崩潰,參見 Bugzilla 1652820,請嘗試指定特定鍵盤而非通配符。

當前鍵盤布局

可以按如下方式通過 jq包 檢索當前鍵盤布局,其中 kbd_identifier 需要替換為鍵盤的標識符:

$ swaymsg -t get_inputs | jq -r '.[] | select(.identifier == "kbd_identifier") | .xkb_active_layout_name'

組合鍵

組合鍵(compose key)和其它按鍵結合使用可用於輸入鍵盤不支持的字符。例如將 PrintScreen 設為組合鍵:

$ swaymsg 'input * xkb_options compose:prsc'

可在 Xorg/Keyboard configuration#Configuring compose key(英語:Xorg/Keyboard configuration#Configuring compose key) 查看可用的組合。組合也可以在 XCompose 文件(英語:Xorg/Keyboard configuration#Key combinations)中配置,需要重新啟動應用程式才能使更改生效。

背光切換

若要使用某按鍵(如 Pause)關閉(和打開)顯示器,請在 Swayconfig 中綁定以下腳本:

#!/bin/sh
read lcd < /tmp/lcd
    if [ "$lcd" -eq "0" ]; then
        swaymsg "output * power on"
        echo 1 > /tmp/lcd
    else
        swaymsg "output * power off"
        echo 0 > /tmp/lcd
    fi

也可以直接使用 toggle 選項,只是使用多顯示器時需要明確指定 output:

$ swaymsg "output output_name power toggle"

屏幕捕獲和屏幕共享

請查看屏幕捕獲#Wayland.

色溫調節

請查看背光#Wayland.

色彩管理

可以將以下行添加到 Sway 配置以使用色彩管理配置文件:

~/.config/sway/config
output * 色彩管理配置文件 icc /path/to/your/color_profile.icc

用鍵盤控制 swaynag

Swaynag 是 sway 附帶的默認警告/提示程序,僅支持用戶用滑鼠與之交互。諸如 swaynagmodeAUR 之類的幫助程序可通過鍵盤快捷鍵啟用交互。

Swaynagmode 的工作原理是首先啟動 swaynag,然後偵聽觸發操作的信號,例如選擇下一步按鈕、關閉提示或接受所選按鈕。這些信號會被另外的帶有控制參數的 swaynagmode 腳本實例(如 swaynagmode --select right 和 swaynagmode --confirm)發送。

默認情況下,Swaynagmode 在初始化時觸發 sway 的 nag 模式,在退出時返回 default。這樣,您就可以在 sway 配置中輕鬆定義快捷鍵:

~/.config/sway/config
set $nag exec swaynagmode
mode "nag" {
  bindsym {
    Ctrl+d    mode "default"

    Ctrl+c    $nag --exit
    q         $nag --exit
    Escape    $nag --exit

    Return    $nag --confirm

    Tab       $nag --select prev
    Shift+Tab $nag --select next

    Left      $nag --select next
    Right     $nag --select prev

    Up        $nag --select next
    Down      $nag --select prev
  }
}
注意:從 sway 版本 1.2 開始,模式名稱區分大小寫。

您可將 sway 配置為通過配置命令 swaynag_command swaynagmode 使用 swaynagmode。

更改光標主題和大小

要設置光標主題和大小,請使用以下配置:

~/.config/sway/config
seat seat0 xcursor_theme 光標主題 光標大小

其中光標主題可以設置或替換為特定名稱(如 default、Adwaita 或 Simple-and-Soft),以及光標大小值如 48。

要查看二者的值,可以使用 echo $XCURSOR_SIZE 和 echo $XCURSOR_THEME。

更改配置後需要重新加載 Sway 以使更改生效。

注意:Wayland 光標可由應用程式確定,這意味著應用程式可能不會遵循 $XCURSOR_SIZE 和 $XCURSOR_THEME 的值。

使用 systemd 管理僅用於 Sway 的守護程序

Systemd 提供 graphical-session.target 和 graphical-session-pre.target 用戶單元。

Services can be made PartOf= either unit to let them run as long as or before, respectively, any graphical session is running and terminate them cleanly when exiting it, whether Xorg or Wayland.

If Sway is the only window manager on a machine, then graphical-session.target may be sufficient even for Sway-specific services (like swayidle包 or kanshi); but otherwise, a more specific sway-session.target file can be used (such as the one provided by sway-contrib包).

Additionally, services started by systemd need to be informed of the necessary environment variables; this is taken care of by a file in /etc/sway/config.d/ provided by sway包, which should be processed if the note at the top of #Configuration has been followed. (But those environment variables should also be unset when exiting Sway, otherwise it or other services may fail to start after the first exit.)

All this can be done using sway-systemd-gitAUR or uwsm包 (which also take care of #Working with systemd-oomd), or manually.

注意:sway-services-gitAUR has unit startup order issues. [5]

手動配置

將以下行添加到 Sway 的配置文件中(例如,將該行追加到 ~/.config/sway/config或將新文件添加到 /etc/sway/config.d/):

~/.config/sway/config
...
...
...
exec_always systemctl --user start sway-session.target

This ensures that sway-session.target is activated whenever Sway starts, and after it has created the Wayland socket etc. Make sure to place that line after any commands that affect how systemd services would be started, which generally includes the include /etc/sway/config.d/* directive.

Then, arrange for the target to be stopped before Sway exits. Note that systemctl --user stop sway-session.target will not work, as the command returns before the services are done shutting down; consider creating a unit that Conflicts= with that, and starting it instead [6].

Finally, link the desired services to sway-session.target or graphical-session.target:

  • If an existing service file exists, you can enable it, or (such as if that would not link to the right unit) run systemctl --user add-wants sway-session.target foo.service.

Working with systemd-oomd

systemd-oomd(8) tracks resource usage by and kills entire Cgroups at once, not processes. This means that, by default, a single memory-hungry service will cause the entire Sway session to be terminated.[7]

The solution is to start each application in its own cgroup. Some of the packages recommended in #Manage Sway-specific daemons with systemd, like uwsm包 or sway-systemd-gitAUR, already take care of this. But it can also be accomplished manually by ensuring that applications are started via systemd-run (see systemd-run(1)).

Instead of using a swaymsg exec -- foo command, create a script:

~/.local/share/sway_exec_wrapper
#!/usr/bin/env sh
exec systemd-run --user --ignore-failure --scope --unit "app-$1-$(uuidgen)" -- "$@"

and use swaymsg exec ~/.local/share/exec_wrapper -- foo.

提示:If #Manage Sway-specific daemons with systemd has been followed, add -p PartOf=graphical-session.target to let the application exit cleanly when exiting Sway.

The --ignore-failure option is used, because a graphical application's unclean exit should not cause the system state to become "degraded"; --scope so that the initial process can fork without the entire application being closed and for Sway to assign the first window to the correct workspace. The --unit parameter is named according to systemd's recommendations.

啟動後更改屏幕解析度/布局

您可使用 GUI 程序 nwg-displays包、wdisplays包、swayrandr-gitAUR 或終端程序 wlr-randr包 來更改屏幕解析度和方向、排列顯示器以及設定縮放。

創建無外設(Headless)輸出

創建與物理 video 接口無關的輸出 (HEADLESS-1、HEADLESS-2等):

$ swaymsg create_output

顯示新輸出的說明:

$ swaymsg -pt get_outputs | grep -A 10 HEADLESS

使用 output 命令配置新的輸出,例如:

~/.config/sway/config
output HEADLESS-1 {
pos 1920,0
mode 1280x720@75Hz
}

將修飾鍵(modifier)修改為 CapsLock 並保留 Super

要將修飾鍵更改為 CapsLock 並在 US 鍵盤布局上繼續使用 Super,請創建 ~/.config/xkb/symbols/custom,具有以下內容:

~/.config/xkb/symbols/custom
xkb_symbols "basic" {
    include "us"
    name[Group1]= "English (US Custom)";
    key <CAPS> { [ Hyper_L ] };
    modifier_map Mod4 { Hyper_L };
    key <LWIN> { [ Super_L ] };
    modifier_map Mod5 { Super_L };
};

對於其他語言,請編輯第二行和第三行,並在 Sway 配置文件開頭附加引用該鍵盤布局:

~/.config/sway/config
input * xkb_layout custom
set $mod Mod4
set $super Mod5


通過 VNC 遠程訪問無外設(Headless) Sway 會話

以下示例教程講述了通過 SSH 啟動並通過 VNC 遠程訪問無外設 Sway 會話。

wayvnc包 是一個 VNC 伺服器,適用於基於 wlroots 的 Wayland 混成器,可以用於承載無外設 Sway 會話。

要啟動一個無外設 Sway 會話,請將 WLR_BACKENDS 設為 headless,可選將 WLR_LIBINPUT_NO_DEVICES 設為 1(參見 wayvnc FAQ):

$ WLR_BACKENDS=headless WLR_LIBINPUT_NO_DEVICES=1 sway
提示:在命令結尾添加 & 以使其後台運行。

現在,請運行 wayvnc 以啟動 VNC 伺服器:

$ WAYLAND_DISPLAY=wayland-1 wayvnc
注意:默認情況下,wayvnc包 僅會監聽本機 5900 埠(localhost:5900),可以另行配置(參見 man wayvnc)。您可能會想按照 OpenSSH#轉發其他埠 所述轉發埠。請注意 wayvnc包 默認不加密且不驗證身份!

輸出熱插拔鉤子

若您想在一個輸出連接(或斷開連接)時搞點事情,可以閱讀 kanshi。

疑難解答

應用程式啟動器

提示:Sway wiki 包含一個已知應用程式啟動器列表。

以下應用程式啟動器已知和 Sway 集成良好:

  • wmenu包 or bemenu包 are largely drop-in replacements for dmenu.
  • rofi now supports Wayland natively, but wofi包 is still a good alternative.
  • fuzzel包 is an application launcher similar to rofi's drun mode.

dmenu包 and other non-Wayland launchers also function well in Sway, but run under Xwayland and suffer from an issue where they can become unresponsive if focus is moved to a native Wayland window.

If Xwayland is enabled and bemenu包 does not run under Wayland by default (thus being subject to the above issues), set the BEMENU_BACKEND=wayland environment variable.

虛擬化

Sway 可以在 VirtualBox 和 VMware ESXi 中使用。

要使 Sway 在 QEMU 中工作,必須以 -vga qxl 參數啟動QEMU。另見 QEMU#qxl。

無法從 tty 啟動 Sway

對於 ESXi, 您需要在 Hardware Configuration > Video card settings 下啟用 3D 支持。另見 VMware#在 Intel、Optimus 和 AMD 上啟用 3D 圖形加速。

光標不可見

當使用某些圖形驅動程序(例如VMSVGA圖形控制器或專有的 NVIDIA 驅動)時,光標可能會變得不可見。可以使用軟體光標來解決此問題,具體討論參見 Issue 3814:

$ export WLR_NO_HARDWARE_CURSORS=1

未檢測到 sway socket

使用 swaymsg 時(如 swaymsg -t get_outputs)有時會返回以下消息:

sway socket not detected.
ERROR: Unable to connect to

當在終端多路復用器(如 GNU Screen 或 tmux)內運行時,swaymsg 無法連接到 SWAYSOCK 中提供的套接字。

要查看當前 SWAYSOCK 的值,請執行:

$ env | grep -F "SWAYSOCK"
SWAYSOCK=/run/user/1000/sway-ipc.1000.4981.sock

欲解決該問題,您可以嘗試連接到一個正在運行的 sway 進程的套接字:

$ export SWAYSOCK=/run/user/$(id -u)/sway-ipc.$(id -u).$(pgrep -x sway).sock

欲避免此錯誤,請在終端多路復用器之外運行該命令。

無法連接 Wayland 伺服器

Tmux 會為每個會話創建環境變量(執行 tmux show-environment 以查詢),因此,若您想要使用 tmux-resurrect 或 tmux-continuum 重新恢復一個已有的 tmux 會話,或 tmux 伺服器在 sway 啟動前就在運行,環境變量就會過期。

將以下內容添加到 .tmux.conf,之後您可以在恢復會話前使用 update-environment 更新環境變量:

set-option -g update-environment "DISPLAY WAYLAND_DISPLAY SWAYSOCK SSH_AUTH_SOCK"

無法獲取 socket 路徑

從 swaymsg -t 命令請求在tty上的消息可能會返回以下消息:

Unable to retrieve socket path

SWAYSOCK 環境變量在啟動Sway後設置,因此解決此錯誤的一個方法是在Sway內部的終端中請求 swaymsg -t [message]。

按鍵設置和鍵盤布局

默認情況下,如果您使用多個鍵盤布局(如 input * xkb_layout "us,ru"),在切換到某個次要布局時可能會導致快捷鍵失效。

得益於 Pull 3058 ,現在您只需在相應的 bindsym 行中添加 --to-code,如下:

bindsym --to-code {
  $mod+$left focus left
  $mod+$down focus down
  $mod+$up focus up
  $mod+$right focus right
}

亦可創建一個變量 set $mybind bindsym --to-code,然後將所有的 bindsym 替換為 $mybind,如下:

$mybind $mod+w thing

Java 應用程式

當打開一些基於Java的應用程式(如 JetBrains的 IntelliJ、CLion 或 PyCharm)時,可能會顯示空白畫面。欲解決該問題,可以將環境變量 _JAVA_AWT_WM_NONREPARENTING 設為 1 來啟動應用程式。

若您從應用程式啟動器(如 rofi 或 dmenu)啟動應用程式,則可以修改應用程式的桌面項。

OpenJDK 11 和 Sway 1.5 已經修復了一些 Java 應用程式的問題。然而,對於某些應用程式,需要進行額外的配置才能使用更新版本的 OpenJDK。對於 Android Studio,您需要設置 STUDIO_JDK=/usr/lib/jvm/java-11-openjdk/[8]。

JRE 硬編碼了一個窗口管理器列表,但該列表不包含 Sway,若您遇到灰色面板、菜單無焦點或窗口尺寸調整錯誤等問題,可以嘗試偽裝成其它窗口管理器。

邊框上的滾動

如果在應用程式邊框上使用滑鼠滾輪導致Sway崩潰,您可以為 app_id(例如Firefox)使用border none 來禁用邊框。

「cannot open display」 錯誤

如果一個程序啟動後出現「cannot open display」(無法打開顯示器)並崩潰,那麼該應用程式很可能是 X11 程序。您可以使用 Xwayland 兼容層在 Wayland 下運行 X11 程序,詳見 #Xwayland。

WINE 中滑鼠不工作

運行程序時,WINE 需要設定一個主顯示器(primary monitor),但是 Wayland 沒有主顯示器的概念,這會引發問題(如 「clicks not registering」)。您可以使用 xrandr 為 Xwayland 指定主顯示器,只需向您的 Sway 配置添加以下內容:

~/.config/sway/config
...
exec_always xrandr --output XWAYLAND0 --primary
...

若如此做,因為 Sway 的一個 bug,您需要將屏幕顯示偏移量設為 0,0。

需要注意 XWAYLAND0(或其它 XWAYLAND 顯示名稱)可能不代表您的顯示器,其後綴數字也可能在不同會話中變化。可以使用以下配置,其可將第一個 XWAYLAND 顯示設定為主顯示器:

exec_always xrandr --output $(xrandr | grep -m 1 XWAYLAND | awk '{print $1;}') --primary

您可按需調整此配置,使用不帶參數的 xrandr 命令可以查看各

注意:Xwayland 會把新連接的顯示器識別為全新的顯示器,這包括了關閉後又重新打開的顯示器。若您設置的「主顯示器」也被關閉後又打開,其將不再被視為主顯示器。

NVIDIA GPU 上遊戲閃爍

即便官方不支持 NVIDIA 之類的專有驅動,但依然可以使用,甚至可以用來玩遊戲。若如此做,您可能會看到屏幕上半區閃爍,可以嘗試將 wlroots0.19AUR 替換為 wlroots-nvidiaAUR,也可以手動用補丁編譯您自己的版本。

System freezes when toggling output power on hybrid NVIDIA setups

On hybrid-GPU laptops with an external monitor connected to the NVIDIA GPU, using swaymsg "output * power off" (e.g. via swayidle包) can deadlock nvidia-modeset, freezing the whole desktop. Confirm with journalctl -b -1 -g "blocked for more than": a task sway state:D ... blocked on a semaphore likely last held by task nvidia-modeset line means this is the cause. Workaround: avoid powering off NVIDIA-attached outputs, e.g. target only the integrated GPU's output or suspend the system instead. See wlroots#2474.

屏幕捕獲/WebRTC 不工作

確保您的配置包含以下內容:

include /etc/sway/config.d/*

然而,AUR 的部分 -git 軟體包不提供 /etc/sway/config.d,此時您需要添加:

exec dbus-update-activation-environment DISPLAY I3SOCK SWAYSOCK WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=sway

參見