Ejemplo n.º 1
0
        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;