跳至內容

本站近期可能因网络攻击出现服务故障,导致无法联网阅读。建议用户安装 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

參見