using System;
using System.Runtime.InteropServices;

 public class X11CursorHider
{
    const string X11Lib = "libX11.so";

    [DllImport(X11Lib)]
    static extern IntPtr XOpenDisplay(IntPtr display);

    [DllImport(X11Lib)]
    static extern int XCloseDisplay(IntPtr display);

    [DllImport(X11Lib)]
    static extern IntPtr XCreatePixmap(IntPtr display, IntPtr drawable, uint width, uint height, uint depth);

    [DllImport(X11Lib)]
    static extern IntPtr XCreateBitmapFromData(IntPtr display, IntPtr drawable, byte[] data, uint width, uint height);

    [DllImport(X11Lib)]
    static extern IntPtr XCreatePixmapCursor(IntPtr display, IntPtr source, IntPtr mask, ref XColor foreground, ref XColor background, uint x, uint y);

    [DllImport(X11Lib)]
    static extern int XDefineCursor(IntPtr display, IntPtr window, IntPtr cursor);

    [DllImport(X11Lib)]
    static extern int XFreeCursor(IntPtr display, IntPtr cursor);

    [DllImport(X11Lib)]
    static extern int XFlush(IntPtr display);

    [DllImport(X11Lib)]
    static extern IntPtr XDefaultRootWindow(IntPtr display);

    [StructLayout(LayoutKind.Sequential)]
    struct XColor
    {
        public ulong pixel;
        public ushort red, green, blue;
        public byte flags;
        public byte pad;
    }

    public static void HideCursor()
    {
        IntPtr display = XOpenDisplay(IntPtr.Zero);
        if (display == IntPtr.Zero)
        {
            Console.WriteLine("Cannot open X display");
            return;
        }

        IntPtr root = XDefaultRootWindow(display);

        byte[] emptyData = new byte[1] { 0 }; // 1x1 empty bitmap
        IntPtr pixmap = XCreateBitmapFromData(display, root, emptyData, 1, 1);

        XColor dummy = new XColor();

        IntPtr invisibleCursor = XCreatePixmapCursor(display, pixmap, pixmap, ref dummy, ref dummy, 0, 0);

        XDefineCursor(display, root, invisibleCursor);
        XFlush(display);

        // Keep the cursor hidden until app closes, remember to call:
        // XFreeCursor(display, invisibleCursor);
        // XCloseDisplay(display);
    }
}
