ui/cocoa: Fix aspect ratio

[NSWindow setContentAspectRatio:] does not trigger window resize itself,
so the wrong aspect ratio will persist if nothing resizes the window.
Call [NSWindow setContentSize:] in such a case.

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-1-18651a2b0394@daynix.com>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
This commit is contained in:
Akihiko Odaki 2024-03-23 15:20:01 +09:00 committed by Philippe Mathieu-Daudé
parent 5c5d00df67
commit d2ee0420a3

View File

@ -519,6 +519,43 @@ static CGEventRef handleTapEvent(CGEventTapProxy proxy, CGEventType type, CGEven
}
}
- (NSSize)fixAspectRatio:(NSSize)max
{
NSSize scaled;
NSSize fixed;
scaled.width = screen.width * max.height;
scaled.height = screen.height * max.width;
/*
* Here screen is our guest's output size, and max is the size of the
* largest possible area of the screen we can display on.
* We want to scale up (screen.width x screen.height) by either:
* 1) max.height / screen.height
* 2) max.width / screen.width
* With the first scale factor the scale will result in an output height of
* max.height (i.e. we will fill the whole height of the available screen
* space and have black bars left and right) and with the second scale
* factor the scaling will result in an output width of max.width (i.e. we
* fill the whole width of the available screen space and have black bars
* top and bottom). We need to pick whichever keeps the whole of the guest
* output on the screen, which is to say the smaller of the two scale
* factors.
* To avoid doing more division than strictly necessary, instead of directly
* comparing scale factors 1 and 2 we instead calculate and compare those
* two scale factors multiplied by (screen.height * screen.width).
*/
if (scaled.width < scaled.height) {
fixed.width = scaled.width / screen.height;
fixed.height = max.height;
} else {
fixed.width = max.width;
fixed.height = scaled.height / screen.width;
}
return fixed;
}
- (NSSize) screenSafeAreaSize
{
NSSize size = [[[self window] screen] frame].size;
@ -536,8 +573,10 @@ static CGEventRef handleTapEvent(CGEventTapProxy proxy, CGEventType type, CGEven
[[self window] setContentSize:NSMakeSize(screen.width, screen.height)];
[[self window] center];
} else if ([[self window] styleMask] & NSWindowStyleMaskFullScreen) {
[[self window] setContentSize:[self screenSafeAreaSize]];
[[self window] setContentSize:[self fixAspectRatio:[self screenSafeAreaSize]]];
[[self window] center];
} else {
[[self window] setContentSize:[self fixAspectRatio:[self frame].size]];
}
}