Sway (简体中文)

From ArchWiki
翻译状态:本文是 Sway翻译。上次翻译日期:2022-06-28。如果英文版本有所更改,则您可以帮助同步翻译。

Sway(缩写自 SirCmpwn 的 Wayland 合成器[1])是一款专为Wayland设计的合成器,旨在与i3完全兼容。根据官网显示:

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

安装

Sway 可以通过 sway 包来进行安装。也可以使用 sway-gitAUR 安装开发版本。由于依赖关系紧密,建议在更新 sway 时始终更新 wlroots

注意: 所有专有显卡驱动程序都不受支持,包括 NVIDIA。在 NVIDIA 驱动程序版本 495 之后,需要启用内核级显示模式设置并在运行 sway 时附加 --unsupported-gpu 参数去运行。

还可以安装 swaylockswayidle 来锁定屏幕并设置 idle 管理。

默认的应用程序启动器为 dmenu,默认的终端模拟器是 foot。在启动 sway 之前,建议安装它们或在配置中设置新的启动器和终端。

启动

在启动 Sway 之前,它需要访问你的硬件设备,如键盘、鼠标和图形卡。这些硬件设备的集合称为一个 seat,就如 sd-login(3)中所述.

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

如果 polkit 已安装在你的系统上, Sway 应会自动访问你的seat。

又或者,如果 polkit 没有安装在你的系统上并且你想使用 seatd 来替代请将你自己添加到这个seat user group 并且 enable/start seatd.service,重新登录并选择以下方法之一来启动 Sway。

手动登录

要启动 Sway,只需在 Linux 终端输入 sway 来运行程序。

自动登录

与 X 类似,可以通过将以下内容添加到 shell 初始化文件来启动 Sway (请参阅 Command-line shell#Login shell):

if [ -z $DISPLAY ] && [ "$(tty)" = "/dev/tty1" ]; then
  exec sway
fi

有关更多详细信息,请参阅 Xinit#Autostart X at login

选择显示管理器

Note: Sway 官方不支持显示管理器。[2]

Sway 会话位于 /usr/share/wayland-sessions/sway.desktop。 它可以被 GDMSDDM等现代显示管理器自动识别。

也可以使用systemd 用户服务作为一个显示管理器去运行 sway

您还可以使用基于文本的会话管理器,请参阅 Display manager#Console.

配置

如果您已经在使用i3,则可以将i3配置文件复制到~/.config/sway/config ,并且它开箱即用。否则,请将 位于 /etc/sway/config 的示例配置文件复制到 ~/.config/sway/config。 有关配置的信息,请参见 sway(5)

键盘映射

默认情况下,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)

Tip: waybar是一个包含 (swaybar)的替代方案.

安装 i3status 是在 Wayland 下获取实用的默认状态栏的一个选项。您所要做的就是在 sway 配置的末尾添加以下代码段:

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

如果要为 i3status 启用色彩输出,则需要在 i3status 配置中调整以下部分:

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

壁纸

在sway中显示壁纸由专用程序处理,该程序单独打包为 swaybg。它是运行输出命令所必需的。 以下行可以附加在 sway 配置的末尾,他会在在所有显示器上设置背景图像(输出与名称 "*"匹配):

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

Of course,您必须根据壁纸替换文件名和路径

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

output * bg #000000 solid_color

您可以使用 azoteAUR 作为 GTK3 前端来运行 swaybg.

输入设备

可以调整特定的输入设备配置。例如,若要为所有触摸板启用点击以单击和自然滚动,请执行以下操作:

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

要为特定触摸板设置配置,请使用 swaymsg -t get_inputs 获取设备标识符并用它来代替 type:touchpad

Note: 来自于 swaymsg -t get_inputs 命令的输出可能包含“\”来转义“/”等符号(e.g. "2:14:ETPS\/2_Elantech_Touchpad")。 这些需要删除。

更多文档和选项,如加速曲线或完全禁用输入,可以参照sway-input(5).

HiDPI

使用 output 命令在你的配置文件中设置显示比例因子。 比例因子可以是分数,但对于 HiDPI 屏幕,它通常为 2。

~/.config/sway/config
output <name> scale <factor>

您可以使用以下命令找到您的显示名称:

$ swaymsg -t get_outputs

自定义键绑定

键盘上的特殊键 可用于执行命令,例如控制音量、监视亮度或媒体播放器:

~/.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 XF86AudioNext exec playerctl next
bindsym XF86AudioPrev exec playerctl previous
bindsym XF86Search exec bemenu-run

有关详细信息和替代实用程序,请参阅 键盘音量控制, Advanced Linux Sound Architecture#Keyboard volume control, Backlight#Backlight utilitiesMPRIS 。 要允许在锁屏处于活动状态时执行键绑定,请将 --locked 参数添加到 bindsym。

