qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v11 0/6] ui/cocoa: Use NSWindow's ability to resize
@ 2024-02-17 11:18 Akihiko Odaki
  2024-02-17 11:18 ` [PATCH v11 1/6] ui/cocoa: Release specific mouse buttons Akihiko Odaki
                   ` (5 more replies)
  0 siblings, 6 replies; 16+ messages in thread
From: Akihiko Odaki @ 2024-02-17 11:18 UTC (permalink / raw)
  To: Peter Maydell, Philippe Mathieu-Daudé, Gerd Hoffmann,
	Marc-André Lureau, Marek Glogowski, BALATON Zoltan,
	Rene Engel
  Cc: qemu-devel, Akihiko Odaki

V5 -> V6:
  Rebased.

Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
---
Changes in v11:
- Ensured to reflect screen size changes to bounds
- Link to v10: https://lore.kernel.org/r/20240214-cocoa-v10-0-c7ffe5d9f08a@daynix.com

Changes in v10:
- Removed relative mouse input scaling.
- Link to v9: https://lore.kernel.org/r/20240213-cocoa-v9-0-d5a5e1bf0490@daynix.com

Changes in v9:
- Split patch "ui/cocoa: Use NSWindow's ability to resize" into patches
  "ui/cocoa: Let the platform toggle fullscreen", "ui/cocoa: Make window
  resizable", "ui/cocoa: Call console_select() with the BQL".
- Added patch "ui/cocoa: Scale with NSView instead of Core Graphics".
- Rebased.
- Dropped Tested-by: from patch "ui/cocoa: Use NSWindow's ability to
  resize".
- Link to v8: https://lore.kernel.org/r/20231218-cocoa-v8-0-d7fad80c7ef6@daynix.com

Changes in v8:
- Split into three patches. (BALATON Zoltan)
- Removed negative full-screen conditions. (BALATON Zoltan)
- Converted a C++-style comment to C style.
- Link to v7: https://lore.kernel.org/r/20231217-cocoa-v7-1-6af21ef75680@daynix.com

Changes in v7:
- Fixed zoom-to-fit option. (Marek Glogowski)
- Link to v6: https://lore.kernel.org/r/20231211-cocoa-v6-1-49f3be0191f2@daynix.com

---
Akihiko Odaki (6):
      ui/cocoa: Release specific mouse buttons
      ui/cocoa: Scale with NSView instead of Core Graphics
      ui/cocoa: Let the platform toggle fullscreen
      ui/cocoa: Make window resizable
      ui/cocoa: Call console_select() with the BQL
      ui/cocoa: Remove stretch_video flag

 ui/cocoa.m | 533 +++++++++++++++++++++++++++++--------------------------------
 1 file changed, 250 insertions(+), 283 deletions(-)
---
base-commit: 5005aed8a7e728d028efb40e243ecfc2b4f3df3a
change-id: 20231211-cocoa-576b8639e9bd

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



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

* [PATCH v11 1/6] ui/cocoa: Release specific mouse buttons
  2024-02-17 11:18 [PATCH v11 0/6] ui/cocoa: Use NSWindow's ability to resize Akihiko Odaki
@ 2024-02-17 11:18 ` Akihiko Odaki
  2024-02-22 16:40   ` Peter Maydell
  2024-02-17 11:18 ` [PATCH v11 2/6] ui/cocoa: Scale with NSView instead of Core Graphics Akihiko Odaki
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 16+ messages in thread
From: Akihiko Odaki @ 2024-02-17 11:18 UTC (permalink / raw)
  To: Peter Maydell, Philippe Mathieu-Daudé, Gerd Hoffmann,
	Marc-André Lureau, Marek Glogowski, BALATON Zoltan,
	Rene Engel
  Cc: qemu-devel, Akihiko Odaki

ui/cocoa used to release all mouse buttons when it sees
NSEventTypeLeftMouseUp, NSEventTypeRightMouseUp, or
NSEventTypeOtherMouseUp, but it can instead release specific one
according to the delivered event.

Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
---
 ui/cocoa.m | 132 ++++++++++++++++++++++++++-----------------------------------
 1 file changed, 55 insertions(+), 77 deletions(-)

diff --git a/ui/cocoa.m b/ui/cocoa.m
index eb99064beeb4..fe0eb74b0743 100644
--- a/ui/cocoa.m
+++ b/ui/cocoa.m
@@ -99,7 +99,6 @@ static void cocoa_switch(DisplayChangeListener *dcl,
 static DisplayChangeListener dcl = {
     .ops = &dcl_ops,
 };
-static int last_buttons;
 static int cursor_hide = 1;
 static int left_command_key_enabled = 1;
 static bool swap_opt_cmd;
@@ -801,8 +800,6 @@ - (bool) handleEventLocked:(NSEvent *)event
     COCOA_DEBUG("QemuCocoaView: handleEvent\n");
     int buttons = 0;
     int keycode = 0;
-    bool mouse_event = false;
-    // Location of event in virtual screen coordinates
     NSPoint p = [self screenLocationOfEvent:event];
     NSUInteger modifiers = [event modifierFlags];
 
@@ -883,25 +880,25 @@ - (bool) handleEventLocked:(NSEvent *)event
                     if (!!(modifiers & NSEventModifierFlagShift)) {
                         [self toggleKey:Q_KEY_CODE_SHIFT];
                     }
-                    break;
+                    return true;
 
                 case kVK_RightShift:
                     if (!!(modifiers & NSEventModifierFlagShift)) {
                         [self toggleKey:Q_KEY_CODE_SHIFT_R];
                     }
-                    break;
+                    return true;
 
                 case kVK_Control:
                     if (!!(modifiers & NSEventModifierFlagControl)) {
                         [self toggleKey:Q_KEY_CODE_CTRL];
                     }
-                    break;
+                    return true;
 
                 case kVK_RightControl:
                     if (!!(modifiers & NSEventModifierFlagControl)) {
                         [self toggleKey:Q_KEY_CODE_CTRL_R];
                     }
-                    break;
+                    return true;
 
                 case kVK_Option:
                     if (!!(modifiers & NSEventModifierFlagOption)) {
@@ -911,7 +908,7 @@ - (bool) handleEventLocked:(NSEvent *)event
                             [self toggleKey:Q_KEY_CODE_ALT];
                         }
                     }
-                    break;
+                    return true;
 
                 case kVK_RightOption:
                     if (!!(modifiers & NSEventModifierFlagOption)) {
@@ -921,7 +918,7 @@ - (bool) handleEventLocked:(NSEvent *)event
                             [self toggleKey:Q_KEY_CODE_ALT_R];
                         }
                     }
-                    break;
+                    return true;
 
                 /* Don't pass command key changes to guest unless mouse is grabbed */
                 case kVK_Command:
@@ -934,7 +931,7 @@ - (bool) handleEventLocked:(NSEvent *)event
                             [self toggleKey:Q_KEY_CODE_META_L];
                         }
                     }
-                    break;
+                    return true;
 
                 case kVK_RightCommand:
                     if (isMouseGrabbed &&
@@ -945,9 +942,11 @@ - (bool) handleEventLocked:(NSEvent *)event
                             [self toggleKey:Q_KEY_CODE_META_R];
                         }
                     }
-                    break;
+                    return true;
+
+                default:
+                    return true;
             }
-            break;
         case NSEventTypeKeyDown:
             keycode = cocoa_keycode_to_qemu([event keyCode]);
 
@@ -983,7 +982,7 @@ - (bool) handleEventLocked:(NSEvent *)event
             } else {
                 [self handleMonitorInput: event];
             }
-            break;
+            return true;
         case NSEventTypeKeyUp:
             keycode = cocoa_keycode_to_qemu([event keyCode]);
 
@@ -996,7 +995,7 @@ - (bool) handleEventLocked:(NSEvent *)event
             if (qemu_console_is_graphic(NULL)) {
                 qkbd_state_key_event(kbd, keycode, false);
             }
-            break;
+            return true;
         case NSEventTypeMouseMoved:
             if (isAbsoluteEnabled) {
                 // Cursor re-entered into a window might generate events bound to screen coordinates
@@ -1012,34 +1011,18 @@ - (bool) handleEventLocked:(NSEvent *)event
                     }
                 }
             }
-            mouse_event = true;
-            break;
+            return [self handleMouseEvent:event];
         case NSEventTypeLeftMouseDown:
-            buttons |= MOUSE_EVENT_LBUTTON;
-            mouse_event = true;
-            break;
+            return [self handleMouseEvent:event button:MOUSE_EVENT_LBUTTON down:true];
         case NSEventTypeRightMouseDown:
-            buttons |= MOUSE_EVENT_RBUTTON;
-            mouse_event = true;
-            break;
-        case NSEventTypeOtherMouseDown:
-            buttons |= MOUSE_EVENT_MBUTTON;
-            mouse_event = true;
-            break;
+            return [self handleMouseEvent:event button:MOUSE_EVENT_RBUTTON down:true];
         case NSEventTypeLeftMouseDragged:
-            buttons |= MOUSE_EVENT_LBUTTON;
-            mouse_event = true;
-            break;
+            return [self handleMouseEvent:event button:MOUSE_EVENT_LBUTTON down:true];
         case NSEventTypeRightMouseDragged:
-            buttons |= MOUSE_EVENT_RBUTTON;
-            mouse_event = true;
-            break;
+            return [self handleMouseEvent:event button:MOUSE_EVENT_RBUTTON down:true];
         case NSEventTypeOtherMouseDragged:
-            buttons |= MOUSE_EVENT_MBUTTON;
-            mouse_event = true;
-            break;
+            return [self handleMouseEvent:event button:MOUSE_EVENT_MBUTTON down:true];
         case NSEventTypeLeftMouseUp:
-            mouse_event = true;
             if (!isMouseGrabbed && [self screenContainsPoint:p]) {
                 /*
                  * In fullscreen mode, the window of cocoaView may not be the
@@ -1050,13 +1033,11 @@ - (bool) handleEventLocked:(NSEvent *)event
                     [self grabMouse];
                 }
             }
-            break;
+            return [self handleMouseEvent:event button:MOUSE_EVENT_LBUTTON down:false];
         case NSEventTypeRightMouseUp:
-            mouse_event = true;
-            break;
+            return [self handleMouseEvent:event button:MOUSE_EVENT_RBUTTON down:false];
         case NSEventTypeOtherMouseUp:
-            mouse_event = true;
-            break;
+            return [self handleMouseEvent:event button:MOUSE_EVENT_MBUTTON down:false];
         case NSEventTypeScrollWheel:
             /*
              * Send wheel events to the guest regardless of window focus.
@@ -1087,52 +1068,49 @@ - (bool) handleEventLocked:(NSEvent *)event
              * Since deltaX/deltaY also report scroll wheel events we prevent mouse
              * movement code from executing.
              */
-            mouse_event = false;
-            break;
+            return true;
         default:
             return false;
     }
+}
+
+- (bool) handleMouseEvent:(NSEvent *)event
+{
+    if (!isMouseGrabbed) {
+        return false;
+    }
 
-    if (mouse_event) {
-        /* Don't send button events to the guest unless we've got a
-         * mouse grab or window focus. If we have neither then this event
-         * is the user clicking on the background window to activate and
-         * bring us to the front, which will be done by the sendEvent
-         * call below. We definitely don't want to pass that click through
-         * to the guest.
+    if (isAbsoluteEnabled) {
+        NSPoint p = [self screenLocationOfEvent:event];
+        /* Note that the origin for Cocoa mouse coords is bottom left, not top left.
+         * The check on screenContainsPoint is to avoid sending out of range values for
+         * clicks in the titlebar.
          */
-        if ((isMouseGrabbed || [[self window] isKeyWindow]) &&
-            (last_buttons != buttons)) {
-            static uint32_t bmap[INPUT_BUTTON__MAX] = {
-                [INPUT_BUTTON_LEFT]       = MOUSE_EVENT_LBUTTON,
-                [INPUT_BUTTON_MIDDLE]     = MOUSE_EVENT_MBUTTON,
-                [INPUT_BUTTON_RIGHT]      = MOUSE_EVENT_RBUTTON
-            };
-            qemu_input_update_buttons(dcl.con, bmap, last_buttons, buttons);
-            last_buttons = buttons;
-        }
-        if (isMouseGrabbed) {
-            if (isAbsoluteEnabled) {
-                /* Note that the origin for Cocoa mouse coords is bottom left, not top left.
-                 * The check on screenContainsPoint is to avoid sending out of range values for
-                 * clicks in the titlebar.
-                 */
-                if ([self screenContainsPoint:p]) {
-                    qemu_input_queue_abs(dcl.con, INPUT_AXIS_X, p.x, 0, screen.width);
-                    qemu_input_queue_abs(dcl.con, INPUT_AXIS_Y, screen.height - p.y, 0, screen.height);
-                }
-            } else {
-                qemu_input_queue_rel(dcl.con, INPUT_AXIS_X, (int)[event deltaX]);
-                qemu_input_queue_rel(dcl.con, INPUT_AXIS_Y, (int)[event deltaY]);
-            }
-        } else {
-            return false;
+        if ([self screenContainsPoint:p]) {
+            qemu_input_queue_abs(dcl.con, INPUT_AXIS_X, p.x, 0, screen.width);
+            qemu_input_queue_abs(dcl.con, INPUT_AXIS_Y, screen.height - p.y, 0, screen.height);
         }
-        qemu_input_event_sync();
+    } else {
+        qemu_input_queue_rel(dcl.con, INPUT_AXIS_X, (int)[event deltaX]);
+        qemu_input_queue_rel(dcl.con, INPUT_AXIS_Y, (int)[event deltaY]);
     }
+
+    qemu_input_event_sync();
+
     return true;
 }
 
+- (bool) handleMouseEvent:(NSEvent *)event button:(InputButton)button down:(bool)down
+{
+    if (!isMouseGrabbed && ![[self window] isKeyWindow]) {
+        return false;
+    }
+
+    qemu_input_queue_btn(dcl.con, button, down);
+
+    return [self handleMouseEvent:event];
+}
+
 - (void) grabMouse
 {
     COCOA_DEBUG("QemuCocoaView: grabMouse\n");

-- 
2.43.1



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

* [PATCH v11 2/6] ui/cocoa: Scale with NSView instead of Core Graphics
  2024-02-17 11:18 [PATCH v11 0/6] ui/cocoa: Use NSWindow's ability to resize Akihiko Odaki
  2024-02-17 11:18 ` [PATCH v11 1/6] ui/cocoa: Release specific mouse buttons Akihiko Odaki
