Hyprland

来自 ArchWiki

Hyprland 是一个独立的平铺 Wayland 合成器,使用 C++ 编写。Hyprland 的显著特点包括动态平铺、标签页窗口、干净且可读的 C++ 代码库,以及一个自定义渲染器,该渲染器在透明窗口上提供窗口动画、圆角和 Dual-Kawase 模糊。一般用法和配置在Hyprland wiki 上有详细文档。

安装

安装以下软件包之一

截至 #6608,Hyprland 使用 aquamarine 作为其自身的渲染后端库。在此之前,它捆绑了其自身版本的 wlroots,该版本密切跟随 wlroots-gitAUR

注意
  • NVIDIA GPU 用户还应确保在尝试启动 Hyprland 之前,遵循 上游 Wiki 上的 NVIDIA 专用页面。不这样做很可能导致许多错误,包括无法登录、窗口闪烁和高 CPU 使用率。
  • Hyprland 不支持将 NVIDIA GPU 与之一起使用。许多用户已经成功,但如果出现问题,您需要自行解决。
  • 另请确保安装 Polkit 软件包,因为缺少它会导致 Hyprland 启动失败。(logind missing permissions
  • 对于 Vmware/VirtualBox 用户,可能需要启用 3D 加速才能正常运行 Hyprland。
提示: NVIDIA GPU 在 Wayland 客户端上的支持几乎已接近完成。Wayland 最近合并了 Explicit Sync 支持,这是最后一个问题,一旦 NVIDIA 555 版本驱动稳定,NVIDIA GPU 支持应该可以工作,并有望在 Hyprland 上获得官方支持。

配置

注意: 列出的大多数选项(以及更多)在上游 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 将覆盖区域设置定义,因此如果您不使用 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%-

也可以在进行更改时触发屏幕通知

媒体键

通过使用 XF86Audio 键符和像 pavucontrolpamixerplayerctl 这样的外部应用程序,可以在 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 调用的文件中使用它。
提示: 如果您想绕过合成器选择菜单并直接启动 Hyprland,请在您的 shell 配置文件中使用此代码。
if uwsm check may-start; then
  exec uwsm start hyprland.desktop
fi

或者通过使用桌面管理器中的 hyprland-uwsm.desktop 条目或在您的桌面管理器中选择 hyprland (uwsm-managed) 来启动。

警告: 如果您选择通过 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 中,以避免与其他合成器冲突。
阅读 Hyprland wiki 中的相关页面,了解有关使用 uwsm 进行配置的更多信息。

终端

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

$ Hyprland

显示管理器

虽然官方不支持从显示管理器启动,但用户报告称从 GDMSDDM 和其他管理器启动成功。上游 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 都会自动解析 hyprland.conf:不要对所有内容都使用 exec。在大多数情况下,您应该使用 exec-once 在启动时启动应用程序和守护进程,因为此命令不会在重新加载时再次运行,只有当您绝对确定要在每次重新加载时再次运行该命令时才使用 exec
提示: 如果您通过通用 Wayland 会话管理器 (uwsm) 启动了 Hyprland,并且您要在启动时运行的应用程序提供了 systemd 单元,那么您可以启用它以在 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 中设置环境变量,这与 shells 使用的 env UNIX 命令的语法不同。

差异在上游 Wiki 中进行了解释。

Hypr 生态系统

警告: 以下部分中概述的某些工具仍在开发中,因此预计会出现错误。因此,完整的说明和示例将被省略,直到它们足够成熟以稳定为止。有关其使用的详细说明在上游 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 桌面门户。与其他基于 wlroots 的合成器兼容,但在 Hyprland 上使用时提供额外的功能。可通过 xdg-desktop-portal-hyprland 软件包获得。

Hyprpolkitagent

Hyprpolkitagent 是一个 polkit 身份验证守护进程。可以使用 hyprpolkitagent 软件包安装。

hyprsunset

Hyprsunset 是一个小实用程序,为您的系统提供蓝光过滤器。可以使用 hyprsunset 软件包安装。

技巧和提示

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

文件管理器

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

~/.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-gitAURsway-audio-idle-inhibit-gitAUR 中的一个。前者使用 D-Bus 来防止在 FirefoxChromium 播放音频/视频时发送 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

本文或本节需要改进语言、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:<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 运行。

另请参阅