fusuma-plugin-thumbsense 0.9.0 → 0.12.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/fusuma-plugin-thumbsense.gemspec +1 -1
- data/lib/fusuma/plugin/buffers/thumbsense_buffer.rb +9 -8
- data/lib/fusuma/plugin/detectors/thumbsense_detector.rb +29 -10
- data/lib/fusuma/plugin/inputs/pointing_stick_input.rb +4 -0
- data/lib/fusuma/plugin/thumbsense/version.rb +1 -1
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 04f4cb11433bf62016e1a4b8155c9a9e0526796599367280705eac2a47446735
|
4
|
+
data.tar.gz: fe2486a552f788a3d333e3e9b46dfb4d2ea6e8ee0d20d4228713deec05b943e1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: efa45c56517dce953e877b77808b10ce9d7ab1824fa91a616b961306997c9499dfc771b4ce4d4516730cdbc1481dcdae09b4ce3fce8997844a50e3ed4cf79a9e
|
7
|
+
data.tar.gz: 3e4c3f38c2bf24b9ffb31b407760f50b8aecc3b982ad35540ec80d73acf01faeb3d3d12e85239c78f7ed8f65c93930a372abf941344c56b6d3c006d31184c622
|
@@ -26,7 +26,7 @@ Gem::Specification.new do |spec|
|
|
26
26
|
# support focal (20.04LTS) 2.7
|
27
27
|
spec.add_dependency "fusuma", ">= 3.2"
|
28
28
|
spec.add_dependency "fusuma-plugin-keypress", ">= 0.11"
|
29
|
-
spec.add_dependency "fusuma-plugin-remap", ">= 0.
|
29
|
+
spec.add_dependency "fusuma-plugin-remap", ">= 0.11.0"
|
30
30
|
spec.metadata = {
|
31
31
|
"rubygems_mfa_required" => "true"
|
32
32
|
}
|
@@ -18,10 +18,7 @@ module Fusuma
|
|
18
18
|
def clear_expired(*)
|
19
19
|
return if @events.empty?
|
20
20
|
|
21
|
-
|
22
|
-
return if !ended?(@events.last)
|
23
|
-
|
24
|
-
clear
|
21
|
+
clear if ended? || cancelled?
|
25
22
|
end
|
26
23
|
|
27
24
|
# @param event [Event]
|
@@ -39,12 +36,16 @@ module Fusuma
|
|
39
36
|
@events.map { |e| e.record.finger }.max
|
40
37
|
end
|
41
38
|
|
42
|
-
def ended?
|
43
|
-
|
39
|
+
def ended?
|
40
|
+
@events.last.record.status == "end"
|
41
|
+
end
|
42
|
+
|
43
|
+
def cancelled?
|
44
|
+
@events.last.record.status == "cancelled"
|
44
45
|
end
|
45
46
|
|
46
|
-
def begin?
|
47
|
-
|
47
|
+
def begin?
|
48
|
+
@events.last.record.status == "begin"
|
48
49
|
end
|
49
50
|
end
|
50
51
|
end
|
@@ -43,22 +43,22 @@ module Fusuma
|
|
43
43
|
# touch is released => remove thumbsense context
|
44
44
|
# keypress -> touch => remove thumbsense context
|
45
45
|
if touch_released? && !thumbsense_layer?
|
46
|
-
MultiLogger.debug("thumbsense layer removed")
|
47
46
|
layer_manager.send_layer(layer: LAYER_CONTEXT, remove: true)
|
48
47
|
return
|
49
48
|
end
|
50
49
|
|
50
|
+
before_tap, after_tap = partition_keypress_with_first_tap
|
51
|
+
|
51
52
|
# When keypress event is first:
|
52
53
|
# If current layer is thumbsense, the layer should not be changed
|
53
54
|
# If current layer is not thumbsense, it should remain a normal key
|
54
55
|
# In other words, if the key event comes first, do nothing
|
55
|
-
if keypress_first?
|
56
|
+
if keypress_first?(before_tap)
|
56
57
|
MultiLogger.debug("keypress event is first")
|
57
58
|
|
58
59
|
return
|
59
60
|
end
|
60
61
|
|
61
|
-
MultiLogger.debug("thumbsense context created") unless thumbsense_layer?
|
62
62
|
layer_manager.send_layer(layer: LAYER_CONTEXT)
|
63
63
|
|
64
64
|
# create thumbsense context
|
@@ -69,9 +69,11 @@ module Fusuma
|
|
69
69
|
)
|
70
70
|
)
|
71
71
|
|
72
|
+
keys = pressed_codes(@keypress_buffer.events.map(&:record))
|
73
|
+
|
72
74
|
# TODO: Threshold
|
73
75
|
# create remap index
|
74
|
-
index = if (
|
76
|
+
index = if !pressed_codes(after_tap).empty?
|
75
77
|
MultiLogger.debug("thumbsense remap index created: #{keys}")
|
76
78
|
combined_keys = keys.join("+")
|
77
79
|
create_event(
|
@@ -94,8 +96,7 @@ module Fusuma
|
|
94
96
|
end
|
95
97
|
|
96
98
|
# @return [Array<String>]
|
97
|
-
def pressed_codes
|
98
|
-
records = @keypress_buffer.events.map(&:record)
|
99
|
+
def pressed_codes(records)
|
99
100
|
codes = []
|
100
101
|
records.each do |r|
|
101
102
|
if r.status == "pressed"
|
@@ -111,7 +112,7 @@ module Fusuma
|
|
111
112
|
def touch_released?
|
112
113
|
return true if @thumbsense_buffer.empty?
|
113
114
|
|
114
|
-
@thumbsense_buffer.
|
115
|
+
@thumbsense_buffer.ended? || @thumbsense_buffer.cancelled?
|
115
116
|
end
|
116
117
|
|
117
118
|
# @return [TrueClass, FalseClass]
|
@@ -133,15 +134,33 @@ module Fusuma
|
|
133
134
|
# @param thumbsense_buffer [Buffer]
|
134
135
|
# @return [TrueClass] if keypress event is first
|
135
136
|
# @return [FalseClass] if keypress event is NOT first or buffers are empty
|
136
|
-
def keypress_first?
|
137
|
-
return false if @thumbsense_buffer.empty? ||
|
137
|
+
def keypress_first?(keypress_records)
|
138
|
+
return false if @thumbsense_buffer.empty? || keypress_records.empty?
|
138
139
|
|
139
|
-
if (keys = pressed_codes) && !keys.empty?
|
140
|
+
if (keys = pressed_codes(keypress_records)) && !keys.empty?
|
140
141
|
return false if MODIFIER_KEYS.include?(keys.first)
|
141
142
|
end
|
142
143
|
|
143
144
|
@keypress_buffer.events.first.time < @thumbsense_buffer.events.first.time
|
144
145
|
end
|
146
|
+
|
147
|
+
def partition_keypress_with_first_tap
|
148
|
+
return [], [] if @thumbsense_buffer.empty?
|
149
|
+
|
150
|
+
first_tap_time = @thumbsense_buffer.events.first.time
|
151
|
+
|
152
|
+
before_tap = []
|
153
|
+
after_tap = []
|
154
|
+
|
155
|
+
@keypress_buffer.events.each do |event|
|
156
|
+
if event.time < first_tap_time
|
157
|
+
before_tap << event.record
|
158
|
+
else
|
159
|
+
after_tap << event.record
|
160
|
+
end
|
161
|
+
end
|
162
|
+
[before_tap, after_tap]
|
163
|
+
end
|
145
164
|
end
|
146
165
|
end
|
147
166
|
end
|
@@ -35,12 +35,16 @@ module Fusuma
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def process_device_events(writer)
|
38
|
+
# If device_name_pattern is not set, this plugin is not used, so block the thread.
|
39
|
+
sleep if @device_name_pattern.nil?
|
40
|
+
|
38
41
|
hidraw_device = find_hidraw_device(@device_name_pattern, wait: 3)
|
39
42
|
hidraw_parser = select_hidraw_parser(hidraw_device.bustype)
|
40
43
|
|
41
44
|
mouse_state = nil
|
42
45
|
|
43
46
|
hidraw_parser.new(hidraw_device).parse do |new_state|
|
47
|
+
# Write state to pipe only when it changes
|
44
48
|
next if mouse_state == new_state
|
45
49
|
|
46
50
|
mouse_state = new_state
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
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.12.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- iberianpig
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2025-05-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fusuma
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 0.11.0
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 0.11.0
|
55
55
|
description: fusuma-plugin-thumbsense is Fusuma plugin for thumbsense.
|
56
56
|
email:
|
57
57
|
- yhkyky@gmail.com
|
@@ -79,7 +79,7 @@ licenses:
|
|
79
79
|
- MIT
|
80
80
|
metadata:
|
81
81
|
rubygems_mfa_required: 'true'
|
82
|
-
post_install_message:
|
82
|
+
post_install_message:
|
83
83
|
rdoc_options: []
|
84
84
|
require_paths:
|
85
85
|
- lib
|
@@ -95,7 +95,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
95
95
|
version: '0'
|
96
96
|
requirements: []
|
97
97
|
rubygems_version: 3.4.19
|
98
|
-
signing_key:
|
98
|
+
signing_key:
|
99
99
|
specification_version: 4
|
100
100
|
summary: Thumbsense plugin for Fusuma
|
101
101
|
test_files: []
|