qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/3] Fixes for "ui/cocoa: Let the platform toggle fullscreen"
@ 2024-03-23  6:20 Akihiko Odaki
  2024-03-23  6:20 ` [PATCH v2 1/3] ui/cocoa: Fix aspect ratio Akihiko Odaki
                   ` (3 more replies)
  0 siblings, 4 replies; 6+ messages in thread
From: Akihiko Odaki @ 2024-03-23  6:20 UTC (permalink / raw)
  To: Peter Maydell, Philippe Mathieu-Daudé, Gerd Hoffmann,
	Marc-André Lureau
  Cc: qemu-devel, Akihiko Odaki

This series contains patches for regressions caused by commit 91aa508d0274
("ui/cocoa: Let the platform toggle fullscreen").

Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
---
Changes in v2:
- Added a comment to [QemuCocoaView fixAspectRatio:]. (Peter Maydell)
- Renamed [QemuCocoaView fixAspectRatio:] parameter to match the
  comment. (Peter Maydell)
- Noted that "ui/cocoa: Use NSTrackingInVisibleRect" fixes mouse
  movement tracking. (Peter Maydell)
- Link to v1: https://lore.kernel.org/r/20240318-fixes-v1-0-34f1a849b0d9@daynix.com

---
Akihiko Odaki (3):
      ui/cocoa: Fix aspect ratio
      ui/cocoa: Resize window after toggling zoom-to-fit
      ui/cocoa: Use NSTrackingInVisibleRect

 ui/cocoa.m | 90 ++++++++++++++++++++++++++++++++++++++------------------------
 1 file changed, 55 insertions(+), 35 deletions(-)
---
base-commit: ba49d760eb04630e7b15f423ebecf6c871b8f77b
change-id: 20240318-fixes-7b187ec236a0

Best regards,
-- 
Akihiko Odaki <akihiko.odaki@daynix.com>



^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v2 1/3] ui/cocoa: Fix aspect ratio
  2024-03-23  6:20 [PATCH v2 0/3] Fixes for "ui/cocoa: Let the platform toggle fullscreen" Akihiko Odaki
@ 2024-03-23  6:20 ` Akihiko Odaki
  2024-03-24 14:15   ` Peter Maydell
  2024-03-23  6:20 ` [PATCH v2 2/3] ui/cocoa: Resize window after toggling zoom-to-fit Akihiko Odaki
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 6+ messages in thread
From: Akihiko Odaki @ 2024-03-23  6:20 UTC (permalink / raw)
  To: Peter Maydell, Philippe Mathieu-Daudé, Gerd Hoffmann,
	Marc-André Lureau
  Cc: qemu-devel, Akihiko Odaki

[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: 91aa508d0274 ("ui/cocoa: Let the platform toggle fullscreen")
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
---
 ui/cocoa.m | 41 ++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 40 insertions(+), 1 deletion(-)

diff --git a/ui/cocoa.m b/ui/cocoa.m
index fa879d7dcd4b..834ebf5f6175 100644
--- a/ui/cocoa.m
+++ b/ui/cocoa.m
@@ -508,6 +508,43 @@ - (void) drawRect:(NSRect) rect
     }
 }
 
+- (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;
@@ -525,8 +562,10 @@ - (void) resizeWindow
         [[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]];
     }
 }
 

-- 
2.44.0



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v2 2/3] ui/cocoa: Resize window after toggling zoom-to-fit
  2024-03-23  6:20 [PATCH v2 0/3] Fixes for "ui/cocoa: Let the platform toggle fullscreen" Akihiko Odaki
  2024-03-23  6:20 ` [PATCH v2 1/3] ui/cocoa: Fix aspect ratio Akihiko Odaki
