/lib/rautomation/adapter/win_32/keys.rb

https://github.com/jarmo/RAutomation · Ruby · 146 lines · 144 code · 1 blank · 1 comment · 0 complexity · f77b00a2842d060c0410dbb88b77ee23 MD5 · raw file

  1. module RAutomation
  2. module Adapter
  3. module Win32
  4. class Keys
  5. KEYS = {
  6. # keycodes from http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx
  7. :null => 0x00,
  8. :cancel => 0x03,
  9. :help => 0x2F,
  10. :backspace => 0x08,
  11. :tab => 0x09,
  12. :clear => 0x0C,
  13. :return => 0x0D,
  14. :enter => 0x0D,
  15. :shift => 0x10,
  16. :left_shift => 0xA0,
  17. :control => 0x11,
  18. :left_control => 0xA2,
  19. :alt => 0x12,
  20. :left_alt => 0xA4,
  21. :left_bracket => 0xDB,
  22. :right_bracket => 0xDD,
  23. :single_quote => 0xDE,
  24. :pause => 0x13,
  25. :escape => 0x1B,
  26. :space => 0x20,
  27. :page_up => 0x21,
  28. :page_down => 0x22,
  29. :end => 0x23,
  30. :home => 0x24,
  31. :left => 0x25,
  32. :arrow_left => 0x25,
  33. :up => 0x26,
  34. :arrow_up => 0x26,
  35. :right => 0x27,
  36. :arrow_right => 0x27,
  37. :down => 0x28,
  38. :arrow_down => 0x28,
  39. :insert => 0x2D,
  40. :delete => 0x2E,
  41. :semicolon => 0xBA,
  42. :equals => 0xBB,
  43. :numpad0 => 0x60,
  44. :numpad1 => 0x61,
  45. :numpad2 => 0x62,
  46. :numpad3 => 0x63,
  47. :numpad4 => 0x64,
  48. :numpad5 => 0x65,
  49. :numpad6 => 0x66,
  50. :numpad7 => 0x67,
  51. :numpad8 => 0x68,
  52. :numpad9 => 0x69,
  53. :multiply => 0x6A,
  54. :add => 0x6B,
  55. :separator => 0x6C,
  56. :subtract => 0x6D,
  57. :decimal => 0x6E,
  58. :divide => 0x6F,
  59. :f1 => 0x70,
  60. :f2 => 0x71,
  61. :f3 => 0x72,
  62. :f4 => 0x73,
  63. :f5 => 0x74,
  64. :f6 => 0x75,
  65. :f7 => 0x76,
  66. :f8 => 0x77,
  67. :f9 => 0x78,
  68. :f10 => 0x79,
  69. :f11 => 0x7A,
  70. :f12 => 0x7B,
  71. :comma => 0xBC,
  72. :dash => 0xBD,
  73. :period => 0xBE,
  74. :slash => 0xBF,
  75. :grave => 0xC0,
  76. :backslash => 0xDC
  77. }
  78. MAPPED_KEYS = {
  79. "\\" => KEYS[:backslash],
  80. "-" => KEYS[:dash],
  81. "/" => KEYS[:slash],
  82. "=" => KEYS[:equals],
  83. ";" => KEYS[:semicolon],
  84. "'" => KEYS[:single_quote],
  85. "." => KEYS[:period],
  86. "," => KEYS[:comma],
  87. "[" => KEYS[:left_bracket],
  88. "]" => KEYS[:right_bracket],
  89. '`' => KEYS[:grave]
  90. }
  91. # Assumes US standard keyboard layout
  92. SPECIAL_KEYS = {
  93. "!" => 0x31,
  94. "@" => 0x32,
  95. "#" => 0x33,
  96. "$" => 0x34,
  97. "%" => 0x35,
  98. "^" => 0x36,
  99. "&" => 0x37,
  100. "*" => 0x38,
  101. "(" => 0x39,
  102. ")" => 0x30,
  103. "_" => KEYS[:dash],
  104. "+" => KEYS[:equals],
  105. "{" => KEYS[:left_bracket],
  106. "}" => KEYS[:right_bracket],
  107. ":" => KEYS[:semicolon],
  108. "\"" => KEYS[:single_quote],
  109. "|" => KEYS[:backslash],
  110. "?" => KEYS[:slash],
  111. ">" => KEYS[:period],
  112. "<" => KEYS[:comma],
  113. "~" => KEYS[:grave]
  114. }
  115. def self.[](key)
  116. KEYS[key] or raise "unsupported key #{key.inspect}"
  117. end
  118. def self.encode(keys)
  119. keys.reduce([]) do |converted, key|
  120. if key.is_a?(Symbol)
  121. converted << Keys[key]
  122. elsif key.is_a?(Array)
  123. converted << (key.map {|k| encode([k])} << Keys[:null]).flatten
  124. else # key is a string
  125. converted += encode_str(key)
  126. end
  127. converted
  128. end
  129. end
  130. def self.encode_str(keys)
  131. keys.to_s.split("").map do |key|
  132. key =~ /[a-z]/ || MAPPED_KEYS[key] ? MAPPED_KEYS[key] || key.upcase.unpack("c")[0] :
  133. key =~ /[A-Z]/ || SPECIAL_KEYS[key] ? [Keys[:shift], SPECIAL_KEYS[key] || key.unpack("c")[0], Keys[:null]] :
  134. key.unpack("c")[0]
  135. end
  136. end
  137. end
  138. end
  139. end
  140. end