mirror of
https://github.com/qemu/qemu.git
synced 2024-12-12 13:13:51 +08:00
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:
parent
af4efbccda
commit
0f7be47abe
87
ui/cocoa.m
87
ui/cocoa.m
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user