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); } }