/* Keyboard handling code V1.13 6/5/07
   Copyright 2008 Jeffrey Lee
   This file is part of WOUM.
   WOUM is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.
   WOUM 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 General Public License for more details.
   You should have received a copy of the GNU General Public License
   along with WOUM.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef _KEYBOARD_H
#define _KEYBOARD_H

/* Internal key codes */

/* Alphanumeric */
#define KEY_0		39
#define KEY_1		48
#define KEY_2		49 /* Also 71 */
#define KEY_3		17
#define KEY_4		18
#define KEY_5		19
#define KEY_6		24 /* Also 52 */
#define KEY_7		36
#define KEY_8		21
#define KEY_9		38
#define KEY_A		65
#define KEY_B		100
#define KEY_C		82
#define KEY_D		50
#define KEY_E		34
#define KEY_F		67
#define KEY_G		83
#define KEY_H		84
#define KEY_I		37
#define KEY_J		69
#define KEY_K		70
#define KEY_L		86
#define KEY_M		101
#define KEY_N		85
#define KEY_O		54
#define KEY_P		55
#define KEY_Q		16
#define KEY_R		51
#define KEY_S		81
#define KEY_T		35
#define KEY_U		53
#define KEY_V		99
#define KEY_W		33
#define KEY_X		66
#define KEY_Y		68
#define KEY_Z		97

/* Formatting/nonprintable */
#define KEY_SHIFT	0
#define KEY_CTRL	1
#define KEY_ALT		2
#define KEY_LSHIFT	3
#define KEY_LCTRL	4
#define KEY_LALT	5
#define KEY_RSHIFT	6
#define KEY_RCTRL	7
#define KEY_RALT	8
#define KEY_RETURN	73
#define KEY_TAB		96
#define KEY_PRINT	32
#define KEY_ESC		112
#define KEY_CAPS	64
#define KEY_SCROLLLOCK	31
#define KEY_NUMLOCK	77
#define KEY_BREAK	44
#define KEY_BACKSPACE	47
#define KEY_INSERT	61
#define KEY_HOME	62
#define KEY_PGUP	63
#define KEY_PGDOWN	78
#define KEY_DELETE	89
#define KEY_COPY	105
#define KEY_UP		57
#define KEY_RIGHT	121
#define KEY_LEFT	25
#define KEY_DOWN	41
#define KEY_LWINKEY	125
#define KEY_RWINKEY	126
#define KEY_MENU	127

/* Punctuation/symbol */
#define KEY_BACKTICK	45
#define KEY_BSLASH	94
#define KEY_COMMA	102
#define KEY_CSQRBRACKET	88
#define KEY_DOT		103
#define KEY_EQUALS	93
#define KEY_FSLASH	104
#define KEY_HASH	120
#define KEY_MINUS	23 /* Also 40 */
#define KEY_OSQRBRACKET	56
#define KEY_POUND	46
#define KEY_SINGLEQUOTE	79
#define KEY_SEMICOLON	72 /* Also 87 */
#define KEY_SPACE	98

/* Function */
#define KEY_F1		113
#define KEY_F2		114
#define KEY_F3		115
#define KEY_F4		20
#define KEY_F5		116
#define KEY_F6		117
#define KEY_F7		22
#define KEY_F8		118
#define KEY_F9		119
#define KEY_F10		30
#define KEY_F11		28
#define KEY_F12		29

/* Key pad */
#define KEY_PAD0	106
#define KEY_PAD1	107
#define KEY_PAD2	124
#define KEY_PAD3	108
#define KEY_PAD4	122
#define KEY_PAD5	123
#define KEY_PAD6	26
#define KEY_PAD7	27
#define KEY_PAD8	42
#define KEY_PAD9	43
#define KEY_PADPLUS	58
#define KEY_PADMINUS	59
#define KEY_PADDOT	76
#define KEY_PADFSLASH	74
#define KEY_PADHASH	90
#define KEY_PADSTAR	91
#define KEY_PADENTER	60

/* Mouse */
#define KEY_LMOUSE	9
#define KEY_MMOUSE	10
#define KEY_RMOUSE	11

/* Value returned to by keyboard_scan to mean no key */
#define KEY_NONE	255

extern int keyboard_ispressed(int key);
/* Returns true if 'key' is being pressed
*/

extern void keyboard_flush();
/* Flushes the keyboard buffer
*/

extern int keyboard_scan(int key);
/* Returns the 'next' key being pressed, or KEY_NONE for none
*/

extern int keyboard_read();
/* Reads an ASCII code from the keyboard buffer, or -1 if the buffer is empty
*/

#endif
