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:
Peter Maydell 2016-03-24 13:43:30 +00:00
commit 4f57a35d81
2 changed files with 169 additions and 180 deletions

View File

@ -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

View File

@ -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 */