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?

Parameters:

  • record (String)

Returns:

  • (Records::Gesture, nil)


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
143
144
145
146
147
148
149
150
151
152
# 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'
               if Regexp.last_match(1) == 'TAP_STATE_TOUCH_3'
                 4
               else
                 0
               end
             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 'LIBINPUT TIMEOUT',   # Timeout Event
    /\sgesture(| state):\s/  # 1.10.4 prints "gesture state: GESTURE_STATE_.*"
    # NOTE: treat the "gesture(| state):" as KEEP
    status = 'keep'
    finger = 0

  # MOVE
  when /\sPOINTER_AXIS\s/, /\sPOINTER_MOTION\s/, /\sTAP_EVENT_PALM\s/
    status = 'move'
    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' # NOTE: 2 finger hold -> scroll become  TAP_STATE_DEAD
               0
             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



154
155
156
# File 'lib/fusuma/plugin/parsers/tap_parser.rb', line 154

def tag
  'libinput_tap_parser'
end