Пример #1
0
		public void PumpInput(IInputHandler inputHandler)
		{
			var mods = MakeModifiers((int)SDL.SDL_GetModState());
			var scrollDelta = 0;
			inputHandler.ModifierKeys(mods);
			MouseInput? pendingMotion = null;

			SDL.SDL_Event e;
			while (SDL.SDL_PollEvent(out e) != 0)
			{
				switch (e.type)
				{
					case SDL.SDL_EventType.SDL_QUIT:
						Game.Exit();
						break;

					case SDL.SDL_EventType.SDL_WINDOWEVENT:
					{
						switch (e.window.windowEvent)
						{
							case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_LOST:
								Game.HasInputFocus = false;
								break;

							case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_GAINED:
								Game.HasInputFocus = true;
								break;
						}

						break;
					}

					case SDL.SDL_EventType.SDL_MOUSEBUTTONDOWN:
					{
						if (pendingMotion != null)
						{
							inputHandler.OnMouseInput(pendingMotion.Value);
							pendingMotion = null;
						}

						var button = MakeButton(e.button.button);
						lastButtonBits |= button;

						var pos = new int2(e.button.x, e.button.y);

						inputHandler.OnMouseInput(new MouseInput(
							MouseInputEvent.Down, button, scrollDelta, pos, mods,
							MultiTapDetection.DetectFromMouse(e.button.button, pos)));

						break;
					}

					case SDL.SDL_EventType.SDL_MOUSEBUTTONUP:
					{
						if (pendingMotion != null)
						{
							inputHandler.OnMouseInput(pendingMotion.Value);
							pendingMotion = null;
						}

						var button = MakeButton(e.button.button);
						lastButtonBits &= ~button;

						var pos = new int2(e.button.x, e.button.y);
						inputHandler.OnMouseInput(new MouseInput(
							MouseInputEvent.Up, button, scrollDelta, pos, mods,
							MultiTapDetection.InfoFromMouse(e.button.button)));

						break;
					}

					case SDL.SDL_EventType.SDL_MOUSEMOTION:
					{
						pendingMotion = new MouseInput(
							MouseInputEvent.Move, lastButtonBits, scrollDelta,
							new int2(e.motion.x, e.motion.y), mods, 0);

						break;
					}

					case SDL.SDL_EventType.SDL_MOUSEWHEEL:
					{
						int x, y;
						SDL.SDL_GetMouseState(out x, out y);
						scrollDelta = e.wheel.y;
						inputHandler.OnMouseInput(new MouseInput(MouseInputEvent.Scroll, MouseButton.None, scrollDelta, new int2(x, y), Modifiers.None, 0));

						break;
					}

					case SDL.SDL_EventType.SDL_TEXTINPUT:
					{
						string input;
						unsafe
						{
							var data = new byte[SDL.SDL_TEXTINPUTEVENT_TEXT_SIZE];
							var i = 0;
							for (; i < SDL.SDL_TEXTINPUTEVENT_TEXT_SIZE; i++)
							{
								var b = e.text.text[i];
								if (b == '\0')
									break;

								data[i] = b;
							}

							input = Encoding.UTF8.GetString(data, 0, i);
						}

						inputHandler.OnTextInput(input);
						break;
					}

					case SDL.SDL_EventType.SDL_KEYDOWN:
					case SDL.SDL_EventType.SDL_KEYUP:
					{
						var keyCode = (Keycode)e.key.keysym.sym;
						var type = e.type == SDL.SDL_EventType.SDL_KEYDOWN ?
							KeyInputEvent.Down : KeyInputEvent.Up;

						var tapCount = e.type == SDL.SDL_EventType.SDL_KEYDOWN ?
							MultiTapDetection.DetectFromKeyboard(keyCode) :
							MultiTapDetection.InfoFromKeyboard(keyCode);

						var keyEvent = new KeyInput
						{
							Event = type,
							Key = keyCode,
							Modifiers = mods,
							UnicodeChar = (char)e.key.keysym.sym,
							MultiTapCount = tapCount
						};

						// Special case workaround for windows users
						if (e.key.keysym.sym == SDL.SDL_Keycode.SDLK_F4 && mods.HasModifier(Modifiers.Alt) &&
							Platform.CurrentPlatform == PlatformType.Windows)
							Game.Exit();
						else
							inputHandler.OnKeyInput(keyEvent);

						break;
					}
				}
			}

			if (pendingMotion != null)
			{
				inputHandler.OnMouseInput(pendingMotion.Value);
				pendingMotion = null;
			}

			ErrorHandler.CheckGlError();
		}
