internal void DisposeOrDeferDisposal() { // Only dispose when no input events are left in the queue if (CanDispose) { // Make sure this device is not the current one. if (Tablet.CurrentTabletDevice == this.TabletDevice) { StylusLogic.GetCurrentStylusLogicAs <WispLogic>().SelectStylusDevice(null, null, true); } // A disconnect will be logged in the dispose as WPF will have gotten rid of the tablet. StylusTraceLogger.LogDeviceDisconnect(_tabletInfo.Id); // DDVSO:174153 // Force tablets to clean up as soon as they are disposed. This helps to reduce // COM references that might be waiting for RCWs to finalize. IPimcTablet2 tablet = _tabletInfo.PimcTablet?.Value; _tabletInfo.PimcTablet = null; if (tablet != null) { // DDVSO:514949 // Balance calls in PenThreadWorker.GetTabletInfoHelper and CPimcTablet::Init. PenThread.WorkerReleaseTabletLocks(tablet, _tabletInfo.WispTabletKey); Marshal.ReleaseComObject(tablet); } StylusDeviceCollection styluses = _stylusDeviceCollection; _stylusDeviceCollection = null; if (styluses != null) { styluses.Dispose(); } _penThread = null; _isDisposalPending = false; // DDVSO:614343 // Ensure that we are marked disposed and no longer attempt to finalize. _disposed = true; GC.SuppressFinalize(this); } else { _isDisposalPending = true; } }
internal void DisposeOrDeferDisposal() { // Only dispose when no input events are left in the queue if (CanDispose) { // Make sure this device is not the current one. if (Tablet.CurrentTabletDevice == this.TabletDevice) { StylusLogic.GetCurrentStylusLogicAs <WispLogic>().SelectStylusDevice(null, null, true); } // A disconnect will be logged in the dispose as WPF will have gotten rid of the tablet. StylusTraceLogger.LogDeviceDisconnect(_tabletInfo.Id); // DDVSO:174153 // Force tablets to clean up as soon as they are disposed. This helps to reduce // COM references that might be waiting for RCWs to finalize. IPimcTablet2 tablet = _tabletInfo.PimcTablet?.Value; _tabletInfo.PimcTablet = null; if (tablet != null) { Marshal.ReleaseComObject(tablet); } StylusDeviceCollection styluses = _stylusDeviceCollection; _stylusDeviceCollection = null; if (styluses != null) { styluses.Dispose(); } _penThread = null; _isDisposalPending = false; } else { _isDisposalPending = true; } }