@@ -139,7 +139,7 @@ Item {
139139 }
140140
141141 if (root .useTappyMode ) {
142- root .onKeyPress (root .bassIntensity > root .bigBeatThreshold );
142+ root .musicEvent (root .bassIntensity > root .bigBeatThreshold );
143143 }
144144
145145 beatCooldownTimer .restart ();
@@ -168,8 +168,8 @@ Item {
168168 onTriggered: root .catState = root .pendingCatState
169169 }
170170
171- // === KEY PRESS HANDLER ===
172- function onKeyPress (isBigHit = false ) {
171+ // === MUSIC HANDLER ===
172+ function musicEvent (isBigHit = false ) {
173173 if (root .paused ) return ;
174174 root .waiting = false ;
175175
@@ -195,6 +195,65 @@ Item {
195195 waitingTimer .restart ();
196196 }
197197
198+ // === KEY PRESS HANDLER ===
199+ function onKeyPress (isBigHit = false ) {
200+ if (root .paused ) return ;
201+ root .waiting = false ;
202+
203+ let targetState;
204+ if (isBigHit) {
205+ targetState = 3 ;
206+ } else {
207+ if (root .catState !== 0 ){
208+ targetState = 3 ;
209+ } else {
210+ root .leftWasLast = ! root .leftWasLast ;
211+ targetState = root .leftWasLast ? 1 : 2 ;
212+ }
213+ }
214+
215+ root .catState = targetState;
216+ waitingTimer .restart ();
217+ }
218+
219+ function onKeyRelease (isBigHit = false ) {
220+ if (root .paused ) return ;
221+ root .waiting = false ;
222+
223+ let targetState;
224+ if (isBigHit) {
225+ targetState = 0 ;
226+ } else {
227+ if (root .catState === 3 ){
228+ targetState = root .leftWasLast ? 1 : 2 ;
229+ } else {
230+ targetState = 0 ;
231+ }
232+ }
233+
234+ root .catState = targetState;
235+ waitingTimer .restart ();
236+ }
237+
238+ function onKeyRepeat (isBigHit = false ){
239+ if (root .paused ) return ;
240+ root .waiting = false ;
241+
242+ let targetState;
243+ if (root .catState !== 0 ) {
244+ targetState = root .catState ;
245+ } else {
246+ if (isBigHit){
247+ targetState = 3 ;
248+ } else {
249+ targetState = root .leftWasLast ? 1 : 2 ;
250+ }
251+ }
252+
253+ root .catState = targetState;
254+ waitingTimer .restart ();
255+ }
256+
198257 // === STATE CHANGE HANDLERS ===
199258 onPausedChanged: {
200259 if (root .paused ) {
@@ -291,10 +350,20 @@ Item {
291350
292351 stdout: SplitParser {
293352 onRead : data => {
294- if (data .includes (" EV_KEY" ) && data . includes ( " value 1 " ) ) {
353+ if (data .includes (" EV_KEY" )) {
295354 // Detect spacebar/enter for double slap (both paws)
296355 const isBigHit = data .includes (" KEY_SPACE" ) || data .includes (" KEY_ENTER" );
297- root .onKeyPress (isBigHit);
356+ // Key pressed
357+ // Ignore BTN_TOOL_ events to avoid double events with touchpads
358+ if (data .includes (" value 1" ) && ! data .includes (" BTN_TOOL_" )){
359+ root .onKeyPress (isBigHit);
360+ // Key released
361+ } else if (data .includes (" value 0" )) {
362+ root .onKeyRelease (isBigHit);
363+ // Key repeat
364+ } else if (data .includes (" value 2" )) {
365+ root .onKeyRepeat (isBigHit);
366+ }
298367 }
299368 }
300369 }
0 commit comments