/*
  Ruby/SDL   Ruby extension library for SDL

  Copyright (C) 2001-2007 Ohbayashi Ippei
  
  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 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
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
#include "rubysdl.h"

static Uint8 *keyState;
static SDLMod modState;

void defineConstForKey()
{
  rb_define_const(mKey,"UNKNOWN",INT2NUM(SDLK_UNKNOWN));
  rb_define_const(mKey,"FIRST",INT2NUM(SDLK_FIRST));
  rb_define_const(mKey,"BACKSPACE",INT2NUM(SDLK_BACKSPACE));
  rb_define_const(mKey,"TAB",INT2NUM(SDLK_TAB));
  rb_define_const(mKey,"CLEAR",INT2NUM(SDLK_CLEAR));
  rb_define_const(mKey,"RETURN",INT2NUM(SDLK_RETURN));
  rb_define_const(mKey,"PAUSE",INT2NUM(SDLK_PAUSE));
  rb_define_const(mKey,"ESCAPE",INT2NUM(SDLK_ESCAPE));
  rb_define_const(mKey,"SPACE",INT2NUM(SDLK_SPACE));
  rb_define_const(mKey,"EXCLAIM",INT2NUM(SDLK_EXCLAIM));
  rb_define_const(mKey,"QUOTEDBL",INT2NUM(SDLK_QUOTEDBL));
  rb_define_const(mKey,"HASH",INT2NUM(SDLK_HASH));
  rb_define_const(mKey,"DOLLAR",INT2NUM(SDLK_DOLLAR));
  rb_define_const(mKey,"AMPERSAND",INT2NUM(SDLK_AMPERSAND));
  rb_define_const(mKey,"QUOTE",INT2NUM(SDLK_QUOTE));
  rb_define_const(mKey,"LEFTPAREN",INT2NUM(SDLK_LEFTPAREN));
  rb_define_const(mKey,"RIGHTPAREN",INT2NUM(SDLK_RIGHTPAREN));
  rb_define_const(mKey,"ASTERISK",INT2NUM(SDLK_ASTERISK));
  rb_define_const(mKey,"PLUS",INT2NUM(SDLK_PLUS));
  rb_define_const(mKey,"COMMA",INT2NUM(SDLK_COMMA));
  rb_define_const(mKey,"MINUS",INT2NUM(SDLK_MINUS));
  rb_define_const(mKey,"PERIOD",INT2NUM(SDLK_PERIOD));
  rb_define_const(mKey,"SLASH",INT2NUM(SDLK_SLASH));
  rb_define_const(mKey,"K0",INT2NUM(SDLK_0));
  rb_define_const(mKey,"K1",INT2NUM(SDLK_1));
  rb_define_const(mKey,"K2",INT2NUM(SDLK_2));
  rb_define_const(mKey,"K3",INT2NUM(SDLK_3));
  rb_define_const(mKey,"K4",INT2NUM(SDLK_4));
  rb_define_const(mKey,"K5",INT2NUM(SDLK_5));
  rb_define_const(mKey,"K6",INT2NUM(SDLK_6));
  rb_define_const(mKey,"K7",INT2NUM(SDLK_7));
  rb_define_const(mKey,"K8",INT2NUM(SDLK_8));
  rb_define_const(mKey,"K9",INT2NUM(SDLK_9));
  rb_define_const(mKey,"COLON",INT2NUM(SDLK_COLON));
  rb_define_const(mKey,"SEMICOLON",INT2NUM(SDLK_SEMICOLON));
  rb_define_const(mKey,"LESS",INT2NUM(SDLK_LESS));
  rb_define_const(mKey,"EQUALS",INT2NUM(SDLK_EQUALS));
  rb_define_const(mKey,"GREATER",INT2NUM(SDLK_GREATER));
  rb_define_const(mKey,"QUESTION",INT2NUM(SDLK_QUESTION));
  rb_define_const(mKey,"AT",INT2NUM(SDLK_AT));
  /* 
     Skip uppercase letters
     */
  rb_define_const(mKey,"LEFTBRACKET",INT2NUM(SDLK_LEFTBRACKET));
  rb_define_const(mKey,"BACKSLASH",INT2NUM(SDLK_BACKSLASH));
  rb_define_const(mKey,"RIGHTBRACKET",INT2NUM(SDLK_RIGHTBRACKET));
  rb_define_const(mKey,"CARET",INT2NUM(SDLK_CARET));
  rb_define_const(mKey,"UNDERSCORE",INT2NUM(SDLK_UNDERSCORE));
  rb_define_const(mKey,"BACKQUOTE",INT2NUM(SDLK_BACKQUOTE));
  rb_define_const(mKey,"A",INT2NUM(SDLK_a));
  rb_define_const(mKey,"B",INT2NUM(SDLK_b));
  rb_define_const(mKey,"C",INT2NUM(SDLK_c));
  rb_define_const(mKey,"D",INT2NUM(SDLK_d));
  rb_define_const(mKey,"E",INT2NUM(SDLK_e));
  rb_define_const(mKey,"F",INT2NUM(SDLK_f));
  rb_define_const(mKey,"G",INT2NUM(SDLK_g));
  rb_define_const(mKey,"H",INT2NUM(SDLK_h));
  rb_define_const(mKey,"I",INT2NUM(SDLK_i));
  rb_define_const(mKey,"J",INT2NUM(SDLK_j));
  rb_define_const(mKey,"K",INT2NUM(SDLK_k));
  rb_define_const(mKey,"L",INT2NUM(SDLK_l));
  rb_define_const(mKey,"M",INT2NUM(SDLK_m));
  rb_define_const(mKey,"N",INT2NUM(SDLK_n));
  rb_define_const(mKey,"O",INT2NUM(SDLK_o));
  rb_define_const(mKey,"P",INT2NUM(SDLK_p));
  rb_define_const(mKey,"Q",INT2NUM(SDLK_q));
  rb_define_const(mKey,"R",INT2NUM(SDLK_r));
  rb_define_const(mKey,"S",INT2NUM(SDLK_s));
  rb_define_const(mKey,"T",INT2NUM(SDLK_t));
  rb_define_const(mKey,"U",INT2NUM(SDLK_u));
  rb_define_const(mKey,"V",INT2NUM(SDLK_v));
  rb_define_const(mKey,"W",INT2NUM(SDLK_w));
  rb_define_const(mKey,"X",INT2NUM(SDLK_x));
  rb_define_const(mKey,"Y",INT2NUM(SDLK_y));
  rb_define_const(mKey,"Z",INT2NUM(SDLK_z));
  rb_define_const(mKey,"DELETE",INT2NUM(SDLK_DELETE));
	/* End of ASCII mapped keysyms */

	/* International keyboard syms */
  rb_define_const(mKey,"WORLD_0",INT2NUM(SDLK_WORLD_0));
  rb_define_const(mKey,"WORLD_1",INT2NUM(SDLK_WORLD_1));
  rb_define_const(mKey,"WORLD_2",INT2NUM(SDLK_WORLD_2));
  rb_define_const(mKey,"WORLD_3",INT2NUM(SDLK_WORLD_3));
  rb_define_const(mKey,"WORLD_4",INT2NUM(SDLK_WORLD_4));
  rb_define_const(mKey,"WORLD_5",INT2NUM(SDLK_WORLD_5));
  rb_define_const(mKey,"WORLD_6",INT2NUM(SDLK_WORLD_6));
  rb_define_const(mKey,"WORLD_7",INT2NUM(SDLK_WORLD_7));
  rb_define_const(mKey,"WORLD_8",INT2NUM(SDLK_WORLD_8));
  rb_define_const(mKey,"WORLD_9",INT2NUM(SDLK_WORLD_9));
  rb_define_const(mKey,"WORLD_10",INT2NUM(SDLK_WORLD_10));
  rb_define_const(mKey,"WORLD_11",INT2NUM(SDLK_WORLD_11));
  rb_define_const(mKey,"WORLD_12",INT2NUM(SDLK_WORLD_12));
  rb_define_const(mKey,"WORLD_13",INT2NUM(SDLK_WORLD_13));
  rb_define_const(mKey,"WORLD_14",INT2NUM(SDLK_WORLD_14));
  rb_define_const(mKey,"WORLD_15",INT2NUM(SDLK_WORLD_15));
  rb_define_const(mKey,"WORLD_16",INT2NUM(SDLK_WORLD_16));
  rb_define_const(mKey,"WORLD_17",INT2NUM(SDLK_WORLD_17));
  rb_define_const(mKey,"WORLD_18",INT2NUM(SDLK_WORLD_18));
  rb_define_const(mKey,"WORLD_19",INT2NUM(SDLK_WORLD_19));
  rb_define_const(mKey,"WORLD_20",INT2NUM(SDLK_WORLD_20));
  rb_define_const(mKey,"WORLD_21",INT2NUM(SDLK_WORLD_21));
  rb_define_const(mKey,"WORLD_22",INT2NUM(SDLK_WORLD_22));
  rb_define_const(mKey,"WORLD_23",INT2NUM(SDLK_WORLD_23));
  rb_define_const(mKey,"WORLD_24",INT2NUM(SDLK_WORLD_24));
  rb_define_const(mKey,"WORLD_25",INT2NUM(SDLK_WORLD_25));
  rb_define_const(mKey,"WORLD_26",INT2NUM(SDLK_WORLD_26));
  rb_define_const(mKey,"WORLD_27",INT2NUM(SDLK_WORLD_27));
  rb_define_const(mKey,"WORLD_28",INT2NUM(SDLK_WORLD_28));
  rb_define_const(mKey,"WORLD_29",INT2NUM(SDLK_WORLD_29));
  rb_define_const(mKey,"WORLD_30",INT2NUM(SDLK_WORLD_30));
  rb_define_const(mKey,"WORLD_31",INT2NUM(SDLK_WORLD_31));
  rb_define_const(mKey,"WORLD_32",INT2NUM(SDLK_WORLD_32));
  rb_define_const(mKey,"WORLD_33",INT2NUM(SDLK_WORLD_33));
  rb_define_const(mKey,"WORLD_34",INT2NUM(SDLK_WORLD_34));
  rb_define_const(mKey,"WORLD_35",INT2NUM(SDLK_WORLD_35));
  rb_define_const(mKey,"WORLD_36",INT2NUM(SDLK_WORLD_36));
  rb_define_const(mKey,"WORLD_37",INT2NUM(SDLK_WORLD_37));
  rb_define_const(mKey,"WORLD_38",INT2NUM(SDLK_WORLD_38));
  rb_define_const(mKey,"WORLD_39",INT2NUM(SDLK_WORLD_39));
  rb_define_const(mKey,"WORLD_40",INT2NUM(SDLK_WORLD_40));
  rb_define_const(mKey,"WORLD_41",INT2NUM(SDLK_WORLD_41));
  rb_define_const(mKey,"WORLD_42",INT2NUM(SDLK_WORLD_42));
  rb_define_const(mKey,"WORLD_43",INT2NUM(SDLK_WORLD_43));
  rb_define_const(mKey,"WORLD_44",INT2NUM(SDLK_WORLD_44));
  rb_define_const(mKey,"WORLD_45",INT2NUM(SDLK_WORLD_45));
  rb_define_const(mKey,"WORLD_46",INT2NUM(SDLK_WORLD_46));
  rb_define_const(mKey,"WORLD_47",INT2NUM(SDLK_WORLD_47));
  rb_define_const(mKey,"WORLD_48",INT2NUM(SDLK_WORLD_48));
  rb_define_const(mKey,"WORLD_49",INT2NUM(SDLK_WORLD_49));
  rb_define_const(mKey,"WORLD_50",INT2NUM(SDLK_WORLD_50));
  rb_define_const(mKey,"WORLD_51",INT2NUM(SDLK_WORLD_51));
  rb_define_const(mKey,"WORLD_52",INT2NUM(SDLK_WORLD_52));
  rb_define_const(mKey,"WORLD_53",INT2NUM(SDLK_WORLD_53));
  rb_define_const(mKey,"WORLD_54",INT2NUM(SDLK_WORLD_54));
  rb_define_const(mKey,"WORLD_55",INT2NUM(SDLK_WORLD_55));
  rb_define_const(mKey,"WORLD_56",INT2NUM(SDLK_WORLD_56));
  rb_define_const(mKey,"WORLD_57",INT2NUM(SDLK_WORLD_57));
  rb_define_const(mKey,"WORLD_58",INT2NUM(SDLK_WORLD_58));
  rb_define_const(mKey,"WORLD_59",INT2NUM(SDLK_WORLD_59));
  rb_define_const(mKey,"WORLD_60",INT2NUM(SDLK_WORLD_60));
  rb_define_const(mKey,"WORLD_61",INT2NUM(SDLK_WORLD_61));
  rb_define_const(mKey,"WORLD_62",INT2NUM(SDLK_WORLD_62));
  rb_define_const(mKey,"WORLD_63",INT2NUM(SDLK_WORLD_63));
  rb_define_const(mKey,"WORLD_64",INT2NUM(SDLK_WORLD_64));
  rb_define_const(mKey,"WORLD_65",INT2NUM(SDLK_WORLD_65));
  rb_define_const(mKey,"WORLD_66",INT2NUM(SDLK_WORLD_66));
  rb_define_const(mKey,"WORLD_67",INT2NUM(SDLK_WORLD_67));
  rb_define_const(mKey,"WORLD_68",INT2NUM(SDLK_WORLD_68));
  rb_define_const(mKey,"WORLD_69",INT2NUM(SDLK_WORLD_69));
  rb_define_const(mKey,"WORLD_70",INT2NUM(SDLK_WORLD_70));
  rb_define_const(mKey,"WORLD_71",INT2NUM(SDLK_WORLD_71));
  rb_define_const(mKey,"WORLD_72",INT2NUM(SDLK_WORLD_72));
  rb_define_const(mKey,"WORLD_73",INT2NUM(SDLK_WORLD_73));
  rb_define_const(mKey,"WORLD_74",INT2NUM(SDLK_WORLD_74));
  rb_define_const(mKey,"WORLD_75",INT2NUM(SDLK_WORLD_75));
  rb_define_const(mKey,"WORLD_76",INT2NUM(SDLK_WORLD_76));
  rb_define_const(mKey,"WORLD_77",INT2NUM(SDLK_WORLD_77));
  rb_define_const(mKey,"WORLD_78",INT2NUM(SDLK_WORLD_78));
  rb_define_const(mKey,"WORLD_79",INT2NUM(SDLK_WORLD_79));
  rb_define_const(mKey,"WORLD_80",INT2NUM(SDLK_WORLD_80));
  rb_define_const(mKey,"WORLD_81",INT2NUM(SDLK_WORLD_81));
  rb_define_const(mKey,"WORLD_82",INT2NUM(SDLK_WORLD_82));
  rb_define_const(mKey,"WORLD_83",INT2NUM(SDLK_WORLD_83));
  rb_define_const(mKey,"WORLD_84",INT2NUM(SDLK_WORLD_84));
  rb_define_const(mKey,"WORLD_85",INT2NUM(SDLK_WORLD_85));
  rb_define_const(mKey,"WORLD_86",INT2NUM(SDLK_WORLD_86));
  rb_define_const(mKey,"WORLD_87",INT2NUM(SDLK_WORLD_87));
  rb_define_const(mKey,"WORLD_88",INT2NUM(SDLK_WORLD_88));
  rb_define_const(mKey,"WORLD_89",INT2NUM(SDLK_WORLD_89));
  rb_define_const(mKey,"WORLD_90",INT2NUM(SDLK_WORLD_90));
  rb_define_const(mKey,"WORLD_91",INT2NUM(SDLK_WORLD_91));
  rb_define_const(mKey,"WORLD_92",INT2NUM(SDLK_WORLD_92));
  rb_define_const(mKey,"WORLD_93",INT2NUM(SDLK_WORLD_93));
  rb_define_const(mKey,"WORLD_94",INT2NUM(SDLK_WORLD_94));
  rb_define_const(mKey,"WORLD_95",INT2NUM(SDLK_WORLD_95));


  /* Numeric keypad */
  rb_define_const(mKey,"KP0",INT2NUM(SDLK_KP0));
  rb_define_const(mKey,"KP1",INT2NUM(SDLK_KP1));
  rb_define_const(mKey,"KP2",INT2NUM(SDLK_KP2));
  rb_define_const(mKey,"KP3",INT2NUM(SDLK_KP3));
  rb_define_const(mKey,"KP4",INT2NUM(SDLK_KP4));
  rb_define_const(mKey,"KP5",INT2NUM(SDLK_KP5));
  rb_define_const(mKey,"KP6",INT2NUM(SDLK_KP6));
  rb_define_const(mKey,"KP7",INT2NUM(SDLK_KP7));
  rb_define_const(mKey,"KP8",INT2NUM(SDLK_KP8));
  rb_define_const(mKey,"KP9",INT2NUM(SDLK_KP9));
  rb_define_const(mKey,"KP_PERIOD",INT2NUM(SDLK_KP_PERIOD));
  rb_define_const(mKey,"KP_DIVIDE",INT2NUM(SDLK_KP_DIVIDE));
  rb_define_const(mKey,"KP_MULTIPLY",INT2NUM(SDLK_KP_MULTIPLY));
  rb_define_const(mKey,"KP_MINUS",INT2NUM(SDLK_KP_MINUS));
  rb_define_const(mKey,"KP_PLUS",INT2NUM(SDLK_KP_PLUS));
  rb_define_const(mKey,"KP_ENTER",INT2NUM(SDLK_KP_ENTER));
  rb_define_const(mKey,"KP_EQUALS",INT2NUM(SDLK_KP_EQUALS));
  
  /* Arrows + Home/End pad */
  rb_define_const(mKey,"UP",INT2NUM(SDLK_UP));
  rb_define_const(mKey,"DOWN",INT2NUM(SDLK_DOWN));
  rb_define_const(mKey,"RIGHT",INT2NUM(SDLK_RIGHT));
  rb_define_const(mKey,"LEFT",INT2NUM(SDLK_LEFT));
  rb_define_const(mKey,"INSERT",INT2NUM(SDLK_INSERT));
  rb_define_const(mKey,"HOME",INT2NUM(SDLK_HOME));
  rb_define_const(mKey,"END",INT2NUM(SDLK_END));
  rb_define_const(mKey,"PAGEUP",INT2NUM(SDLK_PAGEUP));
  rb_define_const(mKey,"PAGEDOWN",INT2NUM(SDLK_PAGEDOWN));

  /* Function keys */
  rb_define_const(mKey,"F1",INT2NUM(SDLK_F1));
  rb_define_const(mKey,"F2",INT2NUM(SDLK_F2));
  rb_define_const(mKey,"F3",INT2NUM(SDLK_F3));
  rb_define_const(mKey,"F4",INT2NUM(SDLK_F4));
  rb_define_const(mKey,"F5",INT2NUM(SDLK_F5));
  rb_define_const(mKey,"F6",INT2NUM(SDLK_F6));
  rb_define_const(mKey,"F7",INT2NUM(SDLK_F7));
  rb_define_const(mKey,"F8",INT2NUM(SDLK_F8));
  rb_define_const(mKey,"F9",INT2NUM(SDLK_F9));
  rb_define_const(mKey,"F10",INT2NUM(SDLK_F10));
  rb_define_const(mKey,"F11",INT2NUM(SDLK_F11));
  rb_define_const(mKey,"F12",INT2NUM(SDLK_F12));
  rb_define_const(mKey,"F13",INT2NUM(SDLK_F13));
  rb_define_const(mKey,"F14",INT2NUM(SDLK_F14));
  rb_define_const(mKey,"F15",INT2NUM(SDLK_F15));
  
  /* Key state modifier keys */
  rb_define_const(mKey,"NUMLOCK",INT2NUM(SDLK_NUMLOCK));
  rb_define_const(mKey,"CAPSLOCK",INT2NUM(SDLK_CAPSLOCK));
  rb_define_const(mKey,"SCROLLOCK",INT2NUM(SDLK_SCROLLOCK));
  rb_define_const(mKey,"RSHIFT",INT2NUM(SDLK_RSHIFT));
  rb_define_const(mKey,"LSHIFT",INT2NUM(SDLK_LSHIFT));
  rb_define_const(mKey,"RCTRL",INT2NUM(SDLK_RCTRL));
  rb_define_const(mKey,"LCTRL",INT2NUM(SDLK_LCTRL));
  rb_define_const(mKey,"RALT",INT2NUM(SDLK_RALT));
  rb_define_const(mKey,"LALT",INT2NUM(SDLK_LALT));
  rb_define_const(mKey,"RMETA",INT2NUM(SDLK_RMETA));
  rb_define_const(mKey,"LMETA",INT2NUM(SDLK_LMETA));
  rb_define_const(mKey,"LSUPER",INT2NUM(SDLK_LSUPER));
  rb_define_const(mKey,"RSUPER",INT2NUM(SDLK_RSUPER));
  rb_define_const(mKey,"MODE",INT2NUM(SDLK_MODE));
  
  /* Miscellaneous function keys */
  rb_define_const(mKey,"HELP",INT2NUM(SDLK_HELP));
  rb_define_const(mKey,"PRINT",INT2NUM(SDLK_PRINT));
  rb_define_const(mKey,"SYSREQ",INT2NUM(SDLK_SYSREQ));
  rb_define_const(mKey,"BREAK",INT2NUM(SDLK_BREAK));
  rb_define_const(mKey,"MENU",INT2NUM(SDLK_MENU));
  rb_define_const(mKey,"POWER",INT2NUM(SDLK_POWER));
  rb_define_const(mKey,"EURO",INT2NUM(SDLK_EURO));

  /* Add any other keys here */
  
  rb_define_const(mKey,"LAST",INT2NUM(SDLK_LAST));

  /* key mods */
  rb_define_const(mKey,"MOD_NONE",UINT2NUM(KMOD_NONE));
  rb_define_const(mKey,"MOD_LSHIFT",UINT2NUM(KMOD_LSHIFT));
  rb_define_const(mKey,"MOD_RSHIFT",UINT2NUM(KMOD_RSHIFT));
  rb_define_const(mKey,"MOD_LCTRL",UINT2NUM(KMOD_LCTRL));
  rb_define_const(mKey,"MOD_RCTRL",UINT2NUM(KMOD_RCTRL));
  rb_define_const(mKey,"MOD_LALT",UINT2NUM(KMOD_LALT));
  rb_define_const(mKey,"MOD_RALT",UINT2NUM(KMOD_RALT));
  rb_define_const(mKey,"MOD_LMETA",UINT2NUM(KMOD_LMETA));
  rb_define_const(mKey,"MOD_RMETA",UINT2NUM(KMOD_RMETA));
  rb_define_const(mKey,"MOD_NUM",UINT2NUM(KMOD_NUM));
  rb_define_const(mKey,"MOD_CAPS",UINT2NUM(KMOD_CAPS));
  rb_define_const(mKey,"MOD_MODE",UINT2NUM(KMOD_MODE));
  rb_define_const(mKey,"MOD_RESERVED",UINT2NUM(KMOD_RESERVED));

  rb_define_const(mKey,"MOD_CTRL",UINT2NUM(KMOD_CTRL));
  rb_define_const(mKey,"MOD_SHIFT",UINT2NUM(KMOD_SHIFT));
  rb_define_const(mKey,"MOD_ALT",UINT2NUM(KMOD_ALT));
  rb_define_const(mKey,"MOD_META",UINT2NUM(KMOD_META));

  /* key repeat constants*/
  rb_define_const(mKey,"DEFAULT_REPEAT_DELAY", INT2NUM(SDL_DEFAULT_REPEAT_DELAY));
  rb_define_const(mKey,"DEFAULT_REPEAT_INTERVAL", INT2NUM(SDL_DEFAULT_REPEAT_INTERVAL));
  
}

