fusuma-plugin-sendkey 0.2.1 → 0.6.0.pre
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/.rubocop.yml +17 -1
- data/.travis.yml +1 -1
- data/Gemfile +12 -0
- data/README.md +40 -8
- data/bin/console +3 -5
- data/exe/fusuma-sendkey +4 -4
- data/fusuma-plugin-sendkey.gemspec +4 -15
- data/lefthook.yml +29 -0
- data/lib/fusuma/plugin/executors/sendkey_executor.rb +30 -17
- data/lib/fusuma/plugin/sendkey/device.rb +5 -45
- data/lib/fusuma/plugin/sendkey/keyboard.rb +101 -24
- data/lib/fusuma/plugin/sendkey/version.rb +1 -1
- metadata +15 -154
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5f604b8593c06c599afd8bd3c14344fcb503e2ffacc48025550c78daa8b970ae
|
4
|
+
data.tar.gz: 80f5ed997dac202b7f86f2f518538cf6181e54ec84bb52d47e92412b77c1645f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ff64de3322846b3df4e476767a6ea78d406a773295d3c3c3b2997a13797468c3fc2cef4d46c82c6db325ba7513710bf797088c7199fcd4e26479cc35714071d7
|
7
|
+
data.tar.gz: 11cbe3e6612ae1e4f2d9f466c0a26283d2a144a1f369c19d9eb0414095e9508ad329278788ef6f58efeba8f8d47ad106ce113d1d2feba68edee49ef032d36287
|
data/.rubocop.yml
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
AllCops:
|
2
|
+
TargetRubyVersion: 2.4
|
3
|
+
NewCops: enable
|
4
|
+
Layout/BeginEndAlignment:
|
5
|
+
Enabled: true
|
6
|
+
Layout/EmptyLinesAroundAttributeAccessor:
|
7
|
+
Enabled: true
|
8
|
+
|
1
9
|
Metrics/ModuleLength:
|
2
10
|
Exclude:
|
3
11
|
- "**/*_spec.rb"
|
@@ -7,7 +15,15 @@ Metrics/BlockLength:
|
|
7
15
|
- "**/*_spec.rb"
|
8
16
|
- "fusuma-plugin-*.gemspec"
|
9
17
|
|
10
|
-
|
18
|
+
Layout/LineLength:
|
11
19
|
Max: 100
|
12
20
|
Exclude:
|
21
|
+
- "**/*_spec.rb"
|
13
22
|
- "fusuma-plugin-*.gemspec"
|
23
|
+
|
24
|
+
Style/HashEachMethods:
|
25
|
+
Enabled: true
|
26
|
+
Style/HashTransformKeys:
|
27
|
+
Enabled: true
|
28
|
+
Style/HashTransformValues:
|
29
|
+
Enabled: true
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
@@ -2,3 +2,15 @@ source "https://rubygems.org"
|
|
2
2
|
|
3
3
|
# Specify your gem's dependencies in fusuma-plugin-sendkey.gemspec
|
4
4
|
gemspec
|
5
|
+
|
6
|
+
gem 'bundler'
|
7
|
+
gem 'github_changelog_generator', '~> 1.14'
|
8
|
+
gem 'pry-byebug', '~> 3.4'
|
9
|
+
gem 'pry-doc'
|
10
|
+
gem 'pry-inline'
|
11
|
+
gem 'rake', '~> 13.0'
|
12
|
+
gem 'reek'
|
13
|
+
gem 'rspec', '~> 3.0'
|
14
|
+
gem 'rubocop'
|
15
|
+
gem 'yard'
|
16
|
+
gem 'lefthook'
|
data/README.md
CHANGED
@@ -1,9 +1,9 @@
|
|
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
|
-
*
|
6
|
-
*
|
5
|
+
* Low-latency key event emulation with evdev
|
6
|
+
* Alternative to xdotool available for X11 and Wayland
|
7
7
|
|
8
8
|
## Installation
|
9
9
|
|
@@ -11,8 +11,9 @@ Run the following code in your terminal.
|
|
11
11
|
|
12
12
|
### Install dependencies
|
13
13
|
|
14
|
+
**NOTE: If you have installed ruby by apt, you must install ruby-dev.**
|
14
15
|
```sh
|
15
|
-
$ sudo apt-get install
|
16
|
+
$ sudo apt-get install libevdev-dev ruby-dev build-essential
|
16
17
|
```
|
17
18
|
|
18
19
|
### Install fusuma-plugin-sendkey
|
@@ -22,22 +23,33 @@ $ sudo gem install fusuma-plugin-sendkey
|
|
22
23
|
```
|
23
24
|
|
24
25
|
|
25
|
-
## List
|
26
|
+
## List available keys
|
26
27
|
|
27
28
|
```sh
|
28
29
|
$ fusuma-sendkey -l
|
29
30
|
```
|
31
|
+
If you want to look up a specific key, like the next song or the previous song, the `grep -i` refinement search is useful.
|
32
|
+
|
33
|
+
```sh
|
34
|
+
$ fusuma-sendkey -l | grep -i song
|
35
|
+
NEXTSONG
|
36
|
+
PREVIOUSSONG
|
37
|
+
```
|
30
38
|
|
31
39
|
## Run fusuma-sendkey on Terminal
|
32
40
|
|
33
|
-
* `fusuma-sendkey`
|
34
|
-
*
|
41
|
+
* `fusuma-sendkey` command is available on your terminal
|
42
|
+
* `fusuma-sendkey` supports modifier keys and multiple key presses.
|
43
|
+
Combine keys for pressing the same time with `+`
|
35
44
|
|
36
45
|
|
37
46
|
```sh
|
38
|
-
$ fusuma-sendkey LEFTCTRL+T
|
47
|
+
$ fusuma-sendkey LEFTCTRL+T # press ctrl key + t key
|
39
48
|
```
|
40
49
|
|
50
|
+
Some of the keys found with `fusuma-sendkey -l` may actually be invalid keys.
|
51
|
+
So test it once with `fusuma-sendkey <KEYCODE>` and then add it to config.yml.
|
52
|
+
|
41
53
|
|
42
54
|
## Add sendkey properties to config.yml
|
43
55
|
|
@@ -58,6 +70,26 @@ swipe:
|
|
58
70
|
sendkey: "LEFTCTRL+W" # close tab
|
59
71
|
```
|
60
72
|
|
73
|
+
|
74
|
+
### Specify keyboard by device name
|
75
|
+
|
76
|
+
If you got following error message, try to set your keyboard name to `plugin.executors.sendkey_executor.device_name` on config.yml
|
77
|
+
|
78
|
+
```shell
|
79
|
+
$ fusuma-sendkey -l
|
80
|
+
sendkey: Keyboard: /keyboard|Keyboard|KEYBOARD/ is not found
|
81
|
+
```
|
82
|
+
|
83
|
+
Set the following options to recognize keyboard only for the specified keyboard device.
|
84
|
+
Open `~/.config/fusuma/config.yml` and add the following code at the bottom.
|
85
|
+
|
86
|
+
```yaml
|
87
|
+
plugin:
|
88
|
+
executors:
|
89
|
+
sendkey_executor:
|
90
|
+
device_name: 'YOUR KEYBOARD NAME'
|
91
|
+
```
|
92
|
+
|
61
93
|
## Contributing
|
62
94
|
|
63
95
|
Bug reports and pull requests are welcome on GitHub at https://github.com/iberianpig/fusuma-plugin-sendkey. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
data/bin/console
CHANGED
@@ -1,14 +1,12 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require "bundler/setup"
|
4
|
+
require 'fusuma/plugin/executors/executor'
|
4
5
|
require "fusuma/plugin/sendkey"
|
5
6
|
|
6
7
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
8
|
# with your gem easier. You can also use a different console, if you like.
|
8
9
|
|
9
10
|
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
require "irb"
|
14
|
-
IRB.start(__FILE__)
|
11
|
+
require "pry"
|
12
|
+
Pry.start
|
data/exe/fusuma-sendkey
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
require 'optparse'
|
5
|
+
require 'fusuma/plugin/inputs/libinput_command_input.rb'
|
5
6
|
require_relative '../lib/fusuma/plugin/sendkey/keyboard.rb'
|
6
7
|
require_relative '../lib/fusuma/plugin/sendkey/version.rb'
|
7
8
|
|
@@ -20,7 +21,7 @@ end
|
|
20
21
|
opt.parse!(ARGV)
|
21
22
|
|
22
23
|
if option[:list]
|
23
|
-
puts Fusuma::Plugin::Sendkey::Keyboard.new.
|
24
|
+
puts Fusuma::Plugin::Sendkey::Keyboard.new(name_pattern: nil).search_codes
|
24
25
|
return
|
25
26
|
end
|
26
27
|
|
@@ -37,6 +38,5 @@ if param.nil?
|
|
37
38
|
exit 1
|
38
39
|
end
|
39
40
|
|
40
|
-
Fusuma::Plugin::Sendkey::Keyboard.new
|
41
|
-
|
42
|
-
end
|
41
|
+
keyboard = Fusuma::Plugin::Sendkey::Keyboard.new
|
42
|
+
keyboard.valid?(param: param) && keyboard.type(param: param)
|
@@ -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,17 +24,6 @@ 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
|
-
|
30
|
-
spec.add_development_dependency 'bundler'
|
31
|
-
spec.add_development_dependency 'github_changelog_generator', '~> 1.14'
|
32
|
-
spec.add_development_dependency 'pry-byebug', '~> 3.4'
|
33
|
-
spec.add_development_dependency 'pry-doc'
|
34
|
-
spec.add_development_dependency 'pry-inline'
|
35
|
-
spec.add_development_dependency 'rake', '~> 13.0'
|
36
|
-
spec.add_development_dependency 'reek'
|
37
|
-
spec.add_development_dependency 'rspec', '~> 3.0'
|
38
|
-
spec.add_development_dependency 'rubocop'
|
39
|
-
spec.add_development_dependency 'yard'
|
27
|
+
spec.add_dependency 'fusuma', '~> 2.0.0.pre'
|
28
|
+
spec.add_dependency 'revdev'
|
40
29
|
end
|
data/lefthook.yml
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# EXAMPLE USAGE
|
2
|
+
# Refer for explanation to following link:
|
3
|
+
# https://github.com/Arkweid/lefthook/blob/master/docs/full_guide.md
|
4
|
+
|
5
|
+
# pre-push:
|
6
|
+
# commands:
|
7
|
+
# packages-audit:
|
8
|
+
# tags: frontend security
|
9
|
+
# run: yarn audit
|
10
|
+
# gems-audit:
|
11
|
+
# tags: backend security
|
12
|
+
# run: bundle audit
|
13
|
+
|
14
|
+
pre-commit:
|
15
|
+
parallel: true
|
16
|
+
commands:
|
17
|
+
# eslint:
|
18
|
+
# glob: "*.{js,ts}"
|
19
|
+
# run: yarn eslint {staged_files}
|
20
|
+
rubocop:
|
21
|
+
tags: backend style
|
22
|
+
glob: "*.rb"
|
23
|
+
# exclude: "application.rb|routes.rb"
|
24
|
+
run: bundle exec rubocop --force-exclusion {staged_files}
|
25
|
+
# scripts:
|
26
|
+
# "hello.js":
|
27
|
+
# runner: node
|
28
|
+
# "any.go":
|
29
|
+
# runner: go run
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative '../sendkey/keyboard
|
3
|
+
require_relative '../sendkey/keyboard'
|
4
4
|
|
5
5
|
module Fusuma
|
6
6
|
module Plugin
|
@@ -9,51 +9,64 @@ 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
|
|
16
|
-
# execute sendkey command
|
16
|
+
# fork and execute sendkey command
|
17
17
|
# @param event [Event]
|
18
18
|
# @return [nil]
|
19
19
|
def execute(event)
|
20
|
-
return if search_command(event).nil?
|
21
|
-
|
22
20
|
MultiLogger.info(sendkey: search_param(event))
|
23
21
|
pid = fork do
|
24
22
|
Process.daemon(true)
|
25
|
-
|
23
|
+
_execute(event)
|
26
24
|
end
|
27
25
|
|
28
26
|
Process.detach(pid)
|
29
27
|
end
|
30
28
|
|
29
|
+
# execute sendkey command
|
30
|
+
# @param event [Event]
|
31
|
+
# @return [nil]
|
32
|
+
def _execute(event)
|
33
|
+
keyboard.type(
|
34
|
+
param: search_param(event),
|
35
|
+
keep: search_keypress(event)
|
36
|
+
)
|
37
|
+
end
|
38
|
+
|
31
39
|
# check executable
|
32
40
|
# @param event [Event]
|
33
41
|
# @return [TrueClass, FalseClass]
|
34
42
|
def executable?(event)
|
35
43
|
event.tag.end_with?('_detector') &&
|
36
44
|
event.record.type == :index &&
|
37
|
-
|
45
|
+
keyboard.valid?(param: search_param(event))
|
38
46
|
end
|
39
47
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
def search_command(event)
|
48
|
+
private
|
49
|
+
|
50
|
+
def keyboard
|
44
51
|
@keyboard ||= begin
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
@keyboard.type_command(param: search_param(event))
|
52
|
+
name_pattren = config_params(:device_name)
|
53
|
+
Sendkey::Keyboard.new(name_pattern: name_pattren)
|
54
|
+
end
|
49
55
|
end
|
50
56
|
|
51
|
-
private
|
52
|
-
|
53
57
|
def search_param(event)
|
54
58
|
index = Config::Index.new([*event.record.index.keys, :sendkey])
|
55
59
|
Config.search(index)
|
56
60
|
end
|
61
|
+
|
62
|
+
# @param event [Event]
|
63
|
+
# @return [String]
|
64
|
+
def search_keypress(event)
|
65
|
+
keys = event.record.index.keys
|
66
|
+
keypress_index = keys.find_index { |k| k.symbol == :keypress }
|
67
|
+
code = keypress_index && keys[keypress_index + 1].symbol
|
68
|
+
code.to_s
|
69
|
+
end
|
57
70
|
end
|
58
71
|
end
|
59
72
|
end
|
@@ -1,62 +1,22 @@
|
|
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
|
-
|
11
|
-
|
12
|
-
return if path && (@evdev = Evdev.new(path))
|
13
|
-
|
14
|
-
(0..99).lazy.find do |i|
|
15
|
-
begin
|
16
|
-
evdev = Evdev.new("/dev/input/event#{i}")
|
17
|
-
@evdev = evdev if evdev.supports_event?(convert_keycode('LEFTALT'))
|
18
|
-
rescue Errno::ENOENT # No such file or directory
|
19
|
-
false
|
20
|
-
# TODO: rescue Errno::EACCES
|
21
|
-
end
|
22
|
-
end
|
8
|
+
def initialize(path:)
|
9
|
+
@evdev = Revdev::EventDevice.new(path)
|
23
10
|
end
|
24
11
|
|
25
12
|
def path
|
26
|
-
raise '
|
13
|
+
raise 'Device path is not found' if @evdev.nil?
|
27
14
|
|
28
15
|
@path ||= @evdev.file.path
|
29
16
|
end
|
30
17
|
|
31
|
-
def
|
32
|
-
|
33
|
-
@evdev.supports_event?(keycode)
|
34
|
-
rescue NameError
|
35
|
-
candidates = search_codes(code: code)
|
36
|
-
|
37
|
-
warn "Did you mean? #{candidates.join(' / ')}" unless candidates.empty?
|
38
|
-
|
39
|
-
false
|
40
|
-
end
|
41
|
-
|
42
|
-
def search_codes(code: nil)
|
43
|
-
query = code&.upcase
|
44
|
-
LinuxInput.constants
|
45
|
-
.select { |c| c[/KEY_.*#{query}.*/] }
|
46
|
-
.select { |c| @evdev.supports_event?(c) }
|
47
|
-
.map { |c| c.to_s.gsub('KEY_', '') }
|
48
|
-
end
|
49
|
-
|
50
|
-
def emulate(code:, press: true)
|
51
|
-
keycode = convert_keycode(code)
|
52
|
-
v = press ? 1 : 0
|
53
|
-
"evemu-event #{path} --type EV_KEY --code #{keycode} --value #{v} --sync"
|
54
|
-
end
|
55
|
-
|
56
|
-
private
|
57
|
-
|
58
|
-
def convert_keycode(code)
|
59
|
-
"KEY_#{code.upcase}"
|
18
|
+
def write_event(event)
|
19
|
+
@evdev.write_input_event(event)
|
60
20
|
end
|
61
21
|
end
|
62
22
|
end
|
@@ -1,52 +1,129 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require 'revdev'
|
4
|
+
require 'fusuma/device'
|
5
|
+
|
6
|
+
require_relative './device'
|
4
7
|
|
5
8
|
module Fusuma
|
6
9
|
module Plugin
|
7
10
|
module Sendkey
|
8
11
|
# Emulate Keyboard
|
9
12
|
class Keyboard
|
10
|
-
def initialize(
|
11
|
-
|
13
|
+
def initialize(name_pattern: nil)
|
14
|
+
name_pattern ||= 'keyboard|Keyboard|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}")
|
12
23
|
end
|
13
24
|
|
25
|
+
attr_reader :device
|
26
|
+
|
14
27
|
# @param param [String]
|
15
|
-
|
28
|
+
# @param keep [String]
|
29
|
+
def type(param:, keep: '')
|
16
30
|
return unless param.is_a?(String)
|
17
31
|
|
18
|
-
|
19
|
-
|
20
|
-
release_commands = codes.reverse.map { |code| release_command(code) }
|
32
|
+
keep_keycodes = split_param(keep)
|
33
|
+
keycodes = split_param(param) - keep_keycodes
|
21
34
|
|
22
|
-
(
|
35
|
+
clear_modifiers(keep_keycodes)
|
36
|
+
keycodes.each { |keycode| key_event(keycode: keycode, press: true) }
|
37
|
+
key_sync(press: true)
|
38
|
+
keycodes.reverse.map { |keycode| key_event(keycode: keycode, press: false) }
|
39
|
+
key_sync(press: false)
|
23
40
|
end
|
24
41
|
|
25
|
-
|
26
|
-
|
42
|
+
# @param param [String]
|
43
|
+
def valid?(param:)
|
44
|
+
return unless param.is_a?(String)
|
27
45
|
|
28
|
-
|
46
|
+
keycodes = split_param(param)
|
47
|
+
keycodes.all? { |keycode| support?(keycode) }
|
29
48
|
end
|
30
49
|
|
31
|
-
def
|
32
|
-
|
50
|
+
def key_event(keycode:, press: true)
|
51
|
+
event = Revdev::InputEvent.new(
|
52
|
+
nil,
|
53
|
+
Revdev.const_get(:EV_KEY),
|
54
|
+
Revdev.const_get(keycode),
|
55
|
+
press ? 1 : 0
|
56
|
+
)
|
57
|
+
@device.write_event(event)
|
58
|
+
end
|
33
59
|
|
34
|
-
|
60
|
+
def key_sync(press: true)
|
61
|
+
event = Revdev::InputEvent.new(
|
62
|
+
nil,
|
63
|
+
Revdev.const_get(:EV_SYN),
|
64
|
+
Revdev.const_get(:SYN_REPORT),
|
65
|
+
press ? 1 : 0
|
66
|
+
)
|
67
|
+
@device.write_event(event)
|
35
68
|
end
|
36
69
|
|
37
|
-
def support?(
|
70
|
+
def support?(keycode)
|
38
71
|
@supported_code ||= {}
|
39
|
-
@supported_code[
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
72
|
+
@supported_code[keycode] ||= if find_code(keycode: keycode)
|
73
|
+
true
|
74
|
+
else
|
75
|
+
search_candidates(keycode: keycode)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def search_candidates(keycode:)
|
80
|
+
query = keycode&.upcase&.gsub('KEY_', '')
|
81
|
+
|
82
|
+
candidates = search_codes(query: query)
|
83
|
+
|
84
|
+
warn "Did you mean? #{candidates.join(' / ')}" unless candidates.empty?
|
85
|
+
warn "sendkey: #{remove_prefix(keycode)} is unsupported."
|
86
|
+
end
|
87
|
+
|
88
|
+
def search_codes(query: nil)
|
89
|
+
Revdev.constants
|
90
|
+
.select { |c| c[/KEY_.*#{query}.*/] }
|
91
|
+
.map { |c| c.to_s.gsub('KEY_', '') }
|
92
|
+
end
|
93
|
+
|
94
|
+
def find_code(keycode: nil)
|
95
|
+
query = keycode&.upcase&.gsub('KEY_', '')
|
96
|
+
|
97
|
+
Revdev.constants.find { |c| c == "KEY_#{query}".to_sym }
|
98
|
+
end
|
99
|
+
|
100
|
+
def keycode_const(keycode)
|
101
|
+
Object.const_get "LinuxInput::#{keycode}"
|
102
|
+
end
|
103
|
+
|
104
|
+
def clear_modifiers(keycodes)
|
105
|
+
modifiers = %w[ CAPSLOCK LEFTALT LEFTCTRL LEFTMETA
|
106
|
+
LEFTSHIFT RIGHTALT RIGHTCTRL RIGHTSHIFT ]
|
107
|
+
.map { |code| key_prefix(code) }
|
108
|
+
(modifiers - keycodes).each { |code| key_event(keycode: code, press: false) }
|
109
|
+
end
|
110
|
+
|
111
|
+
private
|
112
|
+
|
113
|
+
def find_device(name_pattern:)
|
114
|
+
Fusuma::Device.all.find { |d| d.name.match(/#{name_pattern}/) }
|
115
|
+
end
|
116
|
+
|
117
|
+
def split_param(param)
|
118
|
+
param.split('+').map { |code| key_prefix(code) }
|
119
|
+
end
|
120
|
+
|
121
|
+
def key_prefix(code)
|
122
|
+
"KEY_#{code.upcase}"
|
46
123
|
end
|
47
124
|
|
48
|
-
def
|
49
|
-
|
125
|
+
def remove_prefix(keycode)
|
126
|
+
keycode.gsub('KEY_', '')
|
50
127
|
end
|
51
128
|
end
|
52
129
|
end
|
metadata
CHANGED
@@ -1,184 +1,44 @@
|
|
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.6.0.pre
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- iberianpig
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-11-09 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: '0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '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:
|
19
|
+
version: 2.0.0.pre
|
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:
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: bundler
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: github_changelog_generator
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '1.14'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '1.14'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: pry-byebug
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - "~>"
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '3.4'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - "~>"
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '3.4'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: pry-doc
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: pry-inline
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - ">="
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '0'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - ">="
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '0'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: rake
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - "~>"
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '13.0'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - "~>"
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '13.0'
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: reek
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - ">="
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: '0'
|
132
|
-
type: :development
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - ">="
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: '0'
|
139
|
-
- !ruby/object:Gem::Dependency
|
140
|
-
name: rspec
|
141
|
-
requirement: !ruby/object:Gem::Requirement
|
142
|
-
requirements:
|
143
|
-
- - "~>"
|
144
|
-
- !ruby/object:Gem::Version
|
145
|
-
version: '3.0'
|
146
|
-
type: :development
|
147
|
-
prerelease: false
|
148
|
-
version_requirements: !ruby/object:Gem::Requirement
|
149
|
-
requirements:
|
150
|
-
- - "~>"
|
151
|
-
- !ruby/object:Gem::Version
|
152
|
-
version: '3.0'
|
26
|
+
version: 2.0.0.pre
|
153
27
|
- !ruby/object:Gem::Dependency
|
154
|
-
name:
|
28
|
+
name: revdev
|
155
29
|
requirement: !ruby/object:Gem::Requirement
|
156
30
|
requirements:
|
157
31
|
- - ">="
|
158
32
|
- !ruby/object:Gem::Version
|
159
33
|
version: '0'
|
160
|
-
type: :
|
161
|
-
prerelease: false
|
162
|
-
version_requirements: !ruby/object:Gem::Requirement
|
163
|
-
requirements:
|
164
|
-
- - ">="
|
165
|
-
- !ruby/object:Gem::Version
|
166
|
-
version: '0'
|
167
|
-
- !ruby/object:Gem::Dependency
|
168
|
-
name: yard
|
169
|
-
requirement: !ruby/object:Gem::Requirement
|
170
|
-
requirements:
|
171
|
-
- - ">="
|
172
|
-
- !ruby/object:Gem::Version
|
173
|
-
version: '0'
|
174
|
-
type: :development
|
34
|
+
type: :runtime
|
175
35
|
prerelease: false
|
176
36
|
version_requirements: !ruby/object:Gem::Requirement
|
177
37
|
requirements:
|
178
38
|
- - ">="
|
179
39
|
- !ruby/object:Gem::Version
|
180
40
|
version: '0'
|
181
|
-
description: Fusuma::Plugin::Sendkey emulate keyboard events with
|
41
|
+
description: Fusuma::Plugin::Sendkey emulate keyboard events with evdev
|
182
42
|
email:
|
183
43
|
- yhkyky@gmail.com
|
184
44
|
executables:
|
@@ -200,6 +60,7 @@ files:
|
|
200
60
|
- bin/setup
|
201
61
|
- exe/fusuma-sendkey
|
202
62
|
- fusuma-plugin-sendkey.gemspec
|
63
|
+
- lefthook.yml
|
203
64
|
- lib/fusuma/plugin/executors/sendkey_executor.rb
|
204
65
|
- lib/fusuma/plugin/sendkey.rb
|
205
66
|
- lib/fusuma/plugin/sendkey/device.rb
|
@@ -209,7 +70,7 @@ homepage: https://github.com/iberianpig/fusuma-plugin-sendkey
|
|
209
70
|
licenses:
|
210
71
|
- MIT
|
211
72
|
metadata: {}
|
212
|
-
post_install_message:
|
73
|
+
post_install_message:
|
213
74
|
rdoc_options: []
|
214
75
|
require_paths:
|
215
76
|
- lib
|
@@ -220,12 +81,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
220
81
|
version: '0'
|
221
82
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
222
83
|
requirements:
|
223
|
-
- - "
|
84
|
+
- - ">"
|
224
85
|
- !ruby/object:Gem::Version
|
225
|
-
version:
|
86
|
+
version: 1.3.1
|
226
87
|
requirements: []
|
227
|
-
rubygems_version: 3.
|
228
|
-
signing_key:
|
88
|
+
rubygems_version: 3.1.4
|
89
|
+
signing_key:
|
229
90
|
specification_version: 4
|
230
|
-
summary: Fusuma plugin
|
91
|
+
summary: Fusuma plugin to send keyboard events
|
231
92
|
test_files: []
|