学习 Avalonia 框架笔记 设置 X11 窗口从最小化状态还原为正常状态

news/2024/11/20 6:36:03/文章来源:https://www.cnblogs.com/lindexi/p/18197087

本文记录在 dotnet 里面如何设置 X11 窗口从最小化状态还原为正常状态

本文属于学习 Avalonia 框架系列笔记,更多请参阅 博客导航

核心设置方法如下

/// <summary>
/// 代码从 Avalonia 抄的 https://github.com/AvaloniaUI/Avalonia/blob/5e323b8fb1e2ca36550ca6fe678e487ff936d8bf/src/Avalonia.X11/X11Window.cs#L692
/// </summary>
unsafe class X11Window
{public X11Window(IntPtr windowHandle, IntPtr display, IntPtr rootWindow){Display = display;RootWindow = rootWindow;_handle = windowHandle;}private readonly IntPtr _handle;public IntPtr Display { get; }public IntPtr RootWindow { get; }//private bool _mapped;private IntPtr _NET_WM_STATE => XInternAtom(Display, "_NET_WM_STATE", true);public void SetNormal(){ChangeWMAtoms(false, GetAtom("_NET_WM_STATE_HIDDEN"));ChangeWMAtoms(false, GetAtom("_NET_WM_STATE_FULLSCREEN"));ChangeWMAtoms(false, GetAtom("_NET_WM_STATE_MAXIMIZED_VERT"),GetAtom("_NET_WM_STATE_MAXIMIZED_HORZ"));SendNetWMMessage(GetAtom("_NET_ACTIVE_WINDOW"), (IntPtr) 1, 0,IntPtr.Zero);IntPtr GetAtom(string name) => XInternAtom(Display, name, true);}private void ChangeWMAtoms(bool enable, params IntPtr[] atoms){if (atoms.Length != 1 && atoms.Length != 2){throw new ArgumentException();}//if (!_mapped)//{//    XGetWindowProperty(Display, _handle, _NET_WM_STATE, IntPtr.Zero, new IntPtr(256),//        false, (IntPtr) Atom.XA_ATOM, out _, out _, out var nitems, out _,//        out var prop);//    var ptr = (IntPtr*) prop.ToPointer();//    var newAtoms = new HashSet<IntPtr>();//    for (var c = 0; c < nitems.ToInt64(); c++)//    {//        newAtoms.Add(*ptr);//    }//    XFree(prop);//    foreach (var atom in atoms)//    {//        if (enable)//        {//            newAtoms.Add(atom);//        }//        else//        {//            newAtoms.Remove(atom);//        }//    }//    XChangeProperty(Display, _handle, _NET_WM_STATE, (IntPtr) Atom.XA_ATOM, 32,//        PropertyMode.Replace, newAtoms.ToArray(), newAtoms.Count);//}SendNetWMMessage(_NET_WM_STATE,(IntPtr) (enable ? 1 : 0),atoms[0],atoms.Length > 1 ? atoms[1] : IntPtr.Zero,atoms.Length > 2 ? atoms[2] : IntPtr.Zero,atoms.Length > 3 ? atoms[3] : IntPtr.Zero);}private void SendNetWMMessage(IntPtr message_type, IntPtr l0,IntPtr? l1 = null, IntPtr? l2 = null, IntPtr? l3 = null, IntPtr? l4 = null){var xev = new XEvent{ClientMessageEvent ={type = XEventName.ClientMessage,send_event = true,window = _handle,message_type = message_type,format = 32,ptr1 = l0,ptr2 = l1 ?? IntPtr.Zero,ptr3 = l2 ?? IntPtr.Zero,ptr4 = l3 ?? IntPtr.Zero}};xev.ClientMessageEvent.ptr4 = l4 ?? IntPtr.Zero;XSendEvent(Display, RootWindow, false,new IntPtr((int) (EventMask.SubstructureRedirectMask | EventMask.SubstructureNotifyMask)), ref xev);}
}

以上代码没有定义的函数和局部变量等,可以在本文末尾找到完全的代码

为了测试其行为,我额外编写了一些 C# 代码,不断设置让 X11 窗口最小化和还原到正常状态

async Task InvokeAsync(Action action)
{var taskCompletionSource = new TaskCompletionSource();lock (invokeList){invokeList.Add(() =>{action();taskCompletionSource.SetResult();});}// 在 Avalonia 里面,是通过循环读取的方式,通过 XPending 判断是否有消息// 如果没有消息就进入自旋判断是否有业务消息和判断是否有 XPending 消息// 核心使用 epoll_wait 进行等待// 整个逻辑比较复杂// 这里简单处理,只通过发送 ClientMessage 的方式,告诉消息循环需要处理业务逻辑// 发送 ClientMessage 是一个合理的方式,根据官方文档说明,可以看到这是没有明确定义的// https://www.x.org/releases/X11R7.5/doc/man/man3/XClientMessageEvent.3.html// The X server places no interpretation on the values in the window, message_type, or data members.// 在 cpf 里面,和 Avalonia 实现差不多,也是在判断 XPending 是否有消息,没消息则判断是否有业务逻辑// 最后再进入等待逻辑。似乎 CPF 这样的方式会导致 CPU 占用略微提升var @event = new XEvent{ClientMessageEvent ={type = XEventName.ClientMessage,send_event = true,window = handle,message_type = 0,format = 32,ptr1 = invokeMessageId,ptr2 = 0,ptr3 = 0,ptr4 = 0,}};XSendEvent(display, handle, false, 0, ref @event);XFlush(display);await taskCompletionSource.Task;
}_ = Task.Run(async () =>
{var x11Window = new X11Window(handle, display, rootWindow);while (true){await Task.Delay(TimeSpan.FromSeconds(3));await InvokeAsync(() =>{var result = XIconifyWindow(display, handle, screen);});await Task.Delay(TimeSpan.FromSeconds(2));await InvokeAsync(() =>{x11Window.SetNormal();});}
});