Пример #2
0
        public void PumpInput(IInputHandler inputHandler)
        {
            Game.HasInputFocus = 0 != (Sdl.SDL_GetAppState() & Sdl.SDL_APPINPUTFOCUS);

            var mods = MakeModifiers(Sdl.SDL_GetModState());
            inputHandler.ModifierKeys(mods);
            MouseInput? pendingMotion = null;

            Sdl.SDL_Event e;
            while (Sdl.SDL_PollEvent(out e) != 0)
            {
                switch (e.type)
                {
                case Sdl.SDL_QUIT:
                    OpenRA.Game.Exit();
                    break;

                case Sdl.SDL_MOUSEBUTTONDOWN:
                    {
                        if (pendingMotion != null)
                        {
                            inputHandler.OnMouseInput(pendingMotion.Value);
                            pendingMotion = null;
                        }

                        var button = MakeButton(e.button.button);
                        lastButtonBits |= button;

                        var pos = new int2(e.button.x, e.button.y);

                        inputHandler.OnMouseInput(new MouseInput(
                            MouseInputEvent.Down, button, pos, mods,
                            MultiTapDetection.DetectFromMouse(e.button.button, pos)));

                        break;
                    }

                case Sdl.SDL_MOUSEBUTTONUP:
                    {
                        if (pendingMotion != null)
                        {
                            inputHandler.OnMouseInput(pendingMotion.Value);
                            pendingMotion = null;
                        }

                        var button = MakeButton(e.button.button);
                        lastButtonBits &= ~button;

                        var pos = new int2(e.button.x, e.button.y);
                        inputHandler.OnMouseInput(new MouseInput(
                            MouseInputEvent.Up, button, pos, mods,
                            MultiTapDetection.InfoFromMouse(e.button.button)));

                        break;
                    }

                case Sdl.SDL_MOUSEMOTION:
                    {
                        pendingMotion = new MouseInput(
                            MouseInputEvent.Move, lastButtonBits,
                            new int2(e.motion.x, e.motion.y), mods, 0);

                        break;
                    }

                case Sdl.SDL_KEYDOWN:
                    {
                        var keyName = Sdl.SDL_GetKeyName(e.key.keysym.sym);

                        var keyEvent = new KeyInput
                        {
                            Event = KeyInputEvent.Down,
                            Modifiers = mods,
                            UnicodeChar = (char)e.key.keysym.unicode,
                            KeyName = Sdl.SDL_GetKeyName(e.key.keysym.sym),
                            VirtKey = e.key.keysym.sym,
                            MultiTapCount = MultiTapDetection.DetectFromKeyboard(keyName)
                        };

                        // Special case workaround for windows users
                        if (e.key.keysym.sym == Sdl.SDLK_F4 && mods.HasModifier(Modifiers.Alt) &&
                            Platform.CurrentPlatform == PlatformType.Windows)
                        {
                            OpenRA.Game.Exit();
                        }
                        else
                            inputHandler.OnKeyInput(keyEvent);

                        break;
                    }

                case Sdl.SDL_KEYUP:
                    {
                        var keyName = Sdl.SDL_GetKeyName(e.key.keysym.sym);
                        var keyEvent = new KeyInput
                        {
                            Event = KeyInputEvent.Up,
                            Modifiers = mods,
                            UnicodeChar = (char)e.key.keysym.unicode,
                            KeyName = Sdl.SDL_GetKeyName(e.key.keysym.sym),
                            VirtKey = e.key.keysym.sym,
                            MultiTapCount = MultiTapDetection.InfoFromKeyboard(keyName)
                        };

                        inputHandler.OnKeyInput(keyEvent);
                        break;
                    }
                }
            }

            if (pendingMotion != null)
            {
                inputHandler.OnMouseInput(pendingMotion.Value);
                pendingMotion = null;
            }

            ErrorHandler.CheckGlError();
        }