/* under 2 function is for testing */
static VALUE sdl_keyScan(VALUE mod)
{
  keyState=SDL_GetKeyState(NULL);
  modState=SDL_GetModState();
  return Qnil;
}
static VALUE sdl_keyPressed(VALUE mod,VALUE keysym)
{
  if(NUM2INT(keysym) <SDLK_FIRST || SDLK_LAST < NUM2INT(keysym))
    rb_raise(eSDLError, "keysym number is out of range");
  
  return (keyState[NUM2INT(keysym)]==SDL_PRESSED)?Qtrue:Qfalse;
}
static VALUE sdl_modState(VALUE mod)
{
  return UINT2NUM(modState);
}
static VALUE sdl_enableKeyRepeat(VALUE mod,VALUE delay,VALUE interval)
{
  if( SDL_EnableKeyRepeat( NUM2INT(delay),NUM2INT(interval) )==-1 ){
    rb_raise(eSDLError,"enable key repeat fail: %s",SDL_GetError());
  }
  return Qnil;
}
static VALUE sdl_disableKeyRepeat(VALUE mod)
{
  if( SDL_EnableKeyRepeat( 0,0 )==-1 ){
    rb_raise(eSDLError,"disable key repeat fail: %s",SDL_GetError());
  }
  return Qnil;
}
static VALUE sdl_getKeyName(VALUE mod,VALUE key)
{
  return rb_str_new2( SDL_GetKeyName( NUM2UINT(key) ) );
}
void init_keyEvent()
{
  mKey = rb_define_module_under(mSDL,"Key");
  rb_define_module_function(mKey,"scan",sdl_keyScan,0);
  rb_define_module_function(mKey,"press?",sdl_keyPressed,1);
  rb_define_module_function(mKey,"modState",sdl_modState,0);
  rb_define_module_function(mKey,"enableKeyRepeat",sdl_enableKeyRepeat,2);
  rb_define_module_function(mKey,"disableKeyRepeat",sdl_disableKeyRepeat,0);
  rb_define_module_function(mKey,"getKeyName",sdl_getKeyName,1);

  keyState = ALLOC_N(Uint8,SDLK_LAST);
  memset(keyState, SDL_RELEASED, SDLK_LAST);
  
  defineConstForKey();
}


syntax highlighted by Code2HTML, v. 0.9.1