Sway

出自 ArchWiki

Sway(是 SirCmpwn's Wayland compositor 的缩写[1])是一个 Wayland 的合成器,旨在完全兼容 i3。根据官方网站

Sway 是一个平铺 Wayland 合成器,并且是 X11 的 i3 窗口管理器的直接替代品。它可以与您现有的 i3 配置一起工作,并支持 i3 的大多数功能,以及一些额外的功能。

如果您对视觉效果感兴趣,swayfxAUR 作为 sway 的一个分支存在,具有流行的视觉效果。

安装

Sway 可以通过 sway 软件包安装。开发版本可以使用 sway-gitAUR 安装。建议您在更新 sway 时始终更新 wlroots,因为它们有紧密的依赖关系。

注意: 所有专有图形驱动程序都不受支持,包括 NVIDIA。在 NVIDIA 驱动程序 495 版本之后,如果您启用内核模式设置并使用 --unsupported-gpu 运行 sway,则 sway 可以工作。

您还可以安装 swaylockswayidleswaybg 分别用于锁定屏幕、设置空闲管理器和设置壁纸。此外,AUR 提供了这些软件包的开发版本,名称分别为 swaylock-gitAURswayidle-gitAURswaybg-gitAUR。这些软件包提供了来自各自项目 Git 仓库的最新功能和更新。

默认的应用程序启动器是 wmenu,默认的终端模拟器foot。在启动 sway 之前,建议安装它们或在配置中设置新的启动器和终端。有关一些有用的 i3 软件包的其他 Wayland 兼容版本,您可以查看 Sway 维基上的迁移指南

启动

在 Sway 可以启动之前,它需要访问您的硬件设备,例如键盘、鼠标和显卡。这些硬件设备的集合称为 seat,如 sd-login(3) 中所述。

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

如果您的系统上已安装 polkit,Sway 应该会自动获得对您的 seat 的访问权限。

或者,如果您的系统上未安装 polkit 并且您想改用 seatd,请将自己添加到 seat 用户组启用/启动 seatd.service,重新登录并选择以下方法之一来启动 Sway。

手动

要启动 Sway,只需在 Linux 控制台中键入 sway

在 TTY 登录时自动启动

与 X 类似,Sway 可以通过将以下内容添加到您的 shell 初始化文件来启动(请参阅命令行 Shell#登录 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)自动识别。

也可以通过显示管理器将 sway 作为 systemd 用户服务 启动。

您也可以使用基于文本的会话管理器,请参阅 显示管理器#控制台

配置

如果您已经使用 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 以美国 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)

键盘布局也可以在使用环境变量 (XKB_DEFAULT_LAYOUT, XKB_DEFAULT_VARIANT 等) 启动 sway 时配置。配置选项优先于环境变量。

键盘重复延迟和速率

要更改键盘重复延迟和速率,您可以将以下行添加到您的 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)

提示: waybar 是 sway 附带的状态栏 (swaybar) 的替代品。

安装 i3status 是在 Wayland 下获得实用、默认状态栏的一个选项。您只需在您的 sway 配置末尾添加以下代码片段

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

如果您想为 i3status 启用彩色输出,您需要调整 i3status 配置中的以下部分

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

输出

sway 中的 output 命令允许详细配置不同的显示输出。这包括壁纸、缩放因子、位置等设置。您可以根据需要将多个 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 中的显示由专用程序处理。最简单的例子是 swaybgsway 可以直接管理它。如果需要运行 output ... bg 命令,则必须安装 swaybg

以下行可以包含在 sway 的配置文件中的任何位置,它在所有显示器上设置背景图像

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

当然,/path/to/image 应该替换为现有图像文件的路径。

纯色可以按如下方式设置

output * bg #000000 solid_color

有关壁纸管理的其他工具和实用程序,请参阅Sway 维基

HiDPI

自动

默认情况下,Sway 会自动应用整数缩放。如果以下条件成立:[3]

  • 屏幕通过 EDID 提供有效的物理尺寸信息。
  • 两个维度的比率 (像素分辨率维度) / (物理尺寸,英寸) (DPI) 至少为 192。
  • 屏幕分辨率的高度至少为 1200px。

那么 Sway 将使用 2 倍缩放。某些设备,例如 Framework Laptop 16,其 DPI 接近(但不完全是)192。在这些情况下,您可能需要手动配置分数缩放。

手动

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

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

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

$ swaymsg -t get_outputs

输入设备

可以调整特定的输入设备配置。例如,要为所有触摸板启用点击触摸和自然滚动

~/.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)

如果您使用绘图板,请参阅 绘图板#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 XF86AudioNext exec playerctl next
bindsym XF86AudioPrev exec playerctl previous
bindsym XF86Search exec bemenu-run

有关详细信息和替代实用程序,请参阅

要允许在锁屏处于活动状态时执行快捷键,请将 --locked 参数添加到 bindsym。

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

图形指示条

