Browse Source

Merge branch 'master' into update-obsolete-api-usages

pull/3403/head
Dariusz Komosiński 7 years ago
committed by GitHub
parent
commit
3dca33010c
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 5
      src/Avalonia.Native/Avalonia.Native.csproj
  2. 14
      src/Avalonia.Native/CallbackBase.cs
  3. 59
      src/Avalonia.Native/PlatformThreadingInterface.cs
  4. 4
      src/Avalonia.X11/X11Framebuffer.cs
  5. 8
      src/Avalonia.X11/X11Window.cs
  6. 2
      src/Shared/PlatformSupport/StandardRuntimePlatform.cs

5
src/Avalonia.Native/Avalonia.Native.csproj

@ -19,8 +19,9 @@
<ItemGroup>
<SharpGenMapping Include="Mappings.xml" />
<PackageReference Include="SharpGenTools.Sdk" Version="1.1.2" PrivateAssets="all" />
<PackageReference Include="SharpGen.Runtime.COM" Version="1.1.0" />
<PackageReference Include="SharpGenTools.Sdk" Version="1.2.1" PrivateAssets="all" />
<PackageReference Include="SharpGen.Runtime" Version="1.2.1" />
<PackageReference Include="SharpGen.Runtime.COM" Version="1.2.0" />
<ProjectReference Include="..\..\packages\Avalonia\Avalonia.csproj" />
<ProjectReference Include="..\Avalonia.Dialogs\Avalonia.Dialogs.csproj" />
</ItemGroup>

14
src/Avalonia.Native/CallbackBase.cs

@ -2,11 +2,13 @@
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
using System.Runtime.ExceptionServices;
using SharpGen.Runtime;
using Avalonia.Platform;
namespace Avalonia.Native
{
public class CallbackBase : SharpGen.Runtime.IUnknown
public class CallbackBase : SharpGen.Runtime.IUnknown, IExceptionCallback
{
private uint _refCount;
private bool _disposed;
@ -76,5 +78,15 @@ namespace Avalonia.Native
{
}
public void RaiseException(Exception e)
{
if (AvaloniaLocator.Current.GetService<IPlatformThreadingInterface>() is PlatformThreadingInterface threadingInterface)
{
threadingInterface.TerminateNativeApp();
threadingInterface.DispatchException(ExceptionDispatchInfo.Capture(e));
}
}
}
}

59
src/Avalonia.Native/PlatformThreadingInterface.cs

@ -2,6 +2,7 @@
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
using System.Runtime.ExceptionServices;
using System.Threading;
using Avalonia.Native.Interop;
using Avalonia.Platform;
@ -43,6 +44,8 @@ namespace Avalonia.Native
}
readonly IAvnPlatformThreadingInterface _native;
private ExceptionDispatchInfo _exceptionDispatchInfo;
private CancellationTokenSource _exceptionCancellationSource;
public PlatformThreadingInterface(IAvnPlatformThreadingInterface native)
{
@ -57,32 +60,48 @@ namespace Avalonia.Native
public void RunLoop(CancellationToken cancellationToken)
{
if (cancellationToken.CanBeCanceled == false)
_native.RunLoop(null);
else
var l = new object();
_exceptionCancellationSource = new CancellationTokenSource();
var compositeCancellation = CancellationTokenSource
.CreateLinkedTokenSource(cancellationToken, _exceptionCancellationSource.Token).Token;
var cancellation = _native.CreateLoopCancellation();
compositeCancellation.Register(() =>
{
var l = new object();
var cancellation = _native.CreateLoopCancellation();
cancellationToken.Register(() =>
lock (l)
{
lock (l)
{
cancellation?.Cancel();
}
});
try
{
_native.RunLoop(cancellation);
cancellation?.Cancel();
}
finally
});
try
{
_native.RunLoop(cancellation);
}
finally
{
lock (l)
{
lock(l)
{
cancellation?.Dispose();
cancellation = null;
}
cancellation?.Dispose();
cancellation = null;
}
}
if (_exceptionDispatchInfo != null)
{
_exceptionDispatchInfo.Throw();
}
}
public void DispatchException (ExceptionDispatchInfo exceptionInfo)
{
_exceptionDispatchInfo = exceptionInfo;
}
public void TerminateNativeApp()
{
_exceptionCancellationSource?.Cancel();
}
public void Signal(DispatcherPriority priority)

4
src/Avalonia.X11/X11Framebuffer.cs

@ -14,6 +14,10 @@ namespace Avalonia.X11
public X11Framebuffer(IntPtr display, IntPtr xid, int depth, int width, int height, double factor)
{
// HACK! Please fix renderer, should never ask for 0x0 bitmap.
width = Math.Max(1, width);
height = Math.Max(1, height);
_display = display;
_xid = xid;
_depth = depth;

8
src/Avalonia.X11/X11Window.cs

@ -102,7 +102,7 @@ namespace Avalonia.X11
valueMask |= SetWindowValuemask.ColorMap;
}
int defaultWidth = 300, defaultHeight = 200;
int defaultWidth = 0, defaultHeight = 0;
if (!_popup && Screen != null)
{
@ -117,6 +117,10 @@ namespace Avalonia.X11
}
}
// check if the calculated size is zero then compensate to hardcoded resolution
defaultWidth = Math.Max(defaultWidth, 300);
defaultHeight = Math.Max(defaultHeight, 200);
_handle = XCreateWindow(_x11.Display, _x11.RootWindow, 10, 10, defaultWidth, defaultHeight, 0,
depth,
(int)CreateWindowArgs.InputOutput,
@ -133,7 +137,7 @@ namespace Avalonia.X11
_renderHandle = _handle;
Handle = new PlatformHandle(_handle, "XID");
_realSize = new PixelSize(300, 200);
_realSize = new PixelSize(defaultWidth, defaultHeight);
platform.Windows[_handle] = OnEvent;
XEventMask ignoredMask = XEventMask.SubstructureRedirectMask
| XEventMask.ResizeRedirectMask

2
src/Shared/PlatformSupport/StandardRuntimePlatform.cs

@ -75,7 +75,7 @@ namespace Avalonia.Shared.PlatformSupport
lock (_btlock)
Backtraces.Remove(_backtrace);
#endif
_plat.Free(_address, Size);
_plat?.Free(_address, Size);
GC.RemoveMemoryPressure(Size);
IsDisposed = true;
_address = IntPtr.Zero;

Loading…
Cancel
Save