Exemplo n.º 1
0
    private FilterReturn ManagerFilter(IntPtr xevent, Event evnt)
    {
        XAnyEvent xev = (XAnyEvent)Marshal.PtrToStructure(xevent, typeof(XAnyEvent));

        if (xev.type == XEventName.ClientMessage)
        {
            XClientMessageEvent xclient = (XClientMessageEvent)Marshal.PtrToStructure(xevent, typeof(XClientMessageEvent));

            if (xclient.message_type == manager_atom && xclient.data.ptr2 == selection_atom)
            {
                UpdateManagerWindow(true);
                return(FilterReturn.Continue);
            }
        }

        if (xev.window == manager_window)
        {
            if (xev.type == XEventName.PropertyNotify)
            {
                XPropertyEvent xproperty = (XPropertyEvent)Marshal.PtrToStructure(xevent, typeof(XPropertyEvent));
                if (xproperty.atom == orientation_atom)
                {
                    GetOrientationProperty();
                    return(FilterReturn.Continue);
                }
            }

            if (xev.type == XEventName.DestroyNotify)
            {
                ManagerWindowDestroyed();
            }
        }

        return(FilterReturn.Continue);
    }
Exemplo n.º 2
0
 public static extern void XNextEvent(IntPtr display, out XAnyEvent event_return);