通常希望在调整某些百分比值设置(如亮度或音量)时,通过图形条指示当前级别。wob(或者 wob-gitAUR)是在 Sway 中提供此功能的一个好选择,它提供了流行的 X 工具 xobAUR 的部分功能,但作为一个实现 layer-shell 协议的原生 Wayland 实用程序。有关用法示例,请参阅项目网站

工作区概览

如果您使用大量工作区和大量窗口,并且无法追踪什么在哪里,那么 sovAUR 可能会派上用场。它是一个覆盖层,显示所有工作区的模式,以简化 sway 中的导航。它显示程序名称、窗口标题,并支持多输出设置。有关更多信息,请参阅项目页面

空闲

Sway 有一个专用的空闲管理守护进程,名为 swayidle,用于处理空闲会话。有不同的方法来启动和参数化守护进程。最简单的方法是使用 sway 本身的配置。swayidle 接受大量参数来配置事件,如 timeout(又名空闲)、resume(不再空闲,在超时后)、before-sleep 等。有关事件的更多详细信息和进一步说明,请参阅 swayidle(1)。然后可以将每个事件分配一个操作。要为事件分配多个操作,只需重复触发器。

以下指示 swayidle 在 30 分钟后锁定屏幕,并在五秒后关闭屏幕

~/.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'
注意: Systemd 也处理一些空闲事件,这些事件可能与 sway 中配置的事件冲突。有关如何在其中配置它们的详细信息,请参阅 loginctl(1)logind.conf(5)


如果您不希望在 Firefox、Chrome 或 VLC 中播放视频时触发 swaylock,您可以使用 idlehack-gitAUR 监听 dbus 屏幕保护程序抑制请求并调用 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

这类似于使用 xorg-xpropX11 中查找 classwm_name 属性。

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

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

剪贴板

本文或章节有待与剪贴板合并。

注意: 非 Sway 特有。(在Talk:Sway 中讨论)

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

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

一个为 Wayland 设计的剪贴板管理器示例是 clipman,可以从 clipmanAURclipman-gitAUR 安装。

要使用 Sway 启动 clipman,请将以下行添加到您的配置文件

~/.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"
注意: 一些程序需要特殊的环境变量或配置选项才能在 Wayland 下原生运行,而其他程序(包括大多数专有应用程序)根本不支持 Wayland。目前建议保留 Xwayland,以便可以使用旧版应用程序。

使用另一个 wlroots 渲染器

您可以通过指定 WLR_RENDERER 环境变量来使用另一个 wlroots 渲染器。可用渲染器列表在 wlroots 文档中。您可能需要安装 vulkan-validation-layers 以用于 vulkan 渲染器,否则 sway 可能无法启动。

自动启动

请参阅 i3#自动启动,调整 sway 的配置文件名。

技巧与窍门

初始启用大写锁定/数字锁定

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

~/.config/sway/config
input type:keyboard xkb_capslock enabled
input type:keyboard xkb_numlock enabled

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

注意: 使用通配符标识符启用这些功能可能会导致 Firefox 在重新加载您的 sway 配置文件时崩溃:Bugzilla 1652820。尝试指定键盘代替。

当前键盘布局

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

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

组合键

要将 PrintScreen 设置为组合键

$ swaymsg 'input * xkb_options compose:prsc'

可用的按键组合可以按照 Xorg/键盘配置#配置组合键 中所示进行查找。组合键的组合也可以在 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"

屏幕截图和屏幕共享

请参阅 屏幕截图#Wayland

色温调整

请参阅 背光#Wayland

颜色配置文件

可以通过将以下行添加到您的配置文件来使用颜色配置文件

~/.config/sway/config
output * color_profile 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

更改光标主题和大小

要设置光标主题和大小

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

其中 my_cursor_theme 可以设置为或替换为特定值,例如 defaultAdwaitaSimple-and-Soft,而 my_cursor_size 可以设置为 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 错误报告)。

