快轉到主要內容

Hyprland設定教學,漂亮又不佔資源的Linux Wayland視窗管理器

分類   Linux系統 Linux使用技巧
標籤   Wayland Hyprland
🗓️ 民國113年 甲辰年
✍ 切換正體/簡體字
目錄

如果你想要一款漂亮的、面向未來的視窗管理器,Ivon推薦你一定要試試Hyprland!

Hyprland是使用wlroots函式庫寫成的視窗管理器兼Wayland合成器,由Vaxry(vaxerski)開發,2022年5月推出正式版。2024年6月,Hyprland成為獨立的合成器,不再基於wlroots開發。

它跟Sway一樣,都是為純Wayland的Linux環境準備的,替代過去以X為主的視窗管理器。

相較於Sway意圖模仿i3wm,Hyprland作者有自己更多的想法。Ivon很滿意的部分是,Hyprland能輕鬆自定義外觀和按鍵設定,且預設的樣子就不錯看了,內建圓角、模糊、透明效果可以調,不用再裝其他程式。

Hyprland支援觸控板手勢、Nvidia閉源驅動、bspwm或i3的視窗排列方式,功能多樣。

Hyprland甚至有內建看板娘Hypr-chan呢!可惜後來移除了,得自己下載桌布。

即使擁有華麗特效,開機RAM佔用才500MB出頭而已,讓你高效率操作電腦的同時,又不佔用太多系統資源。

雖然如此,Hyprland仍不是開箱即用的「桌面」,你需要花點時間配置。它畢竟是視窗管理器,需要搭配其他程式才會好用。設定時勤讀官方文件、配置設定檔、手動寫啟動服務是免不了的。

這篇教學文章Ivon盡量把常用的功能都包進去,使讀者可以手動配置出一個大致能用的Hyprland桌面,再融入我的一點個人化配置。

環境
#

  • 裝置:MSI Modern 15 A10RBS
  • 系統:Arch Linux
  • 核心版本:6.6.4
  • CPU:Intel i5-10210u
  • GPU:Intel UHD 620
  • GPU2:Nvidia MX350

Arch Linux系統安裝方法此處不贅述,你可以用 archinstall安裝一個純文字最小系統再裝Hyprland;或是從現有桌面環境設定Hyprland,再沿用其顯示管理器(例如GDM、SDDM)來登入Hyprland。

Ivon的主力GPU用Intel內顯,Nvidia安裝閉源驅動,再透過PRIME存取。

1. 安裝Hyprland
#

現階段作者會一直加新功能,所以Linux最好用滾動發行版,例如Arch Linux、openSUSE Tumbleweed,以方便取得最新版Hyprland套件。

因為如果發行版收的套件版本太舊,你可能就無法參考官方文件調整設定檔了!

Arch Linux不用擔心版本問題,直接從官方套件庫裝Hyprland。

sudo pacman -S hyprland

1.1. Hyprland配套程式
#

建議安裝這些程式搭配Hyprland使用,使其成為完整的桌面環境。有些套件是AUR的,嫌麻煩直接用yay指令裝就行了,它會自動辨別。

yay -S kitty waybar otf-font-awesome network-manager-applet brightnessctl pw-volume hyprshot power-profiles-daemon wofi hyprpaper swayidle swaylock wlogout dunst cliphist pipewire pipewire-pulse wireplumber pavucontrol xorg xorg-xwayland xdg-desktop-portal-hyprland xdg-desktop-portal-gtk polkit-kde-agent qt5-wayland qt6-wayland qt5ct qt6ct nwg-look udiskie greetd greetd-tuigreet chezmoi fcitx5-im fcitx5-chewing fcitx5-qt fcitx5-gtk fcitx5-chinese-addons

