Browse Source

Add CallbackBase impl

pull/7506/head
Max Katz 4 years ago
parent
commit
4f2a4f785a
  1. 53
      src/Avalonia.MicroCom/CallbackBase.cs
  2. 2
      src/Avalonia.Native/AvaloniaNativeApplicationPlatform.cs
  3. 2
      src/Avalonia.Native/AvaloniaNativeDragSource.cs
  4. 2
      src/Avalonia.Native/AvaloniaNativePlatform.cs
  5. 49
      src/Avalonia.Native/CallbackBase.cs
  6. 2
      src/Avalonia.Native/DeferredFramebuffer.cs
  7. 2
      src/Avalonia.Native/IAvnMenu.cs
  8. 2
      src/Avalonia.Native/MenuActionCallback.cs
  9. 4
      src/Avalonia.Native/PlatformThreadingInterface.cs
  10. 2
      src/Avalonia.Native/PredicateCallback.cs
  11. 2
      src/Avalonia.Native/SystemDialogs.cs
  12. 2
      src/Avalonia.Native/WindowImplBase.cs
  13. 34
      src/Windows/Avalonia.Win32/DataObject.cs
  14. 16
      src/Windows/Avalonia.Win32/OleDragSource.cs
  15. 14
      src/Windows/Avalonia.Win32/OleDropTarget.cs

53
src/Avalonia.MicroCom/CallbackBase.cs

@ -0,0 +1,53 @@
namespace Avalonia.MicroCom
{
public abstract class CallbackBase : IUnknown, IMicroComShadowContainer
{
private readonly object _lock = new object();
private bool _referencedFromManaged = true;
private bool _referencedFromNative = false;
private bool _destroyed;
public bool IsDestroyed => _destroyed;
protected virtual void Destroyed()
{
}
public void Dispose()
{
lock (_lock)
{
_referencedFromManaged = false;
DestroyIfNeeded();
}
}
void DestroyIfNeeded()
{
if(_destroyed)
return;
if (_referencedFromManaged == false && _referencedFromNative == false)
{
_destroyed = true;
Destroyed();
}
}
public MicroComShadow Shadow { get; set; }
public void OnReferencedFromNative()
{
lock (_lock)
_referencedFromNative = true;
}
public void OnUnreferencedFromNative()
{
lock (_lock)
{
_referencedFromNative = false;
DestroyIfNeeded();
}
}
}
}

2
src/Avalonia.Native/AvaloniaNativeApplicationPlatform.cs

