SwayWM-自己进行Unix色情

大家好 在本文中,我将介绍我在设置和使用sway(Linux的平铺窗口管理器)方面的经验。


它是什么,为什么需要它?


正式来说,sway是平铺窗口管理器,是在Wayland上运行的透明i3wm替代品。


魏兰德(又名Wölund)等 -来自古德语和古北欧神话的人物,这本书是由英国民俗家杰西·韦斯顿(Jessie Weston)一次写的。 现在你知道了。

但是,我认为sway的主要特征是它是一个构造函数,具有此方法的所有优点和缺点。 如果您喜欢Vim(使用键盘时的方向会加剧与Vim的相似性),Archlinux和类似项目,那么我建议您仔细研究一下。 我个人的看法是,一旦花费更多的时间进行设置,您将为自己带来一个非常稳定和便捷的环境,其中不会发生任何意外情况。


如果sway和Wayland的劣势(例如缺乏对NVidia私人司机的支持以及需要为许多熟悉的程序寻找类似物)对您来说致命,我建议您注意x3 i3wm。 构造器部分将完全不同,您将必须安装xinit,配置各种.Xauthority,有可能处理撕裂,但系统的一般逻辑是完全相同的。


安装方式


Sway可能在您的发行版存储库中。 但是,如果要安装较新的版本,则非常简单。 github项目页面的依赖项列表很少。 安装它们,克隆存储库,将wlroots克隆到subprojects文件夹:


 hub clone swaywm/sway hub clone swaywm/wlroots sway/subprojects/wlroots 

(在这里,我使用集线器 。这是一种非标准但非常方便的工具)。 之后,您可以配置和构建:


 meson setup ./sway-build ./sway --buildtype=minsize ninja -C ./sway-build doas ninja -C ./sway-build install 

doas是OpenBSD开发人员的轻量级sudo替代品。 Linux通常使用其OpenDoas分支。

发射


如果您想在不使用SDDM之类的管理器的情况下从命令行运行,那么唯一正确的方法是


 $ exec sway 

如果您在没有exec情况下运行sway,使用swaylock锁定屏幕,并且sway崩溃,您将被退回到命令行。 锁将无用。


给系统风扇的注意事项:摇摆既不需要systemd-logind也不需要elogind。 是的,在这种情况下,您将必须设置suid位或配置功能。 参见维基

环境变量


我在几个地方开了这些药。


位于~/.local/bin/sway Shell脚本-用于特定于sway的变量。 例如,我希望Qt应用程序不显示风景并使用qt5ct的主题:


 #!/bin/bash QT_QPA_PLATFORMTHEME=qt5ct \ QT_WAYLAND_DISABLE_WINDOWDECORATION=1 \ /usr/bin/sway 

~/.pam_environment用于我要立即在systemd用户会话中使用的变量。 一个例子:


 SSH_AUTH_SOCK DEFAULT="${XDG_RUNTIME_DIR}/gnupg/S.gpg-agent.ssh" 

但是,请谨慎更改此文件,尤其是在使用其他环境的情况下。 例如,如果KDE Plasma在那里检测到$WAYLAND_DISPLAY则不会非常喜欢(具有讽刺意味的是, pam_env此文件的pam_env模块是N年前创建的,主要用于设置$DISPLAY变量)。


~/.bashrc对于所有其他情况。


摇摆设置


进入


在我的系统中,一切都非常简单:我们安装了俄语和英语版式,并通过Alt+Shift在它们之间Alt+Shift 。 在sway配置中,它看起来像这样:


 input * { xkb_layout us,ru xkb_options grp:alt_shift_toggle } 

Sway使用libinput库进行输入,与KDE和Gnome相同。 因此,我们有许多可用的选项。 触摸板设置,自然滚动,鼠标指针加速等 等 可以在man sway-input检查选项列表,并在命令的输出中检查输入设备的列表


 swaymsg -t get_inputs 

但是,我想提请注意一个有趣的机会。 如果您要从X环境迁移,则只需从那里转移键盘设置即可。 在此环境中运行命令


 $ xkbcomp $DISPLAY /path/to/keymap.xkb 

并在sway配置寄存器中


 input * { xkb_file /path/to/keymap.xkb } 

热键


