ruby-changes:38346
From: nobu <ko1@a...>
Date: Mon, 4 May 2015 03:13:18 +0900 (JST)
Subject: [ruby-changes:38346] nobu:r50427 (trunk): console.c: pressed? on Windows
nobu 2015-05-04 03:13:10 +0900 (Mon, 04 May 2015) New Revision: 50427 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=50427 Log: console.c: pressed? on Windows * ext/io/console/console.c (console_key_pressed_p): new method IO#pressed? on Windows. [EXPERIMENTAL] Added files: trunk/ext/io/console/win32_vk.h trunk/ext/io/console/win32_vk.list Modified files: trunk/ext/io/console/console.c trunk/ext/io/console/depend trunk/ext/io/console/extconf.rb Index: ext/io/console/depend =================================================================== --- ext/io/console/depend (revision 50426) +++ ext/io/console/depend (revision 50427) @@ -1,4 +1,10 @@ https://github.com/ruby/ruby/blob/trunk/ext/io/console/depend#L1 $(OBJS): $(HDRS) $(ruby_headers) \ + $(VK_HEADER) \ $(hdrdir)/ruby/io.h \ $(hdrdir)/ruby/encoding.h \ $(hdrdir)/ruby/oniguruma.h + +win32_vk.h: win32_vk.list + +.list.h: + gperf --ignore-case -E -C -P -p -j1 -i 1 -g -o -t -K ofs -N console_win32_vk -k* --output-file=$@ $< Index: ext/io/console/console.c =================================================================== --- ext/io/console/console.c (revision 50426) +++ ext/io/console/console.c (revision 50427) @@ -697,10 +697,36 @@ console_cursor_set(VALUE io, VALUE cpos) https://github.com/ruby/ruby/blob/trunk/ext/io/console/console.c#L697 if (RARRAY_LEN(cpos) != 2) rb_raise(rb_eArgError, "expected 2D coordinate"); return console_goto(io, RARRAY_AREF(cpos, 0), RARRAY_AREF(cpos, 1)); } + +#include "win32_vk.h" + +static VALUE +console_key_pressed_p(VALUE io, VALUE k) +{ + int vk = -1; + + if (FIXNUM_P(k)) { + vk = NUM2UINT(k); + } + else { + const struct vktable *t; + if (SYMBOL_P(k)) { + k = rb_sym2str(k); + } + else { + StringValueCStr(k); + } + t = console_win32_vk(RSTRING_PTR(k), RSTRING_LEN(k)); + if (!t) rb_raise(rb_eArgError, "unknown virtual key code: %"PRIsVALUE, k); + vk = t->vk; + } + return GetKeyState(vk) & 0x80 ? Qtrue : Qfalse; +} #else # define console_goto rb_f_notimplement # define console_cursor_pos rb_f_notimplement # define console_cursor_set rb_f_notimplement +# define console_key_pressed_p rb_f_notimplement #endif /* @@ -850,6 +876,7 @@ InitVM_console(void) https://github.com/ruby/ruby/blob/trunk/ext/io/console/console.c#L876 rb_define_method(rb_cIO, "goto", console_goto, 2); rb_define_method(rb_cIO, "cursor", console_cursor_pos, 0); rb_define_method(rb_cIO, "cursor=", console_cursor_set, 1); + rb_define_method(rb_cIO, "pressed?", console_key_pressed_p, 1); rb_define_singleton_method(rb_cIO, "console", console_dev, -1); { VALUE mReadable = rb_define_module_under(rb_cIO, "generic_readable"); Index: ext/io/console/extconf.rb =================================================================== --- ext/io/console/extconf.rb (revision 50426) +++ ext/io/console/extconf.rb (revision 50427) @@ -5,6 +5,7 @@ hdr = nil https://github.com/ruby/ruby/blob/trunk/ext/io/console/extconf.rb#L5 case when macro_defined?("_WIN32", "") # rb_w32_map_errno: 1.8.7 + win32 = true when hdr = %w"termios.h termio.h".find {|h| have_header(h)} have_func("cfmakeraw", hdr) when have_header(hdr = "sgtty.h") @@ -17,5 +18,7 @@ if ok https://github.com/ruby/ruby/blob/trunk/ext/io/console/extconf.rb#L18 # rb_check_hash_type: 1.9.3 # rb_io_get_write_io: 1.9.1 # rb_cloexec_open: 2.0.0 - create_makefile("io/console") + create_makefile("io/console") {|conf| + conf << "\n""VK_HEADER = win32_vk.h\n" + } end Index: ext/io/console/win32_vk.h =================================================================== --- ext/io/console/win32_vk.h (revision 0) +++ ext/io/console/win32_vk.h (revision 50427) @@ -0,0 +1,919 @@ https://github.com/ruby/ruby/blob/trunk/ext/io/console/win32_vk.h#L1 +/* C code produced by gperf version 3.0.4 */ +/* Command-line: gperf --ignore-case -E -C -P -p -j1 -i 1 -g -o -t -K ofs -N console_win32_vk -k'*' --output-file=win32_vk.h win32_vk.list */ + +#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ + && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ + && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ + && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ + && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ + && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ + && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ + && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ + && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ + && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ + && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ + && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ + && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ + && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ + && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ + && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ + && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ + && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ + && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ + && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ + && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ + && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ + && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) +/* The character set is not based on ISO-646. */ +error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@g...>." +#endif + +#line 1 "win32_vk.list" + +struct vktable {short ofs; unsigned short vk;}; +static const struct vktable *console_win32_vk(const char *, unsigned int); +#line 5 "win32_vk.list" +struct vktable; +/* maximum key range = 245, duplicates = 0 */ + +#ifndef GPERF_DOWNCASE +#define GPERF_DOWNCASE 1 +static unsigned char gperf_downcase[256] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255 + }; +#endif + +#ifndef GPERF_CASE_STRCMP +#define GPERF_CASE_STRCMP 1 +static int +gperf_case_strcmp (s1, s2) + register const char *s1; + register const char *s2; +{ + for (;;) + { + unsigned char c1 = gperf_downcase[(unsigned char)*s1++]; + unsigned char c2 = gperf_downcase[(unsigned char)*s2++]; + if (c1 != 0 && c1 == c2) + continue; + return (int)c1 - (int)c2; + } +} +#endif + +#if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__cplusplus) || defined(__GNUC_STDC_INLINE__) +inline +#elif defined(__GNUC__) +__inline +#endif +static unsigned int +hash (str, len) + register const char *str; + register unsigned int len; +{ + static const unsigned short asso_values[] = + { + 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, + 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, + 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, + 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, + 257, 257, 257, 257, 257, 257, 257, 257, 51, 74, + 80, 116, 127, 124, 95, 140, 77, 53, 7, 3, + 257, 257, 257, 257, 257, 1, 11, 1, 55, 1, + 25, 84, 31, 33, 13, 16, 2, 28, 8, 1, + 6, 10, 1, 1, 3, 4, 45, 18, 73, 79, + 30, 257, 257, 257, 257, 5, 257, 1, 11, 1, + 55, 1, 25, 84, 31, 33, 13, 16, 2, 28, + 8, 1, 6, 10, 1, 1, 3, 4, 45, 18, + 73, 79, 30, 257, 257, 257, 257, 257, 257, 257, + 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, + 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, + 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, + 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, + 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, + 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, + 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, + 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, + 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, + 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, + 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, + 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, + 257, 257, 257, 257, 257, 257, 257, 257 + }; + register int hval = len; + + switch (hval) + { + default: + hval += asso_values[(unsigned char)str[18]]; + /*FALLTHROUGH*/ + case 18: + hval += asso_values[(unsigned char)str[17]]; + /*FALLTHROUGH*/ + case 17: + hval += asso_values[(unsigned char)str[16]]; + /*FALLTHROUGH*/ + case 16: + hval += asso_values[(unsigned char)str[15]]; + /*FALLTHROUGH*/ + case 15: + hval += asso_values[(unsigned char)str[14]]; + /*FALLTHROUGH*/ + case 14: + hval += asso_values[(unsigned char)str[13]]; + /*FALLTHROUGH*/ + case 13: + hval += asso_values[(unsigned char)str[12]]; + /*FALLTHROUGH*/ + case 12: + hval += asso_values[(unsigned char)str[11]]; + /*FALLTHROUGH*/ + case 11: + hval += asso_values[(unsigned char)str[10]]; + /*FALLTHROUGH*/ + case 10: + hval += asso_values[(unsigned char)str[9]]; + /*FALLTHROUGH*/ + case 9: + hval += asso_values[(unsigned char)str[8]]; + /*FALLTHROUGH*/ + case 8: + hval += asso_values[(unsigned char)str[7]]; + /*FALLTHROUGH*/ + case 7: + hval += asso_values[(unsigned char)str[6]]; + /*FALLTHROUGH*/ + case 6: + hval += asso_values[(unsigned char)str[5]]; + /*FALLTHROUGH*/ + case 5: + hval += asso_values[(unsigned char)str[4]]; + /*FALLTHROUGH*/ + case 4: + hval += asso_values[(unsigned char)str[3]]; + /*FALLTHROUGH*/ + case 3: + hval += asso_values[(unsigned char)str[2]+2]; + /*FALLTHROUGH*/ + case 2: + hval += asso_values[(unsigned char)str[1]]; + /*FALLTHROUGH*/ + case 1: + hval += asso_values[(unsigned char)str[0]]; + break; + } + return hval; +} + +struct stringpool_t + { + char stringpool_str12[sizeof("UP")]; + char stringpool_str13[sizeof("APPS")]; + char stringpool_str14[sizeof("CRSEL")]; + char stringpool_str15[sizeof("SPACE")]; + char stringpool_str16[sizeof("SCROLL")]; + char stringpool_str17[sizeof("ESCAPE")]; + char stringpool_str18[sizeof("CANCEL")]; + char stringpool_str19[sizeof("ACCEPT")]; + char stringpool_str20[sizeof("SEPARATOR")]; + char stringpool_str21[sizeof("SELECT")]; + char stringpool_str22[sizeof("CONTROL")]; + char stringpool_str23[sizeof("OEM_CLEAR")]; + char stringpool_str24[sizeof("OEM_RESET")]; + char stringpool_str25[sizeof("OEM_AUTO")]; + char stringpool_str26[sizeof("OEM_CUSEL")]; + char stringpool_str28[sizeof("KANA")]; + char stringpool_str29[sizeof("OEM_PLUS")]; + char stringpool_str30[sizeof("PRIOR")]; + char stringpool_str31[sizeof("OEM_ATTN")]; + char stringpool_str32[sizeof("PAUSE")]; + char stringpool_str33[sizeof("BACK")]; + char stringpool_str34[sizeof("PACKET")]; + char stringpool_str35[sizeof("RCONTROL")]; + char stringpool_str36[sizeof("LCONTROL")]; + char stringpool_str37[sizeof("END")]; + char stringpool_str38[sizeof("HOME")]; + char stringpool_str39[sizeof("PRINT")]; + char stringpool_str40[sizeof("NUMLOCK")]; + char stringpool_str41[sizeof("LEFT")]; + char stringpool_str42[sizeof("JUNJA")]; + char stringpool_str43[sizeof("MENU")]; + char stringpool_str44[sizeof("OEM_WSCTRL")]; + char stringpool_str45[sizeof("OEM_ENLW")]; + char stringpool_str46[sizeof("NEXT")]; + char stringpool_str47[sizeof("RWIN")]; + char stringpool_str48[sizeof("LWIN")]; + char stringpool_str49[sizeof("CAPITAL")]; + char stringpool_str50[sizeof("HELP")]; + char stringpool_str51[sizeof("NONAME")]; + char stringpool_str52[sizeof("RBUTTON")]; + char stringpool_str53[sizeof("LBUTTON")]; + char stringpool_str54[sizeof("OEM_NEC_EQUAL")]; + char stringpool_str56[sizeof("INSERT")]; + char stringpool_str57[sizeof("HANJA")]; + char stringpool_str60[sizeof("SNAPSHOT")]; + char stringpool_str61[sizeof("ATTN")]; + char stringpool_str62[sizeof("TAB")]; + char stringpool_str63[sizeof("OEM_BACKTAB")]; + char stringpool_str64[sizeof("ICO_CLEAR")]; + char stringpool_str65[sizeof("CONVERT")]; + char stringpool_str66[sizeof("RETURN")]; + char stringpool_str67[sizeof("OEM_JUMP")]; + char stringpool_str71[sizeof("BROWSER_STOP")]; + char stringpool_str72[sizeof("FINAL")]; + char stringpool_str73[sizeof("ZOOM")]; + char stringpool_str74[sizeof("KANJI")]; + char stringpool_str75[sizeof("DELETE")]; + char stringpool_str76[sizeof("OEM_COMMA")]; + char stringpool_str77[sizeof("SUBTRACT")]; + char stringpool_str79[sizeof("MBUTTON")]; + char stringpool_str80[sizeof("F9")]; + char stringpool_str81[sizeof("SHIFT")]; + char stringpool_str82[sizeof("RSHIFT")]; + char stringpool_str83[sizeof("LSHIFT")]; + char stringpool_str84[sizeof("ADD")]; + char stringpool_str85[sizeof("NONCONVERT")]; + char stringpool_str86[sizeof("EXSEL")]; + char stringpool_str87[sizeof("OEM_1")]; + char stringpool_str88[sizeof("OEM_AX")]; + char stringpool_str89[sizeof("BROWSER_BACK")]; + char stringpool_str90[sizeof("OEM_8")]; + char stringpool_str91[sizeof("OEM_MINUS")]; + char stringpool_str92[sizeof("PLAY")]; + char stringpool_str93[sizeof("OEM_2")]; + char stringpool_str94[sizeof("CLEAR")]; + char stringpool_str95[sizeof("OEM_FJ_TOUROKU")]; + char stringpool_str96[sizeof("OEM_PA1")]; + char stringpool_str97[sizeof("ICO_HELP")]; + char stringpool_str98[sizeof("BROWSER_SEARCH")]; + char stringpool_str99[sizeof("SLEEP")]; + char stringpool_str101[sizeof("F1")]; + char stringpool_str102[sizeof("OEM_PA2")]; + char stringpool_str103[sizeof("OEM_COPY")]; + char stringpool_str104[sizeof("F8")]; + char stringpool_str105[sizeof("F19")]; + char stringpool_str106[sizeof("RIGHT")]; + char stringpool_str107[sizeof("F2")]; + char stringpool_str108[sizeof("OEM_6")]; + char stringpool_str109[sizeof("F18")]; + char stringpool_str111[sizeof("VOLUME_UP")]; + char stringpool_str114[sizeof("MEDIA_STOP")]; + char stringpool_str115[sizeof("OEM_PERIOD")]; + char stringpool_str117[sizeof("EREOF")]; + char stringpool_str121[sizeof("BROWSER_HOME")]; + char stringpool_str122[sizeof("F6")]; + char stringpool_str124[sizeof("BROWSER_REFRESH")]; + char stringpool_str126[sizeof("PA1")]; + char stringpool_str127[sizeof("PROCESSKEY")]; + char stringpool_str128[sizeof("DECIMAL")]; + char stringpool_str129[sizeof("OEM_3")]; + char stringpool_str130[sizeof("RMENU")]; + char stringpool_str131[sizeof("LMENU")]; + char stringpool_str132[sizeof("OEM_FJ_MASSHOU")]; + char stringpool_str133[sizeof("NUMPAD0")]; + char stringpool_str134[sizeof("HANGUL")]; + char stringpool_str135[sizeof("NUMPAD9")]; + char stringpool_str136[sizeof("HANGEUL")]; + char stringpool_str137[sizeof("OEM_5")]; + char stringpool_str138[sizeof("OEM_PA3")]; + char stringpool_str139[sizeof("VOLUME_MUTE")]; + char stringpool_str140[sizeof("OEM_4")]; + char stringpool_str141[sizeof("LAUNCH_MAIL")]; + char stringpool_str142[sizeof("OEM_FJ_JISHO")]; + char stringpool_str143[sizeof("F3")]; + char stringpool_str144[sizeof("OEM_FJ_ROYA")]; + char stringpool_str145[sizeof("OEM_FJ_LOYA")]; + char stringpool_str147[sizeof("DOWN")]; + char stringpool_str149[sizeof("OEM_FINISH")]; + char stringpool_str151[sizeof("F5")]; + char stringpool_str153[sizeof("OEM_7")]; + char stringpool_str154[sizeof("F4")]; + char stringpool_str155[sizeof("F17")]; + char stringpool_str156[sizeof("NUMPAD1")]; + char stringpool_str157[sizeof("ICO_00")]; + char stringpool_str159[sizeof("NUMPAD8")]; + char stringpool_str162[sizeof("NUMPAD2")]; + char stringpool_str164[sizeof("LAUNCH_APP1")]; + char stringpool_str165[sizeof("BROWSER_FORWARD")]; + char stringpool_str167[sizeof("F7")]; + char stringpool_str170[sizeof("LAUNCH_APP2")]; + char stringpool_str171[sizeof("MULTIPLY")]; + char stringpool_str174[sizeof("EXECUTE")]; + char stringpool_str176[sizeof("BROWSER_FAVORITES")]; + char stringpool_str177[sizeof("NUMPAD6")]; + char stringpool_str179[sizeof("F16")]; + char stringpool_str182[sizeof("F10")]; + char stringpool_str185[sizeof("VOLUME_DOWN")]; + char stringpool_str188[sizeof("F20")]; + char stringpool_str189[sizeof("MEDIA_PREV_TRACK")]; + char stringpool_str191[sizeof("MODECHANGE")]; + char stringpool_str197[sizeof("F14")]; + char stringpool_str198[sizeof("NUMPAD3")]; + char stringpool_str199[sizeof("XBUTTON1")]; + char stringpool_str203[sizeof("F24")]; + char stringpool_str205[sizeof("XBUTTON2")]; + char stringpool_str206[sizeof("NUMPAD5")]; + char stringpool_str209[sizeof("NUMPAD4")]; + char stringpool_str215[sizeof("MEDIA_PLAY_PAUSE")]; + char stringpool_str217[sizeof("LAUNCH_MEDIA_SELECT")]; + char stringpool_str218[sizeof("F11")]; + char stringpool_str220[sizeof("OEM_102")]; + char stringpool_str221[sizeof("MEDIA_NEXT_TRACK")]; + char stringpool_str222[sizeof("NUMPAD7")]; + char stringpool_str224[sizeof("F21")]; + char stringpool_str226[sizeof("F13")]; + char stringpool_str229[sizeof("F12")]; + char stringpool_str232[sizeof("F23")]; + char stringpool_str235[sizeof("F22")]; + char stringpool_str242[sizeof("F15")]; + char stringpool_str256[sizeof("DIVIDE")]; + }; +static const struct stringpool_t stringpool_contents = + { + "UP", + "APPS", + "CRSEL", + "SPACE", + "SCROLL", + "ESCAPE", + "CANCEL", + "ACCEPT", + "SEPARATOR", + "SELECT", + "CONTROL", + "OEM_CLEAR", + "OEM_RESET", + "OEM_AUTO", + "OEM_CUSEL", + "KANA", + "OEM_PLUS", + "PRIOR", + "OEM_ATTN", + "PAUSE", + "BACK", + "PACKET", + "RCONTROL", + "LCONTROL", + "END", + "HOME", + "PRINT", + "NUMLOCK", + "LEFT", + "JUNJA", + "MENU", + "OEM_WSCTRL", + "OEM_ENLW", + "NEXT", + "RWIN", + "LWIN", + "CAPITAL", + "HELP", + "NONAME", + "RBUTTON", + "LBUTTON", + "OEM_NEC_EQUAL", + "INSERT", + "HANJA", + "SNAPSHOT", + "ATTN", + "TAB", + "OEM_BACKTAB", + "ICO_CLEAR", + "CONVERT", + "RETURN", + "OEM_JUMP", + "BROWSER_STOP", + "FINAL", + "ZOOM", + "KANJI", + "DELETE", + "OEM_COMMA", + "SUBTRACT", + "MBUTTON", + "F9", + "SHIFT", + "RSHIFT", + "LSHIFT", + "ADD", + "NONCONVERT", + "EXSEL", + "OEM_1", + "OEM_AX", + "BROWSER_BACK", + "OEM_8", + "OEM_MINUS", + "PLAY", + "OEM_2", + "CLEAR", + "OEM_FJ_TOUROKU", + "OEM_PA1", + "ICO_HELP", + "BROWSER_SEARCH", + "SLEEP", + (... truncated) -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/