bindsym --locked XF86AudioPlay exec playerctl play-pause
Tip: wevAUR 是一个工具,它提供类似于 xorg-xev的功能,但在Wayland上。
Note: Systemd 处理一些特殊键,如电源键和盖子打开和关闭事件。这些可能会干扰在 sway 中配置的那些。请参阅loginctl(1)logind.conf(5) 以获取有关如何在systemd中配置它们的详细信息。

Graphical indicator bars

通常希望在调整某些百分比值设置(如亮度或音量)的当前级别由图形栏指示。在 Sway 中提供此工具的一个不错的选择是wobAUR (或者 wob-gitAUR),它提供了流行的 X 工具 xobAUR 的功能子集,但作为实现层壳协议的本机 Wayland 实用程序。有关使用示例,请参阅项目网站

Overview of workspaces

如果您正在使用很多带有许多窗口的工作区,并且无法再跟踪位置,那么 sovAUR 可以派上用场。 它是一个叠加层,显示所有工作区的架构,以使 sway 导航更容易。它显示程序名称,窗口标题,支持多输出设置。有关详细信息,请参阅 项目网站

空闲管理

Sway 有一个名为 swayidle 的专用空闲管理守护程序来处理空闲会话。有不同的方法来启动和参数化守护程序。最简单的方法是使用 sway 本身的配置。 swayidle 接受大量参数来配置事件timeout (又名 空闲), resume (从睡眠中恢复), before-sleep etc。参见 swayidle(1)了解更多细节和事件的进一步解释。然后,可以为每个事件分配一个操作。要为一个事件分配多个操作,只需重复触发器即可。

根据以下说明 swayidle 可在 30 分钟后锁定屏幕,并在 5 秒后将其关闭:

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

要更快地关闭锁定屏幕,例如在10秒后,请为锁定管理器设置进程列表,并相应地执行 swaymsg "output * dpms off" ,如下所示:

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

要在挂起和暂停任何播放媒体之前锁定屏幕,请将以下说明修改为 swayidle 命令:

before-sleep 'playerctl pause'
before-sleep 'swaylock'
Note: Systemd 也处理一些空闲事件,这些事件可能与在 sway 中配置的事件冲突。请参阅 loginctl(1) and logind.conf(5) 以获取有关如何配置它们的详细信息。

浮动窗口

要启用浮动窗口或窗口分配,请打开应用程序,然后使用 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)'

如果某些窗口的app_id为 null,则可能必须使用 class 和/或 instance 属性来启用浮动模式/窗口分配。您可以搜索输出并为窗口创建细粒度规则。

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

这类似于使用 xorg-xprop 去查找 class 或者 wm_name 属性,在 X11 中。

使用多个监视器时,浮动暂存器窗口可能会变得太大,覆盖多个监视器。以下命令将浮动窗口居中并调整为当前监视器大小的 80%:

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

剪贴板

Merge-arrows-2.pngThis article or section is a candidate for merging with Clipboard.Merge-arrows-2.png

Notes: 不针对与 Sway。 (Discuss in Talk:Sway (简体中文))

默认情况下,每当窗口关闭时,剪贴板都会被清空。这可能是一个令人惊讶的默认行为。

必须安装“剪贴板管理器”才能使剪贴板的内容在窗口之间共享

举一个针对于 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
Note: 一些程序需要 特殊的 环境变量 或 配置选项 才能在Wayland下本机运行,而其他程序(包括大多数专有应用程序)根本不支持Wayland。目前,建议将 XWayland 保持打开状态,以便可以使用旧版应用程序。

使用另一个wlroots渲染器

您可以通过指定WLR_RENDERER环境变量来使用另一个 wlroots 渲染器。 可用列表位于wlroots 文档.

提示和技巧

初始化启用 CapsLock/NumLock

默认情况下,sway 会在初始化启动时禁用 CapsLockNumLock 键。 要改为在启动时启用它们,请将键盘的 xkb_capslock 和/或 xkb_numlock 输入配置设置为 enable。例如,若要在所有键盘上执行此操作,请将以下行添加到 sway 配置中:

~/.config/sway/config
input * xkb_capslock enable
input * xkb_numlock enable

在任何情况下,都可以通过按键盘上的相关键来切换 CapsLockNumLock 状态。

Note: 使用通配符标识符启用这些可能会导致 Firefox 在重新加载您的 sway 配置文件时崩溃: Bugzilla 1652820,请尝试改为指定键盘

当前键盘布局

可以按如下方式检索当前键盘布局,其中 kbd_identifier 需要替换为键盘的标识符:

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

组合键

设置 PrintScreen 作为 compose key:

