e_info: Added method for get current focus history. 97/213897/2
authorJunseok, Kim <juns.kim@samsung.com>
Mon, 16 Sep 2019 08:51:58 +0000 (17:51 +0900)
committerJunseok, Kim <juns.kim@samsung.com>
Mon, 16 Sep 2019 11:51:25 +0000 (20:51 +0900)
Change-Id: Ic9a72652bde12169b0885993bd0099a6ff8875a6

src/bin/e_client.c
src/bin/e_client.h
src/bin/e_info_client.c
src/bin/e_info_server.c

index d08f33d7c05968984fefe8da78c78fdc5a89d696..59e2bf78060add85c7ace4a09c2c645e8c17f5a9 100644 (file)
@@ -853,6 +853,12 @@ _e_client_focus_can_take(E_Client *ec)
    return EINA_TRUE;
 }
 
+EINTERN Eina_Bool
+e_client_focus_can_take(E_Client *ec)
+{
+   return _e_client_focus_can_take(ec);
+}
+
 static E_Client *
 _e_client_focus_topmost_focusable_get()
 {
index 614376aeefb5016a07171fef1c4dd9083eac5961..02af174d2f4e6b6cd0ddaf069f0b23d228032050 100644 (file)
@@ -1072,6 +1072,7 @@ E_API E_Client_Hook *e_client_hook_add(E_Client_Hook_Point hookpoint, E_Client_H
 E_API void e_client_hook_del(E_Client_Hook *ch);
 E_API E_Client_Intercept_Hook *e_client_intercept_hook_add(E_Client_Intercept_Hook_Point hookpoint, E_Client_Intercept_Hook_Cb func, const void *data);
 E_API void e_client_intercept_hook_del(E_Client_Intercept_Hook *ch);
+EINTERN Eina_Bool e_client_focus_can_take(E_Client *ec);
 EINTERN void e_client_focus_stack_lower(E_Client *ec);
 E_API void e_client_focus_latest_set(E_Client *ec);
 EINTERN void e_client_focus_stack_append_current_focused(E_Client *ec);
index f7bf84e74d222d6301d651420ad231a2f6c7e64b..473b017bc2a3677f1d90decb672f42461a17d291 100644 (file)
@@ -5134,6 +5134,69 @@ _e_info_client_proc_screen_info(int argc, char **argv)
    return;
 }
 
+static void
+_e_info_client_cb_focus_history(const Eldbus_Message *msg)
+{
+   const char *errname = NULL, *errtext = NULL;
+   Eldbus_Message_Iter *array = NULL, *iter = NULL;
+   Eina_Bool res = EINA_FALSE;
+   unsigned int i = 0;
+
+   EINA_SAFETY_ON_TRUE_GOTO(eldbus_message_error_get(msg, &errname, &errtext), err);
+   EINA_SAFETY_ON_FALSE_GOTO(eldbus_message_arguments_get(msg, "a(ubbbs)", &array), err);
+
+   if (array)
+     {
+        printf("---------------------------------[ focus history ]----------------------------------\n");
+        printf("   No     Win_ID     focused     focusable     focus_skip     title\n");
+        printf("------------------------------------------------------------------------------------\n");
+        while (eldbus_message_iter_get_and_next(array, 'r', &iter))
+          {
+             Eina_Bool focused, focusable, skiped;
+             Ecore_Window id;
+             const char *title;
+
+             res = eldbus_message_iter_arguments_get(iter, "ubbbs", &id, &focused, &focusable, &skiped, &title);
+             if (!res)
+               {
+                  printf("Failed to get focus stack\n");
+                  continue;
+               }
+
+             printf("   %2u     0x%08zx     %c           %c              %c         %-20s\n",
+                    i++, id, focused? 'O':' ', focusable? 'O':'X', skiped? 'O':' ', title);
+             printf("------------------------------------------------------------------------------------\n");
+          }
+     }
+   else
+     goto err;
+
+   return;
+
+err:
+   if(errname || errtext)
+     printf("errname : %s, errmsg : %s\n", errname, errtext);
+   else
+     printf("Error occurred in _e_info_client_cb_focus_history\n");
+
+   return;
+}
+
+static void
+_e_info_client_proc_focus_history(int argc, char **argv)
+{
+   EINA_SAFETY_ON_FALSE_GOTO(argc == 2, usage);
+
+   _e_info_client_eldbus_message("focus_history", _e_info_client_cb_focus_history);
+
+   return;
+
+usage :
+   printf("Usage : %s -focus_history\n\n", argv[0]);
+
+   return;
+}
+
 typedef struct _ProcInfo
 {
    const char *option;
@@ -5453,6 +5516,12 @@ static ProcInfo procs_to_execute[] =
       "On/Off magnifier window",
       _e_info_client_magnifier
    },
+   {
+      "focus_history",
+      NULL,
+      "get focus history",
+      _e_info_client_proc_focus_history
+   },
 };
 
 static Eina_List *list_tracelogs = NULL;
