archlinux Sway图形桌面

我在 移动云架构 采用的 Asahi Linux 底层是arch linux,为了能够轻量级运行,采用 wayland显示服务器协议 核心的 sway - i3兼容Wayland compositor 图形桌面。

安装

  • 建议同时安装:

    pacman -S sway swaylock swayidle swaybg
    
  • 安装 dmenu wmenu ( dmenurofi 虽然在sway环境工作良好,但是以来 Xwayland ,所以如果配置禁用 Xwayland,则推荐使用 wmenu )

    pacman -S wmenu
    

注意: 实际上 sway 现在默认推荐使用 wmenu ,所以模板配置中已经包含了使用 wmenu 而不是早期的 dmenu ,配置实际案例如下(默认配置无需修改):

sway默认config中已经激活了 wmenu
set $menu dmenu_path | wmenu | xargs swaymsg exec --
bindsym $mod+d exec $menu
  • ( 由于alacritty不能很好支持中文输入,所以放弃 ) 安装alacritty作为终端 (参考 FreeBSD Sway桌面 ):

    pacman -S alacritty
    
  • 安装foot(默认sway轻量级终端):

    pacman -S foot
    
  • 安裝 swaybar:

    pacman -S swaybar ttf-font-awesome
    

启动

Sway启动前需要访问硬件设备,例如键盘,鼠标和图形卡,这个硬件信息搜集称为一个 seat (类似 FreeBSD Sway桌面)

设置访问方法一: polkit (推荐)

如果系统同时安装了 systemd-logind (不需要手工安装,默认 MacBook Air上运行Arch Linux 安装过程已经安装) 和 polkit 就能自动访问 seat

pacman -S polkit

设置访问方法二: 手工设置加入 seat 用户组

另一种方式是,如果没有安装 polkit ,则:

  • 安装 seatd

    pacman -S seatd
    

将自己加入 seat 用户组,然后激活和启动 seatd.service

usermod -aG seat admin
systemctl enable seatd.service
systemctl start seatd.service

如果没有将用户加入到 seat 组,则启动sway时候,终端会显示报错:

用户没有属于 seat 组,则访问 /run/seatd.sock 无权限报错
00:00:00.009 [wlr] [libseat] [libseat/backend/seatd.c:66] Could not connnect to sockt /run/seatd.sock: Permission denied

使用

启动sway

  • 简单启动:

    sway
    

(使用 polkit )启动时终端提示:

安装 polkit 直接使用 sway 启动终端输出
00:00:00.124 [common/ipc-client.c:871] Unable to receive IPC response

dbus-run-session 启动sway(arch linxu似乎不需要)

警告

这次我绕了很多弯路, dbus-run-session 是我之前在 在Gentoo环境安装和使用Sway 中实践所使用的,但是我发现这次在arch linux中套用这个经验没有成功,阅读了arch linux wiki中有关sway的部分,也没有提到需要使用 dbus-run-session ,所以这段存留,但是 不要使用

使用 dbus-run-session 启动 sway 这样能够正确获得 D-Bus session bus
dbus-run-session sway

(使用 polkit )启动时终端提示:

安装 polkit 使用 dbus-run-session 启动 sway 输出显示
00:00:00.195 [wlr] [xwayland/server.c:454] Cannot find Xwayland binary "/usr/bin/Xwayland"
00:00:00:195 [sway/server.c:363] Failed to start Xwayland
2024-10:00 10:34:55 - [swayby-1.2.1/main.c:202] Found config * for output eDP-1 (Apple Computer inc 0x9CF4 0x01010102)
Environment variable $DISPLAY not set, ignoring.
Environment variable $XDG_CURRENT_DESKTOP not set, ignoring.
dbus-daemon[1943]: [session uid=505 pid=1943] Activating service name='org.freedesktop.systemd1' requested by ':1.0' (uid=505 pid=1964 comm="dbus-update-activation-environment --systemd DISPL")
dbus-daemon[1943]: [session uid=505 pid=1943] Activated service 'org.freedesktop.systemd1' failed: Process org.freedesktop.systemd1 exited with status 1
dbus-update-activation-environment: warning: error sending to systemd: org.freedesktop.DBus.Error.Spawn.ChildExited: Process org.freedesktop.systemd1 exited with status 1
00:00:00.061 [swaybar/tray/icon.c:340] Warning: no icon themes loaded
00:00:00.110 [common/ipc-client.c:87] Unable to receive IPC response

解决

  • 安装 xwayland

    pacman -S xorg-xwayland
    

备注

也可以不安装 xorg-xwayland ,上述报错只是因为arch linux默认的 sway 配置激活了 xwayland ,只需要禁止就可以阻止这个报错。也就是修改 ~/.config/sway/config 设置:

xwayland disable

可以 消除第1,2行有关xwayland错误 ,此时报错依然有关于dbus报错:

