touchscreen: Fix event reporting in button driver

The way the button driver reported touch events was problematic
and made it impossible to detect if a touch started or if it was
a continuation of an existing touch.

Now, the first detected touch event gets BUTTON_TOUCHSCREEN and
all subsequent touch events while the screen is pressed will get
the BUTTON_REPEAT bit set. When the screen is released the final
event will have the BUTTON_REL bit set.

Change-Id: Ia456a22b2180031555a82231c2af32576bc5f2cb
This commit is contained in:
Aidan MacDonald 2022-04-23 15:13:36 +01:00 committed by Solomon Peachy
parent 9f613fd981
commit c47c075bd3

View file

@ -75,8 +75,8 @@ static bool enable_sw_poweroff = true;
* real list acceleration kicks in (this smooths acceleration). * real list acceleration kicks in (this smooths acceleration).
* *
* Note that touchscreen pointing events are not subject to this * Note that touchscreen pointing events are not subject to this
* acceleration and always use REPEAT_INTERVAL_TOUCH. (Do repeat * acceleration and always use REPEAT_INTERVAL_TOUCH. That value
* events even do anything sane for touchscreens??) * essentially determines the touchscreen polling rate.
*/ */
/* the speed repeat starts at, in centiseconds */ /* the speed repeat starts at, in centiseconds */
@ -324,21 +324,29 @@ static void button_tick(void)
} }
else else
{ {
if (count++ > REPEAT_START) ++count;
if (count > REPEAT_START
#ifdef HAVE_TOUCHSCREEN
/* For touch events we want to repost quickly since
* the coordinates can change */
|| ((btn & BUTTON_TOUCHSCREEN) &&
count > REPEAT_INTERVAL_TOUCH)
#endif
)
{ {
post = true; post = true;
repeat = true; repeat = true;
repeat_count = 0; repeat_count = 0;
/* initial repeat */ /* initial repeat */
count = REPEAT_INTERVAL_START;
}
#ifdef HAVE_TOUCHSCREEN #ifdef HAVE_TOUCHSCREEN
else if (lastdata != data && btn == lastbtn) if (btn & BUTTON_TOUCHSCREEN)
{ /* only coordinates changed, post anyway */ count = REPEAT_INTERVAL_TOUCH;
if (touchscreen_get_mode() == TOUCHSCREEN_POINT) else
post = true;
}
#endif #endif
{
count = REPEAT_INTERVAL_START;
}
}
} }
} }
if ( post ) if ( post )