[e_info] add "-wm", "-size" and "-all" options for the wininfo
authorKonstantin Drabeniuk <k.drabeniuk@samsung.com>
Tue, 16 May 2017 11:28:37 +0000 (14:28 +0300)
committerSooChan Lim <sc1.lim@samsung.com>
Thu, 25 May 2017 23:26:07 +0000 (08:26 +0900)
Change-Id: Ibe2745c85b15cdcff47b8804eaa57dc03168ae75
Signed-off-by: Konstantin Drabeniuk <k.drabeniuk@samsung.com>
src/bin/e_info_client.c
src/bin/e_info_server.c

index fad931626b2418b90cac03fe3a72ee65396082eb..e056820f5e8ff57d5ca2487f23f9ba4461b1209f 100644 (file)
@@ -3039,8 +3039,46 @@ finish:
      }
 }
 
+static void
+_e_info_client_cb_wininfo_print_hints(const Eldbus_Message *msg)
+{
+   const char *name = NULL, *text = NULL;
+   Eina_Bool res;
+   Eldbus_Message_Iter *array_of_hints;
+   int count = 0;
+   char *hint;
+
+   res = eldbus_message_error_get(msg, &name, &text);
+   EINA_SAFETY_ON_TRUE_GOTO(res, finish);
+
+   res = eldbus_message_arguments_get(msg, "as", &array_of_hints);
+   EINA_SAFETY_ON_FALSE_GOTO(res, finish);
+
+   while (eldbus_message_iter_get_and_next(array_of_hints, 's', &hint))
+     {
+        printf("   %s\n", hint);
+        count++;
+     }
+
+   if (!count)
+     printf("   No window hints\n");
+
+   ecore_main_loop_quit();
+
+   return;
+
+finish:
+   if ((name) || (text))
+     {
+        printf("errname:%s errmsg:%s\n", name, text);
+     }
+
+   ecore_main_loop_quit();
+}
+
 static Eina_Bool
-_e_info_client_display_wininfo(uint64_t win, int children, int tree, int stats)
+_e_info_client_display_wininfo(uint64_t win, int children, int tree, int stats,
+                               int wm, int size)
 {
    Eina_Bool res;
    char *win_name;
@@ -3055,6 +3093,9 @@ _e_info_client_display_wininfo(uint64_t win, int children, int tree, int stats)
 
    free(win_name);
 
+   if (!children && !tree && !wm && !size)
+     stats = 1;
+
    if ((children || tree))
      {
         res = _e_info_client_eldbus_message_with_args("wininfo_tree",
@@ -3063,8 +3104,6 @@ _e_info_client_display_wininfo(uint64_t win, int children, int tree, int stats)
                                                       win, tree);
         EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EINA_FALSE);
      }
-   else
-     stats = 1;
 
    if (stats)
      {
@@ -3075,6 +3114,26 @@ _e_info_client_display_wininfo(uint64_t win, int children, int tree, int stats)
         EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EINA_FALSE);
      }
 
+   if (wm)
+     {
+        printf("\nAux_Hint:\n");
+        res = _e_info_client_eldbus_message_with_args("wininfo_hints",
+                                                      _e_info_client_cb_wininfo_print_hints,
+                                                      "it",
+                                                      1, win);
+        EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EINA_FALSE);
+     }
+
+   if (size)
+     {
+        printf("\nSize hints:\n");
+        res = _e_info_client_eldbus_message_with_args("wininfo_hints",
+                                                      _e_info_client_cb_wininfo_print_hints,
+                                                      "it",
+                                                      0, win);
+        EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EINA_FALSE);
+     }
+
    return EINA_TRUE;
 }
 
@@ -3089,13 +3148,16 @@ _e_info_client_display_wininfo(uint64_t win, int children, int tree, int stats)
   "\t-name windowname  : use the window with the specified name\n" \
   "\t-pid windowpid    : use the window with the specified id\n" \
   "\t-int              : print window id in decimal\n" \