Arch Sway 软件包提供部分或全部此功能。例如,swaysway-gitAUR 都提供 50-systemd-user.conf 放置文件(参见 #配置)。

如果您打算使用下面描述的自制方法或使用专门的软件包(例如 sway-systemd-gitAUR, sway-services-gitAURuwsmAUR)来提供功能,则应考虑删除提供相同功能的文件。

此功能可以通过自制方式提供,方法是创建一个 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 start sway-session.target

在配置文件中包含上述行后,每当 Sway 启动时,它也会激活 sway-session.target

最后,将所需的服务链接到 sway-session.target。您可以在 kanshi#使用 systemd 管理 kanshi 中找到示例。

当此用户单元启用后,它仅在 Sway 运行时激活,并在 Sway 停止时停用。

创建 sway-session.target 文件和导入环境也可以通过安装 sway-systemd-gitAUR 来完成。除了将服务分隔到 cgroup 中,sway-systemd 还将每个 GUI 应用程序置于其自己的 cgroup 中。这使得可以对单个应用程序施加每个 cgroup 的资源约束。请参阅 sway-systemd README。或者,uwsm 提供了更全面的解决方案。

启动后更改屏幕分辨率

您可以使用图形程序 wdisplaysAURswayrandr-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 的 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
注意: 默认情况下,wayvnc 将仅监听 localhost 端口 5900。这可以配置(参见 man wayvnc)。您可能需要考虑转发端口,如 OpenSSH#端口转发 中所述。默认情况下,wayvnc 不使用加密不使用身份验证

故障排除

应用程序启动器

提示: Sway 的 wiki 还有一个 已知应用程序启动器列表

dmenurofi 在 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"。

您也可以使用浮动终端和 fzf 构建自己的启动器,如 GitHub issue 中讨论的那样。

此外,plasma-workspace 软件包提供的 krunner 二进制文件可以用作启动器,提供 Xwayland 和原生 Wayland 支持。

rofi-waylandrofi 的一个分支,可在 Wayland 中工作,如果您需要在 X11 会话中启动它,还具有 -x11 标志。

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

fuzzel 是一个基于 wlroots 的 Wayland 合成器的应用程序启动器,类似于 rofi 的 drun 模式。

虚拟化

Sway 可以与 VirtualBoxVMware ESXi 一起使用。

为了使 Sway 在 QEMU 中工作,必须使用 -vga qxl 启动 QEMU。另请参阅 QEMU#qxl

无法从 tty 启动 Sway

对于 ESXi,您需要在硬件配置 > 视频卡设置下启用 3D 支持。另请参阅 VMware#在 Intel、Optimus 和 AMD 上启用 3D 图形

没有可见的光标

当使用某些图形驱动程序(例如 VMSVGA 图形控制器或专有的 NVIDIA 驱动程序)时,光标是不可见的。这可以通过使用软件光标来修复,如 [4] 中所述

$ export WLR_NO_HARDWARE_CURSORS=1

Sway 套接字未检测到

使用 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 启动之前运行,则环境变量已过时。

您可以使用 update-environment 指示 tmux 在每次附加到会话时更新它们,方法是将以下内容添加到您的 .tmux.conf

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。为了缓解这种情况,可以使用设置为 1 的 _JAVA_AWT_WM_NONREPARENTING 环境变量启动应用程序。

如果您从启动器(如 rofidmenu)启动应用程序,您可能需要修改应用程序桌面条目,如 桌面条目#修改环境变量 中所示。

OpenJDK 11 和 Sway 1.5 中已修复了一些 Java 应用程序的问题。但是,某些应用程序需要额外的配置才能使用较新版本的 OpenJDK,在 Android Studio 的情况下,您必须设置 STUDIO_JDK=/usr/lib/jvm/java-11-openjdk/[5]

JRE 有一个硬编码的已知窗口管理器列表,其中不包含 Sway。如果您遇到灰色面板、错位的菜单或大小调整不当的窗口,请参阅 Java#模拟另一个窗口管理器

边框滚动

如果在应用程序边框上使用鼠标滚轮导致 sway 崩溃,您可以为 app_id(例如 Firefox)使用 border none

程序无法打开显示器

如果程序在启动时崩溃并显示错误消息“cannot open display”,则可能是您正在使用的程序是 X11 程序。您可以使用 Xwayland 兼容层在 Wayland 下运行 X11 程序,有关详细信息,请参阅 #Xwayland

鼠标在 WINE 应用程序中不起作用

运行程序时,WINE 期望设置主监视器,这可能会导致问题(例如单击未注册),因为 Wayland 没有主监视器的概念。相反,您可以通过向 Sway 配置文件添加以下行,为 Xwayland 指定主监视器

~/.config/sway/config
...
exec_always xrandr --output XWAYLAND0 --primary
...

为了使此操作有效,由于 sway 中的错误 [6],您的显示器位置偏移需要为 0,0。

请注意,XWAYLAND0(或任何 XWAYLAND 显示器名称)可能不代表您的监视器,并且可能在不同的会话中发生更改。相反,您可以使用以下行指定第一个 XWAYLAND 显示器

exec_always xrandr --output $(xrandr | grep -m 1 XWAYLAND | awk '{print $1;}') --primary

您可能需要调整这些行以满足您的需求。您可以使用不带参数的 xrandr 命令来找出哪些显示器映射到哪些名称。

注意: Xwayland 会将任何新连接的监视器(包括已关闭并再次打开的监视器)识别为全新的显示器。如果您的“主监视器”发生这种情况,它将不再被视为主监视器。

NVIDIA GPU 游戏中的闪烁

虽然像 NVIDIA 这样的专有图形驱动程序官方不支持,但也可以使用它们,甚至用于游戏。如果您选择这样做,您可能会遇到屏幕上半部分闪烁的情况,这可以通过将 wlroots 替换为 wlroots-nvidiaAUR,或手动编译带有补丁的您自己的版本来解决。

另请参阅