Re: [PATCH] HID: apple: Fix stuck function keys when using FN
From: JoÃo Moreno
Date: Sun Jun 30 2019 - 16:19:05 EST
Hi Jiri & Benjamin,
Let me know if you need something else to get this patch moving forward. This
fixes an issue I hit daily, it would be great to get it fixed.
Thanks.
On Mon, 10 Jun 2019 at 23:31, Joao Moreno <mail@xxxxxxxxxxxxxx> wrote:
>
> This fixes an issue in which key down events for function keys would be
> repeatedly emitted even after the user has raised the physical key. For
> example, the driver fails to emit the F5 key up event when going through
> the following steps:
> - fnmode=1: hold FN, hold F5, release FN, release F5
> - fnmode=2: hold F5, hold FN, release F5, release FN
>
> The repeated F5 key down events can be easily verified using xev.
>
> Signed-off-by: Joao Moreno <mail@xxxxxxxxxxxxxx>
> ---
> drivers/hid/hid-apple.c | 21 +++++++++++----------
> 1 file changed, 11 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c
> index 1cb41992aaa1..81867a6fa047 100644
> --- a/drivers/hid/hid-apple.c
> +++ b/drivers/hid/hid-apple.c
> @@ -205,20 +205,21 @@ static int hidinput_apple_event(struct hid_device *hid, struct input_dev *input,
> trans = apple_find_translation (table, usage->code);
>
> if (trans) {
> - if (test_bit(usage->code, asc->pressed_fn))
> - do_translate = 1;
> - else if (trans->flags & APPLE_FLAG_FKEY)
> - do_translate = (fnmode == 2 && asc->fn_on) ||
> - (fnmode == 1 && !asc->fn_on);
> + int fn_on = value ? asc->fn_on :
> + test_bit(usage->code, asc->pressed_fn);
> +
> + if (!value)
> + clear_bit(usage->code, asc->pressed_fn);
> + else if (asc->fn_on)
> + set_bit(usage->code, asc->pressed_fn);
> +
> + if (trans->flags & APPLE_FLAG_FKEY)
> + do_translate = (fnmode == 2 && fn_on) ||
> + (fnmode == 1 && !fn_on);
> else
> do_translate = asc->fn_on;
>
> if (do_translate) {
> - if (value)
> - set_bit(usage->code, asc->pressed_fn);
> - else
> - clear_bit(usage->code, asc->pressed_fn);
> -
> input_event(input, usage->type, trans->to,
> value);
>
> --
> 2.19.1
>