+  "\t-size             : print size hints\n" \
+  "\t-wm               : print window manager hints\n" \
+  "\t-all              : -tree, -stats, -wm, -size\n" \
 
 static void
 _e_info_client_proc_wininfo(int argc, char **argv)
 {
    Eina_Bool res;
    uint64_t win = 0;
-   int i, children = 0, tree = 0, stats = 0;
+   int i, children = 0, tree = 0, stats = 0, wm = 0, size = 0;
    char *name = NULL, *pid = NULL;
    Eina_List *win_list = NULL, *l;
 
@@ -3169,6 +3231,24 @@ _e_info_client_proc_wininfo(int argc, char **argv)
              window_id_format_dec = 1;
              continue;
           }
+        if (eina_streq (argv[i], "-wm"))
+          {
+             wm = 1;
+             continue;
+          }
+        if (eina_streq (argv[i], "-size"))
+          {
+             size = 1;
+             continue;
+          }
+        if (eina_streq (argv[i], "-all"))
+          {
+             tree = 1;
+             stats = 1;
+             wm = 1;
+             size = 1;
+             continue;
+          }
 
         goto usage;
      }
@@ -3187,7 +3267,6 @@ _e_info_client_proc_wininfo(int argc, char **argv)
           }
      }
 
-
    if (!win && !win_list)
      {
         printf("Please select the window about which you\n"
@@ -3202,7 +3281,7 @@ _e_info_client_proc_wininfo(int argc, char **argv)
 
    if (win)
      {
-        res = _e_info_client_display_wininfo(win, children, tree, stats);
+        res = _e_info_client_display_wininfo(win, children, tree, stats, wm, size);
         EINA_SAFETY_ON_FALSE_RETURN(res);
      }
    else
@@ -3212,7 +3291,7 @@ _e_info_client_proc_wininfo(int argc, char **argv)
              uint64_t win;
 
              win = (uint64_t)((Ecore_Window)eina_list_data_get(l));
-             res = _e_info_client_display_wininfo(win, children, tree, stats);
+             res = _e_info_client_display_wininfo(win, children, tree, stats, wm, size);
              EINA_SAFETY_ON_FALSE_GOTO(res, finish);
           }
      }
index 5486aeeeb36c29b6ad546bf276e3d67081e68313..480fb21327715deb26c0d1cc946b389a1aab8f6b 100755 (executable)
@@ -3482,6 +3482,93 @@ _e_info_server_cb_wininfo(const Eldbus_Service_Interface *iface EINA_UNUSED, con
    return reply;
 }
 