$ swaymsg 'input * xkb_options compose:prsc'

组合键的组合也可以在 XCompose 文件中配置,需要重新启动应用程序才能使此更改生效。

Tango-view-fullscreen.pngThis article or section needs expansion.Tango-view-fullscreen.png

Reason: Explain what the following tip means (why is it useful). (Discuss in Talk:Sway (简体中文))

You can look up key names in /usr/include/X11/keysymdef.h, or use the xev(1)-like debugger: xkbcli-interactive-wayland(1) (in /usr/lib/xkbcommon/).

背光切换

若要使用键(例如Pause)关闭(和打开)显示器,请在 Swayconfig 中绑定以下脚本:

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

屏幕捕获和屏幕共享

See Screen capture#Wayland.

色温调节

See Backlight#Wayland.

用键盘控制swaynag

Swaynag 是 sway 附带的默认警告/提示程序,仅支持用户与鼠标交互。诸如swaynagmodeAUR 之类的帮助程序可用于通过键盘快捷键启用交互。

Swaynagmode 的工作原理是首先启动 swaynag,然后侦听触发操作的信号,例如选择下一步按钮、消除提示或接受所选按钮。这些信号是通过启动带有控制参数的 swaynagmode 脚本本身的另一个实例 swaynagmode --select rightswaynagmode --confirm来发送的。

默认情况下,Swaynagmode在 sway初始化时触发 mode 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 配置为使用 swaynagmode 和配置命令 swaynag_command swaynagmode.

更改光标主题和大小

要设置 光标主题 和大小:

~/.config/sway/config
seat seat0 xcursor_theme my_cursor_theme my_cursor_size

其中 my_cursor_theme 可以设置为或替换为特定值 ,如 default, Adwaita 或者 Simple-and-Soft,以及 my_cursor_size值如 48.

您可以使用 echo $XCURSOR_SIZEecho $XCURSOR_THEME去检查它们的值。

Note that you need to restart the application to see the changes.

注意: Wayland 使用客户端光标。应用程序可能不会评估$XCURSOR_SIZE$XCURSOR_THEME的值。

使用 systemd 管理特定于 Sway 的守护程序

Systemd 提供了一个 graphical-session.target 用户单元,每当任何图形会话正在运行时,无论是Xorg还是Wayland,它都是活跃的。应该在所有图形环境中运行的用户服务可以绑定到该 target, 它还允许将特定于窗口管理器的目标绑定到 graphical-session.target 去启动和停止仅在该窗口管理器下运行的服务。请参阅systemd.special(7)

用户可能希望仅在当前窗口管理器为 Sway 时才启动某些服务/守护程序(如 swayidlekanshi),并且他们可能还希望这些服务在 Sway 停止时停止。此外,运行 systemd-oomd.service(8) 的用户可能希望将服务放在单独的 cgroup 中,以便单个内存密集型服务不会关闭整个 Sway 会话(请参阅 Fedora bug 报告)。