這些套件功能如下:

  • kitty Hyprland預設終端機。我倒覺得終端機簡單夠用就好,個人偏好gnome-console
  • waybar, otf-font-awesome 狀態欄與Emoji字體
  • network-manager-applet 從狀態欄開關網路
  • brightnessctl 亮度控制
  • pw-volume 音量控制
  • hyprshot 截圖工具
  • power-profiles-daemon 電源模式控制
  • wofi 應用程式選單
  • hyprpaper 桌布程式
  • swayidle , swaylock, wlogout 暫停模式,螢幕鎖定,登出選單
  • dunst 桌面通知守護行程
  • cliphist 剪貼簿
  • pipewire, pipewire-pulse, wireplumber, pavucontrol 音訊系統
  • xorg, xorg-xwayland X視窗系統,不是所有程式都支援Wayland。
  • xdg-desktop-portal-hyprland, xdg-desktop-portal-gtk 負責檔案選擇器、螢幕共享等功能
  • polkit-kde-agent 密碼驗證對話框
  • qt5-wayland ,qt6-wayland 讓QT程式支援Wayland
  • udiskie 自動掛載隨身碟
  • qt5ct, qt6ct 設定QT程式主題
  • nwg-look:設定GTK程式主題
  • greetd, greetd-tuigreet 開機負責登入桌面的顯示管理器
  • chezmoi 備份設定檔(dotfile)的好工具
  • fcitx5 中文輸入法

1.2. 命令行狂人適用的程式
#

這裡是極簡應用程式,命令行狂人適用。我個人不太會用這些,因為我覺得不直觀…看圖的話我習慣用Gwenview,檔案管理器則是Dolphin、錄影用OBS等。

  • ranger 檔案管理器
  • mpd 搭配Waybar的音樂播放器
  • mpv 影片/音樂播放器
  • ytfzf 純文字YouTube播放器
  • vim 文字編輯器
  • feh 圖片檢視器
  • mupdf 文件閱讀器
  • wl-recorder 螢幕錄影
  • qutebrowser 極簡QtWebEngine瀏覽器,用類似vim快捷鍵的方式操作

2. 撰寫Hyprland設定檔
#

想知道全部可用選項,請看Hyprland官方的說明文件,詳細明瞭: Configuring Hyprland - Hyprland Wiki

這裡講Ivon個人的設定,盡量保留預設並另外加功能。

  1. 複製Hyprland預設設定檔
mkdir ~/.config/hypr
cp /usr/share/hyprland/hyprland.conf ~/.config/hypr/hyprland.conf
  1. 用vim編輯
vim ~/.config/hypr/hyprland.conf
  1. 大致上,hyprland.conf檔案的結構可以切成四塊:
  • exec區塊的定義啟動Hyprland跟著啟動的程式
  • 環境變數
  • 外觀、動畫、手勢、個別程式視窗規則的設定
  • bind的區域是快捷鍵綁定。

雖然Hyprland沒有嚴格規定設定檔的順序,但為了方便討論我沿用此規則。

螢幕設定(Monitors)
#

  1. 如果有的話,將auto-generated=1警告註解掉。
# autogenerated = 1
  1. 螢幕規則,設定自動取得螢幕名稱、使用螢幕最高解析度、自動取得座標,再設定全域縮放為1.15倍。
monitor =,highres,auto,1.15
  1. 此設定會自動套用第二個螢幕,因為我不確定外接的第二個螢幕會是什麼解析度,所以就讓它自動偵測。

自動執行的程式(Autostart)
#

  1. 設定要啟動的程式,exec-onceexec的差別在於,前者要重新登入桌面才會啟動,後者則是每編輯一次設定檔就會自動重啟。

  2. 先匯入systemd環境變數,瀏覽器類的程式會用到。

exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
  1. 再啟動fcitx5、dunct、nm-applet、剪貼簿服務。
exec-once = hyprpaper
exec-once = wl-paste --type text --watch cliphist store
exec-once = wl-paste --type image --watch cliphist store
exec-once = waybar
exec-once = nm-applet
exec-once = fcitx5 -d  --replace
exec-once = dunst
exec-once = /usr/lib/polkit-kde-authentication-agent-1
exec-once = udiskie &
  1. 如果你的程式可以用systemd服務啟動那就不用寫在這邊。

環境變數(Environment variables)
#

env環境變數的寫法為env = 名稱, 數值

  1. 設定滑鼠大小
env = XCURSOR_SIZE,24
  1. 指定目前的工作階段為Hyprland
env = XDG_CURRENT_DESKTOP, Hyprland
env = XDG_SESSION_TYPE, wayland
env = XDG_SESSION_DESKTOP, Hyprland
  1. 指定所有程式都使用Wayland,QT程式使用kvantum當主題。不過QT程式因為縮放有問題,所以我設定QT優先使用X而非Wayland協定。
