fusuma-plugin-sendkey 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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 [![Gem Version](https://badge.fury.io/rb/fusuma-plugin-sendkey.svg)](https://badge.fury.io/rb/fusuma-plugin-sendkey) [![Build Status](https://travis-ci.com/iberianpig/fusuma-plugin-sendkey.svg?branch=master)](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: []
|