fusuma-plugin-sendkey 0.7.1 → 0.8.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/README.md +18 -1
- data/bin/console +3 -5
- data/lib/fusuma/plugin/executors/sendkey_executor.rb +23 -18
- data/lib/fusuma/plugin/sendkey/keyboard.rb +34 -10
- data/lib/fusuma/plugin/sendkey/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0512b4f118bd0b676616741f47a643a759d8eb123eb581bb3136b38a34f0acc4
|
4
|
+
data.tar.gz: 45cafd5f8b3f8cd1e44643c20438b04ce59065854548123285ea5eea1e5585fc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 264b5e7d2ae3729ccc1f3fe0db02dab1ee1999e089fab2cd2df9f97f3994ff0c20976e37a6e2105c141161dc70db20d4058098529bba5372427bfe242d6d10d5
|
7
|
+
data.tar.gz: b1cb6a075c279a15e63f7685d5887dc0b2c4c767915fb4066b2d929788b725c2d8127d766e5045ee5b1c49f2f40e9882793066e6607f56d2dae967347d89667a
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Fusuma::Plugin::Sendkey [](https://badge.fury.io/rb/fusuma-plugin-sendkey) [](https://badge.fury.io/rb/fusuma-plugin-sendkey) [](https://github.com/iberianpig/fusuma-plugin-sendkey/actions/workflows/main.yml)
|
2
2
|
|
3
3
|
[Fusuma](https://github.com/iberianpig/fusuma) plugin to send keyboard events
|
4
4
|
|
@@ -85,6 +85,20 @@ swipe:
|
|
85
85
|
sendkey: "LEFTCTRL+W" # close tab
|
86
86
|
```
|
87
87
|
|
88
|
+
### clearmodifiers
|
89
|
+
|
90
|
+
- `clearmodifiers: true` option clears other modifier keys before sending
|
91
|
+
|
92
|
+
```yaml
|
93
|
+
swipe:
|
94
|
+
4:
|
95
|
+
up:
|
96
|
+
keypress:
|
97
|
+
LEFTSHIFT:
|
98
|
+
sendkey: "LEFTMETA+DOWN"
|
99
|
+
clearmodifiers: true # clear LEFTSHIFT before sending LEFTMETA+DOWN
|
100
|
+
```
|
101
|
+
|
88
102
|
|
89
103
|
### Specify keyboard by device name
|
90
104
|
|
@@ -105,6 +119,9 @@ plugin:
|
|
105
119
|
device_name: 'YOUR KEYBOARD NAME'
|
106
120
|
```
|
107
121
|
|
122
|
+
**If [fusuma-plugin-remap](https://github.com/iberianpig/fusuma-plugin-remap) is available, it will be automatically connected to `fusuma_virtual_keyboard`, so `device_name` option is not required.**
|
123
|
+
|
124
|
+
|
108
125
|
## Contributing
|
109
126
|
|
110
127
|
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
@@ -4,9 +4,7 @@ require "bundler/setup"
|
|
4
4
|
require 'fusuma/plugin/executors/executor'
|
5
5
|
require "fusuma/plugin/sendkey"
|
6
6
|
|
7
|
-
|
8
|
-
# with your gem easier. You can also use a different console, if you like.
|
7
|
+
Fusuma::Plugin::Manager.require_base_plugins
|
9
8
|
|
10
|
-
|
11
|
-
|
12
|
-
Pry.start
|
9
|
+
require "irb"
|
10
|
+
IRB.start(__FILE__)
|
@@ -5,8 +5,13 @@ require_relative "../sendkey/keyboard"
|
|
5
5
|
module Fusuma
|
6
6
|
module Plugin
|
7
7
|
module Executors
|
8
|
-
#
|
8
|
+
# Execute to send key event to device
|
9
9
|
class SendkeyExecutor < Executor
|
10
|
+
def initialize
|
11
|
+
@device_name = config_params(:device_name)
|
12
|
+
super
|
13
|
+
end
|
14
|
+
|
10
15
|
def execute_keys
|
11
16
|
[:sendkey]
|
12
17
|
end
|
@@ -22,21 +27,10 @@ module Fusuma
|
|
22
27
|
# @return [nil]
|
23
28
|
def execute(event)
|
24
29
|
MultiLogger.info(sendkey: search_param(event))
|
25
|
-
pid = fork do
|
26
|
-
Process.daemon(true)
|
27
|
-
_execute(event)
|
28
|
-
end
|
29
|
-
|
30
|
-
Process.detach(pid)
|
31
|
-
end
|
32
|
-
|
33
|
-
# execute sendkey command
|
34
|
-
# @param event [Event]
|
35
|
-
# @return [nil]
|
36
|
-
def _execute(event)
|
37
30
|
keyboard.type(
|
38
31
|
param: search_param(event),
|
39
|
-
keep: search_keypress(event)
|
32
|
+
keep: search_keypress(event),
|
33
|
+
clear: clearmodifiers(event)
|
40
34
|
)
|
41
35
|
end
|
42
36
|
|
@@ -52,10 +46,7 @@ module Fusuma
|
|
52
46
|
private
|
53
47
|
|
54
48
|
def keyboard
|
55
|
-
@keyboard ||=
|
56
|
-
name_pattren = config_params(:device_name)
|
57
|
-
Sendkey::Keyboard.new(name_pattern: name_pattren)
|
58
|
-
end
|
49
|
+
@keyboard ||= Sendkey::Keyboard.new(name_pattern: @device_name)
|
59
50
|
end
|
60
51
|
|
61
52
|
def search_param(event)
|
@@ -63,14 +54,28 @@ module Fusuma
|
|
63
54
|
Config.search(index)
|
64
55
|
end
|
65
56
|
|
57
|
+
# search keypress from config for keep modifiers when sendkey
|
66
58
|
# @param event [Event]
|
67
59
|
# @return [String]
|
68
60
|
def search_keypress(event)
|
61
|
+
# if fusuma_virtual_keyboard exists, don't have to keep modifiers
|
62
|
+
return "" if keyboard.use_virtual_keyboard?
|
63
|
+
|
69
64
|
keys = event.record.index.keys
|
70
65
|
keypress_index = keys.find_index { |k| k.symbol == :keypress }
|
71
66
|
code = keypress_index && keys[keypress_index + 1].symbol
|
72
67
|
code.to_s
|
73
68
|
end
|
69
|
+
|
70
|
+
# clearmodifiers from config
|
71
|
+
# @param event [Event]
|
72
|
+
# @return [String, TrueClass, Symbole]
|
73
|
+
def clearmodifiers(event)
|
74
|
+
@clearmodifiers ||= {}
|
75
|
+
index = event.record.index
|
76
|
+
@clearmodifiers[index.cache_key] ||=
|
77
|
+
Config.search(Config::Index.new([*index.keys, "clearmodifiers"])) || :none
|
78
|
+
end
|
74
79
|
end
|
75
80
|
end
|
76
81
|
end
|
@@ -24,33 +24,57 @@ module Fusuma
|
|
24
24
|
KEY_RIGHTMETA
|
25
25
|
].freeze
|
26
26
|
|
27
|
+
DEFAULT_NAME_PATTERN = "keyboard|Keyboard|KEYBOARD"
|
28
|
+
VIRTUAL_KEYBOARD = "fusuma_virtual_keyboard" # fusuma-plugin-remap creates uinput device
|
29
|
+
|
27
30
|
def self.find_device(name_pattern:)
|
31
|
+
Fusuma::Device.reset
|
28
32
|
Fusuma::Device.all.find { |d| d.name.match(/#{name_pattern}/) }
|
29
33
|
end
|
30
34
|
|
31
35
|
def initialize(name_pattern: nil)
|
32
|
-
|
33
|
-
|
36
|
+
device = if name_pattern
|
37
|
+
Keyboard.find_device(name_pattern: name_pattern)
|
38
|
+
else
|
39
|
+
Keyboard.find_device(name_pattern: VIRTUAL_KEYBOARD) || Keyboard.find_device(name_pattern: DEFAULT_NAME_PATTERN)
|
40
|
+
end
|
34
41
|
|
35
42
|
if device.nil?
|
36
43
|
warn "sendkey: Keyboard: /#{name_pattern}/ is not found"
|
37
44
|
exit(1)
|
38
45
|
end
|
46
|
+
MultiLogger.info "sendkey: Keyboard: #{device.name}"
|
39
47
|
|
48
|
+
@use_virtual_keyboard = device.name.match(/#{VIRTUAL_KEYBOARD}/o)
|
40
49
|
@device = Device.new(path: "/dev/input/#{device.id}")
|
41
50
|
end
|
42
51
|
|
43
|
-
|
44
|
-
|
45
|
-
|
52
|
+
def use_virtual_keyboard?
|
53
|
+
@use_virtual_keyboard
|
54
|
+
end
|
55
|
+
|
56
|
+
# @param param [String] key names separated by '+' to type
|
57
|
+
# @param keep [String] key names separated by '+' to keep
|
58
|
+
# @param clear [String, Symbol, TrueClass] key names separated by '+' to clear or :all to relase all modifiers
|
59
|
+
def type(param:, keep: "", clear: :none)
|
46
60
|
return unless param.is_a?(String)
|
47
61
|
|
48
62
|
param_keycodes = param_to_keycodes(param)
|
49
|
-
|
63
|
+
type_keycodes = param_keycodes - param_to_keycodes(keep)
|
64
|
+
|
65
|
+
clear_keycodes =
|
66
|
+
case clear
|
67
|
+
when true
|
68
|
+
MODIFIER_KEY_CODES
|
69
|
+
when :none, false
|
70
|
+
[]
|
71
|
+
else
|
72
|
+
# release keys specified by clearmodifiers
|
73
|
+
param_to_keycodes(clear)
|
74
|
+
end
|
75
|
+
|
76
|
+
clear_modifiers(clear_keycodes - param_keycodes)
|
50
77
|
|
51
|
-
type_keycodes = param_keycodes - keep_keycodes
|
52
|
-
# release other modifier keys before sending key
|
53
|
-
clear_modifiers(MODIFIER_KEY_CODES - param_keycodes)
|
54
78
|
type_keycodes.each { |keycode| keydown(keycode) && key_sync }
|
55
79
|
type_keycodes.reverse_each { |keycode| keyup(keycode) && key_sync }
|
56
80
|
end
|
@@ -122,7 +146,7 @@ module Fusuma
|
|
122
146
|
end
|
123
147
|
|
124
148
|
def keycode_const(keycode)
|
125
|
-
Object.const_get "
|
149
|
+
Object.const_get "Revdev::#{keycode}"
|
126
150
|
end
|
127
151
|
|
128
152
|
# @param [Array<String>] keycodes to be released
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
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.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- iberianpig
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-08-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fusuma
|