Пример #1
0
        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}");
                    }
                }
            }
        }
Пример #2
0
        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");
                }
            }
        }
Пример #3
0
        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");
            }
        }
    }