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:
parent
5c5d00df67
commit
d2ee0420a3
41
ui/cocoa.m
41
ui/cocoa.m
@ -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]];
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user