internal void UpdateState(RawStylusInputReport report) { Debug.Assert(report.TabletDeviceId == _tabletDevice.Id); Debug.Assert((report.Actions & RawStylusActions.None) == 0); _eventStylusPoints = new StylusPointCollection( report.StylusPointDescription, report.GetRawPacketData(), GetTabletToElementTransform(null), Matrix.Identity); PresentationSource inputSource = DetermineValidSource(report.InputSource, _eventStylusPoints, report.PenContext.Contexts); // See if we need to remap the stylus data X and Y values to different presentation source. if (inputSource != null && inputSource != report.InputSource) { Point newWindowLocation = PointUtil.ClientToScreen(new Point(0, 0), inputSource); newWindowLocation = _stylusLogic.MeasureUnitsFromDeviceUnits(newWindowLocation); Point oldWindowLocation = _stylusLogic.MeasureUnitsFromDeviceUnits(report.PenContext.Contexts.DestroyedLocation); // Create translate matrix transform to shift coords to map points to new window location. MatrixTransform additionalTransform = new MatrixTransform(new Matrix(1, 0, 0, 1, oldWindowLocation.X - newWindowLocation.X, oldWindowLocation.Y - newWindowLocation.Y)); _eventStylusPoints = _eventStylusPoints.Reformat(report.StylusPointDescription, additionalTransform); } _rawPosition = _eventStylusPoints[_eventStylusPoints.Count - 1]; _inputSource = new SecurityCriticalDataClass<PresentationSource>(inputSource); if (inputSource != null) { // Update our screen position from this move. Point pt = _stylusLogic.DeviceUnitsFromMeasureUnits((Point)_rawPosition); _lastScreenLocation = PointUtil.ClientToScreen(pt, inputSource); } // If we are not blocked from updating the location we want to use for the // promoted mouse location then update it. We set this flag in the post process phase // of Stylus events (after they have fired). if (!_fBlockMouseMoveChanges) { _lastMouseScreenLocation = _lastScreenLocation; } if ((report.Actions & RawStylusActions.Down) != 0 || (report.Actions & RawStylusActions.Move) != 0) { _fInAir = false; // Keep the stylus down location for turning system gestures into mouse event if ((report.Actions & RawStylusActions.Down) != 0) { _needToSendMouseDown = true; // reset the gesture flag. This is used to determine if we will need to fabricate a systemgesture tap on the // corresponding up event. _fGestureWasFired = false; _fDetectedDrag = false; _seenHoldEnterGesture = false; // Make sure our drag and move deltas are up to date. TabletDevice.UpdateSizeDeltas(report.StylusPointDescription, _stylusLogic); } // See if we need to do our own Drag detection (on Stylus Move event) else if (inputSource != null && _fBlockMouseMoveChanges && _seenDoubleTapGesture && !_fGestureWasFired && !_fDetectedDrag) { Size delta = TabletDevice.CancelSize; // We use the first point of the packet data for Drag detection to try and // filter out cases where the stylus skips when going down. Point dragPosition =(Point)_eventStylusPoints[0]; dragPosition = _stylusLogic.DeviceUnitsFromMeasureUnits(dragPosition); dragPosition = PointUtil.ClientToScreen(dragPosition, inputSource); // See if we need to detect a Drag gesture. If so do the calculation. if ((Math.Abs(_lastMouseScreenLocation.X - dragPosition.X) > delta.Width) || (Math.Abs(_lastMouseScreenLocation.Y - dragPosition.Y) > delta.Height)) { _fDetectedDrag = true; } } } UpdateEventStylusPoints(report, false); if ((report.Actions & RawStylusActions.Up) != 0 || (report.Actions & RawStylusActions.InAirMove) != 0) { _fInAir = true; if ((report.Actions & RawStylusActions.Up) != 0) { _sawMouseButton1Down = false; // reset this on Stylus Up. } } }
internal void UpdateEventStylusPoints(RawStylusInputReport report, bool resetIfNoOverride) { if (report.RawStylusInput != null && report.RawStylusInput.StylusPointsModified) { GeneralTransform transformToElement = report.RawStylusInput.Target.ViewToElement.Inverse; //note that RawStylusInput.Target (of type StylusPluginCollection) //guarantees that ViewToElement is invertible Debug.Assert(transformToElement != null); _eventStylusPoints = report.RawStylusInput.GetStylusPoints(transformToElement); } else if (resetIfNoOverride) { _eventStylusPoints = new StylusPointCollection(report.StylusPointDescription, report.GetRawPacketData(), GetTabletToElementTransform(null), Matrix.Identity); } }