From 19d6300167e863d94b1878e46373fbe8c49687e2 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Fri, 9 Jul 2021 23:02:21 +0900 Subject: [PATCH] ecore_wl2 input: prevent unintended key repeats by performance. Change-Id: I32d14ccf5f4ea811aa30da44c84afd872b85b0f4 --- src/lib/ecore_wl2/ecore_wl2_input.c | 30 ++++++++++++------------------ src/lib/ecore_wl2/ecore_wl2_private.h | 1 + 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/src/lib/ecore_wl2/ecore_wl2_input.c b/src/lib/ecore_wl2/ecore_wl2_input.c index 100ea2c..cfd9a93 100644 --- a/src/lib/ecore_wl2/ecore_wl2_input.c +++ b/src/lib/ecore_wl2/ecore_wl2_input.c @@ -1367,13 +1367,17 @@ _keyboard_cb_repeat(void *data) input = data; if (!input || !input->repeat.timer) return ECORE_CALLBACK_CANCEL; -// TIZEN_ONLY(20160610): fix key repeat condition. -/* - window = input->focus.keyboard; - if (!window) goto out; -*/ + //A bit slow... + double cur_time = ecore_time_get(); + if (cur_time > input->repeat.intime) + { + input->repeat.intime = cur_time + (cur_time - input->repeat.intime) + 0.0166; + ecore_timer_interval_set(input->repeat.timer, cur_time - input->repeat.intime); + return ECORE_CALLBACK_RENEW; + } + input->repeat.intime = (cur_time + input->repeat.delay + 0.0166); + input->repeat.time += (int)(input->repeat.rate * 1000.0); -// _ecore_wl2_input_key_send(input, input->repeat_win, input->repeat.sym, input->repeat.sym_name, @@ -1387,16 +1391,6 @@ _keyboard_cb_repeat(void *data) input->repeat.repeating = EINA_TRUE; } return ECORE_CALLBACK_RENEW; - -// TIZEN_ONLY(20160610): fix key repeat condition. -/* -out: - input->repeat.sym = 0; - input->repeat.key = 0; - input->repeat.time = 0; - return ECORE_CALLBACK_CANCEL; -*/ -// } /* from weston/clients/window.c */ @@ -1547,8 +1541,8 @@ _keyboard_cb_key(void *data, struct wl_keyboard *keyboard EINA_UNUSED, unsigned if (!input->repeat.timer) { input->repeat.repeating = EINA_FALSE; - input->repeat.timer = - ecore_timer_add(input->repeat.delay, _keyboard_cb_repeat, input); + input->repeat.timer = ecore_timer_add(input->repeat.delay, _keyboard_cb_repeat, input); + input->repeat.intime = (ecore_time_get() + input->repeat.delay + 0.0166); } } } diff --git a/src/lib/ecore_wl2/ecore_wl2_private.h b/src/lib/ecore_wl2/ecore_wl2_private.h index a1a9c80..21dc5e7 100644 --- a/src/lib/ecore_wl2/ecore_wl2_private.h +++ b/src/lib/ecore_wl2/ecore_wl2_private.h @@ -720,6 +720,7 @@ struct _Ecore_Wl2_Input Ecore_Timer *timer; unsigned int sym, sym_name, key, time; double rate, delay; + double intime; //next repeat is expected in the time. (+ 0.0166 for 1 frame variable capacity) Eina_Bool enabled : 1; Eina_Bool repeating : 1; Eina_Bool changed : 1; -- 2.7.4