Ejemplo n.º 1
0
        private unsafe int HandleSDLEvent(IntPtr userdata, IntPtr ptr)
        {
            SDL_Event *e = (SDL_Event *)ptr;

            switch (e->type)
            {
            case SDL.SDL_EventType.SDL_AUDIODEVICEADDED:
                Console.WriteLine("AUDIO ADDED: {0}", e->adevice.which);

                break;

            case SDL.SDL_EventType.SDL_AUDIODEVICEREMOVED:
                Console.WriteLine("AUDIO REMOVED: {0}", e->adevice.which);

                break;


            case SDL.SDL_EventType.SDL_WINDOWEVENT:

                switch (e->window.windowEvent)
                {
                case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_ENTER:
                    Mouse.MouseInWindow = true;

                    break;

                case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_LEAVE:
                    Mouse.MouseInWindow = false;

                    break;

                case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_GAINED:
                    Plugin.OnFocusGained();

                    break;

                case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_LOST:
                    Plugin.OnFocusLost();

                    break;
                }

                break;

            case SDL.SDL_EventType.SDL_KEYDOWN:

                Keyboard.OnKeyDown(e->key);

                if (Plugin.ProcessHotkeys((int)e->key.keysym.sym, (int)e->key.keysym.mod, true))
                {
                    _ignoreNextTextInput = false;
                    UIManager.KeyboardFocusControl?.InvokeKeyDown(e->key.keysym.sym, e->key.keysym.mod);

                    _scene.OnKeyDown(e->key);
                }
                else
                {
                    _ignoreNextTextInput = true;
                }

                break;

            case SDL.SDL_EventType.SDL_KEYUP:

                Keyboard.OnKeyUp(e->key);
                UIManager.KeyboardFocusControl?.InvokeKeyUp(e->key.keysym.sym, e->key.keysym.mod);
                _scene.OnKeyUp(e->key);
                Plugin.ProcessHotkeys(0, 0, false);

                if (e->key.keysym.sym == SDL_Keycode.SDLK_PRINTSCREEN)
                {
                    string path = Path.Combine(FileSystemHelper.CreateFolderIfNotExists(CUOEnviroment.ExecutablePath, "Data", "Client", "Screenshots"), $"screenshot_{DateTime.Now:yyyy-MM-dd_hh-mm-ss}.png");

                    using (Stream stream = File.Create(path))
                    {
                        _buffer.SaveAsPng(stream, _buffer.Width, _buffer.Height);

                        GameActions.Print($"Screenshot stored in: {path}", 0x44, MessageType.System);
                    }
                }

                break;

            case SDL.SDL_EventType.SDL_TEXTINPUT:

                if (_ignoreNextTextInput)
                {
                    break;
                }

                string s = StringHelper.ReadUTF8(e->text.text);

                if (!string.IsNullOrEmpty(s))
                {
                    UIManager.KeyboardFocusControl?.InvokeTextInput(s);
                    _scene.OnTextInput(s);
                }
                break;

            case SDL.SDL_EventType.SDL_MOUSEMOTION:
                Mouse.Update();

                if (Mouse.IsDragging)
                {
                    UIManager.OnMouseDragging();
                    _scene.OnMouseDragging();
                }

                if (Mouse.IsDragging && !_dragStarted)
                {
                    _dragStarted = true;
                }

                break;

            case SDL.SDL_EventType.SDL_MOUSEWHEEL:
                Mouse.Update();
                bool isup = e->wheel.y > 0;

                Plugin.ProcessMouse(0, e->wheel.y);

                UIManager.OnMouseWheel(isup);
                _scene.OnMouseWheel(isup);

                break;

            case SDL.SDL_EventType.SDL_MOUSEBUTTONUP:
            case SDL.SDL_EventType.SDL_MOUSEBUTTONDOWN:
                Mouse.Update();
                bool isDown = e->type == SDL.SDL_EventType.SDL_MOUSEBUTTONDOWN;

                if (_dragStarted && !isDown)
                {
                    _dragStarted = false;
                }

                SDL.SDL_MouseButtonEvent mouse = e->button;

                switch ((uint)mouse.button)
                {
                case SDL_BUTTON_LEFT:

                    if (isDown)
                    {
                        Mouse.Begin();
                        Mouse.LButtonPressed    = true;
                        Mouse.LDropPosition     = Mouse.Position;
                        Mouse.CancelDoubleClick = false;
                        uint ticks = Time.Ticks;

                        if (Mouse.LastLeftButtonClickTime + Mouse.MOUSE_DELAY_DOUBLE_CLICK >= ticks)
                        {
                            Mouse.LastLeftButtonClickTime = 0;

                            bool res = UIManager.ValidForDClick() ? UIManager.OnLeftMouseDoubleClick() : _scene.OnLeftMouseDoubleClick();

                            if (!res)
                            {
                                _scene.OnLeftMouseDown();
                                UIManager.OnLeftMouseButtonDown();
                            }
                            else
                            {
                                Mouse.LastLeftButtonClickTime = 0xFFFF_FFFF;
                            }

                            break;
                        }

                        _scene.OnLeftMouseDown();
                        UIManager.OnLeftMouseButtonDown();

                        Mouse.LastLeftButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks;
                    }
                    else
                    {
                        if (Mouse.LastLeftButtonClickTime != 0xFFFF_FFFF)
                        {
                            if (!UIManager.HadMouseDownOnGump(MouseButtonType.Left))
                            {
                                _scene.OnLeftMouseUp();
                            }
                            UIManager.OnLeftMouseButtonUp();
                        }
                        Mouse.LButtonPressed = false;
                        Mouse.End();
                    }

                    break;

                case SDL_BUTTON_MIDDLE:

                    if (isDown)
                    {
                        Mouse.Begin();
                        Mouse.MButtonPressed    = true;
                        Mouse.MDropPosition     = Mouse.Position;
                        Mouse.CancelDoubleClick = false;
                        uint ticks = Time.Ticks;

                        if (Mouse.LastMidButtonClickTime + Mouse.MOUSE_DELAY_DOUBLE_CLICK >= ticks)
                        {
                            Mouse.LastMidButtonClickTime = 0;

                            if (!_scene.OnMiddleMouseDoubleClick())
                            {
                                _scene.OnMiddleMouseDown();
                                UIManager.OnMiddleMouseButtonDown();
                            }

                            break;
                        }

                        Plugin.ProcessMouse(e->button.button, 0);

                        _scene.OnMiddleMouseDown();
                        UIManager.OnMiddleMouseButtonDown();

                        Mouse.LastMidButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks;
                    }
                    else
                    {
                        if (Mouse.LastMidButtonClickTime != 0xFFFF_FFFF)
                        {
                            if (!UIManager.HadMouseDownOnGump(MouseButtonType.Middle))
                            {
                                _scene.OnMiddleMouseUp();
                            }
                            UIManager.OnMiddleMouseButtonUp();
                        }

                        Mouse.MButtonPressed = false;
                        Mouse.End();
                    }

                    break;

                case SDL_BUTTON_RIGHT:

                    if (isDown)
                    {
                        Mouse.Begin();
                        Mouse.RButtonPressed    = true;
                        Mouse.RDropPosition     = Mouse.Position;
                        Mouse.CancelDoubleClick = false;
                        uint ticks = Time.Ticks;

                        if (Mouse.LastRightButtonClickTime + Mouse.MOUSE_DELAY_DOUBLE_CLICK >= ticks)
                        {
                            Mouse.LastRightButtonClickTime = 0;

                            bool res = _scene.OnRightMouseDoubleClick() || UIManager.OnRightMouseDoubleClick();

                            if (!res)
                            {
                                _scene.OnRightMouseDown();
                                UIManager.OnRightMouseButtonDown();
                            }
                            else
                            {
                                Mouse.LastRightButtonClickTime = 0xFFFF_FFFF;
                            }

                            break;
                        }

                        _scene.OnRightMouseDown();
                        UIManager.OnRightMouseButtonDown();

                        Mouse.LastRightButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks;
                    }
                    else
                    {
                        if (Mouse.LastRightButtonClickTime != 0xFFFF_FFFF)
                        {
                            if (!UIManager.HadMouseDownOnGump(MouseButtonType.Right))
                            {
                                _scene.OnRightMouseUp();
                            }
                            UIManager.OnRightMouseButtonUp();
                        }
                        Mouse.RButtonPressed = false;
                        Mouse.End();
                    }

                    break;

                case SDL_BUTTON_X1:
                case SDL_BUTTON_X2:
                    if (isDown)
                    {
                        Mouse.Begin();
                        Mouse.XButtonPressed    = true;
                        Mouse.CancelDoubleClick = false;
                        Plugin.ProcessMouse(e->button.button, 0);
                        _scene.OnExtraMouseDown(mouse.button - 1);
                        UIManager.OnExtraMouseButtonDown(mouse.button - 1);
                    }
                    else
                    {
                        if (!UIManager.HadMouseDownOnGump(MouseButtonType.XButton1) && !UIManager.HadMouseDownOnGump(MouseButtonType.XButton2))
                        {
                            _scene.OnExtraMouseUp(mouse.button - 1);
                        }
                        UIManager.OnExtraMouseButtonUp(mouse.button - 1);

                        Mouse.XButtonPressed = false;
                        Mouse.End();
                    }

                    break;
                }

                break;
            }

            return(0);
        }
