Skip to content

Commit

Permalink
Update to Avalonia@a08f4ac9 (Mar 31 2023) (#29)
Browse files Browse the repository at this point in the history
  • Loading branch information
jpobst committed Jul 11, 2023
1 parent d1a9078 commit f5eb837
Show file tree
Hide file tree
Showing 45 changed files with 3,695 additions and 914 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/dotnet.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@ jobs:

steps:
- uses: actions/checkout@v1

- name: Setup .NET Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: '6.0.x'
dotnet-version: '7.0.x'

- name: Build with dotnet
run: dotnet build --configuration Release
Expand Down
20 changes: 18 additions & 2 deletions build/update-avalonia.csx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ string avalonia_path = Path.Combine (avalonia_repo_path, "src");
string modern_windowkit_path = Path.Combine (modern_windowkit_repo_path, "src", "Modern.WindowKit");

CopyFile ("Avalonia.Base/Platform/AlphaFormat.cs", "AlphaFormat.cs");
CopyFile ("Avalonia.Base/Threading/AvaloniaSynchronizationContext.cs", "AvaloniaSynchronizationContext.cs");
CopyFile ("Avalonia.Base/Platform/Storage/FileIO/BclStorageFile.cs", "BclStorageFile.cs");
CopyFile ("Avalonia.Base/Platform/Storage/FileIO/BclStorageFolder.cs", "BclStorageFolder.cs");
CopyFile ("Avalonia.Base/Platform/Storage/FileIO/BclStorageProvider.cs", "BclStorageProvider.cs");
Expand All @@ -28,7 +29,15 @@ CopyFile ("Avalonia.Base/Input/DataFormats.cs", "DataFormats.cs");
CopyFile ("Avalonia.Base/Input/DataObject.cs", "DataObject.cs");
CopyFile ("Avalonia.Base/Platform/DefaultPlatformSettings.cs", "DefaultPlatformSettings.cs");
CopyFile ("Avalonia.Base/Threading/Dispatcher.cs", "Dispatcher.cs");
CopyFile ("Avalonia.Base/Threading/Dispatcher.Invoke.cs", "Dispatcher.Invoke.cs");
CopyFile ("Avalonia.Base/Threading/Dispatcher.MainLoop.cs", "Dispatcher.MainLoop.cs");
CopyFile ("Avalonia.Base/Threading/Dispatcher.Queue.cs", "Dispatcher.Queue.cs");
CopyFile ("Avalonia.Base/Threading/Dispatcher.Timers.cs", "Dispatcher.Timers.cs");
CopyFile ("Avalonia.Base/Threading/DispatcherOperation.cs", "DispatcherOperation.cs");
CopyFile ("Avalonia.Base/Threading/DispatcherFrame.cs", "DispatcherFrame.cs");
CopyFile ("Avalonia.Base/Threading/DispatcherPriority.cs", "DispatcherPriority.cs");
CopyFile ("Avalonia.Base/Threading/DispatcherPriorityQueue.cs", "DispatcherPriorityQueue.cs");
CopyFile ("Avalonia.Base/Threading/DispatcherTimer.cs", "DispatcherTimer.cs");
CopyFile ("Avalonia.Base/Reactive/Disposable.cs", "Disposable.cs");
CopyFile ("Avalonia.Controls/Platform/ExtendClientAreaChromeHints.cs", "ExtendClientAreaChromeHints.cs");
CopyFile ("Avalonia.Base/Platform/Storage/FilePickerFileType.cs", "FilePickerFileType.cs");
Expand All @@ -41,6 +50,7 @@ CopyFile ("Avalonia.Base/Input/Platform/IClipboard.cs", "IClipboard.cs");
CopyFile ("Avalonia.Base/Input/ICloseable.cs", "ICloseable.cs");
CopyFile ("Avalonia.Base/Input/IDataObject.cs", "IDataObject.cs");
CopyFile ("Avalonia.Base/Threading/IDispatcher.cs", "IDispatcher.cs");
CopyFile ("Avalonia.Base/Threading/IDispatcherImpl.cs", "IDispatcherImpl.cs");
CopyFile ("Avalonia.Controls/Platform/Surfaces/IFramebufferPlatformSurface.cs", "IFramebufferPlatformSurface.cs");
CopyFile ("Avalonia.Base/Input/IInputDevice.cs", "IInputDevice.cs");
CopyFile ("Avalonia.Base/Input/IKeyboardDevice.cs", "IKeyboardDevice.cs");
Expand Down Expand Up @@ -70,15 +80,18 @@ CopyFile ("Avalonia.Controls/Platform/IWindowBaseImpl.cs", "IWindowBaseImpl.cs")
CopyFile ("Avalonia.Controls/Platform/IWindowImpl.cs", "IWindowImpl.cs");
CopyFile ("Avalonia.Controls/Platform/IWindowingPlatform.cs", "IWindowingPlatform.cs");
CopyFile ("Avalonia.Base/Platform/IWriteableBitmapImpl.cs", "IWriteableBitmapImpl.cs");
CopyFile ("Avalonia.Base/Threading/JobRunner.cs", "JobRunner.cs");
//CopyFile ("Avalonia.Base/Threading/JobRunner.cs", "JobRunner.cs");
CopyFile ("Avalonia.Base/Input/Key.cs", "Key.cs");
CopyFile ("Avalonia.Base/Input/KeyboardDevice.cs", "KeyboardDevice.cs");
CopyFile ("Avalonia.Base/Platform/LockedFramebuffer.cs", "LockedFramebuffer.cs");
CopyFile ("Avalonia.Base/Compatibility/OperatingSystem.cs", "OperatingSystem.cs");
CopyFile ("Avalonia.Controls/Platform/ManagedDispatcherImpl.cs", "ManagedDispatcherImpl.cs");
CopyFile ("Avalonia.Controls/Primitives/PopupPositioning/ManagedPopupPositioner.cs", "ManagedPopupPositioner.cs");
CopyFile ("Avalonia.Controls/Primitives/PopupPositioning/ManagedPopupPositionerPopupImplHelper.cs", "ManagedPopupPositionerPopupImplHelper.cs");
CopyFile ("Avalonia.Base/Utilities/MathUtilities.cs", "MathUtilities.cs");
CopyFile ("Avalonia.Base/Input/MouseDevice.cs", "MouseDevice.cs");
CopyFile ("Avalonia.Base/Utilities/NonPumpingLockHelper.cs", "NonPumpingLockHelper.cs");
CopyFile ("Avalonia.Base/Threading/NonPumpingSyncContext.cs", "NonPumpingSyncContext.cs");
CopyFile ("Avalonia.Base/Metadata/NotClientImplementableAttribute.cs", "NotClientImplementableAttribute.cs");
CopyFile ("Avalonia.Base/Platform/Storage/PickerOptions.cs", "PickerOptions.cs");
CopyFile ("Avalonia.Base/Platform/PixelFormat.cs", "PixelFormat.cs");
Expand Down Expand Up @@ -131,10 +144,11 @@ CopyFile ("Avalonia.Native/CallbackBase.cs", "Avalonia.Mac/CallbackBase.cs");
CopyFile ("Avalonia.Native/ClipboardImpl.cs", "Avalonia.Mac/ClipboardImpl.cs");
CopyFile ("Avalonia.Native/Cursor.cs", "Avalonia.Mac/Cursor.cs");
CopyFile ("Avalonia.Native/DeferredFramebuffer.cs", "Avalonia.Mac/DeferredFramebuffer.cs");
CopyFile ("Avalonia.Native/DispatcherImpl.cs", "Avalonia.Mac/DispatcherImpl.cs");
CopyFile ("Avalonia.Native/DynLoader.cs", "Avalonia.Mac/DynLoader.cs");
CopyFile ("Avalonia.Native/Extensions.cs", "Avalonia.Mac/Extensions.cs");
CopyFile ("Avalonia.Native/Helpers.cs", "Avalonia.Mac/Helpers.cs");
CopyFile ("Avalonia.Native/PlatformThreadingInterface.cs", "Avalonia.Mac/PlatformThreadingInterface.cs");
//CopyFile ("Avalonia.Native/PlatformThreadingInterface.cs", "Avalonia.Mac/PlatformThreadingInterface.cs");
CopyFile ("Avalonia.Native/PopupImpl.cs", "Avalonia.Mac/PopupImpl.cs");
CopyFile ("Avalonia.Native/ScreenImpl.cs", "Avalonia.Mac/ScreenImpl.cs");
CopyFile ("Avalonia.Native/SystemDialogs.cs", "Avalonia.Mac/SystemDialogs.cs");
Expand All @@ -161,6 +175,7 @@ CopyFile ("Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs", "Avalonia.Win32/Win
CopyFile ("Windows/Avalonia.Win32/Input/WindowsKeyboardDevice.cs", "Avalonia.Win32/WindowsKeyboardDevice.cs");
CopyFile ("Windows/Avalonia.Win32/Input/WindowsMouseDevice.cs", "Avalonia.Win32/WindowsMouseDevice.cs");
CopyFile ("Windows/Avalonia.Win32/WinScreen.cs", "Avalonia.Win32/WinScreen.cs");
CopyFile ("Windows/Avalonia.Win32/Win32DispatcherImpl.cs", "Avalonia.Win32/Win32DispatcherImpl.cs");
CopyFile ("Windows/Avalonia.Win32/Win32PlatformSettings.cs", "Avalonia.Win32/Win32PlatformSettings.cs");
CopyFile ("Windows/Avalonia.Win32/Win32StorageProvider.cs", "Avalonia.Win32/Win32StorageProvider.cs");
CopyFile ("Windows/Avalonia.Win32/Win32TypeExtensions.cs", "Avalonia.Win32/Win32TypeExtensions.cs");
Expand Down Expand Up @@ -337,6 +352,7 @@ private void CopyFile (string src, string dst)
break;
case "Win32Platform.cs": // Win
text = text.Replace ("AvaloniaLocator.Current.GetRequiredService", "AvaloniaGlobals.GetRequiredService");
text = text.Replace ("private Win32DispatcherImpl _dispatcher;", "internal Win32DispatcherImpl _dispatcher;");
break;
case "X11Platform.cs":
text = text.Replace ("Avalonia.X11.X11Screens", "X11.X11Screens");
Expand Down
5 changes: 3 additions & 2 deletions src/Modern.WindowKit/Avalonia.Mac/AvaloniaNativePlatform.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
using Modern.WindowKit.Platform;
//using Modern.WindowKit.Rendering;
//using Modern.WindowKit.Rendering.Composition;
using Modern.WindowKit.Threading;
using Modern.WindowKit.MicroCom;

Check warning on line 13 in src/Modern.WindowKit/Avalonia.Mac/AvaloniaNativePlatform.cs

View workflow job for this annotation

GitHub Actions / build (macos-latest)

The using directive for 'Modern.WindowKit.MicroCom' appeared previously in this namespace

Check warning on line 13 in src/Modern.WindowKit/Avalonia.Mac/AvaloniaNativePlatform.cs

View workflow job for this annotation

GitHub Actions / build (windows-latest)

The using directive for 'Modern.WindowKit.MicroCom' appeared previously in this namespace

Check warning on line 13 in src/Modern.WindowKit/Avalonia.Mac/AvaloniaNativePlatform.cs

View workflow job for this annotation

GitHub Actions / build (ubuntu-20.04)

The using directive for 'Modern.WindowKit.MicroCom' appeared previously in this namespace
#nullable enable

Expand Down Expand Up @@ -98,8 +99,8 @@ void DoInitialize(AvaloniaNativePlatformOptions options)
//}

//AvaloniaLocator.CurrentMutable
// .Bind<IPlatformThreadingInterface>()
// .ToConstant(new PlatformThreadingInterface(_factory.CreatePlatformThreadingInterface()))
// .Bind<IDispatcherImpl>()
// .ToConstant(new DispatcherImpl(_factory.CreatePlatformThreadingInterface()))
// .Bind<ICursorFactory>().ToConstant(new CursorFactory(_factory.CreateCursorFactory()))
// .Bind<IPlatformIconLoader>().ToSingleton<IconLoader>()
// .Bind<IKeyboardDevice>().ToConstant(KeyboardDevice)
Expand Down
11 changes: 5 additions & 6 deletions src/Modern.WindowKit/Avalonia.Mac/CallbackBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Runtime.ExceptionServices;
using Modern.WindowKit.MicroCom;
using Modern.WindowKit.Platform;
using Modern.WindowKit.Threading;
using Modern.WindowKit.MicroCom;

Check warning on line 6 in src/Modern.WindowKit/Avalonia.Mac/CallbackBase.cs

View workflow job for this annotation

GitHub Actions / build (macos-latest)

The using directive for 'Modern.WindowKit.MicroCom' appeared previously in this namespace

Check warning on line 6 in src/Modern.WindowKit/Avalonia.Mac/CallbackBase.cs

View workflow job for this annotation

GitHub Actions / build (windows-latest)

The using directive for 'Modern.WindowKit.MicroCom' appeared previously in this namespace

Check warning on line 6 in src/Modern.WindowKit/Avalonia.Mac/CallbackBase.cs

View workflow job for this annotation

GitHub Actions / build (ubuntu-20.04)

The using directive for 'Modern.WindowKit.MicroCom' appeared previously in this namespace

namespace Modern.WindowKit.Native
Expand All @@ -10,12 +11,10 @@ internal abstract class NativeCallbackBase : CallbackBase, IMicroComExceptionCal
{
public void RaiseException(Exception e)
{
if (AvaloniaGlobals.GetService<IPlatformThreadingInterface>() is PlatformThreadingInterface threadingInterface)
if (AvaloniaLocator.Current.GetService<IDispatcherImpl>() is DispatcherImpl dispatcherImpl)
{
threadingInterface.TerminateNativeApp();

threadingInterface.DispatchException(ExceptionDispatchInfo.Capture(e));
}
dispatcherImpl.PropagateCallbackException(ExceptionDispatchInfo.Capture(e));
}
}
}
}
}
132 changes: 132 additions & 0 deletions src/Modern.WindowKit/Avalonia.Mac/DispatcherImpl.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
#nullable enable
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.ExceptionServices;
using System.Threading;
using Modern.WindowKit.Mac.Interop;
using Modern.WindowKit.Threading;
using Modern.WindowKit.MicroCom;

