fusuma-plugin-sendkey 0.7.1 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- 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 [![Gem Version](https://badge.fury.io/rb/fusuma-plugin-sendkey.svg)](https://badge.fury.io/rb/fusuma-plugin-sendkey) [![Build Status](https://
|
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://github.com/iberianpig/fusuma-plugin-sendkey/actions/workflows/main.yml/badge.svg)](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
|