Пример #3
0
        public void Present( IInputHandler inputHandler )
        {
            Sdl.SDL_GL_SwapBuffers();
            Game.HasInputFocus = 0 != ( Sdl.SDL_GetAppState() & Sdl.SDL_APPINPUTFOCUS );

            var mods = MakeModifiers( Sdl.SDL_GetModState() );
            inputHandler.ModifierKeys( mods );
            MouseInput? pendingMotion = null;

            Sdl.SDL_Event e;
            while( Sdl.SDL_PollEvent( out e ) != 0 )
            {
                switch( e.type )
                {
                case Sdl.SDL_QUIT:
                    OpenRA.Game.Exit();
                    break;

                case Sdl.SDL_MOUSEBUTTONDOWN:
                    {
                        if( pendingMotion != null )
                        {
                            inputHandler.OnMouseInput( pendingMotion.Value );
                            pendingMotion = null;
                        }

                        var button = MakeButton( e.button.button );
                        lastButtonBits |= button;

                        inputHandler.OnMouseInput( new MouseInput(
                            MouseInputEvent.Down, button, new int2( e.button.x, e.button.y ), mods ) );
                    } break;

                case Sdl.SDL_MOUSEBUTTONUP:
                    {
                        if( pendingMotion != null )
                        {
                            inputHandler.OnMouseInput( pendingMotion.Value );
                            pendingMotion = null;
                        }

                        var button = MakeButton( e.button.button );
                        lastButtonBits &= ~button;

                        inputHandler.OnMouseInput( new MouseInput(
                            MouseInputEvent.Up, button, new int2( e.button.x, e.button.y ), mods ) );
                    } break;

                case Sdl.SDL_MOUSEMOTION:
                    {
                        pendingMotion = new MouseInput(
                            MouseInputEvent.Move,
                            lastButtonBits,
                            new int2( e.motion.x, e.motion.y ),
                            mods );
                    } break;

                case Sdl.SDL_KEYDOWN:
                    {
                        var keyEvent = new KeyInput
                        {
                            Event = KeyInputEvent.Down,
                            Modifiers = mods,
                            UnicodeChar = (char)e.key.keysym.unicode,
                            KeyName = Sdl.SDL_GetKeyName( e.key.keysym.sym ),
                            VirtKey = e.key.keysym.sym
                        };

                        if( !HandleSpecialKey( keyEvent ) )
                            inputHandler.OnKeyInput( keyEvent );
                    } break;

                case Sdl.SDL_KEYUP:
                    {
                        var keyEvent = new KeyInput
                        {
                            Event = KeyInputEvent.Up,
                            Modifiers = mods,
                            UnicodeChar = (char)e.key.keysym.unicode,
                            KeyName = Sdl.SDL_GetKeyName( e.key.keysym.sym ),
                            VirtKey = e.key.keysym.sym
                        };

                        inputHandler.OnKeyInput( keyEvent );
                    } break;
                }
            }

            if( pendingMotion != null )
            {
                inputHandler.OnMouseInput( pendingMotion.Value );
                pendingMotion = null;
            }

            CheckGlError();
        }
Пример #4
0
        public void PumpInput(IInputHandler inputHandler)
        {
            var mods = MakeModifiers((int)SDL.SDL_GetModState());

            inputHandler.ModifierKeys(mods);
            MouseInput?pendingMotion = null;

            SDL.SDL_Event e;
            while (SDL.SDL_PollEvent(out e) != 0)
            {
                switch (e.type)
                {
                case SDL.SDL_EventType.SDL_QUIT:
                    Game.Exit();
                    break;

                case SDL.SDL_EventType.SDL_WINDOWEVENT:
                {
                    switch (e.window.windowEvent)
                    {
                    case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_LOST:
                        Game.HasInputFocus = false;
                        break;

                    case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_GAINED:
                        Game.HasInputFocus = true;
                        break;
                    }

                    break;
                }

                case SDL.SDL_EventType.SDL_MOUSEBUTTONDOWN:
                {
                    if (pendingMotion != null)
                    {
                        inputHandler.OnMouseInput(pendingMotion.Value);
                        pendingMotion = null;
                    }

                    var button = MakeButton(e.button.button);
                    lastButtonBits |= button;

                    var pos = new int2(e.button.x, e.button.y);

                    inputHandler.OnMouseInput(new MouseInput(
                                                  MouseInputEvent.Down, button, pos, mods,
                                                  MultiTapDetection.DetectFromMouse(e.button.button, pos)));

                    break;
                }

                case SDL.SDL_EventType.SDL_MOUSEBUTTONUP:
                {
                    if (pendingMotion != null)
                    {
                        inputHandler.OnMouseInput(pendingMotion.Value);
                        pendingMotion = null;
                    }

                    var button = MakeButton(e.button.button);
                    lastButtonBits &= ~button;

                    var pos = new int2(e.button.x, e.button.y);
                    inputHandler.OnMouseInput(new MouseInput(
                                                  MouseInputEvent.Up, button, pos, mods,
                                                  MultiTapDetection.InfoFromMouse(e.button.button)));

                    break;
                }

                case SDL.SDL_EventType.SDL_MOUSEMOTION:
                {
                    pendingMotion = new MouseInput(
                        MouseInputEvent.Move, lastButtonBits,
                        new int2(e.motion.x, e.motion.y), mods, 0);

                    break;
                }

                case SDL.SDL_EventType.SDL_MOUSEWHEEL:
                {
                    // Retain compatibility with existing bogus behavior
                    // TODO: Implement real scroll behavior after we drop SDL 1.2 support
                    if (e.wheel.y == 0)
                    {
                        break;
                    }

                    int x, y;
                    SDL.SDL_GetMouseState(out x, out y);
                    var button = e.wheel.y < 0 ? MouseButton.WheelDown : MouseButton.WheelUp;
                    inputHandler.OnMouseInput(new MouseInput(MouseInputEvent.Down, button, new int2(x, y), Modifiers.None, 0));

                    break;
                }

                case SDL.SDL_EventType.SDL_TEXTINPUT:
                {
                    string input;
                    unsafe
                    {
                        var data = new byte[SDL.SDL_TEXTINPUTEVENT_TEXT_SIZE];
                        var i    = 0;
                        for (; i < SDL.SDL_TEXTINPUTEVENT_TEXT_SIZE; i++)
                        {
                            var b = e.text.text[i];
                            if (b == '\0')
                            {
                                break;
                            }

                            data[i] = b;
                        }

                        input = Encoding.UTF8.GetString(data, 0, i);
                    }

                    inputHandler.OnTextInput(input);
                    break;
                }

                case SDL.SDL_EventType.SDL_KEYDOWN:
                case SDL.SDL_EventType.SDL_KEYUP:
                {
                    var keyCode = (Keycode)e.key.keysym.sym;
                    var type    = e.type == SDL.SDL_EventType.SDL_KEYDOWN ?
                                  KeyInputEvent.Down : KeyInputEvent.Up;

                    var tapCount = e.type == SDL.SDL_EventType.SDL_KEYDOWN ?
                                   MultiTapDetection.DetectFromKeyboard(keyCode) :
                                   MultiTapDetection.InfoFromKeyboard(keyCode);

                    var keyEvent = new KeyInput
                    {
                        Event         = type,
                        Key           = keyCode,
                        Modifiers     = mods,
                        UnicodeChar   = (char)e.key.keysym.sym,
                        MultiTapCount = tapCount
                    };

                    // Special case workaround for windows users
                    if (e.key.keysym.sym == SDL.SDL_Keycode.SDLK_F4 && mods.HasModifier(Modifiers.Alt) &&
                        Platform.CurrentPlatform == PlatformType.Windows)
                    {
                        Game.Exit();
                    }
                    else
                    {
                        inputHandler.OnKeyInput(keyEvent);
                    }

                    break;
                }
                }
            }

            if (pendingMotion != null)
            {
                inputHandler.OnMouseInput(pendingMotion.Value);
                pendingMotion = null;
            }

            ErrorHandler.CheckGlError();
        }
