private void ProcessKeyboardEvent(IntPtr rawEvent, libinput_event_type rawEventType) { var rawKeyboardEvent = libinput_event_get_keyboard_event(rawEvent); if (rawKeyboardEvent != IntPtr.Zero) { var key = libinput_event_keyboard_get_key(rawKeyboardEvent); var state = libinput_event_keyboard_get_key_state(rawKeyboardEvent); if (state == libinput_key_state.Pressed) { OnKeyPressEvent(key); } else if (state == libinput_key_state.Released) { OnKeyReleaseEvent(key); } else { if (this.Log().IsEnabled(LogLevel.Warning)) { this.Log().Warn($"ProcessKeyboardEvent: Unsupported state {state} for {key}"); } } } }
private void ProcessTouchEvent(IntPtr rawEvent, libinput_event_type rawEventType) { var rawTouchEvent = libinput_event_get_touch_event(rawEvent); if (rawTouchEvent != IntPtr.Zero && rawEventType < LIBINPUT_EVENT_TOUCH_FRAME) { var properties = new PointerPointProperties(); var timestamp = libinput_event_touch_get_time_usec(rawTouchEvent); var pointerId = (uint)libinput_event_touch_get_slot(rawTouchEvent); Action <PointerEventArgs>?raisePointerEvent = null; Point currentPosition; if (rawEventType == LIBINPUT_EVENT_TOUCH_DOWN || rawEventType == LIBINPUT_EVENT_TOUCH_MOTION) { currentPosition = new Point( x: libinput_event_touch_get_x_transformed(rawTouchEvent, (int)_displayInformation.ScreenWidthInRawPixels), y: libinput_event_touch_get_y_transformed(rawTouchEvent, (int)_displayInformation.ScreenHeightInRawPixels)); _activePointers[pointerId] = currentPosition; } else { _activePointers.TryGetValue(pointerId, out currentPosition); _activePointers.Remove(pointerId); } if (this.Log().IsEnabled(LogLevel.Trace)) { this.Log().Trace($"ProcessTouchEvent: {rawEventType}, pointerId:{pointerId}, currentPosition:{currentPosition}, timestamp:{timestamp}"); } switch (rawEventType) { case LIBINPUT_EVENT_TOUCH_MOTION: raisePointerEvent = _ownerEvents.RaisePointerMoved; break; case LIBINPUT_EVENT_TOUCH_DOWN: properties.PointerUpdateKind = LeftButtonPressed; raisePointerEvent = _ownerEvents.RaisePointerPressed; break; case LIBINPUT_EVENT_TOUCH_UP: properties.PointerUpdateKind = LeftButtonReleased; raisePointerEvent = _ownerEvents.RaisePointerReleased; break; case LIBINPUT_EVENT_TOUCH_CANCEL: properties.PointerUpdateKind = LeftButtonReleased; raisePointerEvent = _ownerEvents.RaisePointerCancelled; break; } properties.IsLeftButtonPressed = rawEventType != LIBINPUT_EVENT_TOUCH_UP && rawEventType != LIBINPUT_EVENT_TOUCH_CANCEL; var pointerPoint = new Windows.UI.Input.PointerPoint( frameId: (uint)timestamp, // UNO TODO: How should set the frame, timestamp may overflow. timestamp: timestamp, device: PointerDevice.For(PointerDeviceType.Touch), pointerId: pointerId, rawPosition: currentPosition, position: currentPosition, isInContact: properties.HasPressedButton, properties: properties ); if (raisePointerEvent != null) { var args = new PointerEventArgs(pointerPoint, GetCurrentModifiersState()); RaisePointerEvent(raisePointerEvent, args); } else { this.Log().LogWarning($"Touch event type {rawEventType} was not handled"); } } }
private void ProcessMouseEvent(IntPtr rawEvent, libinput_event_type type) { var rawPointerEvent = libinput_event_get_pointer_event(rawEvent); var timestamp = libinput_event_pointer_get_time_usec(rawPointerEvent); var properties = new PointerPointProperties(); Action <PointerEventArgs>?raisePointerEvent = null; if (type == LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE) { _mousePosition = new Point( x: libinput_event_pointer_get_absolute_x_transformed(rawPointerEvent, (int)_displayInformation.ScreenWidthInRawPixels), y: libinput_event_pointer_get_absolute_y_transformed(rawPointerEvent, (int)_displayInformation.ScreenHeightInRawPixels)); raisePointerEvent = _ownerEvents.RaisePointerMoved; } else if (type == LIBINPUT_EVENT_POINTER_AXIS) { double GetAxisValue(libinput_pointer_axis axis) { var source = libinput_event_pointer_get_axis_source(rawPointerEvent); return(source == libinput_pointer_axis_source.Wheel ? libinput_event_pointer_get_axis_value_discrete(rawPointerEvent, axis) : libinput_event_pointer_get_axis_value(rawPointerEvent, axis)); } if (libinput_event_pointer_has_axis(rawPointerEvent, libinput_pointer_axis.ScrollHorizontal) != 0) { properties.IsHorizontalMouseWheel = true; properties.MouseWheelDelta = (int)GetAxisValue(libinput_pointer_axis.ScrollHorizontal); raisePointerEvent = _ownerEvents.RaisePointerWheelChanged; } else if (libinput_event_pointer_has_axis(rawPointerEvent, libinput_pointer_axis.ScrollVertical) != 0) { properties.IsHorizontalMouseWheel = false; properties.MouseWheelDelta = (int)GetAxisValue(libinput_pointer_axis.ScrollVertical); raisePointerEvent = _ownerEvents.RaisePointerWheelChanged; } } else if (type == LIBINPUT_EVENT_POINTER_BUTTON) { var button = libinput_event_pointer_get_button(rawPointerEvent); var buttonState = libinput_event_pointer_get_button_state(rawPointerEvent); if (buttonState == libinput_button_state.Pressed) { _pointerPressed.Add(button); properties.PointerUpdateKind = button switch { libinput_event_code.BTN_LEFT => LeftButtonPressed, libinput_event_code.BTN_MIDDLE => MiddleButtonPressed, libinput_event_code.BTN_RIGHT => RightButtonPressed, _ => Other }; raisePointerEvent = _ownerEvents.RaisePointerPressed; } else { _pointerPressed.Remove(button); properties.PointerUpdateKind = button switch { libinput_event_code.BTN_LEFT => LeftButtonReleased, libinput_event_code.BTN_MIDDLE => MiddleButtonReleased, libinput_event_code.BTN_RIGHT => RightButtonReleased, _ => Other }; raisePointerEvent = _ownerEvents.RaisePointerReleased; } } properties.IsLeftButtonPressed = _pointerPressed.Contains(libinput_event_code.BTN_LEFT); properties.IsMiddleButtonPressed = _pointerPressed.Contains(libinput_event_code.BTN_MIDDLE); properties.IsRightButtonPressed = _pointerPressed.Contains(libinput_event_code.BTN_RIGHT); var pointerPoint = new Windows.UI.Input.PointerPoint( frameId: (uint)timestamp, // UNO TODO: How should set the frame, timestamp may overflow. timestamp: timestamp, device: PointerDevice.For(PointerDeviceType.Mouse), pointerId: 0, rawPosition: _mousePosition, position: _mousePosition, isInContact: properties.HasPressedButton, properties: properties ); if (raisePointerEvent != null) { var args = new PointerEventArgs(pointerPoint, GetCurrentModifiersState()); RaisePointerEvent(raisePointerEvent, args); } else { this.Log().LogWarning($"Pointer event type {type} was not handled"); } } }