Exemplo n.º 3
0
        public override void EnterMessageLoop(bool runInBackground)
        {
            IntPtr e       = System.Runtime.InteropServices.Marshal.AllocHGlobal(24 * sizeof(long));
            bool   running = true;

            while (running)
            {
                while (XPending(_display) != 0)
                {
                    XNextEvent(_display, e);

                    if (XFilterEvent(e, IntPtr.Zero))
                    {
                        continue;
                    }

                    XAnyEvent anyEvent = (XAnyEvent)System.Runtime.InteropServices.Marshal.PtrToStructure(e, typeof(XAnyEvent));

                    switch ((Event)anyEvent.type)
                    {
                    case Event.ClientMessage:
                    {
                        running = false;
                        break;
                    }

                    case Event.ConfigureNotify:
                    {
                        XConfigureEvent configureEvent = (XConfigureEvent)System.Runtime.InteropServices.Marshal.PtrToStructure(e, typeof(XConfigureEvent));

                        LocationChanged?.Invoke(this, configureEvent.x, configureEvent.y);
                        SizeChanged?.Invoke(this, configureEvent.width, configureEvent.height);
                        break;
                    }

                    case Event.FocusIn:
                    {
                        Activated?.Invoke(this);
                        break;
                    }

                    case Event.FocusOut:
                    {
                        Deactivated?.Invoke(this);
                        break;
                    }

                    case Event.MotionNotify:
                    {
                        XMotionEvent motionEvent = (XMotionEvent)System.Runtime.InteropServices.Marshal.PtrToStructure(e, typeof(XMotionEvent));
                        MouseMove?.Invoke(this, motionEvent.x, motionEvent.y);
                        break;
                    }

                    case Event.ButtonPress:
                    {
                        XButtonEvent buttonEvent = (XButtonEvent)System.Runtime.InteropServices.Marshal.PtrToStructure(e, typeof(XButtonEvent));

                        switch ((Button)buttonEvent.button)
                        {
                        case Button.Button1:
                        {
                            MouseButtonDown?.Invoke(this, buttonEvent.x, buttonEvent.y, MouseButton.Left);
                            break;
                        }

                        case Button.Button2:
                        {
                            MouseButtonDown?.Invoke(this, buttonEvent.x, buttonEvent.y, MouseButton.Middle);
                            break;
                        }

                        case Button.Button3:
                        {
                            MouseButtonDown?.Invoke(this, buttonEvent.x, buttonEvent.y, MouseButton.Right);
                            break;
                        }

                        case Button.Button4:
                        {
                            MouseWheel?.Invoke(this, buttonEvent.x, buttonEvent.y, 120);
                            break;
                        }

                        case Button.Button5:
                        {
                            MouseWheel?.Invoke(this, buttonEvent.x, buttonEvent.y, -120);
                            break;
                        }
                        }
                        break;
                    }

                    case Event.ButtonRelease:
                    {
                        XButtonEvent buttonEvent = (XButtonEvent)System.Runtime.InteropServices.Marshal.PtrToStructure(e, typeof(XButtonEvent));

                        switch ((Button)buttonEvent.button)
                        {
                        case Button.Button1:
                        {
                            MouseButtonUp?.Invoke(this, buttonEvent.x, buttonEvent.y, MouseButton.Left);
                            break;
                        }

                        case Button.Button2:
                        {
                            MouseButtonUp?.Invoke(this, buttonEvent.x, buttonEvent.y, MouseButton.Middle);
                            break;
                        }

                        case Button.Button3:
                        {
                            MouseButtonUp?.Invoke(this, buttonEvent.x, buttonEvent.y, MouseButton.Right);
                            break;
                        }
                        }
                        break;
                    }

                    case Event.KeyPress:
                    {
                        XKeyEvent keyEvent = (XKeyEvent)System.Runtime.InteropServices.Marshal.PtrToStructure(e, typeof(XKeyEvent));
                        KeySym    ks       = XLookupKeysym(ref keyEvent, 0);
                        Key       key      = NoesisKey(ks);
                        if (key != Key.None)
                        {
                            KeyDown?.Invoke(this, key);
                        }

                        if (_xic != IntPtr.Zero)
                        {
                            Status status = 0;
                            byte[] buffer = new byte[256];
                            KeySym ret_ks = (KeySym)0;
                            int    size   = Xutf8LookupString(_xic, e, buffer, 255, ref ret_ks, ref status);
                            if (size > 0 && ((int)status == XLookupChars || (int)status == XLookupBoth))
                            {
                                buffer[size] = 0;
                                Decoder decoder   = _utf8.GetDecoder();
                                char[]  text      = new char[256];
                                int     bytesUsed = 0;
                                int     charsUsed = 0;
                                bool    completed = false;
                                decoder.Convert(buffer, 0, size, text, 0, 255, true, out bytesUsed, out charsUsed, out completed);
                                for (int i = 0; i < charsUsed; ++i)
                                {
                                    Char?.Invoke(this, text[i]);
                                }
                            }
                        }
                        break;
                    }

                    case Event.KeyRelease:
                    {
                        XKeyEvent keyEvent = (XKeyEvent)System.Runtime.InteropServices.Marshal.PtrToStructure(e, typeof(XKeyEvent));
                        KeySym    ks       = XLookupKeysym(ref keyEvent, 0);
                        Key       key      = NoesisKey(ks);
                        if (key != Key.None)
                        {
                            KeyUp?.Invoke(this, key);
                        }
                        break;
                    }
                    }
                }

                Render?.Invoke(this);
            }
            System.Runtime.InteropServices.Marshal.FreeHGlobal(e);
        }
        public RCode HandleSystemEvent()
        {
            while (Xlib.XPending(display) > 0)
            {
                Xlib.XNextEvent(display, ev);
                XAnyEvent xevent = Marshal.PtrToStructure <XAnyEvent>(ev);

                switch (xevent.type)
                {
                case (int)Event.ClientMessage:
                    XClientMessageEvent xClientMessageEvent = Marshal.PtrToStructure <XClientMessageEvent>(ev);
                    if (xClientMessageEvent.data == (IntPtr)deleteWindowMessage)
                    {
                        PixelGameEngine.Instance.Terminate();
                    }
                    break;

                case (int)Event.KeyPress:
                case (int)Event.KeyRelease:
                    XKeyEvent xKeyEvent = Marshal.PtrToStructure <XKeyEvent>(ev);
                    KeySym    sym       = XlibExt.XLookupKeysym(new XKeyEvent[] { xKeyEvent }, 0);
                    pge.Input.UpdateKeyState((int)mapKeys[(long)sym], xevent.type == (int)Event.KeyPress);
                    break;

                case (int)Event.ButtonPress:
                case (int)Event.ButtonRelease:
                    XButtonEvent xButtonEvent = Marshal.PtrToStructure <XButtonEvent>(ev);
                    bool         pressed      = xevent.type == (int)Event.ButtonPress;

                    switch (xButtonEvent.button)
                    {
                    case 1:
                    case 2:
                    case 3:
                        pge.Input.UpdateMouseState((int)xButtonEvent.button - 1, pressed);
                        break;

                    case 4:
                        pge.Input.UpdateMouseWheel(120);
                        break;

                    case 5:
                        pge.Input.UpdateMouseWheel(-120);
                        break;

                    case 6:
                    case 7:
                    case 8:
                    case 9:
                        pge.Input.UpdateMouseState((int)xButtonEvent.button - 3, pressed);
                        break;
                    }
                    break;

                case (int)Event.MotionNotify:
                    XMotionEvent xMotionEvent = Marshal.PtrToStructure <XMotionEvent>(ev);
                    pge.Input.UpdateMouse(xMotionEvent.x, xMotionEvent.y);
                    break;

                case (int)Event.EnterNotify:
                    pge.Input.UpdateMouseFocus(true);
                    break;

                case (int)Event.LeaveNotify:
                    pge.Input.UpdateMouseFocus(false);
                    break;

                case (int)Event.FocusIn:
                    pge.Input.UpdateKeyFocus(true);
                    break;

                case (int)Event.FocusOut:
                    pge.Input.UpdateKeyFocus(false);
                    break;
                }
            }
            return(RCode.OK);
        }