Пример #5
0
        public void PumpInput(IInputHandler inputHandler)
        {
            var mods        = MakeModifiers((int)SDL.SDL_GetModState());
            var scrollDelta = 0;

            inputHandler.ModifierKeys(mods);
            MouseInput?pendingMotion = null;

            SDL.SDL_Event e;
            while (SDL.SDL_PollEvent(out e) != 0)
            {
                switch (e.type)
                {
                case SDL.SDL_EventType.SDL_QUIT:
                    Game.Exit();
                    break;

                case SDL.SDL_EventType.SDL_WINDOWEVENT:
                {
                    switch (e.window.windowEvent)
                    {
                    case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_LOST:
                        Game.HasInputFocus = false;
                        break;

                    case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_GAINED:
                        Game.HasInputFocus = true;
                        break;
                    }

                    break;
                }

                case SDL.SDL_EventType.SDL_MOUSEBUTTONDOWN:
                {
                    if (pendingMotion != null)
                    {
                        inputHandler.OnMouseInput(pendingMotion.Value);
                        pendingMotion = null;
                    }

                    var button = MakeButton(e.button.button);
                    lastButtonBits |= button;

                    var pos = new int2(e.button.x, e.button.y);

                    inputHandler.OnMouseInput(new MouseInput(
                                                  MouseInputEvent.Down, button, scrollDelta, pos, mods,
                                                  MultiTapDetection.DetectFromMouse(e.button.button, pos)));

                    break;
                }

                case SDL.SDL_EventType.SDL_MOUSEBUTTONUP:
                {
                    if (pendingMotion != null)
                    {
                        inputHandler.OnMouseInput(pendingMotion.Value);
                        pendingMotion = null;
                    }

                    var button = MakeButton(e.button.button);
                    lastButtonBits &= ~button;

                    var pos = new int2(e.button.x, e.button.y);
                    inputHandler.OnMouseInput(new MouseInput(
                                                  MouseInputEvent.Up, button, scrollDelta, pos, mods,
                                                  MultiTapDetection.InfoFromMouse(e.button.button)));

                    break;
                }

                case SDL.SDL_EventType.SDL_MOUSEMOTION:
                {
                    pendingMotion = new MouseInput(
                        MouseInputEvent.Move, lastButtonBits, scrollDelta,
                        new int2(e.motion.x, e.motion.y), mods, 0);

                    break;
                }

                case SDL.SDL_EventType.SDL_MOUSEWHEEL:
                {
                    int x, y;
                    SDL.SDL_GetMouseState(out x, out y);
                    scrollDelta = e.wheel.y;
                    inputHandler.OnMouseInput(new MouseInput(MouseInputEvent.Scroll, MouseButton.None, scrollDelta, new int2(x, y), Modifiers.None, 0));

                    break;
                }

                case SDL.SDL_EventType.SDL_TEXTINPUT:
                {
                    var rawBytes = new byte[SDL.SDL_TEXTINPUTEVENT_TEXT_SIZE];
                    unsafe { Marshal.Copy((IntPtr)e.text.text, rawBytes, 0, SDL.SDL_TEXTINPUTEVENT_TEXT_SIZE); }
                    inputHandler.OnTextInput(Encoding.UTF8.GetString(rawBytes, 0, Array.IndexOf(rawBytes, (byte)0)));
                    break;
                }

                case SDL.SDL_EventType.SDL_KEYDOWN:
                case SDL.SDL_EventType.SDL_KEYUP:
                {
                    var keyCode = (Keycode)e.key.keysym.sym;
                    var type    = e.type == SDL.SDL_EventType.SDL_KEYDOWN ?
                                  KeyInputEvent.Down : KeyInputEvent.Up;

                    var tapCount = e.type == SDL.SDL_EventType.SDL_KEYDOWN ?
                                   MultiTapDetection.DetectFromKeyboard(keyCode) :
                                   MultiTapDetection.InfoFromKeyboard(keyCode);

                    var keyEvent = new KeyInput
                    {
                        Event         = type,
                        Key           = keyCode,
                        Modifiers     = mods,
                        UnicodeChar   = (char)e.key.keysym.sym,
                        MultiTapCount = tapCount
                    };

                    // Special case workaround for windows users
                    if (e.key.keysym.sym == SDL.SDL_Keycode.SDLK_F4 && mods.HasModifier(Modifiers.Alt) &&
                        Platform.CurrentPlatform == PlatformType.Windows)
                    {
                        Game.Exit();
                    }
                    else
                    {
                        inputHandler.OnKeyInput(keyEvent);
                    }

                    break;
                }
                }
            }

            if (pendingMotion != null)
            {
                inputHandler.OnMouseInput(pendingMotion.Value);
                pendingMotion = null;
            }

            ErrorHandler.CheckGlError();
        }
