e_info: Modified the option to print the elapsed times for mouse events 27/317727/1
authorInhong Han <inhong1.han@samsung.com>
Fri, 13 Sep 2024 06:24:59 +0000 (15:24 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Fri, 13 Sep 2024 07:23:21 +0000 (16:23 +0900)
Change-Id: I5ac74c30371735b6e5d0a926886db2788a69a53a

src/bin/debug/e_info_client.c
src/bin/debug/e_info_server.c
src/bin/debug/e_info_server_input.c
src/bin/debug/e_info_server_input_intern.h
src/bin/inputmgr/e_input_backend.c
src/bin/inputmgr/e_input_backend_intern.h
src/bin/server/e_comp_wl.c
src/bin/server/e_comp_wl_input_thread.c
src/include/e_info_shared_types.h

index b72c7038262062a820ce5c13232330cd684a7bfc..07c0d787200b5596a1f136f4115a69bb8cb7dabc 100644 (file)
@@ -6562,29 +6562,25 @@ _e_info_client_proc_input_subtype_set(int argc, char **argv)
 }
 
 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
@@ -7310,10 +7306,10 @@ ProcInfo procs_to_input[] =
       _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",
index 68eba010543246df962a5701091caf211c96cc6d..ba2a81aa75eaafb05699ce0de48869b23cc30cba 100644 (file)
@@ -7420,21 +7420,25 @@ end:
 }
 
 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;
@@ -7566,7 +7570,7 @@ static const Eldbus_Method methods[] = {
    { 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 }
 };
index c52056da6baf63de6f122bfe80df0798c977297e..ff215b6d9c01a14a2e9c25736573d10a60dd5a6a 100644 (file)
@@ -681,5 +681,15 @@ e_info_server_input_key_elapsed_time(int count)
 
    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
index 1dca8ec60fb12af371b2932e5146689b1201b2fe..5ccd7aca36f5f882d46ed3d9cc5114fcf250f9f2 100644 (file)
@@ -8,5 +8,6 @@
 
 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
index 30599e393b3e41e8af05b115cb982aecc7649138..47754c9fc47172267975d43c5e79feccbac51df7 100644 (file)
@@ -42,8 +42,11 @@ static gboolean input_thread_prepare(GSource *source, gint *time);
 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 = {
@@ -803,10 +806,10 @@ _cb_input_dispatch(void *data, Ecore_Fd_Handler *hdlr EINA_UNUSED)
 }
 
 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;
@@ -815,16 +818,16 @@ _e_input_stddev_get(double avg)
         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;
@@ -836,25 +839,25 @@ _e_input_key_elapsed_time_print()
    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);
 
@@ -864,9 +867,9 @@ _e_input_key_elapsed_time_print()
    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
@@ -876,7 +879,7 @@ _e_input_delayed_key_events_print()
    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)
@@ -884,11 +887,11 @@ _e_input_delayed_key_events_print()
         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))
@@ -906,6 +909,32 @@ _e_input_delayed_key_events_print()
    _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)
 {
@@ -921,6 +950,9 @@ 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();
@@ -1964,25 +1996,59 @@ e_input_backend_log_level_set(E_Input_Backend *input, unsigned int level)
 }
 
 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
index 14c5fbe22f7bbc595413d6a789a3bf9ed1bd6c9a..bc9ac2f4b0c3ebe2c7402b95515250fa81800106 100644 (file)
@@ -61,5 +61,8 @@ EINTERN void             e_input_backend_destroy(E_Input_Backend *input);
 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
index 065d07124309a75b83256077d0f0e3cbe92883e9..da83d93f41ce958018ecdfd905fd5ff1f2d41ed0 100644 (file)
@@ -1685,6 +1685,9 @@ _e_comp_wl_evas_cb_mouse_move(void *data, Evas *evas EINA_UNUSED, Evas_Object *o
            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)
@@ -1776,6 +1779,9 @@ _e_comp_wl_evas_cb_mouse_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *o
          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);
 
@@ -1855,6 +1861,9 @@ _e_comp_wl_evas_cb_mouse_up(void *data, Evas *evas, Evas_Object *obj, void *even
 
    _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)
@@ -1946,6 +1955,9 @@ _e_comp_wl_evas_cb_mouse_wheel(void *data, Evas *evas EINA_UNUSED, Evas_Object *
            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);
index 114892d748687fcd570d4378e2d7ff854216e7ee..a9a0d112d974bf436939c0ddbd4c258b31f51aff 100644 (file)
@@ -6,6 +6,7 @@
 #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>
 
@@ -271,6 +272,9 @@ _e_comp_wl_cb_mouse_move_thread_mode(void *d EINA_UNUSED, int t EINA_UNUSED, voi
            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
@@ -357,6 +361,9 @@ _e_comp_wl_cb_mouse_button_down_thread_mode(void *d EINA_UNUSED, int t EINA_UNUS
          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);
@@ -435,6 +442,9 @@ _e_comp_wl_cb_mouse_button_up_thread_mode(void *d EINA_UNUSED, int t EINA_UNUSED
         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))
@@ -479,6 +489,9 @@ _e_comp_wl_cb_mouse_wheel_thread_mode(void *d EINA_UNUSED, int t EINA_UNUSED, vo
    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);
index 4e213176c1b576544d0fa68053c2c5c3af58daf8..309a63e18ede8d1be1768c778f52f76e0e4d589a 100644 (file)
@@ -408,4 +408,10 @@ typedef enum
    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_ */