ecore_wl2 input: prevent unintended key repeats by performance. 88/261088/2
authorHermet Park <chuneon.park@samsung.com>
Fri, 9 Jul 2021 14:02:21 +0000 (23:02 +0900)
committerHermet Park <chuneon.park@samsung.com>
Mon, 12 Jul 2021 06:24:36 +0000 (06:24 +0000)
Change-Id: I32d14ccf5f4ea811aa30da44c84afd872b85b0f4

src/lib/ecore_wl2/ecore_wl2_input.c
src/lib/ecore_wl2/ecore_wl2_private.h

index 100ea2c..cfd9a93 100644 (file)
@@ -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);
                }
           }
      }
index a1a9c80..21dc5e7 100644 (file)
@@ -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;