private void handleState(JoystickDevice device, JoystickState newState) { PendingInputs.Enqueue(new JoystickButtonInput(newState.Buttons, device.LastState?.Buttons)); PendingInputs.Enqueue(new JoystickAxisInput(newState.GetAxes())); device.LastState = newState; }
protected override void OnHover(MotionEvent hoverEvent) { PendingInputs.Enqueue(new MousePositionAbsoluteInput { Position = getEventPosition(hoverEvent) }); PendingInputs.Enqueue(new MouseButtonInput(MouseButton.Right, hoverEvent.IsButtonPressed(MotionEventButtonState.StylusPrimary))); }
private void handlePresses(NSSet <UIPress> presses, UIPressesEvent evt) { if (!IsActive) { return; } foreach (var press in presses.Cast <UIPress>()) { if (press.Key == null) { continue; } var key = keyFromCode(press.Key.KeyCode); if (key == Key.Unknown || host.TextFieldHandler.Handled(key)) { continue; } switch (press.Phase) { case UIPressPhase.Began: PendingInputs.Enqueue(new KeyboardKeyInput(key, true)); break; case UIPressPhase.Ended: case UIPressPhase.Cancelled: PendingInputs.Enqueue(new KeyboardKeyInput(key, false)); break; } } }
private void handleShouldChangeCharacters(NSRange range, string text) { if (text.Length == 0) { if (range.Length > 0) { Key key = range.Location < IOSGameView.DummyTextField.CURSOR_POSITION ? Key.BackSpace : Key.Delete; PendingInputs.Enqueue(new KeyboardKeyInput(key, true)); PendingInputs.Enqueue(new KeyboardKeyInput(key, false)); } return; } foreach (char c in text) { Key?key = keyForString(char.ToString(c), out bool upper); if (key.HasValue) { if (upper) { PendingInputs.Enqueue(new KeyboardKeyInput(Key.LShift, true)); } PendingInputs.Enqueue(new KeyboardKeyInput(key.Value, true)); PendingInputs.Enqueue(new KeyboardKeyInput(key.Value, false)); if (upper) { PendingInputs.Enqueue(new KeyboardKeyInput(Key.LShift, false)); } } } }
private void handlePointerEvent(MotionEvent e) { PendingInputs.Enqueue(new MousePositionAbsoluteInput { Position = new osuTK.Vector2(e.GetX() * view.ScaleX, e.GetY() * view.ScaleY) }); }
private void locationUpdated(CGPoint location) { PendingInputs.Enqueue(new MousePositionAbsoluteInput { Position = new Vector2((float)location.X * view.Scale, (float)location.Y * view.Scale) }); }
private void panOffsetUpdated() { CGPoint translation = panGestureRecognizer.TranslationInView(view); Vector2 delta; switch (panGestureRecognizer.State) { case UIGestureRecognizerState.Began: // consume initial value. delta = new Vector2((float)translation.X, (float)translation.Y); break; default: // only consider relative change from previous value. delta = new Vector2((float)(translation.X - lastScrollTranslation.X), (float)(translation.Y - lastScrollTranslation.Y)); break; } lastScrollTranslation = translation; PendingInputs.Enqueue(new MouseScrollRelativeInput { IsPrecise = true, Delta = delta * scroll_rate_adjust }); }
private void handleHover(object sender, View.HoverEventArgs e) { PendingInputs.Enqueue(new MousePositionAbsoluteInput { Position = getEventPosition(e.Event) }); PendingInputs.Enqueue(new MouseButtonInput(MouseButton.Right, e.Event.ButtonState == MotionEventButtonState.StylusPrimary)); }
private void handleIndirectPointer(UITouch touch, UIEventButtonMask buttonMask, Vector2 location) { PendingInputs.Enqueue(new MousePositionAbsoluteInput { Position = location }); // Indirect pointer means the touch came from a mouse cursor, and wasn't a physical touch on the screen switch (touch.Phase) { case UITouchPhase.Began: case UITouchPhase.Moved: // only one button can be in a "down" state at once. all previous buttons are automatically released. // we need to handle this assumption at our end. if (lastButtonMask != null && lastButtonMask != buttonMask) { PendingInputs.Enqueue(new MouseButtonInput(buttonFromMask(lastButtonMask.Value), false)); } PendingInputs.Enqueue(new MouseButtonInput(buttonFromMask(buttonMask), true)); lastButtonMask = buttonMask; break; case UITouchPhase.Cancelled: case UITouchPhase.Ended: Debug.Assert(lastButtonMask != null); PendingInputs.Enqueue(new MouseButtonInput(buttonFromMask(lastButtonMask.Value), false)); lastButtonMask = null; break; } }
private void handleTouch(object sender, View.TouchEventArgs e) { if (e.Event.Action == MotionEventActions.Move) { for (int i = 0; i < Math.Min(e.Event.PointerCount, TouchState.MAX_TOUCH_COUNT); i++) { var touch = getEventTouch(e.Event, i); PendingInputs.Enqueue(new TouchInput(touch, true)); } } else if (e.Event.ActionIndex < TouchState.MAX_TOUCH_COUNT) { var touch = getEventTouch(e.Event, e.Event.ActionIndex); switch (e.Event.ActionMasked) { case MotionEventActions.Down: case MotionEventActions.PointerDown: PendingInputs.Enqueue(new TouchInput(touch, true)); break; case MotionEventActions.Up: case MotionEventActions.PointerUp: case MotionEventActions.Cancel: PendingInputs.Enqueue(new TouchInput(touch, false)); break; } } }
protected override void OnTouch(MotionEvent touchEvent) { if (touchEvent.Action == MotionEventActions.Move) { for (int i = 0; i < Math.Min(touchEvent.PointerCount, TouchState.MAX_TOUCH_COUNT); i++) { var touch = getEventTouch(touchEvent, i); PendingInputs.Enqueue(new TouchInput(touch, true)); } } else if (touchEvent.ActionIndex < TouchState.MAX_TOUCH_COUNT) { var touch = getEventTouch(touchEvent, touchEvent.ActionIndex); switch (touchEvent.ActionMasked) { case MotionEventActions.Down: case MotionEventActions.PointerDown: PendingInputs.Enqueue(new TouchInput(touch, true)); break; case MotionEventActions.Up: case MotionEventActions.PointerUp: case MotionEventActions.Cancel: PendingInputs.Enqueue(new TouchInput(touch, false)); break; } } }
private void handleTouches(object sender, View.TouchEventArgs e) { int pointerId = e.Event.GetPointerId(e.Event.ActionIndex); MouseButton button = getMouseButton(pointerId); if (button == MouseButton.Left) { PendingInputs.Enqueue(new MousePositionAbsoluteInput { Position = new osuTK.Vector2(e.Event.GetX() * view.ScaleX, e.Event.GetY() * view.ScaleY) }); } switch (e.Event.Action & MotionEventActions.Mask) { case MotionEventActions.Move: case MotionEventActions.Down: case MotionEventActions.PointerDown: PendingInputs.Enqueue(new MouseButtonInput(button, true)); break; case MotionEventActions.Up: case MotionEventActions.PointerUp: PendingInputs.Enqueue(new MouseButtonInput(button, false)); break; } }
protected override void OnKeyDown(Keycode keycode, KeyEvent e) { var key = GetKeyCodeAsKey(keycode); if (key != Key.Unknown) { PendingInputs.Enqueue(new KeyboardKeyInput(key, true)); } }
private void keyUp(Keycode keycode, KeyEvent e) { var key = GetKeyCodeAsKey(keycode); if (key != Key.Unknown) { PendingInputs.Enqueue(new KeyboardKeyInput(key, false)); } }
private void handleShouldReturn() { if (!IsActive) { return; } PendingInputs.Enqueue(new KeyboardKeyInput(Key.Enter, true)); PendingInputs.Enqueue(new KeyboardKeyInput(Key.Enter, false)); }
private void handleShouldChangeCharacters(NSRange range, string text) { if (!IsActive) { return; } if (text.Length == 0) { Key key = range.Location < IOSGameView.HiddenTextField.CURSOR_POSITION ? Key.BackSpace : Key.Delete; // NOTE: this makes the assumption that Key.AltLeft triggers the WordPrevious platform action if (range.Length > 1) { PendingInputs.Enqueue(new KeyboardKeyInput(Key.AltLeft, true)); } if (range.Length > 0) { PendingInputs.Enqueue(new KeyboardKeyInput(key, true)); PendingInputs.Enqueue(new KeyboardKeyInput(key, false)); } if (range.Length > 1) { PendingInputs.Enqueue(new KeyboardKeyInput(Key.AltLeft, false)); } return; } foreach (char c in text) { Key?key = keyForString(char.ToString(c), out bool upper); if (!key.HasValue) { continue; } if (upper) { PendingInputs.Enqueue(new KeyboardKeyInput(Key.LShift, true)); } PendingInputs.Enqueue(new KeyboardKeyInput(key.Value, true)); PendingInputs.Enqueue(new KeyboardKeyInput(key.Value, false)); if (upper) { PendingInputs.Enqueue(new KeyboardKeyInput(Key.LShift, false)); } } }
private void handleGsKeyEvent(int keyCode, bool isDown) { if (!IsActive) { return; } var key = keyFromCode((UIKeyboardHidUsage)keyCode); if (key == Key.Unknown || host.TextFieldHandler.Handled(key)) { return; } PendingInputs.Enqueue(new KeyboardKeyInput(key, isDown)); }
private void handleTouches(object sender, View.TouchEventArgs e) { handlePointerEvent(e.Event); switch (e.Event.Action & MotionEventActions.Mask) { case MotionEventActions.Down: case MotionEventActions.Move: PendingInputs.Enqueue(new MouseButtonInput(MouseButton.Left, true)); break; case MotionEventActions.Up: PendingInputs.Enqueue(new MouseButtonInput(MouseButton.Left, false)); break; } }
protected override void OnTouch(MotionEvent touchEvent) { Touch touch; switch (touchEvent.ActionMasked) { // MotionEventActions.Down arrives at the beginning of a touch event chain and implies the 0th pointer is pressed. // ActionIndex is generally not valid here. case MotionEventActions.Down: if (tryGetEventTouch(touchEvent, 0, out touch)) { PendingInputs.Enqueue(new TouchInput(touch, true)); } break; // events that apply only to the ActionIndex pointer (other pointers' states remain unchanged) case MotionEventActions.PointerDown: case MotionEventActions.PointerUp: if (touchEvent.ActionIndex < TouchState.MAX_TOUCH_COUNT) { if (tryGetEventTouch(touchEvent, touchEvent.ActionIndex, out touch)) { PendingInputs.Enqueue(new TouchInput(touch, touchEvent.ActionMasked == MotionEventActions.PointerDown)); } } break; // events that apply to every pointer (up to PointerCount). case MotionEventActions.Move: case MotionEventActions.Up: case MotionEventActions.Cancel: for (int i = 0; i < Math.Min(touchEvent.PointerCount, TouchState.MAX_TOUCH_COUNT); i++) { if (tryGetEventTouch(touchEvent, i, out touch)) { PendingInputs.Enqueue(new TouchInput(touch, touchEvent.ActionMasked == MotionEventActions.Move)); } } break; default: Logger.Log($"Unknown touch event action: {touchEvent.Action}, masked: {touchEvent.ActionMasked}"); break; } }
public override bool Initialize(GameHost host) { if (!(UIApplication.SharedApplication is GameUIApplication game)) { return(false); } game.KeyEvent += (int keyCode, bool isDown) => { if (keyMap.ContainsKey(keyCode)) { PendingInputs.Enqueue(new KeyboardKeyInput(keyMap[keyCode], isDown)); } }; return(true); }
private void handleKeyboardEvent(object sender, KeyboardKeyEventArgs e) { var rawState = e.Keyboard; if (lastRawState != null && rawState.Equals(lastRawState)) { return; } lastRawState = rawState; var newState = new TkKeyboardState(rawState); PendingInputs.Enqueue(new KeyboardKeyInput(newState.Keys, lastEventState?.Keys)); lastEventState = newState; FrameStatistics.Increment(StatisticsCounterType.KeyEvents); }
private void handleTouches(object sender, View.TouchEventArgs e) { PendingInputs.Enqueue(new MousePositionAbsoluteInput { Position = new osuTK.Vector2(e.Event.GetX() * view.ScaleX, e.Event.GetY() * view.ScaleY) }); switch (e.Event.Action & MotionEventActions.Mask) { case MotionEventActions.Down: case MotionEventActions.Move: PendingInputs.Enqueue(new MouseButtonInput(MouseButton.Left, true)); break; case MotionEventActions.Up: PendingInputs.Enqueue(new MouseButtonInput(MouseButton.Left, false)); break; } }
private void dispatchEvent(byte eventType, byte key, byte velocity) { Logger.Log($"Handling MIDI event {eventType:X2}:{key:X2}:{velocity:X2}"); switch (eventType) { case MidiEvent.NoteOn when velocity != 0: Logger.Log($"NoteOn: {(MidiKey)key}/{velocity / 128f:P}"); PendingInputs.Enqueue(new MidiKeyInput((MidiKey)key, velocity, true)); FrameStatistics.Increment(StatisticsCounterType.MidiEvents); break; case MidiEvent.NoteOff: case MidiEvent.NoteOn when velocity == 0: Logger.Log($"NoteOff: {(MidiKey)key}/{velocity / 128f:P}"); PendingInputs.Enqueue(new MidiKeyInput((MidiKey)key, 0, false)); FrameStatistics.Increment(StatisticsCounterType.MidiEvents); break; } }
private void handleUITouch(UITouch touch) { var location = touch.LocationInView(null); PendingInputs.Enqueue(new MousePositionAbsoluteInput { Position = new Vector2((float)location.X * view.Scale, (float)location.Y * view.Scale) }); switch (touch.Phase) { case UITouchPhase.Moved: case UITouchPhase.Began: PendingInputs.Enqueue(new MouseButtonInput(MouseButton.Left, true)); break; case UITouchPhase.Cancelled: case UITouchPhase.Ended: PendingInputs.Enqueue(new MouseButtonInput(MouseButton.Left, false)); break; } }
private void dispatchEvent(byte eventType, byte key, byte velocity) { Logger.Log($"Handling MIDI event {eventType:X2}:{key:X2}:{velocity:X2}"); // Low nibble only contains channel data in note on/off messages // Ignore to receive messages from all channels switch (eventType & 0xF0) { case MidiEvent.NoteOn when velocity != 0: Logger.Log($"NoteOn: {(MidiKey)key}/{velocity / 128f:P}"); PendingInputs.Enqueue(new MidiKeyInput((MidiKey)key, velocity, true)); FrameStatistics.Increment(StatisticsCounterType.MidiEvents); break; case MidiEvent.NoteOff: case MidiEvent.NoteOn when velocity == 0: Logger.Log($"NoteOff: {(MidiKey)key}/{velocity / 128f:P}"); PendingInputs.Enqueue(new MidiKeyInput((MidiKey)key, 0, false)); FrameStatistics.Increment(StatisticsCounterType.MidiEvents); break; } }
protected void HandleState(OsuTKMouseState state, OsuTKMouseState lastState, bool isAbsolutePosition) { if (lastState == null || isAbsolutePosition) { PendingInputs.Enqueue(new MousePositionAbsoluteInput { Position = state.Position }); currentPosition = state.Position; } else { var delta = state.Position - lastState.Position; if (delta != Vector2.Zero) { PendingInputs.Enqueue(new MousePositionRelativeInput { Delta = delta }); currentPosition += delta; } } if (lastState != null && state.WasActive) { var scrollDelta = state.Scroll - lastState.Scroll; if (scrollDelta != Vector2.Zero) { PendingInputs.Enqueue(new MouseScrollRelativeInput { Delta = scrollDelta, IsPrecise = state.HasPreciseScroll }); } } PendingInputs.Enqueue(new MouseButtonInput(state.Buttons, lastState?.Buttons)); FrameStatistics.Increment(StatisticsCounterType.MouseEvents); }
private void handleUITouch(UITouch touch, UIEvent evt) { var location = touch.LocationInView(null); PendingInputs.Enqueue(new MousePositionAbsoluteInput { Position = new Vector2((float)location.X * view.Scale, (float)location.Y * view.Scale) }); switch (touch.Phase) { case UITouchPhase.Moved: case UITouchPhase.Began: if (rightClickSupport && evt.ButtonMask == UIEventButtonMask.Secondary) { pendingRightClickTouches.Add(touch); PendingInputs.Enqueue(new MouseButtonInput(MouseButton.Right, true)); } else { PendingInputs.Enqueue(new MouseButtonInput(MouseButton.Left, true)); } break; case UITouchPhase.Cancelled: case UITouchPhase.Ended: if (pendingRightClickTouches.Contains(touch)) { pendingRightClickTouches.Remove(touch); PendingInputs.Enqueue(new MouseButtonInput(MouseButton.Right, false)); } else { PendingInputs.Enqueue(new MouseButtonInput(MouseButton.Left, false)); } break; } }
private void handleTouch(UITouch uiTouch, Vector2 location) { TouchSource?existingSource = getTouchSource(uiTouch); if (uiTouch.Phase == UITouchPhase.Began) { // need to assign the new touch. Debug.Assert(existingSource == null); existingSource = assignNextAvailableTouchSource(uiTouch); } if (existingSource == null) { return; } var touch = new Touch(existingSource.Value, location); // standard touch handling switch (uiTouch.Phase) { case UITouchPhase.Began: case UITouchPhase.Moved: PendingInputs.Enqueue(new TouchInput(touch, true)); break; case UITouchPhase.Cancelled: case UITouchPhase.Ended: PendingInputs.Enqueue(new TouchInput(touch, false)); // touch no longer valid, remove from reference array. activeTouches[(int)existingSource] = null; break; } }
private void enqueueInput(IInput input) { PendingInputs.Enqueue(input); FrameStatistics.Increment(StatisticsCounterType.KeyEvents); }
private void handleKeyCommand(UIKeyCommand cmd) { Key? key; bool upper = false; // UIKeyCommand constants are not actually constants, so we can't use a switch if (cmd.Input == UIKeyCommand.LeftArrow) { key = Key.Left; } else if (cmd.Input == UIKeyCommand.RightArrow) { key = Key.Right; } else if (cmd.Input == UIKeyCommand.UpArrow) { key = Key.Up; } else if (cmd.Input == UIKeyCommand.DownArrow) { key = Key.Down; } else { key = keyForString(cmd.Input, out upper); } if (!key.HasValue) { return; } bool shiftHeld = (cmd.ModifierFlags & UIKeyModifierFlags.Shift) > 0 || upper; bool superHeld = (cmd.ModifierFlags & UIKeyModifierFlags.Command) > 0; bool ctrlHeld = (cmd.ModifierFlags & UIKeyModifierFlags.Control) > 0; bool optionHeld = (cmd.ModifierFlags & UIKeyModifierFlags.Alternate) > 0; if (shiftHeld) { PendingInputs.Enqueue(new KeyboardKeyInput(Key.LShift, true)); } if (superHeld) { PendingInputs.Enqueue(new KeyboardKeyInput(Key.LWin, true)); } if (ctrlHeld) { PendingInputs.Enqueue(new KeyboardKeyInput(Key.LControl, true)); } if (optionHeld) { PendingInputs.Enqueue(new KeyboardKeyInput(Key.LAlt, true)); } PendingInputs.Enqueue(new KeyboardKeyInput(key.Value, true)); PendingInputs.Enqueue(new KeyboardKeyInput(key.Value, false)); if (optionHeld) { PendingInputs.Enqueue(new KeyboardKeyInput(Key.LAlt, false)); } if (ctrlHeld) { PendingInputs.Enqueue(new KeyboardKeyInput(Key.LControl, false)); } if (superHeld) { PendingInputs.Enqueue(new KeyboardKeyInput(Key.LWin, false)); } if (shiftHeld) { PendingInputs.Enqueue(new KeyboardKeyInput(Key.LShift, false)); } }