diff options
author | Vsevolod Kukol <sevoku@microsoft.com> | 2018-05-28 17:09:04 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-05-28 17:09:04 +0300 |
commit | 11ccfe89e73a61b226d93024db03f796ef076383 (patch) | |
tree | 1f1c5e0dfaecc7beb98416942c11dbb672590773 | |
parent | b98c74baaf259616ba1c155f45e03a7964e4d171 (diff) | |
parent | 5f077f0cd7d79dd44d25a0f37b7b4782e77ae19a (diff) |
Merge pull request #760 from mono/leak-fix-attempt
Leak fix attempt
-rw-r--r-- | Xwt/Xwt.Backends/BackendHost.cs | 17 | ||||
-rwxr-xr-x | Xwt/Xwt/Paned.cs | 11 | ||||
-rw-r--r-- | Xwt/Xwt/Toolkit.cs | 2 | ||||
-rw-r--r-- | Xwt/Xwt/WindowFrame.cs | 17 | ||||
-rwxr-xr-x | Xwt/Xwt/XwtComponent.cs | 6 |
5 files changed, 41 insertions, 12 deletions
diff --git a/Xwt/Xwt.Backends/BackendHost.cs b/Xwt/Xwt.Backends/BackendHost.cs index 14458a6b..025ee8ab 100644 --- a/Xwt/Xwt.Backends/BackendHost.cs +++ b/Xwt/Xwt.Backends/BackendHost.cs @@ -59,7 +59,7 @@ namespace Xwt.Backends /// <summary> /// The BackendHost is the link between an Xwt frontend and a toolkit backend. /// </summary> - public class BackendHost: EventHost + public class BackendHost: EventHost, IDisposable { IBackend backend; bool usingCustomBackend; @@ -131,8 +131,10 @@ namespace Xwt.Backends /// </summary> protected virtual void OnBackendCreated () { - foreach (var ev in DefaultEnabledEvents) + foreach (var ev in DefaultEnabledEvents) { + enabledEvents.Add (ev); Backend.EnableEvent (ev); + } } /// <summary> @@ -171,12 +173,15 @@ namespace Xwt.Backends } } + List<object> enabledEvents = new List<object> (); + /// <summary> /// Enables an event with the specified identifier. /// </summary> /// <param name="eventId">Event identifier (must be a valid event enum value).</param> protected override void OnEnableEvent (object eventId) { + enabledEvents.Add (eventId); Backend.EnableEvent (eventId); } @@ -186,8 +191,16 @@ namespace Xwt.Backends /// <param name="eventId">Event identifier (must be a valid event enum value).</param> protected override void OnDisableEvent (object eventId) { + enabledEvents.Remove (eventId); Backend.DisableEvent (eventId); } + + public void Dispose () + { + foreach (var ev in enabledEvents) + Backend.DisableEvent (ev); + enabledEvents.Clear (); + } } } diff --git a/Xwt/Xwt/Paned.cs b/Xwt/Xwt/Paned.cs index dce339df..37cc7641 100755 --- a/Xwt/Xwt/Paned.cs +++ b/Xwt/Xwt/Paned.cs @@ -44,17 +44,18 @@ namespace Xwt { IPanedBackend b = (IPanedBackend) base.OnCreateBackend (); - // We always want to listen this event because we use it - // to reallocate the children - if (!EngineBackend.HandlesSizeNegotiation) - b.EnableEvent (PanedEvent.PositionChanged); - return b; } protected override void OnBackendCreated () { Backend.Initialize (Parent.direction); + + // We always want to listen this event because we use it + // to reallocate the children + if (!EngineBackend.HandlesSizeNegotiation) + OnEnableEvent (PanedEvent.PositionChanged); + base.OnBackendCreated (); } diff --git a/Xwt/Xwt/Toolkit.cs b/Xwt/Xwt/Toolkit.cs index 4ecd1f44..f087e5b1 100644 --- a/Xwt/Xwt/Toolkit.cs +++ b/Xwt/Xwt/Toolkit.cs @@ -830,7 +830,7 @@ namespace Xwt class NativeWindowFrame: WindowFrame { - public NativeWindowFrame (IWindowFrameBackend backend) + public NativeWindowFrame (IWindowFrameBackend backend) : base (owned: false) { BackendHost.SetCustomBackend (backend); } diff --git a/Xwt/Xwt/WindowFrame.cs b/Xwt/Xwt/WindowFrame.cs index 890b9dc4..9ae1f4c9 100644 --- a/Xwt/Xwt/WindowFrame.cs +++ b/Xwt/Xwt/WindowFrame.cs @@ -74,6 +74,7 @@ namespace Xwt bool pendingReallocation; Image icon; WindowFrame transientFor; + protected bool Owned { get; } protected class WindowBackendHost: BackendHost<WindowFrame,IWindowFrameBackend>, IWindowFrameEventSink { @@ -83,7 +84,8 @@ namespace Xwt base.OnBackendCreated (); Parent.location = Backend.Bounds.Location; Parent.size = Backend.Bounds.Size; - Backend.EnableEvent (WindowFrameEvent.BoundsChanged); + if (Parent.Owned) + OnEnableEvent (WindowFrameEvent.BoundsChanged); } public void OnBoundsChanged (Rectangle bounds) @@ -120,7 +122,12 @@ namespace Xwt MapEvent (WindowFrameEvent.Closed, typeof(WindowFrame), "OnClosed"); } - public WindowFrame () + protected WindowFrame (bool owned) + { + Owned = owned; + } + + public WindowFrame () : this (owned: true) { if (!(base.BackendHost is WindowBackendHost)) throw new InvalidOperationException ("CreateBackendHost for WindowFrame did not return a WindowBackendHost instance"); @@ -137,7 +144,7 @@ namespace Xwt // Don't dispose the backend if this object is being finalized // The backend has to handle the finalizing on its own - if (disposing && BackendHost.BackendCreated) + if (disposing && BackendHost.BackendCreated && Owned) Backend.Dispose (); } @@ -403,7 +410,9 @@ namespace Xwt internal virtual Rectangle BackendBounds { get { BackendHost.EnsureBackendLoaded (); - return new Rectangle (location, size); + if (Owned) + return new Rectangle (location, size); + return Backend.Bounds; } set { size = value.Size; diff --git a/Xwt/Xwt/XwtComponent.cs b/Xwt/Xwt/XwtComponent.cs index 4b5974e5..fa935d12 100755 --- a/Xwt/Xwt/XwtComponent.cs +++ b/Xwt/Xwt/XwtComponent.cs @@ -74,6 +74,12 @@ namespace Xwt get { return backendHost.Backend; } } + protected override void Dispose(bool release_all) + { + backendHost.Dispose (); + base.Dispose(release_all); + } + /// <summary> /// Gets or sets the name of this component. /// </summary> |