跳转到内容

本站近期可能因网络攻击出现服务故障,导致无法联网阅读。建议用户安装 arch-wiki-docs-zh-cnCNRepo 或者 arch-wiki-docs-zh-twCNRepo 离线文档包备用,或者使用经由 Cloudflare CDN 的替代版本aw.lilydjwg.me

来自 Arch Linux 中文维基

Hyprland 是一个独立的且使用 C++ 编写的平铺式 Wayland 合成器。 Hyprland 值得注意的功能包括动态平铺、选项卡窗口、整洁可读的 C++ 代码库,和提供窗口动画的自定义渲染器,窗口圆角,以及透明窗口上的 Dual Kawase Blur。一般用法和配置在 Hyprland Wiki 中有详细文档介绍。

当你遇到输入法问题时,请查看故障排除

安装

如果你使用包管理器,安装以下的其中一个:

如果要使用 CMake 编译安装:

首先将 Git 仓库克隆到本地:

git clone --recursive https://github.com/hyprwm/Hyprland

其次切换到 Git 仓库目录:

cd Hyprland

最后编译安装:

make all && sudo make install

#6608 起,Hyprland 使用 aquamarine 作为自己的渲染后端库。在此之前,它捆绑了它自己的 wlroots 版本,与 wlroots[损坏的链接: 被wlroots0.18替代]类似。

注意:
  • NVIDIA GPU 用户也应该在尝试启动Hyprland之前确保遵守上游的 NVIDIA 页面 Hyprland Wiki。如果不这么做,可能会导致很多错误,包括可能无法登录、窗口闪烁和 CPU 使用率较高。
  • Hyprland 不支持使用 NVIDIA GPU,很多用户成功了,但如果一些东西出现了错误,那你只能靠你自己来修复了。
  • 请确保安装了 Polkit 包,否则会导致 Hyprland 启动失败。(logind missing permissions
  • 对于 Vmware/VirtualBox 用户,可能需要开启 3D 加速才可以正常运行 Hyprland

}}

多显示器管理 GUI

nwg-display 是管理多显示器的 GUI 软件,支持 Hyprland. 它是 nwg-shell 的一部分,但并不依赖 nwg-shell,参阅 nwg-displays github 以获得更多信息。

配置

注意:Hyprland Wiki变量中详细解释了列出的大部分选项(以及更多选项)

配置是通过一个配置文件,hyprland.conf 完成的,尽管它支持将配置拆分为多个文件并将它们包含到hyprland.conf中。默认的配置文件在 /usr/share/hypr/hyprland.conf ,在第一次登录后,为~/.config/hypr/hyprland.conf

hyprland.conf 包括配置设备(键盘、鼠标、触控板、显示器)的指令,以及动画、装饰、布局等设置。你可以设置按键绑定、窗口规则以及在重新加载配置时执行命令(一次或者每次)

每次更新文件时,配置都会自动重新加载。你可以使用 hyprctl reload 来重载以获得相同的效果。对于某些设置(尤其是输入设置),你可能需要重启你的 Hyprland 会话。

设置也可以使用 hyprctl 动态更改设置,但是这些设置不会保存

移除最上方的警告

请在~/.config/hypr/hyprland.conf中移除或使用#注释以下内容:

~/.config/hypr/hyprland.conf
autogenerated = 1

键盘

按键映射

Hyprland默认使用 US Qwerty 键盘布局,你可以使用以下配置来配置它

~/.config/hypr/hyprland.conf
# German Colemark layout
input {
    ...
    kb_layout = de
    kb_variant = colemark
    ...
    }

查看 Hyprland Wiki 以查看所有可用选项

注意:Hyprland 将会覆盖 locale 定义,如果你不使用 US 布局的键盘则有必要更改按键映射
提示:关于启动时自动打开 NumLock 键,参见启动时打开数字锁定键#Hyprland

键入延迟和速率

虽然Xorg用户将习惯于在服务器级别定义此设置,在Wayland上,每个合成器都会自行处理:

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

键盘背光

参见背光一文。

你可以在 Hyprland 中使用键盘亮度控制。

在 Hyprland 中使用键盘背光控制是有可能的。安装 brightnessctl 然后添加一个与其有关的按键绑定(替换 keyboard_brightness_*with SUPER,FX or XF86KbdBrightness 取决于你的硬件是如何发出键盘背光的)

