From 0fc075efeeeed039d535a6d6daa2932acb2eb824 Mon Sep 17 00:00:00 2001 From: Jihoon Kim Date: Tue, 13 Jun 2023 14:43:41 +0900 Subject: [PATCH] Add mutex for keyboard repeat delay and rate Change-Id: I8c09587e899fb88a9b47b4803b4f9bdcf96b7d74 Signed-off-by: Jihoon Kim --- src/bin/e_comp_wl.h | 2 ++ src/bin/e_comp_wl_input.c | 27 +++++++++++++++++++++++++-- src/bin/e_info_server.c | 9 +++++++++ 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/bin/e_comp_wl.h b/src/bin/e_comp_wl.h index b8d0153..844b5b7 100644 --- a/src/bin/e_comp_wl.h +++ b/src/bin/e_comp_wl.h @@ -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 diff --git a/src/bin/e_comp_wl_input.c b/src/bin/e_comp_wl_input.c index 7c8b39a..7af0dcb 100644 --- a/src/bin/e_comp_wl_input.c +++ b/src/bin/e_comp_wl_input.c @@ -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); } diff --git a/src/bin/e_info_server.c b/src/bin/e_info_server.c index 4c34d54..90cdc53 100644 --- a/src/bin/e_info_server.c +++ b/src/bin/e_info_server.c @@ -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); } -- 2.7.4