Sway (简体中文)
Sway(缩写自 SirCmpwn 的 Wayland 合成器[1])是一款专为Wayland设计的合成器,旨在与i3完全兼容。根据官网显示:
- Sway 是Wayland的合成器,也是 x11 的 i3 窗口管理器的替代品。它可以与您现有的 i3 配置一起工作,并支持 i3 的大部分特性以及一些附加功能
安装
Sway 可以通过 sway 包来进行安装。也可以使用 sway-gitAUR 安装开发版本。由于依赖关系紧密,建议在更新 sway 时始终更新 wlroots。
--unsupported-gpu
参数去运行。还可以安装 swaylock 和 swayidle 来锁定屏幕并设置 idle 管理。
默认的应用程序启动器为 dmenu,默认的终端模拟器是 foot。在启动 sway 之前,建议安装它们或在配置中设置新的启动器和终端。
启动
在启动 Sway 之前,它需要访问你的硬件设备,如键盘、鼠标和图形卡。这些硬件设备的集合称为一个 seat,就如 sd-login(3)中所述.
在 Arch Linux 上,Sway 可以使用以下任一方式访问您的 seat。
- systemd-logind(8) 和 polkit, 或者
- seatd,将作为 wlroots的依赖包与Sway一起安装
如果 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
选择显示管理器
Sway 会话位于 /usr/share/wayland-sessions/sway.desktop
。 它可以被 GDM 和 SDDM等现代显示管理器自动识别。
也可以使用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_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)。
安装 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
。
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 utilities 和 MPRIS 。
要允许在锁屏处于活动状态时执行键绑定,请将 --locked
参数添加到 bindsym。
bindsym --locked XF86AudioPlay exec playerctl play-pause
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'
浮动窗口
要启用浮动窗口或窗口分配,请打开应用程序,然后使用 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)'
如果某些窗口的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
剪贴板
默认情况下,每当窗口关闭时,剪贴板都会被清空。这可能是一个令人惊讶的默认行为。
必须安装“剪贴板管理器”才能使剪贴板的内容在窗口之间共享
举一个针对于 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
使用另一个wlroots渲染器
您可以通过指定WLR_RENDERER
环境变量来使用另一个 wlroots 渲染器。 可用列表位于wlroots 文档.
提示和技巧
初始化启用 CapsLock/NumLock
默认情况下,sway 会在初始化启动时禁用 CapsLock
和 NumLock
键。 要改为在启动时启用它们,请将键盘的 xkb_capslock
和/或 xkb_numlock
输入配置设置为 enable
。例如,若要在所有键盘上执行此操作,请将以下行添加到 sway 配置中:
~/.config/sway/config
input * xkb_capslock enable input * xkb_numlock enable
在任何情况下,都可以通过按键盘上的相关键来切换 CapsLock
和 NumLock
状态。
当前键盘布局
可以按如下方式检索当前键盘布局,其中 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 文件中配置,需要重新启动应用程序才能使此更改生效。
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 Backlight#Wayland.
用键盘控制swaynag
Swaynag 是 sway 附带的默认警告/提示程序,仅支持用户与鼠标交互。诸如swaynagmodeAUR 之类的帮助程序可用于通过键盘快捷键启用交互。
Swaynagmode 的工作原理是首先启动 swaynag,然后侦听触发操作的信号,例如选择下一步按钮、消除提示或接受所选按钮。这些信号是通过启动带有控制参数的 swaynagmode 脚本本身的另一个实例 swaynagmode --select right
或 swaynagmode --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_SIZE
和 echo $XCURSOR_THEME
去检查它们的值。
Note that you need to restart the application to see the changes.
$XCURSOR_SIZE
和 $XCURSOR_THEME
的值。使用 systemd 管理特定于 Sway 的守护程序
Systemd 提供了一个 graphical-session.target
用户单元,每当任何图形会话正在运行时,无论是Xorg还是Wayland,它都是活跃的。应该在所有图形环境中运行的用户服务可以绑定到该 target, 它还允许将特定于窗口管理器的目标绑定到 graphical-session.target
去启动和停止仅在该窗口管理器下运行的服务。请参阅systemd.special(7)
用户可能希望仅在当前窗口管理器为 Sway 时才启动某些服务/守护程序(如 swayidle 或 kanshi),并且他们可能还希望这些服务在 Sway 停止时停止。此外,运行 systemd-oomd.service(8) 的用户可能希望将服务放在单独的 cgroup 中,以便单个内存密集型服务不会关闭整个 Sway 会话(请参阅 Fedora bug 报告)。
部分或全部此功能由 Arch Sway 程序包提供。例如,社区中的 sway 包提供 sway-session.target
文件,而 sway 和 sway-gitAUR 都为/etc/sway/config.d/
目录提供一个 50-systemd-user.conf
插入文件。如果 Sway config
文件包含 include /etc/sway/config.d/*
则此文件将所需的环境变量导入到 systemd 用户会话和 dbus 中。
如果您打算使用下面描述的 roll-your-own 方法或使用专业包(如sway-systemd-gitAUR 或 sway-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 }
疑难解答
应用程序启动器
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-gitAUR 是 rofi 的一个分支,可以在 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。