src/keyboard.c

changeset 90
934ae2efdd01
parent 85
9883eb142f70
parent 86
ebce87d87808
child 91
781c15e60012
     1.1 diff -r 9883eb142f70 -r 934ae2efdd01 src/keyboard.c
     1.2 --- a/src/keyboard.c	Wed Feb 09 17:11:48 2011 +0000
     1.3 +++ b/src/keyboard.c	Wed Feb 09 22:05:42 2011 +0000
     1.4 @@ -128,6 +128,29 @@
     1.5  	{ SDLK_DELETE,			0,	0x7f }	// Dlete
     1.6  };
     1.7  
     1.8 +/**
     1.9 + * List of special key codes
    1.10 + */
    1.11 +enum {
    1.12 +	KEY_ALL_UP				= 0x40,		///< All keys up
    1.13 +	KEY_LIST_END			= 0x80,		///< End of key code list
    1.14 +	KEY_BEGIN_MOUSE			= 0xCF,		///< Mouse data follows
    1.15 +	KEY_BEGIN_KEYBOARD		= 0xDF,		///< Keyboard data follows
    1.16 +};
    1.17 +
    1.18 +/**
    1.19 + * List of keyboard commands
    1.20 + */
    1.21 +enum {
    1.22 +	KEY_CMD_RESET			= 0x92,		///< Reset keyboard
    1.23 +	KEY_CMD_CAPSLED_OFF		= 0xB1,		///< Caps Lock LED off--CHECK!
    1.24 +	KEY_CMD_CAPSLED_ON		= 0xB0,		///< Caps Lock LED on --CHECK!
    1.25 +	KEY_CMD_NUMLED_OFF		= 0xA1,		///< Num Lock LED off --CHECK!
    1.26 +	KEY_CMD_NUMLED_ON		= 0xA0,		///< Num Lock LED on  --CHECK!
    1.27 +	KEY_CMD_MOUSE_ENABLE	= 0xD0,		///< Enable mouse
    1.28 +	KEY_CMD_MOUSE_DISABLE	= 0xD1		///< Disable mouse
    1.29 +};
    1.30 +
    1.31  void keyboard_init(KEYBOARD_STATE *ks)
    1.32  {
    1.33  	// Set all key states to "not pressed"
    1.34 @@ -141,29 +164,40 @@
    1.35  
    1.36  void keyboard_event(KEYBOARD_STATE *ks, SDL_Event *ev)
    1.37  {
    1.38 -	// Ignore non-keyboard events
    1.39 -	if ((ev->type != SDL_KEYDOWN) && (ev->type != SDL_KEYUP)) return;
    1.40 +	int v = 0;
    1.41 +	switch (ev->type) {
    1.42 +		case SDL_KEYDOWN:
    1.43 +			// Key down (pressed)
    1.44 +			v = 1;
    1.45 +			break;
    1.46 +		case SDL_KEYUP:
    1.47 +			// Key up (released)
    1.48 +			v = 0;
    1.49 +			break;
    1.50 +		default:
    1.51 +			// Not a keyboard event
    1.52 +			return;
    1.53 +	}
    1.54  
    1.55  	// scan the keymap
    1.56 -	int keyidx = 0;
    1.57 -	bool found = false;
    1.58 -	for (keyidx=0; keyidx < sizeof(keymap)/sizeof(keymap[0]); keyidx++) {
    1.59 -		if (keymap[keyidx].key == ev->key.keysym.sym) {
    1.60 -			found = true;
    1.61 -			break;
    1.62 +	for (int i=0; i < sizeof(keymap)/sizeof(keymap[0]); i++) {
    1.63 +		if (keymap[i].key == ev->key.keysym.sym) {
    1.64 +			// Keycode match. Is this an Extended Map key?
    1.65 +			if (keymap[i].extended) {
    1.66 +				// Yes -- need ALT set when pressing the key for this to be a match
    1.67 +				if (ev->key.keysym.mod & KMOD_ALT) {
    1.68 +					ks->keystate[keymap[i].scancode] = v;
    1.69 +					break;
    1.70 +				}
    1.71 +			} else {
    1.72 +				// Standard Map key. ALT must NOT be pressed for this to be a match
    1.73 +				if (!(ev->key.keysym.mod & KMOD_ALT)) {
    1.74 +					ks->keystate[keymap[i].scancode] = v;
    1.75 +					break;
    1.76 +				}
    1.77 +			}
    1.78  		}
    1.79  	}
    1.80 -
    1.81 -	switch (ev->type) {
    1.82 -		// key pressed
    1.83 -		case SDL_KEYDOWN:
    1.84 -			ks->keystate[keymap[keyidx].scancode] = 1;
    1.85 -			break;
    1.86 -		// key released
    1.87 -		case SDL_KEYUP:
    1.88 -			ks->keystate[keymap[keyidx].scancode] = 0;
    1.89 -			break;
    1.90 -	}
    1.91  }
    1.92  
    1.93  void keyboard_scan(KEYBOARD_STATE *ks)