Hyprland
Hyprland 是一个独立的平铺 Wayland 合成器,使用 C++ 编写。Hyprland 的显著特点包括动态平铺、标签页窗口、干净且可读的 C++ 代码库,以及一个自定义渲染器,该渲染器在透明窗口上提供窗口动画、圆角和 Dual-Kawase 模糊。一般用法和配置在Hyprland wiki 上有详细文档。
安装
安装以下软件包之一
- hyprland - 最新上游版本。
- hyprland-gitAUR - master 分支的最新提交。
截至 #6608,Hyprland 使用 aquamarine 作为其自身的渲染后端库。在此之前,它捆绑了其自身版本的 wlroots,该版本密切跟随 wlroots-gitAUR。
配置
配置通过单个配置文件 hyprland.conf 完成,尽管它支持将配置拆分为多个文件并将它们包含在 hyprland.conf
中。默认文件是 /usr/share/hypr/hyprland.conf
,首次登录后为 ~/.config/hypr/hyprland.conf
。
hyprland.conf
包括用于配置您的设备(键盘、鼠标、触控板、显示器)的指令,以及动画、装饰、布局等的设置。您可以设置快捷键绑定、窗口规则,以及执行命令(一次或每次)重新加载配置时。
每次更新文件时,配置都会自动重新加载。您也可以使用 hyprctl reload
获得相同效果。对于某些设置(特别是输入设置),您可能需要重启您的 Hyprland 会话。
设置也可以使用 hyprctl 动态更改,但不会被保存。
键盘
键盘布局
默认情况下,Hyprland 将使用 US Qwerty,您可以按如下方式配置它
~/.config/hypr/hyprland.conf
# German Colemak layout input { ... kb_layout = de kb_variant = colemak ... }
请参阅上游 Wiki 了解所有可用选项。
按键重复延迟和速率
虽然 Xorg 用户习惯于在服务器级别定义此设置,但在 Wayland 上,每个合成器都自行处理它
~/.config/hypr/hyprland.conf
# Repeat rate and delay input { ... repeat_rate = 25 repeat_delay = 600 ... }
键盘背光
在 Hyprland 中可以使用键盘亮度控制。安装 brightnessctl 然后添加相关的绑定(根据您的硬件如何公开键盘背光,将 keyboard_brightness_*
替换为 SUPER, FX
或 XF86KbdBrightness
)
~/.config/hypr/hyprland.conf
# Keyboard backlight bind = , keyboard_brightness_up_shortcut, exec, brightnessctl -d *::kbd_backlight set +33% bind = , keyboard_brightness_down_shortcut, exec, brightnessctl -d *::kbd_backlight set 33%-
也可以在进行更改时触发屏幕通知。
媒体键
通过使用 XF86Audio
键符和像 pavucontrol 或 pamixer 和 playerctl 这样的外部应用程序,可以在 Hyprland 中使用键盘媒体控制。
~/.config/hypr/hyprland.conf
# Volume and Media Control bind = , XF86AudioRaiseVolume, exec, pamixer -i 5 bind = , XF86AudioLowerVolume, exec, pamixer -d 5 bind = , XF86AudioMicMute, exec, pamixer --default-source -m bind = , XF86AudioMute, exec, pamixer -t bind = , XF86AudioPlay, exec, playerctl play-pause bind = , XF86AudioPause, exec, playerctl play-pause bind = , XF86AudioNext, exec, playerctl next bind = , XF86AudioPrev, exec, playerctl previous
也可以在进行更改时触发屏幕通知。
触摸板手势
作为一个 Wayland 合成器,Hyprland 完全支持触摸板手势,尽管它们默认情况下是禁用的。要启用它们,请进行以下编辑
~/.config/hypr/hyprland.conf
# Enable touchpad gestures gestures { workspace_swipe = true workspace_swipe_fingers = 3 }
请参阅上游 Wiki 了解所有可用选项。
显示设置
屏幕共享
请参阅 屏幕共享
作为一个兼容 wlroots 的合成器,Hyprland 可以利用 xdg-desktop-portal-wlr 通过 xdg-desktop-portal 在一系列应用程序中启用屏幕捕获。
Hyprland 还维护着 xdg-desktop-portal-hyprland,它支持屏幕共享(包括区域共享和窗口共享)、全局快捷键,并具有图形选择器实用程序。该门户的使用在 Hyprland wiki 中有进一步的文档说明。
值得注意的是,xdg-desktop-portal-hyprland 不包含文件选择器,用户可以额外安装 xdg-desktop-portal-gtk。
设置屏幕分辨率
Hyprland 将尝试自动检测您的屏幕分辨率,然后选择 1x、1.5x 或 2x 屏幕缩放。[1] 然而,在某些情况下,它会失败并默认使用故障安全模式,通常是在存在多个屏幕或您有混合型笔记本电脑的情况下。如果屏幕上的一切都很大,那么您需要配置您的默认显示器和分辨率。
首先使用 hyprctl 找到您的默认显示器
$ hyprctl monitors
Monitor eDP-1 (ID 0): 1920x1080@144.003006 at 0x0 description: Chimei Innolux Corporation 0x153C (eDP-1) ...
然后将您的显示器添加到配置中
~/.config/hypr/hyprland.conf
... # Monitor details monitor=eDP-1,1920x1080@144,0x0,1 ...
0x0
是用于多屏幕设置的位置偏移量,最后的 1
是屏幕缩放因子。
请参阅上游 Hyprland 显示器 Wiki 了解更多详情。
屏幕背光
安装 brightnessctl 然后添加以下绑定
~/.config/hypr/hyprland.conf
# Screen brightness bind = , XF86MonBrightnessUp, exec, brightnessctl s +5% bind = , XF86MonBrightnessDown, exec, brightnessctl s 5%-
也可以在进行更改时触发屏幕通知。
用法
启动
通用 Wayland 会话管理器
Uwsm 是在 systemd 发行版(特别是 Arch Linux)上启动 Hyprland 会话的推荐方法。它通过 Systemd 单元文件包装 Hyprland 和相应配置的应用程序和守护进程,使您可以使用 systemctl 控制它们。
您可以通过在您的 ~/.profile
中使用以下脚本,在 TTY 中使用 uwsm 启动 Hyprland
if uwsm check may-start && uwsm select; then exec systemd-cat -t uwsm_start uwsm start default fi
uwsm check may-start
检查是否可以启动 wayland 会话,特别是当它从登录 shell 运行时。但是,您仍然应该避免在 .bashrc
或其他即使由非登录 shell 调用的文件中使用它。if uwsm check may-start; then exec uwsm start hyprland.desktop fi
或者通过使用桌面管理器中的 hyprland-uwsm.desktop
条目或在您的桌面管理器中选择 hyprland (uwsm-managed) 来启动。
- 您必须避免使用
exit
调度器或直接终止 Hyprland 进程,因为这会干扰正常的关机过程。例如,请改用uwsm stop
或loginctl terminate-user ""
来终止 Hyprland 并退出用户会话
~/.config/hypr/hyprland.conf
bind = $mainMod, M, exec, uwsm stop
- 不要将环境变量放在
hyprland.conf
中,而是使用 uwsm 文件~/.config/uwsm/env
来存储所有由 uwsm 管理的图形会话(GTK、Qt、xcursor 等)通用的变量,并使用~/.config/uwsm/env-hyprland
来存储 Hyprland 独有的环境变量(例如HYPR*
和AQ_*
变量)。这些文件的格式是每行export KEY=VALUE
,没有注释。强烈建议,如果您使用多个 GPU,请将环境变量AQ_DRM_DEVICES
放在env-hyprland
中,以避免与其他合成器冲突。
终端
您可以使用以下命令从 TTY 启动 Hyprland
$ Hyprland
显示管理器
虽然官方不支持从显示管理器启动,但用户报告称从 GDM、SDDM 和其他管理器启动成功。上游 wiki 维护着一个与显示管理器的兼容性列表。hyprland 软件包包含一个显示管理器条目,并且所有 Hyprland AUR 软件包都会自动生成一个。
两种方法都提供相同的结果,除了少许环境变量和服务之外。
自动登录
用户可以通过使用显示管理器或采用 Xinit#Autostart X at login 中描述的方法来自动登录。
hyprctl 和 IPC
hyprctl 是一个命令行实用程序,随 Hyprland 一起安装,用于与显示服务器通信。它允许您向服务器分派命令(相当于配置文件中的命令,但语法略有不同)、设置关键字、发送查询和请求信息。请参阅完整文档。
Hyprland 还公开了 2 个 UNIX 套接字,用于通过代码或命令行实用程序控制 Hyprland 并获取有关 Hyprland 的信息。这些套接字广播焦点更改(窗口、工作区、显示器)、窗口/工作区创建等事件。
hyprctl 和 IPC 套接字都可以有效地用于脚本中,以控制 Hyprland 进行复杂任务。
exec 与 exec-once
启动应用程序时,重要的是使用正确类型的调度器,不正确地使用 exec
可能会导致应用程序多次启动,占用系统资源,在最坏的情况下,会导致可能使您的系统崩溃的竞争条件。
hyprland.conf
:不要对所有内容都使用 exec
。在大多数情况下,您应该使用 exec-once
在启动时启动应用程序和守护进程,因为此命令不会在重新加载时再次运行,只有当您绝对确定要在每次重新加载时再次运行该命令时才使用 exec
。uwsm app
,以便由 uwsm 管理。例如~/.config/hypr/hyprland.conf
exec-once = uwsm app -- mycommand --arg1 --arg2 bind = SUPER, E, exec, uwsm app -- pcmanfm-qt.desktop
设置环境变量
可以通过 env 关键字直接在 hyprland.conf
中设置环境变量,这与 shells 使用的 env UNIX 命令的语法不同。
差异在上游 Wiki 中进行了解释。
Hypr 生态系统
Hyprland 开发团队正在构建一个应用程序生态系统,专门为与 Hyprland 一起使用而定制,这些工具将包括调度器,允许使用 hyprctl
控制它们,而不是依赖脚本。
目前,该生态系统包括:
Hyprpaper
Hyprpaper 是一个壁纸实用程序,可以使用 hyprpaper 软件包安装。
Hyprpicker
Hyprpicker 是一个从您的桌面抓取颜色的实用程序,可以使用 hyprpicker 软件包安装。
Hypridle
Hypridle 是一个空闲管理守护进程,可以使用 hypridle 软件包安装。
Hyprlock
Hyprlock 是一个屏幕锁定管理器,可以使用 hyprlock 软件包安装。
Hyprcursor
Hyprcursor 是一种用于处理屏幕光标的新格式,它比传统方式提供了许多改进,可以使用 hyprcursor 软件包安装,
Hyprcursor 主题
光标主题可以从 AUR 安装,例如
- sweet-cursors-hyprcursor-gitAUR
- nordzy-hyprcursorsAUR
- xcursor-pro-hyprcursorAUR
- hyprcursor-dracula-kde-gitAUR
将现有主题移植到 Hyprcursor 的说明在 上游 GitHub 存储库中提供。
xdg-desktop-portal-hyprland
Hyprland 自身实现的 XDG 桌面门户。与其他基于 wlroots 的合成器兼容,但在 Hyprland 上使用时提供额外的功能。可通过 xdg-desktop-portal-hyprland 软件包获得。
Hyprpolkitagent
Hyprpolkitagent 是一个 polkit 身份验证守护进程。可以使用 hyprpolkitagent 软件包安装。
hyprsunset
Hyprsunset 是一个小实用程序,为您的系统提供蓝光过滤器。可以使用 hyprsunset 软件包安装。
技巧和提示
文件管理器
如果需要图形文件管理,Hyprland 需要一个兼容 wayland 的外部应用程序。以 thunar 为例,我们只需要为其分配一个快捷键绑定,如下所示
~/.config/hypr/hyprland.conf
... bind = SUPER, E, exec, thunar ...
应用程序启动器
Hyprland 需要一个兼容 wayland 的外部应用程序来启动应用程序。以 wofi 为例,我们只需要为其分配一个快捷键绑定,如下所示
~/.config/hypr/hyprland.conf
... bind = SUPER, F, exec, wofi --show drun ...
闲置
Hyprland 需要一个兼容 wayland 的外部空闲管理守护进程。最常见的设置是 swayidle 和 swaylock。您可以使用如下绑定手动锁定您的屏幕
~/.config/hypr/hyprland.conf
... bind = SUPER, L, exec, swaylock -f -c 000000 ...
自动屏幕锁定和挂起
创建以下脚本
~/.config/hypr/scripts/sleep.sh
swayidle -w timeout 300 'swaylock -f -c 000000' \ timeout 600 'systemctl suspend' \ before-sleep 'swaylock -f -c 000000' &
- 您可以通过编辑数值来调整超时时间,以秒为单位。300 是 5 分钟,600 是 10 分钟等等。
- 该脚本必须是可执行的。
然后调用它
~/.config/hypr/hyprland.conf
... exec-once = ~/.config/hypr/scripts/sleep.sh ...
超时后使用 DPMS 关闭屏幕
Hyprland 有一个内置的调度器来处理 DPMS 请求,但不建议将其用作直接快捷键绑定,这样做会导致您无法重新打开屏幕,并且需要您重新启动。
编辑上面的脚本并更改为如下内容
~/.config/hypr/scripts/sleep.sh
swayidle -w timeout 300 'swaylock -f -c 000000' \ timeout 600 'hyprctl dispatch dpms off' \ resume 'hyprctl dispatch dpms on' \ timeout 900 'systemctl suspend' \ before-sleep 'swaylock -f -c 000000' &
hyprctl dispatch dpms on
命令必须紧跟在脚本中的 hyprctl dispatch dpms off
命令之后才能正常工作,因为 resume 命令链接到之前使用的 timeout。在使用应用程序时停止 DPMS
上述设置将导致您的显示器在您进行诸如玩游戏、观看视频或听音乐等操作时关闭电源,在这些情况下,您可能在超过超时时间的时间内不触碰系统。
为了解决这个问题,您可以使用 Hyprland 内置的窗口规则 V2 功能,该功能具有 idleinhibit
规则,或者您可以安装 idlehack-gitAUR 或 sway-audio-idle-inhibit-gitAUR 中的一个。前者使用 D-Bus 来防止在 Firefox 或 Chromium 播放音频/视频时发送 Swayidle 请求。后者防止在任何应用程序播放音频时发送 Swayidle 请求。
对于使用 org.freedesktop.ScreenSaver.inhibit
暂停屏幕保护程序的程序,您可以安装 hypridle-gitAUR 以在 Hyprland(或任何支持 idle-inhibit
协议的 Wayland 合成器)中实现它。
为了使 hypridle-gitAUR 正常工作,需要创建一个配置。最小配置示例:
~/.config/hypr/hypridle.conf
general { ignore_dbus_inhibit = false ignore_systemd_inhibit = false }
状态栏
Hyprland 需要一个兼容 wayland 的外部应用程序来显示状态栏。以 waybar 为例,我们只需要按如下方式调用它
~/.config/hypr/hyprland.conf
... exec-once = waybar -c ~/.config/waybar/waybar.conf ...
工作区概览
waybar 有一个内置的、完全可自定义的模块,原生支持 Hyprland 工作区切换。
请参阅 waybar Wiki [2] 了解详情。
Polkit 身份验证
Polkit 身份验证需要使用外部身份验证代理。 Hyprland 建议使用 polkit-kde-agent,但任何代理都应该可以工作。
如下调用:
~/.config/hypr/hyprland.conf
... exec-once = /usr/lib/polkit-kde-authentication-agent-1 ...
桌面壁纸
Hyprland 需要一个与 Wayland 兼容的外部应用程序来管理桌面壁纸。 以使用 swww 为例,我们只需要如下调用它:
~/.config/hypr/hyprland.conf
... exec-once = swww-daemon exec-once = swww img path/to/image ...
使用脚本每隔 X 分钟更换壁纸
创建以下脚本并确保它是可执行的
~/.config/hypr/scripts/swww-random
#!/bin/bash # This script will randomly go through the files of a directory, setting it # up as the wallpaper at regular intervals # # NOTE: this script uses bash (not POSIX shell) for the RANDOM variable if [[ $# -lt 1 ]] || [[ ! -d $1 ]]; then echo "Usage: $0 <dir containing images>" exit 1 fi # Edit below to control the images transition export SWWW_TRANSITION_FPS=144 export SWWW_TRANSITION_STEP=2 export SWWW_TRANSITION_TYPE=random # This controls (in seconds) when to switch to the next image INTERVAL=300 while true; do find "$1" \ | while read -r img; do echo "$((RANDOM % 1000)):$img" done \ | sort -n | cut -d':' -f2- \ | while read -r img; do if [[ "$img" != "$1" ]]; then swww img "$img" sleep $INTERVAL fi done done
接下来创建一个新文件夹来存储背景图片,类似于 ~/.config/hypr/backgrounds
应该可以,并在其中放入任何你想要的图片。
最后调用该脚本
~/.config/hypr/hyprland.conf
... exec-once = swww-daemon exec-once = ~/.config/hypr/scripts/swww-random ~/.config/hypr/background ...
屏幕通知
对于诸如亮度和音量更改等操作的屏幕通知,可以通过使用外部通知守护程序来实现。 这是一个非常复杂的主题,完全涵盖它超出了本页的范围。 相反,本节将重点介绍 mako,所以继续安装它。
有关更多说明,请参阅 桌面通知,有关替代方案列表,请参阅 桌面通知#独立。
- 此处提供的所有脚本均为示例,很可能需要根据你的设置进行调整。
- 本节中的所有脚本都必须是可执行的。
Mako
Mako 是一个轻量级的通知守护程序,你可以阅读 mako(5) 以了解详细信息。 它的配置文件是 ~/.config/mako/config
,用于 OSD 的图标存储在 ~/.config/mako/icons/
中,并且应该是 PNG 格式。
对于本节的其余部分,脚本使用的所有图像都可从 此 GitHub 文件夹 获取。
键盘背光通知
首先创建以下脚本
~/.config/hypr/scripts/kbbacklight
#!/usr/bin/env bash iDIR="$HOME/.config/mako/icons" # Get brightness get_backlight() { LIGHT="$(cat /sys/class/leds/*::kbd_backlight/brightness)" echo "${LIGHT}" } # Get icons get_icon() { current="$(cat /sys/class/leds/*::kbd_backlight/brightness)" if [[ ("$current" -ge "0") && ("$current" -le "1") ]]; then icon="$iDIR/brightness-20.png" elif [[ ("$current" -ge "1") && ("$current" -le "2") ]]; then icon="$iDIR/brightness-60.png" elif [[ ("$current" -ge "2") && ("$current" -le "3") ]]; then icon="$iDIR/brightness-100.png" fi } # Notify notify_user() { notify-send -h string:x-canonical-private-synchronous:sys-notify -u low -i "$icon" "Keyboard Brightness : $(brightnessctl -d '*::kbd_backlight' g)" } # Increase brightness inc_backlight() { brightnessctl -d *::kbd_backlight set 33%+ && get_icon && notify_user } # Decrease brightness dec_backlight() { brightnessctl -d *::kbd_backlight set 33%- && get_icon && notify_user } # Zero brightness zero_backlight() { brightnessctl -d *::kbd_backlight s 0% } # Full brightness full_backlight() { brightnessctl -d *::kbd_backlight s 100% } # Execute accordingly if [[ "$1" == "--get" ]]; then brightnessctl -d '*::kbd_backlight' g elif [[ "$1" == "--inc" ]]; then inc_backlight elif [[ "$1" == "--dec" ]]; then dec_backlight elif [[ "$1" == "--zero" ]]; then zero_backlight elif [[ "$1" == "--full" ]]; then full_backlight else get_backlight fi
然后添加新的绑定,或编辑任何现有的绑定
~/.config/hypr/hyprland.conf
# Keyboard brightness bind = keyboard_brightness_up_shortcut, exec, ~/.config/hypr/scripts/kbbacklight --inc bind = keyboard_brightness_down_shortcut, exec, ~/.config/hypr/scripts/kbbacklight --dec
媒体键通知
首先创建以下脚本
~/.config/hypr/scripts/volume
#!/usr/bin/env bash iDIR="$HOME/.config/mako/icons" # Get Volume get_volume() { volume=$(pamixer --get-volume) echo "$volume" } # Get icons get_icon() { current=$(get_volume) if [[ "$current" -eq "0" ]]; then echo "$iDIR/volume-mute.png" elif [[ ("$current" -ge "0") && ("$current" -le "30") ]]; then echo "$iDIR/volume-low.png" elif [[ ("$current" -ge "30") && ("$current" -le "60") ]]; then echo "$iDIR/volume-mid.png" elif [[ ("$current" -ge "60") && ("$current" -le "100") ]]; then echo "$iDIR/volume-high.png" fi } # Notify notify_user() { notify-send -h string:x-canonical-private-synchronous:sys-notify -u low -i "$(get_icon)" "Volume : $(get_volume) %" } # Increase Volume inc_volume() { pamixer -i 5 && notify_user } # Decrease Volume dec_volume() { pamixer -d 5 && notify_user } # Toggle Mute toggle_mute() { if [ "$(pamixer --get-mute)" == "false" ]; then pamixer -m && notify-send -h string:x-canonical-private-synchronous:sys-notify -u low -i "$iDIR/volume-mute.png" "Volume Switched OFF" elif [ "$(pamixer --get-mute)" == "true" ]; then pamixer -u && notify-send -h string:x-canonical-private-synchronous:sys-notify -u low -i "$(get_icon)" "Volume Switched ON" fi } # Toggle Mic toggle_mic() { if [ "$(pamixer --default-source --get-mute)" == "false" ]; then pamixer --default-source -m && notify-send -h string:x-canonical-private-synchronous:sys-notify -u low -i "$iDIR/microphone-mute.png" "Microphone Switched OFF" elif [ "$(pamixer --default-source --get-mute)" == "true" ]; then pamixer -u --default-source u && notify-send -h string:x-canonical-private-synchronous:sys-notify -u low -i "$iDIR/microphone.png" "Microphone Switched ON" fi } # Get icons get_mic_icon() { current=$(pamixer --default-source --get-volume) if [[ "$current" -eq "0" ]]; then echo "$iDIR/microphone.png" elif [[ ("$current" -ge "0") && ("$current" -le "30") ]]; then echo "$iDIR/microphone.png" elif [[ ("$current" -ge "30") && ("$current" -le "60") ]]; then echo "$iDIR/microphone.png" elif [[ ("$current" -ge "60") && ("$current" -le "100") ]]; then echo "$iDIR/microphone.png" fi } # Notify notify_mic_user() { notify-send -h string:x-canonical-private-synchronous:sys-notify -u low -i "$(get_mic_icon)" "Mic-Level : $(pamixer --default-source --get-volume) %" } # Increase MIC Volume inc_mic_volume() { pamixer --default-source -i 5 && notify_mic_user } # Decrease MIC Volume dec_mic_volume() { pamixer --default-source -d 5 && notify_mic_user } # Execute accordingly if [[ "$1" == "--get" ]]; then get_volume elif [[ "$1" == "--inc" ]]; then inc_volume elif [[ "$1" == "--dec" ]]; then dec_volume elif [[ "$1" == "--toggle" ]]; then toggle_mute elif [[ "$1" == "--toggle-mic" ]]; then toggle_mic elif [[ "$1" == "--get-icon" ]]; then get_icon elif [[ "$1" == "--get-mic-icon" ]]; then get_mic_icon elif [[ "$1" == "--mic-inc" ]]; then inc_mic_volume elif [[ "$1" == "--mic-dec" ]]; then dec_mic_volume else get_volume fi
然后添加以下内容(或编辑任何现有绑定)
~/.config/hypr/hyprland.conf
# Volume bind = , XF86AudioRaiseVolume, exec, ~/.config/hypr/scripts/volume --inc bind = , XF86AudioLowerVolume, exec, ~/.config/hypr/scripts/volume --dec bind = , XF86AudioMicMute, exec, ~/.config/hypr/scripts/volume --toggle-mic bind = , XF86AudioMute, exec, ~/.config/hypr/scripts/volume --toggle
屏幕背光通知
首先创建以下脚本
~/.config/hypr/scripts/backlight
!/usr/bin/env bash iDIR="$HOME/.config/mako/icons" # Get brightness get_backlight() { LIGHT=$(printf "%.0f\n" $(brightnessctl g)) echo "${LIGHT}" } # Get icons get_icon() { current="$(get_backlight)" if [[ ("$current" -ge "0") && ("$current" -le "19200") ]]; then icon="$iDIR/brightness-20.png" elif [[ ("$current" -ge "19200") && ("$current" -le "38400") ]]; then icon="$iDIR/brightness-40.png" elif [[ ("$current" -ge "38400") && ("$current" -le "57600") ]]; then icon="$iDIR/brightness-60.png" elif [[ ("$current" -ge "57600") && ("$current" -le "76800") ]]; then icon="$iDIR/brightness-80.png" elif [[ ("$current" -ge "76800") && ("$current" -le "96000") ]]; then icon="$iDIR/brightness-100.png" fi } # Notify notify_user() { notify-send -h string:x-canonical-private-synchronous:sys-notify -u low -i "$icon" "Brightness : $(get_backlight)" } # Increase brightness inc_backlight() { brightnessctl s +5% && get_icon && notify_user } # Decrease brightness dec_backlight() { brightnessctl s 5%- && get_icon && notify_user } # Execute accordingly if [[ "$1" == "--get" ]]; then get_backlight elif [[ "$1" == "--inc" ]]; then inc_backlight elif [[ "$1" == "--dec" ]]; then dec_backlight else get_backlight fi
然后添加以下内容(或编辑任何现有绑定)
~/.config/hypr/hyprland.conf
# Screen brightness bind = , XF86MonBrightnessUp, exec, ~/.config/hypr/scripts/backlight --inc bind = , XF86MonBrightnessDown, exec, ~/.config/hypr/scripts/backlight --dec
键盘语言通知
要运行此脚本,你需要一个命令行 JSON 处理器 gojqAUR。
首先创建以下脚本
~/.config/hypr/scripts/lang
#!/usr/bin/env bash icon="$HOME/.config/mako/icons/language.png" # Get language get_lang() { lang=$(hyprctl devices -j | gojq -r '.keyboards[] | select(.name == "at-translated-set-2-keyboard") | .active_keymap' | cut -c 1-2 | tr 'A-Z' 'a-z') case $lang in en) lang="English language" ;; ru) lang="Русский язык" ;; uk) lang="Українська мова" ;; esac echo $lang } # Notify notify-send -h string:x-canonical-private-synchronous:sys-notify -u low -i "$icon" "$(get_lang)"
然后添加以下内容(或编辑任何现有绑定)
~/.config/hypr/hyprland.conf
device:at-translated-set-2-keyboard { kb_layout = us,ru,ua kb_variant = lang kb_options = grp:win_space_toggle } # Language bind = SUPER, SPACE, exec, ~/.config/hypr/scripts/lang
电源控制
Hyprland 需要一个与 Wayland 兼容的外部应用程序来进行电源控制。 以 nwg-bar 为例,我们只需要如下绑定它:
~/.config/hypr/hyprland.conf
... bind = SUPER, ESCAPE, exec, nwg-bar ...
剪贴板
Wayland 剪贴板行为在关闭复制数据的应用程序时会删除数据。 其他桌面环境通过使用专用的剪贴板管理器来解决这个问题,而在 Hyprland 上有多种兼容的选择。 有关更多信息,请参阅上游 Wiki。
本节将介绍 cliphist,因为它支持复制图像和文本,首先添加以下内容
~/.config/hypr/hyprland.conf
... exec-once = wl-paste --type text --watch cliphist store exec-once = wl-paste --type image --watch cliphist store ...
然后创建一个绑定,在您选择的应用程序启动器中调用历史记录
~/.config/hypr/hyprland.conf
... bind = SUPER, V, exec, cliphist list | wofi --dmenu | cliphist decode | wl-copy ...
现在按下 Super+v
将打开一个带有剪贴板历史记录列表的 wofi
窗口。
启用/禁用设备
要启用/禁用设备(例如触摸板),首先使用
$ hyprctl devices
来获取你的设备名称。
将这些代码行放入你的配置文件中(将 <device_name> 替换为你上面查询的设备名称)以打开/关闭设备
~/.config/hypr/hyprland.conf
device:<device_name> { enabled = {true/false} }
要动态地打开/关闭设备,请使用 hyprctl
$ hyprctl keyword "device:<device_name>:enabled" {true|false}
你也可以创建一个快捷键绑定,例如
~/.config/hypr/hyprland.conf
... bind = $mainMod, t, exec, hyprctl keyword "device:pixa3854:00-093a:0274-touchpad:enabled" false bind = $mainMod Shift, t, exec, hyprctl keyword "device:pixa3854:00-093a:0274-touchpad:enabled" true ...
单独的 dconf 配置文件
如果你不想污染其他基于 GTK 的 DE 的设置,你可以使用单独的 dconf
配置文件。 例如
声明新的全局 dconf 配置文件
/etc/dconf/profile/hyprland
user-db:hyprland
~/.config/hypr/hyprland.conf
... env = DCONF_PROFILE, hyprland ...
现在你可以使用 gsettings,它不应该影响其他桌面环境。
故障排除
xdg-desktop-portal-hyprland 占用大量 CPU
这是一个已知 bug [3],应该在最新的 Git 版本中得到解决。 你可以通过在你的 hyprland.conf
文件中调用 Hyprland wiki 中的核弹脚本[死链 2024-11-05 ⓘ] 来解决这个问题。
在 NVIDIA 上原生 (wayland) electron 应用程序闪烁
这是 Hyprland 上 NVIDIA 用户中普遍存在的问题 [4], [5],因为 Hyprland 中缺乏对显式同步的支持 [6]。 推荐的临时修复方法是对有问题的应用程序使用 X11 (XWayland),方法是传递 --ozone-platform-hint=x11
,或者在 ~/.config/hypr/hyprland.conf
中设置 env = ELECTRON_OZONE_PLATFORM_HINT,x11
以强制所有 electron 应用程序使用 XWayland 运行。