lkml.org 
[lkml]   [2019]   [Jun]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
From
Date
SubjectRe: [PATCH] HID: apple: Fix stuck function keys when using FN
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@joaomoreno.com> 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@joaomoreno.com>
> ---
> 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
>

\
 
 \ /
  Last update: 2019-06-30 22:16    [W:0.091 / U:1.652 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site