fusuma-plugin-keypress 0.4.2 → 0.6.1
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 +2 -1
- data/fusuma-plugin-keypress.gemspec +19 -17
- data/lib/fusuma/plugin/buffers/keypress_buffer.rb +2 -2
- data/lib/fusuma/plugin/detectors/keypress_detector.rb +46 -13
- data/lib/fusuma/plugin/events/records/keypress_record.rb +1 -0
- data/lib/fusuma/plugin/filters/keypress_filter.rb +48 -2
- data/lib/fusuma/plugin/keypress/version.rb +1 -1
- data/lib/fusuma/plugin/keypress.rb +6 -6
- data/lib/fusuma/plugin/parsers/keypress_parser.rb +3 -17
- metadata +6 -13
- data/spec/fusuma/plugin/detectors/keypress_detector_spec.rb +0 -66
- data/spec/fusuma/plugin/keypress_spec.rb +0 -9
- data/spec/helpers/config_helper.rb +0 -16
- data/spec/spec_helper.rb +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d551f984dfdbac5d6095387156cf211450a23e45701737713cc5c5be261081d2
|
4
|
+
data.tar.gz: e3446a313462ad562e0dd4eabb112c1e3d39735523315c0e34f90c51b12ad655
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 69a1272b0938d590b72d8b94fcab0d37fdb6af71111e936e1e817a8acffca0c05a9907795027e796d081731a605b719e8999125d0124cb657996d95379340dd8
|
7
|
+
data.tar.gz: 7e26101b157dd1fcef0d061c3666a9c23402434667054a98e829f9969f8f1391e3c8c108d49220a7e8b9433b831b6507a4b543cbdb5a5c4b1334b456621292ea
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Fusuma::Plugin::Keypress [](https://badge.fury.io/rb/fusuma-plugin-keypress) [](https://badge.fury.io/rb/fusuma-plugin-keypress) [](https://github.com/iberianpig/fusuma-plugin-keypress/actions/workflows/ubuntu.yml)
|
2
2
|
|
3
3
|
|
4
4
|
Keyboard + Touchpad combination plugin for [Fusuma](https://github.com/iberianpig/fusuma)
|
@@ -33,6 +33,7 @@ plugin:
|
|
33
33
|
|
34
34
|
## Properties
|
35
35
|
|
36
|
+
### Keypress
|
36
37
|
Add `keypress:` property in `~/.config/fusuma/config.yml`.
|
37
38
|
|
38
39
|
Keys following are available for `keypress`.
|
@@ -1,28 +1,30 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
lib = File.expand_path(
|
3
|
+
lib = File.expand_path("lib", __dir__)
|
4
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
-
require
|
5
|
+
require "fusuma/plugin/keypress/version"
|
6
6
|
|
7
7
|
Gem::Specification.new do |spec|
|
8
|
-
spec.name
|
9
|
-
spec.version
|
10
|
-
spec.authors
|
11
|
-
spec.email
|
8
|
+
spec.name = "fusuma-plugin-keypress"
|
9
|
+
spec.version = Fusuma::Plugin::Keypress::VERSION
|
10
|
+
spec.authors = ["iberianpig"]
|
11
|
+
spec.email = ["yhkyky@gmail.com"]
|
12
12
|
|
13
|
-
spec.summary
|
14
|
-
spec.description
|
15
|
-
spec.homepage
|
16
|
-
spec.license
|
13
|
+
spec.summary = "Keypress plugin for Fusuma "
|
14
|
+
spec.description = "fusuma-plugin-keypress is Fusuma plugin for keypress combination."
|
15
|
+
spec.homepage = "https://github.com/iberianpig/fusuma-plugin-keypress"
|
16
|
+
spec.license = "MIT"
|
17
17
|
|
18
18
|
# Specify which files should be added to the gem when it is released.
|
19
|
-
spec.files
|
20
|
-
spec.
|
21
|
-
spec.
|
22
|
-
spec.
|
23
|
-
spec.require_paths = ['lib']
|
19
|
+
spec.files = Dir["{bin,lib,exe}/**/*", "LICENSE*", "README*", "*.gemspec"]
|
20
|
+
spec.bindir = "exe"
|
21
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
|
+
spec.require_paths = ["lib"]
|
24
23
|
|
25
|
-
spec.required_ruby_version =
|
24
|
+
spec.required_ruby_version = ">= 2.5.1" # https://packages.ubuntu.com/search?keywords=ruby&searchon=names&exact=1&suite=all§ion=main
|
26
25
|
# support bionic (18.04LTS) 2.5.1
|
27
|
-
spec.add_dependency
|
26
|
+
spec.add_dependency "fusuma", "~> 2.0"
|
27
|
+
spec.metadata = {
|
28
|
+
"rubygems_mfa_required" => "true"
|
29
|
+
}
|
28
30
|
end
|
@@ -5,7 +5,7 @@ module Fusuma
|
|
5
5
|
module Buffers
|
6
6
|
# Buffer events having KeypressRecord
|
7
7
|
class KeypressBuffer < Buffer
|
8
|
-
DEFAULT_SOURCE =
|
8
|
+
DEFAULT_SOURCE = "keypress_parser"
|
9
9
|
|
10
10
|
# @param event [Event]
|
11
11
|
def buffer(event)
|
@@ -30,7 +30,7 @@ module Fusuma
|
|
30
30
|
private
|
31
31
|
|
32
32
|
def released?
|
33
|
-
true if @events.last.record.status
|
33
|
+
true if /released/.match?(@events.last.record.status)
|
34
34
|
end
|
35
35
|
end
|
36
36
|
end
|
@@ -1,12 +1,26 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "set"
|
4
|
+
|
3
5
|
module Fusuma
|
4
6
|
module Plugin
|
5
7
|
module Detectors
|
6
8
|
# Detect KeypressEvent from KeypressBuffer
|
7
9
|
class KeypressDetector < Detector
|
8
|
-
SOURCES = [
|
9
|
-
BUFFER_TYPE =
|
10
|
+
SOURCES = %w[keypress].freeze
|
11
|
+
BUFFER_TYPE = "keypress"
|
12
|
+
|
13
|
+
MODIFIER_KEYS = Set.new(%w[
|
14
|
+
CAPSLOCK
|
15
|
+
LEFTALT
|
16
|
+
LEFTCTRL
|
17
|
+
LEFTMETA
|
18
|
+
LEFTSHIFT
|
19
|
+
RIGHTALT
|
20
|
+
RIGHTCTRL
|
21
|
+
RIGHTSHIFT
|
22
|
+
RIGHTMETA
|
23
|
+
])
|
10
24
|
|
11
25
|
# Always watch buffers and detect them.
|
12
26
|
def watch?
|
@@ -17,28 +31,47 @@ module Fusuma
|
|
17
31
|
# @return [Event] if event is detected
|
18
32
|
# @return [NilClass] if event is NOT detected
|
19
33
|
def detect(buffers)
|
20
|
-
|
34
|
+
keypress_buffer = find_buffer(buffers)
|
21
35
|
|
22
|
-
return if
|
36
|
+
return if keypress_buffer.empty?
|
23
37
|
|
24
|
-
|
38
|
+
codes = pressed_codes(keypress_buffer.events.map(&:record))
|
25
39
|
|
26
|
-
|
27
|
-
|
40
|
+
return unless codes.any? { |code| MODIFIER_KEYS.include?(code) }
|
41
|
+
|
42
|
+
record = Events::Records::IndexRecord.new(
|
43
|
+
index: create_index(codes: codes),
|
28
44
|
position: :surfix
|
29
45
|
)
|
30
46
|
|
31
|
-
create_event(record:
|
47
|
+
create_event(record: record)
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def find_buffer(buffers)
|
53
|
+
buffers.find { |b| b.type == BUFFER_TYPE }
|
54
|
+
end
|
55
|
+
|
56
|
+
def pressed_codes(records)
|
57
|
+
codes = []
|
58
|
+
records.each do |r|
|
59
|
+
if r.status == "pressed"
|
60
|
+
codes << r.code
|
61
|
+
else
|
62
|
+
codes.delete_if { |code| code == r.code }
|
63
|
+
end
|
64
|
+
end
|
65
|
+
codes
|
32
66
|
end
|
33
67
|
|
34
|
-
# @param
|
68
|
+
# @param code [String]
|
35
69
|
# @return [Config::Index]
|
36
|
-
def create_index(
|
37
|
-
code = records.map(&:code).join('+')
|
70
|
+
def create_index(codes:)
|
38
71
|
Config::Index.new(
|
39
72
|
[
|
40
|
-
Config::Index::Key.new(
|
41
|
-
Config::Index::Key.new(
|
73
|
+
Config::Index::Key.new("keypress", skippable: true),
|
74
|
+
Config::Index::Key.new(codes.join("+"), skippable: true)
|
42
75
|
]
|
43
76
|
)
|
44
77
|
end
|
@@ -1,16 +1,62 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "fusuma/device"
|
4
|
+
|
3
5
|
module Fusuma
|
4
6
|
module Plugin
|
5
7
|
module Filters
|
6
8
|
# Filter keyboard events from libinput_command_input
|
7
9
|
class KeypressFilter < Filter
|
8
|
-
DEFAULT_SOURCE =
|
10
|
+
DEFAULT_SOURCE = "libinput_command_input"
|
11
|
+
|
12
|
+
def config_param_types
|
13
|
+
{
|
14
|
+
source: String,
|
15
|
+
keep_device_names: [Array, String]
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
# NOTE: example of line# Select keyboard devices for filtering devices pressed/released
|
20
|
+
# event4 KEYBOARD_KEY +4.81s KEY_LEFTSHIFT (42) pressed
|
21
|
+
# event4 KEYBOARD_KEY +4.90s KEY_LEFTSHIFT (42) released
|
22
|
+
# event4 KEYBOARD_KEY +7.39s KEY_CAPSLOCK (58) pressed
|
23
|
+
# event4 KEYBOARD_KEY +7.52s KEY_CAPSLOCK (58) released
|
24
|
+
# event4 KEYBOARD_KEY +8.98s KEY_LEFTCTRL (29) pressed
|
25
|
+
# event4 KEYBOARD_KEY +9.14s KEY_LEFTCTRL (29) released
|
9
26
|
|
10
27
|
# @return [TrueClass] when keeping it
|
11
28
|
# @return [FalseClass] when discarding it
|
12
29
|
def keep?(record)
|
13
|
-
|
30
|
+
keep_devices.any? do |d|
|
31
|
+
record.to_s =~ /#{d.id}\s+KEYBOARD_KEY\s/
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
# @return [Array<Fusuma::Device>]
|
38
|
+
def keep_devices
|
39
|
+
@keep_devices ||= KeepDevice.new(config_params(:keep_device_names)).select
|
40
|
+
end
|
41
|
+
|
42
|
+
# Devices to detect key presses and releases
|
43
|
+
class KeepDevice
|
44
|
+
def initialize(names)
|
45
|
+
@names = names
|
46
|
+
end
|
47
|
+
|
48
|
+
# @return [Array<Fusuma::Device>]
|
49
|
+
def select
|
50
|
+
if @names
|
51
|
+
Fusuma::Device.all.select do |d|
|
52
|
+
Array(config_params(:keep_device_names)).any? do |name|
|
53
|
+
d.name =~ name
|
54
|
+
end
|
55
|
+
end
|
56
|
+
else
|
57
|
+
Fusuma::Device.all.select { |d| d.capabilities =~ /keyboard/ }
|
58
|
+
end
|
59
|
+
end
|
14
60
|
end
|
15
61
|
end
|
16
62
|
end
|
@@ -2,9 +2,9 @@
|
|
2
2
|
|
3
3
|
# fusuma will `require fusuma-plugin-xxxx/plugin/xxxx.rb`
|
4
4
|
|
5
|
-
require_relative
|
6
|
-
require_relative
|
7
|
-
require_relative
|
8
|
-
require_relative
|
9
|
-
require_relative
|
10
|
-
require_relative
|
5
|
+
require_relative "./keypress/version"
|
6
|
+
require_relative "./events/records/keypress_record"
|
7
|
+
require_relative "./filters/keypress_filter"
|
8
|
+
require_relative "./parsers/keypress_parser"
|
9
|
+
require_relative "./buffers/keypress_buffer"
|
10
|
+
require_relative "./detectors/keypress_detector"
|
@@ -5,19 +5,7 @@ module Fusuma
|
|
5
5
|
module Parsers
|
6
6
|
# Generate KeypressRecord from libinput_command_input
|
7
7
|
class KeypressParser < Parser
|
8
|
-
DEFAULT_SOURCE =
|
9
|
-
|
10
|
-
AVAILABLE_KEYS = %w[
|
11
|
-
CAPSLOCK
|
12
|
-
LEFTALT
|
13
|
-
LEFTCTRL
|
14
|
-
LEFTMETA
|
15
|
-
LEFTSHIFT
|
16
|
-
RIGHTALT
|
17
|
-
RIGHTCTRL
|
18
|
-
RIGHTSHIFT
|
19
|
-
RIGHTMETA
|
20
|
-
].freeze
|
8
|
+
DEFAULT_SOURCE = "libinput_command_input"
|
21
9
|
|
22
10
|
# @param record [String]
|
23
11
|
# @return [Records::Gesture, nil]
|
@@ -36,17 +24,15 @@ module Fusuma
|
|
36
24
|
when /KEYBOARD_KEY.+(\d+\.\d+)s.*KEY_([A-Z]+).*(pressed|released)/
|
37
25
|
matched = Regexp.last_match
|
38
26
|
# time = matched[1] # 4.81
|
39
|
-
code = matched[2]
|
27
|
+
code = matched[2] # LEFTSHIFT
|
40
28
|
status = matched[3] # pressed
|
41
29
|
|
42
|
-
return unless AVAILABLE_KEYS.include?(code)
|
43
|
-
|
44
30
|
Events::Records::KeypressRecord.new(status: status, code: code)
|
45
31
|
end
|
46
32
|
end
|
47
33
|
|
48
34
|
def tag
|
49
|
-
|
35
|
+
"keypress_parser"
|
50
36
|
end
|
51
37
|
end
|
52
38
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fusuma-plugin-keypress
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.1
|
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: 2022-12-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fusuma
|
@@ -43,14 +43,11 @@ files:
|
|
43
43
|
- lib/fusuma/plugin/keypress.rb
|
44
44
|
- lib/fusuma/plugin/keypress/version.rb
|
45
45
|
- lib/fusuma/plugin/parsers/keypress_parser.rb
|
46
|
-
- spec/fusuma/plugin/detectors/keypress_detector_spec.rb
|
47
|
-
- spec/fusuma/plugin/keypress_spec.rb
|
48
|
-
- spec/helpers/config_helper.rb
|
49
|
-
- spec/spec_helper.rb
|
50
46
|
homepage: https://github.com/iberianpig/fusuma-plugin-keypress
|
51
47
|
licenses:
|
52
48
|
- MIT
|
53
|
-
metadata:
|
49
|
+
metadata:
|
50
|
+
rubygems_mfa_required: 'true'
|
54
51
|
post_install_message:
|
55
52
|
rdoc_options: []
|
56
53
|
require_paths:
|
@@ -66,12 +63,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
66
63
|
- !ruby/object:Gem::Version
|
67
64
|
version: '0'
|
68
65
|
requirements: []
|
69
|
-
rubygems_version: 3.
|
66
|
+
rubygems_version: 3.3.26
|
70
67
|
signing_key:
|
71
68
|
specification_version: 4
|
72
69
|
summary: Keypress plugin for Fusuma
|
73
|
-
test_files:
|
74
|
-
- spec/fusuma/plugin/detectors/keypress_detector_spec.rb
|
75
|
-
- spec/fusuma/plugin/keypress_spec.rb
|
76
|
-
- spec/helpers/config_helper.rb
|
77
|
-
- spec/spec_helper.rb
|
70
|
+
test_files: []
|
@@ -1,66 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
require 'fusuma/plugin/detectors/detector'
|
6
|
-
require 'fusuma/plugin/buffers/buffer'
|
7
|
-
|
8
|
-
require './lib/fusuma/plugin/buffers/keypress_buffer'
|
9
|
-
require './lib/fusuma/plugin/detectors/keypress_detector'
|
10
|
-
|
11
|
-
module Fusuma
|
12
|
-
module Plugin
|
13
|
-
module Detectors
|
14
|
-
RSpec.describe KeypressDetector do
|
15
|
-
before do
|
16
|
-
@detector = KeypressDetector.new
|
17
|
-
@buffer = Buffers::KeypressBuffer.new
|
18
|
-
end
|
19
|
-
|
20
|
-
describe '#detector' do
|
21
|
-
context 'with no keypress event in buffer' do
|
22
|
-
before do
|
23
|
-
@buffer.clear
|
24
|
-
end
|
25
|
-
|
26
|
-
it { expect(@detector.detect([@buffer])).to eq nil }
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
context 'with keypress events in buffer' do
|
31
|
-
before do
|
32
|
-
record = Events::Records::KeypressRecord.new(status: 'pressed', code: 'LEFTSHIFT')
|
33
|
-
event = Events::Event.new(tag: 'keypress_parser', record: record)
|
34
|
-
|
35
|
-
@buffer.buffer(event)
|
36
|
-
end
|
37
|
-
it { expect(@detector.detect([@buffer])).to be_a Events::Event }
|
38
|
-
it { expect(@detector.detect([@buffer]).record).to be_a Events::Records::IndexRecord }
|
39
|
-
it { expect(@detector.detect([@buffer]).record.index).to be_a Config::Index }
|
40
|
-
|
41
|
-
it 'should detect LEFTSHIFT' do
|
42
|
-
expect(@detector.detect([@buffer]).record.index.keys.map(&:symbol))
|
43
|
-
.to eq(%i[keypress LEFTSHIFT])
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
context 'with two different keypress events in buffer' do
|
48
|
-
before do
|
49
|
-
record1 = Events::Records::KeypressRecord.new(status: 'pressed', code: 'LEFTSHIFT')
|
50
|
-
record2 = Events::Records::KeypressRecord.new(status: 'pressed', code: 'LEFTCTRL')
|
51
|
-
event1 = Events::Event.new(tag: 'keypress_parser', record: record1)
|
52
|
-
event2 = Events::Event.new(tag: 'keypress_parser', record: record2)
|
53
|
-
|
54
|
-
@buffer.buffer(event1)
|
55
|
-
@buffer.buffer(event2)
|
56
|
-
end
|
57
|
-
|
58
|
-
it 'should detect LEFTSHIFT+LEFTCTRL' do
|
59
|
-
expect(@detector.detect([@buffer]).record.index.keys.map(&:symbol))
|
60
|
-
.to eq(%i[keypress LEFTSHIFT+LEFTCTRL])
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'tempfile'
|
4
|
-
require 'fusuma/config'
|
5
|
-
|
6
|
-
module Fusuma
|
7
|
-
module ConfigHelper
|
8
|
-
module_function
|
9
|
-
|
10
|
-
def load_config_yml=(string)
|
11
|
-
Config.custom_path = Tempfile.open do |temp_file|
|
12
|
-
temp_file.tap { |f| f.write(string) }
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
data/spec/spec_helper.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'bundler/setup'
|
4
|
-
require 'helpers/config_helper'
|
5
|
-
|
6
|
-
RSpec.configure do |config|
|
7
|
-
# Enable flags like --only-failures and --next-failure
|
8
|
-
config.example_status_persistence_file_path = '.rspec_status'
|
9
|
-
|
10
|
-
# Disable RSpec exposing methods globally on `Module` and `main`
|
11
|
-
config.disable_monkey_patching!
|
12
|
-
|
13
|
-
config.expect_with :rspec do |c|
|
14
|
-
c.syntax = :expect
|
15
|
-
end
|
16
|
-
|
17
|
-
config.include(Fusuma::ConfigHelper)
|
18
|
-
end
|