像其他所有热键一样,热键也在配置中设置。 有3条命令来定义它们:


  1. bindswitch 。 当打开/关闭笔记本电脑的机盖,切换到平板电脑模式等时执行此操作。
  2. bindcode 。 当按下具有指定代码的键时执行。 它不依赖于当前布局,对于多媒体键尤其有用。
  3. bindsym 。 输入的当前字符取决于布局。 但是,如果添加--to-code参数,则该字符将从--to-code隐式转换为第一个布局的相应代码(请参见输入设置)。

例如,这样的热键将跳动当前窗口,而不管布局如何:


 bindsym --to-code $mod+Shift+q kill 

您可以在mana中阅读有关这些参数的更多信息: man 5 sway


为了轻松确定按下的内容,sway的作者编写了一个特殊的键盘记录程序 (他需要root用户权限才能工作,因此无需担心安全性)。


结论


可用命令获取可用输出设备的列表


 swaymsg -t get_outputs 

在每个配置中,您可以设置视频模式,缩放(包括小数),图片,旋转等。 最简单的配置如下所示:


 output HDMI-A-1 mode 1920x1080@60Hz output * bg /path/to/wallpaper.jpg fill 

选项的完整列表可以在man sway-output魔法中找到。
还有一个wlr-randr程序,可以在命令行中设置所有这些程序(也就是说,它是Wayland的XRandr的类似物)。


摇杆


