出自 Arch Linux 中文维基

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 值:unknowndesktopdocktoolbarmenuutilitysplashdialognormaldropdown_menupopup_menutooltipnotificationcombo 以及 dnd

不透明度

若要為聚焦和非聚焦的窗口(如終端模擬器)設置不透明度(實際上是透明度),將以下內容添加至 picom.conf

opacity-rule = [
  "90:class_g = 'URxvt' && focused",
  "60:class_g = 'URxvt' && !focused"
];

另見 #選項卡式窗口(陰影和透明度).

使用

可在會話期間的任意時間點手動啟用或禁用 picom,或作為會話的一個後台進程自動啟動。有一些可選參數用於調整 picom 所提供的合成效果。這些效果包括:

  • -b:作為會話的一個後台進程運行(例如,隨窗口管理器 Openbox 啟動)
  • -c:啟用陰影效果
  • --config:使用指定的配置文件
注意: -C(禁用面板和停靠欄的陰影效果)和 -G(禁用應用程式窗口和拖放對象的陰影效果)參數已棄用,類似功能請參考 #為某些窗口禁用陰影效果

更多可用選項,包括設置需要管理的時機和顯示效果,菜單、窗口邊框和不活躍應用程式的菜單的不透明度,參見 picom(1)

注意: 其他合成管理器應當在 picom 運行之前啟動。

要在會話期間手動啟用默認的合成效果,請使用以下命令:

$ 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 bugmesa bug)。此問題已經過反饋和修復,但仍可能會影響某些用戶。DRI3 則不受該問題的影響。

使用合成效果可能會導致一些問題,例如在與其他應用程式一起使用時,錯誤的配置會引起顯示故障。

Conky

若要禁用 Conky 窗口的環繞陰影,請將以下內容添加至 ~/.conkyrc

own_window_class conky

若使用模糊特效時,上述方法無效,請在 ~/.conkyrc 中嘗試如下配置:

own_window_type= 'desktop'

dwm 和 dmenu

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 將其排除在外,或排除所有無名稱的窗口。

注意: 某些程序在每次運行新實例時都會改變 id,但 slock 的 id 是固定的。有相關知識的用戶會去確認 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英語xtermurxvt)中遇到嚴重的顯示延遲,請嘗試以下選項:

--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 並點擊一個窗口以查詢該窗口的類名稱。

詳情請參見這個連結

警告: 使用 i3 並以 kitty 作為終端時,上述操作(截至 2020-08-31)會在重新加載 i3 時凍結所有選項卡式的 kitty 實例(參見這個連結),可能的解決方案可在一個類似的問題中找到。

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英語Zoom Meetings 彈出窗口的陰影效果:

shadow-exclude = [
  "name = 'cpt_frame_xcb_window'",
  "class_g ?= 'zoom'",
];

按照如下內容將 Zoom Meetings英語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 標識可以在切換至新的工作區時禁用窗口的淡入淡出效果。參見這個連結

另見