Sway - Arch Linux 中文维基

跳至內容

# Sway

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 Sway，最近一次同步於 2026-03-08，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

相關文章

- 窗口管理器

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。

- systemd-logind(8) 和 polkit包
- seatd包，會作為 wlroots0.19包的依賴與 Sway 一起安裝

若 `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"
    }

    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

    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

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

- PulseAudio#鍵盤控制音量
- WirePlumber#鍵盤控制音量
- ALSA#鍵盤控制音量
- 背光#背光實用程序
- MPRIS。

要允許在鎖屏時執行快捷鍵，請將 `--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 -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

### 剪貼板

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

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

舉一個針對 Wayland 設計的剪貼板管理器 clipman，它可以通過 clipmanAUR 或 clipman-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 會在啟動時禁用 `CapsLock` 和 `NumLock`。欲在啟動時啟用它們，請將鍵盤的 `xkb_capslock` 和/或 `xkb_numlock` 輸入配置設置為 `enable`。例如，若要在所有鍵盤上執行此操作，請將以下行添加到 sway 配置：

    ~/.config/sway/config

    input type:keyboard xkb_capslock enabled
    input type:keyboard xkb_numlock enabled

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

注意：用通配符啟用這些可能會導致在重新加載 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`）關閉（和打開）顯示器，請在 Sway`config` 中綁定以下腳本：

    #!/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` 用戶單元，其會在任何圖形會話（無論是 Xorg 還是 Wayland）正在運行時活動。可以將應該在所有圖形環境中運行的用戶服務綁定到該目標，其還允許將特定於某窗口管理器的目標綁定到 `graphical-session.target` 以啟動和停止僅在該窗口管理器下運行的服務。請參閱 systemd.special(7)。

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

此功能的部分或全部由 Arch 的 Sway 軟體包提供。例如，sway包 和 sway-gitAUR 都提供一個 `50-systemd-user.conf` 引置文件（見#配置）。

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

要自己手搓該功能，可以創建一個 `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 程序 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 包含一個已知應用程式啟動器列表。

dmenu包 在 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包 現已同時支持 Wayland 和 X11。

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

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

### 虛擬化

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/`[5]。

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，也可以手動用補丁編譯您自己的版本。

### 屏幕捕獲/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

## 參見

- Sway 官方網站
- Sway GitHub 項目
- Sway wiki
- Sway 1.0 發布

分類：​

- Wayland 合成器

Sway
新增話題