Пример #6
0
        public void PumpInput(IInputHandler inputHandler)
        {
            Game.HasInputFocus = 0 != (Sdl.SDL_GetAppState() & Sdl.SDL_APPINPUTFOCUS);

            var mods = MakeModifiers(Sdl.SDL_GetModState());

            inputHandler.ModifierKeys(mods);
            MouseInput?pendingMotion = null;

            Sdl.SDL_Event e;
            while (Sdl.SDL_PollEvent(out e) != 0)
            {
                switch (e.type)
                {
                case Sdl.SDL_QUIT:
                    OpenRA.Game.Exit();
                    break;

                case Sdl.SDL_MOUSEBUTTONDOWN:
                {
                    if (pendingMotion != null)
                    {
                        inputHandler.OnMouseInput(pendingMotion.Value);
                        pendingMotion = null;
                    }

                    var button = MakeButton(e.button.button);
                    lastButtonBits |= button;

                    var pos = new int2(e.button.x, e.button.y);

                    inputHandler.OnMouseInput(new MouseInput(
                                                  MouseInputEvent.Down, button, pos, mods,
                                                  MultiTapDetection.DetectFromMouse(e.button.button, pos)
                                                  ));
                } break;

                case Sdl.SDL_MOUSEBUTTONUP:
                {
                    if (pendingMotion != null)
                    {
                        inputHandler.OnMouseInput(pendingMotion.Value);
                        pendingMotion = null;
                    }

                    var button = MakeButton(e.button.button);
                    lastButtonBits &= ~button;

                    var pos = new int2(e.button.x, e.button.y);
                    inputHandler.OnMouseInput(new MouseInput(
                                                  MouseInputEvent.Up, button, pos, mods,
                                                  MultiTapDetection.InfoFromMouse(e.button.button)
                                                  ));
                } break;

                case Sdl.SDL_MOUSEMOTION:
                {
                    pendingMotion = new MouseInput(
                        MouseInputEvent.Move,
                        lastButtonBits,
                        new int2(e.motion.x, e.motion.y),
                        mods, 0);
                } break;

                case Sdl.SDL_KEYDOWN:
                {
                    var keyName = Sdl.SDL_GetKeyName(e.key.keysym.sym);

                    var keyEvent = new KeyInput
                    {
                        Event         = KeyInputEvent.Down,
                        Modifiers     = mods,
                        UnicodeChar   = (char)e.key.keysym.unicode,
                        KeyName       = Sdl.SDL_GetKeyName(e.key.keysym.sym),
                        VirtKey       = e.key.keysym.sym,
                        MultiTapCount = MultiTapDetection.DetectFromKeyboard(keyName)
                    };

                    if (!HandleSpecialKey(keyEvent))
                    {
                        inputHandler.OnKeyInput(keyEvent);
                    }
                } break;

                case Sdl.SDL_KEYUP:
                {
                    var keyName = Sdl.SDL_GetKeyName(e.key.keysym.sym);

                    var keyEvent = new KeyInput
                    {
                        Event         = KeyInputEvent.Up,
                        Modifiers     = mods,
                        UnicodeChar   = (char)e.key.keysym.unicode,
                        KeyName       = Sdl.SDL_GetKeyName(e.key.keysym.sym),
                        VirtKey       = e.key.keysym.sym,
                        MultiTapCount = MultiTapDetection.InfoFromKeyboard(keyName)
                    };

                    inputHandler.OnKeyInput(keyEvent);
                } break;
                }
            }

            if (pendingMotion != null)
            {
                inputHandler.OnMouseInput(pendingMotion.Value);
                pendingMotion = null;
            }

            ErrorHandler.CheckGlError();
        }
