Hyprland 是一個獨立的且使用C++編寫的平鋪式 Wayland合成器。 Hyprland 值得注意的功能包括動態平鋪、選項卡窗口、整潔可讀的C++代碼庫,和提供窗口動畫的自定義渲染器,窗口圓角,以及透明窗口上的Dual Kawase Blur。一般用法和配置在 Hyprland Wiki 中有詳細文檔介紹
安裝
如果你使用包管理器,安裝以下的其中一個
- hyprland包 - 最新上游版本
- hyprland-gitAUR - 主分支上的最新提交
如果要使用CMake編譯安裝
首先將Git倉庫克隆到本地
git clone --recursive https://github.com/hyprwm/Hyprland
其次切換到Git倉庫目錄
cd Hyprland
最後編譯安裝
make all && sudo make install
自#6608起,Hyprland 使用aquamarine
作為自己的渲染後端庫。在此之前,它捆綁了它自己的wlroots版本,與wlroots-gitAUR接近
- NVIDIA GPU用戶也應該在嘗試啟動Hyprland之前確保遵守上游的NVIDIA頁面Hyprland Wiki。如果不這麼做,可能會導致很多錯誤,包括可能無法登錄、窗口閃爍和CPU使用率較高
- Hyprland不支持使用NVIDIA GPU,很多用戶成功了,但如果一些東西出現了錯誤,那你只能靠你自己來修復了
- Also make sure to install the Polkit package, as the lack thereof will cause Hyprland to fail to start. (
logind missing permissions
)
配置
配置是通過一個配置文件,hyprland.conf
完成的,儘管它支持將配置拆分為多個文件並將它們包含到hyprland.conf
中。默認的配置文件在 /usr/share/hyprland/hyprland.conf
,在第一次登錄後,為~/.config/hypr/hyprland.conf
。
hyprland.conf
包括配置設備(鍵盤、滑鼠、觸控板、顯示器)的指令,以及動畫、裝飾、布局等設置。你可以設置按鍵綁定、窗口規則以及在重新加載配置時執行命令(一次或者每次)
每次更新文件時,配置都會自動重新加載。你可以使用 hyprctl reload
來重載以獲得相同的效果。對於某些設置(尤其是輸入設置),你可能需要重啟你的Hyprland回話。
設置也可以使用 hyprctl 動態更改設置,但是這些設置不會保存
鍵盤
按鍵映射
Hyprland默認使用 US Qwerty
鍵盤布局,你可以使用以下配置來配置它
~/.config/hypr/hyprland.conf
# German Colemark layout input { ... kb_layout = de kb_variant = colemark ... }
查看 Hyprland Wiki 以查看所有可用選項
US
布局的鍵盤則有必要更改按鍵映射
鍵入延遲和速率
雖然Xorg用戶將習慣於在伺服器級別定義此設置,在Wayland上,每個合成器都會自行處理:
~/.config/hypr/hyprland.conf
# Repeat rate and delay input { ... repeat_rate = 25 repeat_delay = 600 ... }
鍵盤背光
你可以在Hyprland中使用鍵盤亮度控制。
Using keyboard brightness controls in Hyprland is possible。安裝 brightnessctl包 then add the related binds (replace keyboard_brightness_*
with SUPER,FX
or XF86KbdBrightness
depending on how your hardware exposes the 鍵盤背光):
~/.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包 或者 pamixer包 和 playerctl 的應用程式使用鍵盤媒體按鍵控制媒體(翻譯可能不準確,請參照下面英語)
Using keyboard media controls in Hyprland is possible by making use of XF86Audio
keysyms and an external application like pavucontrol包 or pamixer包 and playerctl.
~/.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 中有進一步的文檔介紹
It is worth noting that xdg-desktop-portal-hyprland does not include a file picker, for which users can additionally install 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 ...
0x0
是一個用於多屏幕設置和最終設置的位置偏移,1
是屏幕縮放倍數
亮度
安裝 brightnessctl包 並添加以下內容:
~/.config/hypr/hyprland.conf
# Screen brightness bind = , XF86MonBrightnessUp, exec, brightnessctl s +5% bind = , XF86MonBrightnessDown, exec, brightnessctl s 5%-
此外,還可以設置更改時彈出通知。
使用
啟動
目前推薦從TTY啟動Hyprland
$ Hyprland
雖然從 顯示管理器 中啟動不是官方支持得,但是用戶們報告成功在 GDM 、 SDDM 和其他的顯示管理器中成功啟動。hyprland包中包含一個顯示管理器條目,且所有Hyprland AUR 包將會自動生成一個條目。
兩種方法都提供相同的結果,加上或減去一些環境變量和服務。
自動登錄
用戶可以通過一個 顯示管理器 或著在登錄時採用 Xinit#Autostart X at login 中描述的方法進行自動登錄
hyprctl 和 IPC
hyprctl 是一個命令行實用程序,隨Hyprland一起安裝,用於與顯示伺服器通信。它允許你向伺服器發送命令(相當於配置文件中的命令,但語法略有不同)、設置關鍵詞、發送詢問和請求信息。請查看 完整文檔
Hyprland同樣也受 2 UNIX Sockets的控制並且你可以通過代碼或者命令行工具獲得Hyprland的更多信息。這些接口在焦點更改(窗口,工作空間,顯示器),像創建新的窗口/工作空間和其他的時廣播信息
(請結合下面的英文語句閱讀,由於我翻譯水平不足,非常抱歉!)
Hyprland also exposes 2 UNIX Sockets for controlling and getting information about Hyprland via code or command-line utilities. These sockets broadcast events on focus change (windows, workspaces, monitors), creation of windows/workspace, and so on.
hyprctl 和 IPC 接口都在腳本中有效使用,對於複雜任務控制Hyprland
exec 與 exec-once
在啟動應用程式是,選擇正確類型的調度器是非常重要的。不正確地使用`exec`可以使應用程式啟動多次而占用系統資源然後造成糟糕的狀況。造成競爭系統資源的情況然後使你的系統崩潰。
hyprland.conf
文件每次的更改:不要對每個軟體都使用exec
exec-once
在啟動時來運行應用程式和守護程序,使用這個命令啟動的軟體在Hyprland重新加載時將不會再次啟動。僅當你絕對確定希望每次重新加載時再次運行該命令時,才使用exec
。設置環境變量
通過env關鍵詞在hyprland.conf
中設置環境變量,它的語法不同於在Unix shell中使用env命令
這些差異在 上游Wiki中被解釋
Hypr生態
Hyprland 開發團隊正在構建一個專門用於Hyprland的軟體生態,這些工具將包括調度器,允許使用hyprctl而不是依賴腳本來控制它們。
目前,軟體生態包括以下軟體:
Hyprpaper
Hyprpaper 是一個壁紙工具,你可以安裝hyprpaper包來使用它
Hyprpicker
Hyprpicker 是一個用於在你的桌面中抓取一個顏色的工具,你可以安裝hyprpickerAUR來使用它
Hypridle
Hypridle 是一個idle管理守護程序,你可以安裝hypridle包來使用它
Hyprlock
Hyprlock 是一個屏幕鎖定管理器,你可以安裝hyprlock包來使用它
Hyprcursor
Hyprcursor 是一個處理屏幕光標的新格式,它在傳統的方式上提升了很多,你可以安裝hyprcursor包來使用它
Hyprcursor 主題
光標主題可以使用AUR安裝,以下是例子:
將現有的光標主題移植到Hyprcursor,你可以參照上游GitHub倉庫
技巧提示
文件管理器
在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 ...
Idle
Hyprland 需要一個外部的Wayland兼容的idle管理守護進程。最普遍安裝的是swayidle包和swaylock包。你可以使用如下的快捷鍵來手動鎖定屏幕
~/.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' &
- 該腳本必須是可執行的。
然後調用它:
~/.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
The above setup will result in your monitor powering off while you are doing things like playing a game, watching a video or listening to music where you might not touch the system for longer than the timeout period.
To fix this you can either use Hyprlands built in Window Rules V2 function which has a idleinhibit
rule or you can install one of either idlehack-gitAUR or sway-audio-idle-inhibit-gitAUR. The former uses D-Bus to prevent Swayidle requests whenever Firefox or Chromium are playing audio/video. The latter prevents Swayidle requests whenever any application is playing audio.
For programs that use org.freedesktop.ScreenSaver.inhibit
to pause the screensaver, you can install wscreensaver-bridge-gitAUR[損壞的連結:包未找到] to implement it for Hyprland (or any Wayland compositor that support the idle-inhibit
protocol).
狀態欄
在Hyprland環境下,如果需要狀態欄,則需要一個兼容Wayland的外部應用程式。以 waybar包軟體包為例,操作如下:
~/.config/hypr/hyprland.conf
... exec-once = waybar -c ~/.config/waybar/waybar.conf ...
Workspace overview
waybar包 has a built in, fully customisable module that supports Hyprland workspace switching natively.
See the waybar Wiki [1] for details.
Polkit authentication
Polkit authentication requires the use of an external authentication agent. Hyprland recommends using polkit-kde-agent包 but any should work.
Call it as follows:
~/.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 ...
Using a script to change wallpaper every X minutes
Create the following script and make sure its executable:
~/.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
Next create a new folder to store background images, something like ~/.config/hypr/backgrounds
should work fine, and populate it with any images you want.
Finally call the script:
~/.config/hypr/hyprland.conf
... exec-once = swww init exec-once = ~/.config/hypr/scripts/swww-random ~/.config/hypr/background ...
屏幕通知
屏幕上對亮度和音量調整等操作顯示通知的功能可以藉助外部的通知服務程序來實現。然而,深入探討這一主題超出了本頁面的說明範圍。這裡我們將會聚焦於安裝 mako包 的操作,現在請繼續進行 安裝。
See Desktop notifications for further instructions and Desktop notifications#Standalone for a list of alternatives.
- All scripts in this section must be executable.
Mako
Mako is a lightweight notification daemon, you can read mako(5) for details. Its configuration file is ~/.config/mako/config
, icons used for OSD are stored at ~/.config/mako/icons/
and should be in PNG format.
For the rest of this section all the images used by the scripts are available from this GitHub folder.
Keyboard backlight notifications
First create the following script:
~/.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
Then add the following or edit any existing one:
~/.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
Media key notifications
First create the following script:
~/.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
Then add the following (or edit any existing binds):
~/.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
Screen backlight notifications
First create the following script:
~/.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
Then add the following (or edit any existing binds):
~/.config/hypr/hyprland.conf
# Screen brightness bind = , XF86MonBrightnessUp, exec, ~/.config/hypr/scripts/backlight --inc bind = , XF86MonBrightnessDown, exec, ~/.config/hypr/scripts/backlight --dec
Keyboard language notifications
To run this script, you need a command-line JSON processor gojqAUR.
First create the following script:
~/.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)"
Then add the following (or edit any existing binds):
~/.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 requires a wayland-compatible external application for power control. Using nwg-barAUR as an example, we simply need to bind it as follows:
~/.config/hypr/hyprland.conf
... bind = SUPER, ESCAPE, exec, nwg-bar ...
Clipboard
Wayland clipboard behaviour deletes data when closing the application we copied it from. Other desktop environments work around this by using dedicated clipboard managers and on Hyprland there are multiple compatible choices. See the upstream Wiki for more information.
This section will cover cliphist包 as it supports copying images as well as text, start by adding the following:
~/.config/hypr/hyprland.conf
... exec-once = wl-paste --type text --watch cliphist store exec-once = wl-paste --type image --watch cliphist store ...
Then create a bind to call the history in your chosen application launcher:
~/.config/hypr/hyprland.conf
... bind = SUPER, V, exec, cliphist list | wofi --dmenu | cliphist decode | wl-copy ...
Now pressing Super+v
will open up a wofi
window with a clipboard history list.
Enable/disable devices
To enable/disable devices (e.g. touchpad), first use
$ hyprctl devices
to get the name of your device.
Put these lines of code into your configuration file (replace <device_name> with the name of your device queried above) to turn the device on/off:
~/.config/hypr/hyprland.conf
device:<device_name> { enabled = {true/false} }
To dynamically switch the device on/off use hyprctl:
$ hyprctl keyword "device:<device_name>:enabled" {true|false}
You can also create a keybinding, e.g.:
~/.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 ...
Troubleshooting
xdg-desktop-portal-hyprland is using a lot of CPU
This is a known bug [2] that should be resolved in the latest Git build. You can work around it by calling the nuclear script from the Hyprland wiki, as outlined usage here[失效連結 2024-07-30 ⓘ], in your hyprland.conf
file.
Native (wayland) electron apps flickering on NVIDIA
It is a widespread issue among NVIDIA users on Hyprland [3], [4] because of lack of support for explicit sync in Hyprland [5]. Recommended temporary fix is using X11 (XWayland) with the problematic apps by passing them --ozone-platform-hint=x11
, or setting env = ELECTRON_OZONE_PLATFORM_HINT,x11
in ~/.config/hypr/hyprland.conf
to force all electron apps to run using XWayland.