Swaybar-在其上显示状态信息的面板。 日期,时间,系统托盘等 等 通常,i3和摇摆爱好者会花费最多时间来设置此特定面板(或多个面板,可能有几个)。 就个人而言,我已经足够了,接近最低配置:


 bar { position top colors { statusline #ffffff background #282828E6 inactive_workspace #282936BF #282936BF #5c5c5c } font Hack 11 status_command i3blocks } 

有许多选项可用于调整位置,颜色,字体,纸盘等。 您可以在mana- man 5 sway-bar有关它们的信息。


Swaybar致力于以i3bar格式读取和解析json,由status_command输出。 这里有许多程序可以使用。 i3statuswaybari3status-rs和许多其他项目。 就个人而言,我更喜欢i3blocks,因为其配置简单且易于添加自定义块。


应用程式设定


通知事项


这可以通过mako守护程序完成(很可能在您的发行版中)。 您也可以在那里调整颜色等,但这都是可选的。 只需运行它,它将起作用。


Mako实现了基于dbus的XDG桌面通知规范。 许多程序都支持它,包括Chromium,Firefox和Telegram。


终端模拟器


在诸如KDE的环境中,Plasma通常使用内置的模拟器来显示菜单,选项卡和许多其他设计元素。 但是,为什么这一切都可以控制? 我更喜欢Alacritty-非常感谢使用Rust编写的方式使用GPU仿真器。 我在他的配置( ~/.config/alacritty/alacritty.yml )的key_bindings部分中添加了这样的热键:


 - { key: T, mods: Control|Shift, action: SpawnNewInstance } 

用当前目录打开一个新窗口。 制表符的一个很好的替代品,并且摇摆会照顾到布局。


 - { key: Up, mods: Control|Shift, action: ScrollLineUp, mode: ~Alt } - { key: Down, mods: Control|Shift, action: ScrollLineDown, mode: ~Alt } 

向上/向下滚动一行。


我们在sway配置中编写


 set $term alacritty bindsym $mod+Return exec $term 

Alacritty不支持连字,因为它们会影响渲染速度。 如果您仍然需要它们,请注意小猫 -这个模拟器也非常快,而且引擎盖下只有令人恐惧的功能和设置。


启动应用程序


通常,使用热键菜单启动正在运行的应用程序。 在配置中,他们写类似


 set $menu ... bindsym --to-code $mod+d exec $menu 

有很多程序可以显示菜单。 有些,例如dmenurofi ,需要XWayland。 在Wayland领导下的工作人员中,我们可以区分bemenu甚至krunner(KDE中Alt+F2 。是的,这是一个独立程序)。


但是,我更喜欢通用的解决方案,即sway-launcher-desktop 。 尽管有名称,但它并不依赖于sway,并且通常不是GUI程序,而是在控制台中工作的小型Shell脚本。 此脚本由$PATH程序,已安装的桌面文件(根据XDG Desktop Entry规范)以及可能的其他源(在config中配置)组成菜单。 出色的fzf实用程序用于显示和搜索菜单-请注意。


因此,要显示菜单,我们需要使用此程序打开一个终端窗口。 具有敏捷性,这是这样完成的:


 set $menu exec alacritty -e sway-launcher-desktop bindsym --to-code $mod+d exec $menu 

您可能希望默认情况下使此窗口浮动。 在i3和sway中,使用for_window指令在配置中配置这些规则。 要将规则映射到sway-launcher-desktop窗口,需要为其分配一些唯一的类,对我来说,它只是Launcher 。 请记住,由于使用Wayland,因此i3手册中列出的条件不适合摇摆。 正确的答案可以在“ man 5 sway ”的章节中找到。 在这种情况下, app_id非常合适,最终配置如下所示:


 set $menu exec alacritty --class Launcher -e sway-launcher-desktop for_window [app_id="Launcher"] floating enable, border pixel 10, sticky enable bindsym --to-code $mod+d exec $menu 

自动启动应用


原则上,要自动启动程序,您只需编写


 exec /path/to/program 

在sway config中,甚至创建自定义systemd单元。 但是,在本文中,我将使用KDE和Gnome所采用的XDG Autostart规范。


该规范是运行位于/etc/xdg/autostart~/.config/autostart中的桌面文件。 通常,这些文件与程序打包在一起,但是很容易创建自己。


这就是摇摆的模块化本质所在。 Sway本身对XDG自动启动一无所知,也对XDG桌面条目一无所知。 此外,其开发人员积极不喜欢这些以及所有类似的规范。 但是, dex控制台实用程序可以管理它们(很可能在发行版的存储库中)。


要检查自动运行中的内容,请键入以下命令


 $ dex -ade Sway 

a表示自动启动, d “空运行”, -e Sway设置环境名称(可以是任意名称),并用于过滤。


结果列表很可能不适合您。 例如,我在kgpgkgpg 。 我们按如下步骤进行:将相应的桌面文件从/etc/xdg/autostart复制到~/.config/autostart ,在其中添加该行


 NotShowIn=Sway 

然后再次检查自动运行。 许多程序(尤其是用Electron编写的程序)可能不喜欢在Wayland下运行。 我们对他们也一样。 我们复制桌面文件并在那里更改启动行。 那是:


 Exec=/usr/bin/skypeforlinux 

成为:


 Exec=env GDK_BACKEND=x11 /usr/bin/skypeforlinux 

上一段落中的swing-launcher-desktop可以使用相同的技术。 解决所有问题后,将行添加到sway配置中


 exec dex -ae Sway 

或者,您也可以执行相反的操作:将所需的桌面文件复制到某个非标准目录,然后使用以下命令在其上设置dex


 exec dex -as /path/to/your/dir 

屏幕截图


两个棺材将帮助我们解决这个问题。 slurp允许您在屏幕上选择任意矩形区域,然后grim对其进行截图。 在我的配置中,它看起来像这样:


 bindsym Print exec grim ~/Pictures/screen-"$(date +%s)".png bindsym $mod+Print exec grim -g "$(slurp)" ~/Pictures/screen-"$(date +%s)".png 

$mod+PrintScreen任意区域的屏幕截图, PrintScreen整个屏幕的屏幕截图。


截屏


如果您需要将截屏视频写入文件或将其流式传输到RTMP流(例如,在Twitch上),则wf-recorder将对此提供帮助(还支持slurp)。


如果要使用OBS Studio,则可以使用wlrobs插件。


但是,一方面在KDE和Gnome中以及在另一方面(尤其是在Chrome和Firefox浏览器中)支持的最通用的解决方案是使用Pipewire和XDG Desktop Portal规范。 为了摇摆,有必要的xdg-desktop-portal-wlr层 ,尽管我没有检查其性能。


夜间模式


夜间模式是在黑暗中用较暖的颜色替换显示器的颜色。 科学家们怀疑这真的有用吗,Wayland的开发人员认为,出于技术原因,对伽玛校正协议进行标准化是没有用的。


不过,我喜欢这个功能,而且它也一直存在。 对于夜间模式,我们需要该redshift分支以支持特定于摇摆的协议。


我们可以通过任何方式安装它,在~/.config/redshift/redshift.conf配置中,选择所需的协议并指定经度和纬度。


 [redshift] location-provider=manual adjustment-method=wayland [manual] lat=xx.xx lon=yy.yy 

锁定并关闭屏幕


来自另一个棺材的两个人来这里营救。 如果没有活动, swayidle将在超时中运行给定命令(反之亦然,其外观),并且swaylock锁定屏幕并要求输入密码。 您可以关闭屏幕(或所有屏幕,如果有多个屏幕)


 swaymsg "output * dpms off" 

守护程序的外观如下所示:在不活动300秒后阻止屏幕,并在600秒后将其关闭:


 swayidle -w \ timeout 300 'swaylock -f -c 000000' \ timeout 600 'swaymsg "output * dpms off"' \ resume 'swaymsg "output * dpms on"' \ before-sleep 'swaylock -f -c 000000' 

以任何方式运行它。


i3blocks


带有日历,网络,磁盘状态等的现成块。 等 可以从i3blocks-contrib存储库中借用。 在i3blocks中,它们被添加到~/.config/i3blocks/config 。 例如,一个块,按星期,日期和时间每5秒更新一次:


 [time] command=date +"%a %d/%m %H:%M" interval=5 

但这只是一个简单的例子。 实际上,i3和摇摆爱好者有一个圣杯:在顶部栏中显示当前窗口的标题栏。 让我们弄清楚如何实现这一目标。


首先,我们开始阅读man sway-ipc ,发现您可以在那里订阅活动。 所需的代码为0x80000003. WINDOW 0x80000003. WINDOW并返回此结构的json对象:


 { "change" : "focus | title | ...", "container": { focused: true | false, name: "...", ... } } 

实际上,窗口本身可以更改其标题( change == title ),或者我们可以将焦点移至另一个窗口( change == focus )。 但是,该窗口可能会更改标题和焦点。 要过滤掉此类事件,我们必须检查container.focused属性。


您可以用Python或Go描述所有这些逻辑,但是有更好的方法。 swaymsg可以轻松地订阅所需的事件并将其输出到stdout:


 $ swaymsg -m -t SUBSCRIBE "['window']" 

我们将在jq处理生成的json。 无需深入探讨这个出色实用程序的查询语法的细微之处,可得出以下结果:


 $ query='select(.change == "focus" or (.change == "title" and .container.focused)) | .container.name' $ swaymsg -m -t SUBSCRIBE "['window']" | jq --unbuffered -r "$query" 

bash上的两行脚本,不再需要任何代码! 需要--unbuffered标志,否则i3blocks将不会立即接收新行,而仅当清除缓冲区时才接收。


最后,将以下块添加到i3blocks配置中:


 [active_window] command=/path/to/our/script.sh interval=persist 

作业:教严厉的人为当前窗口截图。 他们说在Wayland这样的事情是不可能的,但是人们对此表示怀疑。


作业2:教i3blocks将当前键盘布局显示为标志。 i3blocks-contrib中有几个块,但是它们显示文本而不是标志,并且在Wayland中不起作用。


其他程序


wl-clipboard允许您从终端上使用剪贴板,即,它替换了xclip和xsel。 这对于vim用户特别有用,其中复制/粘贴使用"+y / "+p (只需安装此软件包,不需要其他配置)。


ydotool-替换xdotool。


waypipe-网络透明度的代理。 老实说,我不记得上次有人在专门论坛上问与该功能有关的问题。 也许他们根本不使用它? 我-绝对不是。


KDE连接 将org.kde.kdeconnect.nonplasma.desktop文件添加到org.kde.kdeconnect.nonplasma.desktop (请参阅前面的部分),在智能手机上安装KDE Con​​nect并配置它们的连接-您可以使用vlc中的等离子集成插件在浏览器中控制智能手机的音乐和视频播放,cantata中,带有mpv-mpris插件的mpv中 ,还可以通过mako接收通知。 我尊重KDE项目,因为它开发的程序不属于其生态系统。


结论


您可以撰写有关无休止地设置所有这些内容的信息(特别是i3blocks面板),但是最好在这里停止。 这是我得到的:



还可以转到subreddit / r / unixporn惊叹于人们在做什么。 (但是,在那里摆放的所有东西中有95%看起来很漂亮,但绝对不适合日常工作:))。

Source: https://habr.com/ru/post/zh-CN484378/


All Articles