Ejemplo n.º 2
0
        private void SimulateMouse(bool leftMouseDown, bool leftMouseHeld, bool leftMouseUp, bool rightMouseDown, bool rightMouseHeld, bool rightMouseUp, bool mouseMotion)
        {
            Mouse.LButtonPressed = leftMouseDown || leftMouseHeld;
            Mouse.RButtonPressed = rightMouseDown || rightMouseHeld;
            Mouse.IsDragging     = Mouse.LButtonPressed || Mouse.RButtonPressed;
            Mouse.RealPosition   = Mouse.Position;

            if (_dragStarted && !Mouse.LButtonPressed)
            {
                _dragStarted = false;
            }

            if (leftMouseDown)
            {
                Mouse.Begin();
                Mouse.LDropPosition     = Mouse.Position;
                Mouse.CancelDoubleClick = false;
                uint ticks = Time.Ticks;
                if (Mouse.LastLeftButtonClickTime + Mouse.MOUSE_DELAY_DOUBLE_CLICK >= ticks)
                {
                    Mouse.LastLeftButtonClickTime = 0;

                    bool res = _scene.OnLeftMouseDoubleClick() || UIManager.OnLeftMouseDoubleClick();

                    if (!res)
                    {
                        if (!_scene.OnLeftMouseDown())
                        {
                            UIManager.OnLeftMouseButtonDown();
                        }
                    }
                    else
                    {
                        Mouse.LastLeftButtonClickTime = 0xFFFF_FFFF;
                    }
                }
                else
                {
                    if (!_scene.OnLeftMouseDown())
                    {
                        UIManager.OnLeftMouseButtonDown();
                    }
                    Mouse.LastLeftButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks;
                }
            }
            else if (leftMouseUp)
            {
                if (Mouse.LastLeftButtonClickTime != 0xFFFF_FFFF)
                {
                    if (!_scene.OnLeftMouseUp() || UIManager.LastControlMouseDown(MouseButtonType.Left) != null)
                    {
                        UIManager.OnLeftMouseButtonUp();
                    }
                }

                Mouse.End();
            }

            if (rightMouseDown)
            {
                Mouse.Begin();
                Mouse.RDropPosition     = Mouse.Position;
                Mouse.CancelDoubleClick = false;
                uint ticks = Time.Ticks;

                if (Mouse.LastRightButtonClickTime + Mouse.MOUSE_DELAY_DOUBLE_CLICK >= ticks)
                {
                    Mouse.LastRightButtonClickTime = 0;

                    bool res = _scene.OnRightMouseDoubleClick() || UIManager.OnRightMouseDoubleClick();

                    if (!res)
                    {
                        if (!_scene.OnRightMouseDown())
                        {
                            UIManager.OnRightMouseButtonDown();
                        }
                    }
                    else
                    {
                        Mouse.LastRightButtonClickTime = 0xFFFF_FFFF;
                    }
                }
                else
                {
                    if (!_scene.OnRightMouseDown())
                    {
                        UIManager.OnRightMouseButtonDown();
                    }
                    Mouse.LastRightButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks;
                }
            }
            else if (rightMouseUp)
            {
                if (Mouse.LastRightButtonClickTime != 0xFFFF_FFFF)
                {
                    if (!_scene.OnRightMouseUp())
                    {
                        UIManager.OnRightMouseButtonUp();
                    }
                }

                Mouse.End();
            }

            if (mouseMotion)
            {
                if (Mouse.IsDragging)
                {
                    if (!_scene.OnMouseDragging())
                    {
                        UIManager.OnMouseDragging();
                    }
                }

                if (Mouse.IsDragging && !_dragStarted)
                {
                    _dragStarted = true;
                }
            }
        }
        private void UnityInputUpdate()
        {
            //Mouse handling
            var oneOverScale = 1f / scale;

            Mouse.Position.X   = UnityEngine.Mathf.RoundToInt(UnityEngine.Input.mousePosition.x * oneOverScale);
            Mouse.Position.Y   = UnityEngine.Mathf.RoundToInt((UnityEngine.Screen.height - UnityEngine.Input.mousePosition.y) * oneOverScale);
            Mouse.RealPosition = Mouse.Position;

            var leftMouseDown = UnityEngine.Input.GetMouseButtonDown(0);
            var leftMouseHeld = UnityEngine.Input.GetMouseButton(0);
            var leftMouseUp   = UnityEngine.Input.GetMouseButtonUp(0);

            var rightMouseDown = UnityEngine.Input.GetMouseButtonDown(1);
            var rightMouseHeld = UnityEngine.Input.GetMouseButton(1);
            var rightMouseUp   = UnityEngine.Input.GetMouseButtonUp(1);

            if (MouseOverGui)
            {
                Mouse.Position.X = 0;
                Mouse.Position.Y = 0;
                leftMouseDown    = false;
                leftMouseHeld    = false;
                leftMouseUp      = false;
                rightMouseDown   = false;
                rightMouseHeld   = false;
                rightMouseUp     = false;
            }

            Mouse.LButtonPressed = leftMouseDown || leftMouseHeld;
            Mouse.RButtonPressed = rightMouseDown || rightMouseHeld;
            Mouse.MButtonPressed = UnityEngine.Input.GetMouseButtonDown(2) || UnityEngine.Input.GetMouseButton(2);

            Mouse.IsDragging   = Mouse.LButtonPressed || Mouse.RButtonPressed || Mouse.MButtonPressed;
            Mouse.RealPosition = Mouse.Position;

            //Added additional check for mouseWasDown because otherwise, on mobile, tapping somewhere would immediately
            //set mouseMotion to true since the previous tap position was almost guaranteed to be at another position
            //due to input inaccuracy. We do not want a new tap to be recognized as a mouseMotion.
            var mouseMotion = UnityEngine.Input.mousePosition != lastMousePosition && mouseWasDown;

            lastMousePosition = UnityEngine.Input.mousePosition;

            if (_dragStarted && !Mouse.LButtonPressed)
            {
                _dragStarted = false;
            }

            if (leftMouseDown)
            {
                mouseWasDown = true;
                Mouse.Begin();
                Mouse.LDropPosition     = Mouse.Position;
                Mouse.CancelDoubleClick = false;
                uint ticks = Time.Ticks;
                if (Mouse.LastLeftButtonClickTime + Mouse.MOUSE_DELAY_DOUBLE_CLICK >= ticks)
                {
                    Mouse.LastLeftButtonClickTime = 0;

                    bool res = UIManager.ValidForDClick() ? UIManager.OnLeftMouseDoubleClick() : _scene.OnLeftMouseDoubleClick();

                    if (!res)
                    {
                        _scene.OnLeftMouseDown();
                        UIManager.OnLeftMouseButtonDown();
                    }
                    else
                    {
                        Mouse.LastLeftButtonClickTime = 0xFFFF_FFFF;
                    }
                }
                else
                {
                    _scene.OnLeftMouseDown();
                    UIManager.OnLeftMouseButtonDown();
                    Mouse.LastLeftButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks;
                }
            }
            else if (leftMouseUp)
            {
                mouseWasDown = false;
                if (Mouse.LastLeftButtonClickTime != 0xFFFF_FFFF)
                {
                    if (!UIManager.HadMouseDownOnGump(MouseButtonType.Left))
                    {
                        _scene.OnLeftMouseUp();
                    }
                    UIManager.OnLeftMouseButtonUp();
                }
                Mouse.End();
            }

            if (rightMouseDown)
            {
                Mouse.Begin();
                Mouse.RDropPosition     = Mouse.Position;
                Mouse.CancelDoubleClick = false;
                uint ticks = Time.Ticks;

                if (Mouse.LastRightButtonClickTime + Mouse.MOUSE_DELAY_DOUBLE_CLICK >= ticks)
                {
                    Mouse.LastRightButtonClickTime = 0;

                    bool res = _scene.OnRightMouseDoubleClick() || UIManager.OnRightMouseDoubleClick();

                    if (!res)
                    {
                        _scene.OnRightMouseDown();
                        UIManager.OnRightMouseButtonDown();
                    }
                    else
                    {
                        Mouse.LastRightButtonClickTime = 0xFFFF_FFFF;
                    }
                }
                else
                {
                    _scene.OnRightMouseDown();
                    UIManager.OnRightMouseButtonDown();
                    Mouse.LastRightButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks;
                }
            }
            else if (rightMouseUp)
            {
                if (Mouse.LastRightButtonClickTime != 0xFFFF_FFFF)
                {
                    if (!UIManager.HadMouseDownOnGump(MouseButtonType.Right))
                    {
                        _scene.OnRightMouseUp();
                    }
                    UIManager.OnRightMouseButtonUp();
                }
                Mouse.End();
            }

            if (mouseMotion)
            {
                if (Mouse.IsDragging)
                {
                    UIManager.OnMouseDragging();
                    _scene.OnMouseDragging();
                }

                if (Mouse.IsDragging && !_dragStarted)
                {
                    _dragStarted = true;
                }
            }

            //Keyboard handling

            var keymod = SDL.SDL_Keymod.KMOD_NONE;

            if (UnityEngine.Input.GetKey(UnityEngine.KeyCode.LeftAlt))
            {
                keymod |= SDL_Keymod.KMOD_LALT;
            }
            if (UnityEngine.Input.GetKey(UnityEngine.KeyCode.RightAlt))
            {
                keymod |= SDL_Keymod.KMOD_RALT;
            }
            if (UnityEngine.Input.GetKey(UnityEngine.KeyCode.LeftShift))
            {
                keymod |= SDL_Keymod.KMOD_LSHIFT;
            }
            if (UnityEngine.Input.GetKey(UnityEngine.KeyCode.RightShift))
            {
                keymod |= SDL_Keymod.KMOD_RSHIFT;
            }
            if (UnityEngine.Input.GetKey(UnityEngine.KeyCode.LeftControl))
            {
                keymod |= SDL_Keymod.KMOD_LCTRL;
            }
            if (UnityEngine.Input.GetKey(UnityEngine.KeyCode.RightControl))
            {
                keymod |= SDL_Keymod.KMOD_RCTRL;
            }
            foreach (var keyCode in _keyCodeEnumValues)
            {
                if (UnityEngine.Input.GetKeyDown(keyCode))
                {
                    var key = new SDL_KeyboardEvent()
                    {
                        keysym = new SDL_Keysym()
                        {
                            sym = (SDL_Keycode)keyCode, mod = keymod
                        }
                    };
                    Keyboard.OnKeyDown(key);

                    if (Plugin.ProcessHotkeys((int)key.keysym.sym, (int)key.keysym.mod, true))
                    {
                        _ignoreNextTextInput = false;

                        //UIManager.MouseOverControl?.InvokeKeyDown(e.key.keysym.sym, e.key.keysym.mod);
                        //if (UIManager.MouseOverControl != UIManager.KeyboardFocusControl)
                        UIManager.KeyboardFocusControl?.InvokeKeyDown(key.keysym.sym, key.keysym.mod);

                        _scene.OnKeyDown(key);
                    }
                    else
                    {
                        _ignoreNextTextInput = true;
                    }
                }
                if (UnityEngine.Input.GetKeyUp(keyCode))
                {
                    var key = new SDL_KeyboardEvent()
                    {
                        keysym = new SDL_Keysym()
                        {
                            sym = (SDL_Keycode)keyCode
                        }
                    };
                    Keyboard.OnKeyUp(key);
                    UIManager.KeyboardFocusControl?.InvokeKeyUp(key.keysym.sym, key.keysym.mod);
                    _scene.OnKeyUp(key);
                }
            }

            //Input text handling
            if (UnityEngine.Application.isMobilePlatform)
            {
                var text = TouchScreenKeyboard?.text;
                if (_ignoreNextTextInput == false && string.IsNullOrEmpty(text) == false && TouchScreenKeyboard?.status == UnityEngine.TouchScreenKeyboard.Status.Done)
                {
                    //Need to clear the existing text in textbox before "pasting" new text from TouchScreenKeyboard
                    if (UIManager.KeyboardFocusControl is AbstractTextBox abstractTextBox)
                    {
                        abstractTextBox.EntryValue.Clear();
                    }

                    UIManager.KeyboardFocusControl?.InvokeTextInput(text);
                    _scene.OnTextInput(text);

                    //When targeting SystemChat textbox, "auto-press" return key so that the text entered on the TouchScreenKeyboard is submitted right away
                    if (UIManager.KeyboardFocusControl != null && UIManager.KeyboardFocusControl == UIManager.SystemChat?.TextBoxControl)
                    {
                        UIManager.KeyboardFocusControl.InvokeKeyDown(SDL_Keycode.SDLK_RETURN, SDL_Keymod.KMOD_NONE);
                    }

                    //Clear the text of TouchScreenKeyboard, otherwise it stays there and is re-evaluated every frame
                    TouchScreenKeyboard.text = string.Empty;
                }
            }
            else
            {
                var text = UnityEngine.Input.inputString;
                if (_ignoreNextTextInput == false && string.IsNullOrEmpty(text) == false)
                {
                    UIManager.KeyboardFocusControl?.InvokeTextInput(text);
                    _scene.OnTextInput(text);
                }
            }
        }
