picom

出自 ArchWiki

picom 是一个独立的 合成器,用于 Xorg,适用于不提供合成功能的窗口管理器。 picom 是 compton 的一个分支,而 compton 是 xcompmgr-dana 的一个分支,xcompmgr-dana 反过来又是 xcompmgr 的一个分支。

安装

安装 picom 软件包或 picom-gitAUR 以获取开发版本。

配置

默认配置文件位于 /etc/xdg/picom.conf。要进行修改,可以将其复制到 ~/.config/picom/picom.conf~/.config/picom.conf

要将另一个自定义配置文件与 picom 一起使用,请使用以下命令

$ 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 值:unknowndesktopdocktoolbarmenuutilitysplashdialognormaldropdown_menupopup_menutooltipnotificationcombodnd

不透明度

要为焦点窗口和非焦点窗口(例如终端模拟器)设置不透明度(实际上是透明度),请将以下内容添加到您的 picom.conf

rules: ({
  match = "class_g = 'URxvt' && focused";
  opacity = 0.9;
}, {
  match = "(class_g = 'URxvt' || class_g = 'Alacritty')"
          " && !focused";
  opacity = 0.6;
})

另请参阅 #标签页窗口(阴影和透明度)

用法

可以在会话期间随时手动启用或禁用 picom,或者作为会话的后台进程自动启动。还有几个可选参数可用于调整提供的合成效果。这些包括

  • -b:作为会话的后台进程运行(例如,在为 自动启动 窗口管理器(如 Openbox)时)
  • -c:启用阴影效果
  • -C:禁用面板和停靠栏的阴影效果(已弃用,请使用 #为部分窗口禁用阴影
  • -G:禁用应用程序窗口和拖放对象的阴影效果(已弃用,请使用 #为部分窗口禁用阴影
  • --config:使用指定的配置文件

还有更多选项可用,包括设置计时、要管理的显示器、菜单、窗口边框和非活动应用程序菜单的不透明度。请参阅 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 上运行

 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 错误mesa 错误)。这已被解决并报告为工作正常,但可能仍然会影响某些用户。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

如果启用了非活动窗口透明度(以命令形式运行时使用 -i 参数),则在使用 slock 时可能会产生麻烦的结果。一种解决方案是将透明度修改为 0.2。例如,以命令形式运行 picom 参数时

$ picom <any other arguments> -i 0.2

否则,在使用配置文件的情况下

inactive-dim = 0.2;

或者,您可以尝试按窗口 ID 排除 slock,或排除所有没有名称的窗口。

注意: 有些程序会为每个新实例更改其 ID,但 slock 的 ID 似乎是静态的。需要更专业的人员来确认 slock 的 ID 实际上是静态的 - 在此之前,请自行承担风险使用。

使用以下选项从 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";

闪烁

适用于使用默认 picom.conf 的完全最大化的窗口(在没有任何面板的会话中),由以下选项引起和解决

unredir-if-possible = false;

有关更多信息,请参阅 [3]

全屏撕裂

如果您仅在全屏时观察到视频播放的屏幕撕裂,请参阅 #闪烁

使用 xft 字体时卡顿

如果您在使用 Xft 字体的应用程序(如 xtermurxvt)中遇到严重的卡顿,请尝试

--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]

警告: 对于 i3 和 kitty 作为终端,这样做目前(截至 2020-08-31)会在您重新加载 i3 时冻结所有隐藏(标签页式)的 kitty 实例:[6]Intel graphics#DRI3 问题 中针对类似问题提出了可能的修复方法

无法使用 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'

要在重启后加载设置(参见 自动启动),请运行

$ nvidia-settings --load-config-only

Xorg 使用 NVIDIA 专有驱动程序时泄漏 GPU 内存

参见 #Lag_with_NVIDIA_proprietary_drivers_and_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 可以解决此问题。

参见