@ 2024-02-17 11:18 ` Akihiko Odaki
  2024-02-22 16:48   ` Peter Maydell
  2024-02-17 11:18 ` [PATCH v11 3/6] ui/cocoa: Let the platform toggle fullscreen Akihiko Odaki
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 16+ messages in thread
From: Akihiko Odaki @ 2024-02-17 11:18 UTC (permalink / raw)
  To: Peter Maydell, Philippe Mathieu-Daudé, Gerd Hoffmann,
	Marc-André Lureau, Marek Glogowski, BALATON Zoltan,
	Rene Engel
  Cc: qemu-devel, Akihiko Odaki

Core Graphics is not accelerated and slow.

Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
---
 ui/cocoa.m | 24 ++++++++++--------------
 1 file changed, 10 insertions(+), 14 deletions(-)

diff --git a/ui/cocoa.m b/ui/cocoa.m
index fe0eb74b0743..b26669160300 100644
--- a/ui/cocoa.m
+++ b/ui/cocoa.m
@@ -496,10 +496,8 @@ - (void) drawRect:(NSRect) rect
 
         [self getRectsBeingDrawn:&rectList count:&rectCount];
         for (i = 0; i < rectCount; i++) {
-            clipRect.origin.x = rectList[i].origin.x / cdx;
-            clipRect.origin.y = (float)h - (rectList[i].origin.y + rectList[i].size.height) / cdy;
-            clipRect.size.width = rectList[i].size.width / cdx;
-            clipRect.size.height = rectList[i].size.height / cdy;
+            clipRect = rectList[i];
+            clipRect.origin.y = (float)h - (clipRect.origin.y + clipRect.size.height);
             clipImageRef = CGImageCreateWithImageInRect(
                                                         imageRef,
                                                         clipRect
@@ -545,6 +543,11 @@ - (void) setContentDimensions
     }
 }
 
+- (void) updateBounds
+{
+    [self setBoundsSize:NSMakeSize(screen.width, screen.height)];
+}
+
 - (void) updateUIInfoLocked
 {
     /* Must be called with the BQL, i.e. via updateUIInfo */
@@ -634,6 +637,7 @@ - (void) switchSurface:(pixman_image_t *)image
         screen.height = h;
         [self setContentDimensions];
         [self setFrame:NSMakeRect(cx, cy, cw, ch)];
+        [self updateBounds];
     }
 
     // update screenBuffer
@@ -1292,6 +1296,7 @@ - (void)windowDidChangeScreen:(NSNotification *)notification
 
 - (void)windowDidResize:(NSNotification *)notification
 {
+    [cocoaView updateBounds];
     [cocoaView updateUIInfo];
 }
 
@@ -1940,16 +1945,7 @@ static void cocoa_update(DisplayChangeListener *dcl,
     COCOA_DEBUG("qemu_cocoa: cocoa_update\n");
 
     dispatch_async(dispatch_get_main_queue(), ^{
-        NSRect rect;
-        if ([cocoaView cdx] == 1.0) {
-            rect = NSMakeRect(x, [cocoaView gscreen].height - y - h, w, h);
-        } else {
-            rect = NSMakeRect(
-                x * [cocoaView cdx],
-                ([cocoaView gscreen].height - y - h) * [cocoaView cdy],
-                w * [cocoaView cdx],
-                h * [cocoaView cdy]);
-        }
+        NSRect rect = NSMakeRect(x, [cocoaView gscreen].height - y - h, w, h);
         [cocoaView setNeedsDisplayInRect:rect];
     });
 }

-- 
2.43.1



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

* [PATCH v11 3/6] ui/cocoa: Let the platform toggle fullscreen
  2024-02-17 11:18 [PATCH v11 0/6] ui/cocoa: Use NSWindow's ability to resize Akihiko Odaki
  2024-02-17 11:18 ` [PATCH v11 1/6] ui/cocoa: Release specific mouse buttons Akihiko Odaki
  2024-02-17 11:18 ` [PATCH v11 2/6] ui/cocoa: Scale with NSView instead of Core Graphics Akihiko Odaki
@ 2024-02-17 11:18 ` Akihiko Odaki
  2024-02-22 16:56   ` Peter Maydell
  2024-02-17 11:18 ` [PATCH v11 4/6] ui/cocoa: Make window resizable Akihiko Odaki
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 16+ messages in thread
From: Akihiko Odaki @ 2024-02-17 11:18 UTC (permalink / raw)
  To: Peter Maydell, Philippe Mathieu-Daudé, Gerd Hoffmann,
	Marc-André Lureau, Marek Glogowski, BALATON Zoltan,
	Rene Engel
  Cc: qemu-devel, Akihiko Odaki