Пример #7
0
        public void PumpInput(Sdl2PlatformWindow device, IInputHandler inputHandler, int2?lockedMousePosition)
        {
            var mods = MakeModifiers((int)SDL.SDL_GetModState());

            inputHandler.ModifierKeys(mods);
            MouseInput?pendingMotion = null;

            SDL.SDL_Event e;
            while (SDL.SDL_PollEvent(out e) != 0)
            {
                switch (e.type)
                {
                case SDL.SDL_EventType.SDL_QUIT:
                    Game.Exit();
                    break;

                case SDL.SDL_EventType.SDL_WINDOWEVENT:
                {
                    switch (e.window.windowEvent)
                    {
                    case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_LOST:
                        device.HasInputFocus = false;
                        break;

                    case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_FOCUS_GAINED:
                        device.HasInputFocus = true;
                        break;

                    // Triggered when moving between displays with different DPI settings
                    case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_SIZE_CHANGED:
                        device.WindowSizeChanged();
                        break;
                    }

                    break;
                }

                case SDL.SDL_EventType.SDL_MOUSEBUTTONDOWN:
                {
                    if (pendingMotion != null)
                    {
                        inputHandler.OnMouseInput(pendingMotion.Value);
                        pendingMotion = null;
                    }

                    var button = MakeButton(e.button.button);
                    lastButtonBits |= button;

                    var input = lockedMousePosition ?? new int2(e.button.x, e.button.y);
                    var pos   = EventPosition(device, input.X, input.Y);

                    inputHandler.OnMouseInput(new MouseInput(
                                                  MouseInputEvent.Down, button, pos, int2.Zero, mods,
                                                  MultiTapDetection.DetectFromMouse(e.button.button, pos)));

                    break;
                }

                case SDL.SDL_EventType.SDL_MOUSEBUTTONUP:
                {
                    if (pendingMotion != null)
                    {
                        inputHandler.OnMouseInput(pendingMotion.Value);
                        pendingMotion = null;
                    }

                    var button = MakeButton(e.button.button);
                    lastButtonBits &= ~button;

                    var input = lockedMousePosition ?? new int2(e.button.x, e.button.y);
                    var pos   = EventPosition(device, input.X, input.Y);

                    inputHandler.OnMouseInput(new MouseInput(
                                                  MouseInputEvent.Up, button, pos, int2.Zero, mods,
                                                  MultiTapDetection.InfoFromMouse(e.button.button)));

                    break;
                }

                case SDL.SDL_EventType.SDL_MOUSEMOTION:
                {
                    var mousePos = new int2(e.motion.x, e.motion.y);
                    var input    = lockedMousePosition ?? mousePos;
                    var pos      = EventPosition(device, input.X, input.Y);

                    var delta = lockedMousePosition == null
                                                                ? EventPosition(device, e.motion.xrel, e.motion.yrel)
                                                                : mousePos - lockedMousePosition.Value;

                    pendingMotion = new MouseInput(
                        MouseInputEvent.Move, lastButtonBits, pos, delta, mods, 0);

                    break;
                }

                case SDL.SDL_EventType.SDL_MOUSEWHEEL:
                {
                    int x, y;
                    SDL.SDL_GetMouseState(out x, out y);

                    var pos = EventPosition(device, x, y);
                    inputHandler.OnMouseInput(new MouseInput(MouseInputEvent.Scroll, MouseButton.None, pos, new int2(0, e.wheel.y), mods, 0));

                    break;
                }

                case SDL.SDL_EventType.SDL_TEXTINPUT:
                {
                    var rawBytes = new byte[SDL.SDL_TEXTINPUTEVENT_TEXT_SIZE];
                    unsafe { Marshal.Copy((IntPtr)e.text.text, rawBytes, 0, SDL.SDL_TEXTINPUTEVENT_TEXT_SIZE); }
                    inputHandler.OnTextInput(Encoding.UTF8.GetString(rawBytes, 0, Array.IndexOf(rawBytes, (byte)0)));
                    break;
                }

                case SDL.SDL_EventType.SDL_KEYDOWN:
                case SDL.SDL_EventType.SDL_KEYUP:
                {
                    var keyCode = (Keycode)e.key.keysym.sym;
                    var type    = e.type == SDL.SDL_EventType.SDL_KEYDOWN ?
                                  KeyInputEvent.Down : KeyInputEvent.Up;

                    var tapCount = e.type == SDL.SDL_EventType.SDL_KEYDOWN ?
                                   MultiTapDetection.DetectFromKeyboard(keyCode, mods) :
                                   MultiTapDetection.InfoFromKeyboard(keyCode, mods);

                    var keyEvent = new KeyInput
                    {
                        Event         = type,
                        Key           = keyCode,
                        Modifiers     = mods,
                        UnicodeChar   = (char)e.key.keysym.sym,
                        MultiTapCount = tapCount,
                        IsRepeat      = e.key.repeat != 0
                    };

                    // Special case workaround for windows users
                    if (e.key.keysym.sym == SDL.SDL_Keycode.SDLK_F4 && mods.HasModifier(Modifiers.Alt) &&
                        Platform.CurrentPlatform == PlatformType.Windows)
                    {
                        Game.Exit();
                    }
                    else
                    {
                        inputHandler.OnKeyInput(keyEvent);
                    }

                    break;
                }
                }
            }

            if (pendingMotion != null)
            {
                inputHandler.OnMouseInput(pendingMotion.Value);
                pendingMotion = null;
            }
        }
