cocoa queue:
* update cocoa UI front end to use QKeyCodes * fix the help menu documentation links to actually work (with both an installed and an uninstalled QEMU) -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABCAAGBQJW8qilAAoJEDwlJe0UNgzeYFMP/iTezxfuyUz/5FkmQO494e7q qIJ7bJFR9wpIQ9fpLGgf6fZi/k/ggM+xntcljZuFQ43xNlT0ScgRE/5Eiqz1HD7P 5bVeGG7SW55e0NWKZ8SjQ4ypAnM0dnDYP72XYQuCLTl0FDuP86o0sTC8y3rReeL5 V8pyOv3PIqMMH7jvQn11wxUWinoMsL3mxe+1m6nyICj9ugWh7LLy4SYr7OELcMa+ lt+NQZ2OZvmgJmTtO1RO6nqd4Y5+9gKR7cj4czlK1jbMR+plSrm5+y4TwOP4Aj/6 K/36M+ZyoVJZ9UYGOsQ4hvFTyaTF3pGdS4ggxyNqZGvYB6FJiPLVLyO8u1Jsvu3q 8exRrQ2I1XAISg0NrNt56Ca5OB9+N2KA5KkzE/W5Ij0gyvEvq0NWEqhJ+rEgPisj Ufgr22cWfsRqWygoXy7cfLkCAEqehKh9W/Sg1Z5YZTb0F3wzR74GuntX7zX1/8UG lz9LErEZAlRNbEXkSxDQAqjr6w5+72gJhjBNRtCUfO9qdnNt3oSqZ+HhfE6sxMpu X5fwcLRDC3vme8qdzIVjM2cogawsbqHXDq63Vtv0mMG+ipAlWOSRlJ6RkwvM/pId nlNFRpvTx6qKvv/AdGnqH7i2Dfx/X99pqzAVRouf5bsSLNeMoirbwdPZD1X1mkr8 uliUojuiohGzEEtZAnxY =RVzw -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/pmaydell/tags/pull-cocoa-20160323-1' into staging cocoa queue: * update cocoa UI front end to use QKeyCodes * fix the help menu documentation links to actually work (with both an installed and an uninstalled QEMU) # gpg: Signature made Wed 23 Mar 2016 14:31:01 GMT using RSA key ID 14360CDE # gpg: Good signature from "Peter Maydell <peter.maydell@linaro.org>" # gpg: aka "Peter Maydell <pmaydell@gmail.com>" # gpg: aka "Peter Maydell <pmaydell@chiark.greenend.org.uk>" * remotes/pmaydell/tags/pull-cocoa-20160323-1: ui/cocoa.m: switch to QKeyCode qapi-schema.json: Add power and keypad equal keys ui/cocoa.m: fix help menus Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
4f57a35d81
@ -3082,6 +3082,7 @@
|
||||
#
|
||||
# 'unmapped' and 'pause' since 2.0
|
||||
# 'ro' and 'kp_comma' since 2.4
|
||||
# 'kp_equals' and 'power' since 2.6
|
||||
##
|
||||
{ 'enum': 'QKeyCode',
|
||||
'data': [ 'unmapped',
|
||||
@ -3100,7 +3101,7 @@
|
||||
'left', 'up', 'down', 'right', 'insert', 'delete', 'stop', 'again',
|
||||
'props', 'undo', 'front', 'copy', 'open', 'paste', 'find', 'cut',
|
||||
'lf', 'help', 'meta_l', 'meta_r', 'compose', 'pause', 'ro',
|
||||
'kp_comma' ] }
|
||||
'kp_comma', 'kp_equals', 'power' ] }
|
||||
|
||||
##
|
||||
# @KeyValue
|
||||
|
346
ui/cocoa.m
346
ui/cocoa.m
@ -33,6 +33,7 @@
|
||||
#include "sysemu/sysemu.h"
|
||||
#include "qmp-commands.h"
|
||||
#include "sysemu/blockdev.h"
|
||||
#include <Carbon/Carbon.h>
|
||||
|
||||
#ifndef MAC_OS_X_VERSION_10_5
|
||||
#define MAC_OS_X_VERSION_10_5 1050
|
||||
@ -72,178 +73,139 @@ bool stretch_video;
|
||||
NSTextField *pauseLabel;
|
||||
NSArray * supportedImageFileTypes;
|
||||
|
||||
// keymap conversion
|
||||
int keymap[] =
|
||||
{
|
||||
// SdlI macI macH SdlH 104xtH 104xtC sdl
|
||||
30, // 0 0x00 0x1e A QZ_a
|
||||
31, // 1 0x01 0x1f S QZ_s
|
||||
32, // 2 0x02 0x20 D QZ_d
|
||||
33, // 3 0x03 0x21 F QZ_f
|
||||
35, // 4 0x04 0x23 H QZ_h
|
||||
34, // 5 0x05 0x22 G QZ_g
|
||||
44, // 6 0x06 0x2c Z QZ_z
|
||||
45, // 7 0x07 0x2d X QZ_x
|
||||
46, // 8 0x08 0x2e C QZ_c
|
||||
47, // 9 0x09 0x2f V QZ_v
|
||||
0, // 10 0x0A Undefined
|
||||
48, // 11 0x0B 0x30 B QZ_b
|
||||
16, // 12 0x0C 0x10 Q QZ_q
|
||||
17, // 13 0x0D 0x11 W QZ_w
|
||||
18, // 14 0x0E 0x12 E QZ_e
|
||||
19, // 15 0x0F 0x13 R QZ_r
|
||||
21, // 16 0x10 0x15 Y QZ_y
|
||||
20, // 17 0x11 0x14 T QZ_t
|
||||
2, // 18 0x12 0x02 1 QZ_1
|
||||
3, // 19 0x13 0x03 2 QZ_2
|
||||
4, // 20 0x14 0x04 3 QZ_3
|
||||
5, // 21 0x15 0x05 4 QZ_4
|
||||
7, // 22 0x16 0x07 6 QZ_6
|
||||
6, // 23 0x17 0x06 5 QZ_5
|
||||
13, // 24 0x18 0x0d = QZ_EQUALS
|
||||
10, // 25 0x19 0x0a 9 QZ_9
|
||||
8, // 26 0x1A 0x08 7 QZ_7
|
||||
12, // 27 0x1B 0x0c - QZ_MINUS
|
||||
9, // 28 0x1C 0x09 8 QZ_8
|
||||
11, // 29 0x1D 0x0b 0 QZ_0
|
||||
27, // 30 0x1E 0x1b ] QZ_RIGHTBRACKET
|
||||
24, // 31 0x1F 0x18 O QZ_o
|
||||
22, // 32 0x20 0x16 U QZ_u
|
||||
26, // 33 0x21 0x1a [ QZ_LEFTBRACKET
|
||||
23, // 34 0x22 0x17 I QZ_i
|
||||
25, // 35 0x23 0x19 P QZ_p
|
||||
28, // 36 0x24 0x1c ENTER QZ_RETURN
|
||||
38, // 37 0x25 0x26 L QZ_l
|
||||
36, // 38 0x26 0x24 J QZ_j
|
||||
40, // 39 0x27 0x28 ' QZ_QUOTE
|
||||
37, // 40 0x28 0x25 K QZ_k
|
||||
39, // 41 0x29 0x27 ; QZ_SEMICOLON
|
||||
43, // 42 0x2A 0x2b \ QZ_BACKSLASH
|
||||
51, // 43 0x2B 0x33 , QZ_COMMA
|
||||
53, // 44 0x2C 0x35 / QZ_SLASH
|
||||
49, // 45 0x2D 0x31 N QZ_n
|
||||
50, // 46 0x2E 0x32 M QZ_m
|
||||
52, // 47 0x2F 0x34 . QZ_PERIOD
|
||||
15, // 48 0x30 0x0f TAB QZ_TAB
|
||||
57, // 49 0x31 0x39 SPACE QZ_SPACE
|
||||
41, // 50 0x32 0x29 ` QZ_BACKQUOTE
|
||||
14, // 51 0x33 0x0e BKSP QZ_BACKSPACE
|
||||
0, // 52 0x34 Undefined
|
||||
1, // 53 0x35 0x01 ESC QZ_ESCAPE
|
||||
220, // 54 0x36 0xdc E0,5C R GUI QZ_RMETA
|
||||
219, // 55 0x37 0xdb E0,5B L GUI QZ_LMETA
|
||||
42, // 56 0x38 0x2a L SHFT QZ_LSHIFT
|
||||
58, // 57 0x39 0x3a CAPS QZ_CAPSLOCK
|
||||
56, // 58 0x3A 0x38 L ALT QZ_LALT
|
||||
29, // 59 0x3B 0x1d L CTRL QZ_LCTRL
|
||||
54, // 60 0x3C 0x36 R SHFT QZ_RSHIFT
|
||||
184,// 61 0x3D 0xb8 E0,38 R ALT QZ_RALT
|
||||
157,// 62 0x3E 0x9d E0,1D R CTRL QZ_RCTRL
|
||||
0, // 63 0x3F Undefined
|
||||
0, // 64 0x40 Undefined
|
||||
0, // 65 0x41 Undefined
|
||||
0, // 66 0x42 Undefined
|
||||
55, // 67 0x43 0x37 KP * QZ_KP_MULTIPLY
|
||||
0, // 68 0x44 Undefined
|
||||
78, // 69 0x45 0x4e KP + QZ_KP_PLUS
|
||||
0, // 70 0x46 Undefined
|
||||
69, // 71 0x47 0x45 NUM QZ_NUMLOCK
|
||||
0, // 72 0x48 Undefined
|
||||
0, // 73 0x49 Undefined
|
||||
0, // 74 0x4A Undefined
|
||||
181,// 75 0x4B 0xb5 E0,35 KP / QZ_KP_DIVIDE
|
||||
152,// 76 0x4C 0x9c E0,1C KP EN QZ_KP_ENTER
|
||||
0, // 77 0x4D undefined
|
||||
74, // 78 0x4E 0x4a KP - QZ_KP_MINUS
|
||||
0, // 79 0x4F Undefined
|
||||
0, // 80 0x50 Undefined
|
||||
0, // 81 0x51 QZ_KP_EQUALS
|
||||
82, // 82 0x52 0x52 KP 0 QZ_KP0
|
||||
79, // 83 0x53 0x4f KP 1 QZ_KP1
|
||||
80, // 84 0x54 0x50 KP 2 QZ_KP2
|
||||
81, // 85 0x55 0x51 KP 3 QZ_KP3
|
||||
75, // 86 0x56 0x4b KP 4 QZ_KP4
|
||||
76, // 87 0x57 0x4c KP 5 QZ_KP5
|
||||
77, // 88 0x58 0x4d KP 6 QZ_KP6
|
||||
71, // 89 0x59 0x47 KP 7 QZ_KP7
|
||||
0, // 90 0x5A Undefined
|
||||
72, // 91 0x5B 0x48 KP 8 QZ_KP8
|
||||
73, // 92 0x5C 0x49 KP 9 QZ_KP9
|
||||
0, // 93 0x5D Undefined
|
||||
0, // 94 0x5E Undefined
|
||||
0, // 95 0x5F Undefined
|
||||
63, // 96 0x60 0x3f F5 QZ_F5
|
||||
64, // 97 0x61 0x40 F6 QZ_F6
|
||||
65, // 98 0x62 0x41 F7 QZ_F7
|
||||
61, // 99 0x63 0x3d F3 QZ_F3
|
||||
66, // 100 0x64 0x42 F8 QZ_F8
|
||||
67, // 101 0x65 0x43 F9 QZ_F9
|
||||
0, // 102 0x66 Undefined
|
||||
87, // 103 0x67 0x57 F11 QZ_F11
|
||||
0, // 104 0x68 Undefined
|
||||
183,// 105 0x69 0xb7 QZ_PRINT
|
||||
0, // 106 0x6A Undefined
|
||||
70, // 107 0x6B 0x46 SCROLL QZ_SCROLLOCK
|
||||
0, // 108 0x6C Undefined
|
||||
68, // 109 0x6D 0x44 F10 QZ_F10
|
||||
0, // 110 0x6E Undefined
|
||||
88, // 111 0x6F 0x58 F12 QZ_F12
|
||||
0, // 112 0x70 Undefined
|
||||
110,// 113 0x71 0x0 QZ_PAUSE
|
||||
210,// 114 0x72 0xd2 E0,52 INSERT QZ_INSERT
|
||||
199,// 115 0x73 0xc7 E0,47 HOME QZ_HOME
|
||||
201,// 116 0x74 0xc9 E0,49 PG UP QZ_PAGEUP
|
||||
211,// 117 0x75 0xd3 E0,53 DELETE QZ_DELETE
|
||||
62, // 118 0x76 0x3e F4 QZ_F4
|
||||
207,// 119 0x77 0xcf E0,4f END QZ_END
|
||||
60, // 120 0x78 0x3c F2 QZ_F2
|
||||
209,// 121 0x79 0xd1 E0,51 PG DN QZ_PAGEDOWN
|
||||
59, // 122 0x7A 0x3b F1 QZ_F1
|
||||
203,// 123 0x7B 0xcb e0,4B L ARROW QZ_LEFT
|
||||
205,// 124 0x7C 0xcd e0,4D R ARROW QZ_RIGHT
|
||||
208,// 125 0x7D 0xd0 E0,50 D ARROW QZ_DOWN
|
||||
200,// 126 0x7E 0xc8 E0,48 U ARROW QZ_UP
|
||||
/* completed according to http://www.libsdl.org/cgi/cvsweb.cgi/SDL12/src/video/quartz/SDL_QuartzKeys.h?rev=1.6&content-type=text/x-cvsweb-markup */
|
||||
// Mac to QKeyCode conversion
|
||||
const int mac_to_qkeycode_map[] = {
|
||||
[kVK_ANSI_A] = Q_KEY_CODE_A,
|
||||
[kVK_ANSI_B] = Q_KEY_CODE_B,
|
||||
[kVK_ANSI_C] = Q_KEY_CODE_C,
|
||||
[kVK_ANSI_D] = Q_KEY_CODE_D,
|
||||
[kVK_ANSI_E] = Q_KEY_CODE_E,
|
||||
[kVK_ANSI_F] = Q_KEY_CODE_F,
|
||||
[kVK_ANSI_G] = Q_KEY_CODE_G,
|
||||
[kVK_ANSI_H] = Q_KEY_CODE_H,
|
||||
[kVK_ANSI_I] = Q_KEY_CODE_I,
|
||||
[kVK_ANSI_J] = Q_KEY_CODE_J,
|
||||
[kVK_ANSI_K] = Q_KEY_CODE_K,
|
||||
[kVK_ANSI_L] = Q_KEY_CODE_L,
|
||||
[kVK_ANSI_M] = Q_KEY_CODE_M,
|
||||
[kVK_ANSI_N] = Q_KEY_CODE_N,
|
||||
[kVK_ANSI_O] = Q_KEY_CODE_O,
|
||||
[kVK_ANSI_P] = Q_KEY_CODE_P,
|
||||
[kVK_ANSI_Q] = Q_KEY_CODE_Q,
|
||||
[kVK_ANSI_R] = Q_KEY_CODE_R,
|
||||
[kVK_ANSI_S] = Q_KEY_CODE_S,
|
||||
[kVK_ANSI_T] = Q_KEY_CODE_T,
|
||||
[kVK_ANSI_U] = Q_KEY_CODE_U,
|
||||
[kVK_ANSI_V] = Q_KEY_CODE_V,
|
||||
[kVK_ANSI_W] = Q_KEY_CODE_W,
|
||||
[kVK_ANSI_X] = Q_KEY_CODE_X,
|
||||
[kVK_ANSI_Y] = Q_KEY_CODE_Y,
|
||||
[kVK_ANSI_Z] = Q_KEY_CODE_Z,
|
||||
|
||||
/* Additional 104 Key XP-Keyboard Scancodes from http://www.computer-engineering.org/ps2keyboard/scancodes1.html */
|
||||
/*
|
||||
221 // 0xdd e0,5d APPS
|
||||
// E0,2A,E0,37 PRNT SCRN
|
||||
// E1,1D,45,E1,9D,C5 PAUSE
|
||||
83 // 0x53 0x53 KP .
|
||||
// ACPI Scan Codes
|
||||
222 // 0xde E0, 5E Power
|
||||
223 // 0xdf E0, 5F Sleep
|
||||
227 // 0xe3 E0, 63 Wake
|
||||
// Windows Multimedia Scan Codes
|
||||
153 // 0x99 E0, 19 Next Track
|
||||
144 // 0x90 E0, 10 Previous Track
|
||||
164 // 0xa4 E0, 24 Stop
|
||||
162 // 0xa2 E0, 22 Play/Pause
|
||||
160 // 0xa0 E0, 20 Mute
|
||||
176 // 0xb0 E0, 30 Volume Up
|
||||
174 // 0xae E0, 2E Volume Down
|
||||
237 // 0xed E0, 6D Media Select
|
||||
236 // 0xec E0, 6C E-Mail
|
||||
161 // 0xa1 E0, 21 Calculator
|
||||
235 // 0xeb E0, 6B My Computer
|
||||
229 // 0xe5 E0, 65 WWW Search
|
||||
178 // 0xb2 E0, 32 WWW Home
|
||||
234 // 0xea E0, 6A WWW Back
|
||||
233 // 0xe9 E0, 69 WWW Forward
|
||||
232 // 0xe8 E0, 68 WWW Stop
|
||||
231 // 0xe7 E0, 67 WWW Refresh
|
||||
230 // 0xe6 E0, 66 WWW Favorites
|
||||
*/
|
||||
[kVK_ANSI_0] = Q_KEY_CODE_0,
|
||||
[kVK_ANSI_1] = Q_KEY_CODE_1,
|
||||
[kVK_ANSI_2] = Q_KEY_CODE_2,
|
||||
[kVK_ANSI_3] = Q_KEY_CODE_3,
|
||||
[kVK_ANSI_4] = Q_KEY_CODE_4,
|
||||
[kVK_ANSI_5] = Q_KEY_CODE_5,
|
||||
[kVK_ANSI_6] = Q_KEY_CODE_6,
|
||||
[kVK_ANSI_7] = Q_KEY_CODE_7,
|
||||
[kVK_ANSI_8] = Q_KEY_CODE_8,
|
||||
[kVK_ANSI_9] = Q_KEY_CODE_9,
|
||||
|
||||
[kVK_ANSI_Grave] = Q_KEY_CODE_GRAVE_ACCENT,
|
||||
[kVK_ANSI_Minus] = Q_KEY_CODE_MINUS,
|
||||
[kVK_ANSI_Equal] = Q_KEY_CODE_EQUAL,
|
||||
[kVK_Delete] = Q_KEY_CODE_BACKSPACE,
|
||||
[kVK_CapsLock] = Q_KEY_CODE_CAPS_LOCK,
|
||||
[kVK_Tab] = Q_KEY_CODE_TAB,
|
||||
[kVK_Return] = Q_KEY_CODE_RET,
|
||||
[kVK_ANSI_LeftBracket] = Q_KEY_CODE_BRACKET_LEFT,
|
||||
[kVK_ANSI_RightBracket] = Q_KEY_CODE_BRACKET_RIGHT,
|
||||
[kVK_ANSI_Backslash] = Q_KEY_CODE_BACKSLASH,
|
||||
[kVK_ANSI_Semicolon] = Q_KEY_CODE_SEMICOLON,
|
||||
[kVK_ANSI_Quote] = Q_KEY_CODE_APOSTROPHE,
|
||||
[kVK_ANSI_Comma] = Q_KEY_CODE_COMMA,
|
||||
[kVK_ANSI_Period] = Q_KEY_CODE_DOT,
|
||||
[kVK_ANSI_Slash] = Q_KEY_CODE_SLASH,
|
||||
[kVK_Shift] = Q_KEY_CODE_SHIFT,
|
||||
[kVK_RightShift] = Q_KEY_CODE_SHIFT_R,
|
||||
[kVK_Control] = Q_KEY_CODE_CTRL,
|
||||
[kVK_RightControl] = Q_KEY_CODE_CTRL_R,
|
||||
[kVK_Option] = Q_KEY_CODE_ALT,
|
||||
[kVK_RightOption] = Q_KEY_CODE_ALT_R,
|
||||
[kVK_Command] = Q_KEY_CODE_META_L,
|
||||
[0x36] = Q_KEY_CODE_META_R, /* There is no kVK_RightCommand */
|
||||
[kVK_Space] = Q_KEY_CODE_SPC,
|
||||
|
||||
[kVK_ANSI_Keypad0] = Q_KEY_CODE_KP_0,
|
||||
[kVK_ANSI_Keypad1] = Q_KEY_CODE_KP_1,
|
||||
[kVK_ANSI_Keypad2] = Q_KEY_CODE_KP_2,
|
||||
[kVK_ANSI_Keypad3] = Q_KEY_CODE_KP_3,
|
||||
[kVK_ANSI_Keypad4] = Q_KEY_CODE_KP_4,
|
||||
[kVK_ANSI_Keypad5] = Q_KEY_CODE_KP_5,
|
||||
[kVK_ANSI_Keypad6] = Q_KEY_CODE_KP_6,
|
||||
[kVK_ANSI_Keypad7] = Q_KEY_CODE_KP_7,
|
||||
[kVK_ANSI_Keypad8] = Q_KEY_CODE_KP_8,
|
||||
[kVK_ANSI_Keypad9] = Q_KEY_CODE_KP_9,
|
||||
[kVK_ANSI_KeypadDecimal] = Q_KEY_CODE_KP_DECIMAL,
|
||||
[kVK_ANSI_KeypadEnter] = Q_KEY_CODE_KP_ENTER,
|
||||
[kVK_ANSI_KeypadPlus] = Q_KEY_CODE_KP_ADD,
|
||||
[kVK_ANSI_KeypadMinus] = Q_KEY_CODE_KP_SUBTRACT,
|
||||
[kVK_ANSI_KeypadMultiply] = Q_KEY_CODE_KP_MULTIPLY,
|
||||
[kVK_ANSI_KeypadDivide] = Q_KEY_CODE_KP_DIVIDE,
|
||||
[kVK_ANSI_KeypadEquals] = Q_KEY_CODE_KP_EQUALS,
|
||||
[kVK_ANSI_KeypadClear] = Q_KEY_CODE_NUM_LOCK,
|
||||
|
||||
[kVK_UpArrow] = Q_KEY_CODE_UP,
|
||||
[kVK_DownArrow] = Q_KEY_CODE_DOWN,
|
||||
[kVK_LeftArrow] = Q_KEY_CODE_LEFT,
|
||||
[kVK_RightArrow] = Q_KEY_CODE_RIGHT,
|
||||
|
||||
[kVK_Help] = Q_KEY_CODE_INSERT,
|
||||
[kVK_Home] = Q_KEY_CODE_HOME,
|
||||
[kVK_PageUp] = Q_KEY_CODE_PGUP,
|
||||
[kVK_PageDown] = Q_KEY_CODE_PGDN,
|
||||
[kVK_End] = Q_KEY_CODE_END,
|
||||
[kVK_ForwardDelete] = Q_KEY_CODE_DELETE,
|
||||
|
||||
[kVK_Escape] = Q_KEY_CODE_ESC,
|
||||
|
||||
/* The Power key can't be used directly because the operating system uses
|
||||
* it. This key can be emulated by using it in place of another key such as
|
||||
* F1. Don't forget to disable the real key binding.
|
||||
*/
|
||||
/* [kVK_F1] = Q_KEY_CODE_POWER, */
|
||||
|
||||
[kVK_F1] = Q_KEY_CODE_F1,
|
||||
[kVK_F2] = Q_KEY_CODE_F2,
|
||||
[kVK_F3] = Q_KEY_CODE_F3,
|
||||
[kVK_F4] = Q_KEY_CODE_F4,
|
||||
[kVK_F5] = Q_KEY_CODE_F5,
|
||||
[kVK_F6] = Q_KEY_CODE_F6,
|
||||
[kVK_F7] = Q_KEY_CODE_F7,
|
||||
[kVK_F8] = Q_KEY_CODE_F8,
|
||||
[kVK_F9] = Q_KEY_CODE_F9,
|
||||
[kVK_F10] = Q_KEY_CODE_F10,
|
||||
[kVK_F11] = Q_KEY_CODE_F11,
|
||||
[kVK_F12] = Q_KEY_CODE_F12,
|
||||
[kVK_F13] = Q_KEY_CODE_PRINT,
|
||||
[kVK_F14] = Q_KEY_CODE_SCROLL_LOCK,
|
||||
[kVK_F15] = Q_KEY_CODE_PAUSE,
|
||||
|
||||
/*
|
||||
* The eject and volume keys can't be used here because they are handled at
|
||||
* a lower level than what an Application can see.
|
||||
*/
|
||||
};
|
||||
|
||||
static int cocoa_keycode_to_qemu(int keycode)
|
||||
{
|
||||
if (ARRAY_SIZE(keymap) <= keycode) {
|
||||
if (ARRAY_SIZE(mac_to_qkeycode_map) <= keycode) {
|
||||
fprintf(stderr, "(cocoa) warning unknown keycode 0x%x\n", keycode);
|
||||
return 0;
|
||||
}
|
||||
return keymap[keycode];
|
||||
return mac_to_qkeycode_map[keycode];
|
||||
}
|
||||
|
||||
/* Displays an alert dialog box with the specified message */
|
||||
@ -557,21 +519,24 @@ QemuCocoaView *cocoaView;
|
||||
case NSFlagsChanged:
|
||||
keycode = cocoa_keycode_to_qemu([event keyCode]);
|
||||
|
||||
if ((keycode == 219 || keycode == 220) && !isMouseGrabbed) {
|
||||
if ((keycode == Q_KEY_CODE_META_L || keycode == Q_KEY_CODE_META_R)
|
||||
&& !isMouseGrabbed) {
|
||||
/* Don't pass command key changes to guest unless mouse is grabbed */
|
||||
keycode = 0;
|
||||
}
|
||||
|
||||
if (keycode) {
|
||||
if (keycode == 58 || keycode == 69) { // emulate caps lock and num lock keydown and keyup
|
||||
qemu_input_event_send_key_number(dcl->con, keycode, true);
|
||||
qemu_input_event_send_key_number(dcl->con, keycode, false);
|
||||
// emulate caps lock and num lock keydown and keyup
|
||||
if (keycode == Q_KEY_CODE_CAPS_LOCK ||
|
||||
keycode == Q_KEY_CODE_NUM_LOCK) {
|
||||
qemu_input_event_send_key_qcode(dcl->con, keycode, true);
|
||||
qemu_input_event_send_key_qcode(dcl->con, keycode, false);
|
||||
} else if (qemu_console_is_graphic(NULL)) {
|
||||
if (modifiers_state[keycode] == 0) { // keydown
|
||||
qemu_input_event_send_key_number(dcl->con, keycode, true);
|
||||
qemu_input_event_send_key_qcode(dcl->con, keycode, true);
|
||||
modifiers_state[keycode] = 1;
|
||||
} else { // keyup
|
||||
qemu_input_event_send_key_number(dcl->con, keycode, false);
|
||||
qemu_input_event_send_key_qcode(dcl->con, keycode, false);
|
||||
modifiers_state[keycode] = 0;
|
||||
}
|
||||
}
|
||||
@ -598,14 +563,14 @@ QemuCocoaView *cocoaView;
|
||||
switch (keycode) {
|
||||
|
||||
// enable graphic console
|
||||
case 0x02 ... 0x0a: // '1' to '9' keys
|
||||
console_select(keycode - 0x02);
|
||||
case Q_KEY_CODE_1 ... Q_KEY_CODE_9: // '1' to '9' keys
|
||||
console_select(keycode - 11);
|
||||
break;
|
||||
}
|
||||
|
||||
// handle keys for graphic console
|
||||
} else if (qemu_console_is_graphic(NULL)) {
|
||||
qemu_input_event_send_key_number(dcl->con, keycode, true);
|
||||
qemu_input_event_send_key_qcode(dcl->con, keycode, true);
|
||||
|
||||
// handlekeys for Monitor
|
||||
} else {
|
||||
@ -653,7 +618,7 @@ QemuCocoaView *cocoaView;
|
||||
}
|
||||
|
||||
if (qemu_console_is_graphic(NULL)) {
|
||||
qemu_input_event_send_key_number(dcl->con, keycode, false);
|
||||
qemu_input_event_send_key_qcode(dcl->con, keycode, false);
|
||||
}
|
||||
break;
|
||||
case NSMouseMoved:
|
||||
@ -823,7 +788,7 @@ QemuCocoaView *cocoaView;
|
||||
for (index = 0; index < max_index; index++) {
|
||||
if (modifiers_state[index]) {
|
||||
modifiers_state[index] = 0;
|
||||
qemu_input_event_send_key_number(dcl->con, index, false);
|
||||
qemu_input_event_send_key_qcode(dcl->con, index, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -858,6 +823,7 @@ QemuCocoaView *cocoaView;
|
||||
- (void)ejectDeviceMedia:(id)sender;
|
||||
- (void)changeDeviceMedia:(id)sender;
|
||||
- (BOOL)verifyQuit;
|
||||
- (void)openDocumentation:(NSString *)filename;
|
||||
@end
|
||||
|
||||
@implementation QemuCocoaAppController
|
||||
@ -994,20 +960,42 @@ QemuCocoaView *cocoaView;
|
||||
[cocoaView toggleFullScreen:sender];
|
||||
}
|
||||
|
||||
/* Tries to find then open the specified filename */
|
||||
- (void) openDocumentation: (NSString *) filename
|
||||
{
|
||||
/* Where to look for local files */
|
||||
NSString *path_array[] = {@"../share/doc/qemu/", @"../doc/qemu/", @"../"};
|
||||
NSString *full_file_path;
|
||||
|
||||
/* iterate thru the possible paths until the file is found */
|
||||
int index;
|
||||
for (index = 0; index < ARRAY_SIZE(path_array); index++) {
|
||||
full_file_path = [[NSBundle mainBundle] executablePath];
|
||||
full_file_path = [full_file_path stringByDeletingLastPathComponent];
|
||||
full_file_path = [NSString stringWithFormat: @"%@/%@%@", full_file_path,
|
||||
path_array[index], filename];
|
||||
if ([[NSWorkspace sharedWorkspace] openFile: full_file_path] == YES) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* If none of the paths opened a file */
|
||||
NSBeep();
|
||||
QEMU_Alert(@"Failed to open file");
|
||||
}
|
||||
|
||||
- (void)showQEMUDoc:(id)sender
|
||||
{
|
||||
COCOA_DEBUG("QemuCocoaAppController: showQEMUDoc\n");
|
||||
|
||||
[[NSWorkspace sharedWorkspace] openFile:[NSString stringWithFormat:@"%@/../doc/qemu/qemu-doc.html",
|
||||
[[NSBundle mainBundle] resourcePath]] withApplication:@"Help Viewer"];
|
||||
[self openDocumentation: @"qemu-doc.html"];
|
||||
}
|
||||
|
||||
- (void)showQEMUTec:(id)sender
|
||||
{
|
||||
COCOA_DEBUG("QemuCocoaAppController: showQEMUTec\n");
|
||||
|
||||
[[NSWorkspace sharedWorkspace] openFile:[NSString stringWithFormat:@"%@/../doc/qemu/qemu-tech.html",
|
||||
[[NSBundle mainBundle] resourcePath]] withApplication:@"Help Viewer"];
|
||||
[self openDocumentation: @"qemu-tech.html"];
|
||||
}
|
||||
|
||||
/* Stretches video to fit host monitor size */
|
||||
|
Loading…
Reference in New Issue
Block a user