补充安装 xwayland 后只解决了xwayland相关报错,但是dbus报错依旧
2024-10:00 10:34:55 - [swayby-1.2.1/main.c:202] Found config * for output eDP-1 (Apple Computer inc 0x9CF4 0x01010102)
Environment variable $DISPLAY not set, ignoring.
Environment variable $XDG_CURRENT_DESKTOP not set, ignoring.
dbus-daemon[1943]: [session uid=505 pid=1943] Activating service name='org.freedesktop.systemd1' requested by ':1.0' (uid=505 pid=1964 comm="dbus-update-activation-environment --systemd DISPL")
dbus-daemon[1943]: [session uid=505 pid=1943] Activated service 'org.freedesktop.systemd1' failed: Process org.freedesktop.systemd1 exited with status 1
dbus-update-activation-environment: warning: error sending to systemd: org.freedesktop.DBus.Error.Spawn.ChildExited: Process org.freedesktop.systemd1 exited with status 1
00:00:00.061 [swaybar/tray/icon.c:340] Warning: no icon themes loaded
00:00:00.110 [common/ipc-client.c:87] Unable to receive IPC response

参考 process org.freedesktop.systemd1 exited with status 1 #5247 上述有关 org.freedesktop.systemd1 报错是由于 /usr/share/dbus-1/services/org.freedesktop.systemd1.service 有一段代码:

/usr/share/dbus-1/services/org.freedesktop.systemd1.service 执行 /bin/false
[D-BUS Service]
Name=org.freedesktop.systemd1
Exec=/bin/false
User=root

为何会出现调用 org.freedesktop.systemd1 呢,看起来这是一个检测功能。也就是说,当运行环境不满足 dbus 要求时候,就会走到调用这个注定返回 false 的子服务。会不会和上面两个没有设置的环境变量有关?

实践看来和这两个环境变量无关

参考 swaywm: XDG_CURRENT_DESKTOP not set ,我在执行 dbus-run-session sway 之前加上了一个环境变量:

增加 XDG_CURRENT_DESKTOP 环境变量设置
export XDG_CURRENT_DESKTOP=sway

可以消除环境变量错误,不过 dbus 相关的 org.freedesktop.systemd1 还是同样报错。

不过,仔细看了报错信息中有 dbus-update-activation-environment ,在 arch linux wiki: Sway #Configuration 有一段说明:

用户配置应该包含 include /etc/sway/config.d/* 以便引入配置片段。 sway 软件包提供了 50-systemd-user.conf 插入文件,该文件将多个环境变量导入 Systemd进程管理器 用户会话和 dbus 。这对于 xdg-desktop-portal-wlr 等多个应用程序是必须的。

想到之前在 在Gentoo环境安装和使用Sway 有设置环境变量 XDG_RUNTIME_DIR 经历,并且需要在 Gentoo xdg-desktop-portal 安装过对应的 xdg-desktop-portal-wlr ( wayland显示服务器协议 的 wlroots 后端xdg-desktop-portal ),所以参考上次实践也在 arch linux 中安装对应的 xdg-desktop-portal :

安装 xdg-desktop-portal 以及对应的后端 xdg-desktop-portal-wlr + xdg-desktop-portal-gtk
pacman -S xdg-desktop-portal xdg-desktop-portal-wlr xdg-desktop-portal-gtk

我发现安装 xdg-desktop-portal-gtk 也会对应安装themes,所以能够消除上面找不到 icon themes 的报错(即消除了 Warning: no icon themes loaded )

备注

暂时没有解决

配置

  • 将sway系统配置复制过来修改:

    cp /etc/sway/config ~/.config/sway/config
    
  • 修改menu配置:

    #set $term alacritty
    set $term foot
    
    set $menu dmenu_path | dmenu | xargs swaymsg exec --
    

还是没有解决dmenu唤起问题

chrome很难支持中文输入,仅安装作为备用

vscode使用electron框架,实际上对中文输入支持也很差: 我决定回归到 Vim 进行开发

输入设备

支持配置touchpad: ~/.config/sway/config :

sway配置touchpad
input type:touchpad {
    dwt enabled
    tap enabled
    natural_scroll enabled
    middle_emulation enabled
}

备注

高分辨率屏幕

对于高分辨率屏幕(HiDPI),可以在 ~/.config/sway/config 中添加:

output <name> scale <factor>

这里 <name> 可以根据 swaymsg -t get_outputs 中输出显示设备名获得,而这里的 <factor> 通常可以设置为 2

注意,如果 factor 设置为非整数倍,则字体显示会有锯齿非常难看。

可以安装图形程序 wdisplays ( Arch Linux AUR 安装 )或者终端程序 wlr-randr ( Arch Linux AUR 安装 )来修改分辨率,旋转和排列显示器。

wdispalys 可以不用重新加载sway配置即时生效,但是和上文配置sway的 output <name> scale <factor> 类似,如果配置方法比率不是2或整数,则字体非常难看。

但是,放大比率2我感觉又有点过大了,所以我感觉还是采用调整终端字体以及配置浏览器的页面放大到 150% 较为合适。

锁屏

锁屏使用 swaylock ,并且可以参考 Script output over a random image in swaylock 切换锁屏图片 (尚未实践)

swaylock 结合 swaylock-effects 可以输出一些信息,如时间:

swaylock --clock --indicator --screenshots --effect-scale 0.4 --effect-vignette 0.2:0.5 --effect-blur 4x2 --datestr "%a %e.%m.%Y" --timestr "%k:%M"

参考