internal PointerRoutedEventArgs(
            double timestamp,
            uint pointerId,
            PointerDeviceType pointerType,
            Point absolutePosition,
            bool isInContact,
            WindowManagerInterop.HtmlPointerButtonsState buttons,
            WindowManagerInterop.HtmlPointerButtonUpdate buttonUpdate,
            VirtualKeyModifiers keys,
            double pressure,
            UIElement source,
            bool canBubbleNatively)
            : this()
        {
            _timestamp        = timestamp;
            _absolutePosition = absolutePosition;
            _buttons          = buttons;
            _buttonUpdate     = buttonUpdate;
            _pressure         = pressure;

            FrameId           = ToFrameId(timestamp);
            Pointer           = new Pointer(pointerId, pointerType, isInContact, isInRange: true);
            KeyModifiers      = keys;
            OriginalSource    = source;
            CanBubbleNatively = canBubbleNatively;
        }
        private static PointerUpdateKind ToUpdateKind(WindowManagerInterop.HtmlPointerButtonUpdate update, PointerPointProperties props)
        {
            switch (update)
            {
            case WindowManagerInterop.HtmlPointerButtonUpdate.Left when props.IsLeftButtonPressed: return(PointerUpdateKind.LeftButtonPressed);

            case WindowManagerInterop.HtmlPointerButtonUpdate.Left: return(PointerUpdateKind.LeftButtonReleased);

            case WindowManagerInterop.HtmlPointerButtonUpdate.Middle when props.IsMiddleButtonPressed: return(PointerUpdateKind.MiddleButtonPressed);

            case WindowManagerInterop.HtmlPointerButtonUpdate.Middle: return(PointerUpdateKind.MiddleButtonReleased);

            case WindowManagerInterop.HtmlPointerButtonUpdate.Right when props.IsRightButtonPressed: return(PointerUpdateKind.RightButtonPressed);

            case WindowManagerInterop.HtmlPointerButtonUpdate.Right: return(PointerUpdateKind.RightButtonReleased);

            case WindowManagerInterop.HtmlPointerButtonUpdate.X1 when props.IsXButton1Pressed: return(PointerUpdateKind.XButton1Pressed);

            case WindowManagerInterop.HtmlPointerButtonUpdate.X1: return(PointerUpdateKind.XButton1Released);

            case WindowManagerInterop.HtmlPointerButtonUpdate.X2 when props.IsXButton2Pressed: return(PointerUpdateKind.XButton1Pressed);

            case WindowManagerInterop.HtmlPointerButtonUpdate.X2: return(PointerUpdateKind.XButton1Released);

            default: return(PointerUpdateKind.Other);
            }
        }