diff --git a/samples/ControlCatalog.Android/ControlCatalog.Android.csproj b/samples/ControlCatalog.Android/ControlCatalog.Android.csproj
index 04c67e84e8..ec88852feb 100644
--- a/samples/ControlCatalog.Android/ControlCatalog.Android.csproj
+++ b/samples/ControlCatalog.Android/ControlCatalog.Android.csproj
@@ -20,10 +20,13 @@
- True
+ False
+ False
True
True
- True
+ no-write-symbols,nodebug
+ Hybrid
+ True
diff --git a/src/Android/Avalonia.Android/AndroidPlatform.cs b/src/Android/Avalonia.Android/AndroidPlatform.cs
index 61aa6ce946..c7dd896cb8 100644
--- a/src/Android/Avalonia.Android/AndroidPlatform.cs
+++ b/src/Android/Avalonia.Android/AndroidPlatform.cs
@@ -61,8 +61,6 @@ namespace Avalonia.Android
.Bind().ToConstant(new RenderLoop())
.Bind().ToSingleton();
- SkiaPlatform.Initialize();
-
if (options.UseGpu)
{
EglPlatformOpenGlInterface.TryInitialize();
diff --git a/src/Android/Avalonia.Android/AvaloniaActivity.cs b/src/Android/Avalonia.Android/AvaloniaActivity.cs
index f5d620a97a..f3692d33d7 100644
--- a/src/Android/Avalonia.Android/AvaloniaActivity.cs
+++ b/src/Android/Avalonia.Android/AvaloniaActivity.cs
@@ -31,21 +31,22 @@ namespace Avalonia.Android
CustomizeAppBuilder(builder);
- View = new AvaloniaView(this);
- SetContentView(View);
var lifetime = new SingleViewLifetime();
- lifetime.View = View;
builder.AfterSetup(x =>
{
_viewModel = new ViewModelProvider(this).Get(Java.Lang.Class.FromType(typeof(AvaloniaViewModel))) as AvaloniaViewModel;
+ View = new AvaloniaView(this);
if (_viewModel.Content != null)
{
View.Content = _viewModel.Content;
}
+ SetContentView(View);
+ lifetime.View = View;
+
View.Prepare();
});
diff --git a/src/Avalonia.X11/X11Window.cs b/src/Avalonia.X11/X11Window.cs
index 9721a558f4..4975a59f33 100644
--- a/src/Avalonia.X11/X11Window.cs
+++ b/src/Avalonia.X11/X11Window.cs
@@ -47,6 +47,7 @@ namespace Avalonia.X11
private IntPtr _renderHandle;
private IntPtr _xSyncCounter;
private XSyncValue _xSyncValue;
+ private XSyncState _xSyncState = 0;
private bool _mapped;
private bool _wasMappedAtLeastOnce = false;
private double? _scalingOverride;
@@ -54,6 +55,14 @@ namespace Avalonia.X11
private TransparencyHelper _transparencyHelper;
private RawEventGrouper _rawEventGrouper;
private bool _useRenderWindow = false;
+
+ enum XSyncState
+ {
+ None,
+ WaitConfigure,
+ WaitPaint
+ }
+
public X11Window(AvaloniaX11Platform platform, IWindowImpl popupParent)
{
_platform = platform;
@@ -507,7 +516,11 @@ namespace Avalonia.X11
if (_useRenderWindow)
XConfigureResizeWindow(_x11.Display, _renderHandle, ev.ConfigureEvent.width,
ev.ConfigureEvent.height);
- EnqueuePaint();
+ if (_xSyncState == XSyncState.WaitConfigure)
+ {
+ _xSyncState = XSyncState.WaitPaint;
+ EnqueuePaint();
+ }
}
else if (ev.type == XEventName.DestroyNotify
&& ev.DestroyWindowEvent.window == _handle)
@@ -527,6 +540,7 @@ namespace Avalonia.X11
{
_xSyncValue.Lo = new UIntPtr(ev.ClientMessageEvent.ptr3.ToPointer()).ToUInt32();
_xSyncValue.Hi = ev.ClientMessageEvent.ptr4.ToInt32();
+ _xSyncState = XSyncState.WaitConfigure;
}
}
}
@@ -755,8 +769,11 @@ namespace Avalonia.X11
void DoPaint()
{
Paint?.Invoke(new Rect());
- if (_xSyncCounter != IntPtr.Zero)
+ if (_xSyncCounter != IntPtr.Zero && _xSyncState == XSyncState.WaitPaint)
+ {
+ _xSyncState = XSyncState.None;
XSyncSetCounter(_x11.Display, _xSyncCounter, _xSyncValue);
+ }
}
public void Invalidate(Rect rect)
@@ -802,6 +819,12 @@ namespace Avalonia.X11
XDestroyIC(_xic);
_xic = IntPtr.Zero;
}
+
+ if (_xSyncCounter != IntPtr.Zero)
+ {
+ XSyncDestroyCounter(_x11.Display, _xSyncCounter);
+ _xSyncCounter = IntPtr.Zero;
+ }
if (_handle != IntPtr.Zero)
{