+static void
+_e_info_server_cb_wininfo_size_hints_append(E_Client *ec, Eldbus_Message_Iter *array_of_hints)
+{
+   char temp[512] = {0};
+   Evas_Coord w, h, l, r, t, b;
+   double x, y;
+
+   evas_object_size_hint_min_get(ec->frame, &w, &h);
+   snprintf(temp, sizeof(temp), "   min: h(%d), v(%d)", w, h);
+   eldbus_message_iter_arguments_append(array_of_hints, "s", temp);
+
+   evas_object_size_hint_max_get(ec->frame, &w, &h);
+   snprintf(temp, sizeof(temp), "   max: h(%d), v(%d)", w, h);
+   eldbus_message_iter_arguments_append(array_of_hints, "s", temp);
+
+   evas_object_size_hint_request_get(ec->frame, &w, &h);
+   snprintf(temp, sizeof(temp), "   request: h(%d), v(%d)", w, h);
+   eldbus_message_iter_arguments_append(array_of_hints, "s", temp);
+
+   evas_object_size_hint_align_get(ec->frame, &x, &y);
+   snprintf(temp, sizeof(temp), "   align: x(%f), y(%f)", x, y);
+   eldbus_message_iter_arguments_append(array_of_hints, "s", temp);
+
+   evas_object_size_hint_weight_get(ec->frame, &x, &y);
+   snprintf(temp, sizeof(temp), "   weight: x(%f), y(%f)", x, y);
+   eldbus_message_iter_arguments_append(array_of_hints, "s", temp);
+
+   evas_object_size_hint_padding_get(ec->frame, &l, &r, &t, &b);
+   snprintf(temp, sizeof(temp), "   padding: l(%d), r(%d), t(%d), b(%d)",
+            l, r, t, b);
+   eldbus_message_iter_arguments_append(array_of_hints, "s", temp);
+}
+
+static void
+_e_info_server_cb_wininfo_wm_hints_append(E_Client *ec, Eldbus_Message_Iter *array_of_hints)
+{
+   Eina_List *l;
+   E_Comp_Wl_Aux_Hint *hint;
+   char temp[512] = {0};
+
+   if (!ec->comp_data)
+     return;
+
+   EINA_LIST_FOREACH(ec->comp_data->aux_hint.hints, l, hint)
+     {
+        snprintf(temp, sizeof(temp), "%s: %s", hint->hint, hint->val);
+        eldbus_message_iter_arguments_append(array_of_hints, "s", temp);
+     }
+}
+
+static Eldbus_Message *
+_e_info_server_cb_wininfo_hints(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
+{
+   Eldbus_Message *reply;
+   Eldbus_Message_Iter *iter, *array_of_hints;
+   Eina_Bool res;
+   E_Client *ec;
+   uint64_t win;
+   int wm_mode;
+
+   res = eldbus_message_arguments_get(msg, "it", &wm_mode, &win);
+   if (res != EINA_TRUE)
+     {
+        return eldbus_message_error_new(msg, GET_CALL_MSG_ARG_ERR,
+                      "wininfo_hints: an attempt to get arguments from method call message failed");
+     }
+
+   ec = _e_info_server_ec_find_by_win(win);
+   if (!ec)
+     {
+        return eldbus_message_error_new(msg, WIN_NOT_EXIST,
+                      "wininfo_hints: specified window(s) doesn't exist");
+     }
+
+   reply = eldbus_message_method_return_new(msg);
+   iter = eldbus_message_iter_get(reply);
+
+   eldbus_message_iter_arguments_append(iter, "as", &array_of_hints);
+   if (wm_mode)
+      _e_info_server_cb_wininfo_wm_hints_append(ec, array_of_hints);
+   else
+      _e_info_server_cb_wininfo_size_hints_append(ec, array_of_hints);
+   eldbus_message_iter_container_close(iter, array_of_hints);
+
+   return reply;
+}
+
 static const Eldbus_Method methods[] = {
    { "get_window_info", NULL, ELDBUS_ARGS({"a("VALUE_TYPE_FOR_TOPVWINS")", "array of ec"}), _e_info_server_cb_window_info_get, 0 },
    { "compobjs", NULL, ELDBUS_ARGS({"a("SIGNATURE_COMPOBJS_CLIENT")", "array of comp objs"}), _e_info_server_cb_compobjs, 0 },
@@ -3528,6 +3615,7 @@ static const Eldbus_Method methods[] = {
    { "get_windows", ELDBUS_ARGS({"is", "mode, value"}), ELDBUS_ARGS({"at", "array_of_windows"}), _e_info_server_cb_get_windows, 0 },
    { "wininfo", ELDBUS_ARGS({VALUE_TYPE_REQUEST_FOR_WININFO, "window"}), ELDBUS_ARGS({VALUE_TYPE_REPLY_WININFO, "window info"}), _e_info_server_cb_wininfo, 0 },
    { "wininfo_tree", ELDBUS_ARGS({VALUE_TYPE_REQUEST_FOR_WININFO_TREE, "wininfo_tree"}), ELDBUS_ARGS({VALUE_TYPE_REPLY_WININFO_TREE, "window tree info"}), _e_info_server_cb_wininfo_tree, 0 },
+   { "wininfo_hints", ELDBUS_ARGS({"it", "mode, window"}), ELDBUS_ARGS({"as", "window hints"}), _e_info_server_cb_wininfo_hints, 0 },
    { NULL, NULL, NULL, NULL, 0 }
 };