本文记录我学习开发 X11 应用的笔记
如何设置X11里面两个窗口之间的层级关系
如何类似 WPF 的 Owner 之类的关系?可使用 XSetTransientForHint 方法。比如有 a 和 b 两个窗口,使用下面代码即可设置 a 窗口一定在 b 窗口上方
以上代码放在 github 和 gitee 上,可以使用如下命令行拉取代码
先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码
以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码,将 gitee 源换成 github 源进行拉取代码
获取代码之后,进入 GececurbaiduhaldiFokeejukolu 文件夹,即可获取到源代码
以上为 Owner-Owned 关系方法,还有 Parent-Child 关系方法,详细请看 dotnet 设置 X11 建立窗口之间的父子关系
设置窗口无边框
设置窗口的override_redirect属性为True,以避免窗口管理器的干预,如此即可实现无边框
以上代码的 SetWindowValuemask.OverrideRedirect 十分重要,如果没有加上将会导致 override_redirect
设置无效
以上代码放在 github 和 gitee 上,可以使用如下命令行拉取代码
先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码
以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码,将 gitee 源换成 github 源进行拉取代码
获取代码之后,进入 GececurbaiduhaldiFokeejukolu 文件夹,即可获取到源代码
移动窗口
核心 C# 代码如下,即可移动 X11 窗口
完全的代码放在 github 和 gitee 上,可以使用如下命令行拉取代码
先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码
以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码,将 gitee 源换成 github 源进行拉取代码
获取代码之后,进入 DikalehebeekaJaqunicobo 文件夹,即可获取到源代码
设置窗口坐标过程中,是不会存在窗口移动动画的
配置 XCompositeRedirectSubwindows 将会导致窗口背景透明
如使用以下代码即可创建不透明背景窗口
但是如果在此窗口加上 XCompositeRedirectSubwindows 将会导致窗口背景依然是透明的
以上代码放在 github 和 gitee 上,可以使用如下命令行拉取代码
先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码
以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码,将 gitee 源换成 github 源进行拉取代码
获取代码之后,进入 DikalehebeekaJaqunicobo 文件夹,即可获取到源代码
设置窗口透明
多次调用 XInitThreads 的影响
可以多次调用 XInitThreads 方法,不会炸
在 UNO 底层已经调用
参考文档: https://tronche.com/gui/x/xlib/display/XInitThreads.html
It is only necessary to call this function if multiple threads might use Xlib concurrently. If all calls to Xlib functions are protected by some other access mechanism (for example, a mutual exclusion lock in a toolkit or through explicit client programming), Xlib thread initialization is not required. It is recommended that single-threaded programs not call this function.
如以下代码不会炸
多次调用 XMatchVisualInfo 将返回相同结果
多次调用 XMatchVisualInfo 返回的 Visual 是相同的
经过测试这是相同的
和 Avalonia 相互调用
设置工具栏与 X11 窗口绘制的笔迹关联,要求 X11 笔迹窗口在下方,配合设置X11里面两个窗口之间的层级关系的方法即可实现
获取 Avalonia 的 X11 窗口,代码如下
以上代码拿到的 handle 就是可以用来作为 X11 窗口的指针,类似于 Windows 下的窗口句柄概念
和 UNO 相互调用
和 UNO Gtk 相互调用
参阅 dotnet 如何从 Gtk 3 的窗口到对应的 X11 窗口
和 UNO X11 相互调用
已知问题
XIQueryDevice 可能停止渲染或卡住线程
放在显示窗口之前进行 XIQueryDevice 不会让窗口停止渲染,否则将会在 XIQueryDevice 方法卡住
反过来,让 XMapWindow 在 XIQueryDevice 之前则可能让其他的 X11 窗口停止渲染,且非必现问题,十分诡异。仅在统信 UOS 系统能够复现,其系统版本信息如下
XShapeCombineRegion 方法可能永不返回
调用 XShapeCombineRegion 方法时,可以看到线程在这里卡住。诡异的事情是在另一个线程有控制台输出,则没有此问题,在我的 Demo 里的最简修复此问题的代码的更改请看 https://github.com/lindexi/lindexi_gd/commit/fa08b6854bd9d43445fa3d9e93cb2ebc1d4a9cca
此问题也仅在统信 UOS 系统能够复现,其系统版本信息如下
此 XShapeCombineRegion 用来实现命中穿透功能,详细请看
全屏下配置 _NET_WM_STATE_ABOVE
将导致 UNO 应用停止渲染
最简修复代码如下 https://github.com/lindexi/lindexi_gd/commit/9dccf10b6dfceb4a85eb3d3b15fdd8e6f31c5a9f
只需将以上代码回滚即可获取一个复现的 Demo 代码,然而 Demo 不是最简的,且似乎我也没有能够构建出最简的
偶现触摸面积丢失测试
在 X11 里面使用 dotnet 学习 CPF 框架笔记 了解 X11 里如何获取触摸信息 博客提到的方法获取触摸宽度高度信息时,偶尔会出现拿不到 Abs MT Touch Major 和 Abs MT Touch Minor 的信息
详细请参阅 记 X11 里面触摸的一些行为
更多博客
原文链接: http://blog.lindexi.com/post/dotnet-C-X11-%E5%BC%80%E5%8F%91%E7%AC%94%E8%AE%B0
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。 欢迎转载、使用、重新发布,但务必保留文章署名 林德熙 (包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我 联系。