E_CONFIG_VAL(D, T, resize_object.image_path, STR);
E_CONFIG_VAL(D, T, calc_vis_ignore_geometry, UINT);
E_CONFIG_VAL(D, T, input_thread_mode, UCHAR);
+ E_CONFIG_VAL(D, T, key_input_time_limit, UINT);
}
static Eina_Bool
E_CONFIG_LIMIT(e_config->resize_object.border_width.b, 0, 128);
E_CONFIG_LIMIT(e_config->calc_vis_ignore_geometry, 0, 1);
E_CONFIG_LIMIT(e_config->input_thread_mode, 0, 1);
+ E_CONFIG_LIMIT(e_config->key_input_time_limit, 0, 500);
}
EINTERN int
if (comp_conf && comp_conf->input_log_enable)
ELOGF("Key", "%s (keyname: %s, keycode: %d, timestamp: %u, device: %s)", NULL, state?"Press":"Release", e->keyname, e->keycode, e->timestamp, device_name);
+ _e_input_key_event_list_add(e);
+
if (e_input_thread_mode_get())
{
e->dev = (Eo *)g_object_ref(e_dev);
static gboolean input_thread_prepare(GSource *source, gint *time);
static E_Input_Event_Source *g_input_event_source = NULL;
+static GList *_key_event_list = NULL;
GSourceFuncs input_event_funcs = {
.prepare = input_thread_prepare,
return EINA_TRUE;
}
+static void
+_e_input_delayed_key_events_print()
+{
+ struct timespec tp;
+ unsigned int time;
+
+ clock_gettime(CLOCK_MONOTONIC, &tp);
+ time = (tp.tv_sec * 1000) + (tp.tv_nsec / 1000000L);
+
+ for (GList *list = g_list_first(_key_event_list); list; list = list->next)
+ {
+ Ecore_Event_Key *key = (Ecore_Event_Key *)list->data;
+ if (!key) continue;
+
+ if (e_config->key_input_time_limit <= (time - key->timestamp))
+ ERR("Delayed key event : keyname(%s), keycode(%u), timestamp(%u), elapsed_time(%u ms)", key->keyname, key->keycode, key->timestamp, time - key->timestamp);
+
+ if (key->keyname)
+ eina_stringshare_del(key->keyname);
+ E_FREE(key);
+
+ _key_event_list = g_list_delete_link(_key_event_list, list);
+ }
+ _key_event_list = NULL;
+}
+
static gboolean
input_thread_prepare(GSource *source, gint *time)
{
/* flush only focused client events */
e_comp_wl_focused_client_flush();
+ if (_key_event_list)
+ _e_input_delayed_key_events_print();
+
if (time)
*time = -1;
input->input_thread = NULL;
}
+void
+_e_input_key_event_list_add(Ecore_Event_Key *key)
+{
+ Ecore_Event_Key *clone = E_NEW(Ecore_Event_Key, 1);
+ if (!clone || !key) return;
+
+ if (key->keyname)
+ clone->keyname = (char *)eina_stringshare_add(key->keyname);
+
+ clone->keycode = key->keycode;
+ clone->timestamp = key->timestamp;
+
+ _key_event_list = g_list_append(_key_event_list, clone);
+}
+
EINTERN Eina_Bool
e_input_enable_input(E_Input_Backend *input)
{