跳转到内容

Hyprland

来自 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 版本,与wlroot-gitAUR类似。

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

多显示器管理

[编辑 | 编辑源代码]

nwg-displays 是管理多显示器的 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 gesturesgestures 
    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
monitorv2 {
    output = eDP-1
    mode = 1920x1080@144
    position = 0x0
    scale = 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)

[编辑 | 编辑源代码]

通用Wayland会话管理器通过systemd 单元文件b合成器和与其对应的配置好的软件和守护进程来使你通过systemctl控制它们。

当你选择 hyprland (uwsm-managed)时,Display manager 会启动一个带有uwsm的Hyprland。

命令行解释器#登录 Shell使用以下脚本,你也可以在 getty 通过 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 profile 中使用。
  • Hyprland 不再推荐启动一个带有uswm的会话,因为这被视为实验性的并且是为明白其含义的高级用户和怪人使用的。
警告: 如果您选择通过“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 配置的更多信息。

终端

[编辑 | 编辑源代码]

使用如下指令在 Getty 中启动 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
提示:如果你通过通用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中设置环境变量,它的语法不同于在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 仓库

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

XDG-Desktop-Portal-Hyprland

[编辑 | 编辑源代码]

Hyprland 自己的实现的XDG Desktop Portal,与其他基于wlroots的合成器兼容,但是在使用Hyprland时额外提供一些功能。可安装xdg-desktop-portal-hyprland

Hyprpolkitagent

[编辑 | 编辑源代码]

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

参见 Hyprland Wiki

Hyprsunset

[编辑 | 编辑源代码]

Hyprsunset 是提供蓝光滤镜的实用工具,通过 hyprsunset 安装。

Hyprsysteminfo

[编辑 | 编辑源代码]

Hyprsysteminfo 是一个获取系统信息的软件,与neofetchAURfastfetch类似。你可以安装hyprsysteminfoAUR

技巧提示

[编辑 | 编辑源代码]
提示:
  • 对于以下所有部分,通常有不止一种方法可以达到类似的效果,这里提供的只是一些基本示例。

文件管理器

[编辑 | 编辑源代码]

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

Hyprland 需要一个外部的 Wayland 兼容的 idle 管理守护进程。最普遍安装的是 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[1] 了解详情。

Polkit 认证

[编辑 | 编辑源代码]

Polkit 认证需要使用外部身份验证代理。Hyprland 推荐使用hyprpolkitagent ,你也可以选择其他的Polkit

调用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 为例,首先需要安装 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="$(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
# Screen brightness
bind = , XF86MonBrightnessUp, exec, ~/.config/hypr/scripts/backlight --inc 
bind = , XF86MonBrightnessDown, exec, ~/.config/hypr/scripts/backlight --dec
键盘(Keyboard)语言通知
[编辑 | 编辑源代码]

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


首先创建以下脚本:

~/.config/hypr/scripts/lang
 gojq -r '.keyboards[] 

然后添加以下内容(或编辑任何现有的绑定):

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

在Hyprland v0.34(?)之前,如下的遗留语法被使用:

device:<device_name>:enabled

这个旧的格式已经被删除了。另外,更早的配置文件也无法使用一个代码块的结构:

device { name = <device_name> ... } ,但可以使用device:<device_name> { ... } 结构。

独立的 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 软件聚焦问题

[编辑 | 编辑源代码]

JetBrains 软件(PyCharm,IntelliJ)会出现一个奇怪的聚焦问题,如:

  • 无法将标签页从标签栏[5]拖动来实现分离,或者另一个标签页堆叠时无法更改焦点,亦或者一个标签页只要被你拖动过当前标签栏就会停止拖动状态。
  • 自动弹出的窗口直到鼠标移动时才被聚焦通过在Hyprland配置文件中写入以下行以缓解该问题:
~/.config/hypr/hyprland.conf
windowrulev2 = noinitialfocus,xwayland:1

参见

[编辑 | 编辑源代码]