Wayland环境下X应用的截图方法、系统及介质转让专利

申请号 : CN202211240560.5

文献号 : CN115309315B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 王勇军周磊张铎陈霖翔刘意虎

申请人 : 麒麟软件有限公司

摘要 :

本发明公开了一种Wayland环境下X应用的截图方法、系统及介质,本发明Wayland环境下X应用的截图方法包括:通过Xwayland截获X11应用发起针对指定的截图接口的调用请求;通过Xwayland判断该调用请求是否为获取根窗口内容,若为获取根窗口内容,则通过Xwayland从Wayland合成器获取当前屏幕图像并返回给X11应用,从而在发现X11应用需要获取窗口或屏幕内容时从Wayland合成器中获取当前的显示图像然后返回给X11应用,能够解决wayland环境下通过X11协议获取窗口或屏幕内容类应用不能使用的问题。

权利要求 :

1.一种Wayland环境下X应用的截图方法,其特征在于,包括:

S101,通过Xwayland截获X11应用发起针对指定的截图接口的调用请求;

S102,通过Xwayland判断该调用请求是否为获取根窗口内容,若为获取根窗口内容,则跳转步骤S103;

S103,通过Xwayland从Wayland合成器获取当前屏幕图像并返回给X11应用;

步骤S102通过Xwayland判断该调用请求是否为获取根窗口内容包括:获取该调用请求所需获取的窗口内容,将该调用请求所需获取的窗口内容与在全局变量中保存的根窗口进行比较以判断两者是否一致,如果两者一致则判定该调用请求为获取根窗口内容,否则判定该调用请求非获取根窗口内容;所述全局变量中保存的根窗口是指Xwayland在初始化时所创建的零大小的根窗口。

2.根据权利要求1所述的Wayland环境下X应用的截图方法,其特征在于,步骤S101中指定的截图接口是指GetImage函数接口;步骤S101通过Xwayland截获X11应用发起针对指定的截图接口的调用请求是指:通过Xwayland处理向量数组ProcVector中定制的第73项处理函数,来截获X11应用发起针对GetImage函数接口的调用请求。

3.根据权利要求1所述的Wayland环境下X应用的截图方法,其特征在于,步骤S101中指定的截图接口是指ShmGetImage函数接口;步骤S101通过Xwayland截获X11应用发起针对指定的截图接口的调用请求是指:通过Xwayland处理向量数组ProcVector中的MIT‑SHM扩展处理函数中定制的分发函数,来截获X11应用发起针对ShmGetImage函数接口的调用请求。

4.根据权利要求1所述的Wayland环境下X应用的截图方法,其特征在于,步骤S101中指定的截图接口是指CopyArea函数接口;步骤S101通过Xwayland截获X11应用发起针对指定的截图接口的调用请求是指:通过Xwayland处理向量数组ProcVector中定制的第62项处理函数,来截获X11应用发起针对CopyArea函数接口的调用请求。

5.根据权利要求1所述的Wayland环境下X应用的截图方法,其特征在于,步骤S103包括:

S201,通过Xwayland向Wayland合成器发起获取当前屏幕图像的请求并开始计时;

S202,判断Xwayland在指定时间内是否从Wayland合成器获取当前屏幕图像成功,若从Wayland合成器获取当前屏幕图像成功,则直接将从Wayland合成器获取的当前屏幕图像返回给X11应用;否则将最近一次从Wayland合成器获取的当前屏幕图像返回给X11应用。

6.根据权利要求5所述的Wayland环境下X应用的截图方法,其特征在于,步骤S202中从Wayland合成器获取当前屏幕图像成功时,从Wayland合成器获取的当前屏幕图像被存储在指定的共享内存空间中,使得在从Wayland合成器获取当前屏幕图像失败时所述共享内存空间中仍然存储有最近一次从Wayland合成器获取的当前屏幕图像,所述将最近一次从Wayland合成器获取的当前屏幕图像返回给X11应用是指将所述共享内存空间中存储的最近一次从Wayland合成器获取的当前屏幕图像当前屏幕图像返回给X11应用。

