示例#1
0
        protected PenPointer internalReturnPenPointer(PenPointer pointer)
        {
            var newPointer = penPool.Get();

            newPointer.CopyFrom(pointer);
            newPointer.Flags |= Pointer.FLAG_RETURNED;
            addPointer(newPointer);
            if ((newPointer.Buttons & Pointer.PointerButtonState.AnyButtonPressed) != 0)
            {
                // Adding down state this frame
                newPointer.Buttons = PointerUtils.DownPressedButtons(newPointer.Buttons);
                pressPointer(newPointer);
            }
            return(newPointer);
        }
示例#2
0
        private void nativePointer(int id, PointerEvent evt, PointerType type, Vector2 position, PointerData data)
        {
            switch (type)
            {
            case PointerType.Mouse:
                switch (evt)
                {
                // Enter and Exit are not used - mouse is always present
                // TODO: how does it work with 2+ mice?
                case PointerEvent.Enter:
                    throw new NotImplementedException("This is not supposed to be called o.O");

                case PointerEvent.Leave:
                    break;

                case PointerEvent.Down:
                    mousePointer.Buttons = updateButtons(mousePointer.Buttons, data.PointerFlags, data.ChangedButtons);
                    pressPointer(mousePointer);
                    break;

                case PointerEvent.Up:
                    mousePointer.Buttons = updateButtons(mousePointer.Buttons, data.PointerFlags, data.ChangedButtons);
                    releasePointer(mousePointer);
                    break;

                case PointerEvent.Update:
                    mousePointer.Position = remapCoordinates(position);
                    mousePointer.Buttons  = updateButtons(mousePointer.Buttons, data.PointerFlags, data.ChangedButtons);
                    updatePointer(mousePointer);
                    break;

                case PointerEvent.Cancelled:
                    cancelPointer(mousePointer);
                    // can't cancel the mouse pointer, it is always present
                    mousePointer = internalAddMousePointer(mousePointer.Position);
                    break;
                }
                break;

            case PointerType.Touch:
                TouchPointer touchPointer;
                switch (evt)
                {
                case PointerEvent.Enter:
                    break;

                case PointerEvent.Leave:
                    // Sometimes Windows might not send Up, so have to execute touch release logic here.
                    // Has been working fine on test devices so far.
                    if (winTouchToInternalId.TryGetValue(id, out touchPointer))
                    {
                        winTouchToInternalId.Remove(id);
                        internalRemoveTouchPointer(touchPointer);
                    }
                    break;

                case PointerEvent.Down:
                    touchPointer          = internalAddTouchPointer(position);
                    touchPointer.Rotation = getTouchRotation(ref data);
                    touchPointer.Pressure = getTouchPressure(ref data);
                    winTouchToInternalId.Add(id, touchPointer);
                    break;

                case PointerEvent.Up:
                    break;

                case PointerEvent.Update:
                    if (!winTouchToInternalId.TryGetValue(id, out touchPointer))
                    {
                        return;
                    }
                    touchPointer.Position = remapCoordinates(position);
                    touchPointer.Rotation = getTouchRotation(ref data);
                    touchPointer.Pressure = getTouchPressure(ref data);
                    updatePointer(touchPointer);
                    break;

                case PointerEvent.Cancelled:
                    if (winTouchToInternalId.TryGetValue(id, out touchPointer))
                    {
                        winTouchToInternalId.Remove(id);
                        cancelPointer(touchPointer);
                    }
                    break;
                }
                break;

            case PointerType.Pen:
                switch (evt)
                {
                case PointerEvent.Enter:
                    penPointer          = internalAddPenPointer(position);
                    penPointer.Pressure = getPenPressure(ref data);
                    penPointer.Rotation = getPenRotation(ref data);
                    break;

                case PointerEvent.Leave:
                    if (penPointer == null)
                    {
                        break;
                    }
                    internalRemovePenPointer(penPointer);
                    break;

                case PointerEvent.Down:
                    if (penPointer == null)
                    {
                        break;
                    }
                    penPointer.Buttons  = updateButtons(penPointer.Buttons, data.PointerFlags, data.ChangedButtons);
                    penPointer.Pressure = getPenPressure(ref data);
                    penPointer.Rotation = getPenRotation(ref data);
                    pressPointer(penPointer);
                    break;

                case PointerEvent.Up:
                    if (penPointer == null)
                    {
                        break;
                    }
                    mousePointer.Buttons = updateButtons(penPointer.Buttons, data.PointerFlags, data.ChangedButtons);
                    releasePointer(penPointer);
                    break;

                case PointerEvent.Update:
                    if (penPointer == null)
                    {
                        break;
                    }
                    penPointer.Position = remapCoordinates(position);
                    penPointer.Pressure = getPenPressure(ref data);
                    penPointer.Rotation = getPenRotation(ref data);
                    penPointer.Buttons  = updateButtons(penPointer.Buttons, data.PointerFlags, data.ChangedButtons);
                    updatePointer(penPointer);
                    break;

                case PointerEvent.Cancelled:
                    if (penPointer == null)
                    {
                        break;
                    }
                    cancelPointer(penPointer);
                    break;
                }
                break;
            }
        }
示例#3
0
 protected void internalRemovePenPointer(PenPointer pointer)
 {
     removePointer(pointer);
     penPointer = null;
 }