Browse Source

Properly handle disposal for Win32 and GTK3

pull/880/head
Nikita Tsukanov 9 years ago
parent
commit
f6ea72872a
  1. 6
      src/Gtk/Avalonia.Gtk3/TopLevelImpl.cs
  2. 28
      src/Windows/Avalonia.Win32/WindowImpl.cs

6
src/Gtk/Avalonia.Gtk3/TopLevelImpl.cs

@ -75,7 +75,7 @@ namespace Avalonia.Gtk3
private bool OnDestroy(IntPtr gtkwidget, IntPtr userdata) private bool OnDestroy(IntPtr gtkwidget, IntPtr userdata)
{ {
Closed?.Invoke(); Dispose();
return false; return false;
} }
@ -210,7 +210,9 @@ namespace Avalonia.Gtk3
public void Dispose() public void Dispose()
{ {
Closed?.Invoke(); //We are calling it here, since signal handler will be detached
if (!GtkWidget.IsClosed)
Closed?.Invoke();
foreach(var d in Disposables.AsEnumerable().Reverse()) foreach(var d in Disposables.AsEnumerable().Reverse())
d.Dispose(); d.Dispose();
Disposables.Clear(); Disposables.Clear();

28
src/Windows/Avalonia.Win32/WindowImpl.cs

@ -182,9 +182,18 @@ namespace Avalonia.Win32
public void Dispose() public void Dispose()
{ {
s_instances.Remove(this); _framebuffer?.Dispose();
_framebuffer.Dispose(); _framebuffer = null;
UnmanagedMethods.DestroyWindow(_hwnd); if (_hwnd != IntPtr.Zero)
{
UnmanagedMethods.DestroyWindow(_hwnd);
_hwnd = IntPtr.Zero;
}
if (_className != null)
{
UnmanagedMethods.UnregisterClass(_className, UnmanagedMethods.GetModuleHandle(null));
_className = null;
}
} }
public void Hide() public void Hide()
@ -418,12 +427,13 @@ namespace Avalonia.Win32
return IntPtr.Zero; return IntPtr.Zero;
case UnmanagedMethods.WindowsMessage.WM_DESTROY: case UnmanagedMethods.WindowsMessage.WM_DESTROY:
if (Closed != null) //Window doesn't exist anymore
{ _hwnd = IntPtr.Zero;
UnmanagedMethods.UnregisterClass(_className, UnmanagedMethods.GetModuleHandle(null)); //Remove root reference to this class, so unmanaged delegate can be collected
Closed(); s_instances.Remove(this);
} Closed?.Invoke();
//Free other resources
Dispose();
return IntPtr.Zero; return IntPtr.Zero;
case UnmanagedMethods.WindowsMessage.WM_DPICHANGED: case UnmanagedMethods.WindowsMessage.WM_DPICHANGED:

Loading…
Cancel
Save