Hyprland
Hyprland 是一个用 C++ 编写的独立平铺 Wayland 合成器。Hyprland 的特色功能包括动态平铺、标签式窗口、简洁易读的 C++ 代码库以及一个自定义渲染器,该渲染器可提供窗口动画、圆角和透明窗口上的双 Kawase 模糊。通用用法和配置可在 Hyprland wiki 上获得详尽文档。
安装
截至 #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。
US 布局的键盘,则需要更改键盘映射。按键重复延迟和速率
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%-
也可以在进行更改时显示 屏幕通知。
媒体键
在 Hyprland 中可以使用键盘媒体控件,方法是利用 XF86Audio 键符号以及像 pavucontrol 或 pamixer 和 playerctl 这样的外部应用程序。
~/.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 gesture = 3, horizontal, workspace
有关所有可用选项,请参阅 上游 Wiki。
显示设置
屏幕共享
请参阅 屏幕共享。
作为 wlroots 兼容的合成器,Hyprland 可以利用 xdg-desktop-portal-wlr 通过 xdg-desktop-portal 在各种应用程序中启用屏幕捕获。
Hyprland 还维护 xdg-desktop-portal-hyprland,它支持屏幕共享(包括区域共享和窗口共享)、全局快捷方式,并提供图形化选择工具。有关该 Portal 的使用方法,请进一步参阅 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
monitorv2 {
output = eDP-1
mode = 1920x1080@144
position = 0x0
scale = 1
}
...
0x0 是用于多显示器设置的位置偏移,最后的 1 是屏幕缩放因子。
有关更多详细信息,请参阅 上游 Hyprland 显示器 Wiki。
设置 GUI
有一个名为 nwg-displays 的软件包,这是一个用于显示器布局的 GUI 应用程序,它支持 Hyprland。它是 nwg-shell 的一部分(但可独立工作),有关更多详细信息,请参阅 nwg-displays github。
屏幕背光
安装 brightnessctl,然后添加以下绑定
~/.config/hypr/hyprland.conf
# Screen brightness bind = , XF86MonBrightnessUp, exec, brightnessctl s +5% bind = , XF86MonBrightnessDown, exec, brightnessctl s 5%-
也可以在进行更改时显示 屏幕通知。
用法
启动
通用 Wayland 会话管理器
Universal Wayland Session Manager 通过 systemd unit 文件封装了合成器以及相应配置的应用程序和守护进程,允许您使用 systemctl 来控制它们。
可以通过一个 显示管理器 与 uwsm 一起启动 Hyprland,方法是选择 hyprland (uwsm-managed)。
您可以通过以下脚本在 getty 中使用 uwsm 启动 Hyprland,该脚本位于您的 登录 shell 中
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 也会被 sourced 的文件中使用它。
if uwsm check may-start; then exec uwsm start hyprland.desktop fi
- 您必须避免使用
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中,以避免与其他合成器冲突。
Terminal
您可以使用以下命令从 getty 启动 Hyprland
$ Hyprland
显示管理器
虽然官方不支持从 显示管理器 启动,但用户报告了从 GDM、SDDM 等成功启动的案例。 上游 wiki 维护着显示管理器兼容性列表。 hyprland 包包含两个 桌面条目,所有 Hyprland AUR 包都会自动生成一个。
这两种方法都提供相同的结果,除了少数环境变量和服务。
自动登录
用户可以通过使用 显示管理器 或修改 Xinit#Autostart X at login 中描述的方法来实现自动登录。
hyprctl 和 IPC
hyprctl 是 Hyprland 自带的命令行工具,用于与显示服务器通信。它允许您向服务器发送命令(等同于配置文件中的命令,但语法略有不同)、设置关键字、发送查询并请求信息。请参阅 完整文档。
Hyprland 还公开了 2 个 UNIX 套接字,用于通过代码或命令行工具控制 Hyprland 和获取其信息。这些套接字会广播关于焦点变化(窗口、工作区、显示器)、窗口/工作区创建等的事件。
hyprctl 和 IPC 套接字都可以有效地用于脚本中,以控制 Hyprland 来完成复杂任务。
自启动
在启动应用程序时,使用正确的调度器类型很重要。不正确地使用 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 中设置 环境变量,其语法与 shell 使用的 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 Desktop Portal 实现。与其他 wlroots 基于的合成器兼容,但在 Hyprland 上运行时提供额外功能。可通过 xdg-desktop-portal-hyprland 包获取。
Hyprpolkitagent
Hyprpolkitagent 是一个 polkit 认证守护进程。可以通过 hyprpolkitagent 包进行安装。
Hyprsunset
Hyprsunset 是一个为系统提供蓝光过滤的小型实用程序。可以通过 hyprsunset 包进行安装。
Hyprsysteminfo
Hyprsysteminfo 是一个系统信息获取程序,类似于 neofetchAUR 或 fastfetch。可以通过 hyprsysteminfoAUR AUR 包进行安装。
技巧与提示
文件管理器
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 的外部空闲管理守护进程。最常见的设置是 hypridle 和 hyprlock。您可以使用如下绑定手动锁定屏幕
~/.config/hypr/hyprland.conf
... bind = SUPER, L, exec, hyprlock ...
自动屏幕锁定和挂起
创建以下文件
~/.config/hypr/hypridle.conf
general {
lock_cmd = pidof hyprlock || hyprlock
}
listener {
timeout = 300
on-timeout = loginctl lock-session
}
listener {
timeout = 600
on-timeout = systemctl suspend
}
然后运行它
~/.config/hypr/hyprland.conf
... exec-once = hypridle ...
在超时后使用 DPMS 关闭屏幕
Hyprland 内置了一个用于处理 DPMS 请求的调度器,但不建议将其用作直接的按键绑定,这样做会导致您无法重新开启屏幕,并且需要重新启动。
编辑上面的文件并更改为
~/.config/hypr/hypridle.conf
general {
lock_cmd = pidof hyprlock || hyprlock
}
listener {
timeout = 300
on-timeout = loginctl lock-session
}
listener {
timeout = 600
on-timeout = hyprctl dispatch dpms off
on-resume = hyprctl dispatch dpms on
}
listener {
timeout = 900
on-timeout = systemctl suspend
}
状态栏
Hyprland 需要一个兼容 Wayland 的外部应用程序来显示状态栏。以 waybar 为例,我们只需如下调用它
~/.config/hypr/hyprland.conf
... exec-once = waybar ...
工作区概览
waybar 内置了一个完全可定制的模块,原生支持 Hyprland 工作区切换。
有关详情,请参阅 waybar Wiki [2]。
Polkit 认证
Polkit 认证需要使用外部 认证代理。Hyprland 推荐使用 hyprpolkitagent,但任何其他代理也应该可以工作。
如下调用它
~/.config/hypr/hyprland.conf
... exec-once = systemctl --user start hyprpolkitagent ...
桌面壁纸
Hyprland 需要一个兼容 Wayland 的外部应用程序来管理桌面壁纸。以 hyprpaper 为例,我们只需如下调用它
~/.config/hypr/hyprland.conf
... exec-once = hyprpaper ...
此外,由于 hyprpaper 需要配置文件才能启动;将文件创建如下
~/.config/hypr/hyprpaper.conf
preload = /home/me/amongus.png wallpaper = monitor, /home/me/amongus.png
将 monitor 替换为您希望设置壁纸的显示器,您可以通过 hyprctl monitors 获取列表。
使用脚本随机化壁纸
创建以下脚本并确保其 可执行
~/.config/hypr/scripts/hyprpaper-random
#!/usr/bin/env bash WALLPAPER_DIR="$HOME/.config/hypr/wallpapers/" CURRENT_WALL=$(hyprctl hyprpaper listloaded) # Get a random wallpaper that is not the current one WALLPAPER=$(find "$WALLPAPER_DIR" -type f ! -name "$(basename "$CURRENT_WALL")" | shuf -n 1) # Apply the selected wallpaper hyprctl hyprpaper reload ,"$WALLPAPER"
接下来创建一个新的 目录 来存储壁纸,例如 ~/.config/hypr/wallpapers 应该可以正常工作,并用您想要的任何图片填充它。
最后,在按下 指定 的按键绑定时调用脚本
~/.config/hypr/hyprland.conf
... $mainMod = super bind = $mainMod, r, exec, ~/.config/hypr/scripts/hyprpaper-random ...
屏幕通知
通过使用外部通知守护进程,可以实现屏幕通知,例如亮度、音量更改等操作。这是一个非常复杂的主题,完全覆盖它超出了本页的范围。本节将重点介绍 mako,因此请继续 安装它。
有关更多说明,请参阅 桌面通知,以及 桌面通知#Standalone 以获取替代方案列表。
- 此处提供的所有脚本都是示例,很可能需要根据您的设置进行调整。
- 本节中的所有脚本都必须 可执行。
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 {
name = <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 ...
注意: 在 Hyprland v0.34(?) 之前,使用了以下旧语法
device:<device_name>:enabled
此旧格式已被移除。另外,早期配置文件未使用基于块的 device { name = <device_name> ... } 结构,而是使用了 device:<device_name> { ... } 结构。
单独的 dconf 配置文件
如果您不想影响其他基于 GTK 的 DE 的设置,您可以使用单独的 dconf 配置文件。例如
声明新的全局 dconf 配置文件
/etc/dconf/profile/hyprland
user-db:hyprland
~/.config/hypr/hyprland.conf
... env = DCONF_PROFILE, hyprland ...
现在您可以使用 gsettings,它不应该会影响其他桌面环境。
KDE Plasma 应用程序未遵循 Qt 主题
即使设置了 Qt 主题,某些 Plasma 应用程序可能也不会遵循。这可以通过安装 qt6ct-kdeAUR 并选择 KColorScheme,或在 kdeglobals 中添加此配置行来解决
~/.config/kdeglobals
[UiSettings] ColorScheme=NameOfTheProfile
故障排除
NVIDIA 上原生 (Wayland) Electron 应用闪烁
这是 NVIDIA 用户在 Hyprland 上普遍遇到的问题 [3],[4],这是因为 Hyprland 对显式同步的支持不足 [5]。推荐的临时修复方法是为有问题的应用程序使用 X11 (XWayland),并传递 --ozone-platform-hint=x11 参数,或者在 ~/.config/hypr/hyprland.conf 中设置 env = ELECTRON_OZONE_PLATFORM_HINT,x11 来强制所有 Electron 应用通过 XWayland 运行。
Jetbrains 应用焦点问题
Jetbrains 应用(Pycharm、Intellij)可能会出现奇怪的焦点问题,例如
- 无法将标签页从标签栏 [6] 拖到另一个分割视图或另一个标签堆叠中,因为焦点会被抢走,并且在将标签页拖过当前标签栏时就会被丢弃。
- 自动完成弹出窗口会抢占焦点,直到鼠标移动。
为了缓解这个问题,请将此添加到 Hyprland 的配置文件中
~/.config/hypr/hyprland.conf
windowrulev2 = noinitialfocus,xwayland:1