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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a991e73e2eace58e3f6732a6a0f39b12b9e968550c613977eeba03ec650dadda
4
- data.tar.gz: 8735f0050e321d7171558df00925b94f39ea307e6914f350fdcf69ed805002bc
3
+ metadata.gz: 04f4cb11433bf62016e1a4b8155c9a9e0526796599367280705eac2a47446735
4
+ data.tar.gz: fe2486a552f788a3d333e3e9b46dfb4d2ea6e8ee0d20d4228713deec05b943e1
5
5
  SHA512:
6
- metadata.gz: 104fcb225426e2c0310a33277ab82e9a174bfa38dd3212d3b9294f72561b48b8a9ec73860478bc9ab16f53deb6a1272c8d21ca0221c71fe797e571786f6983a8
7
- data.tar.gz: d5bf0fba767a5a1d1952cd2fd7f2fd4b9f033ac3c89b76dbfdc31ad5235a5ad0b3727e04437ddd5367eac27ccc256661959859cbd816708ab841588a4a61c524
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.4"
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
- # skip palm/begin record
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?(event)
43
- event.record.status == "end"
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?(event)
47
- event.record.status == "begin"
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 (keys = pressed_codes) && !keys.empty?
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.events.map(&:record).last&.status == "end"
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? || @keypress_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
@@ -3,7 +3,7 @@
3
3
  module Fusuma
4
4
  module Plugin
5
5
  module Thumbsense
6
- VERSION = "0.9.0"
6
+ VERSION = "0.12.0"
7
7
  end
8
8
  end
9
9
  end
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.9.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: 2024-09-14 00:00:00.000000000 Z
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: '0.4'
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: '0.4'
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: []