~/.config/hypr/hyprland.conf
# Keyboard backlight
bind = , xf86KbdBrightnessUp, exec, brightnessctl -d *::kbd_backlight set +33%
bind = , xf86KbdBrightnessDown, exec, brightnessctl -d *::kbd_backlight set 33%-

此外,还可以设置更改时弹出屏幕通知

媒体按键

在Hyprland上有可能通过使用 XF86Audio 键盘按键和一个外部像 pavucontrol 或者 pamixerplayerctl 的应用程序使用键盘媒体按键控制媒体(翻译可能不准确,请参照下面英语)

通过 XF86Audio 按键在Hyprland中使用键盘的媒体控制键和启动一个像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

当有更改时,也可以触发屏幕通知

鼠标

参见 Hyprland Wiki

为了应用鼠标设备的配置选项,请像这样添加一个新类别:

~/.config/hypr/hyprland.conf
device {
    name = 鼠标设备名称
    # 针对鼠标的选项 ...
}

通过检查 hyprctl devices 的输出,可以轻松获得设备名称。

鼠标加速度/灵敏度

您可以使用下面所示配置控制鼠标加速度/灵敏度:

~/.config/hypr/hyprland.conf
device {
    name = 鼠标设备名称
    sensitivity = -0.5
}

-0.5 替换为您希望的鼠标加速度/灵敏度。

触摸板手势

作为 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 桌面门户在一系列应用程序中启用屏幕录制。

Hyprland 还维护 xdg-desktop-portal-hyprland,一个支持屏幕共享(包括选区功能)和窗口共享,全局快捷键,并且有一个图形选择其的工具。关于使用该工具在 Hyprland wiki 中有进一步的文档介绍。

值得注意的是,xdg-desktop-portal-hyprland 不包括一个文件选择器,用户可以安装 xdg-desktop-portal-gtk

设置屏幕分辨率

Hyprland 将会尝试去自动检测你的屏幕分辨率。不过在某些情况下它将会失败并默认为故障保护,通常是在存在多个屏幕或你有混合笔记本电脑的情况下。如果屏幕下所有的东西都很大,那么你需要设置你默认的显示器和分辨率

首先使用 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
...

此处的@144指的是屏幕的刷新率,1920x1080指的是分辨率。请替换为你的屏幕所支持的刷新率和分辨率 使用如下来查看屏幕所支持的刷新率:

$ hyprctl monitors
Monitor eDP-1 (ID 0):
        1920x1080@144.003006 at 0x0
        description: Chimei Innolux Corporation 0x153C (eDP-1)
        ...
	availableModes: 1920x1080@60.00Hz ...

0x0是一个用于多屏幕设置和最终设置的位置偏移,1是屏幕缩放倍数

亮度

安装 brightnessctl 并添加以下内容:

~/.config/hypr/hyprland.conf
# Screen brightness
bind = , XF86MonBrightnessUp, exec, brightnessctl s +5%
bind = , XF86MonBrightnessDown, exec, brightnessctl s 5%-

此外,还可以设置更改时弹出通知

使用

启动Hyprland

通用 Wayland 会话管理器(uwsm)

Hyprland 推荐 使用通用 Wayland 会话管理器(uwsm)来启动会话。uwsm 通过 systemd 单元文件包装合成器并相应地配置应用程序和守护进程,这允许你使用 systemctl 来控制它。通过以下 ~/.profile 脚本在 tty 中同时启动 Hyprland 和 uwsm.

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 profile 中使用。
提示:在 shell profile 中填入如下内容来跳过合成器选择菜单并直接启动 Hyprland.
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 和其他的显示管理器中启动。hyprland 中包含一个显示管理器条目,且所有 Hyprland AUR 包将会自动生成一个条目。

两种方法都提供相同的结果,加上或减去一些环境变量和服务。

自动登录

用户可以通过一个显示管理器或着在登录时采用 Xinit#Autostart X at login 中描述的方法进行自动登录

hyprctl 和 IPC

hyprctl 是一个命令行实用程序,随Hyprland一起安装,用于与显示服务器通信。它允许你向服务器发送命令(相当于配置文件中的命令,但语法略有不同)、设置关键词、发送询问和请求信息。请查看完整文档

