Class: Fusuma::Plugin::Parsers::TapParser

Inherits:
Parser
  • Object
show all
Defined in:
lib/fusuma/plugin/parsers/tap_parser.rb

Overview

parse libinput and generate event

Constant Summary collapse

DEFAULT_SOURCE =
'libinput_command_input'
STATE =

TAP_STATE_IDLE = 4,

TAP_STATE_TOUCH,
TAP_STATE_HOLD,
TAP_STATE_TAPPED,
TAP_STATE_TOUCH_2,
TAP_STATE_TOUCH_2_HOLD,
TAP_STATE_TOUCH_2_RELEASE,
TAP_STATE_TOUCH_3,
TAP_STATE_TOUCH_3_HOLD,
TAP_STATE_DRAGGING_OR_DOUBLETAP,
TAP_STATE_DRAGGING_OR_TAP,
TAP_STATE_DRAGGING,
TAP_STATE_DRAGGING_WAIT,
TAP_STATE_DRAGGING_2,
TAP_STATE_DEAD
{
  idle: 'TAP_STATE_IDLE',
  holds: %w[
    TAP_STATE_TOUCH_3_HOLD
    TAP_STATE_TOUCH_2_HOLD
    TAP_STATE_HOLD
    TAP_STATE_DEAD
  ],
  touches: %w[
    TAP_STATE_TOUCH_3
    TAP_STATE_TOUCH_2
    TAP_STATE_TOUCH
    TAP_STATE_DEAD
  ],
  releases: %w[
    TAP_STATE_TOUCH_2_RELEASE
    TAP_STATE_TOUCH_2_HOLD
    TAP_STATE_TAPPED
    TAP_STATE_HOLD
    TAP_STATE_DEAD
  ]
}.freeze

Instance Method Summary collapse

Instance Method Details

#parse_record(record) ⇒ Records::Gesture?



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# File 'lib/fusuma/plugin/parsers/tap_parser.rb', line 53

def parse_record(record)
  gesture = 'tap'

  case record.to_s

  # BEGIN
  when /\stap(?:| state):\s.*TAP_STATE_IDLE → TAP_EVENT_TOUCH → TAP_STATE_TOUCH/
    status = 'begin'
    finger = 1

  # TOUCH
  when /\stap(?:| state):\s.*(#{STATE[:touches].join('|')}) → TAP_EVENT_(?:TOUCH|MOTION) → (#{STATE[:touches].join('|')})/

    status = 'touch'

    finger = case Regexp.last_match(2)
             when 'TAP_STATE_DEAD'
               4
             when 'TAP_STATE_TOUCH_3'
               3
             when 'TAP_STATE_TOUCH_2'
               2
             when 'TAP_STATE_TOUCH'
               1
             end

  # HOLD
  when /\stap(?:| state):\s.*(#{STATE[:touches].join('|')}) → TAP_EVENT_TIMEOUT → (#{STATE[:holds].join('|')})/

    status = 'hold'

    matched = Regexp.last_match

    finger = case matched[2]
             when 'TAP_STATE_DEAD'
               4
             when 'TAP_STATE_TOUCH_3_HOLD'
               3
             when 'TAP_STATE_TOUCH_2_HOLD'
               2
             when 'TAP_STATE_HOLD'
               1
             end
  # KEEP
  when /\sgesture(| state):\s/, 'LIBINPUT TIMEOUT'
    # NOTE: treat the "gesture(| state):" as KEEP
    status = 'keep'
    finger = 0

  # RELEASE
  when /\stap(?:| state):\s.*(#{(STATE[:touches] | STATE[:holds]).join('|')}) → TAP_EVENT_RELEASE → (#{STATE[:releases].join('|')})/

    status = 'release'
    matched = Regexp.last_match

    finger = case matched[1]
             when 'TAP_STATE_DEAD'
               4
             when 'TAP_STATE_TOUCH_3', 'TAP_STATE_TOUCH_3_HOLD'
               3
             when 'TAP_STATE_TOUCH_2', 'TAP_STATE_TOUCH_2_HOLD'
               2
             when 'TAP_STATE_TOUCH', 'TAP_STATE_HOLD'
               1
             end

  # END
  when /\stap(?:| state):\s.*(#{STATE[:releases].join('|')}) → TAP_EVENT_(.*) → #{STATE[:idle]}/
    status = 'end'

    matched = Regexp.last_match
    finger = case matched[1]
             when 'TAP_STATE_DEAD'
               4
             when 'TAP_STATE_TOUCH_3', 'TAP_STATE_TOUCH_3_HOLD'
               3
             when 'TAP_STATE_TOUCH_2', 'TAP_STATE_TOUCH_2_HOLD', 'TAP_STATE_TOUCH_2_RELEASE'
               2
             when 'TAP_STATE_TOUCH', 'TAP_STATE_HOLD', 'TAP_STATE_TAPPED'
               1
             end
  else
    return
  end

  Events::Records::GestureRecord.new(status: status,
                                     gesture: gesture,
                                     finger: finger,
                                     direction: nil)
end

#tagObject



144
145
146
# File 'lib/fusuma/plugin/parsers/tap_parser.rb', line 144

def tag
  'libinput_tap_parser'
end