@ 2024-03-23  6:20 ` Akihiko Odaki
  2024-03-23  6:20 ` [PATCH v2 3/3] ui/cocoa: Use NSTrackingInVisibleRect Akihiko Odaki
  2024-03-26  9:56 ` [PATCH v2 0/3] Fixes for "ui/cocoa: Let the platform toggle fullscreen" Philippe Mathieu-Daudé
  3 siblings, 0 replies; 6+ messages in thread
From: Akihiko Odaki @ 2024-03-23  6:20 UTC (permalink / raw)
  To: Peter Maydell, Philippe Mathieu-Daudé, Gerd Hoffmann,
	Marc-André Lureau
  Cc: qemu-devel, Akihiko Odaki

Resize the window so that the content will fit without zooming.

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>
---
 ui/cocoa.m | 1 +
 1 file changed, 1 insertion(+)

diff --git a/ui/cocoa.m b/ui/cocoa.m
index 834ebf5f6175..3a1b899ba768 100644
--- a/ui/cocoa.m
+++ b/ui/cocoa.m
@@ -1396,6 +1396,7 @@ - (void)zoomToFit:(id) sender
 
     [[cocoaView window] setStyleMask:styleMask];
     [sender setState:styleMask & NSWindowStyleMaskResizable ? NSControlStateValueOn : NSControlStateValueOff];
+    [cocoaView resizeWindow];
 }
 
 - (void)toggleZoomInterpolation:(id) sender

-- 
2.44.0



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v2 3/3] ui/cocoa: Use NSTrackingInVisibleRect
  2024-03-23  6:20 [PATCH v2 0/3] Fixes for "ui/cocoa: Let the platform toggle fullscreen" Akihiko Odaki
  2024-03-23  6:20 ` [PATCH v2 1/3] ui/cocoa: Fix aspect ratio Akihiko Odaki
  2024-03-23  6:20 ` [PATCH v2 2/3] ui/cocoa: Resize window after toggling zoom-to-fit Akihiko Odaki
@ 2024-03-23  6:20 ` Akihiko Odaki
  2024-03-26  9:56 ` [PATCH v2 0/3] Fixes for "ui/cocoa: Let the platform toggle fullscreen" Philippe Mathieu-Daudé
  3 siblings, 0 replies; 6+ messages in thread
From: Akihiko Odaki @ 2024-03-23  6:20 UTC (permalink / raw)
  To: Peter Maydell, Philippe Mathieu-Daudé, Gerd Hoffmann,
	Marc-André Lureau
  Cc: qemu-devel, Akihiko Odaki

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>
---
 ui/cocoa.m | 48 ++++++++++++++----------------------------------
 1 file changed, 14 insertions(+), 34 deletions(-)

diff --git a/ui/cocoa.m b/ui/cocoa.m
index 3a1b899ba768..fb60debb9a8e 100644
--- a/ui/cocoa.m
+++ b/ui/cocoa.m
@@ -306,7 +306,6 @@ static void handleAnyDeviceErrors(Error * err)
 */
 @interface QemuCocoaView : NSView
 {
-    NSTrackingArea *trackingArea;
     QEMUScreen screen;
     pixman_image_t *pixman_image;
     QKbdState *kbd;
@@ -359,6 +358,19 @@ - (id)initWithFrame:(NSRect)frameRect
     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;
         kbd = qkbd_state_init(dcl.con);
@@ -392,41 +404,9 @@ - (BOOL) isOpaque
     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) hideCursor
@@ -1302,7 +1282,7 @@ - (void)windowDidExitFullScreen:(NSNotification *)notification
 - (void)windowDidResize:(NSNotification *)notification
 {
     [cocoaView updateBounds];
-    [cocoaView frameUpdated];
+    [cocoaView updateUIInfo];
 }
 
 /* Called when the user clicks on a window's close button */

-- 
2.44.0



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 1/3] ui/cocoa: Fix aspect ratio
  2024-03-23  6:20 ` [PATCH v2 1/3] ui/cocoa: Fix aspect ratio Akihiko Odaki
@ 2024-03-24 14:15   ` Peter Maydell
  0 siblings, 0 replies; 6+ messages in thread
From: Peter Maydell @ 2024-03-24 14:15 UTC (permalink / raw)
  To: Akihiko Odaki
  Cc: Philippe Mathieu-Daudé, Gerd Hoffmann,
	Marc-André Lureau, qemu-devel

On Sat, 23 Mar 2024 at 06:20, Akihiko Odaki <akihiko.odaki@daynix.com> wrote:
>
> [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: 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>

thanks
-- PMM


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 0/3] Fixes for "ui/cocoa: Let the platform toggle fullscreen"
  2024-03-23  6:20 [PATCH v2 0/3] Fixes for "ui/cocoa: Let the platform toggle fullscreen" Akihiko Odaki
                   ` (2 preceding siblings ...)
  2024-03-23  6:20 ` [PATCH v2 3/3] ui/cocoa: Use NSTrackingInVisibleRect Akihiko Odaki
@ 2024-03-26  9:56 ` Philippe Mathieu-Daudé
  3 siblings, 0 replies; 6+ messages in thread
From: Philippe Mathieu-Daudé @ 2024-03-26  9:56 UTC (permalink / raw)
  To: Akihiko Odaki, Peter Maydell, Gerd Hoffmann,
	Marc-André Lureau
  Cc: qemu-devel

On 23/3/24 07:20, Akihiko Odaki wrote:
> This series contains patches for regressions caused by commit 91aa508d0274
> ("ui/cocoa: Let the platform toggle fullscreen").
> 

> ---
> Akihiko Odaki (3):
>        ui/cocoa: Fix aspect ratio
>        ui/cocoa: Resize window after toggling zoom-to-fit
>        ui/cocoa: Use NSTrackingInVisibleRect
> 
>   ui/cocoa.m | 90 ++++++++++++++++++++++++++++++++++++++------------------------
>   1 file changed, 55 insertions(+), 35 deletions(-)

Thanks, series queued.


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2024-03-26  9:57 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-03-23  6:20 [PATCH v2 0/3] Fixes for "ui/cocoa: Let the platform toggle fullscreen" Akihiko Odaki
2024-03-23  6:20 ` [PATCH v2 1/3] ui/cocoa: Fix aspect ratio Akihiko Odaki
2024-03-24 14:15   ` Peter Maydell
2024-03-23  6:20 ` [PATCH v2 2/3] ui/cocoa: Resize window after toggling zoom-to-fit Akihiko Odaki
2024-03-23  6:20 ` [PATCH v2 3/3] ui/cocoa: Use NSTrackingInVisibleRect Akihiko Odaki
2024-03-26  9:56 ` [PATCH v2 0/3] Fixes for "ui/cocoa: Let the platform toggle fullscreen" Philippe Mathieu-Daudé

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).