From: Jihoon Kim Date: Mon, 5 Jun 2023 07:20:57 +0000 (+0900) Subject: Add mutex for key list X-Git-Tag: accepted/tizen/unified/20230706.152207~16 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=408895ea39f78665a72bf556fc3e8ed66e21b6cf;p=platform%2Fupstream%2Fenlightenment.git Add mutex for key list Change-Id: I3d415f36c919a4f5b24b9e90850e202c31550142 Signed-off-by: Jihoon Kim --- diff --git a/src/bin/e_comp.h b/src/bin/e_comp.h index 7e82a10..de37f86 100644 --- a/src/bin/e_comp.h +++ b/src/bin/e_comp.h @@ -1,4 +1,6 @@ #ifdef E_TYPEDEFS +#include + typedef struct _E_Comp E_Comp; typedef struct _E_Comp_Wl_Client_Data E_Comp_Client_Data; // deprecated. use E_Comp_Wl_Client_Data intead of this. typedef struct _E_Comp_Wl_Data E_Comp_Wl_Data; @@ -188,6 +190,8 @@ struct _E_Comp char use; // 0: none 1: use commit_handler timer double interval; // time value the interval of commit_handler after tdm_commit in second (default : 0) } commit_handler_timer; + + GMutex input_key_grabs_mutex; }; struct _E_Comp_Connected_Client_Info diff --git a/src/bin/e_comp_wl.c b/src/bin/e_comp_wl.c index 2c2a48e..225acae 100644 --- a/src/bin/e_comp_wl.c +++ b/src/bin/e_comp_wl.c @@ -1900,6 +1900,7 @@ _e_comp_wl_evas_cb_focus_in_timer(E_Client *ec) t = ecore_time_unix_get(); g_mutex_lock(&e_comp_wl->kbd.focused_mutex); + g_mutex_lock(&e_comp_wl->kbd.keys_mutex); EINA_LIST_FOREACH(e_comp_wl->kbd.focused, l, res) { wl_array_for_each(k, &e_comp_wl->kbd.keys) @@ -1909,6 +1910,7 @@ _e_comp_wl_evas_cb_focus_in_timer(E_Client *ec) k->key, WL_KEYBOARD_KEY_STATE_PRESSED); } } + g_mutex_unlock(&e_comp_wl->kbd.keys_mutex); g_mutex_unlock(&e_comp_wl->kbd.focused_mutex); return EINA_FALSE; } @@ -2001,9 +2003,12 @@ _e_comp_wl_evas_cb_focus_out(void *data, Evas *evas EINA_UNUSED, Evas_Object *ob /* update keyboard modifier state */ + g_mutex_lock(&e_comp_wl->kbd.keys_mutex); wl_array_for_each(k, &e_comp_wl->kbd.keys) e_comp_wl_input_keyboard_state_update(k->key, EINA_FALSE); + g_mutex_unlock(&e_comp_wl->kbd.keys_mutex); + if (!ec->comp_data->surface) return; g_mutex_lock(&e_comp_wl->kbd.resource_mutex); @@ -2020,6 +2025,7 @@ _e_comp_wl_evas_cb_focus_out(void *data, Evas *evas EINA_UNUSED, Evas_Object *ob t = ecore_time_unix_get(); g_mutex_lock(&e_comp_wl->kbd.focused_mutex); + g_mutex_lock(&e_comp_wl->kbd.keys_mutex); EINA_LIST_FOREACH_SAFE(e_comp_wl->kbd.focused, l, ll, res) { wl_array_for_each(k, &e_comp_wl->kbd.keys) @@ -2032,6 +2038,7 @@ _e_comp_wl_evas_cb_focus_out(void *data, Evas *evas EINA_UNUSED, Evas_Object *ob e_comp_wl->kbd.focused = eina_list_remove_list(e_comp_wl->kbd.focused, l); } + g_mutex_unlock(&e_comp_wl->kbd.keys_mutex); g_mutex_unlock(&e_comp_wl->kbd.focused_mutex); } @@ -4619,8 +4626,6 @@ e_comp_wl_init(void) if (!e_foreign_global_init(e_comp_wl->wl.disp)) ELOGF("COMP", "Failed to initialize the e_foreign global", NULL); - g_mutex_init(&_wl_display_mutex); - /* prepend a mouse move event handler to prevent the mouse move event from being delivered to the other mouse move event handlers when a pointer constraint is activated */ E_LIST_HANDLER_PREPEND(handlers, ECORE_EVENT_MOUSE_MOVE, _e_comp_wl_cb_mouse_move_preventer, NULL); @@ -5280,6 +5285,8 @@ e_comp_wl_key_down(Ecore_Event_Key *ev, E_Device *dev) } #endif + g_mutex_lock(&e_comp_wl->kbd.keys_mutex); + end = (E_Comp_Wl_Key_Data *)e_comp_wl->kbd.keys.data + (e_comp_wl->kbd.keys.size / sizeof(*k)); for (k = e_comp_wl->kbd.keys.data; k < end; k++) @@ -5287,10 +5294,13 @@ e_comp_wl_key_down(Ecore_Event_Key *ev, E_Device *dev) /* ignore server-generated key repeats */ if (k->key == keycode) { + g_mutex_unlock(&e_comp_wl->kbd.keys_mutex); return EINA_FALSE; } } + g_mutex_unlock(&e_comp_wl->kbd.keys_mutex); + if ((!e_client_action_get()) && (!e_comp->input_key_grabs)) { ec = e_client_focused_get(); @@ -5302,13 +5312,17 @@ e_comp_wl_key_down(Ecore_Event_Key *ev, E_Device *dev) _e_comp_wl_key_send(ev, dev, WL_KEYBOARD_KEY_STATE_PRESSED, e_comp_wl->kbd.focused, ec); /* A key only sent to clients is added to the list */ + g_mutex_lock(&e_comp_wl->kbd.keys_mutex); e_comp_wl->kbd.keys.size = (const char *)end - (const char *)e_comp_wl->kbd.keys.data; + if (!(k = wl_array_add(&e_comp_wl->kbd.keys, sizeof(*k)))) { DBG("wl_array_add: Out of memory\n"); + g_mutex_unlock(&e_comp_wl->kbd.keys_mutex); g_mutex_unlock(&e_comp_wl->kbd.focused_mutex); return EINA_FALSE; } + g_mutex_unlock(&e_comp_wl->kbd.keys_mutex); k->key = keycode; k->dev = ev->dev; } @@ -5341,6 +5355,8 @@ e_comp_wl_key_up(Ecore_Event_Key *ev, E_Device *dev) return EINA_FALSE; } + g_mutex_lock(&e_comp_wl->kbd.keys_mutex); + end = (E_Comp_Wl_Key_Data *)e_comp_wl->kbd.keys.data + (e_comp_wl->kbd.keys.size / sizeof(*k)); for (k = e_comp_wl->kbd.keys.data; k < end; k++) { @@ -5354,7 +5370,10 @@ e_comp_wl_key_up(Ecore_Event_Key *ev, E_Device *dev) e_comp_wl->kbd.keys.size = (const char *)end - (const char *)e_comp_wl->kbd.keys.data; + g_mutex_unlock(&e_comp_wl->kbd.keys_mutex); + /* If a key down event have been sent to clients, send a key up event to client for garantee key event sequence pair. (down/up) */ + g_mutex_lock(&e_comp->input_key_grabs_mutex); if ((delivered_key) || ((!e_client_action_get()) && (!e_comp->input_key_grabs))) { @@ -5367,6 +5386,7 @@ e_comp_wl_key_up(Ecore_Event_Key *ev, E_Device *dev) } g_mutex_unlock(&e_comp_wl->kbd.focused_mutex); } + g_mutex_unlock(&e_comp->input_key_grabs_mutex); /* update modifier state */ e_comp_wl_input_keyboard_state_update(keycode, EINA_FALSE); diff --git a/src/bin/e_comp_wl.h b/src/bin/e_comp_wl.h index bd61b4f..b8d0153 100644 --- a/src/bin/e_comp_wl.h +++ b/src/bin/e_comp_wl.h @@ -228,8 +228,9 @@ struct _E_Comp_Wl_Data int repeat_rate; unsigned int num_devices; GMutex mod_changed_mutex; - GMutex resource_mutex; - GMutex focused_mutex; + GMutex resource_mutex; /* for resources variable */ + GMutex focused_mutex; /* for focused variable */ + GMutex keys_mutex; /* for keys variable */ } kbd; struct diff --git a/src/bin/e_comp_wl_input.c b/src/bin/e_comp_wl_input.c index 1599fe0..7c8b39a 100644 --- a/src/bin/e_comp_wl_input.c +++ b/src/bin/e_comp_wl_input.c @@ -349,6 +349,7 @@ e_comp_wl_input_keyboard_enter_send(E_Client *ec) g_mutex_lock(&ec->comp_data->surface_mutex); g_mutex_lock(&e_comp_wl->kbd.mod_changed_mutex); g_mutex_lock(&e_comp_wl->kbd.focused_mutex); + g_mutex_lock(&e_comp_wl->kbd.keys_mutex); EINA_LIST_FOREACH(e_comp_wl->kbd.focused, l, res) { wl_keyboard_send_enter(res, serial, ec->comp_data->surface, @@ -359,6 +360,7 @@ e_comp_wl_input_keyboard_enter_send(E_Client *ec) e_comp_wl->kbd.mod_locked, e_comp_wl->kbd.mod_group); } + g_mutex_unlock(&e_comp_wl->kbd.keys_mutex); g_mutex_unlock(&e_comp_wl->kbd.focused_mutex); g_mutex_unlock(&e_comp_wl->kbd.mod_changed_mutex); g_mutex_unlock(&ec->comp_data->surface_mutex); @@ -1403,6 +1405,7 @@ e_comp_wl_input_init(void) g_mutex_init(&e_comp_wl->kbd.mod_changed_mutex); 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->xkb.keymap_mutex); g_mutex_init(&e_comp_wl->xkb.state_mutex); @@ -1461,8 +1464,10 @@ e_comp_wl_input_init(void) _e_comp_wl_input_cb_surface_commit, NULL); - + g_mutex_lock(&e_comp_wl->kbd.keys_mutex); wl_array_init(&e_comp_wl->kbd.keys); + g_mutex_unlock(&e_comp_wl->kbd.keys_mutex); + wl_array_init(&e_comp_wl->kbd.routed_keys); E_EVENT_TEXT_INPUT_PANEL_VISIBILITY_CHANGE = ecore_event_type_new(); @@ -1529,7 +1534,10 @@ e_comp_wl_input_shutdown(void) wl_resource_destroy(res); /* destroy e_comp_wl->kbd.keys array */ + g_mutex_lock(&e_comp_wl->kbd.keys_mutex); wl_array_release(&e_comp_wl->kbd.keys); + g_mutex_unlock(&e_comp_wl->kbd.keys_mutex); + wl_array_release(&e_comp_wl->kbd.routed_keys); /* unmap any existing keyboard area */ @@ -1574,6 +1582,8 @@ e_comp_wl_input_shutdown(void) g_mutex_clear(&e_comp_wl->xkb.keymap_mutex); g_mutex_clear(&e_comp_wl->xkb.state_mutex); + + g_mutex_clear(&e_comp_wl->kbd.keys_mutex); } EINTERN Eina_Bool