Пример #8
0
        public void PumpInput(IInputHandler inputHandler)
        {
            Game.HasInputFocus = 0 != (Sdl.SDL_GetAppState() & Sdl.SDL_APPINPUTFOCUS);

            var mods = MakeModifiers(Sdl.SDL_GetModState());
            inputHandler.ModifierKeys(mods);
            MouseInput? pendingMotion = null;

            Sdl.SDL_Event e;
            while (Sdl.SDL_PollEvent(out e) != 0)
            {
                switch (e.type)
                {
                case Sdl.SDL_QUIT:
                    Game.Exit();
                    break;

                case Sdl.SDL_MOUSEBUTTONDOWN:
                    {
                        if (pendingMotion != null)
                        {
                            inputHandler.OnMouseInput(pendingMotion.Value);
                            pendingMotion = null;
                        }

                        var button = MakeButton(e.button.button);
                        lastButtonBits |= button;

                        var pos = new int2(e.button.x, e.button.y);

                        inputHandler.OnMouseInput(new MouseInput(
                            MouseInputEvent.Down, button, pos, mods,
                            MultiTapDetection.DetectFromMouse(e.button.button, pos)));

                        break;
                    }

                case Sdl.SDL_MOUSEBUTTONUP:
                    {
                        if (pendingMotion != null)
                        {
                            inputHandler.OnMouseInput(pendingMotion.Value);
                            pendingMotion = null;
                        }

                        var button = MakeButton(e.button.button);
                        lastButtonBits &= ~button;

                        var pos = new int2(e.button.x, e.button.y);
                        inputHandler.OnMouseInput(new MouseInput(
                            MouseInputEvent.Up, button, pos, mods,
                            MultiTapDetection.InfoFromMouse(e.button.button)));

                        break;
                    }

                case Sdl.SDL_MOUSEMOTION:
                    {
                        pendingMotion = new MouseInput(
                            MouseInputEvent.Move, lastButtonBits,
                            new int2(e.motion.x, e.motion.y), mods, 0);

                        break;
                    }

                case Sdl.SDL_KEYDOWN:
                case Sdl.SDL_KEYUP:
                    {
                        // Drop unknown keys
                        Keycode keyCode;
                        if (!KeyRemap.TryGetValue(e.key.keysym.sym, out keyCode))
                        {
                            // Try parsing it as text
                            var c = (char)e.key.keysym.unicode;
                            if (IsValidInput(c))
                                inputHandler.OnTextInput(c.ToString());

                            break;
                        }

                        var type = e.type == Sdl.SDL_KEYDOWN ?
                            KeyInputEvent.Down : KeyInputEvent.Up;

                        var tapCount = e.type == Sdl.SDL_KEYDOWN ?
                            MultiTapDetection.DetectFromKeyboard(keyCode) :
                            MultiTapDetection.InfoFromKeyboard(keyCode);

                        var keyEvent = new KeyInput
                        {
                            Event = type,
                            Key = keyCode,
                            Modifiers = mods,
                            UnicodeChar = (char)e.key.keysym.unicode,
                            MultiTapCount = tapCount
                        };

                        // Special case workaround for windows users
                        if (e.key.keysym.sym == Sdl.SDLK_F4 && mods.HasModifier(Modifiers.Alt) &&
                            Platform.CurrentPlatform == PlatformType.Windows)
                        {
                            Game.Exit();
                        }
                        else
                            inputHandler.OnKeyInput(keyEvent);

                        if (IsValidInput(keyEvent.UnicodeChar))
                            inputHandler.OnTextInput(keyEvent.UnicodeChar.ToString());

                        break;
                    }
                }
            }

            if (pendingMotion != null)
            {
                inputHandler.OnMouseInput(pendingMotion.Value);
                pendingMotion = null;
            }

            ErrorHandler.CheckGlError();
        }
