From: havoc Date: Sat, 31 Mar 2007 09:42:34 +0000 (+0000) Subject: patch from div0 that improves mac keyboard support in the AGL client, this includes... X-Git-Tag: xonotic-v0.1.0preview~3385 X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=commitdiff_plain;h=c7e088e8d9564915c0c99b135508d8291aa821a1 patch from div0 that improves mac keyboard support in the AGL client, this includes a copy of SDL_mackeys.h (as vid_agl_mackeys.h), it should be kept up to date as appropriate git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@7034 d7cf8633-e32d-0410-b094-e92efae38249 --- diff --git a/vid_agl.c b/vid_agl.c index 082816a5..cd62ab07 100644 --- a/vid_agl.c +++ b/vid_agl.c @@ -25,6 +25,7 @@ #include #include #include +#include "vid_agl_mackeys.h" // this is SDL/src/video/maccommon/SDL_mackeys.h #include "quakedef.h" @@ -629,72 +630,176 @@ static void Handle_KeyMod(UInt32 keymod) prev_keymod = keymod; } -static void Handle_Key(unsigned char charcode, qboolean keypressed) +static void Handle_Key(unsigned char charcode, UInt32 mackeycode, qboolean keypressed) { unsigned int keycode = 0; char ascii = '\0'; - switch (charcode) + switch (mackeycode) { - case kHomeCharCode: - keycode = K_HOME; + case MK_ESCAPE: + keycode = K_ESCAPE; break; - case kEnterCharCode: - keycode = K_KP_ENTER; + case MK_F1: + keycode = K_F1; break; - case kEndCharCode: - keycode = K_END; + case MK_F2: + keycode = K_F2; + break; + case MK_F3: + keycode = K_F3; + break; + case MK_F4: + keycode = K_F4; + break; + case MK_F5: + keycode = K_F5; + break; + case MK_F6: + keycode = K_F6; + break; + case MK_F7: + keycode = K_F7; + break; + case MK_F8: + keycode = K_F8; + break; + case MK_F9: + keycode = K_F9; + break; + case MK_F10: + keycode = K_F10; break; - case kBackspaceCharCode: + case MK_F11: + keycode = K_F11; + break; + case MK_F12: + keycode = K_F12; + break; + case MK_SCROLLOCK: + keycode = K_SCROLLOCK; + break; + case MK_PAUSE: + keycode = K_PAUSE; + break; + case MK_BACKSPACE: keycode = K_BACKSPACE; break; - case kTabCharCode: - keycode = K_TAB; + case MK_INSERT: + keycode = K_INS; + break; + case MK_HOME: + keycode = K_HOME; break; - case kPageUpCharCode: + case MK_PAGEUP: keycode = K_PGUP; break; - case kPageDownCharCode: + case MK_NUMLOCK: + keycode = K_NUMLOCK; + break; + case MK_KP_EQUALS: + keycode = K_KP_EQUALS; + break; + case MK_KP_DIVIDE: + keycode = K_KP_DIVIDE; + break; + case MK_KP_MULTIPLY: + keycode = K_KP_MULTIPLY; + break; + case MK_TAB: + keycode = K_TAB; + break; + case MK_DELETE: + keycode = K_DEL; + break; + case MK_END: + keycode = K_END; + break; + case MK_PAGEDOWN: keycode = K_PGDN; break; - case kReturnCharCode: + case MK_KP7: + keycode = K_KP_7; + break; + case MK_KP8: + keycode = K_KP_8; + break; + case MK_KP9: + keycode = K_KP_9; + break; + case MK_KP_MINUS: + keycode = K_KP_MINUS; + break; + case MK_CAPSLOCK: + keycode = K_CAPSLOCK; + break; + case MK_RETURN: keycode = K_ENTER; break; - case kEscapeCharCode: - keycode = K_ESCAPE; + case MK_KP4: + keycode = K_KP_4; break; - case kLeftArrowCharCode: - keycode = K_LEFTARROW; + case MK_KP5: + keycode = K_KP_5; break; - case kRightArrowCharCode: - keycode = K_RIGHTARROW; + case MK_KP6: + keycode = K_KP_6; break; - case kUpArrowCharCode: - keycode = K_UPARROW; + case MK_KP_PLUS: + keycode = K_KP_PLUS; break; - case kDownArrowCharCode : - keycode = K_DOWNARROW; + case MK_KP1: + keycode = K_KP_1; break; - case kDeleteCharCode: - keycode = K_DEL; + case MK_KP2: + keycode = K_KP_2; break; - case 0: - case 191: - // characters 0 and 191 are sent by the mouse buttons (?!) + case MK_KP3: + keycode = K_KP_3; + break; + case MK_KP_ENTER: + case MK_IBOOK_ENTER: + keycode = K_KP_ENTER; + break; + case MK_KP0: + keycode = K_KP_0; + break; + case MK_KP_PERIOD: + keycode = K_KP_PERIOD; break; default: - if ('A' <= charcode && charcode <= 'Z') - { - keycode = charcode + ('a' - 'A'); // lowercase it - ascii = charcode; - } - else if (charcode >= 32) + switch(charcode) { - keycode = charcode; - ascii = charcode; + case kUpArrowCharCode: + keycode = K_UPARROW; + break; + case kLeftArrowCharCode: + keycode = K_LEFTARROW; + break; + case kDownArrowCharCode: + keycode = K_DOWNARROW; + break; + case kRightArrowCharCode: + keycode = K_RIGHTARROW; + break; + case 0: + case 191: + // characters 0 and 191 are sent by the mouse buttons (?!) + break; + default: + if ('A' <= charcode && charcode <= 'Z') + { + keycode = charcode + ('a' - 'A'); // lowercase it + ascii = charcode; + } + else if (charcode >= 32) + { + keycode = charcode; + ascii = charcode; + } + else + Con_Printf(">> UNKNOWN char/keycode: %d/%u <<\n", charcode, (unsigned) mackeycode); } - else - Con_Printf(">> UNKNOWN charcode: %d <<\n", charcode); } if (keycode != 0) @@ -778,21 +883,24 @@ void Sys_SendKeyEvents(void) case kEventClassKeyboard: { - char keycode; + char charcode; + UInt32 keycode; switch (eventKind) { case kEventRawKeyDown: - GetEventParameter(theEvent, kEventParamKeyMacCharCodes, typeChar, NULL, sizeof(keycode), NULL, &keycode); - Handle_Key(keycode, true); + GetEventParameter(theEvent, kEventParamKeyMacCharCodes, typeChar, NULL, sizeof(charcode), NULL, &charcode); + GetEventParameter(theEvent, kEventParamKeyCode, typeUInt32, NULL, sizeof(keycode), NULL, &keycode); + Handle_Key(charcode, keycode, true); break; case kEventRawKeyRepeat: break; case kEventRawKeyUp: - GetEventParameter(theEvent, kEventParamKeyMacCharCodes, typeChar, NULL, sizeof(keycode), NULL, &keycode); - Handle_Key(keycode, false); + GetEventParameter(theEvent, kEventParamKeyMacCharCodes, typeChar, NULL, sizeof(charcode), NULL, &charcode); + GetEventParameter(theEvent, kEventParamKeyCode, typeUInt32, NULL, sizeof(keycode), NULL, &keycode); + Handle_Key(charcode, keycode, false); break; case kEventRawKeyModifiersChanged: diff --git a/vid_agl_mackeys.h b/vid_agl_mackeys.h new file mode 100644 index 00000000..0f266e9b --- /dev/null +++ b/vid_agl_mackeys.h @@ -0,0 +1,145 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Sam Lantinga + slouken@devolution.com +*/ + +#ifdef SAVE_RCSID +static char rcsid = + "@(#) $Id$"; +#endif + +/* These are the Macintosh key scancode constants -- from Inside Macintosh */ + +#define MK_ESCAPE 0x35 +#define MK_F1 0x7A +#define MK_F2 0x78 +#define MK_F3 0x63 +#define MK_F4 0x76 +#define MK_F5 0x60 +#define MK_F6 0x61 +#define MK_F7 0x62 +#define MK_F8 0x64 +#define MK_F9 0x65 +#define MK_F10 0x6D +#define MK_F11 0x67 +#define MK_F12 0x6F +#define MK_PRINT 0x69 +#define MK_SCROLLOCK 0x6B +#define MK_PAUSE 0x71 +#define MK_POWER 0x7F +#define MK_BACKQUOTE 0x32 +#define MK_1 0x12 +#define MK_2 0x13 +#define MK_3 0x14 +#define MK_4 0x15 +#define MK_5 0x17 +#define MK_6 0x16 +#define MK_7 0x1A +#define MK_8 0x1C +#define MK_9 0x19 +#define MK_0 0x1D +#define MK_MINUS 0x1B +#define MK_EQUALS 0x18 +#define MK_BACKSPACE 0x33 +#define MK_INSERT 0x72 +#define MK_HOME 0x73 +#define MK_PAGEUP 0x74 +#define MK_NUMLOCK 0x47 +#define MK_KP_EQUALS 0x51 +#define MK_KP_DIVIDE 0x4B +#define MK_KP_MULTIPLY 0x43 +#define MK_TAB 0x30 +#define MK_q 0x0C +#define MK_w 0x0D +#define MK_e 0x0E +#define MK_r 0x0F +#define MK_t 0x11 +#define MK_y 0x10 +#define MK_u 0x20 +#define MK_i 0x22 +#define MK_o 0x1F +#define MK_p 0x23 +#define MK_LEFTBRACKET 0x21 +#define MK_RIGHTBRACKET 0x1E +#define MK_BACKSLASH 0x2A +#define MK_DELETE 0x75 +#define MK_END 0x77 +#define MK_PAGEDOWN 0x79 +#define MK_KP7 0x59 +#define MK_KP8 0x5B +#define MK_KP9 0x5C +#define MK_KP_MINUS 0x4E +#define MK_CAPSLOCK 0x39 +#define MK_a 0x00 +#define MK_s 0x01 +#define MK_d 0x02 +#define MK_f 0x03 +#define MK_g 0x05 +#define MK_h 0x04 +#define MK_j 0x26 +#define MK_k 0x28 +#define MK_l 0x25 +#define MK_SEMICOLON 0x29 +#define MK_QUOTE 0x27 +#define MK_RETURN 0x24 +#define MK_KP4 0x56 +#define MK_KP5 0x57 +#define MK_KP6 0x58 +#define MK_KP_PLUS 0x45 +#define MK_LSHIFT 0x38 +#define MK_z 0x06 +#define MK_x 0x07 +#define MK_c 0x08 +#define MK_v 0x09 +#define MK_b 0x0B +#define MK_n 0x2D +#define MK_m 0x2E +#define MK_COMMA 0x2B +#define MK_PERIOD 0x2F +#define MK_SLASH 0x2C +#if 0 /* These are the same as the left versions - use left by default */ +#define MK_RSHIFT 0x38 +#endif +#define MK_UP 0x7E +#define MK_KP1 0x53 +#define MK_KP2 0x54 +#define MK_KP3 0x55 +#define MK_KP_ENTER 0x4C +#define MK_LCTRL 0x3B +#define MK_LALT 0x3A +#define MK_LMETA 0x37 +#define MK_SPACE 0x31 +#if 0 /* These are the same as the left versions - use left by default */ +#define MK_RMETA 0x37 +#define MK_RALT 0x3A +#define MK_RCTRL 0x3B +#endif +#define MK_LEFT 0x7B +#define MK_DOWN 0x7D +#define MK_RIGHT 0x7C +#define MK_KP0 0x52 +#define MK_KP_PERIOD 0x41 + +/* Wierd, these keys are on my iBook under MacOS X */ +#define MK_IBOOK_ENTER 0x34 +#define MK_IBOOK_LEFT 0x3B +#define MK_IBOOK_RIGHT 0x3C +#define MK_IBOOK_DOWN 0x3D +#define MK_IBOOK_UP 0x3E