Sway
Sway (缩写自 SirCmpwn 的 Wayland 合成器 [1]) 是一个为 Wayland 设计的合成器,旨在与 i3 完全兼容。根据 官方网站
- Sway 是一个平铺式 Wayland 合成器,并且是 X11 下 i3 窗口管理器的直接替代品。它与您现有的 i3 配置兼容,并支持 i3 的大部分功能,外加一些额外的功能。
如果您对视觉效果感兴趣,swayfxAUR 是 sway 的一个分支,具有流行的视觉效果。
sway-scroll-gitAUR 是 sway 的另一个分支,具有 PaperWM 或 niri 类似的滚动布局。它还支持动画、窗口内容缩放和多种概览模式。
安装
Sway 可以通过 sway 包进行 安装。由于紧密的依赖关系,请始终在更新 sway 时同时更新 wlroots。
--unsupported-gpu 参数运行 sway,则 sway 可以工作。您还可以安装 swaylock、swayidle 和 swaybg,分别用于锁定屏幕、设置空闲管理器和设置壁纸。
默认的应用程序启动器是 wmenu,默认的 终端模拟器是 foot。在启动 sway 之前,建议安装它们或在配置文件中设置新的启动器和终端。有关一些有用的 i3 包的 Wayland 兼容版本,可以查阅 Sway wiki 上的 迁移指南。
启动
在启动 Sway 之前,它需要访问您的硬件设备,例如键盘、鼠标和显卡。这些硬件设备的集合称为一个 seat(座席),如 sd-login(3) § DEFINITION OF TERMS 中所述。
在 Arch Linux 上,Sway 可以通过以下任一方式访问您的 seat:
- systemd-logind(8) 和 polkit,或者
- seatd,它将作为 wlroots0.19 的依赖项与 Sway 一起安装。
如果您的系统上已安装 polkit,Sway 应该会自动获得对您 seat 的访问权限。
或者,如果您的系统上未安装 polkit,并且您想改用 seatd,请将自己添加到 seat 用户组并启用/启动 seatd.service,然后重新登录。
您可以选择以下任一方法来启动 Sway。
手动设置
要启动 Sway,只需在 Linux 控制台中键入 sway。
在 TTY 登录时自动启动
与 X 类似,可以通过在您的 shell 初始化文件中添加以下内容来启动 Sway(请参阅 Command-line shell#Login shell)。
if [ -z "$WAYLAND_DISPLAY" ] && [ -n "$XDG_VTNR" ] && [ "$XDG_VTNR" -eq 1 ] ; then
exec sway
fi
更多详情,请参阅 Xinit#Autostart X at login。
从显示管理器启动
sway 会话位于 /usr/share/wayland-sessions/sway.desktop。现代显示管理器如 GDM 和 SDDM 会自动识别它。
也可以通过显示管理器将 sway 作为 systemd 用户服务来启动。
您还可以使用基于文本的会话管理器,请参阅 Display manager#Console。
配置
如果您已经在使用 i3,您可以将您的 i3 配置复制到 ~/.config/sway/config,它应该可以直接工作。否则,请将示例配置文件(位于 /etc/sway/config)复制到 ~/.config/sway/config。有关配置的信息,请参阅 sway(5)。
include /etc/sway/config.d/* 才能应用来自 drop-in 文件的配置片段。 sway 包提供了 50-systemd-user.conf drop-in 文件,该文件将多个环境变量导入到 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)。
安装 i3status 是在 Wayland 下获得一个实用的默认状态栏的选项。您只需在 sway 配置文件的末尾添加以下代码段:
~/.config/sway/config
bar {
status_command i3status
}
如果您想为 i3status 启用彩色输出,您需要调整 i3status 配置中的以下部分:
~/.config/i3status/config
general {
colors = true
interval = 5
}
输出
sway 中的 output 命令允许详细配置不同的显示输出。这包括壁纸、缩放因子、位置等设置。您可以根据需要将多个输出命令组合成一行。
~/.config/sway/config
output HDMI-A-1 mode 1920x1080 pos 1920 0 bg ~/wallpaper.png stretch
可以通过使用其指定的输出名称、使用 "*" 通配符匹配所有输出,或利用显示器的唯一名称(由制造商、型号和序列号组成的字符串)来单独指定输出。例如:
~/.config/sway/config
output "Some Company ABC123 0x00000000" pos 1920 0
您可以使用以下命令获取输出名称列表和其他信息:
$ swaymsg -t get_outputs
有关更深入的配置和附加选项,请查阅 sway-output(5)。
壁纸
在 sway 中显示壁纸由一个专用程序处理。最简单的例子是 swaybg,sway 可以直接管理它。如果需要,必须安装 swaybg 才能运行 output ... bg 命令。
以下行可以包含在 sway 的任何配置文件中,它会在所有显示器上设置背景图像:
~/.config/sway/config
output "*" bg /path/to/image fill
当然,/path/to/image 应替换为实际图像文件的路径。
纯色可以这样设置:
output * bg #000000 solid_color
有关壁纸管理的附加工具和实用程序,请参阅 Sway wiki:Sway wiki。
HiDPI
swaymsg output "*" scale 1。要恢复到自动设置,请设为 0。自动配置
Sway 默认自动应用整数缩放。如果满足以下条件:[3]
- 屏幕通过 EDID 提供有效的物理尺寸信息。
- 两个维度都具有等于或大于 192 的
(分辨率像素维度) / (物理英寸维度)(DPI) 的比例。 - 屏幕分辨率的高度至少为 1200px。
那么 Sway 将使用 2x 缩放。一些设备,例如 Framework Laptop 16,其 DPI 接近(但不完全是)192。在这些情况下,您可能需要手动配置分数缩放。
手动
使用配置文件中的 output 命令设置显示器的缩放因子。缩放因子可以是分数,但对于 HiDPI 屏幕通常是 2。
~/.config/sway/config
output <name> scale <factor>
您可以使用以下命令找到您的显示器名称:
$ swaymsg -t get_outputs
画面撕裂
默认情况下,sway 会同步帧更新(垂直同步),以实现无画面撕裂的帧同步输出,但这会增加延迟。但在某些情况下,禁用垂直同步以使输出更流畅(例如视频游戏)是有用的。
~/.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。
触摸屏映射
在多显示器环境中使用的触摸屏的触摸输入目标可以仅映射到该触摸屏。
~/.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#Keyboard volume control,
- WirePlumber#Keyboard volume control,
- ALSA#Keyboard volume control,
- Backlight#Backlight utilities,
- MPRIS.
要允许在锁屏界面激活时执行按键绑定,请向 bindsym 添加 --locked 参数。
bindsym --locked XF86AudioPlay exec playerctl play-pause
图形指示器条
当调整诸如亮度或音量之类的百分比设置时,通常希望有一个图形条来指示当前级别。Sway 中提供此功能的不错选择是 wob(或 wob-gitAUR),它提供了流行的 X 工具 xobAUR 的一部分功能,但作为实现 layer-shell 协议的原生 Wayland 实用程序。有关用法示例,请参阅 项目网站。
工作区概览
如果您使用大量工作区和大量窗口,并且不再能跟踪哪个窗口在哪里,那么 sovAUR 会很有用。它是一个显示所有工作区布局的覆盖层,以使 Sway 的导航更轻松。它显示程序名称、窗口标题,支持多输出设置。有关更多信息,请参阅 项目页面。
空闲
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 秒后,通过 grep 进程列表查找您的锁定管理器并相应地执行 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'
如果您不希望在 Firefox、Chrome 或 VLC 播放视频时 swaylock 触发,您可以使用 idlehack-gitAUR 来监听 dbus 屏幕保护程序抑制请求,并调用 swayidle-inhibit。Firefox、Chrome 和 VLC 等程序会发出这些事件以防止系统进入空闲状态。
恢复时短暂显示屏幕内容
使用 before-sleep swaylock 可能会导致恢复时短暂显示屏幕内容。为了缓解这种情况,您可以让 logind 忽略盖子事件,并使用 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 [class="firefox"] -> 3 assign [class="^Urxvt$" instance="^htop$"] -> 9
这类似于在 X11 中使用 xorg-xprop 来查找 class 或 wm_name 属性。
当使用多个显示器时,浮动的暂存窗口可能会变得太大,覆盖不止一个显示器。此命令会将浮动窗口居中并将其大小调整为当前显示器大小的 80%。
$ swaymsg move position center; swaymsg resize set 80ppt 80ppt
剪贴板
Wayland 中的剪贴板内容由复制它的程序维护。如果程序关闭,复制的内容将变得不可用。
要持久化剪贴板内容,请使用“剪贴板管理器”,它会维护其自身剪贴板内容的副本。
一个为 Wayland 设计的剪贴板管理器示例是 clipman,可以从 clipmanAUR 或 clipman-gitAUR 安装。
要使用 clipman 启动 Sway,请将以下行添加到您的配置文件中:
~/.config/sway/config
exec wl-paste -t text --watch clipman store --no-persist
Xresources
将 ~/.Xresources 复制到 ~/.Xdefaults 以在 Sway 中使用它们。
Xwayland
有关详细信息和可用软件包的概述,请参阅 Wayland#Xwayland。
Xwayland 的使用是默认启用的。
如果您想完全禁用 Xwayland 并运行“纯”Wayland 会话,请设置以下内容以禁用 Xwayland 的使用:
~/.config/sway/config
xwayland disable
如果您想一目了然地知道哪些窗口正在使用 Xwayland,请设置以下内容:
~/.config/sway/config
for_window [shell="xwayland"] title_format "[XWayland] %title"
使用其他 wlroots 渲染器
要使用 Vulkan 等其他渲染器,请参阅 Wayland#Use another renderer for wlroots based compositor。
自启动
请参阅 i3#Autostart,调整 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 键。
当前键盘布局
可以使用以下方法检索当前键盘布局,其中 kbd_identifier 需要替换为您的键盘标识符:
$ swaymsg -t get_inputs | jq -r '.[] | select(.identifier == "kbd_identifier") | .xkb_active_layout_name'
组合键
将 PrintScreen 设置为 Compose 键:
$ swaymsg 'input * xkb_options compose:prsc'
可用的按键组合可以在 Xorg/Keyboard configuration#Configuring compose key 中找到。Compose 键的组合也可以在 XCompose 文件中配置。应用程序需要重新启动才能使此更改生效。
背光切换
要用按键(例如 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 选项,但如果有多台显示器,您需要明确指定一个输出。
$ swaymsg "output output_name power toggle"
屏幕截图和屏幕共享
色温调节
请参阅 Backlight#Wayland。
颜色配置文件
可以通过将以下行添加到配置文件来使用颜色配置文件:
~/.config/sway/config
output * color_profile 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 开始,模式名称区分大小写。
您可以通过配置命令 swaynag_command swaynagmode 来配置 sway 使用 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 来检查它们的值。
请注意,您需要重新加载应用程序才能看到更改。
$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 report)。
Arch Sway 包提供了一部分或全部此功能。例如,sway 和 sway-gitAUR 都提供了 50-systemd-user.conf drop-in 文件(参见 #Configuration)。
如果您打算通过“自己动手”方法或使用像 sway-systemd-gitAUR、sway-services-gitAUR 或 uwsm 这样的专业软件包提供功能,您应该考虑删除提供相同功能的现有文件。
可以通过创建 sway-session.target 并让那些由 sway-session.target 要求的守护进程/服务来提供此功能。这个 systemd target 应该是一个用户 target(参见 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 start sway-session.target
有了配置文件中的上述行,每当 Sway 启动时,它也会激活 sway-session.target。
最后,将所需的服務链接到 sway-session.target。您可以在 kanshi#Manage kanshi with systemd 中找到一个示例。
当这个用户单元被启用时,它只在 Sway 运行时激活,并在 Sway 停止时停用。
创建 sway-session.target 文件和导入环境也可以通过安装 sway-systemd-gitAUR 来完成。除了将服务分离到 cgroup 中,sway-systemd 还将每个 GUI 应用程序放在自己的 cgroup 中。这允许对单个应用程序施加每个 cgroup 的资源限制。请参阅 sway-systemd README。或者,uwsm 提供了更全面的解决方案。
启动后更改屏幕分辨率
您可以使用图形程序 nwg-displays、wdisplaysAUR、swayrandr-gitAUR 或终端程序 wlr-randr 来更改分辨率、旋转和排列显示器或设置缩放因子。
创建无头输出
创建与物理视频接口无关的输出,例如 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
}
将修饰键更改为 CapsLock 并保留 Super
要将修饰键更改为 CapsLock 并保持 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 远程访问无头 Sway 会话
例如,可以通过 SSH 运行以下代码来启动无头 Sway 会话并远程通过 VNC 访问它。
wayvnc 是一个适用于 wlroots-based Wayland 合成器的 VNC 服务器,可以用于提供无头 Sway 会话。
通过设置 WLR_BACKENDS 为 headless 和(可选)WLR_LIBINPUT_NO_DEVICES 为 1 来启动无头 Sway 会话(请参阅 wayvnc 的 FAQ)。
$ WLR_BACKENDS=headless WLR_LIBINPUT_NO_DEVICES=1 sway
& 可将其在后台运行。现在,运行 wayvnc 来提供 VNC 服务器。
$ WAYLAND_DISPLAY=wayland-1 wayvnc
man wayvnc)。您可能需要考虑端口转发,如 OpenSSH#Forwarding other ports 中所述。默认情况下,wayvnc **不使用加密** 和 **不进行身份验证**!输出热插拔钩子
如果您想在输出连接或断开连接时执行某些操作,请查看 kanshi。
故障排除
应用程序启动器
dmenu 在 Sway 中运行效果相对较好,但它运行在 Xwayland 下,并且存在一个问题:如果光标移动到原生 Wayland 窗口,它可能会变得无响应。这个问题的原因是 Wayland 客户端/窗口除非获得屏幕焦点,否则无法访问输入设备。Xwayland 服务器本身就是 Wayland 合成器的一个客户端,因此它的一个 Xwayland 客户端必须获得焦点才能访问用户输入。但是,一旦它的一个客户端获得焦点,它就可以通过 X11 协议收集输入并使其对所有 Xwayland 客户端可用。因此,将光标移动到 Xwayland 窗口并按 Escape 应该可以解决此问题,有时运行 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"。
您也可以按照 GitHub issue 中的讨论,使用浮动终端和 fzf 来构建自己的启动器。
由 plasma-workspace 包提供的 krunner 二进制文件也可以作为启动器,并同时支持 Xwayland 和原生 Wayland。
rofi 现在可以在 Wayland 下工作,同时仍然支持 X11 会话。
wofi 是一个命令启动器,提供 rofi 的一些相同功能,但运行在 Wayland 下。wofi 缺少 rofi 的一些功能,例如 SSH 模式和窗口切换模式。它基于 wlroots0.19 库,并使用 GTK3 进行渲染。它在 sway 下运行效果很好。
fuzzel 是一个用于 wlroots-based Wayland 合成器的应用程序启动器,类似于 rofi 的 drun 模式。
虚拟化
Sway 可以与 VirtualBox 和 VMware ESXi 配合使用。
要使 Sway 在 QEMU 中工作,必须使用 -vga qxl 启动 QEMU。另请参阅 QEMU#qxl。
无法从 tty 启动 Sway
对于 ESXi,您需要在 硬件配置 > 显卡设置 下启用 3D 支持。另请参阅 VMware#Enable 3D graphics on Intel, Optimus and AMD。
未显示光标
在使用某些图形驱动程序(例如 VMSVGA 图形控制器或专有的 NVIDIA 驱动程序)时,光标将不可见。可以通过使用软件光标来解决此问题,如 [5] 中所述。
$ export WLR_NO_HARDWARE_CURSORS=1
未检测到 Sway 套接字
在终端多路复用器(如 GNU Screen 或 tmux)内部运行时,使用 swaymsg 参数(例如 swaymsg -t get_outputs)有时会返回以下消息:
sway socket not detected. ERROR: Unable to connect to
这意味着 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 指示 tmux 在您每次附加会话时更新它们。
set-option -g update-environment "DISPLAY WAYLAND_DISPLAY SWAYSOCK SSH_AUTH_SOCK"
无法检索套接字路径
在 tty 上请求来自 swaymsg -t 的消息可能会返回以下消息:
Unable to retrieve socket path
SWAYSOCK 环境变量在启动 Sway 后设置,因此此错误的解决方法是在 Sway 内部的终端中请求 swaymsg -t [message]。
键绑定和键盘布局
默认情况下,如果您使用的是多个键盘布局,例如 input * xkb_layout "us,ru",则在切换到某些次要布局时,键绑定可能会失效。
感谢 https://github.com/swaywm/sway/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 等启动器启动应用程序,您可能希望修改应用程序的桌面条目,如 Desktop entries#Modify environment variables 中所示。
OpenJDK 11 和 Sway 1.5 中已修复某些 Java 应用程序的问题。但是,某些应用程序需要额外配置才能使用更新版本的 OpenJDK,例如 Android Studio,您必须设置 STUDIO_JDK=/usr/lib/jvm/java-11-openjdk/。[6]
JRE 包含一个硬编码的已知窗口管理器列表,其中不包含 Sway。如果您遇到灰色面板、菜单错位或窗口大小调整不正确的问题,请参阅 Java#Impersonate another window manager。
边框滚动
如果在使用鼠标滚轮滚动应用程序边框时 Sway 崩溃,您可以为 app_id(例如 Firefox)设置 border none。
程序无法打开显示
如果程序启动时崩溃并显示“无法打开显示”的错误消息,那么您使用的程序很可能是 X11 程序。您可以使用 Xwayland 兼容层在 Wayland 下运行 X11 程序,有关详细信息,请参阅 #Xwayland。
WINE 应用程序中鼠标不起作用
运行时,WINE 期望设置一个主显示器,这可能会导致问题(例如点击无响应),因为 Wayland 没有主显示器的概念。相反,您可以通过 xrandr 为 Xwayland 指定一个主显示器,方法是将以下行添加到 Sway 配置中:
~/.config/sway/config
... exec_always xrandr --output XWAYLAND0 --primary ...
为了使此功能正常工作,您的显示器位置偏移需要是 0,0,这是由于 sway 中的一个 bug [7]。
请注意,XWAYLAND0(或任何 XWAYLAND 显示名称)可能不代表您的显示器,并且在不同会话中可能会发生变化。相反,您可以使用以下行指定第一个 XWAYLAND 显示:
exec_always xrandr --output $(xrandr | grep -m 1 XWAYLAND | awk '{print $1;}') --primary
您可能需要根据您的需求调整这些行。您可以使用不带参数的 xrandr 命令来找出哪些显示器映射到了什么名称。
NVIDIA GPU 游戏画面闪烁
尽管专有的图形驱动程序(如 NVIDIA)官方不支持,但仍有可能使用它们,甚至用于游戏。如果您选择这样做,可能会遇到屏幕上半部分闪烁的问题,可以通过将 wlroots0.19 替换为 wlroots-nvidiaAUR,或手动编译包含该补丁的版本来解决。