xdrp 0.1.1 → 0.2.2
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/lib/xdrp.rb +103 -32
- data.tar.gz.sig +0 -0
- metadata +80 -39
- 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: 617fbc32a4b2adaf234769104583696286e5e9b76f4bf11a0f131e107362c6ca
|
4
|
+
data.tar.gz: 91f2f6c128055b9e895bfb64449d58e0869def96bccf288b81a872a919701119
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1eaec277d3c3929b9b1b978510e1357d63125f41ae3138f03f77f1793147df35efc8bfacfd66f19b7fadabf34c9982669e5b79334a9d925f182e92c6edf6f4ba
|
7
|
+
data.tar.gz: d58741546686f94390594a42a8ca0b11fc5e2bac1827392252ac2ca108df7f86e54ed610a0e7ba2ef525fefd0941e587cc74b018e17582bddcbfd6badd3bec8e
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/lib/xdrp.rb
CHANGED
@@ -5,13 +5,16 @@
|
|
5
5
|
# description: A basic macro recorder for GNU/Linux which uses
|
6
6
|
# program xinput to capture input events.
|
7
7
|
|
8
|
+
require 'wmctrl'
|
8
9
|
require 'rxfhelper'
|
10
|
+
require 'keystroker'
|
9
11
|
require "xdo/mouse"
|
10
12
|
require "xdo/xwindow"
|
11
13
|
require "xdo/keyboard"
|
12
14
|
require 'xinput_wrapper'
|
13
15
|
|
14
16
|
|
17
|
+
|
15
18
|
MOUSE = 1
|
16
19
|
KEYBOARD = 2
|
17
20
|
KEYBOARD_MOUSE = 3
|
@@ -22,18 +25,16 @@ module Xdrp
|
|
22
25
|
class Recorder
|
23
26
|
|
24
27
|
attr_reader :xml
|
25
|
-
|
28
|
+
|
26
29
|
# level:
|
27
30
|
# 1 = mouse
|
28
31
|
# 2 = keyboard
|
29
32
|
# 3 = keyboard + mouse
|
30
33
|
|
31
34
|
def initialize(levelx=KEYBOARD_MOUSE, level: levelx, debug: false)
|
32
|
-
|
33
|
-
@xiw = XInputWrapper.new(verbose: true, debug: debug, callback: self)
|
34
35
|
|
35
36
|
@mouse, @keyboard = false, false
|
36
|
-
|
37
|
+
|
37
38
|
case level
|
38
39
|
when 1
|
39
40
|
@mouse = true
|
@@ -42,9 +43,16 @@ module Xdrp
|
|
42
43
|
when 3
|
43
44
|
@mouse, @keyboard = true, true
|
44
45
|
end
|
46
|
+
|
47
|
+
|
48
|
+
@xiw = XInputWrapper.new(verbose: true, debug: debug, callback: self)
|
49
|
+
|
50
|
+
@wm = WMCtrl.display
|
51
|
+
@win_title = ''
|
52
|
+
|
45
53
|
end
|
46
54
|
|
47
|
-
def on_keypress(key, keycode, modifier=nil)
|
55
|
+
def on_keypress(key, keycode, modifier=nil)
|
48
56
|
|
49
57
|
if @debug then
|
50
58
|
puts 'key: ' + key.inspect
|
@@ -53,21 +61,48 @@ module Xdrp
|
|
53
61
|
end
|
54
62
|
|
55
63
|
stop() if modifier and modifier[0] == :alt and key == :z
|
56
|
-
|
57
|
-
return unless @keyboard
|
64
|
+
|
65
|
+
return unless @keyboard
|
58
66
|
|
59
67
|
add_sleep() if Time.now > (@t1 + 2)
|
60
|
-
|
68
|
+
|
61
69
|
|
62
70
|
if @a.length >= 1 and @a[-1][0] == :type then
|
63
71
|
|
64
72
|
if modifier.nil? or (modifier and modifier.empty?) then
|
65
|
-
@a[-1][2] += key.to_s
|
73
|
+
@a[-1][2] += key.to_s.sub('{space}', ' ')
|
66
74
|
else
|
67
|
-
|
75
|
+
|
76
|
+
if modifier.length < 2 then
|
77
|
+
|
78
|
+
if modifier.first == :shift and (keycode.between?(10,21) \
|
79
|
+
or keycode.between?(24,35) \
|
80
|
+
or keycode.between?(38,48)) then
|
81
|
+
|
82
|
+
char = if key.to_s =~ /[a-z]/ then
|
83
|
+
key.to_s.upcase
|
84
|
+
elsif key.to_s =~ /[0-9]/
|
85
|
+
%w[) ! " £ $ % ^ & * ( ][key.to_s.to_i]
|
86
|
+
else
|
87
|
+
|
88
|
+
lsym = %i(` - = [ ] ; ' # \ , . /)
|
89
|
+
|
90
|
+
if lsym.include? key then
|
91
|
+
|
92
|
+
usym = %w(¬ _ + { } : @ ~ | < > ?)
|
93
|
+
lsym.zip(usym).to_h[key]
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
@a[-1][2] += char
|
100
|
+
|
101
|
+
else
|
102
|
+
@a << [modifier.first, {key: key}]
|
103
|
+
end
|
104
|
+
end
|
68
105
|
end
|
69
|
-
|
70
|
-
@a.last.last.gsub!('{space}',' ')
|
71
106
|
|
72
107
|
else
|
73
108
|
|
@@ -77,7 +112,7 @@ module Xdrp
|
|
77
112
|
when 'tab'
|
78
113
|
[:tab]
|
79
114
|
else
|
80
|
-
[:type, {}, key.to_s]
|
115
|
+
[:type, {}, key.to_s.sub(/\{space\}/, ' ')]
|
81
116
|
end
|
82
117
|
|
83
118
|
@a << a
|
@@ -89,7 +124,8 @@ module Xdrp
|
|
89
124
|
def on_mousedown(button, x, y)
|
90
125
|
|
91
126
|
return unless @mouse
|
92
|
-
|
127
|
+
monitor_app()
|
128
|
+
|
93
129
|
puts "mouse %s button down at %s, %s" % [button, x, y] if @debug
|
94
130
|
add_sleep() if Time.now > (@t1 + 2)
|
95
131
|
@a << [:mouse, {click: button, x: x, y: y}]
|
@@ -97,16 +133,15 @@ module Xdrp
|
|
97
133
|
end
|
98
134
|
|
99
135
|
def on_mouseup(button, x, y)
|
100
|
-
|
136
|
+
|
101
137
|
return unless @mouse
|
102
|
-
|
103
138
|
puts "mouse %s button up at %s, %s" % [button, x, y] if @debug
|
104
139
|
end
|
105
140
|
|
106
141
|
def on_mousemove(x, y)
|
107
142
|
|
108
143
|
return unless @mouse
|
109
|
-
|
144
|
+
|
110
145
|
puts 'mouse is moving at ' + x.to_s + ' y ' + y.to_s if @debug
|
111
146
|
add_sleep() if Time.now > (@t1 + 2)
|
112
147
|
@a << [:mousemove, {x: x, y: y}]
|
@@ -116,7 +151,7 @@ module Xdrp
|
|
116
151
|
def on_mouse_scrolldown()
|
117
152
|
|
118
153
|
return unless @mouse
|
119
|
-
|
154
|
+
|
120
155
|
puts 'mouse is scrolling down' if @debug
|
121
156
|
add_sleep() if Time.now > (@t1 + 2)
|
122
157
|
@a << [:mousewheel, {scroll: 'down'}]
|
@@ -126,32 +161,32 @@ module Xdrp
|
|
126
161
|
def on_mouse_scrollup()
|
127
162
|
|
128
163
|
return unless @mouse
|
129
|
-
|
164
|
+
|
130
165
|
puts 'mouse is scrolling up ' if @debug
|
131
166
|
add_sleep() if Time.now > (@t1 + 2)
|
132
167
|
@a << [:mousewheel, {scroll: 'up'}]
|
133
168
|
|
134
169
|
end
|
135
|
-
|
170
|
+
|
136
171
|
def save(filepath)
|
137
172
|
File.write filepath, xml()
|
138
173
|
end
|
139
174
|
|
140
175
|
def start()
|
141
|
-
|
176
|
+
|
142
177
|
@a = []
|
143
178
|
Thread.new { @xiw.listen }
|
144
179
|
puts 'recording ...'
|
145
180
|
@t1 = Time.now
|
146
|
-
|
181
|
+
|
147
182
|
end
|
148
183
|
|
149
184
|
def stop()
|
150
|
-
|
185
|
+
|
151
186
|
@xiw.stop = true
|
152
187
|
@doc = Rexle.new(['xdrp', {}, '', *@a])
|
153
188
|
puts 'recording stopped'
|
154
|
-
|
189
|
+
|
155
190
|
end
|
156
191
|
|
157
192
|
def xml()
|
@@ -165,22 +200,44 @@ module Xdrp
|
|
165
200
|
@t1 = Time.now
|
166
201
|
end
|
167
202
|
|
203
|
+
def monitor_app()
|
204
|
+
|
205
|
+
win = @wm.windows.find {|x| x.active}
|
206
|
+
|
207
|
+
if win.title != @win_title then
|
208
|
+
@win_title = win.title
|
209
|
+
@a << [:window, {activate: win.title}]
|
210
|
+
end
|
211
|
+
|
212
|
+
end
|
213
|
+
|
168
214
|
end
|
169
215
|
|
170
216
|
class Player
|
217
|
+
using ColouredText
|
171
218
|
|
172
219
|
def initialize(src, debug: false)
|
173
220
|
|
174
221
|
@debug = debug
|
175
|
-
@doc =
|
222
|
+
@doc = Keystroker.new(src, debug: debug).to_doc
|
223
|
+
puts '@doc.xml: ' + @doc.xml if @debug
|
176
224
|
|
177
225
|
end
|
178
226
|
|
179
227
|
def play()
|
180
228
|
|
181
229
|
@doc.root.elements.each do |e|
|
182
|
-
|
183
|
-
|
230
|
+
|
231
|
+
if @debug then
|
232
|
+
puts ('e: ' + e.xml.inspect).debug
|
233
|
+
puts 'e.class: ' + e.class.inspect.debug
|
234
|
+
end
|
235
|
+
|
236
|
+
if e.attributes.any? then
|
237
|
+
method('xdo_' + e.name.to_s).call(**(e.attributes))
|
238
|
+
else
|
239
|
+
method('xdo_' + e.name.to_s).call(e.text)
|
240
|
+
end
|
184
241
|
end
|
185
242
|
|
186
243
|
end
|
@@ -192,30 +249,44 @@ module Xdrp
|
|
192
249
|
end
|
193
250
|
|
194
251
|
def xdo_mouse(click: 'left', x: 0, y: 0)
|
195
|
-
XDo::Mouse.click(x.to_i, y.to_i,
|
252
|
+
XDo::Mouse.click(x.to_i, y.to_i,
|
196
253
|
Object.const_get('XDo::Mouse::' + click.upcase))
|
197
254
|
end
|
198
255
|
|
199
256
|
def xdo_mousemove(x: 0, y: 0)
|
200
257
|
XDo::Mouse.move(x.to_i, y.to_i)
|
201
258
|
end
|
202
|
-
|
259
|
+
|
203
260
|
def xdo_mousewheel(scroll: 'down')
|
204
261
|
XDo::Mouse.wheel(Object.const_get('XDo::Mouse::' + scroll.upcase, 4))
|
205
|
-
end
|
262
|
+
end
|
206
263
|
|
207
264
|
def xdo_sleep(duration: 0)
|
208
265
|
sleep duration.to_f
|
209
266
|
end
|
210
267
|
|
211
|
-
def xdo_tab(
|
212
|
-
XDo::Keyboard.tab
|
268
|
+
def xdo_tab(times: 1)
|
269
|
+
times.to_i.times.each { XDo::Keyboard.tab }
|
213
270
|
end
|
214
271
|
|
215
272
|
def xdo_type(s)
|
216
273
|
XDo::Keyboard.simulate(s.gsub('{enter}', "\n"))
|
217
274
|
end
|
218
275
|
|
276
|
+
def xdo_window(activate: '')
|
277
|
+
|
278
|
+
if @debug then
|
279
|
+
puts 'inside xdo_window'
|
280
|
+
puts 'activate: ' + activate.inspect
|
281
|
+
end
|
282
|
+
|
283
|
+
wm = WMCtrl.display
|
284
|
+
window = wm.windows.find {|x| x.title == activate}
|
285
|
+
window.activate
|
286
|
+
|
287
|
+
end
|
288
|
+
|
289
|
+
|
219
290
|
end
|
220
291
|
|
221
292
|
end
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xdrp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Robertson
|
@@ -11,31 +11,31 @@ 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
|
+
YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjExMTAxMTkzMTE3WhcN
|
15
|
+
MjIxMTAxMTkzMTE3WjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
|
16
|
+
cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDBq+SP
|
17
|
+
QnR1vcCQZVU95UyLJG4NSloLn7bvAzcv5dc6maUjxQNCK19lqmPFTov6kJ1v3Rse
|
18
|
+
EEoBygKVXYIghuZalPo3Iw4II4gyBulgnJYc12BE2eBY+fKKJMylE3IEShrMWMfZ
|
19
|
+
Cy6WXP/bYJWG2k3KcUIl6BkA1gxS/5jx4Isq50AGSlE63Bl7t/GG0/as9fm2Hx76
|
20
|
+
zn/DEl5TDblrjAANqagyc7AmtDV4Nr1O4t+8ZZRVGMROyVNB4RVBD2lSyXfyinnw
|
21
|
+
l3NqidqLvktNdvluJXRIP4vihntOIjYc6iYRkvNVj6LcGU+9sQS7PHVYj7FNCR83
|
22
|
+
2S80UKPUVQ0UZT2zO54CxkzXp42DtNbp8jQL6uvGZZVJfkwl26+U25u+haw6UXXz
|
23
|
+
+XF1uHn1XIeER5ZCkLb0346/pTStjTY+6s8ys04ZILPELXC8l+g/qJp5d1ijy1Ds
|
24
|
+
yF10RS6na/RsMrK/U1tI17m3wEN1zcqGF0WUjSnzgt0uuGAed2tV26VtbzUCAwEA
|
25
|
+
AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUWfLEMLPX
|
26
|
+
b1jli6LK6oO9gasVnhEwJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
|
27
27
|
c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
28
|
+
BgkqhkiG9w0BAQsFAAOCAYEAbmb/xDn+Tk7hG9j0sMNcRtS9F5TjTFCmoSGksHOw
|
29
|
+
WFGQwycJLPiS7N0djam52fOasrGw+WJS/CpoWaPL4SsSgXLqBwYKJx0efczzpIF0
|
30
|
+
i3gUx5vIp+NtMHsK+TbTeFN+xZRZa29BpBnJHShKDtXlAgyg5if9KGhs0yaRIw2o
|
31
|
+
NiV3epZmnh/l19xhvutTnVyKmLLIxMaYFiswTe3Ndz012OPssS1kBaIcvh6WGFTq
|
32
|
+
Yg5Hf1Ukm77+O5GQkPe2nide1wCC+4yxq0YN6dcKXo+cEy3ZsYHNHQcBdQSK5Z5O
|
33
|
+
7xhvTr5OgQ5Mzf7c/1MPvbuGHnQUD+NrlrL+qf912M7V/LvjGiekfdOKfLEDIQXh
|
34
|
+
oLYMTazde9OcTI1yEfy+9EKOYzh/ss/nB7F56mvNVZUdSzKPUD2Q57UxdZsnEHEE
|
35
|
+
TiejpssCygWf9HFO3IZRrjH3OzSduilBf7oorCJZqxI5d7KbuK6ceM00aCBJibQO
|
36
|
+
K2bW5QcTuyp9GEliuroid41b
|
37
37
|
-----END CERTIFICATE-----
|
38
|
-
date:
|
38
|
+
date: 2021-11-16 00:00:00.000000000 Z
|
39
39
|
dependencies:
|
40
40
|
- !ruby/object:Gem::Dependency
|
41
41
|
name: xdo
|
@@ -61,44 +61,84 @@ dependencies:
|
|
61
61
|
name: rxfhelper
|
62
62
|
requirement: !ruby/object:Gem::Requirement
|
63
63
|
requirements:
|
64
|
-
- - ">="
|
65
|
-
- !ruby/object:Gem::Version
|
66
|
-
version: 1.0.0
|
67
64
|
- - "~>"
|
68
65
|
- !ruby/object:Gem::Version
|
69
|
-
version: '1.
|
66
|
+
version: '1.1'
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 1.1.3
|
70
70
|
type: :runtime
|
71
71
|
prerelease: false
|
72
72
|
version_requirements: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
74
|
-
- - ">="
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
version: 1.0.0
|
77
74
|
- - "~>"
|
78
75
|
- !ruby/object:Gem::Version
|
79
|
-
version: '1.
|
76
|
+
version: '1.1'
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: 1.1.3
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: xinput_wrapper
|
82
82
|
requirement: !ruby/object:Gem::Requirement
|
83
83
|
requirements:
|
84
|
+
- - "~>"
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0.8'
|
84
87
|
- - ">="
|
85
88
|
- !ruby/object:Gem::Version
|
86
|
-
version: 0.
|
89
|
+
version: 0.8.1
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0.8'
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: 0.8.1
|
100
|
+
- !ruby/object:Gem::Dependency
|
101
|
+
name: ruby-wmctrl
|
102
|
+
requirement: !ruby/object:Gem::Requirement
|
103
|
+
requirements:
|
87
104
|
- - "~>"
|
88
105
|
- !ruby/object:Gem::Version
|
89
|
-
version: '0.
|
106
|
+
version: '0.0'
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 0.0.8
|
90
110
|
type: :runtime
|
91
111
|
prerelease: false
|
92
112
|
version_requirements: !ruby/object:Gem::Requirement
|
93
113
|
requirements:
|
114
|
+
- - "~>"
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0.0'
|
117
|
+
- - ">="
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: 0.0.8
|
120
|
+
- !ruby/object:Gem::Dependency
|
121
|
+
name: keystroker
|
122
|
+
requirement: !ruby/object:Gem::Requirement
|
123
|
+
requirements:
|
124
|
+
- - "~>"
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '0.3'
|
94
127
|
- - ">="
|
95
128
|
- !ruby/object:Gem::Version
|
96
|
-
version: 0.
|
129
|
+
version: 0.3.1
|
130
|
+
type: :runtime
|
131
|
+
prerelease: false
|
132
|
+
version_requirements: !ruby/object:Gem::Requirement
|
133
|
+
requirements:
|
97
134
|
- - "~>"
|
98
135
|
- !ruby/object:Gem::Version
|
99
|
-
version: '0.
|
136
|
+
version: '0.3'
|
137
|
+
- - ">="
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: 0.3.1
|
100
140
|
description:
|
101
|
-
email:
|
141
|
+
email: digital.robertson@gmail.com
|
102
142
|
executables: []
|
103
143
|
extensions: []
|
104
144
|
extra_rdoc_files: []
|
@@ -116,14 +156,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
116
156
|
requirements:
|
117
157
|
- - ">="
|
118
158
|
- !ruby/object:Gem::Version
|
119
|
-
version:
|
159
|
+
version: 3.0.2
|
120
160
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
121
161
|
requirements:
|
122
162
|
- - ">="
|
123
163
|
- !ruby/object:Gem::Version
|
124
164
|
version: '0'
|
125
165
|
requirements: []
|
126
|
-
|
166
|
+
rubyforge_project:
|
167
|
+
rubygems_version: 2.7.10
|
127
168
|
signing_key:
|
128
169
|
specification_version: 4
|
129
170
|
summary: A basic macro recorder for GNU/Linux which uses program xinput to capture
|
metadata.gz.sig
CHANGED
Binary file
|