Add mutex for keyboard repeat delay and rate 93/295193/2
authorJihoon Kim <jihoon48.kim@samsung.com>
Tue, 13 Jun 2023 05:43:41 +0000 (14:43 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Tue, 4 Jul 2023 07:32:35 +0000 (07:32 +0000)
Change-Id: I8c09587e899fb88a9b47b4803b4f9bdcf96b7d74
Signed-off-by: Jihoon Kim <jihoon48.kim@samsung.com>
src/bin/e_comp_wl.h
src/bin/e_comp_wl_input.c
src/bin/e_info_server.c

index b8d0153..844b5b7 100644 (file)
@@ -231,6 +231,8 @@ struct _E_Comp_Wl_Data
         GMutex resource_mutex; /* for resources variable */
         GMutex focused_mutex; /* for focused variable */
         GMutex keys_mutex; /* for keys variable */
+        GMutex repeat_delay_mutex; /* for repeat_delay variable */
+        GMutex repeat_rate_mutex; /* for repeat_rate variable */
      } kbd;
 
    struct
index 7c8b39a..7af0dcb 100644 (file)
@@ -393,7 +393,13 @@ _e_comp_wl_input_cb_keyboard_get(struct wl_client *client, struct wl_resource *r
 
    /* send current repeat_info */
    if (wl_resource_get_version(res) >= WL_KEYBOARD_REPEAT_INFO_SINCE_VERSION)
-     wl_keyboard_send_repeat_info(res, e_comp_wl->kbd.repeat_rate, e_comp_wl->kbd.repeat_delay);
+     {
+        g_mutex_lock(&e_comp_wl->kbd.repeat_rate_mutex);
+        g_mutex_lock(&e_comp_wl->kbd.repeat_delay_mutex);
+        wl_keyboard_send_repeat_info(res, e_comp_wl->kbd.repeat_rate, e_comp_wl->kbd.repeat_delay);
+        g_mutex_unlock(&e_comp_wl->kbd.repeat_delay_mutex);
+        g_mutex_unlock(&e_comp_wl->kbd.repeat_rate_mutex);
+     }
 
    /* send current keymap */
    TRACE_INPUT_BEGIN(wl_keyboard_send_keymap);
@@ -1406,6 +1412,8 @@ e_comp_wl_input_init(void)
    g_mutex_init(&e_comp_wl->kbd.resource_mutex);
    g_mutex_init(&e_comp_wl->kbd.focused_mutex);
    g_mutex_init(&e_comp_wl->kbd.keys_mutex);
+   g_mutex_init(&e_comp_wl->kbd.repeat_delay_mutex);
+   g_mutex_init(&e_comp_wl->kbd.repeat_rate_mutex);
 
    g_mutex_init(&e_comp_wl->xkb.keymap_mutex);
    g_mutex_init(&e_comp_wl->xkb.state_mutex);
@@ -1416,8 +1424,13 @@ e_comp_wl_input_init(void)
 
    /* check for valid repeat_delay and repeat_rate value */
    /* if invalid, set the default value of repeat delay and rate value */
+   g_mutex_lock(&e_comp_wl->kbd.repeat_delay_mutex);
    if (e_comp_wl->kbd.repeat_delay < 0) e_comp_wl->kbd.repeat_delay = 400;
+   g_mutex_unlock(&e_comp_wl->kbd.repeat_delay_mutex);
+
+   g_mutex_lock(&e_comp_wl->kbd.repeat_rate_mutex);
    if (e_comp_wl->kbd.repeat_rate < 0) e_comp_wl->kbd.repeat_rate = 25;
+   g_mutex_unlock(&e_comp_wl->kbd.repeat_rate_mutex);
 
    /* create the global resource for input seat */
    e_comp_wl->seat.global =
@@ -1584,6 +1597,8 @@ e_comp_wl_input_shutdown(void)
    g_mutex_clear(&e_comp_wl->xkb.state_mutex);
 
    g_mutex_clear(&e_comp_wl->kbd.keys_mutex);
+   g_mutex_clear(&e_comp_wl->kbd.repeat_delay_mutex);
+   g_mutex_clear(&e_comp_wl->kbd.repeat_rate_mutex);
 }
 
 EINTERN Eina_Bool
@@ -2005,17 +2020,25 @@ e_comp_wl_input_keyboard_repeat_set(int delay, int rate)
 
    EINA_SAFETY_ON_NULL_RETURN(e_comp_wl);
 
+   g_mutex_lock(&e_comp_wl->kbd.repeat_delay_mutex);
    e_comp_wl->kbd.repeat_delay = delay;
+   g_mutex_unlock(&e_comp_wl->kbd.repeat_delay_mutex);
+
+   g_mutex_lock(&e_comp_wl->kbd.repeat_rate_mutex);
    e_comp_wl->kbd.repeat_rate = rate;
+   g_mutex_unlock(&e_comp_wl->kbd.repeat_rate_mutex);
 
    g_mutex_lock(&e_comp_wl->kbd.resource_mutex);
+   g_mutex_lock(&e_comp_wl->kbd.repeat_delay_mutex);
+   g_mutex_lock(&e_comp_wl->kbd.repeat_rate_mutex);
    EINA_LIST_FOREACH(e_comp_wl->kbd.resources, l, res)
      {
         if (wl_resource_get_version(res) >= WL_KEYBOARD_REPEAT_INFO_SINCE_VERSION)
           wl_keyboard_send_repeat_info(res, e_comp_wl->kbd.repeat_rate,
                                        e_comp_wl->kbd.repeat_delay);
      }
-
+   g_mutex_unlock(&e_comp_wl->kbd.repeat_rate_mutex);
+   g_mutex_unlock(&e_comp_wl->kbd.repeat_delay_mutex);
    g_mutex_unlock(&e_comp_wl->kbd.resource_mutex);
 }
 
index 4c34d54..90cdc53 100644 (file)
@@ -6683,14 +6683,23 @@ _e_info_server_cb_key_repeat(const Eldbus_Service_Interface *iface EINA_UNUSED,
         EINA_SAFETY_ON_NULL_RETURN_VAL(log_fp, reply);
 
         fprintf(log_fp, "\tkeyboard repeat info\n");
+        g_mutex_lock(&e_comp_wl->kbd.repeat_rate_mutex);
+        g_mutex_lock(&e_comp_wl->kbd.repeat_delay_mutex);
         fprintf(log_fp, "\t\trate: %d (ms), delay: %d (ms)\n", e_comp_wl->kbd.repeat_rate, e_comp_wl->kbd.repeat_delay);
+        g_mutex_unlock(&e_comp_wl->kbd.repeat_delay_mutex);
+        g_mutex_unlock(&e_comp_wl->kbd.repeat_rate_mutex);
         fclose(log_fp);
         log_fp = NULL;
      }
    else
      {
+        g_mutex_lock(&e_comp_wl->kbd.repeat_delay_mutex);
         if (delay <= 0) delay = e_comp_wl->kbd.repeat_delay;
+        g_mutex_unlock(&e_comp_wl->kbd.repeat_delay_mutex);
+
+        g_mutex_lock(&e_comp_wl->kbd.repeat_rate_mutex);
         if (rate <= 0) rate = e_comp_wl->kbd.repeat_rate;
+        g_mutex_unlock(&e_comp_wl->kbd.repeat_rate_mutex);
 
         e_comp_wl_input_keyboard_repeat_set(delay, rate);
      }