Ejemplo n.º 4
0
        private unsafe void HandleSDLEvent(ref SDL.SDL_Event e)
        {
            switch (e.type)
            {
            case SDL.SDL_EventType.SDL_AUDIODEVICEADDED:
                Console.WriteLine("AUDIO ADDED: {0}", e.adevice.which);

                break;

            case SDL.SDL_EventType.SDL_AUDIODEVICEREMOVED:
                Console.WriteLine("AUDIO REMOVED: {0}", e.adevice.which);

                break;


            case SDL.SDL_EventType.SDL_WINDOWEVENT:

                switch (e.window.windowEvent)
                {
                case SDL_WindowEventID.SDL_WINDOWEVENT_MOVED:


                    break;

                case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_ENTER:
                    Mouse.MouseInWindow = true;

                    break;

                case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_LEAVE:
                    Mouse.MouseInWindow = false;

                    break;

                case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_GAINED:
                    Plugin.OnFocusGained();

                    // SDL_CaptureMouse(SDL_bool.SDL_TRUE);
                    //Log.Debug("FOCUS");
                    break;

                case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_LOST:
                    Plugin.OnFocusLost();
                    //Log.Debug("NO FOCUS");
                    //SDL_CaptureMouse(SDL_bool.SDL_FALSE);

                    break;

                case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_TAKE_FOCUS:

                    //Log.Debug("TAKE FOCUS");
                    break;

                case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_HIT_TEST:

                    break;
                }

                break;

            case SDL.SDL_EventType.SDL_SYSWMEVENT:

                break;

            case SDL.SDL_EventType.SDL_KEYDOWN:

                Keyboard.OnKeyDown(e.key);

                if (Plugin.ProcessHotkeys((int)e.key.keysym.sym, (int)e.key.keysym.mod, true))
                {
                    _ignoreNextTextInput = false;

                    //UIManager.MouseOverControl?.InvokeKeyDown(e.key.keysym.sym, e.key.keysym.mod);
                    //if (UIManager.MouseOverControl != UIManager.KeyboardFocusControl)
                    UIManager.KeyboardFocusControl?.InvokeKeyDown(e.key.keysym.sym, e.key.keysym.mod);

                    _scene.OnKeyDown(e.key);
                }
                else
                {
                    _ignoreNextTextInput = true;
                }

                break;

            case SDL.SDL_EventType.SDL_KEYUP:

                Keyboard.OnKeyUp(e.key);

                //if (e.key.keysym.sym == SDL_Keycode.SDLK_0)
                //{


                //    byte[] firebreathcode = {

                //   0xC0,
                //  0x00, 0x00, 0x00, 0x00 , // source serial
                //  0x00 ,0x00 ,0x00 , 0x00,  // target serial
                //    0x00, 0xAA,  // graphic
                //    0xAC, 0x06, // src X
                //    0x74, 0x06,  // src Y
                //    0x28,       // src Z
                //   0x3F, 0x06, // targ X
                //    0x74, 0x06, // targY
                //        0x2B,   // targZ
                //        0x3F, 0x01, 0xF0 , 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ,0x00, 0x00,
                //   0x00, 0x00, 0x00, 0x00,
                //    };
                //    int xx =  (0x06 << 8) | (0xAC ) ;
                //    int yy =  (0x06 << 8) | (0x74 ) ;
                //    int txx = (0x06 << 8) |  (0x3F);
                //    int tyy = (0x06 << 8) | (0x74 );

                //    NetClient.EnqueuePacketFromPlugin(firebreathcode, 36);
                //}

                //UIManager.MouseOverControl?.InvokeKeyUp(e.key.keysym.sym, e.key.keysym.mod);
                //if (UIManager.MouseOverControl != UIManager.KeyboardFocusControl)
                UIManager.KeyboardFocusControl?.InvokeKeyUp(e.key.keysym.sym, e.key.keysym.mod);

                _scene.OnKeyUp(e.key);

                break;

            case SDL.SDL_EventType.SDL_TEXTINPUT:

                if (_ignoreNextTextInput)
                    break;

                fixed(SDL.SDL_Event *ev = &e)
                {
                    string s = StringHelper.ReadUTF8(ev->text.text);

                    if (!string.IsNullOrEmpty(s))
                    {
                        UIManager.KeyboardFocusControl?.InvokeTextInput(s);
                        _scene.OnTextInput(s);
                    }
                }

                break;

            case SDL.SDL_EventType.SDL_MOUSEMOTION:
                Mouse.Update();

                if (Mouse.IsDragging)
                {
                    UIManager.OnMouseDragging();
                    _scene.OnMouseDragging();
                }

                if (Mouse.IsDragging && !_dragStarted)
                {
                    _dragStarted = true;
                }

                break;

            case SDL.SDL_EventType.SDL_MOUSEWHEEL:
                Mouse.Update();
                bool isup = e.wheel.y > 0;

                Plugin.ProcessMouse(0, e.wheel.y);

                UIManager.OnMouseWheel(isup);
                _scene.OnMouseWheel(isup);

                break;

            case SDL.SDL_EventType.SDL_MOUSEBUTTONUP:
            case SDL.SDL_EventType.SDL_MOUSEBUTTONDOWN:
                Mouse.Update();
                bool isDown    = e.type == SDL.SDL_EventType.SDL_MOUSEBUTTONDOWN;
                bool resetTime = false;

                if (_dragStarted && !isDown)
                {
                    _dragStarted = false;
                    resetTime    = true;
                }

                SDL.SDL_MouseButtonEvent mouse = e.button;

                switch ((uint)mouse.button)
                {
                case SDL_BUTTON_LEFT:

                    if (isDown)
                    {
                        Mouse.Begin();
                        Mouse.LButtonPressed    = true;
                        Mouse.LDropPosition     = Mouse.Position;
                        Mouse.CancelDoubleClick = false;
                        uint ticks = SDL_GetTicks();

                        if (Mouse.LastLeftButtonClickTime + Mouse.MOUSE_DELAY_DOUBLE_CLICK >= ticks)
                        {
                            Mouse.LastLeftButtonClickTime = 0;
                            bool res;

                            if (UIManager.ValidForDClick())
                            {
                                res = UIManager.OnLeftMouseDoubleClick();
                            }
                            else
                            {
                                res = _scene.OnLeftMouseDoubleClick();
                            }

                            //bool res = _scene.OnLeftMouseDoubleClick() || UIManager.OnLeftMouseDoubleClick();

                            MouseDoubleClickEventArgs arg = new MouseDoubleClickEventArgs(Mouse.Position.X, Mouse.Position.Y, MouseButton.Left);

                            if (!arg.Result && !res)
                            {
                                _scene.OnLeftMouseDown();
                                UIManager.OnLeftMouseButtonDown();
                            }
                            else
                            {
                                Mouse.LastLeftButtonClickTime = 0xFFFF_FFFF;
                            }

                            break;
                        }

                        _scene.OnLeftMouseDown();
                        UIManager.OnLeftMouseButtonDown();

                        Mouse.LastLeftButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks;
                    }
                    else
                    {
                        if (resetTime)
                        {
                            Mouse.LastLeftButtonClickTime = 0;
                        }

                        if (Mouse.LastLeftButtonClickTime != 0xFFFF_FFFF)
                        {
                            _scene.OnLeftMouseUp();
                            UIManager.OnLeftMouseButtonUp();
                        }
                        Mouse.LButtonPressed = false;
                        Mouse.End();

                        Mouse.LastClickPosition = Mouse.Position;
                    }

                    break;

                case SDL_BUTTON_MIDDLE:

                    if (isDown)
                    {
                        Mouse.Begin();
                        Mouse.MButtonPressed    = true;
                        Mouse.MDropPosition     = Mouse.Position;
                        Mouse.CancelDoubleClick = false;
                        uint ticks = SDL_GetTicks();

                        if (Mouse.LastMidButtonClickTime + Mouse.MOUSE_DELAY_DOUBLE_CLICK >= ticks)
                        {
                            Mouse.LastMidButtonClickTime = 0;
                            var res = _scene.OnMiddleMouseDoubleClick();

                            MouseDoubleClickEventArgs arg = new MouseDoubleClickEventArgs(Mouse.Position.X, Mouse.Position.Y, MouseButton.Middle);

                            if (!arg.Result && !res)
                            {
                                _scene.OnMiddleMouseDown();
                            }

                            break;
                        }

                        Plugin.ProcessMouse(e.button.button, 0);

                        _scene.OnMiddleMouseDown();
                        Mouse.LastMidButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks;
                    }
                    else
                    {
                        Mouse.MButtonPressed = false;
                        Mouse.End();
                    }

                    break;

                case SDL_BUTTON_RIGHT:

                    if (isDown)
                    {
                        Mouse.Begin();
                        Mouse.RButtonPressed    = true;
                        Mouse.RDropPosition     = Mouse.Position;
                        Mouse.CancelDoubleClick = false;
                        uint ticks = SDL_GetTicks();

                        if (Mouse.LastRightButtonClickTime + Mouse.MOUSE_DELAY_DOUBLE_CLICK >= ticks)
                        {
                            Mouse.LastRightButtonClickTime = 0;

                            var res = _scene.OnRightMouseDoubleClick() || UIManager.OnRightMouseDoubleClick();

                            MouseDoubleClickEventArgs arg = new MouseDoubleClickEventArgs(Mouse.Position.X, Mouse.Position.Y, MouseButton.Right);

                            if (!arg.Result && !res)
                            {
                                _scene.OnRightMouseDown();
                                UIManager.OnRightMouseButtonDown();
                            }
                            else
                            {
                                Mouse.LastRightButtonClickTime = 0xFFFF_FFFF;
                            }

                            break;
                        }

                        _scene.OnRightMouseDown();
                        UIManager.OnRightMouseButtonDown();

                        Mouse.LastRightButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks;
                    }
                    else
                    {
                        if (resetTime)
                        {
                            Mouse.LastRightButtonClickTime = 0;
                        }

                        if (Mouse.LastRightButtonClickTime != 0xFFFF_FFFF)
                        {
                            _scene.OnRightMouseUp();
                            UIManager.OnRightMouseButtonUp();
                        }
                        Mouse.RButtonPressed = false;
                        Mouse.End();
                    }

                    break;

                case SDL_BUTTON_X1:

                    if (isDown)
                    {
                        Plugin.ProcessMouse(e.button.button, 0);
                    }

                    break;

                case SDL_BUTTON_X2:

                    if (isDown)
                    {
                        Plugin.ProcessMouse(e.button.button, 0);
                    }

                    break;
                }

                break;
            }
        }