Hyprland 还公开了 2 UNIX 套接字,以便通过代码或命令行实用程序控制和获取有关 Hyprland 的信息。这些套接字会广播焦点变化(窗口、工作区、监视器)、窗口/工作区创建等事件。

hyprctl 和 IPC 接口都在脚本中有效使用,对于复杂任务控制 Hyprland。


Autostart

在启动应用程序时,选择正确类型的调度器是非常重要的。不正确地使用 `exec` 可以使应用程序启动多次而占用系统资源然后造成糟糕的状况。造成竞争系统资源的情况然后使你的系统崩溃。

注意:#配置中提到,Hyprland 会自动解析 hyprland.conf 文件每次的更改:不要对每个软件都使用 exec


在大多数情况下,你应该使用 exec-once 在启动时来运行应用程序和守护程序,使用这个命令启动的软件在 Hyprland 重新加载时将不会再次启动。仅当你绝对确定希望每次重新加载时再次运行该命令时,才使用 exec
提示: If you started Hyprland via Universal Wayland Session Manager (uwsm) and the application you want to run at startup provides a systemd unit then you can enable it to automatically start it when Hyprland is ready. Otherwise, you can pass that application to uwsm app as argument in order to be managed by uwsm. For example
~/.config/hypr/hyprland.conf
exec-once = uwsm app -- mycommand --arg1 --arg2

bind = SUPER, E, exec, uwsm app -- pcmanfm-qt.desktop

设置环境变量

通过env关键词在hyprland.conf中设置环境变量,它的语法不同于在Unix shell中使用env命令

这些差异在上游Wiki中被解释

Hypr 生态

警告:以下所提及的部分软件仍在开发,有 bug 都是在意料之中的。因此,完整的说明和示例会被略去,直到它足够稳定以成为稳定版。关于使用说明,参见上游 Wiki

Hyprland 开发团队正在构建一个专门用于 Hyprland 的软件生态,这些工具将包括调度器,允许使用 hyprctl 而不是依赖脚本来控制它们。

目前,软件生态包括以下软件:

Hyprpaper

Hyprpaper 是一个壁纸工具,你可以安装 hyprpaper 来使用它。

Hyprpicker

Hyprpicker 是一个用于在你的桌面中抓取一个颜色的工具,你可以安装 hyprpicker 来使用它。

Hypridle

Hypridle 是一个idle管理守护程序,你可以安装 hypridle 来使用它。

Hyprlock

Hyprlock 是一个屏幕锁定管理器,你可以安装 hyprlock 来使用它。

Hyprcursor

Hyprcursor 是一个处理屏幕光标的新格式,它在传统的方式上提升了很多,你可以安装 hyprcursor 来使用它。

Hyprcursor 主题

提示:如果你安装了 hyprcursor 并且没有安装一个主题,它将会使用你之前的光标设置

光标主题可以使用 AUR 安装,以下是例子:

将现有的光标主题移植到 Hyprcursor,你可以参照上游 GitHub 仓库

关于设置光标样式,你也可以查阅光标主题来设置。

hyprpolkitagent

hyprpolkitagent 是一个 polkit 身份验证守护进程。图形用户界面应用程序需要使用它来请求提升权限。安装 hyprpolkitagent 来使用它。

参见 Hyprland Wiki

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

也可以使用 rofi-wayland

~/.config/hypr/hyprland.conf
...
bind = SUPER, F, exec, rofi -show drun
...

Idle

Hyprland 需要一个外部的 Wayland 兼容的 idle 管理守护进程。最普遍安装的是 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 内置的 Window Rules V2 功能(含有 idleinhibit 规则),你也可以安装一个 idlehack-gitAUR 或者 sway-audio-idle-inhibit-gitAUR。前者是在 Firefox 或 Chromium 播放音频或视频时使用 D-Bus 来阻止 Swayidle 请求。后者会在任何应用程序播放音频时阻止 Swayidle 请求。

对于使用 org.freedesktop.ScreenSaver.inhibit 程序来暂停屏幕保护,你可以安装 hypridle-gitAUR在 Hyprland(或其他支持 idle-inhibit 协议的 Wayland 合成器)实现它。

For hypridle-gitAUR to function it is required to create a configuration. Example of a minimum config:

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

工作区总揽

waybar 内置了适于这个功能的完全可自定义模块,支持Hyprland工作区自然地切换。

查看 waybar Wiki[1] 了解详情。

Polkit 认证