It allows making the window full screen by clicking full screen button
provided by the platform (the left-top green button) and save some code.

Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
---
 ui/cocoa.m | 423 ++++++++++++++++++++++++++++++-------------------------------
 1 file changed, 207 insertions(+), 216 deletions(-)

diff --git a/ui/cocoa.m b/ui/cocoa.m
index b26669160300..0ebe0f326373 100644
--- a/ui/cocoa.m
+++ b/ui/cocoa.m
@@ -303,20 +303,17 @@ static void handleAnyDeviceErrors(Error * err)
 */
 @interface QemuCocoaView : NSView
 {
+    NSTrackingArea *trackingArea;
     QEMUScreen screen;
-    NSWindow *fullScreenWindow;
-    float cx,cy,cw,ch,cdx,cdy;
     pixman_image_t *pixman_image;
     QKbdState *kbd;
     BOOL isMouseGrabbed;
-    BOOL isFullscreen;
     BOOL isAbsoluteEnabled;
     CFMachPortRef eventsTap;
 }
 - (void) switchSurface:(pixman_image_t *)image;
 - (void) grabMouse;
 - (void) ungrabMouse;
-- (void) toggleFullScreen:(id)sender;
 - (void) setFullGrab:(id)sender;
 - (void) handleMonitorInput:(NSEvent *)event;
 - (bool) handleEvent:(NSEvent *)event;
@@ -332,8 +329,6 @@ - (void) setAbsoluteEnabled:(BOOL)tIsAbsoluteEnabled;
  */
 - (BOOL) isMouseGrabbed;
 - (BOOL) isAbsoluteEnabled;
-- (float) cdx;
-- (float) cdy;
 - (QEMUScreen) gscreen;
 - (void) raiseAllKeys;
 @end
@@ -391,46 +386,43 @@ - (BOOL) isOpaque
     return YES;
 }
 
-- (BOOL) screenContainsPoint:(NSPoint) p
+- (void) removeTrackingRect
 {
-    return (p.x > -1 && p.x < screen.width && p.y > -1 && p.y < screen.height);
+    if (trackingArea) {
+        [self removeTrackingArea:trackingArea];
+        [trackingArea release];
+        trackingArea = nil;
+    }
 }
 