# 預設文字編輯器
env = EDITOR, vim
# 給Firefox啟用Wayland
env = MOZ_ENABLE_WAYLAND, 1
env = GDK_BACKEND, "wayland,x11"
env = QT_QPA_PLATFORM, "xcb;wayland"
env = QT_QPA_PLATFORMTHEME, qt5ct
  1. 還有設定全域縮放比例(應該只對XWayland程式有效),依照程式框架個別設定
env = QT_AUTO_SCREEN_SCALE_FACTOR, 1
env = QT_SCALE_FACTOR, 1.15
env = GDK_DPI_SCALE, 1.15
  1. 再設定Fictx5的環境變數
env = GTK_IM_MODULE, fcitx
env = QT_IM_MODULE, fcitx
env = XMODIFIERS, @im=fcitx

Intel、AMD顯示卡不需要特別設定即可獲得GPU硬體加速;如果是用Nvidia專有驅動的話需參考 Hyprland作者的說明設定一些環境變數。

注意有時從終端機或Waybar手動啟動程式,程式可能還是吃不到Hyprland環境變數,這時就得將環境變數放到~/.config/environment.d/envvars.conf/etc/environment解決。

動畫視窗裝飾(Look and feel)
#

動畫、視窗裝飾這部份看個人喜好調整,我沒有做太多修改。僅修改rounding讓視窗圓角不要那麼圓。

視窗排列模式

視窗排列模式分成dwindle與master

dwindle模式即bspwm,視窗大小是動態變化的。

master模式就是i3wm那樣,一個視窗開在左邊,新視窗會從右邊依序分割開啟。

我維持dwindle模式,不更動。

視窗規則

視窗規則可用class:程式名稱選取要設定規則的視窗,比如我設定pavucontrol面板一律懸浮。如果不知道具體名字請用hyprctl clients指令查詢。

windowrulev2 = size 50% 50%, center, floating:(pavucontrol)

我還設定所有懸浮視窗一律置中,並限制最大寬高50%,防止檔案選擇器這類的視窗過於巨大。冒號後面用星號選取所有符合此類型的程式視窗

windowrulev2 = size 50% 50%, center, floating:*

雜項

在misc這塊,使用這二個變數,關閉Hyprland的預設桌布及看板娘。

misc {
    force_default_wallpaper = -1 # Set to 0 to disable the anime mascot wallpapers
    disable_hyprland_logo = false
}

輸入(Input)
#

  1. 啟用觸控版切換工作區的手勢。設定輕觸等同按下,觸控板等同滑鼠右鍵,雙指點選為左鍵
gestures {
    workspace_swipe = true
}

touchpad{
    tap-to-click = true
}
  1. 加上這條,關閉XWayland的自動縮放,防止程式模糊。縮放部份用環境變數調整就可以了。
xwayland {
  force_zero_scaling = true
}

按鍵綁定(Keybindings)
#

鍵盤綁定部分預設的我沒改,Mod鍵維持Super鍵(Windows鍵)

我另外綁了鎖定鍵、音量鍵、亮度調節鍵、截圖鍵。想確認具體按鍵代碼可以用wev程式偵測。

# Mod + Shift + 方向鍵調整視窗大小
binde = $mainMod SHIFT, right, resizeactive, 10 0
binde = $mainMod SHIFT, left, resizeactive, -10 0
binde = $mainMod SHIFT, up, resizeactive, 0 -10
binde = $mainMod SHIFT, down, resizeactive, 0 10

# 音量鍵
binde=, XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+
bindl=, XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-

# 亮度鍵
binde=, XF86MonBrightnessDown, exec, brightnessctl set 5%-
bindl=, XF86MonBrightnessUp, exec, brightnessctl set +5%

# 全螢幕擷圖鍵
bind = , PRINT, exec, hyprshot -m output

終於弄好了,但還沒完呢!

Hyprland支援邊改設定檔邊套用變更。作者說法是一修改設定檔便會自動套用變更,但如果沒反應的話請用指令強制重新載入設定檔,或者重新登入桌面。

hyprctl reload

3. 設定Hyprland的配套程式
#

狀態欄Waybar的設定
#

  1. 將自己加入input群組
sudo usermod -a -G input $USER
  1. 編輯預設設定檔