Polkit 认证需要使用外部身份验证代理。hyprpolkitagent 是一个不错的选择。

使用以下代码来使用:

~/.config/hypr/hyprland.conf
...
exec-once = systemctl --user start hyprpolkitagent
...

桌面壁纸

在 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

# 该脚本将随机浏览一个目录中的文件,
# 每隔一段时间将其设置为壁纸。
#
# 注意:本脚本使用 bash(而非 POSIX shell)来设置 RANDOM 变量

if [[ $# -lt 1 ]] || [[ ! -d $1   ]]; then
	echo "Usage:
	$0 <dir containing images>"
	exit 1
fi

# 编辑以下内容以控制图像过渡
export SWWW_TRANSITION_FPS=144
export SWWW_TRANSITION_STEP=2
export SWWW_TRANSITION_TYPE=random

# 以秒为单位控制何时切换到下一幅图像
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 是一个轻量级的通知守护进程,您可以阅读 mako(5) 以获取详细信息。 其配置文件位于 ~/.config/mako/config,用于屏幕显示(OSD)的图标存储在 ~/.config/mako/icons/ 并且应该是 PNG 格式。

在本节的其余部分,脚本使用的所有图像都可以从此 GitHub 文件夹获取。

键盘(Keyboard) 背光通知

首先创建以下脚本:

~/.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
键盘(Keyboard)语言通知

要运行此脚本, 你需要一个命令行 JSON 处理器 gojqAUR.3

首先创建以下脚本:

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

电源控制(Power control)

Hyprland 需要一个与 Wayland 兼容的外部应用程序来进行电源控制。 以 nwg-barAUR 为例,我们只需按如下方式进行绑定:

~/.config/hypr/hyprland.conf
...
bind = SUPER, ESCAPE, exec, nwg-bar
...

剪贴板(Clipboard)

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

获取你的设备名称。

将这些代码行放入你的配置文件中(将替换为上面查询到的你的设备名称)以打开 / 关闭设备:

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

Note: Prior to Hyprland v0.34(?), the following legacy syntax was used: device:<device_name>:enabled This older format has been removed. Also, earlier configuration files did not use a block-based device { name = <device_name> ... } structure, but a device:<device_name> { ... } structure.

独立的 dconf 配置文件

您可能不想污染其他基于 GTK 的桌面环境的配置,您可以使用一个独立的 dconf 配置文件。例如:

声明新的全局 dconf 配置文件:

/etc/dconf/profile/hyprland
user-db:hyprland
~/.config/hypr/hyprland.conf
...
env = DCONF_PROFILE, hyprland
...

现在您可以使用 gsettings 而不影响其他桌面环境。

故障排除

Fcitx5 相关问题

提示:若还未能解决,请重启输入法!

无法输入

当你在任何时候输入中文时出现候选框不在输入框附近(如 QQ 等),而是漂移到 Waybar 的左上角,选择后也无法选词到输入框中,请在 Fcitx5 的配置页面中新建一个分组,选择键盘-英语(美国),然后再设置一个快捷键来轮回切换分组,切换后即可恢复正常

打开 Fcitx5 的配置页面你需要安装 fcitx5-configtool

切换英文时出现问题

当你在输入框中切换英文时,在 Waybar 左上角出现了输入法中文状态,且无法在输入框中输入英文,请重新启动 Fcitx5 以临时解决问题。

Wayland 原生的 Electron 程序在 NVIDIA 上闪烁

由于 Hyprland [2] 不支持显式同步, NVIDIA 用户在 Hyprland [3], [4]上普遍存在闪烁问题。 建议使用X11 (XWayland) 临时修复有问题的应用程序,方法是向它们传递--ozone-platform-hint=x11, 或在~/.config/hypr/hyprland.conf中设置 env = ELECTRON_OZONE_PLATFORM_HINT,x11 以强制所有 Electron 应用程序使用 XWayland 运行。

Jetbrains apps focus issues

Jetbrains apps (Pycharm, Intellij) can have strange focus problems such as:

  • Unable to drag tab from the tab bar [5] to either a split, or another tab stack without focus being stolen and the tab being dropped as soon as you drag it past the current tab bar.
  • Autocomplete popup window stealing focus until the mouse is moved.

Add this

~/.config/hypr/hyprland.conf
windowrulev2 = noinitialfocus,xwayland:1

参见