跳转到内容

本站近期可能因网络攻击出现服务故障,导致无法联网阅读。建议用户安装 arch-wiki-docs-zh-cnCNRepo 或者 arch-wiki-docs-zh-twCNRepo 离线文档包备用,或者使用经由 Cloudflare CDN 的替代版本aw.lilydjwg.me

来自 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 程序 nwg-displayswdisplaysAURswayrandr-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,也可以手动用补丁编译您自己的版本。

参见