public int Run() { IntPtr ev = Marshal.AllocHGlobal(24 * sizeof(long)); Window ReturnedParent = 0, ReturnedRoot = 0; Xlib.XGrabServer(this.display); // Lock the server during initialization var r = Xlib.XQueryTree(this.display, this.root, ref ReturnedRoot, ref ReturnedParent, out var ChildWindows); Log.Debug($"Reparenting and framing pre-existing child windows: {ChildWindows.Count}"); for (var i = 0; i < ChildWindows.Count; i++) { Log.Debug($"Framing child {i}, {ChildWindows[i]}"); AddFrame(ChildWindows[i]); } Xlib.XUngrabServer(this.display); // Release the lock on the server. while (true) { Xlib.XNextEvent(this.display, ev); var xevent = Marshal.PtrToStructure <X11.XAnyEvent>(ev); switch (xevent.type) { case (int)Event.DestroyNotify: var destroy_event = Marshal.PtrToStructure <X11.XDestroyWindowEvent>(ev); OnDestroyNotify(destroy_event); break; case (int)Event.CreateNotify: var create_event = Marshal.PtrToStructure <X11.XCreateWindowEvent>(ev); OnCreateNotify(create_event); break; case (int)Event.MapNotify: var map_notify = Marshal.PtrToStructure <X11.XMapEvent>(ev); OnMapNotify(map_notify); break; case (int)Event.MapRequest: var map_event = Marshal.PtrToStructure <X11.XMapRequestEvent>(ev); OnMapRequest(map_event); break; case (int)Event.ConfigureRequest: var cfg_event = Marshal.PtrToStructure <X11.XConfigureRequestEvent>(ev); OnConfigureRequest(cfg_event); break; case (int)Event.UnmapNotify: var unmap_event = Marshal.PtrToStructure <X11.XUnmapEvent>(ev); OnUnmapNotify(unmap_event); break; case (int)Event.ReparentNotify: var reparent_event = Marshal.PtrToStructure <X11.XReparentEvent>(ev); OnReparentNotify(reparent_event); break; case (int)Event.ButtonPress: var button_press_event = Marshal.PtrToStructure <X11.XButtonEvent>(ev); OnButtonPressEvent(button_press_event); break; case (int)Event.ButtonRelease: this.MouseMovement = null; break; case (int)Event.MotionNotify: // We only want the newest motion event in order to reduce perceived lag while (Xlib.XCheckMaskEvent(this.display, EventMask.Button1MotionMask, ev)) /* skip over */ } { var motion_event = Marshal.PtrToStructure <X11.XMotionEvent>(ev); OnMotionEvent(motion_event); break;