How to scale applications on Linux Wayland session.
Ivon將在這篇文章討論Linux系統Wayland協定桌面的縮放方式,適用Ubuntu、Fedora、Arch Linux等發行版。用到的桌面環境為GNOME與KDE Plasma。
什麼時候會遇到需要縮放的問題呢?
- 4K解析度的HiDPI大螢幕會遇到程式字太小的問題,需要放大。
- 筆電螢幕太小,需要放大程式
由於Wayland現在的機制還不完善,調整縮放的時候會遇到各式各樣的問題,所以Ivon寫一篇記錄下來。
這裡使用的通訊協定為Wayland,如果你使用X11請看這篇
1. 如何確認Wayland還是X11#
如何確認目前的桌面工作階段為Wayland還是X11?輸入指令echo $XDG_SESSION_TYPE
確認。
如何確認程式是跑在Wayland協定,還是跑在XWayland下?使用xlsclients
指令,即可確認哪些程式是使用X11協定。XWayland程式的縮放行為跟原生Wayland程式不一樣,所以要特別關注。
2. Wayland的縮放問題#
首先你要知道的是,Wayland工作階段沒有X伺服器,不能使用「xrandr」這種通用工具來調整螢幕縮放,而「wlr-randr」工具僅支援wlroots寫成的合成器,所以這得看桌面環境的合成器怎麼設計縮放機制了。
Linux的縮放分為整數縮放 (integer scaling) 與非整數縮放 (fractional scaling,又稱分數縮放),前者就是只有100%與200%的差別,後者則是能夠有100%、125%、150%、175%、200%的選項。建議使用後者非整數縮放,能夠精細的控制縮放大小。
理想情況下,最好是由桌面環境的合成器來控制縮放,只要在設定面板調整縮放比例,整個系統UI或者字型就會跟著統一縮放。這裡「縮放」跟「字型縮放」是不一樣的概念。縮放是讓程式的界面全部放大,而字型縮放只是放大字型,讓程式看起來比較大,改善可讀性。
可惜事情沒有這麼簡單,不是所有程式都原生支援Wayland。我們還要考慮XWayland程式的問題。XWayland是跑在Wayland下的舊版X11程式,開發者尚未將其改寫為原生Wayland版本。他們可能不會跟著合成器的指示縮放。若強制縮放的話字型會模糊。
字型縮放模糊的範例,左邊為XWayland的Chrome,縮放後字型模糊;右邊為Wayland的Chrome,縮放後字型沒有模糊。
因為有XWayland程式的存在,使得Wayland縮放的問題複雜了起來。
下面我們來討論解法。
3. 全域縮放#
全域縮放會試圖讓所有程式跟著縮放。
GNOME#
GNOME 47桌面的非整數縮放處於實驗性狀態,Wayland和XWayland都是如此,縮放開下去可能會有各種bug。折衷的辦法是不要設定全域縮放,只縮放字型就好(見下一節)。
- 執行以下指令開啟GNOME的非整數縮放功能:
gsettings set org.gnome.mutter experimental-features "['scale-monitor-framebuffer']"
gsettings set org.gnome.mutter experimental-features "['xwayland-native-scalling']"
之後在GNOME的系統設定 → 顯示器,才會有非整數縮放。
GTK與原生Wayland的程式會全域縮放,較新的QT程式應當也會跟著縮放。XWayland程式可能得手動設定環境變數縮放。
KDE Plasma#
KDE Plasma 5.27以上版本支援非整數縮放。
點選KDE系統設定 → 顯示,設定程式縮放
GTK和QT程式應當會跟著縮放。
為了防止程式模糊,KDE允許「讓XWayland程式自行縮放」。例如Wayland程式會跟著縮放為125%,而XWayland會維持100%縮放。針對部份XWayland的程式,使用者得自行設定環境變數調整縮放。
4. 只縮放字型#
此為折衷方案,只放大程式的字型,不放大UI,改善可讀性。
這麼做的好處是字型都會強制放大。
壞處就是字型太大可能會破壞UI美感,使得畫面不和諧。且有些程式依然不鳥你的字型大小,還是得手動設定環境變數縮放。
GNOME#
點選GNOME設定 → 無障礙輔助 → 大型文字,啟用大型字型,強制放大全部程式的字型,大概會變大個1.25倍,至少能改善可讀性。
如果你需要更精細的字型尺寸,安裝gnome-tweaks
套件,開啟「調校」程式,在裡面設定字型的縮放係數。
KDE Plasma#
在KDE的系統設定 → 字型,指定全域字型的大小。
5. 個別程式縮放,設定環境變數#
如果程式沒有跟著縮放,那麼就只能個別程式設定縮放的環境變數了。你需要依照程式使用的框架,來設定適當的環境變數。
在設定環境變數之前,得先確認你的程式是使用Wayland還是跑在Xwayland,Wayland的環境變數跟X11不能混用。
如何設定環境變數?寫入到~/.bashrc
。例如:
# 編輯檔案
vim ~/.bashrc
# 填入環境變數
export name=value
# 編輯完成後重開機
GTK環境變數#
原生Wayland的GTK 4程式應該會自動跟著桌面環境全域縮放。無法個別指定縮放比例。
例如最新版Firefox預設就是使用Wayland協定,所以它會跟著桌面環境縮放。
不要用GDK_SCALE
和GDK_DPI_SCALE
,這個是X11工作階段在用的。你可以加入環境變數GDK_BACKEND=x11
強制特定GTK程式以X11協定執行(例如GDK_BACKEND=x11 firefox
),這二個環境變數才會有效。
QT環境變數#
原生Wayland的QT 6程式應該會跟著桌面環境全域縮放。無法個別指定縮放比例。
例如最新版Krita應該會跟著縮放。
QT_AUTO_SCREEN_SCALE_FACTOR
和QT_ENABLE_HIGHDPI_SCALING
這二個調整縮放的環境變數僅限X11協定使用,Wayland無效。
你可以加入環境變數QT_QPA_PLATFORM=xcb
強制特定QT程式以X11協定執行,例如QT_QPA_PLATFORM=xcb krita
Electron與Chromium瀏覽器#
如果跑在純Wayland模式(使用--ozone-platform=auto
參數啟動),最新版的Chromium和Electron應該會跟著桌面環境縮放。
--force-device-scale-factor
的參數在Wayland下無效,僅限X11協定使用。
Wine/Proton的環境變數#
目前Wine 9.0與Steam Proton 9.0尚未完全支援Wayland,大部分程式都是跑在XWayland。Steam客戶端也是一樣。
要設定透過Wine執行的Windows exe程式,請用winecfg
指令,設定程式DPI。
至於Steam客戶端,請用環境變數STEAM_FORCE_DESKTOPUI_SCALING=1.5
設定縮放比例。
6. 解決XWayland縮放字型模糊#
有些桌面環境強制所有程式縮放,會導致XWayland程式的字型模糊。
解法:
- 傳入特定參數,強制X11程式使用Wayland模式,字型就不會模糊。但是有的程式強制用Walyand跑問題會更多。
- 個別給他們設定環境變數。因為X11程式跑在Wayland下,會變成透過XWayland執行,此時它們的縮放行為與X11環境下相同。
2.是比較好的作法,參考Linux X11縮放的教學
7. Wayland多螢幕縮放#
假設一個螢幕1080p,一個螢幕4K,兩個螢幕就會有縮放不一致的問題。
如果全域縮放正常的話,那麼在桌面環境的系統設定選單,個別給兩個螢幕設定縮放比例即可。
例如,KDE做如下設定之後,視窗移動到另外一個螢幕後,就會自動依照那個螢幕的縮放設定放大。