dotnet 麒麟 Kylin 的 X11 應用開發記錄

lindexi發表於2024-11-26

系統版本資訊

本文面向的麒麟系統版本資訊如下:

$ 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 構建失敗

更多相關部落格

  • dotnet 8 版本與銀河麒麟V10和UOS系統的 glibc 相容性

更多國產化相關開發部落格,請參閱 部落格導航

相關文章