mkdir ~/.config/waybar/
cp /etc/xdg/waybar/* ~/.config/waybar/

vim ~/.config/waybar/config/config.jsonc
  1. 將Waybar放在所有視窗最上層
"layer": "top",
  1. 最上面的"modules"是狀態欄要顯示的按鈕,不要的直接從json陣列移除就可以了,例如mpd用不到就刪除。另外加入工作區編號指示器hyprland/workspaces、登出按鈕wlogout
"modules-left": ["hyprland/workspaces", "custom/wofi", "custom/brave", "custom/dolphin"],
"modules-center": [],
"modules-right": ["idle_inhibitor", "pulseaudio", "backlight", "keyboard-state", "hyprland/language", "battery", "tray", "clock", "custom/wlogout"],
  1. 因為不支援圖片,Waybar使用Emoji當小圖示,如果電腦無法顯示請安裝相應字體,或者將其改為ASCII符號。

  2. 下滑到"network"這一段,設定隱藏網路SSID名稱還有 IP位址,把這些資訊改放到tooltip欄位。

"network": {
        // "interface": "wlp2*", // (Optional) To force the use of this interface
        "format-wifi": "",
        "format-ethernet": "{ifname} ",
        "tooltip-format": "{essid} {signalStrength}% {ifname} via {gwaddr} ",
        "format-linked": "{ifname} (No IP) ",
        "format-disconnected": "Disconnected ⚠",
        "format-alt": "{ifname} {gwaddr}",
        "tooltip": true
    },
  1. 最下面加入"custom/wlogout"的按鈕,設定點選啟動登出面板
     "custom/wlogout":{
      "format":"",
      "on-click":"wlogout"
      }

wlogout面板提供待機、鎖定螢幕、重開機的選單,需要進一步設定的請複製cp /etc/wlogout/* ~/.config/wlogout/後再編輯具體指令。待機因為我電腦的硬體支援度不佳所以沒啟用。

  1. Waybar的顏色樣式請編輯~/.config/waybar/style.css

桌布Hypraper的設定
#

桌布程式會疊在Hyprland預設的桌布上。

  1. 編輯預設設定檔
vim ~/.config/hypr/hyprpaper.conf
  1. 填入桌布路徑,wallpaper後面留白指定全部螢幕都使用同一張桌布
preload = /home/user/.config/wallpapers/wallpaper.jpg
wallpaper = ,/home/user/.config/wallpapers/wallpaper.jpg

登入畫面greetd設定
#

tuigreetd是純文字介面不需要設定背景。

  1. 編輯設定檔
sudo vim /etc/greetd/config.toml

2.設定記住登入用戶,並在登入後執行Hyprland

[default_session]
command = "tuigreet --time --asterisks --remember --cmd Hyprland"
  1. 如果有裝其他桌面環境,將現有的顯示管理器停用,改啟用greetd
sudo systemctl disable gdm
sudo systemctl enable greetd

系統部分的設定
#

  1. 設定自動啟動NetworkManager服務
sudo systemctl enable NetworkManager
  1. 設定自動啟動電源管理模式的設定
sudo systemctl enable power-profiles-daemon
  1. 設定自動啟動PipeWire服務
systemctl enable --user pipewire
systemctl enable --user pipewire-pulse
  1. xdg-desktop-portal服務應該會自動啟動,但也可以手動設定
systemctl enable --user xdg-desktop-portal-hyprland
systemctl enable --user xdg-desktop-portal-gtk
  1. 複製xdg-portal-desktop設定檔到使用者家目錄
cp /usr/share/xdg-desktop-portal/hyprland-portals.conf ~/.config/xdg-desktop-portal/portals.conf
  1. 設定Portal偏好為Hyprland優先其次GTK。
[preferred]
default=hyprland;gtk
  1. 設定完成後建議重開機。如果沒裝其他桌面環境,初次登入Hyprland要手動產生使用者家目錄:
sudo pacman -S xdg-dirs-update
LC_ALL=C xdg-user-dirs-update --force

4. Hyprland操作方式
#

Hyprland的視窗(window)是平鋪在螢幕上的,開新程式會直接顯示在目前程式的旁邊,不會重疊。

Hyprland提供多個工作區(workspace)用於擺放多個不同的程式,例如工作區1放瀏覽器,工作區2放文字編輯器。

dwindle模式下,Hyprland開的新視窗會按照滑鼠所在位置決定。

預設按鍵綁定
#

Hyprland預設綁定的Mod鍵是Windows鍵

  • Mod + Q 開啟終端機
  • Mod + C 關閉目前聚焦的視窗
  • Mod + M 終止Hyprland
  • Mod + E 開啟檔案管理器
  • Mod + V 讓視窗懸浮
  • Mod + R 開啟Wofi
  • Mod + P 固定目前視窗大小
  • Mod + J 切換垂直與水平視窗排列
  • Mod + 方向鍵(或l/r/u/d) 切換視窗聚焦
  • Mod + 數字鍵 切換工作區
  • Mod + Shift + 數字鍵 將視窗移動到該工作區
  • Mod + S,開啟scratchpad(將視窗最小化後集中的特殊工作區)
  • Mod + Shift + S,將視窗移動到scratchpad
  • Mod + 滑鼠滾輪 在工作區間切換(觸控板是三指手勢滑動)
  • Mod + 滑鼠左鍵 移動視窗
  • Mod + 滑鼠右鍵 調整視窗大小

雙螢幕切換
#

Hyprland預設每個螢幕一個工作區(跟window rule一樣,workspace也可以設定自動規則,參照官方文件),拖動視窗可以把它丟到第二個螢幕。Hyprland預設是讓第二個螢幕顯示在左方。

如果要設定螢幕相對位置,則使用hyprctl monitor指令取得所有螢幕名稱,再於hyprland.conf個別設定解析度。由於螢幕的座標數值是從左上角開始計算的,指定X軸便可以控制螢幕的相對方位。

# 使螢幕DP-1位於DP-2的左邊
monitor=DP-1, 1920x1080, 0x0, 1
monitor=DP-2, 1920x1080, 1920x0, 1

# 使螢幕DP-1位於DP-2的右邊
monitor=DP-1, 1920x1080, 1920x0, 1
monitor=DP-2, 1920x1080, 0x0, 1

也可以用mirror設定鏡射模式,讓第二螢幕跟第一螢幕顯示同樣內容

# 使DP-2螢幕鏡射DP-1的內容
monitor=DP-2,highres,auto,1,mirror,DP-1

需要獨顯加速請使用 Nvidia PRIME指令。

順帶一提Hyprland可以用hyprctl做虛擬輸出,方便在SSH或分享螢幕的時候做個假螢幕出來

# 做個Wayland的第二螢幕
hyprctl output create wayland

# SSH遠端啟用
hyprctl output create headless

一些應用程式問題
#

要設定GTK程式主題,執行nwg-look;QT則是qt5ct

Firefox的Wayland支援狀況良好。

Chromium系在純Wayland模式支援不佳,硬體加速有問題,將就用XWayland跑吧。但XWayland字體偶爾會模糊一下。

GTK的檔案選擇器會莫名變很大,可能要設定window rule。

終端機啟動X11程式如果吃不到環境變數,請在~/.config/environment.d/envvars.conf加入DISPLAY:0

5. 用chezmoi備份dotfile
#

將Hyprland及配套程式的設定檔集中管理,備份到私人Git儲存庫。

參考 Chezmoi使用教學

參考資料
#

相關文章

給Linux螢幕進行色彩管理,套用ICC設定檔,並調整螢幕色溫
分類   Linux系統 Linux使用技巧
標籤   Linux Wayland Color Management
Weston合成器用法:X11跑巢狀Wayland工作階段
分類   Linux系統 Linux使用技巧
標籤   Wayland X Window
Linux&樹莓派當作藍牙喇叭接收器,電腦播放手機音樂
分類   Linux系統 Linux使用技巧
標籤   PulseAudio PipeWire KDE Connect Raspberry Pi

留言板

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。要討論程式碼請用Giscus,匿名討論請用Disqus。

這是Giscus留言板,需要Github帳號才能留言。支援markdown語法,若要上傳圖片請貼Imgur或Postimages。您的留言會在Github Discussions向所有人公開。

這是Disqus留言板,您可能會看到Disqus強制投放的廣告。為防止垃圾內容,有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。若要上傳圖片請善用圖床網站。