namespace Modern.WindowKit.Native;

internal class DispatcherImpl : IControlledDispatcherImpl, IDispatcherImplWithExplicitBackgroundProcessing
{
private readonly IAvnPlatformThreadingInterface _native;
private Thread? _loopThread;
private Stopwatch _clock = Stopwatch.StartNew();
private Stack<RunLoopFrame> _managedFrames = new();

public DispatcherImpl(IAvnPlatformThreadingInterface native)
{
_native = native;
using var events = new Events(this);
_native.SetEvents(events);
}

public event Action Signaled;
public event Action Timer;
public event Action ReadyForBackgroundProcessing;

private class Events : NativeCallbackBase, IAvnPlatformThreadingInterfaceEvents
{
private readonly DispatcherImpl _parent;

public Events(DispatcherImpl parent)
{
_parent = parent;
}
public void Signaled() => _parent.Signaled?.Invoke();

public void Timer() => _parent.Timer?.Invoke();

public void ReadyForBackgroundProcessing() => _parent.ReadyForBackgroundProcessing?.Invoke();
}

public bool CurrentThreadIsLoopThread
{
get
{
if (_loopThread != null)
return Thread.CurrentThread == _loopThread;
if (_native.CurrentThreadIsLoopThread == 0)
return false;
_loopThread = Thread.CurrentThread;
return true;
}
}

public void Signal() => _native.Signal();

public void UpdateTimer(long? dueTimeInMs)
{
var ms = dueTimeInMs == null ? -1 : (int)Math.Min(int.MaxValue - 10, Math.Max(1, dueTimeInMs.Value - Now));
_native.UpdateTimer(ms);
}

public bool CanQueryPendingInput => false;
public bool HasPendingInput => false;

class RunLoopFrame : IDisposable
{
public ExceptionDispatchInfo? Exception;
public CancellationTokenSource CancellationTokenSource = new();

public RunLoopFrame(CancellationToken token)
{
CancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(token);
}

public void Dispose() => CancellationTokenSource.Dispose();
}

public void RunLoop(CancellationToken token)
{
if (token.IsCancellationRequested)
return;
object l = new();
var exited = false;

using var frame = new RunLoopFrame(token);

using var cancel = _native.CreateLoopCancellation();
frame.CancellationTokenSource.Token.Register(() =>
{
lock (l)
// ReSharper disable once AccessToModifiedClosure
// ReSharper disable once AccessToDisposedClosure
if (!exited)
cancel.Cancel();
});

try
{
_managedFrames.Push(frame);
_native.RunLoop(cancel);
}
finally
{
lock (l)
exited = true;
_managedFrames.Pop();
if (frame.Exception != null)
frame.Exception.Throw();
}
}

public long Now => _clock.ElapsedMilliseconds;

public void PropagateCallbackException(ExceptionDispatchInfo capture)
{
if (_managedFrames.Count == 0)
{
Debug.Assert(false, "We should never get here");
return;
}

var frame = _managedFrames.Peek();
frame.Exception = capture;
frame.CancellationTokenSource.Cancel();
}
public void RequestBackgroundProcessing() => _native.RequestBackgroundProcessing();
}
115 changes: 0 additions & 115 deletions src/Modern.WindowKit/Avalonia.Mac/PlatformThreadingInterface.cs

This file was deleted.

Loading

0 comments on commit f5eb837

Please sign in to comment.