diff --git a/build/HarfBuzzSharp.props b/build/HarfBuzzSharp.props
index 88c4d36282..e636461ad9 100644
--- a/build/HarfBuzzSharp.props
+++ b/build/HarfBuzzSharp.props
@@ -1,6 +1,6 @@
-
-
+
+
diff --git a/native/Avalonia.Native/src/OSX/window.mm b/native/Avalonia.Native/src/OSX/window.mm
index dd241409c7..fb945a105e 100644
--- a/native/Avalonia.Native/src/OSX/window.mm
+++ b/native/Avalonia.Native/src/OSX/window.mm
@@ -1209,6 +1209,7 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
bool _queuedDisplayFromThread;
NSTrackingArea* _area;
bool _isLeftPressed, _isMiddlePressed, _isRightPressed, _isXButton1Pressed, _isXButton2Pressed, _isMouseOver;
+ AvnInputModifiers _modifierState;
NSEvent* _lastMouseDownEvent;
bool _lastKeyHandled;
AvnPixelSize _lastPixelSize;
@@ -1251,6 +1252,8 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
_lastPixelSize.Height = 100;
_lastPixelSize.Width = 100;
[self registerForDraggedTypes: @[@"public.data", GetAvnCustomDataType()]];
+
+ _modifierState = AvnInputModifiersNone;
return self;
}
@@ -1594,6 +1597,63 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent
return result;
}
+- (void)flagsChanged:(NSEvent *)event
+{
+ auto newModifierState = [self getModifiers:[event modifierFlags]];
+
+ bool isAltCurrentlyPressed = (_modifierState & Alt) == Alt;
+ bool isControlCurrentlyPressed = (_modifierState & Control) == Control;
+ bool isShiftCurrentlyPressed = (_modifierState & Shift) == Shift;
+ bool isCommandCurrentlyPressed = (_modifierState & Windows) == Windows;
+
+ bool isAltPressed = (newModifierState & Alt) == Alt;
+ bool isControlPressed = (newModifierState & Control) == Control;
+ bool isShiftPressed = (newModifierState & Shift) == Shift;
+ bool isCommandPressed = (newModifierState & Windows) == Windows;
+
+
+ if (isAltPressed && !isAltCurrentlyPressed)
+ {
+ [self keyboardEvent:event withType:KeyDown];
+ }
+ else if (isAltCurrentlyPressed && !isAltPressed)
+ {
+ [self keyboardEvent:event withType:KeyUp];
+ }
+
+ if (isControlPressed && !isControlCurrentlyPressed)
+ {
+ [self keyboardEvent:event withType:KeyDown];
+ }
+ else if (isControlCurrentlyPressed && !isControlPressed)
+ {
+ [self keyboardEvent:event withType:KeyUp];
+ }
+
+ if (isShiftPressed && !isShiftCurrentlyPressed)
+ {
+ [self keyboardEvent:event withType:KeyDown];
+ }
+ else if(isShiftCurrentlyPressed && !isShiftPressed)
+ {
+ [self keyboardEvent:event withType:KeyUp];
+ }
+
+ if(isCommandPressed && !isCommandCurrentlyPressed)
+ {
+ [self keyboardEvent:event withType:KeyDown];
+ }
+ else if(isCommandCurrentlyPressed && ! isCommandPressed)
+ {
+ [self keyboardEvent:event withType:KeyUp];
+ }
+
+ _modifierState = newModifierState;
+
+ [[self inputContext] handleEvent:event];
+ [super flagsChanged:event];
+}
+
- (void)keyDown:(NSEvent *)event
{
[self keyboardEvent:event withType:KeyDown];
diff --git a/samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj b/samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj
index 2dbc095156..db1e16166a 100644
--- a/samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj
+++ b/samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj
@@ -9,6 +9,10 @@
ControlCatalog.iOS
Resources
ControlCatalogiOS
+ true
+ NSUrlSessionHandler
+ PackageReference
+ automatic
true
@@ -19,8 +23,8 @@
prompt
4
false
- i386
- SdkOnly
+ x86_64
+ None
True
9.1
False
@@ -43,7 +47,7 @@
prompt
4
None
- i386
+ x86_64
false
@@ -173,8 +177,10 @@
{d0a739b9-3c68-4ba6-a328-41606954b6bd}
ControlCatalog
+
+
diff --git a/samples/ControlCatalog/Pages/SplitViewPage.xaml b/samples/ControlCatalog/Pages/SplitViewPage.xaml
index 7e629db2da..6902b27715 100644
--- a/samples/ControlCatalog/Pages/SplitViewPage.xaml
+++ b/samples/ControlCatalog/Pages/SplitViewPage.xaml
@@ -58,12 +58,18 @@
+
-
+
+
+
+
+
+
@@ -76,7 +82,7 @@
-
+
diff --git a/src/Avalonia.Controls/SplitView.cs b/src/Avalonia.Controls/SplitView.cs
index fc3ff51f24..b71858f796 100644
--- a/src/Avalonia.Controls/SplitView.cs
+++ b/src/Avalonia.Controls/SplitView.cs
@@ -145,7 +145,7 @@ namespace Avalonia.Controls
private bool _isPaneOpen;
private Panel _pane;
- private CompositeDisposable _pointerDisposables;
+ private IDisposable _pointerDisposable;
public SplitView()
{
@@ -320,37 +320,14 @@ namespace Avalonia.Controls
var topLevel = this.VisualRoot;
if (topLevel is Window window)
{
- //Logic adapted from Popup
- //Basically if we're using an overlay DisplayMode, close the pane if we don't click on the pane
- IDisposable subscribeToEventHandler(T target, TEventHandler handler,
- Action subscribe, Action unsubscribe)
- {
- subscribe(target, handler);
- return Disposable.Create((unsubscribe, target, handler), state => state.unsubscribe(state.target, state.handler));
- }
-
- _pointerDisposables = new CompositeDisposable(
- window.AddDisposableHandler(PointerPressedEvent, PointerPressedOutside, RoutingStrategies.Tunnel),
- InputManager.Instance?.Process.Subscribe(OnNonClientClick),
- subscribeToEventHandler(window, Window_Deactivated,
- (x, handler) => x.Deactivated += handler, (x, handler) => x.Deactivated -= handler),
- subscribeToEventHandler(window.PlatformImpl, OnWindowLostFocus,
- (x, handler) => x.LostFocus += handler, (x, handler) => x.LostFocus -= handler));
+ _pointerDisposable = window.AddDisposableHandler(PointerPressedEvent, PointerPressedOutside, RoutingStrategies.Tunnel);
}
}
protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e)
{
base.OnDetachedFromVisualTree(e);
- _pointerDisposables?.Dispose();
- }
-
- private void OnWindowLostFocus()
- {
- if (IsPaneOpen && ShouldClosePane())
- {
- IsPaneOpen = false;
- }
+ _pointerDisposable?.Dispose();
}
private void PointerPressedOutside(object sender, PointerPressedEventArgs e)
@@ -371,7 +348,12 @@ namespace Avalonia.Controls
var src = e.Source as IVisual;
while (src != null)
{
- if (src == _pane)
+ // Make assumption that if Popup is in visual tree,
+ // owning control is within pane
+ // This works because if pane is triggered to close
+ // when clicked anywhere else in Window, the pane
+ // would close before the popup is opened
+ if (src == _pane || src is PopupRoot)
{
closePane = false;
break;
@@ -385,31 +367,7 @@ namespace Avalonia.Controls
e.Handled = true;
}
}
-
- private void OnNonClientClick(RawInputEventArgs obj)
- {
- if (!IsPaneOpen)
- {
- return;
- }
-
- var mouse = obj as RawPointerEventArgs;
- if (mouse?.Type == RawPointerEventType.NonClientLeftButtonDown)
-
- {
- if (ShouldClosePane())
- IsPaneOpen = false;
- }
- }
-
- private void Window_Deactivated(object sender, EventArgs e)
- {
- if (IsPaneOpen && ShouldClosePane())
- {
- IsPaneOpen = false;
- }
- }
-
+
private bool ShouldClosePane()
{
return (DisplayMode == SplitViewDisplayMode.CompactOverlay || DisplayMode == SplitViewDisplayMode.Overlay);
diff --git a/src/Skia/Avalonia.Skia/Gpu/OpenGl/GlRenderTarget.cs b/src/Skia/Avalonia.Skia/Gpu/OpenGl/GlRenderTarget.cs
index a90faf1448..081db5d26a 100644
--- a/src/Skia/Avalonia.Skia/Gpu/OpenGl/GlRenderTarget.cs
+++ b/src/Skia/Avalonia.Skia/Gpu/OpenGl/GlRenderTarget.cs
@@ -35,7 +35,6 @@ namespace Avalonia.Skia
IGlPlatformSurfaceRenderingSession glSession)
{
GrContext = grContext;
- GrContext.PurgeResources();
_backendRenderTarget = backendRenderTarget;
_surface = surface;
_glSession = glSession;
@@ -46,7 +45,6 @@ namespace Avalonia.Skia
_surface.Dispose();
_backendRenderTarget.Dispose();
GrContext.Flush();
- GrContext.PurgeResources();
_glSession.Dispose();
}