@ -6,7 +6,7 @@ using Avalonia.Platform;
namespace Avalonia.Native
{
internal class AvaloniaNativeApplicationPlatform : CallbackBase, IAvnApplicationEvents, IPlatformLifetimeEventsImpl
internal class AvaloniaNativeApplicationPlatform : NativeCallbackBase, IAvnApplicationEvents, IPlatformLifetimeEventsImpl
{
public event EventHandler<ShutdownRequestedEventArgs> ShutdownRequested;

2
src/Avalonia.Native/AvaloniaNativeDragSource.cs

@ -30,7 +30,7 @@ namespace Avalonia.Native
return visual.VisualRoot as TopLevel;
}
class DndCallback : CallbackBase, IAvnDndResultCallback
class DndCallback : NativeCallbackBase, IAvnDndResultCallback
{
private TaskCompletionSource<DragDropEffects> _tcs;

2
src/Avalonia.Native/AvaloniaNativePlatform.cs

@ -79,7 +79,7 @@ namespace Avalonia.Native
_factory = factory;
}
class GCHandleDeallocator : CallbackBase, IAvnGCHandleDeallocatorCallback
class GCHandleDeallocator : NativeCallbackBase, IAvnGCHandleDeallocatorCallback
{
public void FreeGCHandle(IntPtr handle)
{

49
src/Avalonia.Native/CallbackBase.cs

@ -5,19 +5,8 @@ using Avalonia.Platform;
namespace Avalonia.Native
{
public class CallbackBase : IUnknown, IMicroComShadowContainer, IMicroComExceptionCallback
public abstract class NativeCallbackBase : CallbackBase, IMicroComExceptionCallback
{
private readonly object _lock = new object();
private bool _referencedFromManaged = true;
private bool _referencedFromNative = false;
private bool _destroyed;
protected virtual void Destroyed()
{
}
public void RaiseException(Exception e)
{
if (AvaloniaLocator.Current.GetService<IPlatformThreadingInterface>() is PlatformThreadingInterface threadingInterface)
@ -27,41 +16,5 @@ namespace Avalonia.Native
threadingInterface.DispatchException(ExceptionDispatchInfo.Capture(e));
}
}
public void Dispose()
{
lock (_lock)
{
_referencedFromManaged = false;
DestroyIfNeeded();
}
}
void DestroyIfNeeded()
{
if(_destroyed)
return;
if (_referencedFromManaged == false && _referencedFromNative == false)
{
_destroyed = true;
Destroyed();
}
}
public MicroComShadow Shadow { get; set; }
public void OnReferencedFromNative()
{
lock (_lock)
_referencedFromNative = true;
}
public void OnUnreferencedFromNative()
{
lock (_lock)
{
_referencedFromNative = false;
DestroyIfNeeded();
}
}
}
}

2
src/Avalonia.Native/DeferredFramebuffer.cs

@ -27,7 +27,7 @@ namespace Avalonia.Native
public Vector Dpi { get; set; }
public PixelFormat Format { get; set; }
class Disposer : CallbackBase
class Disposer : NativeCallbackBase
{
private IntPtr _ptr;

2
src/Avalonia.Native/IAvnMenu.cs

@ -7,7 +7,7 @@ using Avalonia.Platform.Interop;
namespace Avalonia.Native.Interop
{
class MenuEvents : CallbackBase, IAvnMenuEvents
class MenuEvents : NativeCallbackBase, IAvnMenuEvents
{
private IAvnMenu _parent;

2
src/Avalonia.Native/MenuActionCallback.cs

@ -3,7 +3,7 @@ using Avalonia.Native.Interop;
namespace Avalonia.Native
{
public class MenuActionCallback : CallbackBase, IAvnActionCallback
public class MenuActionCallback : NativeCallbackBase, IAvnActionCallback
{
private Action _action;

4
src/Avalonia.Native/PlatformThreadingInterface.cs

@ -9,7 +9,7 @@ namespace Avalonia.Native
{
internal class PlatformThreadingInterface : IPlatformThreadingInterface
{
class TimerCallback : CallbackBase, IAvnActionCallback
class TimerCallback : NativeCallbackBase, IAvnActionCallback
{
readonly Action _tick;
@ -24,7 +24,7 @@ namespace Avalonia.Native
}
}
class SignaledCallback : CallbackBase, IAvnSignaledCallback
class SignaledCallback : NativeCallbackBase, IAvnSignaledCallback
{
readonly PlatformThreadingInterface _parent;

2
src/Avalonia.Native/PredicateCallback.cs

@ -3,7 +3,7 @@ using Avalonia.Native.Interop;
namespace Avalonia.Native
{
public class PredicateCallback : CallbackBase, IAvnPredicateCallback
public class PredicateCallback : NativeCallbackBase, IAvnPredicateCallback
{
private Func<bool> _predicate;

2
src/Avalonia.Native/SystemDialogs.cs

@ -62,7 +62,7 @@ namespace Avalonia.Native
}
}
internal unsafe class SystemDialogEvents : CallbackBase, IAvnSystemDialogEvents
internal unsafe class SystemDialogEvents : NativeCallbackBase, IAvnSystemDialogEvents
{
private TaskCompletionSource<string[]> _tcs;

2
src/Avalonia.Native/WindowImplBase.cs

@ -151,7 +151,7 @@ namespace Avalonia.Native
public IMouseDevice MouseDevice => _mouse;
public abstract IPopupImpl CreatePopup();
protected unsafe class WindowBaseEvents : CallbackBase, IAvnWindowBaseEvents
protected unsafe class WindowBaseEvents : NativeCallbackBase, IAvnWindowBaseEvents
{
private readonly WindowBaseImpl _parent;

34
src/Windows/Avalonia.Win32/DataObject.cs

@ -49,18 +49,16 @@ namespace Avalonia.Win32
}
}
internal class DataObject : IDisposableDataObject, Win32Com.IAvnDataObject, IMicroComShadowContainer
internal class DataObject : CallbackBase, IDisposableDataObject, Win32Com.IAvnDataObject
{
// Compatibility with WinForms + WPF...
internal static readonly byte[] SerializedObjectGUID = new Guid("FD9EA796-3B13-4370-A679-56106BB288FB").ToByteArray();
class FormatEnumerator : Win32Com.IEnumFORMATETC, IMicroComShadowContainer
class FormatEnumerator : CallbackBase, Win32Com.IEnumFORMATETC
{
private FORMATETC[] _formats;
private uint _current;
public MicroComShadow Shadow { get; set; }
private FormatEnumerator(FORMATETC[] formats, uint current)
{
_formats = formats;
@ -76,7 +74,7 @@ namespace Avalonia.Win32
private FORMATETC ConvertToFormatEtc(string aFormatName)
{
FORMATETC result = default(FORMATETC);
result.cfFormat = (ushort)ClipboardFormats.GetFormat(aFormatName);
result.cfFormat = ClipboardFormats.GetFormat(aFormatName);
result.dwAspect = DVASPECT.DVASPECT_CONTENT;
result.ptd = IntPtr.Zero;
result.lindex = -1;
@ -123,18 +121,6 @@ namespace Avalonia.Win32
{
return new FormatEnumerator(_formats, _current);
}
public void Dispose()
{
}
public void OnReferencedFromNative()
{
}
public void OnUnreferencedFromNative()
{
}
}
private const uint DV_E_TYMED = 0x80040069;
@ -149,8 +135,6 @@ namespace Avalonia.Win32
IDataObject _wrapped;
public MicroComShadow Shadow { get; set; }
public DataObject(IDataObject wrapped)
{
if (_wrapped is DataObject || _wrapped is OleDataObject)
@ -426,18 +410,10 @@ namespace Avalonia.Win32
}
}
public void Dispose()
{
}
public void OnReferencedFromNative()
protected override void Destroyed()
{
base.Destroyed();
}
public void OnUnreferencedFromNative()
{
}
#endregion
}
}

16
src/Windows/Avalonia.Win32/OleDragSource.cs

@ -6,7 +6,7 @@ using Avalonia.Win32.Win32Com;
namespace Avalonia.Win32
{
internal class OleDragSource : IDropSource, IMicroComShadowContainer
internal class OleDragSource : CallbackBase, IDropSource
{
private const int DRAGDROP_S_USEDEFAULTCURSORS = 0x00040102;
private const int DRAGDROP_S_DROP = 0x00040100;
@ -18,8 +18,6 @@ namespace Avalonia.Win32
(int)UnmanagedMethods.ModifierKeys.MK_RBUTTON
};
public MicroComShadow Shadow { get; set; }
public int QueryContinueDrag(int fEscapePressed, int grfKeyState)
{
if (fEscapePressed != 0)
@ -39,17 +37,5 @@ namespace Avalonia.Win32
{
return DRAGDROP_S_USEDEFAULTCURSORS;
}
public void Dispose()
{
}
public void OnReferencedFromNative()
{
}
public void OnUnreferencedFromNative()
{
}
}
}

14
src/Windows/Avalonia.Win32/OleDropTarget.cs

@ -7,7 +7,7 @@ using DropEffect = Avalonia.Win32.Win32Com.DropEffect;
namespace Avalonia.Win32
{
internal class OleDropTarget : Win32Com.IDropTarget, IMicroComShadowContainer
internal class OleDropTarget : CallbackBase, Win32Com.IDropTarget
{
private readonly IInputRoot _target;
private readonly ITopLevelImpl _tl;
@ -15,8 +15,6 @@ namespace Avalonia.Win32
private IDisposableDataObject _currentDrag = null;
public MicroComShadow Shadow { get; set; }
public OleDropTarget(ITopLevelImpl tl, IInputRoot target)
{
_dragDevice = AvaloniaLocator.Current.GetService<IDragDropDevice>();
@ -180,17 +178,9 @@ namespace Avalonia.Win32
return _target.PointToClient(screenPt);
}
public void Dispose()
protected override void Destroyed()
{
_currentDrag?.Dispose();
}
public void OnReferencedFromNative()
{
}
public void OnUnreferencedFromNative()
{
}
}
}

Loading…
Cancel
Save