Skip to content

Commit 3ac4041

Browse files
authored
Merge branch 'main' into issue/AvaloniaUI#16583-focus-issues-mac
2 parents b2c65fa + 19e88c8 commit 3ac4041

File tree

3 files changed

+29
-4
lines changed

3 files changed

+29
-4
lines changed

native/Avalonia.Native/src/OSX/WindowBaseImpl.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
_inResize = false;
3030
BaseEvents = events;
3131
View = [[AvnView alloc] initWithParent:this];
32-
InputMethod = new AvnTextInputMethod(View);
32+
InputMethod.setNoAddRef(new AvnTextInputMethod(View));
3333
StandardContainer = [[AutoFitContentView new] initWithContent:View];
3434

3535
lastPositionSet = { 0, 0 };

native/Avalonia.Native/src/OSX/WindowOverlayImpl.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ class WindowOverlayImpl : public virtual WindowImpl
1313
NSView* canvasView;
1414
NSColorPanel* colorPanel;
1515
bool isTrackingMouse;
16+
NSArray* eventMonitors;
1617
FORWARD_IUNKNOWN()
1718
BEGIN_INTERFACE_MAP()
1819
INHERIT_INTERFACE_MAP(WindowBaseImpl)
@@ -21,6 +22,7 @@ class WindowOverlayImpl : public virtual WindowImpl
2122
AvnInputModifiers GetCommandModifier(NSEventModifierFlags modFlag);
2223
public:
2324
WindowOverlayImpl(void* parentWindow, char* parentView, IAvnWindowEvents* events);
25+
virtual ~WindowOverlayImpl();
2426
virtual bool IsOverlay() override;
2527
virtual HRESULT GetScaling(double *ret) override;
2628
virtual HRESULT PointToClient(AvnPoint point, AvnPoint *ret) override;
@@ -30,6 +32,7 @@ class WindowOverlayImpl : public virtual WindowImpl
3032
virtual HRESULT TakeScreenshot(void** ret, int* retLength) override;
3133
virtual HRESULT PickColor(AvnColor color, bool* cancel, AvnColor* ret) override;
3234
virtual HRESULT Activate() override;
35+
virtual HRESULT Close() override;
3336
};
3437

3538
#endif

native/Avalonia.Native/src/OSX/WindowOverlayImpl.mm

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
11
#include "WindowOverlayImpl.h"
22
#include "WindowInterfaces.h"
33

4+
WindowOverlayImpl::~WindowOverlayImpl()
5+
{
6+
[View removeFromSuperview];
7+
[[NSNotificationCenter defaultCenter] removeObserver: View];
8+
9+
for (id monitor in eventMonitors)
10+
{
11+
[NSEvent removeMonitor: monitor];
12+
}
13+
}
14+
415
WindowOverlayImpl::WindowOverlayImpl(void* parentWindow, char* parentView, IAvnWindowEvents *events) : WindowImpl(events), WindowBaseImpl(events, false, true) {
516
this->parentWindow = (__bridge NSWindow*) parentWindow;
617
this->parentView = FindNSView(this->parentWindow, [NSString stringWithUTF8String:parentView]);
@@ -23,7 +34,7 @@
2334
[[NSNotificationCenter defaultCenter] addObserver:View selector:@selector(overlayWindowDidBecomeKey:) name:NSWindowDidBecomeKeyNotification object:this->parentWindow];
2435
[[NSNotificationCenter defaultCenter] addObserver:View selector:@selector(overlayWindowDidResignKey:) name:NSWindowDidResignKeyNotification object:this->parentWindow];
2536

26-
[NSEvent addLocalMonitorForEventsMatchingMask:NSEventMaskMouseMoved handler:^NSEvent * (NSEvent * event) {
37+
id mouseMovedMonitor = [NSEvent addLocalMonitorForEventsMatchingMask:NSEventMaskMouseMoved handler:^NSEvent * (NSEvent * event) {
2738
//NSLog(@"MONITOR mouseMoved START");
2839

2940
if ([event window] != this->parentWindow)
@@ -73,7 +84,7 @@
7384
}
7485
}];
7586

76-
[NSEvent addLocalMonitorForEventsMatchingMask:NSEventMaskLeftMouseDown handler:^NSEvent * (NSEvent * event) {
87+
id leftMouseDownMonitor = [NSEvent addLocalMonitorForEventsMatchingMask:NSEventMaskLeftMouseDown handler:^NSEvent * (NSEvent * event) {
7788
NSLog(@"MONITOR mouseDown START");
7889

7990
if ([event window] != this->parentWindow)
@@ -102,7 +113,7 @@
102113
return event;
103114
}];
104115

105-
[NSEvent addLocalMonitorForEventsMatchingMask:NSEventMaskKeyDown | NSEventMaskKeyUp | NSEventMaskFlagsChanged handler:^NSEvent * (NSEvent * event) {
116+
id keydownMonitor = [NSEvent addLocalMonitorForEventsMatchingMask:NSEventMaskKeyDown | NSEventMaskKeyUp | NSEventMaskFlagsChanged handler:^NSEvent * (NSEvent * event) {
106117
bool handled = false;
107118
NSUInteger flags = [event modifierFlags] & NSEventModifierFlagDeviceIndependentFlagsMask;
108119

@@ -189,6 +200,8 @@
189200
return event;
190201
}
191202
}];
203+
204+
eventMonitors = [NSArray arrayWithObjects: mouseMovedMonitor, leftMouseDownMonitor, keydownMonitor, nil];
192205
}
193206

194207

@@ -239,6 +252,15 @@
239252
return S_OK;
240253
}
241254

255+
HRESULT WindowOverlayImpl::Close()
256+
{
257+
START_COM_CALL;
258+
HRESULT result = WindowImpl::Close();
259+
[View onClosed];
260+
261+
return result;
262+
}
263+
242264
HRESULT WindowOverlayImpl::PointToClient(AvnPoint point, AvnPoint *ret) {
243265
START_COM_CALL;
244266

0 commit comments

Comments
 (0)