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: 91aa508d02
("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>
This commit is contained in:
parent
f69a6f0413
commit
ccebb9ae35
48
ui/cocoa.m
48
ui/cocoa.m
@ -307,7 +307,6 @@ static void handleAnyDeviceErrors(Error * err)
|
|||||||
*/
|
*/
|
||||||
@interface QemuCocoaView : NSView
|
@interface QemuCocoaView : NSView
|
||||||
{
|
{
|
||||||
NSTrackingArea *trackingArea;
|
|
||||||
QEMUScreen screen;
|
QEMUScreen screen;
|
||||||
pixman_image_t *pixman_image;
|
pixman_image_t *pixman_image;
|
||||||
BOOL isMouseGrabbed;
|
BOOL isMouseGrabbed;
|
||||||
@ -359,6 +358,19 @@ static CGEventRef handleTapEvent(CGEventTapProxy proxy, CGEventType type, CGEven
|
|||||||
self = [super initWithFrame:frameRect];
|
self = [super initWithFrame:frameRect];
|
||||||
if (self) {
|
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.width = frameRect.size.width;
|
||||||
screen.height = frameRect.size.height;
|
screen.height = frameRect.size.height;
|
||||||
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_VERSION_14_0
|
#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;
|
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
|
- (void) viewDidMoveToWindow
|
||||||
{
|
{
|
||||||
[self resizeWindow];
|
[self resizeWindow];
|
||||||
[self frameUpdated];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void) viewWillMoveToWindow:(NSWindow *)newWindow
|
|
||||||
{
|
|
||||||
[self removeTrackingRect];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) selectConsoleLocked:(unsigned int)index
|
- (void) selectConsoleLocked:(unsigned int)index
|
||||||
@ -1314,7 +1294,7 @@ static CGEventRef handleTapEvent(CGEventTapProxy proxy, CGEventType type, CGEven
|
|||||||
- (void)windowDidResize:(NSNotification *)notification
|
- (void)windowDidResize:(NSNotification *)notification
|
||||||
{
|
{
|
||||||
[cocoaView updateBounds];
|
[cocoaView updateBounds];
|
||||||
[cocoaView frameUpdated];
|
[cocoaView updateUIInfo];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called when the user clicks on a window's close button */
|
/* Called when the user clicks on a window's close button */
|
||||||
|
Loading…
Reference in New Issue
Block a user