vigilem-win32_api 0.0.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE.txt +22 -0
- data/lib/vigilem/win32_api/console_input_events.rb +78 -0
- data/lib/vigilem/win32_api/constants.rb +97 -0
- data/lib/vigilem/win32_api/dom/adapter.rb +59 -0
- data/lib/vigilem/win32_api/dom/code_values_tables.rb +136 -0
- data/lib/vigilem/win32_api/dom/input_record_utils.rb +259 -0
- data/lib/vigilem/win32_api/dom/key_values_tables.rb +123 -0
- data/lib/vigilem/win32_api/dom.rb +5 -0
- data/lib/vigilem/win32_api/eventable.rb +41 -0
- data/lib/vigilem/win32_api/input__record.rb +53 -0
- data/lib/vigilem/win32_api/input_system_handler.rb +124 -0
- data/lib/vigilem/win32_api/p_input__record.rb +55 -0
- data/lib/vigilem/win32_api/rubyized.rb +114 -0
- data/lib/vigilem/win32_api/types.rb +153 -0
- data/lib/vigilem/win32_api/utils/keyboard.rb +120 -0
- data/lib/vigilem/win32_api/version.rb +5 -0
- data/lib/vigilem/win32_api/virtual_keys/map.rb +211 -0
- data/lib/vigilem/win32_api/virtual_keys.rb +9 -0
- data/lib/vigilem/win32_api.rb +61 -0
- data/spec/acceptance/custom_input_system.feature +3 -0
- data/spec/acceptance/dom_adapter.feature +7 -0
- data/spec/acceptance/rubyized.feature +6 -0
- data/spec/acceptance/steps/custom_input_system_steps.rb +37 -0
- data/spec/acceptance/steps/dom_adapter_steps.rb +7 -0
- data/spec/acceptance/steps/rubyized_steps.rb +20 -0
- data/spec/attributes_and_size_test.rb +10 -0
- data/spec/input_helper.rb +41 -0
- data/spec/spec_helper.rb +28 -0
- data/spec/turnip_helper.rb +1 -0
- data/spec/vigilem/api_spec.rb +139 -0
- data/spec/vigilem/win32_api/console_input_events_spec.rb +67 -0
- data/spec/vigilem/win32_api/dom/adapter_spec.rb +164 -0
- data/spec/vigilem/win32_api/dom/code_values_tables_spec.rb +5 -0
- data/spec/vigilem/win32_api/dom/input_record_utils_spec.rb +255 -0
- data/spec/vigilem/win32_api/dom/key_values_tables_spec.rb +5 -0
- data/spec/vigilem/win32_api/eventable_spec.rb +96 -0
- data/spec/vigilem/win32_api/input__record_spec.rb +113 -0
- data/spec/vigilem/win32_api/input_system_handler_spec.rb +164 -0
- data/spec/vigilem/win32_api/p_input__record_spec.rb +43 -0
- data/spec/vigilem/win32_api/rubyized_spec.rb +134 -0
- data/spec/vigilem/win32_api/types_spec.rb +139 -0
- data/spec/vigilem/win32_api/utils/keyboard_spec.rb +126 -0
- data/spec/vigilem/win32_api/virtual_keys/map_spec.rb +10 -0
- data/spec/vigilem/win32_api/virtual_keys_spec.rb +28 -0
- metadata +225 -0
@@ -0,0 +1,120 @@
|
|
1
|
+
require 'vigilem/win32_api/virtual_keys'
|
2
|
+
|
3
|
+
module Vigilem::Win32API
|
4
|
+
module Utils
|
5
|
+
# http://www.w3.org/TR/2013/WD-uievents-20130725/keyboard-sections.svg
|
6
|
+
# http://www.computer-hardware-explained.com/image-files/computer-keyboard-layout-explained.jpg
|
7
|
+
# https://upload.wikimedia.org/wikipedia/commons/9/9c/ISO_keyboard_%28105%29_QWERTY_UK.svg
|
8
|
+
# http://i.stack.imgur.com/FU0R2.png
|
9
|
+
#
|
10
|
+
module Keyboard
|
11
|
+
|
12
|
+
include Vigilem::Win32API::VirtualKeys
|
13
|
+
|
14
|
+
#
|
15
|
+
#
|
16
|
+
module ControlPadKeys
|
17
|
+
|
18
|
+
#
|
19
|
+
# @param virtual_key
|
20
|
+
# @return [TrueClass || FalseClass]
|
21
|
+
def control_pad_key?(virtual_key)
|
22
|
+
[Keyboard::VK[:INSERT], Keyboard::VK[:DELETE], Keyboard::VK[:PRIOR], Keyboard::VK[:NEXT], Keyboard::VK[:END], Keyboard::VK[:HOME]].include?(virtual_key)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
include ControlPadKeys
|
27
|
+
extend ControlPadKeys
|
28
|
+
|
29
|
+
#
|
30
|
+
#
|
31
|
+
module NavigationKeys
|
32
|
+
|
33
|
+
#
|
34
|
+
# @param virtual_key
|
35
|
+
# @return [TrueClass || FalseClass]
|
36
|
+
def arrow_key?(virtual_key)
|
37
|
+
virtual_key.between?(Keyboard::VK[:LEFT], Keyboard::VK[:DOWN])
|
38
|
+
end
|
39
|
+
|
40
|
+
#
|
41
|
+
# @param virtual_key
|
42
|
+
# @param dw_state_names
|
43
|
+
# @return [TrueClass || FalseClass]
|
44
|
+
def nav_arrow_key?(virtual_key, *dw_state_names)
|
45
|
+
arrow_key?(virtual_key) and dw_state_names.include?(:ENHANCED_KEY)
|
46
|
+
end
|
47
|
+
|
48
|
+
# the pad above the arrow keys, what is CLEAR again?
|
49
|
+
#
|
50
|
+
# @param virtual_key
|
51
|
+
# @param dw_state_names
|
52
|
+
# @return [TrueClass || FalseClass]
|
53
|
+
def nav_control_key?(virtual_key, *dw_state_names)
|
54
|
+
(control_key?(virtual_key) or virtual_key == Keyboard::VK[:CLEAR]) and dw_state_names.include?(:ENHANCED_KEY)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
include NavigationKeys
|
59
|
+
extend NavigationKeys
|
60
|
+
|
61
|
+
#
|
62
|
+
#
|
63
|
+
module NumpadKeys
|
64
|
+
|
65
|
+
#
|
66
|
+
# @param virtual_key
|
67
|
+
# @return [TrueClass || FalseClass]
|
68
|
+
def numlock?(virtual_key)
|
69
|
+
virtual_key == Keyboard::VK[:NUMLOCK]
|
70
|
+
end
|
71
|
+
|
72
|
+
#
|
73
|
+
# @param virtual_key
|
74
|
+
# @param [Array] dw_state_names
|
75
|
+
# @return [TrueClass || FalseClass]
|
76
|
+
def numpad_return?(virtual_key, *dw_state_names)
|
77
|
+
virtual_key == 0x0D and dw_state_names.include?(:ENHANCED_KEY)
|
78
|
+
end
|
79
|
+
|
80
|
+
#
|
81
|
+
# numpad_except_return_or_numlock
|
82
|
+
# @param virtual_key
|
83
|
+
# @return [TrueClass || FalseClass]
|
84
|
+
def numpad_number_function?(virtual_key)
|
85
|
+
virtual_key.between?(Keyboard::VK[:NUMPAD0], Keyboard::VK[:DIVIDE])
|
86
|
+
end
|
87
|
+
|
88
|
+
#
|
89
|
+
# @param virtual_key
|
90
|
+
# @param [Array] dw_state_names
|
91
|
+
# @return [TrueClass || FalseClass]
|
92
|
+
def numpad_arrow?(virtual_key, *dw_state_names)
|
93
|
+
arrow_key?(virtual_key) and not dw_state_names.include?(:ENHANCED_KEY)
|
94
|
+
end
|
95
|
+
|
96
|
+
#
|
97
|
+
# @param virtual_key
|
98
|
+
# @param [Array] dw_state_names
|
99
|
+
# @return [TrueClass || FalseClass]
|
100
|
+
def numpad_control_key?(virtual_key, *dw_state_names)
|
101
|
+
control_pad_key?(virtual_key) and not dw_state_names.include?(:ENHANCED_KEY)
|
102
|
+
end
|
103
|
+
|
104
|
+
#
|
105
|
+
# @param virtual_key
|
106
|
+
# @param [Array] dw_state_names
|
107
|
+
# @return [TrueClass || FalseClass]
|
108
|
+
def numpad?(virtual_key, *dw_state_names)
|
109
|
+
numpad_return?(virtual_key, *dw_state_names) or numpad_number_function?(virtual_key) or
|
110
|
+
numlock?(virtual_key) or numpad_control_key?(virtual_key, *dw_state_names)
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
include NumpadKeys
|
116
|
+
extend NumpadKeys
|
117
|
+
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
@@ -0,0 +1,211 @@
|
|
1
|
+
require 'vigilem/support/key_map'
|
2
|
+
|
3
|
+
module Vigilem
|
4
|
+
module Win32API
|
5
|
+
# https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent
|
6
|
+
module VirtualKeys
|
7
|
+
Map = Support::KeyMap.new({
|
8
|
+
0x01 => :VK_LBUTTON,
|
9
|
+
0x02 => :VK_RBUTTON,
|
10
|
+
0x03 => :VK_CANCEL,
|
11
|
+
0x04 => :VK_MBUTTON,
|
12
|
+
0x05 => :VK_XBUTTON1,
|
13
|
+
0x06 => :VK_XBUTTON2,
|
14
|
+
[0x07, 0x0A..0x0B, 0x0E..0x0F, 0x16, 0x1A,
|
15
|
+
0x3A..0x40, 0x5E, 0x88..0x8F, 0x97..0x9F,
|
16
|
+
0xB8..0xB9, 0xC1..0xD7, 0xD8..0xDA, 0xE0, 0xE8] => :VK_UNASSIGNED,
|
17
|
+
0x08 => :VK_BACK,
|
18
|
+
0x09 => :VK_TAB,
|
19
|
+
0x0C => :VK_CLEAR,
|
20
|
+
0x0D => :VK_RETURN,
|
21
|
+
0x10 => :VK_SHIFT,
|
22
|
+
0x11 => :VK_CONTROL,
|
23
|
+
0x12 => :VK_MENU,
|
24
|
+
0x13 => :VK_PAUSE,
|
25
|
+
0x14 => :VK_CAPITAL,
|
26
|
+
0x15 => :VK_KANA,
|
27
|
+
0x15 => :VK_HANGUEL,
|
28
|
+
0x15 => :VK_HANGUL,
|
29
|
+
0x17 => :VK_JUNJA,
|
30
|
+
0x18 => :VK_FINAL,
|
31
|
+
0x19 => :VK_HANJA,
|
32
|
+
0x19 => :VK_KANJI,
|
33
|
+
0x1B => :VK_ESCAPE,
|
34
|
+
0x1C => :VK_CONVERT,
|
35
|
+
0x1D => :VK_NONCONVERT,
|
36
|
+
0x1E => :VK_ACCEPT,
|
37
|
+
0x1F => :VK_MODECHANGE,
|
38
|
+
0x20 => :VK_SPACE,
|
39
|
+
0x21 => :VK_PRIOR,
|
40
|
+
0x22 => :VK_NEXT,
|
41
|
+
0x23 => :VK_END,
|
42
|
+
0x24 => :VK_HOME,
|
43
|
+
0x25 => :VK_LEFT,
|
44
|
+
0x26 => :VK_UP,
|
45
|
+
0x27 => :VK_RIGHT,
|
46
|
+
0x28 => :VK_DOWN,
|
47
|
+
0x29 => :VK_SELECT,
|
48
|
+
0x2A => :VK_PRINT,
|
49
|
+
0x2B => :VK_EXECUTE,
|
50
|
+
0x2C => :VK_SNAPSHOT,
|
51
|
+
0x2D => :VK_INSERT,
|
52
|
+
0x2E => :VK_DELETE,
|
53
|
+
0x2F => :VK_HELP,
|
54
|
+
0x30 => :VK_0,
|
55
|
+
0x31 => :VK_1,
|
56
|
+
0x32 => :VK_2,
|
57
|
+
0x33 => :VK_3,
|
58
|
+
0x34 => :VK_4,
|
59
|
+
0x35 => :VK_5,
|
60
|
+
0x36 => :VK_6,
|
61
|
+
0x37 => :VK_7,
|
62
|
+
0x38 => :VK_8,
|
63
|
+
0x39 => :VK_9,
|
64
|
+
0x41 => :VK_A,
|
65
|
+
0x42 => :VK_B,
|
66
|
+
0x43 => :VK_C,
|
67
|
+
0x44 => :VK_D,
|
68
|
+
0x45 => :VK_E,
|
69
|
+
0x46 => :VK_F,
|
70
|
+
0x47 => :VK_G,
|
71
|
+
0x48 => :VK_H,
|
72
|
+
0x49 => :VK_I,
|
73
|
+
0x4A => :VK_J,
|
74
|
+
0x4B => :VK_K,
|
75
|
+
0x4C => :VK_L,
|
76
|
+
0x4D => :VK_M,
|
77
|
+
0x4E => :VK_N,
|
78
|
+
0x4F => :VK_O,
|
79
|
+
0x50 => :VK_P,
|
80
|
+
0x51 => :VK_Q,
|
81
|
+
0x52 => :VK_R,
|
82
|
+
0x53 => :VK_S,
|
83
|
+
0x54 => :VK_T,
|
84
|
+
0x55 => :VK_U,
|
85
|
+
0x56 => :VK_V,
|
86
|
+
0x57 => :VK_W,
|
87
|
+
0x58 => :VK_X,
|
88
|
+
0x59 => :VK_Y,
|
89
|
+
0x5A => :VK_Z,
|
90
|
+
0x5B => :VK_LWIN,
|
91
|
+
0x5C => :VK_RWIN,
|
92
|
+
0x5D => :VK_APPS,
|
93
|
+
0x5F => :VK_SLEEP,
|
94
|
+
0x60 => :VK_NUMPAD0,
|
95
|
+
0x61 => :VK_NUMPAD1,
|
96
|
+
0x62 => :VK_NUMPAD2,
|
97
|
+
0x63 => :VK_NUMPAD3,
|
98
|
+
0x64 => :VK_NUMPAD4,
|
99
|
+
0x65 => :VK_NUMPAD5,
|
100
|
+
0x66 => :VK_NUMPAD6,
|
101
|
+
0x67 => :VK_NUMPAD7,
|
102
|
+
0x68 => :VK_NUMPAD8,
|
103
|
+
0x69 => :VK_NUMPAD9,
|
104
|
+
0x6A => :VK_MULTIPLY,
|
105
|
+
0x6B => :VK_ADD,
|
106
|
+
0x6C => :VK_SEPARATOR,
|
107
|
+
0x6D => :VK_SUBTRACT,
|
108
|
+
0x6E => :VK_DECIMAL,
|
109
|
+
0x6F => :VK_DIVIDE,
|
110
|
+
0x70 => :VK_F1,
|
111
|
+
0x71 => :VK_F2,
|
112
|
+
0x72 => :VK_F3,
|
113
|
+
0x73 => :VK_F4,
|
114
|
+
0x74 => :VK_F5,
|
115
|
+
0x75 => :VK_F6,
|
116
|
+
0x76 => :VK_F7,
|
117
|
+
0x77 => :VK_F8,
|
118
|
+
0x78 => :VK_F9,
|
119
|
+
0x79 => :VK_F10,
|
120
|
+
0x7A => :VK_F11,
|
121
|
+
0x7B => :VK_F12,
|
122
|
+
0x7C => :VK_F13,
|
123
|
+
0x7D => :VK_F14,
|
124
|
+
0x7E => :VK_F15,
|
125
|
+
0x7F => :VK_F16,
|
126
|
+
0x80 => :VK_F17,
|
127
|
+
0x81 => :VK_F18,
|
128
|
+
0x82 => :VK_F19,
|
129
|
+
0x83 => :VK_F20,
|
130
|
+
0x84 => :VK_F21,
|
131
|
+
0x85 => :VK_F22,
|
132
|
+
0x86 => :VK_F23,
|
133
|
+
0x87 => :VK_F24,
|
134
|
+
0x90 => :VK_NUMLOCK,
|
135
|
+
0x91 => :VK_SCROLL,
|
136
|
+
[0x92..0x96, 0xE3..0xE4, 0xE9..0xF5] => :VK_OEM,
|
137
|
+
0xA0 => :VK_LSHIFT,
|
138
|
+
0xA1 => :VK_RSHIFT,
|
139
|
+
0xA2 => :VK_LCONTROL,
|
140
|
+
0xA3 => :VK_RCONTROL,
|
141
|
+
0xA4 => :VK_LMENU,
|
142
|
+
0xA5 => :VK_RMENU,
|
143
|
+
0xA6 => :VK_BROWSER_BACK,
|
144
|
+
0xA7 => :VK_BROWSER_FORWARD,
|
145
|
+
0xA8 => :VK_BROWSER_REFRESH,
|
146
|
+
0xA9 => :VK_BROWSER_STOP,
|
147
|
+
0xAA => :VK_BROWSER_SEARCH,
|
148
|
+
0xAB => :VK_BROWSER_FAVORITES,
|
149
|
+
0xAC => :VK_BROWSER_HOME,
|
150
|
+
0xAD => :VK_VOLUME_MUTE,
|
151
|
+
0xAE => :VK_VOLUME_DOWN,
|
152
|
+
0xAF => :VK_VOLUME_UP,
|
153
|
+
0xB0 => :VK_MEDIA_NEXT_TRACK,
|
154
|
+
0xB1 => :VK_MEDIA_PREV_TRACK,
|
155
|
+
0xB2 => :VK_MEDIA_STOP,
|
156
|
+
0xB3 => :VK_MEDIA_PLAY_PAUSE,
|
157
|
+
0xB4 => :VK_LAUNCH_MAIL,
|
158
|
+
0xB5 => :VK_LAUNCH_MEDIA_SELECT,
|
159
|
+
0xB6 => :VK_LAUNCH_APP1,
|
160
|
+
0xB7 => :VK_LAUNCH_APP2,
|
161
|
+
0xBA => :VK_OEM_1,
|
162
|
+
0xBB => :VK_OEM_PLUS,
|
163
|
+
0xBC => :VK_OEM_COMMA,
|
164
|
+
0xBD => :VK_OEM_MINUS,
|
165
|
+
0xBE => :VK_OEM_PERIOD,
|
166
|
+
0xBF => :VK_OEM_2,
|
167
|
+
0xC0 => :VK_OEM_3,
|
168
|
+
0xDB => :VK_OEM_4,
|
169
|
+
0xDC => :VK_OEM_5,
|
170
|
+
0xDD => :VK_OEM_6,
|
171
|
+
0xDE => :VK_OEM_7,
|
172
|
+
0xDF => :VK_OEM_8,
|
173
|
+
0xE1 => :VK_OEM,
|
174
|
+
0xE2 => :VK_OEM_102,
|
175
|
+
0xE5 => :VK_PROCESSKEY,
|
176
|
+
0xE6 => :VK_OEM,
|
177
|
+
0xE7 => :VK_PACKET,
|
178
|
+
0xF6 => :VK_ATTN,
|
179
|
+
0xF7 => :VK_CRSEL,
|
180
|
+
0xF8 => :VK_EXSEL,
|
181
|
+
0xF9 => :VK_EREOF,
|
182
|
+
0xFA => :VK_PLAY,
|
183
|
+
0xFB => :VK_ZOOM,
|
184
|
+
0xFC => :VK_NONAME,
|
185
|
+
0xFD => :VK_PA1,
|
186
|
+
0xFE => :VK_OEM_CLEAR,
|
187
|
+
0xF2 => :VK_OEM_COPY,
|
188
|
+
0xF3 => :VK_OEM_AUTO,
|
189
|
+
0xF4 => :VK_OEM_ENLW,
|
190
|
+
0xF5 => :VK_OEM_BACKTAB #"RomanCharacters" for Japanese keyboard layout, "Unidentified" for the others.
|
191
|
+
})
|
192
|
+
|
193
|
+
# windows uses "Virtual-Key Codes" format
|
194
|
+
code_aliases = [:dom_key, :virtual_key_code, :virtual_key_codes]
|
195
|
+
vk_aliases = :win_vk, :virtual_key, :virtual_keys, :virtual_keyname, :virtual_keynames
|
196
|
+
|
197
|
+
VK = Map.class.new
|
198
|
+
|
199
|
+
Map.left_side_aliases(*code_aliases)
|
200
|
+
VK.left_side_aliases(*vk_aliases)
|
201
|
+
|
202
|
+
Map.right_side_aliases(*vk_aliases)
|
203
|
+
VK.right_side_aliases(*code_aliases)
|
204
|
+
|
205
|
+
Map.each_with_object(VK) do |(key, value), hsh|
|
206
|
+
vk_name = value.to_s[3..-1]
|
207
|
+
hsh[sym = :"#{vk_name}"] = key
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'ffi'
|
2
|
+
|
3
|
+
require 'vigilem/win32_api/constants'
|
4
|
+
|
5
|
+
require 'vigilem/win32_api/types'
|
6
|
+
require 'vigilem/win32_api/console_input_events'
|
7
|
+
|
8
|
+
require 'vigilem/win32_api/input__record'
|
9
|
+
require 'vigilem/win32_api/p_input__record'
|
10
|
+
|
11
|
+
module Vigilem
|
12
|
+
|
13
|
+
# @see http://msdn.microsoft.com for usage
|
14
|
+
# @todo consider FFI options Hash :blocking (Boolean) — default: @blocking — set to true if the C function is a blocking call
|
15
|
+
module Win32API
|
16
|
+
extend ::FFI::Library
|
17
|
+
|
18
|
+
ffi_lib 'kernel32', 'user32'
|
19
|
+
ffi_convention :stdcall
|
20
|
+
|
21
|
+
attach_function :GetStdHandle, [:DWORD], :HANDLE
|
22
|
+
|
23
|
+
attach_function :MapVirtualKeyW, [:UINT, :UINT], :UINT
|
24
|
+
|
25
|
+
module_function
|
26
|
+
|
27
|
+
def PeekConsoleInputW(hConsoleInput, lpBuffer, nLength, lpNumberOfEventsRead)
|
28
|
+
_PeekConsoleInputW(hConsoleInput, lpBuffer, nLength, lpNumberOfEventsRead)
|
29
|
+
end
|
30
|
+
|
31
|
+
def ReadConsoleInputW(hConsoleInput, lpBuffer, nLength, lpNumberOfEventsRead)
|
32
|
+
_ReadConsoleInputW(hConsoleInput, lpBuffer, nLength, lpNumberOfEventsRead)
|
33
|
+
end
|
34
|
+
|
35
|
+
def ReadConsoleInputW(hConsoleInput, lpBuffer, nLength, lpNumberOfEventsRead)
|
36
|
+
_ReadConsoleInputW(hConsoleInput, lpBuffer, nLength, lpNumberOfEventsRead)
|
37
|
+
end
|
38
|
+
|
39
|
+
def WriteConsoleInputW(hConsoleInput, lpBuffer, nLength, lpNumberOfEventsRead)
|
40
|
+
_WriteConsoleInputW(hConsoleInput, lpBuffer, nLength, lpNumberOfEventsRead)
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
attach_function :_PeekConsoleInputW, :PeekConsoleInputW, [:HANDLE, :PINPUT_RECORD, :DWORD, :pointer], :BOOL
|
46
|
+
|
47
|
+
attach_function :_ReadConsoleInputW, :ReadConsoleInputW, [:HANDLE, :PINPUT_RECORD, :DWORD, :pointer], :BOOL
|
48
|
+
|
49
|
+
attach_function :_ReadConsoleInputW, :ReadConsoleInputW, [:HANDLE, :PINPUT_RECORD, :DWORD, :pointer], :BOOL
|
50
|
+
|
51
|
+
# future use
|
52
|
+
attach_function :_WriteConsoleInputW, :WriteConsoleInputW, [:HANDLE, :PINPUT_RECORD, :DWORD, :pointer], :BOOL
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
require 'vigilem/win32_api/rubyized'
|
58
|
+
|
59
|
+
require 'vigilem/win32_api/input_system_handler'
|
60
|
+
|
61
|
+
require 'vigilem/win32_api/dom'
|
@@ -0,0 +1,37 @@
|
|
1
|
+
=begin
|
2
|
+
require 'bundler'
|
3
|
+
Bundler.setup
|
4
|
+
|
5
|
+
require 'vigilem/win32'
|
6
|
+
|
7
|
+
require 'vigilem/win32_api/event_common'
|
8
|
+
|
9
|
+
include Vigilem::Win32API
|
10
|
+
|
11
|
+
module FakeInputSystem
|
12
|
+
class << self
|
13
|
+
|
14
|
+
INPUT_RECORD = Vigilem::Win32API::INPUT_RECORD
|
15
|
+
|
16
|
+
def GetStdHandle(arg)
|
17
|
+
3
|
18
|
+
end
|
19
|
+
|
20
|
+
def PeekConsoleInputW(hConsoleInput, lpBuffer, nLength, lpNumberOfEventsRead)
|
21
|
+
lpBuffer.replace([INPUT_RECORD.new])
|
22
|
+
1
|
23
|
+
end
|
24
|
+
|
25
|
+
def ReadConsoleInputW(hConsoleInput, lpBuffer, nLength, lpNumberOfEventsRead)
|
26
|
+
lpBuffer.replace([INPUT_RECORD.new])
|
27
|
+
1
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
adapt = EventCommon::Adapter.new.attach(InputSystemHandler.new(FakeInputSystem))
|
33
|
+
|
34
|
+
puts 'press a button'
|
35
|
+
|
36
|
+
puts adapt.read_console_input.inspect
|
37
|
+
=end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module RubyizedSteps
|
4
|
+
|
5
|
+
include InputHelper
|
6
|
+
|
7
|
+
# this is malformed but due do timing and blocking this si the best way
|
8
|
+
step 'read_console_input called before user presses a key' do
|
9
|
+
adapt = InputSystemHandler.new
|
10
|
+
flush
|
11
|
+
write_console_input_test
|
12
|
+
@api_return = adapt.read_console_input
|
13
|
+
end
|
14
|
+
|
15
|
+
step 'a PINPUT_RECORD is returned' do
|
16
|
+
expect(@api_return).to be_a ::Vigilem::Win32API::PINPUT_RECORD
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
RSpec.configure { |c| c.include RubyizedSteps }
|
@@ -0,0 +1,10 @@
|
|
1
|
+
shared_examples 'attributes_and_size_test' do
|
2
|
+
|
3
|
+
it 'will have methods as attrs' do
|
4
|
+
expect(described_class.new).to respond_to(*ary)
|
5
|
+
end
|
6
|
+
|
7
|
+
it %q(will have an size eql to it's layout types sizes) do
|
8
|
+
expect(described_class.new.to_ptr.type_size).to eql(sze)
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'fiddle/import'
|
2
|
+
|
3
|
+
module InputHelper
|
4
|
+
include Vigilem::Win32API
|
5
|
+
|
6
|
+
module Fid
|
7
|
+
require 'fiddle/types'
|
8
|
+
|
9
|
+
extend Fiddle::Importer
|
10
|
+
|
11
|
+
dlload 'kernel32.dll', 'user32.dll'
|
12
|
+
|
13
|
+
include Fiddle::Win32Types
|
14
|
+
|
15
|
+
extern 'HANDLE GetStdHandle(DWORD)', :stdcall
|
16
|
+
|
17
|
+
extern 'BOOL FlushConsoleInputBuffer(HANDLE)', :stdcall
|
18
|
+
|
19
|
+
extern 'BOOL WriteConsoleInput(HANDLE, PVOID, DWORD, PVOID)', :stdcall
|
20
|
+
end
|
21
|
+
|
22
|
+
def std_handle
|
23
|
+
Fid.GetStdHandle(0xFFFFFFF6)
|
24
|
+
end
|
25
|
+
|
26
|
+
# clear out the user entered stuff queue
|
27
|
+
def flush
|
28
|
+
Fid.FlushConsoleInputBuffer(std_handle)
|
29
|
+
end
|
30
|
+
|
31
|
+
def write_console_input_test
|
32
|
+
nLength ||= 20
|
33
|
+
lpNumberOfEventsWritten ||= ' ' * 4
|
34
|
+
Fid.WriteConsoleInput(std_handle, [0x0001, 1, 0, 0x61, 1, 0x41, 97].pack('SxxlSSSSL'),
|
35
|
+
nLength, lpNumberOfEventsWritten)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
RSpec.configure do |c|
|
40
|
+
c.include InputHelper
|
41
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# @todo metal events need to be in another windows console
|
2
|
+
# @todo alot of the receive methods are too brittle
|
3
|
+
|
4
|
+
require 'bundler'
|
5
|
+
Bundler.setup
|
6
|
+
|
7
|
+
require 'timeout'
|
8
|
+
|
9
|
+
require 'vigilem/support/core_ext/debug_puts'
|
10
|
+
|
11
|
+
require 'attributes_and_size_test'
|
12
|
+
|
13
|
+
require 'input_helper'
|
14
|
+
|
15
|
+
=begin
|
16
|
+
#to discover when tests hang which will happen because I have not correctly isolated the tests
|
17
|
+
# also can use rspec -f d
|
18
|
+
RSpec.configure do |config|
|
19
|
+
|
20
|
+
config.before :all do |example_group|
|
21
|
+
puts "#{example_group.class.description}"
|
22
|
+
end
|
23
|
+
|
24
|
+
config.before :each do |example|
|
25
|
+
puts "->#{example.description}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
=end
|
@@ -0,0 +1 @@
|
|
1
|
+
Dir.glob("spec/acceptance/steps/**/*_steps.rb") { |f| load f, true }
|