7.根据权利要求1所述的Wayland环境下X应用的截图方法,其特征在于,步骤S102中还包括在该调用请求非获取根窗口内容时,通过Xwayland直接将当前窗口内容并返回给X11应用。

8.一种Wayland环境下X应用的截图系统,包括相互连接的微处理器和存储器,其特征在于,所述微处理器被编程或配置以执行权利要求1~7中任意一项所述Wayland环境下X应用的截图方法。

9.一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机程序,其特征在于,所述计算机程序用于被微处理器编程或配置以执行权利要求1~7中任意一项所述Wayland环境下X应用的截图方法。

说明书 :

Wayland环境下X应用的截图方法、系统及介质

技术领域

[0001] 本发明涉Linux操作系统的X应用开发领域,具体涉及一种Wayland环境下X应用的截图方法、系统及介质。

背景技术

[0002] Wayland是一个协议(Protocol),它定义了Wayland客户端如何与Wayland合成器通讯。鉴于Wayland协议相对X11协议的优势,特别是在高分辨率、高刷新率方面提供的更好支持,开源社区已经全面转向Wayland进行开发,各大系统发行版本也开始使用Wayland作为默认的图形显示协议。但一方面大多数用于Linux的游戏、图形密集型等专业应用程序仍是使用X11编写,只能通过Xwayland(Wayland协议的X应用兼容服务模块)进行兼容,Xwayland用于提供Wayland环境下X应用(基于X11协议开发的各种运行于X Window system的应用)兼容运行的一个环境,可以看作是XServer的一个实现。与其他XServer实现的区别在于,在Xwayland底层,通过Wayland协议与Wayland合成器通信,Xwayland可以看作是一个Wayland客户端;另一方面对于大量的基于GTK2、Qt4、X11等开发的应用需要重新基于Wayland重构,否则只能通过Xwayland进行兼容运行。在Wayland环境下,X应用(X11 应用程序)通过XWayland兼容运行的架构如图1所示。Xwayland是XServer的一个实现,X应用连接到 Xwayland,跟连接到真实的X服务器一样,Xwayland 负责处理所有 X11 请求。另一方面,Xwayland 同时也是一个连接到 Wayland 合成器的 Wayland 客户端。X11 窗口管理器 (XWM) 是 Wayland 合成器的一个组成部分。 XWM 使用通常的 X11 窗口管理协议来管理 Xwayland 中的所有 X11 窗口。同时XWM 充当 Xwayland 窗口状态和 Wayland 合成器的窗口管理器 (WWM) 之间的桥梁。这样 WWM 可以管理所有窗口,包括原生 Wayland 和 X11 (Xwayland) 窗口。wayland合成器同时也是一个X11客户端。
[0003] 但是,使用Xwayland进行X11应用兼容存在不少问题:1、Xwayland是一个wayland客户端,它接收合成器发送过来的输入事件,并转发给对应X11窗口,同时将X11窗口的内容提交给合成器进行显示。2、最终的显示图形由wayland合成器生成,Xwayland中不存在途径获取当前的屏幕显示内容。因为上述两点原因,通过X11协议获取窗口或屏幕内容的这类软件将不能正常使用,比如截图、录屏、远程桌面等。

发明内容