Пример #9
0
        public void PumpInput(IInputHandler inputHandler)
        {
            Game.HasInputFocus = 0 != (Sdl.SDL_GetAppState() & Sdl.SDL_APPINPUTFOCUS);

            var mods = MakeModifiers(Sdl.SDL_GetModState());

            inputHandler.ModifierKeys(mods);
            MouseInput?pendingMotion = null;

            Sdl.SDL_Event e;
            while (Sdl.SDL_PollEvent(out e) != 0)
            {
                switch (e.type)
                {
                case Sdl.SDL_QUIT:
                    Game.Exit();
                    break;

                case Sdl.SDL_MOUSEBUTTONDOWN:
                {
                    if (pendingMotion != null)
                    {
                        inputHandler.OnMouseInput(pendingMotion.Value);
                        pendingMotion = null;
                    }

                    var button = MakeButton(e.button.button);
                    lastButtonBits |= button;

                    var pos = new int2(e.button.x, e.button.y);

                    inputHandler.OnMouseInput(new MouseInput(
                                                  MouseInputEvent.Down, button, pos, mods,
                                                  MultiTapDetection.DetectFromMouse(e.button.button, pos)));

                    break;
                }

                case Sdl.SDL_MOUSEBUTTONUP:
                {
                    if (pendingMotion != null)
                    {
                        inputHandler.OnMouseInput(pendingMotion.Value);
                        pendingMotion = null;
                    }

                    var button = MakeButton(e.button.button);
                    lastButtonBits &= ~button;

                    var pos = new int2(e.button.x, e.button.y);
                    inputHandler.OnMouseInput(new MouseInput(
                                                  MouseInputEvent.Up, button, pos, mods,
                                                  MultiTapDetection.InfoFromMouse(e.button.button)));

                    break;
                }

                case Sdl.SDL_MOUSEMOTION:
                {
                    pendingMotion = new MouseInput(
                        MouseInputEvent.Move, lastButtonBits,
                        new int2(e.motion.x, e.motion.y), mods, 0);

                    break;
                }

                case Sdl.SDL_KEYDOWN:
                case Sdl.SDL_KEYUP:
                {
                    // Drop unknown keys
                    Keycode keyCode;
                    if (!KeyRemap.TryGetValue(e.key.keysym.sym, out keyCode))
                    {
                        // Try parsing it as text
                        var c = (char)e.key.keysym.unicode;
                        if (IsValidInput(c))
                        {
                            inputHandler.OnTextInput(c.ToString());
                        }

                        break;
                    }

                    var type = e.type == Sdl.SDL_KEYDOWN ?
                               KeyInputEvent.Down : KeyInputEvent.Up;

                    var tapCount = e.type == Sdl.SDL_KEYDOWN ?
                                   MultiTapDetection.DetectFromKeyboard(keyCode) :
                                   MultiTapDetection.InfoFromKeyboard(keyCode);

                    var keyEvent = new KeyInput
                    {
                        Event         = type,
                        Key           = keyCode,
                        Modifiers     = mods,
                        UnicodeChar   = (char)e.key.keysym.unicode,
                        MultiTapCount = tapCount
                    };

                    // Special case workaround for windows users
                    if (e.key.keysym.sym == Sdl.SDLK_F4 && mods.HasModifier(Modifiers.Alt) &&
                        Platform.CurrentPlatform == PlatformType.Windows)
                    {
                        Game.Exit();
                    }
                    else
                    {
                        inputHandler.OnKeyInput(keyEvent);
                    }

                    if (IsValidInput(keyEvent.UnicodeChar))
                    {
                        inputHandler.OnTextInput(keyEvent.UnicodeChar.ToString());
                    }

                    break;
                }
                }
            }

            if (pendingMotion != null)
            {
                inputHandler.OnMouseInput(pendingMotion.Value);
                pendingMotion = null;
            }

            ErrorHandler.CheckGlError();
        }