picom

来自 ArchWiki
(重定向自 Compton

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";

对于大多数窗口,override redirect 属性似乎为 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 内存

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

另请参阅