以上代码放在 github 和 gitee 上,可以使用如下命令行拉取代码

先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 0a1cb0ac238bd809c17059cfa57bcb9528b79c72

以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码,将 gitee 源换成 github 源进行拉取代码

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 0a1cb0ac238bd809c17059cfa57bcb9528b79c72

获取代码之后,进入 DikalehebeekaJaqunicobo 文件夹,即可获取到源代码

设置 X11 窗口最小化的方法请看 dotnet 后台线程设置 X11 窗口最小化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/707579.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[转帖]全网最硬核 JVM 内存解析 - 4.Java 堆内存大小的确认

https://cloud.tencent.com/developer/article/2277323 个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判。如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 issue,谢谢支持~…

[转帖]System Performance 读书笔记 - 操作系统(1)

https://cloud.tencent.com/developer/article/1927381 本系列是针对 Systems Performance: Enterprise and the Cloud, 2nd Edition (2020) 书籍的读书笔记,加入了一些个人理解以及拓展,并且针对一些难以理解的地方提供了一些额外的参考内核(Kernel) 经典模型中,内核在操…

读人工智能时代与人类未来笔记05_现代人工智能

读人工智能时代与人类未来笔记05_现代人工智能1. 图灵 1.1. 1950年,数学家和逻辑学家艾伦图灵的论文《计算机与智能》中,图灵建议把机器智能的问题完全搁置 1.2. 图灵认为,重要的不是智能的机制,而是智能的表现 1.2.1. 因为其他生命的内在体验仍然是不可知的,所以我们衡量…

[转帖]为什么我建议需要定期重建数据量大但是性能关键的表

https://cloud.tencent.com/developer/article/1999970 个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判。如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 issue,谢谢支持~…

尽微好物:从0到10亿+的抖音电商的TOP1“联盟团长”,如何使用NineData实现上云下云

杭州尽微供应链是抖⾳平台⽉均带货10E的TOP1“联盟团⻓”&#xff0c;是字节跳动⼀级代理商&#xff0c;巨量千川指定服务商&#xff0c;拥有商品库9万&#xff0c;是⾏业领先的电商供应链平台&#xff0c;达⼈陪跑机构。 杭州尽微供应链以天猫、京东抖音电商业务为依托&#x…

论文解读:Self-Promoted Supervision for Few-Shot Transformer

文章汇总 存在的问题 在没有归纳偏差的情况下&#xff0c;vit通常在只有少数标记训练数据可用的few-shot学习机制下学习低质量令牌依赖关系&#xff0c;这在很大程度上导致了上述性能下降。 动机 cnn的归纳偏置并不天生就适用于vit&#xff0c;也不能很好地增强和加速vit中…

Signal 即将成为JavaScript的一部分

什么是响应性&#xff1f; 在过去的几年中&#xff0c;响应性成为了所有现代前端框架以及React库的核心。 对于不熟悉前端开发的人来说&#xff0c;起初这可能是一个令人困惑的概念&#xff0c;因为它改变了常规的、自上而下的、从调用者到被调用者的顺序工作流。 在响应性范…

最近很火的粘土滤镜被玩坏了,教你用AI绘画SD免费无限制使用,附教程!

大家好&#xff0c;我是阿威。 最近在小红书上&#xff0c;“粘土特效”、“粘土滤镜”异常爆火&#xff0c;被网友玩出了花。 原来&#xff0c;一款海外修图工具——Remini&#xff08;类似妙鸭相机&#xff09;上线AI滤镜功能&#xff0c;其中就包括粘土滤镜&#xff0c;非常…

Adobe After Effects AE v24.3.0 解锁版 (视频合成及视频特效制作)

Adobe系列软件安装目录 一、Adobe Photoshop PS 25.6.0 解锁版 (最流行的图像设计软件) 二、Adobe Media Encoder ME v24.3.0 解锁版 (视频和音频编码渲染工具) 三、Adobe Premiere Pro v24.3.0 解锁版 (领先的视频编辑软件) 四、Adobe After Effects AE v24.3.0 解锁版 (视…

【线程创建】——三种方式➕多线程案例练习

02 线程创建 Thread , Runnable , Callable 三种创建方式 Thread class - 继承Thread类 (重点) Runnable接口 - 实现Runnable接口 (重点) Callable接口 - 实现Callable接口 (了解) Thread 类实现 它继承了老祖宗 Object java.lang.Object java.lang.Thread 它实现了 Runnab…

centOS忘记密码的处理办法

1、开机后在出现内核选项时&#xff0c;按 e&#xff1b; 2、在Linux 开头的这行&#xff0c;输入 rd.break 如下图&#xff1b; 3、然后&#xff0c;执行&#xff1a;CtrlX&#xff1b; 4、进入之后是 switch_root:/#输入 mount -o rw,remount /sysroot 以读写方式重新挂载 /s…

镊子蜡烛如何设置止盈止损?Anzo Capital昂首资本盈利收场

通过上一篇文章各位聪明的投资者&#xff0c;都已经知道了什么是镊子蜡烛图以及如何抓住反转进行交易&#xff0c;同时也有很多投资者不知道如何设置止盈止损&#xff1f;今天Anzo Capital昂首资本就和各位投资者一起探讨如何盈利收场。 看跌的镊子模式如何交易&#xff1f;首…