picom

来自 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 标识可以在切换至新的工作区时禁用窗口的淡入淡出效果。参见这个链接

另见[编辑 | 编辑源代码]