}
void
-_e_info_client_proc_key_elapsed_time(int argc, char **argv)
+_e_info_client_proc_input_elapsed_time(int argc, char **argv)
{
int count = 0;
- if (argc == 3)
+ if (argc == 4)
{
- count = atoi(argv[2]);
- if (count <= 0)
- {
- printf("Error Check Args: enlightenment_info -key_elapsed_time [count > 0]\n");
- return;
- }
+ count = atoi(argv[3]);
+ EINA_SAFETY_ON_FALSE_GOTO((!strcmp(argv[2], "key")) ||
+ (!strcmp(argv[2], "mouse")), usage);
+ EINA_SAFETY_ON_FALSE_GOTO((count > 0), usage);
- if (!_e_info_client_eldbus_message_with_args("key_elapsed_time", NULL, "i", count))
+ if (!_e_info_client_eldbus_message_with_args("input_elapsed_time", NULL, "si", argv[2], count))
printf("_e_info_client_eldbus_message_with_args error");
- }
- else
- {
- printf("Error Check Args: enlightenment_info -key_elapsed_time [count > 0]\n");
+
return;
}
- return;
+usage:
+ printf("Usage: %s", USAGE_INPUT_ELAPSED_TIME);
}
static void
_e_info_client_proc_input_subtype_set
},
{
- "key_elapsed_time", /* Option */
- "NULL",/* Params */
- "Print key events elapsed time (default path:/tmp/elapsed_time.txt)", /* Description */
- _e_info_client_proc_key_elapsed_time /* func */
+ "input_elapsed_time", /* Option */
+ USAGE_INPUT_ELAPSED_TIME,/* Params */
+ "Print input events elapsed time (default path:/tmp/elapsed_time.txt)", /* Description */
+ _e_info_client_proc_input_elapsed_time /* func */
},
{
"pointer_thread_mode",
}
static Eldbus_Message *
-_e_info_server_cb_key_elapsed_time(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
+_e_info_server_cb_input_elapsed_time(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
{
Eldbus_Message *reply;
char *result = NULL;
+ const char *type = NULL;
int count = 0;
- if (!eldbus_message_arguments_get(msg, "i", &count))
+ if (!eldbus_message_arguments_get(msg, "si", &type, &count))
{
- return eldbus_message_error_new(msg, "Key_elapsed_timeFailed",
- "input_log: an attempt to set key_elapsed_time from method call message failed");
+ return eldbus_message_error_new(msg, "Input_elapsed_timeFailed",
+ "input_log: an attempt to set input_elapsed_time from method call message failed");
}
- result = e_info_server_input_key_elapsed_time(count);
- reply = eldbus_message_method_return_new(msg);
+ if (!e_util_strcmp(type, "key"))
+ result = e_info_server_input_key_elapsed_time(count);
+ else if (!e_util_strcmp(type, "mouse"))
+ result = e_info_server_input_mouse_elapsed_time(count);
+ reply = eldbus_message_method_return_new(msg);
eldbus_message_arguments_append(reply, "s", result);
return reply;
{ VIDEO_SHELL_BORDER_METHOD_NAME, ELDBUS_ARGS({"b", "The command for border of video viewport"}), NULL, _e_info_server_cb_video_shell_border, 0},
{ VIDEO_SHELL_INFO_METHOD_NAME, ELDBUS_ARGS({"s", "Print video shell information"}), NULL, _e_info_server_cb_video_shell_info, 0},
{ VIDEO_SHELL_TRANSFORM_METHOD_NAME, ELDBUS_ARGS({"siiiiiii", "Transform video viewport"}), NULL, _e_info_server_cb_video_shell_transform, 0},
- { "key_elapsed_time", ELDBUS_ARGS({"i", "key elapsed time"}), ELDBUS_ARGS({"s", "result message"}), _e_info_server_cb_key_elapsed_time, 0},
+ { "input_elapsed_time", ELDBUS_ARGS({"si", "input elapsed time"}), ELDBUS_ARGS({"s", "result message"}), _e_info_server_cb_input_elapsed_time, 0},
{ "pointer_thread_mode", ELDBUS_ARGS({"i", "set pointer_thread_mode"}), NULL, _e_info_server_cb_pointer_thread_mode, 0 },
{ NULL, NULL, NULL, NULL, 0 }
};
e_input_backend_key_elapsed_time_print(count);
+ return E_INFO_INPUT_RESULT_NONE;
+}
+
+EINTERN char *
+e_info_server_input_mouse_elapsed_time(int count)
+{
+ if (count <= 0) return "count is not valid";
+
+ e_input_backend_mouse_elapsed_time_print(count);
+
return E_INFO_INPUT_RESULT_NONE;
}
\ No newline at end of file
EINTERN char *e_info_server_input_log_enable_set(int state);
EINTERN char *e_info_server_input_key_elapsed_time(int count);
+EINTERN char *e_info_server_input_mouse_elapsed_time(int count);
#endif
static E_Input_Backend *g_input_backend = NULL;
static E_Input_Event_Source *g_input_event_source = NULL;
static GList *_key_event_list = NULL;
-static GList *_elapsed_time_list = NULL;
-static int _print_count = 0;
+static GList *_key_elapsed_time_list = NULL;
+static int _print_key_count = 0;
+static GList *_mouse_event_list = NULL;
+static GList *_mouse_elapsed_time_list = NULL;
+static int _print_mouse_count = 0;
static Eina_Bool g_pointer_thread_mode = EINA_FALSE;
GSourceFuncs input_event_funcs = {
}
static double
-_e_input_stddev_get(double avg)
+_e_input_stddev_get(GList *time_list, int count, double avg)
{
double sum = 0;
- GList *list = g_list_first(_elapsed_time_list);
+ GList *list = g_list_first(time_list);
while (list)
{
unsigned long int temp_time = (uintptr_t)list->data;
list = list->next;
}
- return sqrt(sum / _print_count);
+ return sqrt(sum / count);
}
static void
-_e_input_key_elapsed_time_print()
+_e_input_event_elapsed_time_print(GList *time_list, int *count)
{
char file_path[128] = {'\0', };
FILE *fp = NULL;
- int min = G_MAXINT;
- int max = 0;
+ double min = G_MAXDOUBLE;
+ double max = 0;
double sum = 0;
double avg = 0;
double std = 0;
fp = fopen(file_path, "w");
if (fp)
{
- fprintf(fp, "count=%d\n", _print_count);
- GList *elapsed_time_list = g_list_first(_elapsed_time_list);
+ fprintf(fp, "count=%d\n", *count);
+ GList *elapsed_time_list = g_list_first(time_list);
while (elapsed_time_list)
{
unsigned long int temp_time = (uintptr_t)elapsed_time_list->data;
- unsigned int elapsed_time = (unsigned int)temp_time;
+ double elapsed_time = (double)temp_time / 100;
if (min > elapsed_time) min = elapsed_time;
if (max < elapsed_time) max = elapsed_time;
sum += elapsed_time;
elapsed_time_list = elapsed_time_list->next;
- fprintf(fp, "%u\n", elapsed_time);
+ fprintf(fp, "%.2f\n", elapsed_time);
}
- avg = sum / _print_count;
- std = _e_input_stddev_get(avg);
+ avg = sum / *count;
+ std = _e_input_stddev_get(time_list, *count, avg);
- fprintf(fp, "min=%d\n", min);
- fprintf(fp, "max=%d\n", max);
+ fprintf(fp, "min=%.2f\n", min);
+ fprintf(fp, "max=%.2f\n", max);
fprintf(fp, "avg=%.2f\n", avg);
fprintf(fp, "std=%.2f\n", std);
else
ERR("Failed to create /tmp/elapsed_time.txt");
- _print_count = 0;
- g_list_free(_elapsed_time_list);
- _elapsed_time_list = NULL;
+ *count = 0;
+ g_list_free(time_list);
+ time_list = NULL;
}
static void
unsigned int time;
clock_gettime(CLOCK_MONOTONIC, &tp);
- time = (tp.tv_sec * 1000) + (tp.tv_nsec / 1000000L);
+ time = (tp.tv_sec * 100000) + (tp.tv_nsec / 10000L);
GList *key_list = g_list_first(_key_event_list);
while (key_list)
Ecore_Event_Key *key = (Ecore_Event_Key *)key_list->data;
if (!key) continue;
- if (_print_count > 0)
+ if (_print_key_count > 0)
{
- _elapsed_time_list = g_list_append(_elapsed_time_list, (void *)(uintptr_t)(time - key->timestamp));
- if (_print_count == g_list_length(_elapsed_time_list))
- _e_input_key_elapsed_time_print();
+ _key_elapsed_time_list = g_list_append(_key_elapsed_time_list, (void *)(uintptr_t)(time - (key->timestamp * 100)));
+ if (_print_key_count == g_list_length(_key_elapsed_time_list))
+ _e_input_event_elapsed_time_print(_key_elapsed_time_list, &_print_key_count);
}
if (e_config->key_input_time_limit <= (time - key->timestamp))
_key_event_list = NULL;
}
+static void
+_e_input_mouse_elapsed_time_print()
+{
+ struct timespec tp;
+ unsigned int time;
+
+ clock_gettime(CLOCK_MONOTONIC, &tp);
+ time = (tp.tv_sec * 100000) + (tp.tv_nsec / 10000L);
+
+ GList *mouse_list = g_list_first(_mouse_event_list);
+ while (mouse_list)
+ {
+ unsigned long int temp_time = (uintptr_t)mouse_list->data;
+ unsigned int timestamp = (unsigned int)temp_time;
+ _mouse_elapsed_time_list = g_list_append(_mouse_elapsed_time_list, (void *)(uintptr_t)(time - (timestamp * 100)));
+ if (_print_mouse_count == g_list_length(_mouse_elapsed_time_list))
+ _e_input_event_elapsed_time_print(_mouse_elapsed_time_list, &_print_mouse_count);
+
+ GList *next = mouse_list->next;
+ _mouse_event_list = g_list_delete_link(_mouse_event_list, mouse_list);
+ mouse_list = next;
+ }
+
+ _mouse_event_list = NULL;
+}
+
static gboolean
input_thread_prepare(GSource *source, gint *time)
{
if (_key_event_list)
_e_input_delayed_key_events_print();
+ if (_print_mouse_count > 0)
+ _e_input_mouse_elapsed_time_print();
+
if (e_config->key_input_ttrace_enable)
{
TRACE_INPUT_DEVICE_END();
}
static void
-_e_input_thread_cb_print_count_set(void *data)
+_e_input_thread_cb_print_key_count_set(void *data)
{
int count;
EINA_SAFETY_ON_NULL_RETURN(data);
count = *(int *)data;
- _print_count = count;
+ _print_key_count = count;
- if (_elapsed_time_list)
+ if (_key_elapsed_time_list)
{
- g_list_free(_elapsed_time_list);
- _elapsed_time_list = NULL;
+ g_list_free(_key_elapsed_time_list);
+ _key_elapsed_time_list = NULL;
}
}
EINTERN void
e_input_backend_key_elapsed_time_print(int count)
{
- e_input_backend_thread_safe_call(_e_input_thread_cb_print_count_set, &count, sizeof(int));
+ e_input_backend_thread_safe_call(_e_input_thread_cb_print_key_count_set, &count, sizeof(int));
+}
+
+EINTERN Eina_Bool
+e_input_backend_mouse_printing_needed()
+{
+ return (_print_mouse_count > 0) ? EINA_TRUE : EINA_FALSE;
+}
+
+static void
+_e_input_thread_cb_print_mouse_count_set(void *data)
+{
+ int count;
+ EINA_SAFETY_ON_NULL_RETURN(data);
+
+ count = *(int *)data;
+ _print_mouse_count = count;
+
+ if (_mouse_elapsed_time_list)
+ {
+ g_list_free(_mouse_elapsed_time_list);
+ _mouse_elapsed_time_list = NULL;
+ }
+}
+
+EINTERN void
+e_input_backend_mouse_elapsed_time_print(int count)
+{
+ e_input_backend_thread_safe_call(_e_input_thread_cb_print_mouse_count_set, &count, sizeof(int));
+}
+
+void
+e_input_backend_mouse_timestamp_append(unsigned int timestamp)
+{
+ _mouse_event_list = g_list_append(_mouse_event_list, GUINT_TO_POINTER(timestamp));
}
EINTERN Eina_Bool
EINTERN Eina_Bool e_input_backend_libinput_context_create(E_Input_Backend *input);
EINTERN void e_input_backend_log_level_set(E_Input_Backend *input, unsigned int level);
EINTERN void e_input_backend_key_elapsed_time_print(int count);
+EINTERN Eina_Bool e_input_backend_mouse_printing_needed();
+EINTERN void e_input_backend_mouse_elapsed_time_print(int count);
+EINTERN void e_input_backend_mouse_timestamp_append(unsigned int timestamp);
#endif
ec, obj, ev->timestamp, ev->cur.canvas.x, ev->cur.canvas.y, ev->cur.output.x, ev->cur.output.y,
e_client_util_name_get(ec), dev_name);
+ if (e_input_backend_mouse_printing_needed())
+ e_input_backend_mouse_timestamp_append(ev->timestamp);
+
if (dev && (dev_class == EVAS_DEVICE_CLASS_TOUCH))
{
if (!comp_wl->drag_client)
ec, obj, ev->button, ev->timestamp, ev->output.x, ev->output.y, e_client_util_name_get(ec),
dev_name, seat_name);
+ if (e_input_backend_mouse_printing_needed())
+ e_input_backend_mouse_timestamp_append(ev->timestamp);
+
comp_wl = e_comp_wl_get();
_e_comp_wl_device_send_event_device(comp_wl, ec, dev, ev->timestamp);
_e_comp_wl_device_send_event_device(comp_wl, ec, dev, ev->timestamp);
+ if (e_input_backend_mouse_printing_needed())
+ e_input_backend_mouse_timestamp_append(ev->timestamp);
+
if (dev && (dev_class == EVAS_DEVICE_CLASS_TOUCH))
{
if (dev_name)
return;
}
+ if (e_input_backend_mouse_printing_needed())
+ e_input_backend_mouse_timestamp_append(ev->timestamp);
+
_e_comp_wl_device_send_event_device(comp_wl, ec, ev->dev, ev->timestamp);
_e_comp_wl_mouse_wheel_send(comp_wl, ec, ev->direction, ev->z, ev->timestamp);
#include "e_input_thread_client_intern.h"
#include "e_input_thread_client.h"
#include "e_pointer_intern.h"
+#include "e_input_backend_intern.h"
#include <tizen-extension-server-protocol.h>
NULL, ev->timestamp, ev->x, ev->y,
e_input_thread_client_util_name_get(iec), dev_name, dev_class);
+ if (e_input_backend_mouse_printing_needed())
+ e_input_backend_mouse_timestamp_append(ev->timestamp);
+
e_input_thread_client_geometry_get(iec, &client_x, &client_y, NULL, NULL);
// send mouse-out event
NULL, ev->buttons, ev->timestamp, ev->x, ev->y, wl_fixed_from_int(ev->x), wl_fixed_from_int(ev->y),
dev_name);
+ if (e_input_backend_mouse_printing_needed())
+ e_input_backend_mouse_timestamp_append(ev->timestamp);
+
e_input_thread_client_geometry_get(iec, &client_x, &client_y, NULL, NULL);
_e_comp_wl_device_input_thread_send_event_device(iec, dev, ev->timestamp);
goto err;
}
+ if (e_input_backend_mouse_printing_needed())
+ e_input_backend_mouse_timestamp_append(ev->timestamp);
+
e_input_thread_client_geometry_get(iec, &client_x, &client_y, NULL, NULL);
if (dev && (device_class == ECORE_DEVICE_CLASS_TOUCH))
if (!eina_list_count(comp_wl->ptr.resources))
return ECORE_CALLBACK_RENEW;
+ if (e_input_backend_mouse_printing_needed())
+ e_input_backend_mouse_timestamp_append(ev->timestamp);
+
_e_comp_wl_device_input_thread_send_event_device(iec, (E_Device *)ev->dev, ev->timestamp);
e_comp_wl_surface_mouse_wheel_send(comp_wl, surface, ev->direction, ev->z, ev->timestamp);
E_INFO_VIDEO_SHELL_TRANSFORM_UNKNOWN,
} E_Info_Video_Shell_Transform;
+#define USAGE_INPUT_ELAPSED_TIME \
+ "-input_elapsed_time ( key | mouse ) {count > 0}\n" \
+ "Example:\n" \
+ "\twinfo -input_elapsed_time key 100\n" \
+ "\twinfo -input_elapsed_time mouse 200\n"
+
#endif /* end of _E_INFO_SHARED_TYPES_ */