[0004] 本发明要解决的技术问题:针对现有技术的上述问题,提供一种Wayland环境下X应用的截图方法、系统及介质,本发明能够解决wayland环境下通过X11协议获取窗口或屏幕内容类应用不能使用的问题。
[0005] 为了解决上述技术问题,本发明采用的技术方案为:
[0006] 一种Wayland环境下X应用的截图方法,包括:
[0007] S101,通过Xwayland截获X11应用发起针对指定的截图接口的调用请求;
[0008] S102,通过Xwayland判断该调用请求是否为获取根窗口内容,若为获取根窗口内容,则跳转步骤S103;
[0009] S103,通过Xwayland从Wayland合成器获取当前屏幕图像并返回给X11应用。
[0010] 可选地,步骤S101中指定的截图接口是指GetImage函数接口;步骤S101通过Xwayland截获X11应用发起针对指定的截图接口的调用请求是指:通过Xwayland处理向量数组ProcVector中定制的第73项处理函数,来截获X11应用发起针对GetImage函数接口的调用请求。
[0011] 可选地,步骤S101中指定的截图接口是指ShmGetImage函数接口;步骤S101通过Xwayland截获X11应用发起针对指定的截图接口的调用请求是指:通过Xwayland处理向量数组ProcVector中的MIT‑SHM扩展处理函数中定制的分发函数,来截获X11应用发起针对ShmGetImage函数接口的调用请求。
[0012] 可选地,步骤S101中指定的截图接口是指CopyArea函数接口;步骤S101通过Xwayland截获X11应用发起针对指定的截图接口的调用请求是指:通过Xwayland处理向量数组ProcVector中定制的第62项处理函数,来截获X11应用发起针对CopyArea函数接口的调用请求。
[0013] 可选地,步骤S103包括:
[0014] S201,通过Xwayland向Wayland合成器发起获取当前屏幕图像的请求并开始计时;
[0015] S202,判断Xwayland在指定时间内是否从Wayland合成器获取当前屏幕图像成功,若从Wayland合成器获取当前屏幕图像成功,则直接将从Wayland合成器获取的当前屏幕图像返回给X11应用;否则将最近一次从Wayland合成器获取的当前屏幕图像返回给X11应用。
[0016] 可选地,步骤S202中从Wayland合成器获取当前屏幕图像成功时,从Wayland合成器获取的当前屏幕图像被存储在指定的共享内存空间中,使得在从Wayland合成器获取当前屏幕图像失败时所述共享内存空间中仍然存储有最近一次从Wayland合成器获取的当前屏幕图像,所述将最近一次从Wayland合成器获取的当前屏幕图像返回给X11应用是指将所述共享内存空间中存储的最近一次从Wayland合成器获取的当前屏幕图像当前屏幕图像返回给X11应用。
[0017] 可选地,步骤S102中还包括在该调用请求非获取根窗口内容时,通过Xwayland直接将当前窗口内容并返回给X11应用。
[0018] 可选地,步骤S102通过Xwayland判断该调用请求是否为获取根窗口内容包括:获取该调用请求所需获取的窗口内容,将该调用请求所需获取的窗口内容与在全局变量中保存的根窗口进行比较以判断两者是否一致,如果两者一致则判定该调用请求为获取根窗口内容,否则判定该调用请求非获取根窗口内容;所述全局变量中保存的根窗口是指Xwayland在初始化时所创建的零大小的根窗口。
[0019] 此外,本发明还提供一种Wayland环境下X应用的截图系统,包括相互连接的微处理器和存储器,所述微处理器被编程或配置以执行所述Wayland环境下X应用的截图方法。
[0020] 此外,本发明还提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机程序,所述计算机程序用于被微处理器编程或配置以执行所述Wayland环境下X应用的截图方法。
[0021] 和现有技术相比,本发明主要具有下述优点:获取窗口或屏幕内容的X应用,通常需要截取根(root)窗口内容并及时返回数据,而Xwayland中无法获取屏幕显示内容,为了解决上述问题,本发明Wayland环境下X应用的截图方法通过Xwayland截获X11应用发起针对指定的截图接口的调用请求;通过Xwayland判断该调用请求是否为获取根窗口内容,若为获取根窗口内容,则通过Xwayland从Wayland合成器获取当前屏幕图像并返回给X11应用,从而在发现X11应用需要获取窗口或屏幕内容时从Wayland合成器中获取当前的显示图像然后返回给X11应用,能够解决wayland环境下通过X11协议获取窗口或屏幕内容类应用包括(截图、录屏、远程桌面、会议共享等窗口)不能使用的问题。

附图说明

[0022] 图1为现有技术中X11应用通过XWayland兼容运行的架构示意图。
[0023] 图2为本发明实施例方法的基本流程示意图。

具体实施方式

