跳至內容
出自 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-gitAUR。由於依賴關係緊密,建議在更新 sway 時始終更新 wlroots

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

您還可以安裝 swaylockswayidleswaybg,用以鎖定屏幕、設定空閒管理和設置壁紙。此外,AUR 提供這些軟體包的開發版本,分別為 swaylock-gitAURswayidle-gitAURswaybg-gitAUR,這些軟體包提供了各自 Git 倉庫的最新功能和更新。

默認的應用程式啟動器為 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 官方不支持顯示管理器[2]

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

也可以將 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"
}

input <identifier> xkb_model "pc101"

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

在啟動 sway 時,也可以使用環境變量(XKB_DEFAULT_LAYOUTXKB_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

swayoutput 命令可以為不同的顯示輸出指定詳細配置,包括但不限於壁紙、縮放、位置等。如有需要,您可將不同的 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

自動設定

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
bindsym XF86AudioRaiseVolume exec pactl set-sink-volume @DEFAULT_SINK@ +5%
bindsym XF86AudioLowerVolume exec pactl set-sink-volume @DEFAULT_SINK@ -5%
bindsym XF86AudioMute exec pactl set-sink-mute @DEFAULT_SINK@ toggle
bindsym XF86AudioMicMute exec pactl set-source-mute @DEFAULT_SOURCE@ toggle
bindsym XF86MonBrightnessDown exec brightnessctl set 5%-
bindsym XF86MonBrightnessUp exec brightnessctl set 5%+
bindsym XF86AudioPlay exec playerctl play-pause
bindsym XF86AudioPause exec playerctl play-pause
bindsym XF86AudioNext exec playerctl next
bindsym XF86AudioPrev exec playerctl previous
bindsym XF86AudioStop exec playerctl stop
bindsym XF86Search exec bemenu-run

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

要允許在鎖屏時執行快捷鍵,請將 --locked 參數添加到 bindsym。

bindsym --locked XF86AudioPlay exec playerctl play-pause
提示: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'
注意:Systemd 也處理一些空閒事件,這些事件可能與在 sway 中配置的事件衝突。請參閱 loginctl(1)logind.conf(5) 以獲取關於如何配置它們的詳細信息。

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

懸浮窗口和窗口分配

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

$ 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 屬性,要匹配它們,您可以使用 classwindow_typewindow_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 [class="firefox"] -> 3
assign [class="^Urxvt$" instance="^htop$"] -> 9

這類似於在X11中使用 xorg-xprop 查找 classwm_name 屬性。

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

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

剪貼板

Wayland 下剪貼板內容由複製來源應用程式管理,如果該程序關閉,則複製的內容就不再可用。

欲持久化剪貼板內容,請使用"剪貼板管理器",其會自行再複製並保留一份剪貼板內容。

舉一個針對 Wayland 設計的剪貼板管理器 clipman,它可以通過 clipmanAURclipman-gitAUR 進行安裝。

如果要在 Sway 中使用 clipman, 請將以下行添加到配置文件中:

~/.config/sway/config
exec wl-paste -t text --watch clipman store --no-persist

關於剪貼板的詳細信息和替代程序,請參閱剪貼板

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 的版本。

提示和技巧

啟動時啟用 CapsLock/NumLock

默認情況下,sway 會在啟動時禁用 CapsLockNumLock。欲在啟動時啟用它們,請將鍵盤的 xkb_capslock 和/或 xkb_numlock 輸入配置設置為 enable。例如,若要在所有鍵盤上執行此操作,請將以下行添加到 sway 配置:

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

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

注意:用通配符啟用這些可能會導致在重新加載 sway 配置文件時 Firefox 崩潰,參見 Bugzilla 1652820,請嘗試指定特定鍵盤而非通配符。

當前鍵盤布局

可以按如下方式檢索當前鍵盤布局,其中 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 rightswaynagmode --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 光標主題 光標大小

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

要查看二者的值,可以使用 echo $XCURSOR_SIZEecho $XCURSOR_THEME

更改配置後需要重啟以使更改生效。

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

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

Systemd 提供了一個 graphical-session.target 用戶單元,其會在任何圖形會話(無論是 Xorg 還是 Wayland)正在運行時活動。可以將應該在所有圖形環境中運行的用戶服務綁定到該目標,其還允許將特定於某窗口管理器的目標綁定到 graphical-session.target 以啟動和停止僅在該窗口管理器下運行的服務。請參閱 systemd.special(7)

用戶可能希望僅為 Sway 啟動某些服務/守護程序(如 swayidlekanshi),並且可能還希望這些服務在 Sway 停止時停止。此外,使用 systemd-oomd.service(8) 的用戶可能希望將服務放在單獨的 cgroup 中,以便單個內存密集型服務不會關閉整個 Sway 會話(請參閱 Fedora bug 報告)。

此功能的部分或全部由 Arch 的 Sway 軟體包提供。例如,swaysway-gitAUR 都提供一個 50-systemd-user.conf 插入文件(見#配置)。

如果您打算使用下面介紹的自己手搓的方法或使用專門的軟體包(如sway-systemd-gitAURsway-services-gitAURuwsm)來實現此功能,則應考慮刪除提供相同功能的文件。

要自己手搓該功能,可以創建一個 sway-session.target,讓該目標啟動需要的守護進程/服務。此 systemd 目標應當是用戶目標(請參見 systemd/用戶)。 例如:

~/.config/systemd/user/sway-session.target
[Unit]
Description=Sway compositor session
Documentation=man:systemd.special
BindsTo=graphical-session.target
Wants=graphical-session-pre.target
After=graphical-session-pre.target

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

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

如此,每當 Sway 啟動時也會運行 sway-session.target

最後,將所需的服務連結到 sway-session.target。例如添加 kanshi(或 kanshi-gitAUR)服務(見 kanshi#使用 systemd 管理 kanshi)。

當該用戶單元處於啟用狀態時,其僅在 Sway 運行時激活,並在 Sway 關閉時停用。

sway-session.target文件的創建和環境的導入也可以通過 sway-systemd-gitAUR 來完成。除了將服務分離到 cgroup 中之外,sway-systemd 還將每個 GUI 應用程式放在自己的 cgroup 中。這樣就可以對單個應用程式進行獨立的資源約束,參見 sway-systemd README。此外,uwsm 提供了一個更綜合的解決方案。

啟動後更改屏幕解析度

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

創建無外設(Headless)輸出

創建與物理 video 接口無關的輸出 (HEADLESS-1HEADLESS-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
}

將快捷觸發鍵修改為 CapsLock 並保留 Super

注意:「快捷觸發鍵」原文為「modifier」,譯者未能找到中文語境下合適的翻譯,故如此翻譯。

要將快捷觸發鍵修改為 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 包含一個已知應用程式啟動器列表

dmenurofi 在 Sway 中運行得相對較好,但都在 Xwayland 下運行,並且都存在相同的問題。如果將光標移動到原生 Wayland 窗口,Xwayland 應用程式可能會變得無響應。因為 Wayland 客戶端/窗口在不具有屏幕焦點時無法訪問輸入設備,而 Xwayland 伺服器本身就是 Wayland 混成器的客戶端,因此其 Xwayland 客戶端之一必須具有焦點才能訪問用戶輸入。一旦其某個客戶端具有焦點,其就可以收集輸入,並通過 X11 協議將其提供給所有 Xwayland 客戶端。因此,將光標移動到 Xwayland 窗口並按 Esc 鍵退出應該可以解決此問題,有時運行 pkill 也可以。

bemenu 是一個原生的 Wayland dmenu 替代品,二者都可以選擇與 j4-dmenu-desktop 結合使用,為啟動桌面文件提供原生 Wayland 組合(如同 i3-dmenu-desktop),例如:

j4-dmenu-desktop --dmenu='bemenu -i --nb "#3f3f3f" --nf "#dcdccc" --fn "pango:DejaVu Sans Mono 12"' --term='termite'

如果選擇不禁用 Xwayland,則可能需要將 BEMENU_BACKEND 環境變量設置為 wayland

您還可以使用浮動終端和 fzf 自己手搓一個應用程式啟動器,如 GitHub issue 所述。

plasma-workspace 軟體包提供的 krunner 應用也可以作為啟動器,支持 Xwayland 和原生 Wayland。

rofi-waylandrofi 的一個分支,可以在 Wayland 中工作,其也提供一個 -x11 標誌以在 X11 中使用。

wofi 是一個命令啟動器,提供了 rofi 的部分功能,運行於 Wayland。Wofi缺少 rofi 的一些功能,如 SSH 模式和窗口切換模式。其基於 wlroots0.19 庫,並使用 GTK3 進行渲染,與 sway 配合得很好。

fuzzel 是一個為基於 wlroots 的 Wayland 混成器開發的應用程式啟動器,類似於 rofi 的 drun 模式。

虛擬化

Sway 可以在 VirtualBoxVMware 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 Screentmux)內運行時,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-resurrecttmux-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 來啟動應用程式。

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

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

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.19 替換為 wlroots-nvidiaAUR,也可以手動用補丁編譯您自己的版本。

參見