diff options
| author | Jens Arnold <amiconn@rockbox.org> | 2006-02-19 13:34:12 +0000 |
|---|---|---|
| committer | Jens Arnold <amiconn@rockbox.org> | 2006-02-19 13:34:12 +0000 |
| commit | 237d3c4c4b9d4ae1ee48ab812b83009761811604 (patch) | |
| tree | 0222738324467191968fe1d3ee81d7130c390a6c | |
| parent | 1b45b130dcee36b1f9f7965fd0b062789bb99bc0 (diff) | |
| download | rockbox-237d3c4c4b9d4ae1ee48ab812b83009761811604.zip rockbox-237d3c4c4b9d4ae1ee48ab812b83009761811604.tar.gz rockbox-237d3c4c4b9d4ae1ee48ab812b83009761811604.tar.bz2 rockbox-237d3c4c4b9d4ae1ee48ab812b83009761811604.tar.xz | |
Adaptive button repeat: adapts repeat rate depending on the ability of the application to cope. Avoids afterscroll and similar effects. * Yield while scrolling through lists.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8738 a1c6a512-1295-4272-9138-f99709370657
| -rw-r--r-- | apps/gui/list.c | 2 | ||||
| -rw-r--r-- | firmware/drivers/button.c | 16 | ||||
| -rw-r--r-- | uisimulator/sdl/button.c | 16 | ||||
| -rw-r--r-- | uisimulator/win32/button.c | 16 | ||||
| -rw-r--r-- | uisimulator/x11/button-x11.c | 13 |
5 files changed, 52 insertions, 11 deletions
diff --git a/apps/gui/list.c b/apps/gui/list.c index b53009a..472c01c 100644 --- a/apps/gui/list.c +++ b/apps/gui/list.c @@ -604,6 +604,7 @@ unsigned gui_synclist_do_button(struct gui_synclist * lists, unsigned button) #endif gui_synclist_select_previous(lists); gui_synclist_draw(lists); + yield(); return LIST_PREV; case LIST_NEXT: @@ -619,6 +620,7 @@ unsigned gui_synclist_do_button(struct gui_synclist * lists, unsigned button) #endif gui_synclist_select_next(lists); gui_synclist_draw(lists); + yield(); return LIST_NEXT; #ifdef LIST_PGRIGHT diff --git a/firmware/drivers/button.c b/firmware/drivers/button.c index 1cb9472..c4c2264 100644 --- a/firmware/drivers/button.c +++ b/firmware/drivers/button.c @@ -365,6 +365,7 @@ static void button_tick(void) static int repeat_speed = REPEAT_INTERVAL_START; static int repeat_count = 0; static bool repeat = false; + static bool post = false; int diff; int btn; @@ -381,7 +382,6 @@ static void button_tick(void) /* only poll every X ticks */ if ( ++tick >= POLL_FREQUENCY ) { - bool post = false; btn = button_read(); /* Find out if a key has been released */ @@ -406,7 +406,8 @@ static void button_tick(void) { if ( repeat ) { - count--; + if (!post) + count--; if (count == 0) { post = true; /* yes we have repeat */ @@ -458,9 +459,18 @@ static void button_tick(void) if ( post ) { if (repeat) - queue_post(&button_queue, BUTTON_REPEAT | btn, NULL); + { + if (queue_empty(&button_queue)) + { + queue_post(&button_queue, BUTTON_REPEAT | btn, NULL); + post = false; + } + } else + { queue_post(&button_queue, btn, NULL); + post = false; + } #ifdef HAVE_REMOTE_LCD if(btn & BUTTON_REMOTE) remote_backlight_on(); diff --git a/uisimulator/sdl/button.c b/uisimulator/sdl/button.c index 671cf12..7222431 100644 --- a/uisimulator/sdl/button.c +++ b/uisimulator/sdl/button.c @@ -39,7 +39,6 @@ static int btn = 0; /* Hopefully keeps track of currently pressed keys... */ void button_event(int key, bool pressed) { - bool post = false; int new_btn = 0; int diff = 0; static int count = 0; @@ -47,6 +46,7 @@ void button_event(int key, bool pressed) static int repeat_speed = REPEAT_INTERVAL_START; static int repeat_count = 0; static bool repeat = false; + static bool post = false; switch (key) { @@ -175,7 +175,8 @@ void button_event(int key, bool pressed) { if ( repeat ) { - count--; + if (!post) + count--; if (count == 0) { post = true; @@ -203,9 +204,18 @@ void button_event(int key, bool pressed) if ( post ) { if(repeat) - queue_post(&button_queue, BUTTON_REPEAT | btn, NULL); + { + if (queue_empty(&button_queue)) + { + queue_post(&button_queue, BUTTON_REPEAT | btn, NULL); + post = false; + } + } else + { queue_post(&button_queue, btn, NULL); + post = false; + } #ifdef HAVE_REMOTE_LCD if(btn & BUTTON_REMOTE) diff --git a/uisimulator/win32/button.c b/uisimulator/win32/button.c index 7996af5..8f21fe4 100644 --- a/uisimulator/win32/button.c +++ b/uisimulator/win32/button.c @@ -40,7 +40,6 @@ static int btn = 0; /* Hopefully keeps track of currently pressed keys... */ void button_event(int key, bool pressed) { - bool post = false; int new_btn = 0; int diff = 0; static int count = 0; @@ -48,6 +47,7 @@ void button_event(int key, bool pressed) static int repeat_speed = REPEAT_INTERVAL_START; static int repeat_count = 0; static bool repeat = false; + static bool post = false; switch (key) { @@ -176,7 +176,8 @@ void button_event(int key, bool pressed) { if ( repeat ) { - count--; + if (!post) + count--; if (count == 0) { post = true; @@ -204,9 +205,18 @@ void button_event(int key, bool pressed) if ( post ) { if(repeat) - queue_post(&button_queue, BUTTON_REPEAT | btn, NULL); + { + if (queue_empty(&button_queue)) + { + queue_post(&button_queue, BUTTON_REPEAT | btn, NULL); + post = false; + } + } else + { queue_post(&button_queue, btn, NULL); + post = false; + } #ifdef HAVE_REMOTE_LCD if(btn & BUTTON_REMOTE) diff --git a/uisimulator/x11/button-x11.c b/uisimulator/x11/button-x11.c index 08b09cf..673f71e 100644 --- a/uisimulator/x11/button-x11.c +++ b/uisimulator/x11/button-x11.c @@ -55,13 +55,13 @@ static void button_tick(void) static int repeat_speed = REPEAT_INTERVAL_START; static int repeat_count = 0; static bool repeat = false; + static bool post = false; int diff; int btn; /* only poll every X ticks */ if ( ++tick >= POLL_FREQUENCY ) { - bool post = false; button_read(); btn = button_state; @@ -115,9 +115,18 @@ static void button_tick(void) if ( post ) { if (repeat) - queue_post(&button_queue, BUTTON_REPEAT | btn, NULL); + { + if (queue_empty(&button_queue)) + { + queue_post(&button_queue, BUTTON_REPEAT | btn, NULL); + post = false; + } + } else + { queue_post(&button_queue, btn, NULL); + post = false; + } #ifdef HAVE_REMOTE_LCD if(btn & BUTTON_REMOTE) remote_backlight_on(); |