From 02119357dc729076b5c104dacf3fc4f73a7eb68a Mon Sep 17 00:00:00 2001 From: Solomon Peachy Date: Wed, 16 Dec 2020 14:47:50 -0500 Subject: [PATCH] erosq: Enable HAVE_SCROLLWHEEL for saner scroll wheel handling Basically no longer treat SCROLL_FWD/BACK as "button" events, instead relying on the scrollwheel hooks to handle things properly. Change-Id: I9bf18595ab3ca68e912f6dfb1f2eac2544578e73 --- firmware/export/config/aigoerosq.h | 1 + firmware/target/hosted/button-devinput.c | 46 ++++++++++++++++-------- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/firmware/export/config/aigoerosq.h b/firmware/export/config/aigoerosq.h index 6dc14c9205..6ae8ad049f 100644 --- a/firmware/export/config/aigoerosq.h +++ b/firmware/export/config/aigoerosq.h @@ -21,6 +21,7 @@ /* KeyPad configuration for plugins */ #define CONFIG_KEYPAD EROSQ_PAD +#define HAVE_SCROLLWHEEL /* define this if the target has volume keys which can be used in the lists */ #define HAVE_VOLUME_IN_LIST diff --git a/firmware/target/hosted/button-devinput.c b/firmware/target/hosted/button-devinput.c index 448be2c5c4..90e6fb0340 100644 --- a/firmware/target/hosted/button-devinput.c +++ b/firmware/target/hosted/button-devinput.c @@ -77,16 +77,8 @@ int button_read_device(void) static int button_bitmap = 0; struct input_event event; -#if defined(BUTTON_SCROLL_BACK) - // FIXME TODO: Make this work via HAVE_SCROLL_WHEEL instead - - /* Wheel gives us press+release back to back, clear them after time elapses */ - static long last_tick = 0; - if (button_bitmap & (BUTTON_SCROLL_BACK|BUTTON_SCROLL_FWD) && - current_tick - last_tick >= 2) - { - button_bitmap &= ~(BUTTON_SCROLL_BACK|BUTTON_SCROLL_FWD); - } +#ifdef HAVE_SCROLLWHEEL + int wheel_ticks = 0; #endif /* check if there are any events pending and process them */ @@ -110,17 +102,22 @@ int button_read_device(void) if(press) { int bmap = button_map(keycode); -#if defined(BUTTON_SCROLL_BACK) - /* Keep track of when the last wheel tick happened */ - if (bmap & (BUTTON_SCROLL_BACK|BUTTON_SCROLL_FWD)) - last_tick = current_tick; + +#ifdef HAVE_SCROLLWHEEL + /* Filter out wheel ticks */ + if (bmap & BUTTON_SCROLL_BACK) + wheel_ticks--; + else if (bmap & BUTTON_SCROLL_FWD) + wheel_ticks++; + bmap &= ~(BUTTON_SCROLL_BACK|BUTTON_SCROLL_FWD); #endif button_bitmap |= bmap; } else { int bmap = button_map(keycode); -#if defined(BUTTON_SCROLL_BACK) + +#ifdef HAVE_SCROLLWHEEL /* Wheel gives us press+release back to back; ignore the release */ bmap &= ~(BUTTON_SCROLL_BACK|BUTTON_SCROLL_FWD); #endif @@ -132,5 +129,24 @@ int button_read_device(void) } } +#ifdef HAVE_SCROLLWHEEL + // TODO: Is there a better way to handle this? + // TODO: enable BUTTON_REPEAT if the events happen quickly enough + if (wheel_ticks > 0) + { + while (wheel_ticks-- > 0) + { + queue_post(&button_queue, BUTTON_SCROLL_FWD, 0); + } + } + else + { + while (wheel_ticks++ < 0) + { + queue_post(&button_queue, BUTTON_SCROLL_BACK, 0); + } + } +#endif + return button_bitmap; }