picom
picom 是一个独立的 合成器,适用于 Xorg,适合与不提供合成功能的 窗口管理器 一起使用。picom 是 compton 的一个分支,而 compton 又是 xcompmgr-dana 的一个分支,xcompmgr-dana 又是 xcompmgr 的一个分支。
安装
配置
默认配置文件位于 /etc/xdg/picom.conf。要进行修改,可以将其复制到 ~/.config/picom/picom.conf 或 ~/.config/picom.conf。
要使用另一个自定义配置文件,请使用以下命令
$ picom --config path/to/picom.conf
有关详细信息,请参阅 picom(1) § 配置文件。
为某些窗口禁用阴影
shadow-exclude 选项可以在需要时禁用窗口的阴影。有关当前禁用的窗口,请参阅 [1]。
要禁用菜单的阴影,请在 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 中添加以下内容
rules: ({
match = "class_g = 'URxvt' && focused";
opacity = 0.9;
}, {
match = "(class_g = 'URxvt' || class_g = 'Alacritty')"
" && !focused";
opacity = 0.6;
})
另请参阅 #标签式窗口(阴影和透明度)。
用法
picom 可以在会话期间随时手动启用或禁用,或者作为后台进程自动启动。还有几个可选参数可用于调整合成效果。这些包括
-b:将 picom 作为后台进程运行(例如,在 自动启动时,用于 Openbox 等窗口管理器)-c:启用阴影效果-C:禁用面板和坞站上的阴影效果(已弃用,请使用 #为某些窗口禁用阴影)-G:禁用应用程序窗口和拖放对象的阴影效果(已弃用,请使用 #为某些窗口禁用阴影)--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
Multihead
如果使用多头配置而未启用 xinerama(意味着 X 服务器以多个屏幕启动),则 picom 默认仅在其中一个屏幕上启动。可以通过 DISPLAY 环境变量在所有屏幕上启动。例如,要在后台运行 X 屏幕 0
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'
dwm 和 dmenu
dwm 的状态栏未被 picom 自动排除窗口管理器元素的任何函数检测到。dwm 状态栏和 dmenu 都没有静态窗口 ID。如果要将其排除在非活动窗口透明度(或其他)之外,则必须修补每个程序的源代码以添加窗口类,或者根据不太精确的属性排除。以下示例是针对顶部的 dwm 状态栏,这允许一种独立于位置的排除分辨率
$ picom <any other arguments> --focus-exclude "x = 0 && y = 0 && override_redirect = true"
否则,在使用配置文件时
focus-exclude = "x = 0 && y = 0 && override_redirect = true";
大多数窗口的覆盖重定向属性似乎都为 false - 在排除规则中这样做可以防止顶部左上角绘制的其他窗口被排除(例如,当 dwm 状态栏隐藏时,x0 y0 将匹配 dwm 主堆栈中的任何内容)。
Firefox
请参阅 #为某些窗口禁用阴影。
要禁用 Firefox 元素的阴影,请在 picom.conf 的 shadow-exclude 中添加以下内容
"class_g = 'firefox' && argb",
有关更多信息,请参阅 [2]。
slock
slock 不会设置类或窗口 ID,可以编辑源代码,使其 slock 窗口设置一个,然后使用 picom 的窗口规则捕获它。
您需要编写一个设置类或窗口 ID 的函数。可以通过在 config.h 中添加以下内容来启用它
static void set_window_class(Display *dpy, Window win) {
XClassHint *class_hint = XAllocClassHint();
if (!class_hint) {
fprintf(stderr, "slock: unable to allocate class hint\n");
return;
}
class_hint->res_name = "slock";
class_hint->res_class = "slock";
XSetClassHint(dpy, win, class_hint);
XFree(class_hint);
}
当启用非活动窗口透明度时(运行命令时的 -i 参数),这可能会与 slock 一起产生麻烦的结果。一种解决方案是调整透明度到 0.2。例如,当作为命令运行 picom 参数时
$ picom <any other arguments> -i 0.2
否则,在使用配置文件时
inactive-dim = 0.2;
或者,您可以尝试按窗口 ID 排除 slock,或排除所有没有名称的窗口。
使用以下选项将所有没有名称的窗口从 picom 中排除
$ picom <other arguments> --focus-exclude "! name~=''"
通过运行以下命令查找 slock 的窗口 ID
$ xwininfo & slock
快速点击屏幕上的任意位置(在 slock 退出之前),然后输入密码进行解锁。您应该会在输出中看到窗口 ID
xwininfo: Window id: 0x1800001 (has no name)
获取窗口 ID 并使用以下命令将其从 picom 中排除
$ picom <any other arguments> --focus-exclude 'id = 0x1800001'
否则,在使用配置文件时
focus-exclude = "id = 0x1800001";
作为一种更简单的解决方案,您可以将全屏程序排除在配置文件之外,例如
{ match = "fullscreen"; opacity = 1.0; corner-radius = 0; round-borders = 0; shadow = false; },
闪烁
适用于全屏最大化窗口(在没有面板的会话中),在默认 picom.conf 下由以下选项引起并解决
unredir-if-possible = false;
有关更多信息,请参阅 [3]。
全屏撕裂
如果您只在全屏时观察到视频播放的屏幕撕裂,请参阅 #闪烁。
使用 xft 字体时出现延迟
如果您在使用 Xft 字体时遇到严重延迟,例如在 xterm 或 urxvt 等应用程序中,请尝试
--xrender-sync --xrender-sync-fence
或 xrender 后端。
有关更多信息,请参阅 [4]。
标签式窗口(阴影和透明度)
当具有透明度的窗口被标签化时,由于透明度的原因,底层的标签式窗口仍然可见。每个标签式窗口还会绘制自己的阴影,导致出现多个阴影。
可以通过在已有的 shadow-exclude 列表中添加以下内容来解决多个阴影的问题
"_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 并点击窗口来查询窗口的类。
有关更多信息,请参阅 [5]。
无法使用 xsetroot 更改背景颜色
目前,picom 与 xsetroot 的 -solid 选项不兼容,解决方法是使用 hsetroot 来设置背景颜色
$ hsetroot -solid '#000000'
有关更多信息,请参阅 [7]。
使用 NVIDIA 专有驱动程序时的屏幕撕裂
尝试在 picom.conf 中进行此设置
vsync = true;
使用 NVIDIA 专有驱动程序和 FullCompositionPipeline 时出现延迟
尝试使用以下命令运行 picom
--backend xrender
或将以下内容添加到
backend = "xrender";
您的 picom.conf 文件中。
有关更多信息,请参阅 [8]。
另一个减少 glx 后端延迟的选项是禁用 NVIDIA 设置中的“允许翻转”(OpenGL 部分)[9]。也可以从命令行进行
$ nvidia-settings -a 'AllowFlipping=0'
要加载重启后的设置(请参阅 Autostarting),请运行
$ nvidia-settings --load-config-only
Xorg 使用 NVIDIA 专有驱动程序时泄漏 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 标志可以禁用切换到新工作区时的淡入淡出效果。 [10]
切换窗口时偶尔会出现奇怪的窗口透明度问题
在 picom.conf 中设置不透明度后,可能会出现此问题。在 picom.conf 中设置 use-damage = false 可以解决此问题。