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
|
# 'unmapped' and 'pause' since 2.0
|
||||||
# 'ro' and 'kp_comma' since 2.4
|
# 'ro' and 'kp_comma' since 2.4
|
||||||
|
# 'kp_equals' and 'power' since 2.6
|
||||||
##
|
##
|
||||||
{ 'enum': 'QKeyCode',
|
{ 'enum': 'QKeyCode',
|
||||||
'data': [ 'unmapped',
|
'data': [ 'unmapped',
|
||||||
@ -3100,7 +3101,7 @@
|
|||||||
'left', 'up', 'down', 'right', 'insert', 'delete', 'stop', 'again',
|
'left', 'up', 'down', 'right', 'insert', 'delete', 'stop', 'again',
|
||||||
'props', 'undo', 'front', 'copy', 'open', 'paste', 'find', 'cut',
|
'props', 'undo', 'front', 'copy', 'open', 'paste', 'find', 'cut',
|
||||||
'lf', 'help', 'meta_l', 'meta_r', 'compose', 'pause', 'ro',
|
'lf', 'help', 'meta_l', 'meta_r', 'compose', 'pause', 'ro',
|
||||||
'kp_comma' ] }
|
'kp_comma', 'kp_equals', 'power' ] }
|
||||||
|
|
||||||
##
|
##
|
||||||
# @KeyValue
|
# @KeyValue
|
||||||
|
346
ui/cocoa.m
346
ui/cocoa.m
@ -33,6 +33,7 @@
|
|||||||
#include "sysemu/sysemu.h"
|
#include "sysemu/sysemu.h"
|
||||||
#include "qmp-commands.h"
|
#include "qmp-commands.h"
|
||||||
#include "sysemu/blockdev.h"
|
#include "sysemu/blockdev.h"
|
||||||
|
#include <Carbon/Carbon.h>
|
||||||
|
|
||||||
#ifndef MAC_OS_X_VERSION_10_5
|
#ifndef MAC_OS_X_VERSION_10_5
|
||||||
#define MAC_OS_X_VERSION_10_5 1050
|
#define MAC_OS_X_VERSION_10_5 1050
|
||||||
@ -72,178 +73,139 @@ bool stretch_video;
|
|||||||
NSTextField *pauseLabel;
|
NSTextField *pauseLabel;
|
||||||
NSArray * supportedImageFileTypes;
|
NSArray * supportedImageFileTypes;
|
||||||
|
|
||||||
// keymap conversion
|
// Mac to QKeyCode conversion
|
||||||
int keymap[] =
|
const int mac_to_qkeycode_map[] = {
|
||||||
{
|
[kVK_ANSI_A] = Q_KEY_CODE_A,
|
||||||
// SdlI macI macH SdlH 104xtH 104xtC sdl
|
[kVK_ANSI_B] = Q_KEY_CODE_B,
|
||||||
30, // 0 0x00 0x1e A QZ_a
|
[kVK_ANSI_C] = Q_KEY_CODE_C,
|
||||||
31, // 1 0x01 0x1f S QZ_s
|
[kVK_ANSI_D] = Q_KEY_CODE_D,
|
||||||
32, // 2 0x02 0x20 D QZ_d
|
[kVK_ANSI_E] = Q_KEY_CODE_E,
|
||||||
33, // 3 0x03 0x21 F QZ_f
|
[kVK_ANSI_F] = Q_KEY_CODE_F,
|
||||||
35, // 4 0x04 0x23 H QZ_h
|
[kVK_ANSI_G] = Q_KEY_CODE_G,
|
||||||
34, // 5 0x05 0x22 G QZ_g
|
[kVK_ANSI_H] = Q_KEY_CODE_H,
|
||||||
44, // 6 0x06 0x2c Z QZ_z
|
[kVK_ANSI_I] = Q_KEY_CODE_I,
|
||||||
45, // 7 0x07 0x2d X QZ_x
|
[kVK_ANSI_J] = Q_KEY_CODE_J,
|
||||||
46, // 8 0x08 0x2e C QZ_c
|
[kVK_ANSI_K] = Q_KEY_CODE_K,
|
||||||
47, // 9 0x09 0x2f V QZ_v
|
[kVK_ANSI_L] = Q_KEY_CODE_L,
|
||||||
0, // 10 0x0A Undefined
|
[kVK_ANSI_M] = Q_KEY_CODE_M,
|
||||||
48, // 11 0x0B 0x30 B QZ_b
|
[kVK_ANSI_N] = Q_KEY_CODE_N,
|
||||||
16, // 12 0x0C 0x10 Q QZ_q
|
[kVK_ANSI_O] = Q_KEY_CODE_O,
|
||||||
17, // 13 0x0D 0x11 W QZ_w
|
[kVK_ANSI_P] = Q_KEY_CODE_P,
|
||||||
18, // 14 0x0E 0x12 E QZ_e
|
[kVK_ANSI_Q] = Q_KEY_CODE_Q,
|
||||||
19, // 15 0x0F 0x13 R QZ_r
|
[kVK_ANSI_R] = Q_KEY_CODE_R,
|
||||||
21, // 16 0x10 0x15 Y QZ_y
|
[kVK_ANSI_S] = Q_KEY_CODE_S,
|
||||||
20, // 17 0x11 0x14 T QZ_t
|
[kVK_ANSI_T] = Q_KEY_CODE_T,
|
||||||
2, // 18 0x12 0x02 1 QZ_1
|
[kVK_ANSI_U] = Q_KEY_CODE_U,
|
||||||
3, // 19 0x13 0x03 2 QZ_2
|
[kVK_ANSI_V] = Q_KEY_CODE_V,
|
||||||
4, // 20 0x14 0x04 3 QZ_3
|
[kVK_ANSI_W] = Q_KEY_CODE_W,
|
||||||
5, // 21 0x15 0x05 4 QZ_4
|
[kVK_ANSI_X] = Q_KEY_CODE_X,
|
||||||
7, // 22 0x16 0x07 6 QZ_6
|
[kVK_ANSI_Y] = Q_KEY_CODE_Y,
|
||||||
6, // 23 0x17 0x06 5 QZ_5
|
[kVK_ANSI_Z] = Q_KEY_CODE_Z,
|
||||||
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 */
|
|
||||||
|
|
||||||
/* Additional 104 Key XP-Keyboard Scancodes from http://www.computer-engineering.org/ps2keyboard/scancodes1.html */
|
[kVK_ANSI_0] = Q_KEY_CODE_0,
|
||||||
/*
|
[kVK_ANSI_1] = Q_KEY_CODE_1,
|
||||||
221 // 0xdd e0,5d APPS
|
[kVK_ANSI_2] = Q_KEY_CODE_2,
|
||||||
// E0,2A,E0,37 PRNT SCRN
|
[kVK_ANSI_3] = Q_KEY_CODE_3,
|
||||||
// E1,1D,45,E1,9D,C5 PAUSE
|
[kVK_ANSI_4] = Q_KEY_CODE_4,
|
||||||
83 // 0x53 0x53 KP .
|
[kVK_ANSI_5] = Q_KEY_CODE_5,
|
||||||
// ACPI Scan Codes
|
[kVK_ANSI_6] = Q_KEY_CODE_6,
|
||||||
222 // 0xde E0, 5E Power
|
[kVK_ANSI_7] = Q_KEY_CODE_7,
|
||||||
223 // 0xdf E0, 5F Sleep
|
[kVK_ANSI_8] = Q_KEY_CODE_8,
|
||||||
227 // 0xe3 E0, 63 Wake
|
[kVK_ANSI_9] = Q_KEY_CODE_9,
|
||||||
// Windows Multimedia Scan Codes
|
|
||||||
153 // 0x99 E0, 19 Next Track
|
[kVK_ANSI_Grave] = Q_KEY_CODE_GRAVE_ACCENT,
|
||||||
144 // 0x90 E0, 10 Previous Track
|
[kVK_ANSI_Minus] = Q_KEY_CODE_MINUS,
|
||||||
164 // 0xa4 E0, 24 Stop
|
[kVK_ANSI_Equal] = Q_KEY_CODE_EQUAL,
|
||||||
162 // 0xa2 E0, 22 Play/Pause
|
[kVK_Delete] = Q_KEY_CODE_BACKSPACE,
|
||||||
160 // 0xa0 E0, 20 Mute
|
[kVK_CapsLock] = Q_KEY_CODE_CAPS_LOCK,
|
||||||
176 // 0xb0 E0, 30 Volume Up
|
[kVK_Tab] = Q_KEY_CODE_TAB,
|
||||||
174 // 0xae E0, 2E Volume Down
|
[kVK_Return] = Q_KEY_CODE_RET,
|
||||||
237 // 0xed E0, 6D Media Select
|
[kVK_ANSI_LeftBracket] = Q_KEY_CODE_BRACKET_LEFT,
|
||||||
236 // 0xec E0, 6C E-Mail
|
[kVK_ANSI_RightBracket] = Q_KEY_CODE_BRACKET_RIGHT,
|
||||||
161 // 0xa1 E0, 21 Calculator
|
[kVK_ANSI_Backslash] = Q_KEY_CODE_BACKSLASH,
|
||||||
235 // 0xeb E0, 6B My Computer
|
[kVK_ANSI_Semicolon] = Q_KEY_CODE_SEMICOLON,
|
||||||
229 // 0xe5 E0, 65 WWW Search
|
[kVK_ANSI_Quote] = Q_KEY_CODE_APOSTROPHE,
|
||||||
178 // 0xb2 E0, 32 WWW Home
|
[kVK_ANSI_Comma] = Q_KEY_CODE_COMMA,
|
||||||
234 // 0xea E0, 6A WWW Back
|
[kVK_ANSI_Period] = Q_KEY_CODE_DOT,
|
||||||
233 // 0xe9 E0, 69 WWW Forward
|
[kVK_ANSI_Slash] = Q_KEY_CODE_SLASH,
|
||||||
232 // 0xe8 E0, 68 WWW Stop
|
[kVK_Shift] = Q_KEY_CODE_SHIFT,
|
||||||
231 // 0xe7 E0, 67 WWW Refresh
|
[kVK_RightShift] = Q_KEY_CODE_SHIFT_R,
|
||||||
230 // 0xe6 E0, 66 WWW Favorites
|
[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)
|
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);
|
fprintf(stderr, "(cocoa) warning unknown keycode 0x%x\n", keycode);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return keymap[keycode];
|
return mac_to_qkeycode_map[keycode];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Displays an alert dialog box with the specified message */
|
/* Displays an alert dialog box with the specified message */
|
||||||
@ -557,21 +519,24 @@ QemuCocoaView *cocoaView;
|
|||||||
case NSFlagsChanged:
|
case NSFlagsChanged:
|
||||||
keycode = cocoa_keycode_to_qemu([event keyCode]);
|
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 */
|
/* Don't pass command key changes to guest unless mouse is grabbed */
|
||||||
keycode = 0;
|
keycode = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (keycode) {
|
if (keycode) {
|
||||||
if (keycode == 58 || keycode == 69) { // emulate caps lock and num lock keydown and keyup
|
// emulate caps lock and num lock keydown and keyup
|
||||||
qemu_input_event_send_key_number(dcl->con, keycode, true);
|
if (keycode == Q_KEY_CODE_CAPS_LOCK ||
|
||||||
qemu_input_event_send_key_number(dcl->con, keycode, false);
|
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)) {
|
} else if (qemu_console_is_graphic(NULL)) {
|
||||||
if (modifiers_state[keycode] == 0) { // keydown
|
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;
|
modifiers_state[keycode] = 1;
|
||||||
} else { // keyup
|
} 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;
|
modifiers_state[keycode] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -598,14 +563,14 @@ QemuCocoaView *cocoaView;
|
|||||||
switch (keycode) {
|
switch (keycode) {
|
||||||
|
|
||||||
// enable graphic console
|
// enable graphic console
|
||||||
case 0x02 ... 0x0a: // '1' to '9' keys
|
case Q_KEY_CODE_1 ... Q_KEY_CODE_9: // '1' to '9' keys
|
||||||
console_select(keycode - 0x02);
|
console_select(keycode - 11);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// handle keys for graphic console
|
// handle keys for graphic console
|
||||||
} else if (qemu_console_is_graphic(NULL)) {
|
} 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
|
// handlekeys for Monitor
|
||||||
} else {
|
} else {
|
||||||
@ -653,7 +618,7 @@ QemuCocoaView *cocoaView;
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (qemu_console_is_graphic(NULL)) {
|
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;
|
break;
|
||||||
case NSMouseMoved:
|
case NSMouseMoved:
|
||||||
@ -823,7 +788,7 @@ QemuCocoaView *cocoaView;
|
|||||||
for (index = 0; index < max_index; index++) {
|
for (index = 0; index < max_index; index++) {
|
||||||
if (modifiers_state[index]) {
|
if (modifiers_state[index]) {
|
||||||
modifiers_state[index] = 0;
|
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)ejectDeviceMedia:(id)sender;
|
||||||
- (void)changeDeviceMedia:(id)sender;
|
- (void)changeDeviceMedia:(id)sender;
|
||||||
- (BOOL)verifyQuit;
|
- (BOOL)verifyQuit;
|
||||||
|
- (void)openDocumentation:(NSString *)filename;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation QemuCocoaAppController
|
@implementation QemuCocoaAppController
|
||||||
@ -994,20 +960,42 @@ QemuCocoaView *cocoaView;
|
|||||||
[cocoaView toggleFullScreen:sender];
|
[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
|
- (void)showQEMUDoc:(id)sender
|
||||||
{
|
{
|
||||||
COCOA_DEBUG("QemuCocoaAppController: showQEMUDoc\n");
|
COCOA_DEBUG("QemuCocoaAppController: showQEMUDoc\n");
|
||||||
|
|
||||||
[[NSWorkspace sharedWorkspace] openFile:[NSString stringWithFormat:@"%@/../doc/qemu/qemu-doc.html",
|
[self openDocumentation: @"qemu-doc.html"];
|
||||||
[[NSBundle mainBundle] resourcePath]] withApplication:@"Help Viewer"];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)showQEMUTec:(id)sender
|
- (void)showQEMUTec:(id)sender
|
||||||
{
|
{
|
||||||
COCOA_DEBUG("QemuCocoaAppController: showQEMUTec\n");
|
COCOA_DEBUG("QemuCocoaAppController: showQEMUTec\n");
|
||||||
|
|
||||||
[[NSWorkspace sharedWorkspace] openFile:[NSString stringWithFormat:@"%@/../doc/qemu/qemu-tech.html",
|
[self openDocumentation: @"qemu-tech.html"];
|
||||||
[[NSBundle mainBundle] resourcePath]] withApplication:@"Help Viewer"];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Stretches video to fit host monitor size */
|
/* Stretches video to fit host monitor size */
|
||||||
|
Loading…
Reference in New Issue
Block a user