xinput_wrapper 0.4.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +2 -2
- data/lib/xinput_wrapper.rb +146 -25
- metadata +33 -33
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7685727622dac6285e86dcf8095525fde1d6d129b7f210aed3ad2512138efdaa
|
4
|
+
data.tar.gz: f404c6286c440432f6b9ad26db6f8b6d36fc6e3ea0d6141baa439bf74c572e16
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9ce3aaf5e903c982201b1ac8802b109f8388083b0e9f0de02454811e4300069a043b84a6bdf66db2604c70dec57c3a0564747d908beadf2b0216d49e4b9b0dd2
|
7
|
+
data.tar.gz: 9c2ae2545e99ba3d1a13789f5d7c24c11b15011f7a623169b1a7bfee9883a88091fcf9d182ead686df0564e9bdd384b0f8918f40f9a0374aca2f08c8a5533c1d
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
�r�&��� �(�B&C��S�����Y���e�J�{����)�s����c�=]y`r?�JG�h&�t&�X���gBQ;�:�^/�u.m:����?�Bzy�$/� ?�زms�&M��g1XC'y@�DUk:V� �)T�5�K���L��i�d��6]"�}���ɭ��p[����U�\�����$Yp�h�U�c��Q���qQâA�}�� K�ҡA��7z�����'��0N�K�k-
|
2
|
+
>:��&ŏ1�Y@H��#Z�U���U��~�@� ܠg��X���Hn��x0q�Z�G�
|
data/lib/xinput_wrapper.rb
CHANGED
@@ -2,13 +2,31 @@
|
|
2
2
|
|
3
3
|
# file: xinput_wrapper.rb
|
4
4
|
|
5
|
+
# Captures keyboard or mouse events using program xinput.
|
6
|
+
|
7
|
+
|
8
|
+
# note: To display a list of xinput devices, run the
|
9
|
+
# xinput program without any options.
|
10
|
+
|
5
11
|
require 'c32'
|
6
12
|
|
7
13
|
|
14
|
+
MOTION = 6
|
15
|
+
RAWKEY_PRESS = 13
|
16
|
+
RAWKEY_RELEASE = 14
|
17
|
+
|
18
|
+
|
8
19
|
class XInputWrapper
|
9
20
|
using ColouredText
|
10
21
|
|
11
|
-
|
22
|
+
# device list:
|
23
|
+
# 3 = Virtual core keyboard
|
24
|
+
# 4 = Virtual core XTEST pointer (active when using VNC)
|
25
|
+
# 5 = Virtual core XTEST keyboard (active when using VNC)
|
26
|
+
# 10 = USB Optical Mouse (locally attached)
|
27
|
+
# 11 = Microsoft Wired Keyboard 600 (locally attached)
|
28
|
+
#
|
29
|
+
def initialize(device: nil, verbose: true, lookup: {}, debug: false )
|
12
30
|
|
13
31
|
# defaults to QWERTY keyboard layout
|
14
32
|
@modifiers = {
|
@@ -28,8 +46,8 @@ class XInputWrapper
|
|
28
46
|
31=>:i, 32=>:o, 33=>:p, 34=>:"[", 35=>:"]", 36=>:enter, 38=>:a, 39=>:s,
|
29
47
|
40=>:d, 41=>:f, 42=>:g, 43=>:h, 44=>:j, 45=>:k, 46=>:l, 47=>:";",
|
30
48
|
48=>:"'", 49=>nil, 52=>:z, 53=>:x, 54=>:c, 55=>:v, 56=>:b, 57=>:n,
|
31
|
-
58=>:m, 59=>:",", 60=>:".", 61=>:/, 65=>:
|
32
|
-
9 => :
|
49
|
+
58=>:m, 59=>:",", 60=>:".", 61=>:/, 65=>:space,
|
50
|
+
9 => :esc,
|
33
51
|
66 => :capslock,
|
34
52
|
67 => :f1,
|
35
53
|
68 => :f2,
|
@@ -42,18 +60,18 @@ class XInputWrapper
|
|
42
60
|
75 => :f9,
|
43
61
|
76 => :f10,
|
44
62
|
77 => :numlock,
|
45
|
-
78 => :
|
63
|
+
78 => :scrolllock,
|
46
64
|
95 => :f11,
|
47
65
|
96 => :f12,
|
48
|
-
107 => :print_screen
|
66
|
+
107 => :sysrq, # print_screen
|
49
67
|
110 => :home,
|
50
|
-
111 => :
|
51
|
-
112 => :
|
52
|
-
113 => :
|
53
|
-
114 => :
|
54
|
-
115 => :end,
|
55
|
-
116 => :
|
56
|
-
117 => :
|
68
|
+
111 => :up, # arrow keys
|
69
|
+
112 => :pageup,
|
70
|
+
113 => :left, # arrow keys
|
71
|
+
114 => :right, # arrow keys
|
72
|
+
115 => :end,
|
73
|
+
116 => :down, # arrow keys
|
74
|
+
117 => :pagedown,
|
57
75
|
121 => :mute,
|
58
76
|
122 => :vol_down,
|
59
77
|
123 => :vol_up,
|
@@ -78,27 +96,84 @@ class XInputWrapper
|
|
78
96
|
end
|
79
97
|
|
80
98
|
def listen()
|
81
|
-
|
99
|
+
|
82
100
|
command = "xinput test-xi2 --root #{@device}"
|
83
101
|
|
84
102
|
type = 0
|
85
103
|
raw_keys = []
|
104
|
+
t1 = Time.now
|
105
|
+
lines = []
|
86
106
|
|
87
107
|
IO.popen(command).each_line do |x|
|
88
108
|
|
89
|
-
|
90
|
-
|
109
|
+
print "GOT ", x
|
110
|
+
if x[/EVENT type \d \(Motion\)/] and (Time.now > (t1 + 0.06125)) then
|
111
|
+
|
112
|
+
type = x[/EVENT type (\d+)/,1].to_i
|
113
|
+
|
114
|
+
r = lines.join[/^\s+root: (\d+\.\d{2}\/\d+\.\d{2})/,1]
|
115
|
+
|
116
|
+
if r then
|
117
|
+
|
118
|
+
x1, y1 = r.split('/').map(&:to_f)
|
119
|
+
puts "x1: %s y1: %s" % [x1, y1] if @debug
|
120
|
+
on_mousemove(x1, y1)
|
121
|
+
t1 = Time.now
|
122
|
+
|
123
|
+
end
|
124
|
+
|
125
|
+
lines = [x]
|
126
|
+
|
127
|
+
elsif x[/EVENT type \d+ \(RawKey(?:Release|Press)\)/]
|
91
128
|
|
92
|
-
|
93
|
-
|
129
|
+
type = x[/EVENT type (\d+)/,1].to_i
|
130
|
+
|
131
|
+
lines = [x]
|
132
|
+
|
133
|
+
elsif type == MOTION or type == RAWKEY_PRESS or type == RAWKEY_RELEASE
|
134
|
+
|
135
|
+
lines << x
|
136
|
+
|
137
|
+
if x == "\n" then
|
138
|
+
case lines.first[/(?<=EVENT type )\d+/].to_i
|
139
|
+
when RAWKEY_PRESS
|
140
|
+
|
141
|
+
r = lines.join[/detail: (\d+)/,1]
|
142
|
+
|
143
|
+
keycode = r.to_i if r
|
144
|
+
|
145
|
+
type = lines.join[/EVENT type (\d+)/,1] .to_i
|
146
|
+
|
147
|
+
when RAWKEY_RELEASE
|
148
|
+
|
149
|
+
r = lines.join[/detail: (\d+)/,1]
|
150
|
+
|
151
|
+
keycode = r.to_i if r
|
152
|
+
|
153
|
+
type = lines.join[/EVENT type (\d+)/,1] .to_i
|
154
|
+
|
155
|
+
end
|
156
|
+
|
157
|
+
|
158
|
+
else
|
159
|
+
next
|
160
|
+
end
|
94
161
|
|
95
|
-
|
96
|
-
|
162
|
+
else
|
163
|
+
next
|
164
|
+
end
|
165
|
+
|
166
|
+
next unless keycode
|
167
|
+
puts 'keycode: ' + keycode.inspect if @debug
|
97
168
|
|
98
169
|
# type = 13 means a key has been pressed
|
99
|
-
if type ==
|
170
|
+
if type == RAWKEY_PRESS then
|
100
171
|
|
101
|
-
raw_keys
|
172
|
+
if @modifiers.include? raw_keys.last or @modifiers.include? keycode then
|
173
|
+
raw_keys << keycode
|
174
|
+
end
|
175
|
+
|
176
|
+
next if @modifiers.include? keycode
|
102
177
|
|
103
178
|
puts 'raw_keys: ' + raw_keys.inspect if @debug
|
104
179
|
|
@@ -113,23 +188,54 @@ class XInputWrapper
|
|
113
188
|
puts ('key: ' + key.inspect).debug if @debug
|
114
189
|
|
115
190
|
if key then
|
191
|
+
|
116
192
|
puts key.to_s + ' key presssed' if @verbose
|
117
193
|
name = "on_#{key}_key".to_sym
|
118
194
|
method(name).call if self.protected_methods.include? name
|
119
|
-
|
195
|
+
|
196
|
+
keystring = ((key.length > 1 or key == ' ') ? "{%s}" % key : key)
|
197
|
+
block_given? ? yield(keystring) : on_key_press(keystring, keycode)
|
198
|
+
|
120
199
|
end
|
121
200
|
|
122
201
|
else
|
123
202
|
|
124
203
|
keys = raw_keys.map {|kc| @lookup[kc] }
|
125
204
|
puts ('keys: ' + keys.inspect) if @debug
|
126
|
-
|
205
|
+
|
206
|
+
if block_given? then
|
207
|
+
yield(format_key(keys.last, keys[0..-2]))
|
208
|
+
else
|
209
|
+
on_key_press(keys.last, keycode, keys[0..-2])
|
210
|
+
end
|
211
|
+
|
212
|
+
raw_keys = []
|
127
213
|
|
128
214
|
end
|
129
215
|
|
130
216
|
|
131
217
|
|
132
|
-
|
218
|
+
# a key has been released
|
219
|
+
elsif type == RAWKEY_RELEASE
|
220
|
+
|
221
|
+
# here we are only looking to detect a
|
222
|
+
# single modifier key press and release
|
223
|
+
|
224
|
+
key = @lookup[keycode]
|
225
|
+
|
226
|
+
unless raw_keys.empty? then
|
227
|
+
puts key.to_s + ' key presssed'
|
228
|
+
|
229
|
+
if block_given? then
|
230
|
+
|
231
|
+
yield(format_key(key.to_s))
|
232
|
+
|
233
|
+
else
|
234
|
+
name = "on_#{key}_key".to_sym
|
235
|
+
method(name).call if self.protected_methods.include? name
|
236
|
+
on_key_press(key, keycode)
|
237
|
+
end
|
238
|
+
end
|
133
239
|
|
134
240
|
index = raw_keys.rindex(keycode)
|
135
241
|
raw_keys.delete_at index if index
|
@@ -145,13 +251,21 @@ class XInputWrapper
|
|
145
251
|
puts 'ctrl key pressed'
|
146
252
|
end
|
147
253
|
|
148
|
-
def on_key_press(key, keycode, modifier)
|
254
|
+
def on_key_press(key, keycode, modifier=nil)
|
149
255
|
|
150
256
|
if @debug then
|
151
257
|
puts ('key: ' + key.inspect).debug
|
152
258
|
end
|
153
259
|
|
154
260
|
end
|
261
|
+
|
262
|
+
def on_mousemove(x,y)
|
263
|
+
|
264
|
+
if @debug then
|
265
|
+
puts "on_mousemove() x: %s y: %s" % [x, y]
|
266
|
+
end
|
267
|
+
|
268
|
+
end
|
155
269
|
|
156
270
|
def on_shift_key() end
|
157
271
|
def on_super_key() end
|
@@ -171,6 +285,13 @@ class XInputWrapper
|
|
171
285
|
|
172
286
|
private
|
173
287
|
|
288
|
+
def format_key(key, modifier=[])
|
289
|
+
|
290
|
+
modifier.any? ? "{%s}" % (modifier + [key.to_s]).join('+') \
|
291
|
+
: key.to_s
|
292
|
+
|
293
|
+
end
|
294
|
+
|
174
295
|
def on_leftcontrol_key() on_control_key() end
|
175
296
|
def on_rightcontrol_key() on_control_key() end
|
176
297
|
def on_left_alt_key() on_alt_key() end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xinput_wrapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Robertson
|
@@ -11,52 +11,52 @@ cert_chain:
|
|
11
11
|
- |
|
12
12
|
-----BEGIN CERTIFICATE-----
|
13
13
|
MIIEXjCCAsagAwIBAgIBATANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDDCFnZW1t
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
14
|
+
YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjAwODAzMjEwMTE2WhcN
|
15
|
+
MjEwODAzMjEwMTE2WjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
|
16
|
+
cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDdnN5k
|
17
|
+
jxSdi5vMTqhRRJ8yFAV3MYUs/W6NU+rMUk1uqTC/J+fFox8tg7t4VzQoQq539Onk
|
18
|
+
5iPFJhwo3jAYKIyc+LX4e3CtQMdrheyY/XkaTSu1yPR+c4lT8nhKUf4gI28hNXcx
|
19
|
+
lNekrvzzXBVZMGs5F+gKzOYUFS+i0jGPaVaison+iaGVLcjc2/t3AGIQeOHo7QYv
|
20
|
+
6Sswkj9Er4jkwJKHGAvLvh+KTcm/aImIfV4v5FUm6xJMi42lsDWbaRyACtAtNgKF
|
21
|
+
cl/pMlb3d5Si3vIcbKlktHR2K5KLtBuFqu/vWdlKygYzpnr3rWjAls8wr2fv6WiS
|
22
|
+
BqX3XVtZB4Fh/xriLY3Fj3Qo9RWuGf9S3BIGGxcnsr53bsO1zKXvbNr5UzP9d0+8
|
23
|
+
dF5lJ4bu8rw524nYypy39Is9PlHI7L6nxQjy82AmzloxEc31nYM7FF2pjkStv5H5
|
24
|
+
zfb4PVsCblnUstufNJWKrg32E2wbzXhzq8+E/U7Y7FM4zABWcyeHtt4Mv0MCAwEA
|
25
|
+
AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU+hzRpZTx
|
26
|
+
g/xK+Tn1+5WHz7CK1y8wJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
|
27
27
|
c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
28
|
+
BgkqhkiG9w0BAQsFAAOCAYEAXg+9mfaTHPcbez7P0XnwGL0C4zdPwHtBUXioPwjP
|
29
|
+
okklRkFzMQnxArm8U9557g8cXY//vKp/cFBdCExE8lLxAOB9gHswJju0g99Yx7gY
|
30
|
+
iEV3TWv5qkLQ+n8zdTd8TxEyjWB6ZXOJcE+/cTq9Ly1j4bhf9QTdul02TBukEp6d
|
31
|
+
opP5/Yvt1GX0ED98olew/pm+KoKKNkcJzSgEH44O+pCfTi4h2STOFRvXVYaB3AH8
|
32
|
+
hpuUFcbxzPhBxOChGPAGZLaf7zurw8B2Q1vP75RV9gJ1M6NKU6Hlb6vMJQ3jz8qv
|
33
|
+
GIVFoKMCcJH2EImrG47doRVhQPIlxfz7d3f+FdYgnp7wtuFi/byklu1D2G8ZE8Ax
|
34
|
+
1s9Njv/guBMNkw+RV6IlpMtT0yeVvHeYTt0tPKeyrtBrSfsexA3393T7To6Ms+1s
|
35
|
+
B//EUqLB2VKtMmcrYMc2FfbLwllNLY4TRq+/lgVLoDb7oLHsiggYSLZS6lPBIQj/
|
36
|
+
YnYsDKwN5siDA79sB0fqq2ml
|
37
37
|
-----END CERTIFICATE-----
|
38
|
-
date:
|
38
|
+
date: 2020-08-03 00:00:00.000000000 Z
|
39
39
|
dependencies:
|
40
40
|
- !ruby/object:Gem::Dependency
|
41
41
|
name: c32
|
42
42
|
requirement: !ruby/object:Gem::Requirement
|
43
43
|
requirements:
|
44
|
-
- - "~>"
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version: '0.1'
|
47
44
|
- - ">="
|
48
45
|
- !ruby/object:Gem::Version
|
49
|
-
version: 0.
|
46
|
+
version: 0.2.0
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0.2'
|
50
50
|
type: :runtime
|
51
51
|
prerelease: false
|
52
52
|
version_requirements: !ruby/object:Gem::Requirement
|
53
53
|
requirements:
|
54
|
-
- - "~>"
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
version: '0.1'
|
57
54
|
- - ">="
|
58
55
|
- !ruby/object:Gem::Version
|
59
|
-
version: 0.
|
56
|
+
version: 0.2.0
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '0.2'
|
60
60
|
description:
|
61
61
|
email: james@jamesrobertson.eu
|
62
62
|
executables: []
|
@@ -83,7 +83,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
83
83
|
- !ruby/object:Gem::Version
|
84
84
|
version: '0'
|
85
85
|
requirements: []
|
86
|
-
rubygems_version: 3.0.
|
86
|
+
rubygems_version: 3.0.3
|
87
87
|
signing_key:
|
88
88
|
specification_version: 4
|
89
89
|
summary: A wrapper for the Linux utility xinput.
|
metadata.gz.sig
CHANGED
Binary file
|