-/* Get location of event and convert to virtual screen coordinate */
-- (CGPoint) screenLocationOfEvent:(NSEvent *)ev
+- (void) frameUpdated
 {
-    NSWindow *eventWindow = [ev window];
-    // XXX: Use CGRect and -convertRectFromScreen: to support macOS 10.10
-    CGRect r = CGRectZero;
-    r.origin = [ev locationInWindow];
-    if (!eventWindow) {
-        if (!isFullscreen) {
-            return [[self window] convertRectFromScreen:r].origin;
-        } else {
-            CGPoint locationInSelfWindow = [[self window] convertRectFromScreen:r].origin;
-            CGPoint loc = [self convertPoint:locationInSelfWindow fromView:nil];
-            if (stretch_video) {
-                loc.x /= cdx;
-                loc.y /= cdy;
-            }
-            return loc;
-        }
-    } else if ([[self window] isEqual:eventWindow]) {
-        if (!isFullscreen) {
-            return r.origin;
-        } else {
-            CGPoint loc = [self convertPoint:r.origin fromView:nil];
-            if (stretch_video) {
-                loc.x /= cdx;
-                loc.y /= cdy;
-            }
-            return loc;
-        }
-    } else {
-        return [[self window] convertRectFromScreen:[eventWindow convertRectToScreen:r]].origin;
+    [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
 {
     if (!cursor_hide) {
@@ -510,36 +502,43 @@ - (void) drawRect:(NSRect) rect
     }
 }
 
-- (void) setContentDimensions
+- (NSSize) fixZoomedFullScreenSize:(NSSize)proposedSize
 {
-    COCOA_DEBUG("QemuCocoaView: setContentDimensions\n");
+    NSSize size;
 
-    if (isFullscreen) {
-        cdx = [[NSScreen mainScreen] frame].size.width / (float)screen.width;
-        cdy = [[NSScreen mainScreen] frame].size.height / (float)screen.height;
+    size.width = (CGFloat)screen.width * proposedSize.height;
+    size.height = (CGFloat)screen.height * proposedSize.width;
 
-        /* stretches video, but keeps same aspect ratio */
-        if (stretch_video == true) {
-            /* use smallest stretch value - prevents clipping on sides */
-            if (MIN(cdx, cdy) == cdx) {
-                cdy = cdx;
-            } else {
-                cdx = cdy;
-            }
-        } else {  /* No stretching */
-            cdx = cdy = 1;
-        }
-        cw = screen.width * cdx;
-        ch = screen.height * cdy;
-        cx = ([[NSScreen mainScreen] frame].size.width - cw) / 2.0;
-        cy = ([[NSScreen mainScreen] frame].size.height - ch) / 2.0;
+    if (size.width < size.height) {
+        size.width /= screen.height;
+        size.height = proposedSize.height;
     } else {
-        cx = 0;
-        cy = 0;
-        cw = screen.width;
-        ch = screen.height;
-        cdx = 1.0;
-        cdy = 1.0;
+        size.width = proposedSize.width;
+        size.height /= screen.width;
+    }
+
+    return size;
+}
+
+- (NSSize) screenSafeAreaSize
+{
+    NSSize size = [[[self window] screen] frame].size;
+    NSEdgeInsets insets = [[[self window] screen] safeAreaInsets];
+    size.width -= insets.left + insets.right;
+    size.height -= insets.top + insets.bottom;
+    return size;
+}
+
+- (void) resizeWindow
+{
+    [[self window] setContentAspectRatio:NSMakeSize(screen.width, screen.height)];
+
+    if (!stretch_video) {
+        [[self window] setContentSize:NSMakeSize(screen.width, screen.height)];
+        [[self window] center];
+    } else if ([[self window] styleMask] & NSWindowStyleMaskFullScreen) {
+        [[self window] setContentSize:[self fixZoomedFullScreenSize:[self screenSafeAreaSize]]];
+        [[self window] center];
     }
 }
 
@@ -563,9 +562,10 @@ - (void) updateUIInfoLocked
         CGDirectDisplayID display = [[description objectForKey:@"NSScreenNumber"] unsignedIntValue];
         NSSize screenSize = [[[self window] screen] frame].size;
         CGSize screenPhysicalSize = CGDisplayScreenSize(display);
+        bool isFullscreen = ([[self window] styleMask] & NSWindowStyleMaskFullScreen) != 0;
         CVDisplayLinkRef displayLink;
 
-        frameSize = isFullscreen ? screenSize : [self frame].size;
+        frameSize = isFullscreen ? [self screenSafeAreaSize] : [self frame].size;
 
         if (!CVDisplayLinkCreateWithCGDisplay(display, &displayLink)) {
             CVTime period = CVDisplayLinkGetNominalOutputVideoRefreshPeriod(displayLink);
@@ -612,31 +612,19 @@ - (void) updateUIInfo
     });
 }
 
-- (void)viewDidMoveToWindow
-{
-    [self updateUIInfo];
-}
-
 - (void) switchSurface:(pixman_image_t *)image
 {
     COCOA_DEBUG("QemuCocoaView: switchSurface\n");
 
     int w = pixman_image_get_width(image);
     int h = pixman_image_get_height(image);
-    /* cdx == 0 means this is our very first surface, in which case we need
-     * to recalculate the content dimensions even if it happens to be the size
-     * of the initial empty window.
-     */
-    bool isResize = (w != screen.width || h != screen.height || cdx == 0.0);
 
-    int oldh = screen.height;
-    if (isResize) {
+    if (w != screen.width || h != screen.height) {
         // Resize before we trigger the redraw, or we'll redraw at the wrong size
         COCOA_DEBUG("switchSurface: new size %d x %d\n", w, h);
         screen.width = w;
         screen.height = h;
-        [self setContentDimensions];
-        [self setFrame:NSMakeRect(cx, cy, cw, ch)];
+        [self resizeWindow];
         [self updateBounds];
     }
 
@@ -646,51 +634,6 @@ - (void) switchSurface:(pixman_image_t *)image
     }
 
     pixman_image = image;
-
-    // update windows
-    if (isFullscreen) {
-        [[fullScreenWindow contentView] setFrame:[[NSScreen mainScreen] frame]];
-        [normalWindow setFrame:NSMakeRect([normalWindow frame].origin.x, [normalWindow frame].origin.y - h + oldh, w, h + [normalWindow frame].size.height - oldh) display:NO animate:NO];
-    } else {
-        if (qemu_name)
-            [normalWindow setTitle:[NSString stringWithFormat:@"QEMU %s", qemu_name]];
-        [normalWindow setFrame:NSMakeRect([normalWindow frame].origin.x, [normalWindow frame].origin.y - h + oldh, w, h + [normalWindow frame].size.height - oldh) display:YES animate:NO];
-    }
-
-    if (isResize) {
-        [normalWindow center];
-    }
-}
-
-- (void) toggleFullScreen:(id)sender
-{
-    COCOA_DEBUG("QemuCocoaView: toggleFullScreen\n");
-
-    if (isFullscreen) { // switch from fullscreen to desktop
-        isFullscreen = FALSE;
-        [self ungrabMouse];
-        [self setContentDimensions];
-        [fullScreenWindow close];
-        [normalWindow setContentView: self];
-        [normalWindow makeKeyAndOrderFront: self];
-        [NSMenu setMenuBarVisible:YES];
-    } else { // switch from desktop to fullscreen
-        isFullscreen = TRUE;
-        [normalWindow orderOut: nil]; /* Hide the window */
-        [self grabMouse];
-        [self setContentDimensions];
-        [NSMenu setMenuBarVisible:NO];
-        fullScreenWindow = [[NSWindow alloc] initWithContentRect:[[NSScreen mainScreen] frame]
-            styleMask:NSWindowStyleMaskBorderless
-            backing:NSBackingStoreBuffered
-            defer:NO];
-        [fullScreenWindow setAcceptsMouseMovedEvents: YES];
-        [fullScreenWindow setHasShadow:NO];
-        [fullScreenWindow setBackgroundColor: [NSColor blackColor]];
-        [self setFrame:NSMakeRect(cx, cy, cw, ch)];
-        [[fullScreenWindow contentView] addSubview: self];
-        [fullScreenWindow makeKeyAndOrderFront:self];
-    }
 }
 
 - (void) setFullGrab:(id)sender
@@ -804,7 +747,6 @@ - (bool) handleEventLocked:(NSEvent *)event
     COCOA_DEBUG("QemuCocoaView: handleEvent\n");
     int buttons = 0;
     int keycode = 0;
-    NSPoint p = [self screenLocationOfEvent:event];
     NSUInteger modifiers = [event modifierFlags];
 
     /*
@@ -1000,48 +942,6 @@ - (bool) handleEventLocked:(NSEvent *)event
                 qkbd_state_key_event(kbd, keycode, false);
             }
             return true;
-        case NSEventTypeMouseMoved:
-            if (isAbsoluteEnabled) {
-                // Cursor re-entered into a window might generate events bound to screen coordinates
-                // and `nil` window property, and in full screen mode, current window might not be
-                // key window, where event location alone should suffice.
-                if (![self screenContainsPoint:p] || !([[self window] isKeyWindow] || isFullscreen)) {
-                    if (isMouseGrabbed) {
-                        [self ungrabMouse];
-                    }
-                } else {
-                    if (!isMouseGrabbed) {
-                        [self grabMouse];
-                    }
-                }
-            }
-            return [self handleMouseEvent:event];
-        case NSEventTypeLeftMouseDown:
-            return [self handleMouseEvent:event button:MOUSE_EVENT_LBUTTON down:true];
-        case NSEventTypeRightMouseDown:
-            return [self handleMouseEvent:event button:MOUSE_EVENT_RBUTTON down:true];
-        case NSEventTypeLeftMouseDragged:
-            return [self handleMouseEvent:event button:MOUSE_EVENT_LBUTTON down:true];
-        case NSEventTypeRightMouseDragged:
-            return [self handleMouseEvent:event button:MOUSE_EVENT_RBUTTON down:true];
-        case NSEventTypeOtherMouseDragged:
-            return [self handleMouseEvent:event button:MOUSE_EVENT_MBUTTON down:true];
-        case NSEventTypeLeftMouseUp:
-            if (!isMouseGrabbed && [self screenContainsPoint:p]) {
-                /*
-                 * In fullscreen mode, the window of cocoaView may not be the
-                 * key window, therefore the position relative to the virtual
-                 * screen alone will be sufficient.
-                 */
-                if(isFullscreen || [[self window] isKeyWindow]) {
-                    [self grabMouse];
-                }
-            }
-            return [self handleMouseEvent:event button:MOUSE_EVENT_LBUTTON down:false];
-        case NSEventTypeRightMouseUp:
-            return [self handleMouseEvent:event button:MOUSE_EVENT_RBUTTON down:false];
-        case NSEventTypeOtherMouseUp:
-            return [self handleMouseEvent:event button:MOUSE_EVENT_MBUTTON down:false];
         case NSEventTypeScrollWheel:
             /*
              * Send wheel events to the guest regardless of window focus.
@@ -1078,53 +978,117 @@ - (bool) handleEventLocked:(NSEvent *)event
     }
 }
 
-- (bool) handleMouseEvent:(NSEvent *)event
+- (void) handleMouseEvent:(NSEvent *)event
 {
     if (!isMouseGrabbed) {
-        return false;
+        return;
     }
 
-    if (isAbsoluteEnabled) {
-        NSPoint p = [self screenLocationOfEvent:event];
-        /* Note that the origin for Cocoa mouse coords is bottom left, not top left.
-         * The check on screenContainsPoint is to avoid sending out of range values for
-         * clicks in the titlebar.
-         */
-        if ([self screenContainsPoint:p]) {
-            qemu_input_queue_abs(dcl.con, INPUT_AXIS_X, p.x, 0, screen.width);
-            qemu_input_queue_abs(dcl.con, INPUT_AXIS_Y, screen.height - p.y, 0, screen.height);
+    with_bql(^{
+        if (isAbsoluteEnabled) {
+            CGFloat d = (CGFloat)screen.height / [self frame].size.height;
+            NSPoint p = [event locationInWindow];
+            /* Note that the origin for Cocoa mouse coords is bottom left, not top left. */
+            qemu_input_queue_abs(dcl.con, INPUT_AXIS_X, p.x * d, 0, screen.width);
+            qemu_input_queue_abs(dcl.con, INPUT_AXIS_Y, screen.height - p.y * d, 0, screen.height);
+        } else {
+            qemu_input_queue_rel(dcl.con, INPUT_AXIS_X, [event deltaX]);
+            qemu_input_queue_rel(dcl.con, INPUT_AXIS_Y, [event deltaY]);
         }
-    } else {
-        qemu_input_queue_rel(dcl.con, INPUT_AXIS_X, (int)[event deltaX]);
-        qemu_input_queue_rel(dcl.con, INPUT_AXIS_Y, (int)[event deltaY]);
+
+        qemu_input_event_sync();
+    });
+}
+
+- (void) handleMouseEvent:(NSEvent *)event button:(InputButton)button down:(bool)down
+{
+    if (!isMouseGrabbed) {
+        return;
     }
 
-    qemu_input_event_sync();
+    with_bql(^{
+        qemu_input_queue_btn(dcl.con, button, down);
+    });
 
-    return true;
+    [self handleMouseEvent:event];
 }
 
-- (bool) handleMouseEvent:(NSEvent *)event button:(InputButton)button down:(bool)down
+- (void) mouseExited:(NSEvent *)event
 {
-    if (!isMouseGrabbed && ![[self window] isKeyWindow]) {
-        return false;
+    if (isAbsoluteEnabled && isMouseGrabbed) {
+        [self ungrabMouse];
     }
+}
 
-    qemu_input_queue_btn(dcl.con, button, down);
+- (void) mouseEntered:(NSEvent *)event
+{
+    if (isAbsoluteEnabled && !isMouseGrabbed) {
+        [self grabMouse];
+    }
+}
+
+- (void) mouseMoved:(NSEvent *)event
+{
+    [self handleMouseEvent:event];
+}
+
+- (void) mouseDown:(NSEvent *)event
+{
+    [self handleMouseEvent:event button:INPUT_BUTTON_LEFT down:true];
+}
+
+- (void) rightMouseDown:(NSEvent *)event
+{
+    [self handleMouseEvent:event button:INPUT_BUTTON_RIGHT down:true];
+}
+
+- (void) otherMouseDown:(NSEvent *)event
+{
+    [self handleMouseEvent:event button:INPUT_BUTTON_MIDDLE down:true];
+}
+
+- (void) mouseDragged:(NSEvent *)event
+{
+    [self handleMouseEvent:event];
+}
+
+- (void) rightMouseDragged:(NSEvent *)event
+{
+    [self handleMouseEvent:event];
+}
+
+- (void) otherMouseDragged:(NSEvent *)event
+{
+    [self handleMouseEvent:event];
+}
+
+- (void) mouseUp:(NSEvent *)event
+{
+    if (!isMouseGrabbed) {
+        [self grabMouse];
+    }
+
+    [self handleMouseEvent:event button:INPUT_BUTTON_LEFT down:false];
+}
+
+- (void) rightMouseUp:(NSEvent *)event
+{
+    [self handleMouseEvent:event button:INPUT_BUTTON_RIGHT down:false];
+}
 
-    return [self handleMouseEvent:event];
+- (void) otherMouseUp:(NSEvent *)event
+{
+    [self handleMouseEvent:event button:INPUT_BUTTON_MIDDLE down:false];
 }
 
 - (void) grabMouse
 {
     COCOA_DEBUG("QemuCocoaView: grabMouse\n");
 
-    if (!isFullscreen) {
-        if (qemu_name)
-            [normalWindow setTitle:[NSString stringWithFormat:@"QEMU %s - (Press  " UC_CTRL_KEY " " UC_ALT_KEY " G  to release Mouse)", qemu_name]];
-        else
-            [normalWindow setTitle:@"QEMU - (Press  " UC_CTRL_KEY " " UC_ALT_KEY " G  to release Mouse)"];
-    }
+    if (qemu_name)
+        [normalWindow setTitle:[NSString stringWithFormat:@"QEMU %s - (Press  " UC_CTRL_KEY " " UC_ALT_KEY " G  to release Mouse)", qemu_name]];
+    else
+        [normalWindow setTitle:@"QEMU - (Press  " UC_CTRL_KEY " " UC_ALT_KEY " G  to release Mouse)"];
     [self hideCursor];
     CGAssociateMouseAndMouseCursorPosition(isAbsoluteEnabled);
     isMouseGrabbed = TRUE; // while isMouseGrabbed = TRUE, QemuCocoaApp sends all events to [cocoaView handleEvent:]
@@ -1134,15 +1098,14 @@ - (void) ungrabMouse
 {
     COCOA_DEBUG("QemuCocoaView: ungrabMouse\n");
 
-    if (!isFullscreen) {
-        if (qemu_name)
-            [normalWindow setTitle:[NSString stringWithFormat:@"QEMU %s", qemu_name]];
-        else
-            [normalWindow setTitle:@"QEMU"];
-    }
+    if (qemu_name)
+        [normalWindow setTitle:[NSString stringWithFormat:@"QEMU %s", qemu_name]];
+    else
+        [normalWindow setTitle:@"QEMU"];
     [self unhideCursor];
     CGAssociateMouseAndMouseCursorPosition(TRUE);
     isMouseGrabbed = FALSE;
+    [self raiseAllButtons];
 }
 
 - (void) setAbsoluteEnabled:(BOOL)tIsAbsoluteEnabled {
@@ -1153,8 +1116,6 @@ - (void) setAbsoluteEnabled:(BOOL)tIsAbsoluteEnabled {
 }
 - (BOOL) isMouseGrabbed {return isMouseGrabbed;}
 - (BOOL) isAbsoluteEnabled {return isAbsoluteEnabled;}
-- (float) cdx {return cdx;}
-- (float) cdy {return cdy;}
 - (QEMUScreen) gscreen {return screen;}
 
 /*
@@ -1168,6 +1129,15 @@ - (void) raiseAllKeys
         qkbd_state_lift_all_keys(kbd);
     });
 }
+
+- (void) raiseAllButtons
+{
+    with_bql(^{
+        qemu_input_queue_btn(dcl.con, INPUT_BUTTON_LEFT, false);
+        qemu_input_queue_btn(dcl.con, INPUT_BUTTON_RIGHT, false);
+        qemu_input_queue_btn(dcl.con, INPUT_BUTTON_MIDDLE, false);
+    });
+}
 @end
 
 
@@ -1182,7 +1152,6 @@ @interface QemuCocoaAppController : NSObject
 {
 }
 - (void)doToggleFullScreen:(id)sender;
-- (void)toggleFullScreen:(id)sender;
 - (void)showQEMUDoc:(id)sender;
 - (void)zoomToFit:(id) sender;
 - (void)displayConsole:(id)sender;
@@ -1224,7 +1193,8 @@ - (id) init
             exit(1);
         }
         [normalWindow setAcceptsMouseMovedEvents:YES];
-        [normalWindow setTitle:@"QEMU"];
+        [normalWindow setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary];
+        [normalWindow setTitle:qemu_name ? [NSString stringWithFormat:@"QEMU %s", qemu_name] : @"QEMU"];
         [normalWindow setContentView:cocoaView];
         [normalWindow makeKeyAndOrderFront:self];
         [normalWindow center];
@@ -1294,10 +1264,21 @@ - (void)windowDidChangeScreen:(NSNotification *)notification
     [cocoaView updateUIInfo];
 }
 
+- (void)windowDidEnterFullScreen:(NSNotification *)notification
+{
+    [cocoaView grabMouse];
+}
+
+- (void)windowDidExitFullScreen:(NSNotification *)notification
+{
+    [cocoaView resizeWindow];
+    [cocoaView ungrabMouse];
+}
+
 - (void)windowDidResize:(NSNotification *)notification
 {
     [cocoaView updateBounds];
-    [cocoaView updateUIInfo];
+    [cocoaView frameUpdated];
 }
 
 /* Called when the user clicks on a window's close button */
@@ -1313,6 +1294,23 @@ - (BOOL)windowShouldClose:(id)sender
     return NO;
 }
 
+- (NSSize) window:(NSWindow *)window willUseFullScreenContentSize:(NSSize)proposedSize
+{
+    if (stretch_video) {
+        return [cocoaView fixZoomedFullScreenSize:proposedSize];
+    }
+
+    return NSMakeSize([cocoaView gscreen].width, [cocoaView gscreen].height);
+}
+
+- (NSApplicationPresentationOptions) window:(NSWindow *)window
+                                     willUseFullScreenPresentationOptions:(NSApplicationPresentationOptions)proposedOptions;
+
+{
+    return (proposedOptions & ~(NSApplicationPresentationAutoHideDock | NSApplicationPresentationAutoHideMenuBar)) |
+           NSApplicationPresentationHideDock | NSApplicationPresentationHideMenuBar;
+}
+
 /*
  * Called when QEMU goes into the background. Note that
  * [-NSWindowDelegate windowDidResignKey:] is used here instead of
@@ -1332,14 +1330,7 @@ - (void) windowDidResignKey: (NSNotification *)aNotification
  */
 - (void) doToggleFullScreen:(id)sender
 {
-    [self toggleFullScreen:(id)sender];
-}
-
-- (void)toggleFullScreen:(id)sender
-{
-    COCOA_DEBUG("QemuCocoaAppController: toggleFullScreen\n");
-
-    [cocoaView toggleFullScreen:sender];
+    [normalWindow toggleFullScreen:sender];
 }
 
 - (void) setFullGrab:(id)sender
@@ -1390,6 +1381,7 @@ - (void)zoomToFit:(id) sender
     if (stretch_video == true) {
         [sender setState: NSControlStateValueOn];
     } else {
+        [cocoaView resizeWindow];
         [sender setState: NSControlStateValueOff];
     }
 }
@@ -2022,8 +2014,7 @@ static void cocoa_display_init(DisplayState *ds, DisplayOptions *opts)
 
     /* if fullscreen mode is to be used */
     if (opts->has_full_screen && opts->full_screen) {
-        [NSApp activateIgnoringOtherApps: YES];
-        [controller toggleFullScreen: nil];
+        [normalWindow toggleFullScreen: nil];
     }
     if (opts->u.cocoa.has_full_grab && opts->u.cocoa.full_grab) {
         [controller setFullGrab: nil];

-- 
2.43.1



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

* [PATCH v11 4/6] ui/cocoa: Make window resizable
  2024-02-17 11:18 [PATCH v11 0/6] ui/cocoa: Use NSWindow's ability to resize Akihiko Odaki
                   ` (2 preceding siblings ...)
  2024-02-17 11:18 ` [PATCH v11 3/6] ui/cocoa: Let the platform toggle fullscreen Akihiko Odaki
@ 2024-02-17 11:18 ` Akihiko Odaki
  2024-02-22 16:50   ` Peter Maydell
  2024-02-17 11:18 ` [PATCH v11 5/6] ui/cocoa: Call console_select() with the BQL Akihiko Odaki
  2024-02-17 11:18 ` [PATCH v11 6/6] ui/cocoa: Remove stretch_video flag Akihiko Odaki
  5 siblings, 1 reply; 16+ messages in thread
From: Akihiko Odaki @ 2024-02-17 11:18 UTC (permalink / raw)
  To: Peter Maydell, Philippe Mathieu-Daudé, Gerd Hoffmann,
	Marc-André Lureau, Marek Glogowski, BALATON Zoltan,
	Rene Engel
  Cc: qemu-devel, Akihiko Odaki

The window will be resizable when zoom-to-fit is on.

Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
---
 ui/cocoa.m | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/ui/cocoa.m b/ui/cocoa.m
index 0ebe0f326373..17f290987563 100644
--- a/ui/cocoa.m
+++ b/ui/cocoa.m
@@ -1379,8 +1379,10 @@ - (void)zoomToFit:(id) sender
 {
     stretch_video = !stretch_video;
     if (stretch_video == true) {
+        [normalWindow setStyleMask:[normalWindow styleMask] | NSWindowStyleMaskResizable];
         [sender setState: NSControlStateValueOn];
     } else {
+        [normalWindow setStyleMask:[normalWindow styleMask] & ~NSWindowStyleMaskResizable];
         [cocoaView resizeWindow];
         [sender setState: NSControlStateValueOff];
     }
@@ -2033,6 +2035,7 @@ static void cocoa_display_init(DisplayState *ds, DisplayOptions *opts)
 
     if (opts->u.cocoa.has_zoom_to_fit && opts->u.cocoa.zoom_to_fit) {
         stretch_video = true;
+        [normalWindow setStyleMask:[normalWindow styleMask] | NSWindowStyleMaskResizable];
     }
 
     create_initial_menus();

-- 
2.43.1



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

* [PATCH v11 5/6] ui/cocoa: Call console_select() with the BQL
  2024-02-17 11:18 [PATCH v11 0/6] ui/cocoa: Use NSWindow's ability to resize Akihiko Odaki
                   ` (3 preceding siblings ...)
  2024-02-17 11:18 ` [PATCH v11 4/6] ui/cocoa: Make window resizable Akihiko Odaki
@ 2024-02-17 11:18 ` Akihiko Odaki
  2024-02-22 16:51   ` Peter Maydell
  2024-02-17 11:18 ` [PATCH v11 6/6] ui/cocoa: Remove stretch_video flag Akihiko Odaki
  5 siblings, 1 reply; 16+ messages in thread
From: Akihiko Odaki @ 2024-02-17 11:18 UTC (permalink / raw)
  To: Peter Maydell, Philippe Mathieu-Daudé, Gerd Hoffmann,
	Marc-André Lureau, Marek Glogowski, BALATON Zoltan,
	Rene Engel
  Cc: qemu-devel, Akihiko Odaki

console_select() can be called anytime so explicitly take the BQL.

Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
---
 ui/cocoa.m | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/ui/cocoa.m b/ui/cocoa.m
index 17f290987563..81de8d92669b 100644
--- a/ui/cocoa.m
+++ b/ui/cocoa.m
@@ -1391,7 +1391,9 @@ - (void)zoomToFit:(id) sender
 /* Displays the console on the screen */
 - (void)displayConsole:(id)sender
 {
-    console_select([sender tag]);
+    with_bql(^{
+        console_select([sender tag]);
+    });
 }
 
 /* Pause the guest */

-- 
2.43.1



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

* [PATCH v11 6/6] ui/cocoa: Remove stretch_video flag
  2024-02-17 11:18 [PATCH v11 0/6] ui/cocoa: Use NSWindow's ability to resize Akihiko Odaki
                   ` (4 preceding siblings ...)
  2024-02-17 11:18 ` [PATCH v11 5/6] ui/cocoa: Call console_select() with the BQL Akihiko Odaki
@ 2024-02-17 11:18 ` Akihiko Odaki
  2024-02-22 16:53   ` Peter Maydell
  5 siblings, 1 reply; 16+ messages in thread
From: Akihiko Odaki @ 2024-02-17 11:18 UTC (permalink / raw)
  To: Peter Maydell, Philippe Mathieu-Daudé, Gerd Hoffmann,
	Marc-André Lureau, Marek Glogowski, BALATON Zoltan,
	Rene Engel
  Cc: qemu-devel, Akihiko Odaki

Evaluate [normalWindow styleMask] & NSWindowStyleMaskResizable instead.

Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
---
 ui/cocoa.m | 11 ++++-------
 1 file changed, 4 insertions(+), 7 deletions(-)

diff --git a/ui/cocoa.m b/ui/cocoa.m
index 81de8d92669b..401ed0c3f1f5 100644
--- a/ui/cocoa.m
+++ b/ui/cocoa.m
@@ -103,7 +103,6 @@ static void cocoa_switch(DisplayChangeListener *dcl,
 static int left_command_key_enabled = 1;
 static bool swap_opt_cmd;
 
-static bool stretch_video;
 static NSTextField *pauseLabel;
 
 static bool allow_events;
@@ -533,7 +532,7 @@ - (void) resizeWindow
 {
     [[self window] setContentAspectRatio:NSMakeSize(screen.width, screen.height)];
 
-    if (!stretch_video) {
+    if (!([[self window] styleMask] & NSWindowStyleMaskResizable)) {
         [[self window] setContentSize:NSMakeSize(screen.width, screen.height)];
         [[self window] center];
     } else if ([[self window] styleMask] & NSWindowStyleMaskFullScreen) {
@@ -1296,7 +1295,7 @@ - (BOOL)windowShouldClose:(id)sender
 
 - (NSSize) window:(NSWindow *)window willUseFullScreenContentSize:(NSSize)proposedSize
 {
-    if (stretch_video) {
+    if ([normalWindow styleMask] & NSWindowStyleMaskResizable) {
         return [cocoaView fixZoomedFullScreenSize:proposedSize];
     }
 
@@ -1377,8 +1376,7 @@ - (void)showQEMUDoc:(id)sender
 /* Stretches video to fit host monitor size */
 - (void)zoomToFit:(id) sender
 {
-    stretch_video = !stretch_video;
-    if (stretch_video == true) {
+    if (([normalWindow styleMask] & NSWindowStyleMaskResizable) == 0) {
         [normalWindow setStyleMask:[normalWindow styleMask] | NSWindowStyleMaskResizable];
         [sender setState: NSControlStateValueOn];
     } else {
@@ -1650,7 +1648,7 @@ static void create_initial_menus(void)
     menu = [[NSMenu alloc] initWithTitle:@"View"];
     [menu addItem: [[[NSMenuItem alloc] initWithTitle:@"Enter Fullscreen" action:@selector(doToggleFullScreen:) keyEquivalent:@"f"] autorelease]]; // Fullscreen
     menuItem = [[[NSMenuItem alloc] initWithTitle:@"Zoom To Fit" action:@selector(zoomToFit:) keyEquivalent:@""] autorelease];
-    [menuItem setState: stretch_video ? NSControlStateValueOn : NSControlStateValueOff];
+    [menuItem setState: [normalWindow styleMask] & NSWindowStyleMaskResizable ? NSControlStateValueOn : NSControlStateValueOff];
     [menu addItem: menuItem];
     menuItem = [[[NSMenuItem alloc] initWithTitle:@"View" action:nil keyEquivalent:@""] autorelease];
     [menuItem setSubmenu:menu];
@@ -2036,7 +2034,6 @@ static void cocoa_display_init(DisplayState *ds, DisplayOptions *opts)
     }
 
     if (opts->u.cocoa.has_zoom_to_fit && opts->u.cocoa.zoom_to_fit) {
-        stretch_video = true;
         [normalWindow setStyleMask:[normalWindow styleMask] | NSWindowStyleMaskResizable];
     }
 

-- 
2.43.1



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

* Re: [PATCH v11 1/6] ui/cocoa: Release specific mouse buttons
  2024-02-17 11:18 ` [PATCH v11 1/6] ui/cocoa: Release specific mouse buttons Akihiko Odaki
@ 2024-02-22 16:40   ` Peter Maydell
  0 siblings, 0 replies; 16+ messages in thread
From: Peter Maydell @ 2024-02-22 16:40 UTC (permalink / raw)
  To: Akihiko Odaki
  Cc: Philippe Mathieu-Daudé, Gerd Hoffmann,
	Marc-André Lureau, Marek Glogowski, BALATON Zoltan,
	Rene Engel, qemu-devel

On Sat, 17 Feb 2024 at 11:18, Akihiko Odaki <akihiko.odaki@daynix.com> wrote:
>
> ui/cocoa used to release all mouse buttons when it sees
> NSEventTypeLeftMouseUp, NSEventTypeRightMouseUp, or
> NSEventTypeOtherMouseUp, but it can instead release specific one
> according to the delivered event.
>
> Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
> ---
>  ui/cocoa.m | 132 ++++++++++++++++++++++++++-----------------------------------
>  1 file changed, 55 insertions(+), 77 deletions(-)

This is a pain to review because it does three things at once:

(1) a no-behaviour change refactoring where various cases
that previously did 'break' now 'return true'
(2) a refactoring so mouse events are handled in a separate
method, rather than by setting the mouse_event = true bool
and handling this at the bottom of the handleEventLocked method
(3) the actual behaviour change that the comment message talks about

If this was three patches that each did one of those things,
two of them would be trivial to review and the code changes
required for 3 would be easy to find rather than buried in
with the changes for the first two.

thanks
-- PMM


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

* Re: [PATCH v11 2/6] ui/cocoa: Scale with NSView instead of Core Graphics
  2024-02-17 11:18 ` [PATCH v11 2/6] ui/cocoa: Scale with NSView instead of Core Graphics Akihiko Odaki
@ 2024-02-22 16:48   ` Peter Maydell
  0 siblings, 0 replies; 16+ messages in thread
From: Peter Maydell @ 2024-02-22 16:48 UTC (permalink / raw)
  To: Akihiko Odaki
  Cc: Philippe Mathieu-Daudé, Gerd Hoffmann,
	Marc-André Lureau, Marek Glogowski, BALATON Zoltan,
	Rene Engel, qemu-devel

On Sat, 17 Feb 2024 at 11:19, Akihiko Odaki <akihiko.odaki@daynix.com> wrote:
>
> Core Graphics is not accelerated and slow.
>
> Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
> ---

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

thanks
-- PMM


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

* Re: [PATCH v11 4/6] ui/cocoa: Make window resizable
  2024-02-17 11:18 ` [PATCH v11 4/6] ui/cocoa: Make window resizable Akihiko Odaki
@ 2024-02-22 16:50   ` Peter Maydell
  0 siblings, 0 replies; 16+ messages in thread
From: Peter Maydell @ 2024-02-22 16:50 UTC (permalink / raw)
  To: Akihiko Odaki
  Cc: Philippe Mathieu-Daudé, Gerd Hoffmann,
	Marc-André Lureau, Marek Glogowski, BALATON Zoltan,
	Rene Engel, qemu-devel

On Sat, 17 Feb 2024 at 11:19, Akihiko Odaki <akihiko.odaki@daynix.com> wrote:
>
> The window will be resizable when zoom-to-fit is on.
>
> Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
> ---

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

thanks
-- PMM


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

* Re: [PATCH v11 5/6] ui/cocoa: Call console_select() with the BQL
  2024-02-17 11:18 ` [PATCH v11 5/6] ui/cocoa: Call console_select() with the BQL Akihiko Odaki
@ 2024-02-22 16:51   ` Peter Maydell
  0 siblings, 0 replies; 16+ messages in thread
From: Peter Maydell @ 2024-02-22 16:51 UTC (permalink / raw)
  To: Akihiko Odaki
  Cc: Philippe Mathieu-Daudé, Gerd Hoffmann,
	Marc-André Lureau, Marek Glogowski, BALATON Zoltan,
	Rene Engel, qemu-devel

On Sat, 17 Feb 2024 at 11:19, Akihiko Odaki <akihiko.odaki@daynix.com> wrote:
>
> console_select() can be called anytime so explicitly take the BQL.

I think you mean "displayConsole" here ?

>
> Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
> ---
>  ui/cocoa.m | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/ui/cocoa.m b/ui/cocoa.m
> index 17f290987563..81de8d92669b 100644
> --- a/ui/cocoa.m
> +++ b/ui/cocoa.m
> @@ -1391,7 +1391,9 @@ - (void)zoomToFit:(id) sender
>  /* Displays the console on the screen */
>  - (void)displayConsole:(id)sender
>  {
> -    console_select([sender tag]);
> +    with_bql(^{
> +        console_select([sender tag]);
> +    });
>  }
>
>  /* Pause the guest */

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

thanks
-- PMM


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

* Re: [PATCH v11 6/6] ui/cocoa: Remove stretch_video flag
  2024-02-17 11:18 ` [PATCH v11 6/6] ui/cocoa: Remove stretch_video flag Akihiko Odaki
@ 2024-02-22 16:53   ` Peter Maydell
  2024-02-24 12:59     ` Akihiko Odaki
  0 siblings, 1 reply; 16+ messages in thread
From: Peter Maydell @ 2024-02-22 16:53 UTC (permalink / raw)
  To: Akihiko Odaki
  Cc: Philippe Mathieu-Daudé, Gerd Hoffmann,
	Marc-André Lureau, Marek Glogowski, BALATON Zoltan,
	Rene Engel, qemu-devel

On Sat, 17 Feb 2024 at 11:19, Akihiko Odaki <akihiko.odaki@daynix.com> wrote:
>
> Evaluate [normalWindow styleMask] & NSWindowStyleMaskResizable instead.
>
> Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
> ---
>  ui/cocoa.m | 11 ++++-------
>  1 file changed, 4 insertions(+), 7 deletions(-)
>
> diff --git a/ui/cocoa.m b/ui/cocoa.m
> index 81de8d92669b..401ed0c3f1f5 100644
> --- a/ui/cocoa.m
> +++ b/ui/cocoa.m
> @@ -103,7 +103,6 @@ static void cocoa_switch(DisplayChangeListener *dcl,
>  static int left_command_key_enabled = 1;
>  static bool swap_opt_cmd;
>
> -static bool stretch_video;
>  static NSTextField *pauseLabel;
>
>  static bool allow_events;
> @@ -533,7 +532,7 @@ - (void) resizeWindow
>  {
>      [[self window] setContentAspectRatio:NSMakeSize(screen.width, screen.height)];
>
> -    if (!stretch_video) {
> +    if (!([[self window] styleMask] & NSWindowStyleMaskResizable)) {
>          [[self window] setContentSize:NSMakeSize(screen.width, screen.height)];
>          [[self window] center];
>      } else if ([[self window] styleMask] & NSWindowStyleMaskFullScreen) {
> @@ -1296,7 +1295,7 @@ - (BOOL)windowShouldClose:(id)sender
>
>  - (NSSize) window:(NSWindow *)window willUseFullScreenContentSize:(NSSize)proposedSize
>  {
> -    if (stretch_video) {
> +    if ([normalWindow styleMask] & NSWindowStyleMaskResizable) {
>          return [cocoaView fixZoomedFullScreenSize:proposedSize];
>      }
>
> @@ -1377,8 +1376,7 @@ - (void)showQEMUDoc:(id)sender
>  /* Stretches video to fit host monitor size */
>  - (void)zoomToFit:(id) sender
>  {
> -    stretch_video = !stretch_video;
> -    if (stretch_video == true) {
> +    if (([normalWindow styleMask] & NSWindowStyleMaskResizable) == 0) {
>          [normalWindow setStyleMask:[normalWindow styleMask] | NSWindowStyleMaskResizable];
>          [sender setState: NSControlStateValueOn];
>      } else {
> @@ -1650,7 +1648,7 @@ static void create_initial_menus(void)
>      menu = [[NSMenu alloc] initWithTitle:@"View"];
>      [menu addItem: [[[NSMenuItem alloc] initWithTitle:@"Enter Fullscreen" action:@selector(doToggleFullScreen:) keyEquivalent:@"f"] autorelease]]; // Fullscreen
>      menuItem = [[[NSMenuItem alloc] initWithTitle:@"Zoom To Fit" action:@selector(zoomToFit:) keyEquivalent:@""] autorelease];
> -    [menuItem setState: stretch_video ? NSControlStateValueOn : NSControlStateValueOff];
> +    [menuItem setState: [normalWindow styleMask] & NSWindowStyleMaskResizable ? NSControlStateValueOn : NSControlStateValueOff];
>      [menu addItem: menuItem];
>      menuItem = [[[NSMenuItem alloc] initWithTitle:@"View" action:nil keyEquivalent:@""] autorelease];
>      [menuItem setSubmenu:menu];
> @@ -2036,7 +2034,6 @@ static void cocoa_display_init(DisplayState *ds, DisplayOptions *opts)
>      }
>
>      if (opts->u.cocoa.has_zoom_to_fit && opts->u.cocoa.zoom_to_fit) {
> -        stretch_video = true;
>          [normalWindow setStyleMask:[normalWindow styleMask] | NSWindowStyleMaskResizable];
>      }

It's nice to get rid of the boolean, but
 [normalWindow styleMask] & NSWindowStyleMaskResizable
feels a bit clunky -- maybe we should wrap it in a method with
a suitable name ? (isZoomToFit, maybe? but I'm not too familiar
with what cocoa function naming style is.)

-- PMM


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

* Re: [PATCH v11 3/6] ui/cocoa: Let the platform toggle fullscreen
  2024-02-17 11:18 ` [PATCH v11 3/6] ui/cocoa: Let the platform toggle fullscreen Akihiko Odaki
@ 2024-02-22 16:56   ` Peter Maydell
  2024-02-24 12:52     ` Akihiko Odaki
  0 siblings, 1 reply; 16+ messages in thread
From: Peter Maydell @ 2024-02-22 16:56 UTC (permalink / raw)
  To: Akihiko Odaki
  Cc: Philippe Mathieu-Daudé, Gerd Hoffmann,
	Marc-André Lureau, Marek Glogowski, BALATON Zoltan,
	Rene Engel, qemu-devel

On Sat, 17 Feb 2024 at 11:19, Akihiko Odaki <akihiko.odaki@daynix.com> wrote:
>
> It allows making the window full screen by clicking full screen button
> provided by the platform (the left-top green button) and save some code.
>
> Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
> ---
>  ui/cocoa.m | 423 ++++++++++++++++++++++++++++++-------------------------------
>  1 file changed, 207 insertions(+), 216 deletions(-)

This is a big patch and I'm having difficulty figuring out what
it's doing. Is it possible to split it up a bit?

thanks
-- PMM


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

* Re: [PATCH v11 3/6] ui/cocoa: Let the platform toggle fullscreen
  2024-02-22 16:56   ` Peter Maydell
@ 2024-02-24 12:52     ` Akihiko Odaki
  0 siblings, 0 replies; 16+ messages in thread
From: Akihiko Odaki @ 2024-02-24 12:52 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Philippe Mathieu-Daudé, Gerd Hoffmann,
	Marc-André Lureau, Marek Glogowski, BALATON Zoltan,
	Rene Engel, qemu-devel

On 2024/02/23 1:56, Peter Maydell wrote:
> On Sat, 17 Feb 2024 at 11:19, Akihiko Odaki <akihiko.odaki@daynix.com> wrote:
>>
>> It allows making the window full screen by clicking full screen button
>> provided by the platform (the left-top green button) and save some code.
>>
>> Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
>> ---
>>   ui/cocoa.m | 423 ++++++++++++++++++++++++++++++-------------------------------
>>   1 file changed, 207 insertions(+), 216 deletions(-)
> 
> This is a big patch and I'm having difficulty figuring out what
> it's doing. Is it possible to split it up a bit?

Not really. It indeed does a few different things:
1. Removes fullScreenWindow
2. Changes mouse event handling.
3. Changes coordinate calculations.

Unfortunately we have to do these at once because how window is 
organized affects both of mouse event handling and coordinate calculations.

Regards,
Akihiko Odaki


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

* Re: [PATCH v11 6/6] ui/cocoa: Remove stretch_video flag
  2024-02-22 16:53   ` Peter Maydell
@ 2024-02-24 12:59     ` Akihiko Odaki
  2024-02-24 13:04       ` BALATON Zoltan
  0 siblings, 1 reply; 16+ messages in thread
From: Akihiko Odaki @ 2024-02-24 12:59 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Philippe Mathieu-Daudé, Gerd Hoffmann,
	Marc-André Lureau, Marek Glogowski, BALATON Zoltan,
	Rene Engel, qemu-devel

On 2024/02/23 1:53, Peter Maydell wrote:
> On Sat, 17 Feb 2024 at 11:19, Akihiko Odaki <akihiko.odaki@daynix.com> wrote:
>>
>> Evaluate [normalWindow styleMask] & NSWindowStyleMaskResizable instead.
>>
>> Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
>> ---
>>   ui/cocoa.m | 11 ++++-------
>>   1 file changed, 4 insertions(+), 7 deletions(-)
>>
>> diff --git a/ui/cocoa.m b/ui/cocoa.m
>> index 81de8d92669b..401ed0c3f1f5 100644
>> --- a/ui/cocoa.m
>> +++ b/ui/cocoa.m
>> @@ -103,7 +103,6 @@ static void cocoa_switch(DisplayChangeListener *dcl,
>>   static int left_command_key_enabled = 1;
>>   static bool swap_opt_cmd;
>>
>> -static bool stretch_video;
>>   static NSTextField *pauseLabel;
>>
>>   static bool allow_events;
>> @@ -533,7 +532,7 @@ - (void) resizeWindow
>>   {
>>       [[self window] setContentAspectRatio:NSMakeSize(screen.width, screen.height)];
>>
>> -    if (!stretch_video) {
>> +    if (!([[self window] styleMask] & NSWindowStyleMaskResizable)) {
>>           [[self window] setContentSize:NSMakeSize(screen.width, screen.height)];
>>           [[self window] center];
>>       } else if ([[self window] styleMask] & NSWindowStyleMaskFullScreen) {
>> @@ -1296,7 +1295,7 @@ - (BOOL)windowShouldClose:(id)sender
>>
>>   - (NSSize) window:(NSWindow *)window willUseFullScreenContentSize:(NSSize)proposedSize
>>   {
>> -    if (stretch_video) {
>> +    if ([normalWindow styleMask] & NSWindowStyleMaskResizable) {
>>           return [cocoaView fixZoomedFullScreenSize:proposedSize];
>>       }
>>
>> @@ -1377,8 +1376,7 @@ - (void)showQEMUDoc:(id)sender
>>   /* Stretches video to fit host monitor size */
>>   - (void)zoomToFit:(id) sender
>>   {
>> -    stretch_video = !stretch_video;
>> -    if (stretch_video == true) {
>> +    if (([normalWindow styleMask] & NSWindowStyleMaskResizable) == 0) {
>>           [normalWindow setStyleMask:[normalWindow styleMask] | NSWindowStyleMaskResizable];
>>           [sender setState: NSControlStateValueOn];
>>       } else {
>> @@ -1650,7 +1648,7 @@ static void create_initial_menus(void)
>>       menu = [[NSMenu alloc] initWithTitle:@"View"];
>>       [menu addItem: [[[NSMenuItem alloc] initWithTitle:@"Enter Fullscreen" action:@selector(doToggleFullScreen:) keyEquivalent:@"f"] autorelease]]; // Fullscreen
>>       menuItem = [[[NSMenuItem alloc] initWithTitle:@"Zoom To Fit" action:@selector(zoomToFit:) keyEquivalent:@""] autorelease];
>> -    [menuItem setState: stretch_video ? NSControlStateValueOn : NSControlStateValueOff];
>> +    [menuItem setState: [normalWindow styleMask] & NSWindowStyleMaskResizable ? NSControlStateValueOn : NSControlStateValueOff];
>>       [menu addItem: menuItem];
>>       menuItem = [[[NSMenuItem alloc] initWithTitle:@"View" action:nil keyEquivalent:@""] autorelease];
>>       [menuItem setSubmenu:menu];
>> @@ -2036,7 +2034,6 @@ static void cocoa_display_init(DisplayState *ds, DisplayOptions *opts)
>>       }
>>
>>       if (opts->u.cocoa.has_zoom_to_fit && opts->u.cocoa.zoom_to_fit) {
>> -        stretch_video = true;
>>           [normalWindow setStyleMask:[normalWindow styleMask] | NSWindowStyleMaskResizable];
>>       }
> 
> It's nice to get rid of the boolean, but
>   [normalWindow styleMask] & NSWindowStyleMaskResizable
> feels a bit clunky -- maybe we should wrap it in a method with
> a suitable name ? (isZoomToFit, maybe? but I'm not too familiar
> with what cocoa function naming style is.)

I don't think we should have a method for this. It's verbose but the 
main reason of that is NSWindowStyleMaskResizable is wordy; otherwise 
it's quite a simple. There are few places that use this construct after all.

In any case, I put a bit more effort to simplify style mask references 
with v12 so please check it out.

Regards,
Akihiko Odaki


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

* Re: [PATCH v11 6/6] ui/cocoa: Remove stretch_video flag
  2024-02-24 12:59     ` Akihiko Odaki
@ 2024-02-24 13:04       ` BALATON Zoltan
  0 siblings, 0 replies; 16+ messages in thread
From: BALATON Zoltan @ 2024-02-24 13:04 UTC (permalink / raw)
  To: Akihiko Odaki
  Cc: Peter Maydell, Philippe Mathieu-Daudé, Gerd Hoffmann,
	Marc-André Lureau, Marek Glogowski, Rene Engel, qemu-devel

On Sat, 24 Feb 2024, Akihiko Odaki wrote:
> On 2024/02/23 1:53, Peter Maydell wrote:
>> On Sat, 17 Feb 2024 at 11:19, Akihiko Odaki <akihiko.odaki@daynix.com> 
>> wrote:
>>> 
>>> Evaluate [normalWindow styleMask] & NSWindowStyleMaskResizable instead.
>>> 
>>> Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
>>> ---
>>>   ui/cocoa.m | 11 ++++-------
>>>   1 file changed, 4 insertions(+), 7 deletions(-)
>>> 
>>> diff --git a/ui/cocoa.m b/ui/cocoa.m
>>> index 81de8d92669b..401ed0c3f1f5 100644
>>> --- a/ui/cocoa.m
>>> +++ b/ui/cocoa.m
>>> @@ -103,7 +103,6 @@ static void cocoa_switch(DisplayChangeListener *dcl,
>>>   static int left_command_key_enabled = 1;
>>>   static bool swap_opt_cmd;
>>> 
>>> -static bool stretch_video;
>>>   static NSTextField *pauseLabel;
>>>
>>>   static bool allow_events;
>>> @@ -533,7 +532,7 @@ - (void) resizeWindow
>>>   {
>>>       [[self window] setContentAspectRatio:NSMakeSize(screen.width, 
>>> screen.height)];
>>> 
>>> -    if (!stretch_video) {
>>> +    if (!([[self window] styleMask] & NSWindowStyleMaskResizable)) {
>>>           [[self window] setContentSize:NSMakeSize(screen.width, 
>>> screen.height)];
>>>           [[self window] center];
>>>       } else if ([[self window] styleMask] & NSWindowStyleMaskFullScreen) 
>>> {
>>> @@ -1296,7 +1295,7 @@ - (BOOL)windowShouldClose:(id)sender
>>>
>>>   - (NSSize) window:(NSWindow *)window 
>>> willUseFullScreenContentSize:(NSSize)proposedSize
>>>   {
>>> -    if (stretch_video) {
>>> +    if ([normalWindow styleMask] & NSWindowStyleMaskResizable) {
>>>           return [cocoaView fixZoomedFullScreenSize:proposedSize];
>>>       }
>>> 
>>> @@ -1377,8 +1376,7 @@ - (void)showQEMUDoc:(id)sender
>>>   /* Stretches video to fit host monitor size */
>>>   - (void)zoomToFit:(id) sender
>>>   {
>>> -    stretch_video = !stretch_video;
>>> -    if (stretch_video == true) {
>>> +    if (([normalWindow styleMask] & NSWindowStyleMaskResizable) == 0) {
>>>           [normalWindow setStyleMask:[normalWindow styleMask] | 
>>> NSWindowStyleMaskResizable];
>>>           [sender setState: NSControlStateValueOn];
>>>       } else {
>>> @@ -1650,7 +1648,7 @@ static void create_initial_menus(void)
>>>       menu = [[NSMenu alloc] initWithTitle:@"View"];
>>>       [menu addItem: [[[NSMenuItem alloc] initWithTitle:@"Enter 
>>> Fullscreen" action:@selector(doToggleFullScreen:) keyEquivalent:@"f"] 
>>> autorelease]]; // Fullscreen
>>>       menuItem = [[[NSMenuItem alloc] initWithTitle:@"Zoom To Fit" 
>>> action:@selector(zoomToFit:) keyEquivalent:@""] autorelease];
>>> -    [menuItem setState: stretch_video ? NSControlStateValueOn : 
>>> NSControlStateValueOff];
>>> +    [menuItem setState: [normalWindow styleMask] & 
>>> NSWindowStyleMaskResizable ? NSControlStateValueOn : 
>>> NSControlStateValueOff];
>>>       [menu addItem: menuItem];
>>>       menuItem = [[[NSMenuItem alloc] initWithTitle:@"View" action:nil 
>>> keyEquivalent:@""] autorelease];
>>>       [menuItem setSubmenu:menu];
>>> @@ -2036,7 +2034,6 @@ static void cocoa_display_init(DisplayState *ds, 
>>> DisplayOptions *opts)
>>>       }
>>>
>>>       if (opts->u.cocoa.has_zoom_to_fit && opts->u.cocoa.zoom_to_fit) {
>>> -        stretch_video = true;
>>>           [normalWindow setStyleMask:[normalWindow styleMask] | 
>>> NSWindowStyleMaskResizable];
>>>       }
>> 
>> It's nice to get rid of the boolean, but
>>   [normalWindow styleMask] & NSWindowStyleMaskResizable
>> feels a bit clunky -- maybe we should wrap it in a method with
>> a suitable name ? (isZoomToFit, maybe? but I'm not too familiar
>> with what cocoa function naming style is.)
>
> I don't think we should have a method for this. It's verbose but the main 
> reason of that is NSWindowStyleMaskResizable is wordy; otherwise it's quite a 
> simple. There are few places that use this construct after all.

If not a method how about a macro just to make it less long? But if Peter 
is otherwise happy with the current version just this does not need 
another version IMO.

Regards,
BALATON Zoltan


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

end of thread, other threads:[~2024-02-24 13:05 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-02-17 11:18 [PATCH v11 0/6] ui/cocoa: Use NSWindow's ability to resize Akihiko Odaki
2024-02-17 11:18 ` [PATCH v11 1/6] ui/cocoa: Release specific mouse buttons Akihiko Odaki
2024-02-22 16:40   ` Peter Maydell
2024-02-17 11:18 ` [PATCH v11 2/6] ui/cocoa: Scale with NSView instead of Core Graphics Akihiko Odaki
2024-02-22 16:48   ` Peter Maydell
2024-02-17 11:18 ` [PATCH v11 3/6] ui/cocoa: Let the platform toggle fullscreen Akihiko Odaki
2024-02-22 16:56   ` Peter Maydell
2024-02-24 12:52     ` Akihiko Odaki
2024-02-17 11:18 ` [PATCH v11 4/6] ui/cocoa: Make window resizable Akihiko Odaki
2024-02-22 16:50   ` Peter Maydell
2024-02-17 11:18 ` [PATCH v11 5/6] ui/cocoa: Call console_select() with the BQL Akihiko Odaki
2024-02-22 16:51   ` Peter Maydell
2024-02-17 11:18 ` [PATCH v11 6/6] ui/cocoa: Remove stretch_video flag Akihiko Odaki
2024-02-22 16:53   ` Peter Maydell
2024-02-24 12:59     ` Akihiko Odaki
2024-02-24 13:04       ` BALATON Zoltan

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).