Spectacle/Flameshot/X11 Xlib截屏问题现象及解决方法
迪丽瓦拉
2024-02-06 00:10:20
0

最近一个时期可以看到我的博客文章都是围绕系统截屏展开的,从Spectale到FlameShot再到X11/Xlib,及至最近的libX11,都是在设法找到工作中遇到的一个比较严重的Bug的根源——截屏的时候截取到的(有时甚至很多时候)不是当前屏幕的内容。问题的细节及复现过程描述如下:

问题细节

一开始的时候系统中只有Spectacle,有些人在使用飞书截屏的时候发现截取的屏幕并不是当前的屏幕。进而不使用飞书、而直接通过键盘的“截屏”按键(笔者电脑是Fn+PrtSrc)发现反复截屏后也会出现同样问题(截屏按键调用的是Spectacle),于是将此问题上报。

笔者在进行测试时,将问题现象更进一步细化。使用飞书截屏的时候非常容易复现,而不使用飞书的时候概率低得多。一度以为是飞书截屏导致了问题,直到有一次完全不启动飞书,通过截屏键反复截屏,最终也复现了问题,这才确定飞书只是问题的催化剂,而并不是问题的根因。

为了验证是否是Spectacle自身的问题,使用了另外一个截屏工具——Flameshot。测试中发现Flameshot截屏出现问题的概率远高于Spectacle,基本上几次就会出现。

由于Spectacle和Flameshot都是基于Qt的,为了排除Qt的影响,写了一个基于Xlib的XWindow程序,完全与Qt无关,结果经过测试,问题现象仍然相同。

而且不论是Spectacle、Flameshot还是Xlib,重启后的几次一般不出问题,但几次之后一旦出现问题,基本上就一直出现同样的问题了(偶尔会消失,但很快又出现问题)。还有一点,有时感觉上是截取的几秒之前的屏幕;而更多时候一旦出现问题,似乎是掉进了一个环形缓冲,截取的内容是循环出现的。

从现象上分析,应该是图层的内容合成有问题,也有可能是获取的屏幕内容的序列不对。可能是Xorg的问题,也可能是Compositor的问题,还可能是显卡等相关驱动的问题。

问题探索

问题探索的过程无需多说了,可以参见之前的一系列文章。最终由应用一直分析到了上一篇文章,即《X11 Xlib截屏问题及深入分析五 —— XOpenDisplay函数源码分析(2)》。这只是冰山一角,再往下分析,需要研究Xlib、Xorg0Server、Xcb、显卡驱动等等内容……

问题解决

在此要非常特别感谢以下链接中博主分享的内容:

解决kde/flameshot/spectacle on x11 截屏错乱问题 - oaksharks - 博客园

这篇博客中提到的问题和我实际遇到的完全一致,提供的解决方法也完全有效。应该说,如果没有这篇文章,至少还需要几个月甚至空拍是半年的时间才能从源码上分析清楚,那时候黄花菜都凉了……

现将以上博客中提到的解决方法,结合我实际操作的过程记录在此,供后来同样遇到此问题的人参考,为他们提供方便,无需重走我的复杂而艰辛的探索过程。

相关内容