aboutsummaryrefslogtreecommitdiff
path: root/ui
diff options
context:
space:
mode:
authorAkihiko Odaki <akihiko.odaki@daynix.com>2024-03-23 15:20:03 +0900
committerPhilippe Mathieu-Daudé <philmd@linaro.org>2024-03-26 14:32:54 +0100
commitccebb9ae352eea63cb1491cb829e4cd0f7576f1c (patch)
tree6e0be7815daea92e97843e2f415165961d1e476d /ui
parentf69a6f04133df61e2ab23553496a070f27f5b732 (diff)
downloadqemu-ccebb9ae352eea63cb1491cb829e4cd0f7576f1c.zip
qemu-ccebb9ae352eea63cb1491cb829e4cd0f7576f1c.tar.gz
qemu-ccebb9ae352eea63cb1491cb829e4cd0f7576f1c.tar.bz2
ui/cocoa: Use NSTrackingInVisibleRect
I observed [NSTrackingArea rect] becomes de-synchronized with the view frame with some unknown condition, and fails to track mouse movement on some area of the view. Specify NSTrackingInVisibleRect option to let Cocoa automatically update NSTrackingArea, which also saves code for synchronization. Fixes: 91aa508d0274 ("ui/cocoa: Let the platform toggle fullscreen") Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Message-ID: <20240323-fixes-v2-3-18651a2b0394@daynix.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Diffstat (limited to 'ui')
-rw-r--r--ui/cocoa.m48
1 files changed, 14 insertions, 34 deletions
diff --git a/ui/cocoa.m b/ui/cocoa.m
index 3efa8ac..25e0db9 100644
--- a/ui/cocoa.m
+++ b/ui/cocoa.m
@@ -307,7 +307,6 @@ static void handleAnyDeviceErrors(Error * err)
*/
@interface QemuCocoaView : NSView
{
- NSTrackingArea *trackingArea;
QEMUScreen screen;
pixman_image_t *pixman_image;
BOOL isMouseGrabbed;
@@ -359,6 +358,19 @@ static CGEventRef handleTapEvent(CGEventTapProxy proxy, CGEventType type, CGEven
self = [super initWithFrame:frameRect];
if (self) {
+ NSTrackingAreaOptions options = NSTrackingActiveInKeyWindow |
+ NSTrackingMouseEnteredAndExited |
+ NSTrackingMouseMoved |
+ NSTrackingInVisibleRect;
+
+ NSTrackingArea *trackingArea =
+ [[NSTrackingArea alloc] initWithRect:CGRectZero
+ options:options
+ owner:self
+ userInfo:nil];
+
+ [self addTrackingArea:trackingArea];
+ [trackingArea release];
screen.width = frameRect.size.width;
screen.height = frameRect.size.height;
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_VERSION_14_0
@@ -389,41 +401,9 @@ static CGEventRef handleTapEvent(CGEventTapProxy proxy, CGEventType type, CGEven
return YES;
}
-- (void) removeTrackingRect
-{
- if (trackingArea) {
- [self removeTrackingArea:trackingArea];
- [trackingArea release];
- trackingArea = nil;
- }
-}
-
-- (void) frameUpdated
-{
- [self removeTrackingRect];
-
- if ([self window]) {
- NSTrackingAreaOptions options = NSTrackingActiveInKeyWindow |
- NSTrackingMouseEnteredAndExited |
- NSTrackingMouseMoved;
- trackingArea = [[NSTrackingArea alloc] initWithRect:[self frame]
- options:options
- owner:self
- userInfo:nil];
- [self addTrackingArea:trackingArea];
- [self updateUIInfo];
- }
-}
-
- (void) viewDidMoveToWindow
{
[self resizeWindow];
- [self frameUpdated];
-}
-
-- (void) viewWillMoveToWindow:(NSWindow *)newWindow
-{
- [self removeTrackingRect];
}
- (void) selectConsoleLocked:(unsigned int)index
@@ -1314,7 +1294,7 @@ static CGEventRef handleTapEvent(CGEventTapProxy proxy, CGEventType type, CGEven
- (void)windowDidResize:(NSNotification *)notification
{
[cocoaView updateBounds];
- [cocoaView frameUpdated];
+ [cocoaView updateUIInfo];
}
/* Called when the user clicks on a window's close button */