ui/cocoa.m: Make scrolling work again in GUI monitor windows
Make scrolling in the monitor work, by correctly passing through control+key combinations. Signed-off-by: John Arbuckle <programmingkidx@gmail.com> Message-id: 20171101154607.1582-1-programmingkidx@gmail.com [PMM: fixed coding style nits; cleaned up commit message] Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
299d1ea9bb
commit
9c3a418eac
98
ui/cocoa.m
98
ui/cocoa.m
@ -281,6 +281,7 @@ static void handleAnyDeviceErrors(Error * err)
|
||||
- (void) grabMouse;
|
||||
- (void) ungrabMouse;
|
||||
- (void) toggleFullScreen:(id)sender;
|
||||
- (void) handleMonitorInput:(NSEvent *)event;
|
||||
- (void) handleEvent:(NSEvent *)event;
|
||||
- (void) setAbsoluteEnabled:(BOOL)tIsAbsoluteEnabled;
|
||||
/* The state surrounding mouse grabbing is potentially confusing.
|
||||
@ -554,6 +555,70 @@ QemuCocoaView *cocoaView;
|
||||
qemu_input_event_send_key_qcode(dcl->con, keycode, false);
|
||||
}
|
||||
|
||||
// Does the work of sending input to the monitor
|
||||
- (void) handleMonitorInput:(NSEvent *)event
|
||||
{
|
||||
int keysym = 0;
|
||||
int control_key = 0;
|
||||
|
||||
// if the control key is down
|
||||
if ([event modifierFlags] & NSEventModifierFlagControl) {
|
||||
control_key = 1;
|
||||
}
|
||||
|
||||
/* translates Macintosh keycodes to QEMU's keysym */
|
||||
|
||||
int without_control_translation[] = {
|
||||
[0 ... 0xff] = 0, // invalid key
|
||||
|
||||
[kVK_UpArrow] = QEMU_KEY_UP,
|
||||
[kVK_DownArrow] = QEMU_KEY_DOWN,
|
||||
[kVK_RightArrow] = QEMU_KEY_RIGHT,
|
||||
[kVK_LeftArrow] = QEMU_KEY_LEFT,
|
||||
[kVK_Home] = QEMU_KEY_HOME,
|
||||
[kVK_End] = QEMU_KEY_END,
|
||||
[kVK_PageUp] = QEMU_KEY_PAGEUP,
|
||||
[kVK_PageDown] = QEMU_KEY_PAGEDOWN,
|
||||
[kVK_ForwardDelete] = QEMU_KEY_DELETE,
|
||||
[kVK_Delete] = QEMU_KEY_BACKSPACE,
|
||||
};
|
||||
|
||||
int with_control_translation[] = {
|
||||
[0 ... 0xff] = 0, // invalid key
|
||||
|
||||
[kVK_UpArrow] = QEMU_KEY_CTRL_UP,
|
||||
[kVK_DownArrow] = QEMU_KEY_CTRL_DOWN,
|
||||
[kVK_RightArrow] = QEMU_KEY_CTRL_RIGHT,
|
||||
[kVK_LeftArrow] = QEMU_KEY_CTRL_LEFT,
|
||||
[kVK_Home] = QEMU_KEY_CTRL_HOME,
|
||||
[kVK_End] = QEMU_KEY_CTRL_END,
|
||||
[kVK_PageUp] = QEMU_KEY_CTRL_PAGEUP,
|
||||
[kVK_PageDown] = QEMU_KEY_CTRL_PAGEDOWN,
|
||||
};
|
||||
|
||||
if (control_key != 0) { /* If the control key is being used */
|
||||
if ([event keyCode] < ARRAY_SIZE(with_control_translation)) {
|
||||
keysym = with_control_translation[[event keyCode]];
|
||||
}
|
||||
} else {
|
||||
if ([event keyCode] < ARRAY_SIZE(without_control_translation)) {
|
||||
keysym = without_control_translation[[event keyCode]];
|
||||
}
|
||||
}
|
||||
|
||||
// if not a key that needs translating
|
||||
if (keysym == 0) {
|
||||
NSString *ks = [event characters];
|
||||
if ([ks length] > 0) {
|
||||
keysym = [ks characterAtIndex:0];
|
||||
}
|
||||
}
|
||||
|
||||
if (keysym) {
|
||||
kbd_put_keysym(keysym);
|
||||
}
|
||||
}
|
||||
|
||||
- (void) handleEvent:(NSEvent *)event
|
||||
{
|
||||
COCOA_DEBUG("QemuCocoaView: handleEvent\n");
|
||||
@ -641,38 +706,7 @@ QemuCocoaView *cocoaView;
|
||||
|
||||
// handlekeys for Monitor
|
||||
} else {
|
||||
int keysym = 0;
|
||||
switch([event keyCode]) {
|
||||
case 115:
|
||||
keysym = QEMU_KEY_HOME;
|
||||
break;
|
||||
case 117:
|
||||
keysym = QEMU_KEY_DELETE;
|
||||
break;
|
||||
case 119:
|
||||
keysym = QEMU_KEY_END;
|
||||
break;
|
||||
case 123:
|
||||
keysym = QEMU_KEY_LEFT;
|
||||
break;
|
||||
case 124:
|
||||
keysym = QEMU_KEY_RIGHT;
|
||||
break;
|
||||
case 125:
|
||||
keysym = QEMU_KEY_DOWN;
|
||||
break;
|
||||
case 126:
|
||||
keysym = QEMU_KEY_UP;
|
||||
break;
|
||||
default:
|
||||
{
|
||||
NSString *ks = [event characters];
|
||||
if ([ks length] > 0)
|
||||
keysym = [ks characterAtIndex:0];
|
||||
}
|
||||
}
|
||||
if (keysym)
|
||||
kbd_put_keysym(keysym);
|
||||
[self handleMonitorInput: event];
|
||||
}
|
||||
break;
|
||||
case NSEventTypeKeyUp:
|
||||
|
Loading…
Reference in New Issue
Block a user