Ejemplo n.º 5
0
        private int HandleSdlEvent(IntPtr userData, IntPtr ptr)
        {
            SDL_Event *sdlEvent = (SDL_Event *)ptr;

            if (Plugin.ProcessWndProc(sdlEvent) != 0)
            {
                if (sdlEvent->type == SDL_EventType.SDL_MOUSEMOTION)
                {
                    if (UIManager.GameCursor != null)
                    {
                        UIManager.GameCursor.AllowDrawSDLCursor = false;
                    }
                }

                return(0);
            }

            switch (sdlEvent->type)
            {
            case SDL_EventType.SDL_AUDIODEVICEADDED:
                Console.WriteLine("AUDIO ADDED: {0}", sdlEvent->adevice.which);

                break;

            case SDL_EventType.SDL_AUDIODEVICEREMOVED:
                Console.WriteLine("AUDIO REMOVED: {0}", sdlEvent->adevice.which);

                break;

            case SDL_EventType.SDL_WINDOWEVENT:

                switch (sdlEvent->window.windowEvent)
                {
                case SDL_WindowEventID.SDL_WINDOWEVENT_ENTER:
                    Mouse.MouseInWindow = true;

                    break;

                case SDL_WindowEventID.SDL_WINDOWEVENT_LEAVE:
                    Mouse.MouseInWindow = false;

                    break;

                case SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_GAINED:
                    Plugin.OnFocusGained();

                    break;

                case SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_LOST:
                    Plugin.OnFocusLost();

                    break;
                }

                break;

            case SDL_EventType.SDL_KEYDOWN:

                Keyboard.OnKeyDown(sdlEvent->key);

                if (Plugin.ProcessHotkeys((int)sdlEvent->key.keysym.sym, (int)sdlEvent->key.keysym.mod, true))
                {
                    _ignoreNextTextInput = false;
                    UIManager.KeyboardFocusControl?.InvokeKeyDown(sdlEvent->key.keysym.sym, sdlEvent->key.keysym.mod);

                    Scene.OnKeyDown(sdlEvent->key);
                }
                else
                {
                    _ignoreNextTextInput = true;
                }

                break;

            case SDL_EventType.SDL_KEYUP:

                Keyboard.OnKeyUp(sdlEvent->key);
                UIManager.KeyboardFocusControl?.InvokeKeyUp(sdlEvent->key.keysym.sym, sdlEvent->key.keysym.mod);
                Scene.OnKeyUp(sdlEvent->key);
                Plugin.ProcessHotkeys(0, 0, false);

                if (sdlEvent->key.keysym.sym == SDL_Keycode.SDLK_PRINTSCREEN)
                {
                    TakeScreenshot();
                }

                break;

            case SDL_EventType.SDL_TEXTINPUT:

                if (_ignoreNextTextInput)
                {
                    break;
                }

                string s = StringHelper.ReadUTF8(sdlEvent->text.text);

                if (!string.IsNullOrEmpty(s))
                {
                    UIManager.KeyboardFocusControl?.InvokeTextInput(s);
                    Scene.OnTextInput(s);
                }

                break;

            case SDL_EventType.SDL_MOUSEMOTION:

                if (UIManager.GameCursor != null && !UIManager.GameCursor.AllowDrawSDLCursor)
                {
                    UIManager.GameCursor.AllowDrawSDLCursor = true;
                    UIManager.GameCursor.Graphic            = 0xFFFF;
                }

                Mouse.Update();

                if (Mouse.IsDragging)
                {
                    if (!Scene.OnMouseDragging())
                    {
                        UIManager.OnMouseDragging();
                    }
                }

                if (Mouse.IsDragging && !_dragStarted)
                {
                    _dragStarted = true;
                }

                break;

            case SDL_EventType.SDL_MOUSEWHEEL:
                Mouse.Update();
                bool isScrolledUp = sdlEvent->wheel.y > 0;

                Plugin.ProcessMouse(0, sdlEvent->wheel.y);

                if (!Scene.OnMouseWheel(isScrolledUp))
                {
                    UIManager.OnMouseWheel(isScrolledUp);
                }

                break;

            case SDL_EventType.SDL_MOUSEBUTTONUP:
            case SDL_EventType.SDL_MOUSEBUTTONDOWN:
                Mouse.Update();
                bool isDown = sdlEvent->type == SDL_EventType.SDL_MOUSEBUTTONDOWN;

                if (_dragStarted && !isDown)
                {
                    _dragStarted = false;
                }

                SDL_MouseButtonEvent mouse = sdlEvent->button;

                switch ((uint)mouse.button)
                {
                case SDL_BUTTON_LEFT:

                    if (isDown)
                    {
                        Mouse.Begin();
                        Mouse.LButtonPressed    = true;
                        Mouse.LDropPosition     = Mouse.Position;
                        Mouse.CancelDoubleClick = false;
                        uint ticks = Time.Ticks;

                        if (Mouse.LastLeftButtonClickTime + Mouse.MOUSE_DELAY_DOUBLE_CLICK >= ticks)
                        {
                            Mouse.LastLeftButtonClickTime = 0;

                            bool res = Scene.OnLeftMouseDoubleClick() || UIManager.OnLeftMouseDoubleClick();

                            if (!res)
                            {
                                if (!Scene.OnLeftMouseDown())
                                {
                                    UIManager.OnLeftMouseButtonDown();
                                }
                            }
                            else
                            {
                                Mouse.LastLeftButtonClickTime = 0xFFFF_FFFF;
                            }

                            break;
                        }

                        if (!Scene.OnLeftMouseDown())
                        {
                            UIManager.OnLeftMouseButtonDown();
                        }

                        Mouse.LastLeftButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks;
                    }
                    else
                    {
                        if (Mouse.LastLeftButtonClickTime != 0xFFFF_FFFF)
                        {
                            if (!Scene.OnLeftMouseUp() || UIManager.LastControlMouseDown(MouseButtonType.Left) != null)
                            {
                                UIManager.OnLeftMouseButtonUp();
                            }
                        }

                        Mouse.LButtonPressed = false;
                        Mouse.End();
                    }

                    break;

                case SDL_BUTTON_MIDDLE:

                    if (isDown)
                    {
                        Mouse.Begin();
                        Mouse.MButtonPressed    = true;
                        Mouse.MDropPosition     = Mouse.Position;
                        Mouse.CancelDoubleClick = false;
                        uint ticks = Time.Ticks;

                        if (Mouse.LastMidButtonClickTime + Mouse.MOUSE_DELAY_DOUBLE_CLICK >= ticks)
                        {
                            Mouse.LastMidButtonClickTime = 0;

                            bool res = Scene.OnMiddleMouseDoubleClick() || UIManager.OnMiddleMouseDoubleClick();

                            if (!res)
                            {
                                if (!Scene.OnMiddleMouseDown())
                                {
                                    UIManager.OnMiddleMouseButtonDown();
                                }
                            }
                            else
                            {
                                Mouse.LastMidButtonClickTime = 0xFFFF_FFFF;
                            }

                            break;
                        }

                        Plugin.ProcessMouse(sdlEvent->button.button, 0);

                        if (!Scene.OnMiddleMouseDown())
                        {
                            UIManager.OnMiddleMouseButtonDown();
                        }

                        Mouse.LastMidButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks;
                    }
                    else
                    {
                        if (Mouse.LastMidButtonClickTime != 0xFFFF_FFFF)
                        {
                            if (!Scene.OnMiddleMouseUp())
                            {
                                UIManager.OnMiddleMouseButtonUp();
                            }
                        }

                        Mouse.MButtonPressed = false;
                        Mouse.End();
                    }

                    break;

                case SDL_BUTTON_RIGHT:

                    if (isDown)
                    {
                        Mouse.Begin();
                        Mouse.RButtonPressed    = true;
                        Mouse.RDropPosition     = Mouse.Position;
                        Mouse.CancelDoubleClick = false;
                        uint ticks = Time.Ticks;

                        if (Mouse.LastRightButtonClickTime + Mouse.MOUSE_DELAY_DOUBLE_CLICK >= ticks)
                        {
                            Mouse.LastRightButtonClickTime = 0;

                            bool res = Scene.OnRightMouseDoubleClick() || UIManager.OnRightMouseDoubleClick();

                            if (!res)
                            {
                                if (!Scene.OnRightMouseDown())
                                {
                                    UIManager.OnRightMouseButtonDown();
                                }
                            }
                            else
                            {
                                Mouse.LastRightButtonClickTime = 0xFFFF_FFFF;
                            }

                            break;
                        }

                        if (!Scene.OnRightMouseDown())
                        {
                            UIManager.OnRightMouseButtonDown();
                        }

                        Mouse.LastRightButtonClickTime = Mouse.CancelDoubleClick ? 0 : ticks;
                    }
                    else
                    {
                        if (Mouse.LastRightButtonClickTime != 0xFFFF_FFFF)
                        {
                            if (!Scene.OnRightMouseUp())
                            {
                                UIManager.OnRightMouseButtonUp();
                            }
                        }

                        Mouse.RButtonPressed = false;
                        Mouse.End();
                    }

                    break;

                case SDL_BUTTON_X1:
                case SDL_BUTTON_X2:
                    if (isDown)
                    {
                        Mouse.Begin();
                        Mouse.XButtonPressed    = true;
                        Mouse.CancelDoubleClick = false;
                        Plugin.ProcessMouse(sdlEvent->button.button, 0);

                        if (!Scene.OnExtraMouseDown(mouse.button - 1))
                        {
                            UIManager.OnExtraMouseButtonDown(mouse.button - 1);
                        }

                        // TODO: doubleclick?
                    }
                    else
                    {
                        if (!Scene.OnExtraMouseUp(mouse.button - 1))
                        {
                            UIManager.OnExtraMouseButtonUp(mouse.button - 1);
                        }

                        Mouse.XButtonPressed = false;
                        Mouse.End();
                    }

                    break;
                }

                break;
            }

            return(0);
        }