fusuma-plugin-sendkey 0.3.0 → 0.4.0
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
- data/.travis.yml +1 -1
- data/README.md +3 -3
- data/exe/fusuma-sendkey +1 -1
- data/fusuma-plugin-sendkey.gemspec +4 -5
- data/lib/fusuma/plugin/executors/sendkey_executor.rb +3 -3
- data/lib/fusuma/plugin/sendkey/device.rb +4 -17
- data/lib/fusuma/plugin/sendkey/keyboard.rb +46 -33
- data/lib/fusuma/plugin/sendkey/version.rb +1 -1
- metadata +11 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 23d68a2efd5f41fe72149b824d2ccb15d9153b70e177e0c6547c6fdc531d7015
|
4
|
+
data.tar.gz: 206d32b21db53813a0213aa6efa7f4005132332ad06f5d360bb57aed291bd61c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d8565fdb87ae1ed53a903587c45fc529b780983e845be2f81601e72160244de3852fdc63d8d1f9960cb20c30b82e86713a4c56c393064cf67e04548f1c187323
|
7
|
+
data.tar.gz: 84f81cc005e1cfe105844f0108241a8e4c2c99f454a2ae5dbfa52023c4c094efb534f87f7c6f6705647b5f4fd556387c8d3ef6def58a6141c39cc94faa6dd6a2
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# Fusuma::Plugin::Sendkey [](https://badge.fury.io/rb/fusuma-plugin-sendkey) [](https://travis-ci.com/iberianpig/fusuma-plugin-sendkey)
|
2
2
|
|
3
|
-
[Fusuma](https://github.com/iberianpig/fusuma) plugin
|
3
|
+
[Fusuma](https://github.com/iberianpig/fusuma) plugin to send keyboard events
|
4
4
|
|
5
|
-
*
|
5
|
+
* Emulate keyboard events with evdev
|
6
6
|
* This plugin is wayland compatible and alternative to xdotool
|
7
7
|
|
8
8
|
## Installation
|
@@ -12,7 +12,7 @@ Run the following code in your terminal.
|
|
12
12
|
### Install dependencies
|
13
13
|
|
14
14
|
```sh
|
15
|
-
$ sudo apt-get install libevdev-dev
|
15
|
+
$ sudo apt-get install libevdev-dev
|
16
16
|
```
|
17
17
|
|
18
18
|
### Install fusuma-plugin-sendkey
|
data/exe/fusuma-sendkey
CHANGED
@@ -10,8 +10,8 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.authors = ['iberianpig']
|
11
11
|
spec.email = ['yhkyky@gmail.com']
|
12
12
|
|
13
|
-
spec.summary = 'Fusuma plugin
|
14
|
-
spec.description = 'Fusuma::Plugin::Sendkey emulate keyboard events with
|
13
|
+
spec.summary = 'Fusuma plugin to send keyboard events'
|
14
|
+
spec.description = 'Fusuma::Plugin::Sendkey emulate keyboard events with evdev'
|
15
15
|
spec.homepage = 'https://github.com/iberianpig/fusuma-plugin-sendkey'
|
16
16
|
spec.license = 'MIT'
|
17
17
|
|
@@ -24,9 +24,8 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
25
25
|
spec.require_paths = ['lib']
|
26
26
|
|
27
|
-
spec.add_dependency '
|
28
|
-
spec.add_dependency '
|
29
|
-
spec.add_dependency 'linux_input', '~> 1.1'
|
27
|
+
spec.add_dependency 'fusuma', '~> 1.7'
|
28
|
+
spec.add_dependency 'revdev'
|
30
29
|
|
31
30
|
spec.add_development_dependency 'bundler'
|
32
31
|
spec.add_development_dependency 'github_changelog_generator', '~> 1.14'
|
@@ -9,7 +9,7 @@ module Fusuma
|
|
9
9
|
class SendkeyExecutor < Executor
|
10
10
|
def config_param_types
|
11
11
|
{
|
12
|
-
'
|
12
|
+
'device_name': String
|
13
13
|
}
|
14
14
|
end
|
15
15
|
|
@@ -39,8 +39,8 @@ module Fusuma
|
|
39
39
|
|
40
40
|
def keyboard
|
41
41
|
@keyboard ||= begin
|
42
|
-
|
43
|
-
Sendkey::Keyboard.new(
|
42
|
+
name_pattren = config_params(:device_name)
|
43
|
+
Sendkey::Keyboard.new(name_pattern: name_pattren)
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
@@ -1,23 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'evdev'
|
4
|
-
|
5
3
|
module Fusuma
|
6
4
|
module Plugin
|
7
5
|
module Sendkey
|
8
6
|
# handle Evdev device
|
9
7
|
class Device
|
10
|
-
def initialize(path:
|
11
|
-
|
12
|
-
|
13
|
-
(0..99).lazy.find do |i|
|
14
|
-
evdev = Evdev.new("/dev/input/event#{i}")
|
15
|
-
# NOTE: find keyboard device
|
16
|
-
@evdev = evdev if evdev.supports_event?('KEY_LEFTALT')
|
17
|
-
rescue Errno::ENOENT # No such file or directory
|
18
|
-
false
|
19
|
-
# TODO: rescue Errno::EACCES
|
20
|
-
end
|
8
|
+
def initialize(path:)
|
9
|
+
@evdev = Revdev::EventDevice.new(path)
|
21
10
|
end
|
22
11
|
|
23
12
|
def path
|
@@ -26,10 +15,8 @@ module Fusuma
|
|
26
15
|
@path ||= @evdev.file.path
|
27
16
|
end
|
28
17
|
|
29
|
-
def
|
30
|
-
@evdev.
|
31
|
-
rescue NameError
|
32
|
-
false
|
18
|
+
def write_event(event)
|
19
|
+
@evdev.write_input_event(event)
|
33
20
|
end
|
34
21
|
end
|
35
22
|
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require '
|
4
|
-
require '
|
3
|
+
require 'revdev'
|
4
|
+
require 'fusuma/device'
|
5
|
+
|
5
6
|
require_relative './device.rb'
|
6
7
|
|
7
8
|
module Fusuma
|
@@ -9,10 +10,20 @@ module Fusuma
|
|
9
10
|
module Sendkey
|
10
11
|
# Emulate Keyboard
|
11
12
|
class Keyboard
|
12
|
-
def initialize(
|
13
|
-
|
13
|
+
def initialize(name_pattern: nil)
|
14
|
+
name_pattern ||= 'keyboard'
|
15
|
+
device = find_device(name_pattern: name_pattern)
|
16
|
+
|
17
|
+
if device.nil?
|
18
|
+
warn "sendkey: Keyboard /#{name_pattern}/ is not found"
|
19
|
+
exit(1)
|
20
|
+
end
|
21
|
+
|
22
|
+
@device = Device.new(path: "/dev/input/#{device.id}")
|
14
23
|
end
|
15
24
|
|
25
|
+
attr_writer :device
|
26
|
+
|
16
27
|
# @param param [String]
|
17
28
|
def type(param:)
|
18
29
|
return unless param.is_a?(String)
|
@@ -24,7 +35,6 @@ module Fusuma
|
|
24
35
|
key_sync(press: true)
|
25
36
|
keycodes.reverse.map { |keycode| key_event(keycode: keycode, press: false) }
|
26
37
|
key_sync(press: false)
|
27
|
-
device_file.close
|
28
38
|
end
|
29
39
|
|
30
40
|
# @param param [String]
|
@@ -35,55 +45,54 @@ module Fusuma
|
|
35
45
|
keycodes.all? { |keycode| support?(keycode) }
|
36
46
|
end
|
37
47
|
|
38
|
-
def device_file
|
39
|
-
return @device_file if @device_file && !@device_file.closed?
|
40
|
-
|
41
|
-
@device_file = File.open(@device.path, Fcntl::O_WRONLY | Fcntl::O_NDELAY)
|
42
|
-
end
|
43
|
-
|
44
48
|
def key_event(keycode:, press: true)
|
45
|
-
event =
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
49
|
+
event = Revdev::InputEvent.new(
|
50
|
+
nil,
|
51
|
+
Revdev.const_get(:EV_KEY),
|
52
|
+
Revdev.const_get(keycode),
|
53
|
+
press ? 1 : 0
|
54
|
+
)
|
55
|
+
@device.write_event(event)
|
52
56
|
end
|
53
57
|
|
54
58
|
def key_sync(press: true)
|
55
|
-
event =
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
59
|
+
event = Revdev::InputEvent.new(
|
60
|
+
nil,
|
61
|
+
Revdev.const_get(:EV_SYN),
|
62
|
+
Revdev.const_get(:SYN_REPORT),
|
63
|
+
press ? 1 : 0
|
64
|
+
)
|
65
|
+
@device.write_event(event)
|
62
66
|
end
|
63
67
|
|
64
68
|
def support?(keycode)
|
65
69
|
@supported_code ||= {}
|
66
|
-
@supported_code[keycode] ||= if
|
70
|
+
@supported_code[keycode] ||= if find_code(keycode: keycode)
|
67
71
|
true
|
68
72
|
else
|
69
73
|
search_candidates(keycode: keycode)
|
70
|
-
exit(1)
|
71
74
|
end
|
72
75
|
end
|
73
76
|
|
74
77
|
def search_candidates(keycode:)
|
75
|
-
|
78
|
+
query = keycode&.upcase&.gsub('KEY_', '')
|
79
|
+
|
80
|
+
candidates = search_codes(query: query)
|
76
81
|
|
77
82
|
warn "Did you mean? #{candidates.join(' / ')}" unless candidates.empty?
|
78
83
|
warn "sendkey: #{remove_prefix(keycode)} is unsupported."
|
79
84
|
end
|
80
85
|
|
81
|
-
def search_codes(
|
86
|
+
def search_codes(query: nil)
|
87
|
+
Revdev.constants
|
88
|
+
.select { |c| c[/KEY_.*#{query}.*/] }
|
89
|
+
.map { |c| c.to_s.gsub('KEY_', '') }
|
90
|
+
end
|
91
|
+
|
92
|
+
def find_code(keycode: nil)
|
82
93
|
query = keycode&.upcase&.gsub('KEY_', '')
|
83
|
-
|
84
|
-
|
85
|
-
.select { |c| @device.support?(c) }
|
86
|
-
.map { |c| c.to_s.gsub('KEY_', '') }
|
94
|
+
|
95
|
+
Revdev.constants.find { |c| c == "KEY_#{query}".to_sym }
|
87
96
|
end
|
88
97
|
|
89
98
|
def keycode_const(keycode)
|
@@ -98,6 +107,10 @@ module Fusuma
|
|
98
107
|
|
99
108
|
private
|
100
109
|
|
110
|
+
def find_device(name_pattern:)
|
111
|
+
Fusuma::Device.all.find { |d| d.name.match(/#{name_pattern}/) }
|
112
|
+
end
|
113
|
+
|
101
114
|
def split_param(param)
|
102
115
|
param.split('+').map { |code| key_prefix(code) }
|
103
116
|
end
|
metadata
CHANGED
@@ -1,57 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fusuma-plugin-sendkey
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- iberianpig
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-03-
|
11
|
+
date: 2020-03-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: evdev
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1.0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '1.0'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: fusuma
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
30
16
|
requirements:
|
31
17
|
- - "~>"
|
32
18
|
- !ruby/object:Gem::Version
|
33
|
-
version: '1.
|
19
|
+
version: '1.7'
|
34
20
|
type: :runtime
|
35
21
|
prerelease: false
|
36
22
|
version_requirements: !ruby/object:Gem::Requirement
|
37
23
|
requirements:
|
38
24
|
- - "~>"
|
39
25
|
- !ruby/object:Gem::Version
|
40
|
-
version: '1.
|
26
|
+
version: '1.7'
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
28
|
+
name: revdev
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
44
30
|
requirements:
|
45
|
-
- - "
|
31
|
+
- - ">="
|
46
32
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
33
|
+
version: '0'
|
48
34
|
type: :runtime
|
49
35
|
prerelease: false
|
50
36
|
version_requirements: !ruby/object:Gem::Requirement
|
51
37
|
requirements:
|
52
|
-
- - "
|
38
|
+
- - ">="
|
53
39
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
40
|
+
version: '0'
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
42
|
name: bundler
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -192,7 +178,7 @@ dependencies:
|
|
192
178
|
- - ">="
|
193
179
|
- !ruby/object:Gem::Version
|
194
180
|
version: '0'
|
195
|
-
description: Fusuma::Plugin::Sendkey emulate keyboard events with
|
181
|
+
description: Fusuma::Plugin::Sendkey emulate keyboard events with evdev
|
196
182
|
email:
|
197
183
|
- yhkyky@gmail.com
|
198
184
|
executables:
|
@@ -241,5 +227,5 @@ requirements: []
|
|
241
227
|
rubygems_version: 3.0.3
|
242
228
|
signing_key:
|
243
229
|
specification_version: 4
|
244
|
-
summary: Fusuma plugin
|
230
|
+
summary: Fusuma plugin to send keyboard events
|
245
231
|
test_files: []
|