[0024] 下面参照附图对本发明的实施例进行详细的说明,在描述过程中省略了对于本发明来说不必要的细节和功能,以防止对本发明的理解造成混淆。
[0025] 获取窗口或屏幕内容的X应用,通常需要截取根(root)窗口内容并及时返回数据,而Xwayland中无法获取屏幕显示内容,为了解决上述问题,如图2所示,本实施例Wayland环境下X应用的截图方法包括:
[0026] S101,通过Xwayland截获X11应用发起针对指定的截图接口的调用请求;
[0027] S102,通过Xwayland判断该调用请求是否为获取根窗口内容,若为获取根窗口内容,则跳转步骤S103;
[0028] S103,通过Xwayland从Wayland合成器获取当前屏幕图像并返回给X11应用。
[0029] 作为一种可选的实施方式,步骤S101中指定的截图接口是指GetImage函数接口;步骤S101通过Xwayland截获X11应用发起针对指定的截图接口的调用请求是指:通过Xwayland处理向量数组ProcVector中定制的第73项处理函数,来截获X11应用发起针对GetImage函数接口的调用请求。Xwayland处理向量数组ProcVector的大小为256,其中0到
127为核心协议处理函数,通过替换第73项处理函数,可方便实现截获X11应用发起针对GetImage函数接口的调用请求。
[0030] 作为一种可选的实施方式,步骤S101中指定的截图接口是指ShmGetImage函数接口;步骤S101通过Xwayland截获X11应用发起针对指定的截图接口的调用请求是指:通过Xwayland处理向量数组ProcVector中的MIT‑SHM扩展处理函数中定制的分发函数,来截获X11应用发起针对ShmGetImage函数接口的调用请求。Xwayland处理向量数组ProcVector的大小为256,从128(EXTENSION_BASE)开始为扩展(extension)处理函数,扩展处理函数实际上是扩展的分发函数,相当于是一个二级分发结构,扩展的分发(dispatch)函数在ProcVector数组中的位置是由扩展的注册顺序决定的。本实施例中,Xwayland处理向量数组ProcVector中的MIT‑SHM扩展处理函数中定制分发函数包括:
[0031] 步骤1,获取Xwayland处理向量数组ProcVector中的MIT‑SHM扩展处理函数的入口。若获取入口失败,则判定Xwayland处理向量数组ProcVector中不存在MIT‑SHM扩展处理函数,结束并退出;否则,保存原有的分发函数为SavedShmDispatch,即:
[0032] SavedShmDispatch = ProcVector[shm‑>index + EXTENSION_BASE][0033] 上式中,shm为MIT‑SHM扩展处理函数的入口,shm‑>index为入口的索引号,EXTENSION_BASE为常数128,ProcVector[shm‑>index + EXTENSION_BASE] MIT‑SHM扩展处理函数中原有的分发函数的位置,记录有原有的分发函数,跳转下一步:
[0034] 步骤2,将MIT‑SHM扩展处理函数中原有的分发函数的位置ProcVector[shm‑>index + EXTENSION_BASE]替换为定制的分发函数,即:
[0035] ProcVector[shm‑>index + EXTENSION_BASE] = xwl_proc_shm_dispatch[0036] 其中,ProcVector[shm‑>index + EXTENSION_BASE] 为MIT‑SHM扩展处理函数中原有的分发函数的位置,通过赋值修改为定制的分发函数xwl_proc_shm_dispatch,在定制的分发函数xwl_proc_shm_dispatch中,先判断是否是ShmGetImage函数接口的调用请求X_ShmGetImage,如果不是则调用原有的分发函数SavedShmDispatch处理。
[0037] 作为一种可选的实施方式,步骤S101中指定的截图接口是指CopyArea函数接口;步骤S101通过Xwayland截获X11应用发起针对指定的截图接口的调用请求是指:通过Xwayland处理向量数组ProcVector中定制的第62项处理函数,来截获X11应用发起针对CopyArea函数接口的调用请求,通过替换第62项处理函数,可方便实现截获X11应用发起针对CopyArea函数接口的调用请求。
[0038] 需要说明的是,在定时Xwayland处理向量数组ProcVector以通过Xwayland截获X11应用发起针对指定的截图接口的调用请求时,定制的处理函数/分发函数在截获处理中同时需要保存原有的处理方式,以便在无需特殊处理的情况下回退到默认处理方式。
[0039] 本实施例中,步骤S102通过Xwayland判断该调用请求是否为获取根窗口内容包括:获取该调用请求所需获取的窗口内容,将该调用请求所需获取的窗口内容与在全局变量中保存的根窗口进行比较以判断两者是否一致,如果两者一致则判定该调用请求为获取根窗口内容,否则判定该调用请求非获取根窗口内容;所述全局变量中保存的根窗口是指Xwayland在初始化时所创建的零大小的根窗口。本实施例中,步骤S102中还包括在该调用请求非获取根窗口内容时,通过Xwayland直接将当前窗口内容并返回给X11应用。
[0040] Wayland作为异步协议,Wayland合成器只能通过事件(event)将数据发送给Xwayland,不能及时返回获取窗口或屏幕内容的X应用所需要的数据,因此Xwayland、Wayland合成器之间可能发生死锁。Xwayland和Wayland合成器之间存在死锁的可能:Xwayland发送了一个wayland请求,然后阻塞等待该请求对应的event。而此时Xwayland发送的请求还没被Wayland合成器处理,wayland合成器还在处理一个X11应用的窗口,向Xwayland发送了X11请求,然后等待X11请求的回复。Xwayland和Wayland合成器相互等待对方,造成了死锁。针对上述问题,本实施例步骤S103中采用了超时机制来解决Xwayland、Wayland合成器之间发生死锁。具体地,步骤S103包括:
[0041] S201,通过Xwayland向Wayland合成器发起获取当前屏幕图像的请求并开始计时;
[0042] S202,判断Xwayland在指定时间内是否从Wayland合成器获取当前屏幕图像成功,若从Wayland合成器获取当前屏幕图像成功,则直接将从Wayland合成器获取的当前屏幕图像返回给X11应用;否则将最近一次从Wayland合成器获取的当前屏幕图像返回给X11应用。
[0043] 为了提升将最近一次从Wayland合成器获取的当前屏幕图像返回给X11应用的效率,本实施例中步骤S202中从Wayland合成器获取当前屏幕图像成功时,从Wayland合成器获取的当前屏幕图像被存储在指定的共享内存空间中,使得在从Wayland合成器获取当前屏幕图像失败时所述共享内存空间中仍然存储有最近一次从Wayland合成器获取的当前屏幕图像,所述将最近一次从Wayland合成器获取的当前屏幕图像返回给X11应用是指将所述共享内存空间中存储的最近一次从Wayland合成器获取的当前屏幕图像当前屏幕图像返回给X11应用,从而不需要额外的内存复制操作,即可快速将最近一次从Wayland合成器获取的当前屏幕图像返回给X11应用,从而达到提升将最近一次从Wayland合成器获取的当前屏幕图像返回给X11应用的效率的目的。通过使用共享内存和请求超时的机制,能够有效避免Xwayland和Wayland合成器之间的死锁。
[0044] 本实施例中,步骤S103中通过Xwayland从Wayland合成器获取当前屏幕图像并返回给X11应用后,X11应用可根据需要直接使用当前屏幕图像(例如进行录屏、远程桌面、会议共享操作),或者在当前屏幕图像中截取并使用指定区域的图像(对其他窗口的截屏操作)。
[0045] 此外,本实施例还提供一种Wayland环境下X应用的截图系统,包括相互连接的微处理器和存储器,该微处理器被编程或配置以执行前述Wayland环境下X应用的截图方法。此外,本实施例还提供一种计算机可读存储介质,该计算机可读存储介质中存储有计算机程序,该计算机程序用于被微处理器编程或配置以执行前述Wayland环境下X应用的截图方法。
[0046] 本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可读存储介质(包括但不限于磁盘存储器、CD‑ROM、光学存储器等)上实施的计算机程序产品的形式。本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0047] 以上所述仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。