跳转至内容

Hyprland

来自 ArchWiki

Hyprland 是一个用 C++ 编写的独立平铺 Wayland 合成器。Hyprland 的特色功能包括动态平铺、标签式窗口、简洁易读的 C++ 代码库以及一个自定义渲染器,该渲染器可提供窗口动画、圆角和透明窗口上的双 Kawase 模糊。通用用法和配置可在 Hyprland wiki 上获得详尽文档。

安装

安装 hyprland 包。

截至 #6608,Hyprland 使用 aquamarine 作为其自己的渲染后端库。在此之前,它自带了 wlroots 的一个版本,该版本紧随 wlroots-gitAUR

  • NVIDIA GPU 用户在尝试启动 Hyprland 之前,还应确保遵循 上游 Wiki 上的 NVIDIA 特定页面。否则很可能会遇到许多问题,包括无法登录、窗口闪烁和高 CPU 使用率。
  • 使用 NVIDIA GPU 运行 Hyprland 是不受支持的。许多用户已经成功使用,但如果出现问题,您将自负责任。
  • 请确保安装 Polkit 包,或 启动启用 seatd.service。否则将导致 Hyprland 无法启动。
  • 对于 Vmware/VirtualBox 用户,为了正常运行 Hyprland,可能需要启用 3D 加速。

配置

注意 列出的选项(及更多)大部分都在 上游 Wiki 变量页面上有详细解释。

配置通过一个配置文件完成,即 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

注意 Hyprland 将覆盖 locale 定义,因此如果您不使用 US 布局的键盘,则需要更改键盘映射。

按键重复延迟和速率

Xorg 用户可能习惯于 在服务器级别 定义此设置,而在 Wayland 上,每个合成器独立处理它。

~/.config/hypr/hyprland.conf
# Repeat rate and delay
input {
    ...
    repeat_rate = 25
    repeat_delay = 600
    ...
    }

键盘背光

在 Hyprland 中可以使用键盘亮度控制。 安装 brightnessctl,然后添加相关绑定(将 keyboard_brightness_* 替换为 SUPER, FXXF86KbdBrightness,具体取决于您的硬件如何暴露 键盘背光)。

~/.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 键符号以及像 pavucontrolpamixerplayerctl 这样的外部应用程序。

~/.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 的文件中使用它。
  • Hyprland 不再 推荐 使用 uwsm 启动会话,因为它被认为是实验性的,并且仅适用于了解其含义和 怪癖 的高级用户。
提示 如果您想绕过合成器选择菜单直接启动 Hyprland,请在您的 登录 shell 中使用此代码。
if uwsm check may-start; then
  exec uwsm start hyprland.desktop
fi
警告 如果您选择通过 uwsm 启动 Hyprland,则应相应地调整您的配置。特别是
  • 您必须避免使用 exit 分发器或直接终止 Hyprland 进程,因为这会干扰正常的关机过程。而是使用 uwsm stoploginctl 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 中,以避免与其他合成器冲突。
有关 uwsm 配置的其他信息,请阅读 Hyprland wiki 上的相关页面

Terminal

您可以使用以下命令从 getty 启动 Hyprland

$ Hyprland

显示管理器

虽然官方不支持从 显示管理器 启动,但用户报告了从 GDMSDDM 等成功启动的案例。 上游 wiki 维护着显示管理器兼容性列表。 hyprland 包包含两个 桌面条目,所有 Hyprland AUR 包都会自动生成一个。

这两种方法都提供相同的结果,除了少数环境变量和服务。

自动登录

用户可以通过使用 显示管理器 或修改 Xinit#Autostart X at login 中描述的方法来实现自动登录。

hyprctl 和 IPC

hyprctl 是 Hyprland 自带的命令行工具,用于与显示服务器通信。它允许您向服务器发送命令(等同于配置文件中的命令,但语法略有不同)、设置关键字、发送查询并请求信息。请参阅 完整文档

Hyprland 还公开了 2 个 UNIX 套接字,用于通过代码或命令行工具控制 Hyprland 和获取其信息。这些套接字会广播关于焦点变化(窗口、工作区、显示器)、窗口/工作区创建等的事件。

hyprctl 和 IPC 套接字都可以有效地用于脚本中,以控制 Hyprland 来完成复杂任务。

自启动

在启动应用程序时,使用正确的调度器类型很重要。不正确地使用 exec 可能导致应用程序被多次启动,占用系统资源,在最坏的情况下,会导致竞争条件,可能导致系统崩溃。

注意#Configuration 中所述,Hyprland 会在每次保存文件更改时自动解析 hyprland.conf:不要对所有内容都使用 exec。在大多数情况下,您应该使用 exec-once 在启动时启动应用程序和守护进程,因为此命令在重新加载时不会再次运行,只有当您绝对确定希望命令在每次重载时都再次运行时,才使用 exec
提示 如果您是通过 Universal Wayland Session Manager (uwsm) 启动 Hyprland 的,并且您想在启动时运行的应用程序提供了 systemd unit,则可以在 Hyprland 准备好时 启用它以自动启动。否则,您可以将该应用程序作为参数传递给 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 生态系统

警告 下一节中概述的一些工具仍处于开发阶段。因此,可能会出现 bug。为此,将在它们成熟稳定之前省略完整的说明和示例。有关其使用方法的详细说明可在 上游 Wiki 上找到。

Hyprland 开发团队正在构建一个应用程序生态系统,该系统专门为 Hyprland 定制,这些工具将包括调度器,允许它们通过 hyprctl 控制,而不是依赖脚本。

目前生态系统包括

Hyprpaper

Hyprpaper 是一个壁纸实用程序;可以通过 hyprpaper 包进行安装。

Hyprpicker

Hyprpicker 是一个从桌面上抓取颜色的工具;可以通过 hyprpicker 包进行安装。

Hypridle

Hypridle 是一个空闲管理守护进程;可以通过 hypridle 包进行安装。

Hyprlock

Hyprlock 是一个屏幕锁定管理器;可以通过 hyprlock 包进行安装。

Hyprcursor

Hyprcursor 是一种处理屏幕光标的新格式,它在传统方法上提供了许多改进;可以通过 hyprcursor 包进行安装,

Hyprcursor 主题

提示 如果您安装了 hyprcursor 但没有同时安装主题,它将回退到您的旧版光标设置。

可以从 AUR 安装光标主题,例如

有关将现有主题移植到 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 是一个系统信息获取程序,类似于 neofetchAURfastfetch。可以通过 hyprsysteminfoAUR AUR 包进行安装。

技巧与提示

  • 对于下面所有部分,通常有不止一种方法可以实现类似的结果,这里提供的所有内容都是基本示例。
  • 有关全面的替代方案列表,请参阅 应用程序列表,Hyprland 特定的列表可在 上游 Wiki 上找到。

文件管理器

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 的外部空闲管理守护进程。最常见的设置是 hypridlehyprlock。您可以使用如下绑定手动锁定屏幕

~/.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
}
提示 您可以通过编辑数值(以秒为单位)来调整超时时间。300 表示 5 分钟,600 表示 10 分钟,依此类推。

然后运行它

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

本文或本节需要在语言、wiki 语法或风格方面进行改进。请参阅 Help:Style 获取参考。

原因:本节内容超出了本页范围,可能应单独成页。(在 Talk:Hyprland 中讨论)

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

参见