本文记录我在麒麟 Kylin 的 X11 应用开发过程的经验
系统版本信息
本文面向的麒麟系统版本信息如下:
$ cat /etc/os-releaseNAME="Kylin"VERSION="银河麒麟桌面操作系统(教育版)V10"VERSION_US="Kylin Linux Desktop EDU V10"ID=kylinID_LIKE=debianPRETTY_NAME="Kylin V10 SP1"VERSION_ID="v10"HOME_URL="http://www.kylinos.cn/"SUPPORT_URL="http://www.kylinos.cn/support/technology.html"BUG_REPORT_URL="http://www.kylinos.cn/"PRIVACY_POLICY_URL="http://www.kylinos.cn"VERSION_CODENAME=kylinUBUNTU_CODENAME=kylinPROJECT_CODENAME=V10SP1-General-EduKYLIN_RELEASE_ID="2403"
系统为从麒麟拿到的系统,没有经过什么更改。如无特殊说明,本文均采用此系统版本
读取麒麟系统的各项版本信息
图标在任务栏上
不能在 MapWindow 之后,通过发送 ClientMessage 消息的方式,通过 _NET_WM_STATE_SKIP_TASKBAR
设置应用不在任务栏显示图标
必须要在 MapWindow 之前完成 _NET_WM_STATE_SKIP_TASKBAR
的设置。由于在窗口 Map 之前调用,不能利用桌面管理器辅助设置,需要通过 XChangeProperty 进行设置
在麒麟系统让图标不在任务栏上显示的方法如下
var _NET_WM_STATE_SKIP_TASKBAR = XInternAtom(Display, "_NET_WM_STATE_SKIP_TASKBAR", false); ChangeWMAtomsByXChangeProperty(true, _NET_WM_STATE_SKIP_TASKBAR);
XMapWindow(Display, Window); XFlush(Display);
private unsafe void ChangeWMAtomsByXChangeProperty(bool enable, params IntPtr[] atoms) { var wmState = XInternAtom(Display, "_NET_WM_STATE", true); XGetWindowProperty(Display, Window, wmState, 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); ptr++; }
XFree(prop); foreach (var atom in atoms) { if (enable) { newAtoms.Add(atom); } else { newAtoms.Remove(atom); } }
XChangeProperty(Display, Window, wmState, (IntPtr) Atom.XA_ATOM, 32, PropertyMode.Replace, newAtoms.ToArray(), newAtoms.Count); }
以上的 ChangeWMAtomsByXChangeProperty 方法的实现是从 Avalonia 里面抄的,且是经过 walterlv 在 https://github.com/AvaloniaUI/Avalonia/pull/16110 修复之后的代码
拦截问题
记 Kylin 麒麟系统安全中心拦截导致 dotnet sdk 找不到 OpenSsl 构建失败
dotnet 记龙芯麒麟教育版安全中心拦截文件 导致 docker 内 CI CD 构建失败
更多相关博客
更多国产化相关开发博客,请参阅 博客导航

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。 欢迎转载、使用、重新发布,但务必保留文章署名 林德熙 (包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我 联系。