部分或全部此功能由 Arch Sway 程序包提供。例如,社区中的 sway 包提供 sway-session.target 文件,而 swaysway-gitAUR 都为/etc/sway/config.d/目录提供一个 50-systemd-user.conf 插入文件。如果 Sway config 文件包含 include /etc/sway/config.d/*则此文件将所需的环境变量导入到 systemd 用户会话和 dbus 中。

如果您打算使用下面描述的 roll-your-own 方法或使用专业包(如sway-systemd-gitAURsway-services-gitAUR)来提供功能,则应考虑删除提供相同功能的文件。

此功能可以在一个 roll-your-own 基础上通过创建一个 sway-session.target 并让那些守护进程/服务通过sway-session.target进行提供。 此 systemd 目标应该是用户目标(请参见 systemd/User)。 例如:

~/.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 import-environment; systemctl --user start sway-session.target"

当上述行在配置文件中, 每当 Sway 启动,他也会运行 sway-session.target.

最后,将所需的服务链接到 sway-session.target。例如,添加 kanshi (或者 kanshi-gitAUR) 服务:

~/.config/systemd/user/kanshi.service
[Unit]
Description=Dynamic output configuration for Wayland compositors
Documentation=https://sr.ht/~emersion/kanshi
BindsTo=sway-session.target

[Service]
Type=simple
ExecStart=/usr/bin/kanshi

[Install]
WantedBy=sway-session.target

当这个 用户单元enabled时,它仅在 Sway 运行时激活,并在 Sway 停止时停用。

sway-session.target文件的创建和环境的导入也可以通过安装sway-systemd-gitAUR来完成。除了将服务分离到 cgroup 中之外,sway-systemd 还将每个 GUI 应用程序放在自己的 cgroup 中。这样就可以对单个应用程序施加每组资源约束。请参阅 sway-systemd README

更改屏幕分辨率

您可以使用图形程序 wdisplaysAUR 或终端程序 wlr-randrAUR 来更改分辨率、旋转和排列显示。

创建无外设输出

创建与物理 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
}

疑难解答

应用程序启动器

提示: Sway 的 wiki 还包含 已知应用程序启动器的列表.

i3-dmenu-desktop, dmenu, 和 rofi 在 Sway 中都运行得相对较好,但都在 XWayland 下运行,并且都存在相同的问题,如果将光标移动到本机 Wayland 窗口,它们可能会变得无响应。此问题的原因是 Wayland 客户端/窗口无法访问输入设备,除非它们具有屏幕焦点。XWayland 服务器本身就是 Wayland 合成器的客户端,因此其 XWayland 客户端之一必须具有焦点才能访问用户输入。但是,一旦其某个客户端具有焦点,它就可以收集输入,并通过 X11 协议将其提供给所有 XWayland 客户端。因此,将光标移动到 XWayland 窗口并按 Esc 键应该可以解决此问题,有时运行 pkill 也可以。

bemenu 是一个原生的 Wayland dmenu 替代品,可以选择与 j4-dmenu-desktopAUR 结合使用,为启动桌面文件提供 Wayland-native 组合(如 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-lbonn-wayland-gitAURrofi 的一个分支,可以在 Wayland 中工作,如果你需要在 X11 会话中启动它,它也有一个 -x11标志

wofi 是一个命令启动器,它提供了一些与rofi相同的功能,但在Wayland下运行。wofi缺少rofi的一些功能,如SSH模式和窗口切换模式。它基于 wlroots 库,并使用GTK3进行渲染。它与 sway 配合得很好。

虚拟化

Sway works with both VirtualBox and VMware ESXi.

For Sway to work in QEMU, QEMU must be started with -vga qxl. See also QEMU#qxl.

无法从 tty 启动 Sway

For ESXi, you need to enable 3D support under the Hardware Configuration > Video card settings. See also VMware#Enable 3D graphics on Intel, Optimus and AMD.

无可见光标

When using certain graphics drivers (e.g. the VMSVGA graphics controller or the proprietary NVIDIA driver), the cursor is invisible. This can be fixed by using software cursors as discussed in [3]:

$ export WLR_NO_HARDWARE_CURSORS=1

Sway socket not detected

Using a swaymsg argument, such as swaymsg -t get_outputs, will sometimes return the message:

sway socket not detected.
ERROR: Unable to connect to

当在终端多路复用器(如 gnu 屏幕或 tmux)内运行时。这意味着swaymsg 无法连接到 SWAYSOCK 中提供的套接字。

要查看 SWAYSOCK 的当前值,输入:

$ env | fgrep SWAYSOCK
SWAYSOCK=/run/user/1000/sway-ipc.1000.4981.sock

要解决这个问题,您可以尝试基于正在运行的晃动过程连接到一个套接字:

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

若要避免此错误,请在多路复用器之外运行该命令。

Unable to retrieve socket path

Requesting messages from swaymsg -t on a tty may return the following message:

Unable to retrieve socket path

SWAYSOCK environment variable is set after launching Sway, therefore a workaround to this error is to request swaymsg -t [message] in a terminal inside Sway.

Keybindings and keyboard layouts

By default, if you are using more than one keyboard layout, e.g. input * xkb_layout "us,ru", bindings may become broken when you switch on some secondary layout.

Thanks to https://github.com/swaywm/sway/pull/3058, all you need is to add --to-code key to sensitive bindsym lines like this:

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

Alternatively you can create a variable set $mybind bindsym --to-code and then replace all instances of bindsym with $mybind like so: $mybind $mod+w thing

Java applications

Some Java-based applications will display blank screen when opened, for example any JetBrains editor such as IntelliJ, CLion, or PyCharm. To mitigate this, the application can be started with the _JAVA_AWT_WM_NONREPARENTING environment variable set to 1.

If you start the application from a launcher like rofi or dmenu, you might want to modify the application desktop entry as shown in Desktop entries#Modify environment variables.

Some issues with Java applications have been fixed in OpenJDK 11 and Sway 1.5. However, certain applications require additional configuration to use newer versions of OpenJDK, in the case of Android Studio you must set STUDIO_JDK=/usr/lib/jvm/java-11-openjdk/. [4]

Scroll on border

If using the mouse scroll wheel on an application's border crashes sway, you could use border none for the app_id (e.g. Firefox).

程序无法打开显示

如果一个程序在出现“无法打开显示”错误消息时崩溃,那么您正在使用的程序很可能是 X11程序。你可以使用 XWayland 兼容层在韦兰下运行 x11程序,详见 #XWayland

See also