fusuma-plugin-thumbsense 0.1.5 → 0.3.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 +1 -1
- data/fusuma-plugin-thumbsense.gemspec +1 -1
- data/lib/fusuma/plugin/detectors/thumbsense_detector.rb +44 -43
- data/lib/fusuma/plugin/thumbsense/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5494b5713dbb7f0c3662a93c3a966654088ab3f0f18995d3d8800636b5c047ef
|
|
4
|
+
data.tar.gz: ddd397cc8989c331a6ed9be6f362d775ef7ef93647567902cb85a96e28013a68
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5c36d63723ec56dc2ab0f17a7f8d7de68a56e5956215a9abd5b04f2213589bd1df47c659de0a9067523fd744192540eb663653059479e44d6f92208fab795e46
|
|
7
|
+
data.tar.gz: 12d14e2f883e3d8e3bf824388ba494a0527f0076b38040abea187aa6883cbc9d219d9cdbcb251c59a77dbf13d439ee6d87a72ed2db9f4e794a1e88e90e9d3e1c
|
data/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Fusuma::Plugin::Thumbsense [](https://badge.fury.io/rb/fusuma-plugin-thumbsense) [](https://badge.fury.io/rb/fusuma-plugin-thumbsense) [](https://github.com/iberianpig/fusuma-plugin-thumbsense/actions/workflows/main.yml)
|
|
2
2
|
|
|
3
3
|
**THIS PLUGIN IS EXPERIMENTAL.**
|
|
4
4
|
|
|
@@ -23,7 +23,7 @@ Gem::Specification.new do |spec|
|
|
|
23
23
|
|
|
24
24
|
spec.required_ruby_version = ">= 2.5.1" # https://packages.ubuntu.com/search?keywords=ruby&searchon=names&exact=1&suite=all§ion=main
|
|
25
25
|
# support bionic (18.04LTS) 2.5.1
|
|
26
|
-
spec.add_dependency "fusuma", "
|
|
26
|
+
spec.add_dependency "fusuma", ">= 2.0"
|
|
27
27
|
spec.add_dependency "fusuma-plugin-keypress", ">= 0.5"
|
|
28
28
|
spec.add_dependency "fusuma-plugin-remap"
|
|
29
29
|
spec.metadata = {
|
|
@@ -10,7 +10,7 @@ module Fusuma
|
|
|
10
10
|
module Detectors
|
|
11
11
|
# Detect Thumbsense context and change remap layer of fusuma-plugin-remap
|
|
12
12
|
class ThumbsenseDetector < Detector
|
|
13
|
-
SOURCES = %w[thumbsense
|
|
13
|
+
SOURCES = %w[thumbsense keypress].freeze
|
|
14
14
|
BUFFER_TYPE = "thumbsense"
|
|
15
15
|
|
|
16
16
|
MODIFIER_KEYS = Set.new(%w[
|
|
@@ -25,8 +25,11 @@ module Fusuma
|
|
|
25
25
|
RIGHTMETA
|
|
26
26
|
])
|
|
27
27
|
|
|
28
|
+
LAYER_CONTEXT = {thumbsense: true}.freeze
|
|
29
|
+
|
|
30
|
+
# Detect Context event and change remap layer of fusuma-plugin-remap
|
|
28
31
|
# @param buffers [Array<Buffer>]
|
|
29
|
-
# @return [Event] if
|
|
32
|
+
# @return [Event] if Thumbsense context is detected
|
|
30
33
|
# @return [NilClass] if event is NOT detected
|
|
31
34
|
def detect(buffers)
|
|
32
35
|
thumbsense_buffer = buffers.find { |b| b.type == BUFFER_TYPE }
|
|
@@ -36,57 +39,38 @@ module Fusuma
|
|
|
36
39
|
MultiLogger.debug("thumbsense_buffer: #{thumbsense_buffer.events.map(&:record).map { |r| "#{r.finger} #{r.gesture} #{r.status}" }}")
|
|
37
40
|
|
|
38
41
|
layer_manager = Fusuma::Plugin::Remap::LayerManager.instance
|
|
39
|
-
layer = {thumbsense: true}
|
|
40
42
|
|
|
41
43
|
if touch_released?(thumbsense_buffer)
|
|
42
|
-
layer_manager.send_layer(layer:
|
|
44
|
+
layer_manager.send_layer(layer: LAYER_CONTEXT, remove: true)
|
|
43
45
|
return
|
|
44
46
|
end
|
|
45
47
|
|
|
46
48
|
keypress_buffer = buffers.find { |b| b.type == "keypress" }
|
|
49
|
+
|
|
50
|
+
# If only modifier keys are pressed or no key is pressed
|
|
47
51
|
if pressed_codes(keypress_buffer).all? { |code| MODIFIER_KEYS.include?(code) }
|
|
48
52
|
|
|
49
53
|
# Even if the palm is detected, keep the thumbsense layer until `:end` event
|
|
50
54
|
if palm_detected?(thumbsense_buffer)
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
if hold_events.empty? || hold_events.last.record.status != "begin"
|
|
54
|
-
layer_manager.send_layer(layer: layer, remove: true)
|
|
55
|
-
return
|
|
56
|
-
end
|
|
55
|
+
layer_manager.send_layer(layer: LAYER_CONTEXT, remove: true)
|
|
56
|
+
return
|
|
57
57
|
end
|
|
58
58
|
|
|
59
|
-
layer_manager.send_layer(layer:
|
|
60
|
-
# FIXME: create thumbsense context
|
|
61
|
-
# record = Events::Records::ContextRecord.new(
|
|
62
|
-
# name: "thumbsense",
|
|
63
|
-
# value: true
|
|
64
|
-
# )
|
|
65
|
-
# return create_event(record: record)
|
|
66
|
-
end
|
|
67
|
-
nil
|
|
68
|
-
end
|
|
59
|
+
layer_manager.send_layer(layer: LAYER_CONTEXT)
|
|
69
60
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
61
|
+
# create thumbsense context
|
|
62
|
+
record = Events::Records::ContextRecord.new(
|
|
63
|
+
name: :thumbsense,
|
|
64
|
+
value: true
|
|
65
|
+
)
|
|
66
|
+
return create_event(record: record)
|
|
67
|
+
end
|
|
75
68
|
|
|
76
|
-
|
|
77
|
-
# @param context [Hash]
|
|
78
|
-
def remove_layer
|
|
79
|
-
Fusuma::Plugin::Remap::Layer.remove({thumbsense: true})
|
|
69
|
+
nil
|
|
80
70
|
end
|
|
81
71
|
|
|
82
72
|
private
|
|
83
73
|
|
|
84
|
-
def fetch_hold_events(buffers)
|
|
85
|
-
buffers.find { |b| b.type == "gesture" }
|
|
86
|
-
.select_from_last_begin
|
|
87
|
-
.select_by_events { |e| e.record.gesture == "hold" }.events
|
|
88
|
-
end
|
|
89
|
-
|
|
90
74
|
def pressed_codes(keypress_buffer)
|
|
91
75
|
records = keypress_buffer.events.map(&:record)
|
|
92
76
|
codes = []
|
|
@@ -113,15 +97,32 @@ module Fusuma
|
|
|
113
97
|
touch_num <= release_num
|
|
114
98
|
end
|
|
115
99
|
|
|
100
|
+
# Detect palm, except when there is another touch
|
|
101
|
+
# @param thumbsense_buffer [Buffer]
|
|
102
|
+
# @return [TrueClass, FalseClass]
|
|
116
103
|
def palm_detected?(thumbsense_buffer)
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
104
|
+
# finger is a number to distinguish different touches and palms
|
|
105
|
+
# If the count remains, it is judged as a touch state
|
|
106
|
+
touch_state_per_finger = {}
|
|
107
|
+
thumbsense_buffer.events.each do |e|
|
|
108
|
+
f = e.record.finger
|
|
109
|
+
touch_state_per_finger[f] ||= 0
|
|
110
|
+
|
|
111
|
+
case e.record.status
|
|
112
|
+
when "begin"
|
|
113
|
+
touch_state_per_finger[f] += 1
|
|
114
|
+
when "palm"
|
|
115
|
+
if touch_state_per_finger[f] < 0
|
|
116
|
+
# NOTE: If Palm continues, it is equivalent to end
|
|
117
|
+
touch_state_per_finger[f] = 0
|
|
118
|
+
else
|
|
119
|
+
touch_state_per_finger[f] -= 1
|
|
120
|
+
end
|
|
121
|
+
when "end"
|
|
122
|
+
touch_state_per_finger[f] = 0
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
touch_state_per_finger.values.all?(&:zero?)
|
|
125
126
|
end
|
|
126
127
|
end
|
|
127
128
|
end
|
metadata
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: fusuma-plugin-thumbsense
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- iberianpig
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-
|
|
11
|
+
date: 2023-08-20 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: fusuma
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
|
-
- - "
|
|
17
|
+
- - ">="
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
19
|
version: '2.0'
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
|
-
- - "
|
|
24
|
+
- - ">="
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
26
|
version: '2.0'
|
|
27
27
|
- !ruby/object:Gem::Dependency
|