本文记录我在麒麟 Kylin 的 X11 应用开发过程的经验

系统版本信息

本文面向的麒麟系统版本信息如下:

$ cat /etc/os-release
NAME="Kylin"
VERSION="银河麒麟桌面操作系统(教育版)V10"
VERSION_US="Kylin Linux Desktop EDU V10"
ID=kylin
ID_LIKE=debian
PRETTY_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=kylin
UBUNTU_CODENAME=kylin
PROJECT_CODENAME=V10SP1-General-Edu
KYLIN_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 构建失败

更多相关博客

更多国产化相关开发博客,请参阅 博客导航


本文会经常更新,请阅读原文: https://blog.lindexi.com/post/dotnet-%E9%BA%92%E9%BA%9F-Kylin-%E7%9A%84-X11-%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E8%AE%B0%E5%BD%95.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

如果你想持续阅读我的最新博客,请点击 RSS 订阅,推荐使用RSS Stalker订阅博客,或者收藏我的博客导航

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

微软最具价值专家


无盈利,不卖课,做纯粹的技术博客

以下是广告时间

推荐关注 Edi.Wang 的公众号

欢迎进入 Eleven 老师组建的 .NET 社区

以上广告全是友情推广,无盈利