Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/xwt.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVsevolod Kukol <sevoku@microsoft.com>2018-05-28 17:09:04 +0300
committerGitHub <noreply@github.com>2018-05-28 17:09:04 +0300
commit11ccfe89e73a61b226d93024db03f796ef076383 (patch)
tree1f1c5e0dfaecc7beb98416942c11dbb672590773
parentb98c74baaf259616ba1c155f45e03a7964e4d171 (diff)
parent5f077f0cd7d79dd44d25a0f37b7b4782e77ae19a (diff)
Merge pull request #760 from mono/leak-fix-attempt
Leak fix attempt
-rw-r--r--Xwt/Xwt.Backends/BackendHost.cs17
-rwxr-xr-xXwt/Xwt/Paned.cs11
-rw-r--r--Xwt/Xwt/Toolkit.cs2
-rw-r--r--Xwt/Xwt/WindowFrame.cs17
-rwxr-xr-xXwt/Xwt/XwtComponent.cs6
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>