index ea1a09cd67cf544f4d4edce9f436dfdfd74c686f..19892ad799a4c07974a1de765eddd5a19b26cc13 100644 (file)
@@ -6157,6 +6157,40 @@ _e_info_server_cb_screen_info_get(const Eldbus_Service_Interface *iface EINA_UNU
    return reply;
 }
 
+static Eldbus_Message *
+_e_info_server_cb_focus_history(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
+{
+   Eldbus_Message *reply;
+   Eldbus_Message_Iter *iter, *array;
+   Eina_List *focus_stack = NULL, *l = NULL;
+   E_Client *focused = NULL, *ec = NULL;
+
+   reply = eldbus_message_method_return_new(msg);
+   iter = eldbus_message_iter_get(reply);
+   eldbus_message_iter_arguments_append(iter, "a(ubbbs)", &array);
+
+   focus_stack = e_client_focus_stack_get();
+   focused = e_client_focused_get();
+
+   EINA_LIST_FOREACH(focus_stack, l, ec)
+     {
+        Eldbus_Message_Iter *str;
+        eldbus_message_iter_arguments_append(array, "(ubbbs)", &str);
+
+        eldbus_message_iter_arguments_append(str, "ubbbs",
+                                             e_client_util_win_get(ec),
+                                             (focused == ec),
+                                             e_client_focus_can_take(ec),
+                                             (ec->icccm.accepts_focus && ec->icccm.take_focus),
+                                             ec->icccm.name ?: "NO_NAME");
+        eldbus_message_iter_container_close(array, str);
+     }
+   eldbus_message_iter_container_close(iter, array);
+
+
+   return reply;
+}
+
 //{ "method_name", arguments_from_client, return_values_to_client, _method_cb, ELDBUS_METHOD_FLAG },
 static const Eldbus_Method methods[] = {
    { "get_window_info", NULL, ELDBUS_ARGS({"iiiiisiiia("VALUE_TYPE_FOR_TOPVWINS")", "array of ec"}), _e_info_server_cb_window_info_get, 0 },
@@ -6226,6 +6260,7 @@ static const Eldbus_Method methods[] = {
    { "input_region", ELDBUS_ARGS({"siiii", "options"}), ELDBUS_ARGS({"a(iiii)", "path"}), _e_info_server_cb_input_region, 0},
    { "hwc_wins", ELDBUS_ARGS({"i", "option"}), ELDBUS_ARGS({"as", "hwc wins info"}), _e_info_server_cb_hwc_wins_info_get, 0 },
    { "screen_info", ELDBUS_ARGS({"i", "option"}), ELDBUS_ARGS({"as", "screen info"}), _e_info_server_cb_screen_info_get, 0 },
+   { "focus_history", NULL, ELDBUS_ARGS({"a(ubbbs)", "history array"}), _e_info_server_cb_focus_history, 0 },
    { NULL, NULL, NULL, NULL, 0 }
 };