picom 是一個獨立的 Xorg 合成器,適合與沒有合成功能的窗口管理器一起使用。picom 是 compton 的一個分支,而 compton 是 xcompmgr 分支 xcompmgr-dana 的一個分支。
安裝
安裝 picom包 軟體包或開發者版本 picom-gitAUR。
配置
默認的配置位於 /etc/xdg/picom.conf
中,若要修改,請先將其複製到 ~/.config/picom/picom.conf
或 ~/.config/picom.conf
。
若要讓 picom 使用其他的自定義配置文件,請使用如下的命令:
$ picom --config path/to/picom.conf
詳情請參閱 picom(1) § CONFIGURATION FILES。
為某些窗口禁用陰影效果
可按需使用 shadow-exclude
選項以禁用窗口陰影。有關已禁用的窗口,參見這個連結。
若要禁用菜單的陰影效果,請將以下內容添加至 picom.conf
中的 wintypes
:
# menu = { shadow = false; }; dropdown_menu = { shadow = false; }; popup_menu = { shadow = false; }; utility = { shadow = false; };
EWMH 標準中定義了其他可用的 WINDOW_TYPE
值:unknown
、desktop
、dock
、toolbar
、menu
、utility
、splash
、dialog
、normal
、dropdown_menu
、popup_menu
、tooltip
、notification
、combo
以及 dnd
。
不透明度
若要為聚焦和非聚焦的窗口(如終端模擬器)設置不透明度(實際上是透明度),將以下內容添加至 picom.conf
:
opacity-rule = [ "90:class_g = 'URxvt' && focused", "60:class_g = 'URxvt' && !focused" ];
另見 #選項卡式窗口(陰影和透明度).
使用
可在會話期間的任意時間點手動啟用或禁用 picom,或作為會話的一個後台進程自動啟動。有一些可選參數用於調整 picom 所提供的合成效果。這些效果包括:
-
-b
:作為會話的一個後台進程運行(例如,隨窗口管理器 Openbox 啟動) -
-c
:啟用陰影效果 -
--config
:使用指定的配置文件
更多可用選項,包括設置需要管理的時機和顯示效果,菜單、窗口邊框和不活躍應用程式的菜單的不透明度,參見 picom(1)。
要在會話期間手動啟用默認的合成效果,請使用以下命令:
$ picom &
要作為會話的後台進程自動啟動 picom,可以使用 -b
參數(有可能導致顯示畫面凍結):
$ picom -b
以下是使用需要傳值的額外參數的例子:
$ picom -cfF -o 0.38 -O 200 -I 200 -t 0 -l 0 -r 3 -D2 -m 0.88
多顯示器
若在沒有 xinerama(意味著以多個屏幕啟動 X 服務)的情況下使用了多顯示器的配置,picom 默認只會在一個屏幕上運行。可以使用 DISPLAY
環境變量令其在所有屏幕上運行。例如,在 X 上標識符為 0 的屏幕後台運行 picom:
DISPLAY=":0" picom -b
上述命令在所有顯示器上都應該生效。若無效,請嘗試舊方法,指定每一個顯示器:
seq 0 3 | xargs -l1 -I@ picom -b -d :0.@
灰度
可以使用著色器將窗口顏色轉換為灰度。
根據 picom(1),從 picom 的源碼中編輯默認的著色器。
/path/to/shader/file.glsl
#version 330 in vec2 texcoord; uniform sampler2D tex; uniform float opacity; vec4 default_post_processing(vec4 c); vec4 window_shader() { vec2 texsize = textureSize(tex, 0); vec4 color = texture2D(tex, texcoord / texsize, 0); color = vec4(vec3(0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b) * opacity, color.a * opacity); return default_post_processing(color); }
將編輯好的文件路徑引入著色器後啟動 picom。或許還需要 glx
後端。
$ picom --backend glx --window-shader-fg /path/to/shader/file.glsl
故障排除
近期的 picom 版本在 DRI2 加速上存在一些問題,表現為使用 DRI2 時出現嚴重的畫面閃爍(picom bug、mesa bug)。此問題已經過反饋和修復,但仍可能會影響某些用戶。DRI3 則不受該問題的影響。
使用合成效果可能會導致一些問題,例如在與其他應用程式一起使用時,錯誤的配置會引起顯示故障。
Conky
若要禁用 Conky 窗口的環繞陰影,請將以下內容添加至 ~/.conkyrc
:
own_window_class conky
若使用模糊特效時,上述方法無效,請在 ~/.conkyrc
中嘗試如下配置:
own_window_type= 'desktop'
picom 所有能自動排除窗口管理器元素的功能都無法檢測到 dwm 的狀態欄。無論是 dwm 的狀態欄還是 dmenu 都沒有固定的窗口 id。若要將其從不活躍窗口透明化中排除,要麼在源碼中加入一個窗口類,要麼使用不那麼精確的屬性將其排除。下面的示例將 dwm 的狀態欄置於頂部,這樣就可以實現與位置排除無關的解析度:
$ picom <任意的其他参数> --focus-exclude "x = 0 && y = 0 && override_redirect = true"
或者在使用的配置文件中配置如下內容:
focus-exclude = "x = 0 && y = 0 && override_redirect = true";
對於大多數窗口來說,覆蓋重定向屬性的值似乎都是 false,在排除規則中使用此屬性可以防止在左上角繪製的其他窗口被排除在外(例如,當 dwm 狀態欄被隱藏時,x0 y0 將與 dwm 主堆棧(master stack)中的任何內容相匹配)。
Firefox
參見 #為某些窗口禁用陰影效果。
要禁用火狐瀏覽器元素的陰影效果,將以下內容添加至 picom.conf
中的 shadow-exclude:
"class_g = 'firefox' && argb",
詳情請參考這個連結。
slock
使用 slock 時,開啟不活躍窗口透明化效果(以 -i
參數啟動)可能會導致麻煩的問題。一種解決方法是將透明度修改為 0.2
。例如,以 picom 參數運行命令:
$ picom <任意的其他参数> -i 0.2
或者在使用的配置文件中配置如下內容:
inactive-dim = 0.2;
另一種方式是,通過 slock 的窗口 id 將其排除在外,或排除所有無名稱的窗口。
使用如下的選項排除所有無名稱的窗口:
$ picom <其他参数> --focus-exclude "! name~=''"
運行以下命令以找出 slock 的窗口 id:
$ xwininfo & slock
在 slock 退出前快速點擊屏幕上的任意位置,然後輸入密碼解鎖。應該可以看到輸出中的窗口 id:
xwininfo: Window id: 0x1800001 (has no name)
提取該 id 並在 picom 中將其排除:
$ picom <任意的其他参数> --focus-exclude 'id = 0x1800001'
或者在使用的配置文件中配置如下內容:
focus-exclude = "id = 0x1800001";
畫面閃爍(Flicker)
以默認的 picom.conf
應用於最大化窗口(無面板的會話中)會引發此問題,可以通過以下選項解決:
unredir-if-possible = false;
詳情請參見這個連結。
全屏撕裂
若僅在全屏播放視頻時觀察到屏幕撕裂,請參考 #畫面閃爍(Flicker)。
使用 xft 字體時顯示延遲
若在使用了 Xft 字體的應用程式(例如 xterm 和 urxvt)中遇到嚴重的顯示延遲,請嘗試以下選項:
--xrender-sync --xrender-sync-fence
或使用 xrender 後端。
詳情請參見這個連結。
選項卡式窗口(陰影和透明度)
以選項卡式顯示的透明化窗口,其後方的選項卡式窗口由於透明度的原因依然可見。每個選項卡式窗口都會繪製自己的陰影,這會導致多重陰影。
可將以下內容添加至已有的陰影效果排除列表中以解決多重陰影的問題:
"_NET_WM_STATE@:32a *= '_NET_WM_STATE_HIDDEN'"
將下面的內容添加至 picom.conf
中可禁用繪製後方選項卡式窗口:
opacity-rule = [ "95:class_g = 'URxvt' && !_NET_WM_STATE@:32a", "0:_NET_WM_STATE@[0]:32a *= '_NET_WM_STATE_HIDDEN'", "0:_NET_WM_STATE@[1]:32a *= '_NET_WM_STATE_HIDDEN'", "0:_NET_WM_STATE@[2]:32a *= '_NET_WM_STATE_HIDDEN'", "0:_NET_WM_STATE@[3]:32a *= '_NET_WM_STATE_HIDDEN'", "0:_NET_WM_STATE@[4]:32a *= '_NET_WM_STATE_HIDDEN'" ];
注意,URxvt
是終端的 Xorg 類名。若使用不同的終端,請更改該類名。運行命令 xprop WM_CLASS
並點擊一個窗口以查詢該窗口的類名稱。
詳情請參見這個連結。
Xsetroot 無法更改背景顏色
目前,picom 不兼容 xsetroot
的 -solid
選項,一種解決方法是使用 hsetroot包 更改背景顏色:
$ hsetroot -solid '#000000'
詳情請參見這個連結。
使用 NVIDIA 專有驅動時遇屏幕撕裂
請在 picom.conf
中嘗試以下設置:
vsync = true;
使用 NVIDIA 專有驅動和 FullCompositionPipeline 時有顯示延遲
請嘗試以如下參數運行 picom:
--backend xrender
或在 picom.conf
中添加如下的配置項:
backend = "xrender";
詳情請參見這個連結。
另一個降低延遲的方法是在 nvidia 的 OpenGL 設置中禁用「允許翻轉」(disable "allow flipping",參見這個連結)。也可以用命令行實現同樣的效果:
$ nvidia-settings -a 'AllowFlipping=0'
要在重啟後加載設置(參見自動啟動),請運行:
$ nvidia-settings --load-config-only
使用 NVIDIA 專有驅動時 Xorg 會洩漏 GPU 的內存
參見 #使用 NVIDIA 專有驅動和 FullCompositionPipeline 時有顯示延遲。
設備掛起後 slock 相關問題
若使用 systemd 服務在掛起或休眠時觸發 slock,設備屏幕可能在恢復後的幾秒中內沒有鎖定。禁用窗口淡入淡出效果以防止此問題發生:
$ picom --no-fading-openclose
屏幕共享
將以下內容添加至 shadow-exclude
可防止出現屏幕共享上的陰影覆蓋和 Zoom Meetings 彈出窗口的陰影效果:
shadow-exclude = [ "name = 'cpt_frame_xcb_window'", "class_g ?= 'zoom'", ];
按照如下內容將 Zoom Meetings 添加至 blur-background-exclude
中可禁用屏幕共享時的模糊效果。
blur-background-exclude = [ "class_g ?= 'zoom'", ];
對於 Microsoft Teams,分享內容的紅色外邊框是以一個幾乎完全透明的窗口實現的。啟用模糊效果將導致該功能無法使用,應按照如下方式禁用模糊效果:
shadow-exclude = [ "name = 'rect-overlay'", ]; blur-background-exclude = [ "name = 'rect-overlay'", ];
切換工作區時禁用窗口的淡入淡出效果
添加 --fade-in-step=1 --fade-out-step=1 --fade-delta=0
標識可以在切換至新的工作區時禁用窗口的淡入淡出效果。參見這個連結。