From 74827aa05c36e79c55882bffebd7571de8194d3f Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 1 Sep 2020 20:28:45 +0100 Subject: [PATCH 1/5] update harfbuzz --- build/HarfBuzzSharp.props | 4 ++-- samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) 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/samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj b/samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj index 2dbc095156..69abbedbec 100644 --- a/samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj +++ b/samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj @@ -173,8 +173,10 @@ {d0a739b9-3c68-4ba6-a328-41606954b6bd} ControlCatalog + + From cf0ea3581a18002be7f357be651d13516226b4d4 Mon Sep 17 00:00:00 2001 From: amwx Date: Tue, 1 Sep 2020 16:54:44 -0500 Subject: [PATCH 2/5] Fix SplitView pane to work with popups --- .../ControlCatalog/Pages/SplitViewPage.xaml | 10 ++- src/Avalonia.Controls/SplitView.cs | 62 +++---------------- 2 files changed, 18 insertions(+), 54 deletions(-) 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); From 706cdf818af98f370602261ba0602821a27815e7 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 2 Sep 2020 10:52:45 +0100 Subject: [PATCH 3/5] fix emulator for ios. --- samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj b/samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj index 69abbedbec..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 From 4722767a9a5da6d9a170976e10cd0de13848d201 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 2 Sep 2020 11:02:39 +0100 Subject: [PATCH 4/5] remove purge resource calls. --- src/Skia/Avalonia.Skia/Gpu/OpenGl/GlRenderTarget.cs | 2 -- 1 file changed, 2 deletions(-) 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(); } From e2d45fd9087cf302617686cb308201330c0a34f7 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 2 Sep 2020 12:23:27 +0100 Subject: [PATCH 5/5] OSX fix dev tools ctrl + shift (implement keyevents on modifier key change events.) --- native/Avalonia.Native/src/OSX/window.mm | 60 ++++++++++++++++++++++++ 1 file changed, 60 insertions(+) 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];