ui/cocoa: Immediately call [-QemuCocoaView handleMouseEvent:buttons:]

Instead of using mouse_event variable to tell to handle a mouse event
later, immediately call [-QemuCocoaView handleMouseEvent:buttons:].

Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Tested-by: Rene Engel <ReneEngel80@emailn.de>
Message-ID: <20240224-cocoa-v12-2-e89f70bdda71@daynix.com>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
This commit is contained in:
Akihiko Odaki 2024-02-24 21:43:33 +09:00 committed by Philippe Mathieu-Daudé
parent af4efbccda
commit 0f7be47abe

View File

@ -807,9 +807,8 @@ static CGEventRef handleTapEvent(CGEventTapProxy proxy, CGEventType type, CGEven
{ {
/* Return true if we handled the event, false if it should be given to OSX */ /* Return true if we handled the event, false if it should be given to OSX */
COCOA_DEBUG("QemuCocoaView: handleEvent\n"); COCOA_DEBUG("QemuCocoaView: handleEvent\n");
int buttons = 0; InputButton button;
int keycode = 0; int keycode = 0;
bool mouse_event = false;
// Location of event in virtual screen coordinates // Location of event in virtual screen coordinates
NSPoint p = [self screenLocationOfEvent:event]; NSPoint p = [self screenLocationOfEvent:event];
NSUInteger modifiers = [event modifierFlags]; NSUInteger modifiers = [event modifierFlags];
@ -955,7 +954,7 @@ static CGEventRef handleTapEvent(CGEventTapProxy proxy, CGEventType type, CGEven
} }
break; break;
} }
break; return true;
case NSEventTypeKeyDown: case NSEventTypeKeyDown:
keycode = cocoa_keycode_to_qemu([event keyCode]); keycode = cocoa_keycode_to_qemu([event keyCode]);
@ -991,7 +990,7 @@ static CGEventRef handleTapEvent(CGEventTapProxy proxy, CGEventType type, CGEven
} else { } else {
[self handleMonitorInput: event]; [self handleMonitorInput: event];
} }
break; return true;
case NSEventTypeKeyUp: case NSEventTypeKeyUp:
keycode = cocoa_keycode_to_qemu([event keyCode]); keycode = cocoa_keycode_to_qemu([event keyCode]);
@ -1004,7 +1003,7 @@ static CGEventRef handleTapEvent(CGEventTapProxy proxy, CGEventType type, CGEven
if (qemu_console_is_graphic(NULL)) { if (qemu_console_is_graphic(NULL)) {
qkbd_state_key_event(kbd, keycode, false); qkbd_state_key_event(kbd, keycode, false);
} }
break; return true;
case NSEventTypeMouseMoved: case NSEventTypeMouseMoved:
if (isAbsoluteEnabled) { if (isAbsoluteEnabled) {
// Cursor re-entered into a window might generate events bound to screen coordinates // Cursor re-entered into a window might generate events bound to screen coordinates
@ -1020,34 +1019,20 @@ static CGEventRef handleTapEvent(CGEventTapProxy proxy, CGEventType type, CGEven
} }
} }
} }
mouse_event = true; return [self handleMouseEvent:event buttons:0];
break;
case NSEventTypeLeftMouseDown: case NSEventTypeLeftMouseDown:
buttons |= MOUSE_EVENT_LBUTTON; return [self handleMouseEvent:event buttons:MOUSE_EVENT_LBUTTON];
mouse_event = true;
break;
case NSEventTypeRightMouseDown: case NSEventTypeRightMouseDown:
buttons |= MOUSE_EVENT_RBUTTON; return [self handleMouseEvent:event buttons:MOUSE_EVENT_RBUTTON];
mouse_event = true;
break;
case NSEventTypeOtherMouseDown: case NSEventTypeOtherMouseDown:
buttons |= MOUSE_EVENT_MBUTTON; return [self handleMouseEvent:event buttons:MOUSE_EVENT_MBUTTON];
mouse_event = true;
break;
case NSEventTypeLeftMouseDragged: case NSEventTypeLeftMouseDragged:
buttons |= MOUSE_EVENT_LBUTTON; return [self handleMouseEvent:event buttons:MOUSE_EVENT_LBUTTON];
mouse_event = true;
break;
case NSEventTypeRightMouseDragged: case NSEventTypeRightMouseDragged:
buttons |= MOUSE_EVENT_RBUTTON; return [self handleMouseEvent:event buttons:MOUSE_EVENT_RBUTTON];
mouse_event = true;
break;
case NSEventTypeOtherMouseDragged: case NSEventTypeOtherMouseDragged:
buttons |= MOUSE_EVENT_MBUTTON; return [self handleMouseEvent:event buttons:MOUSE_EVENT_MBUTTON];
mouse_event = true;
break;
case NSEventTypeLeftMouseUp: case NSEventTypeLeftMouseUp:
mouse_event = true;
if (!isMouseGrabbed && [self screenContainsPoint:p]) { if (!isMouseGrabbed && [self screenContainsPoint:p]) {
/* /*
* In fullscreen mode, the window of cocoaView may not be the * In fullscreen mode, the window of cocoaView may not be the
@ -1058,53 +1043,41 @@ static CGEventRef handleTapEvent(CGEventTapProxy proxy, CGEventType type, CGEven
[self grabMouse]; [self grabMouse];
} }
} }
break; return [self handleMouseEvent:event buttons:0];
case NSEventTypeRightMouseUp: case NSEventTypeRightMouseUp:
mouse_event = true; return [self handleMouseEvent:event buttons:0];
break;
case NSEventTypeOtherMouseUp: case NSEventTypeOtherMouseUp:
mouse_event = true; return [self handleMouseEvent:event buttons:0];
break;
case NSEventTypeScrollWheel: case NSEventTypeScrollWheel:
/* /*
* Send wheel events to the guest regardless of window focus. * Send wheel events to the guest regardless of window focus.
* This is in-line with standard Mac OS X UI behaviour. * This is in-line with standard Mac OS X UI behaviour.
*/ */
/*
* We shouldn't have got a scroll event when deltaY and delta Y
* are zero, hence no harm in dropping the event
*/
if ([event deltaY] != 0 || [event deltaX] != 0) {
/* Determine if this is a scroll up or scroll down event */ /* Determine if this is a scroll up or scroll down event */
if ([event deltaY] != 0) { if ([event deltaY] != 0) {
buttons = ([event deltaY] > 0) ? button = ([event deltaY] > 0) ?
INPUT_BUTTON_WHEEL_UP : INPUT_BUTTON_WHEEL_DOWN; INPUT_BUTTON_WHEEL_UP : INPUT_BUTTON_WHEEL_DOWN;
} else if ([event deltaX] != 0) { } else if ([event deltaX] != 0) {
buttons = ([event deltaX] > 0) ? button = ([event deltaX] > 0) ?
INPUT_BUTTON_WHEEL_LEFT : INPUT_BUTTON_WHEEL_RIGHT; INPUT_BUTTON_WHEEL_LEFT : INPUT_BUTTON_WHEEL_RIGHT;
} } else {
/*
qemu_input_queue_btn(dcl.con, buttons, true); * We shouldn't have got a scroll event when deltaY and delta Y
qemu_input_event_sync(); * are zero, hence no harm in dropping the event
qemu_input_queue_btn(dcl.con, buttons, false); */
qemu_input_event_sync(); return true;
} }
/* qemu_input_queue_btn(dcl.con, button, true);
* Since deltaX/deltaY also report scroll wheel events we prevent mouse qemu_input_event_sync();
* movement code from executing. qemu_input_queue_btn(dcl.con, button, false);
*/ qemu_input_event_sync();
mouse_event = false;
break; return true;
default: default:
return false; return false;
} }
if (mouse_event) {
return [self handleMouseEvent:event buttons:buttons];
}
return true;
} }
- (bool) handleMouseEvent:(NSEvent *)event buttons:(uint32_t)buttons - (bool) handleMouseEvent:(NSEvent *)event buttons:(uint32_t)buttons