picom
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
值:unknown
、desktop
、dock
、toolbar
、menu
、utility
、splash
、dialog
、normal
、dropdown_menu
、popup_menu
、tooltip
、notification
、combo
以及 dnd
。
不透明度[编辑 | 编辑源代码]
若要为聚焦和非聚焦的窗口(如终端模拟器)设置不透明度(实际上是透明度),将以下内容添加至 picom.conf
:
opacity-rule = [ "90:class_g = 'URxvt' && focused", "60:class_g = 'URxvt' && !focused" ];
另见 #选项卡式窗口(阴影和透明度).
使用[编辑 | 编辑源代码]
可在会话期间的任意时间点手动启用或禁用 picom,或作为会话的一个后台进程自动启动。有一些可选参数用于调整 picom 所提供的合成效果。这些效果包括:
-b
:作为会话的一个后台进程运行(例如,随窗口管理器 Openbox 启动)-c
:启用阴影效果--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
多显示器[编辑 | 编辑源代码]
若在没有 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 bug、mesa bug)。此问题已经过反馈和修复,但仍可能会影响某些用户。DRI3 则不受该问题的影响。
使用合成效果可能会导致一些问题,例如在与其他应用程序一起使用时,错误的配置会引起显示故障。
Conky[编辑 | 编辑源代码]
若要禁用 Conky 窗口的环绕阴影,请将以下内容添加至 ~/.conkyrc
:
own_window_class conky
若使用模糊特效时,上述方法无效,请在 ~/.conkyrc
中尝试如下配置:
own_window_type= 'desktop'
[编辑 | 编辑源代码]
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 将其排除在外,或排除所有无名称的窗口。
使用如下的选项排除所有无名称的窗口:
$ 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 和 urxvt)中遇到严重的显示延迟,请尝试以下选项:
--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
并点击一个窗口以查询该窗口的类名称。
详情请参见这个链接。
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 弹出窗口的阴影效果:
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
标识可以在切换至新的工作区时禁用窗口的淡入淡出效果。参见这个链接。