[e-info] add a "-format" option for the wininfo 39/131339/2 sandbox/srk/e-info
authorKonstantin Drabeniuk <k.drabeniuk@samsung.com>
Fri, 26 May 2017 11:50:09 +0000 (14:50 +0300)
committerKonstantin Drabeniuk <k.drabeniuk@samsung.com>
Fri, 26 May 2017 11:52:44 +0000 (14:52 +0300)
Change-Id: I56dd42e65096755a53b3cad2c672e76d99219b5a
Signed-off-by: Konstantin Drabeniuk <k.drabeniuk@samsung.com>
src/bin/e_info_client.c
src/bin/e_info_server.c

index a9bd06cf28445b7ca142319a3876492348e3f143..6829ff6387e3eb5f9fee7e7f94e787cb673efcd9 100644 (file)
@@ -3242,9 +3242,43 @@ finish:
    ecore_main_loop_quit();
 }
 
+static void
+_e_info_client_cb_wininfo_print_format(const Eldbus_Message *msg)
+{
+   const char *name = NULL, *text = NULL;
+   Eina_Bool res;
+   int32_t w, h;
+   const char *format_str = NULL, *buffer_type_str = NULL;
+
+   res = eldbus_message_error_get(msg, &name, &text);
+   EINA_SAFETY_ON_TRUE_GOTO(res, finish);
+
+   res = eldbus_message_arguments_get(msg,
+                                      "ssii",
+                                      &buffer_type_str,
+                                      &format_str,
+                                      &w,
+                                      &h);
+   EINA_SAFETY_ON_FALSE_GOTO(res, finish);
+
+   printf("\n   Buffer type: %s\n"
+          "   Format: %s\n"
+          "   Width: %d\n"
+          "   Height: %d\n",
+          buffer_type_str, format_str, w, h);
+
+   return;
+
+finish:
+   if ((name) || (text))
+     {
+        printf("errname:%s errmsg:%s\n", name, text);
+     }
+}
+
 static Eina_Bool
 _e_info_client_display_wininfo(uint64_t win, int children, int tree, int stats,
-                               int wm, int size, int shape)
+                               int wm, int size, int shape, int format)
 {
    Eina_Bool res;
    char *win_name;
@@ -3259,7 +3293,7 @@ _e_info_client_display_wininfo(uint64_t win, int children, int tree, int stats,
 
    free(win_name);
 
-   if (!children && !tree && !wm && !size && !shape)
+   if (!children && !tree && !wm && !size && !shape && !format)
      stats = 1;
 
    if ((children || tree))
@@ -3309,6 +3343,15 @@ _e_info_client_display_wininfo(uint64_t win, int children, int tree, int stats,
         EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EINA_FALSE);
      }
 
+   if (format)
+     {
+        res = _e_info_client_eldbus_message_with_args("wininfo_format",
+                                                      _e_info_client_cb_wininfo_print_format,
+                                                      "t",
+                                                      win);
+        EINA_SAFETY_ON_FALSE_RETURN_VAL(res, EINA_FALSE);
+     }
+
    return EINA_TRUE;
 }
 
@@ -3326,7 +3369,8 @@ _e_info_client_display_wininfo(uint64_t win, int children, int tree, int stats,
   "\t-size             : print size hints\n" \
   "\t-wm               : print window manager hints\n" \
   "\t-shape            : print shape rectangles\n" \
-  "\t-all              : -tree, -stats, -wm, -size, -shape\n" \
+  "\t-format           : print the buffer info\n" \
+  "\t-all              : -tree, -stats, -wm, -size, -shape -format\n" \
   "Example:\n" \
   "\tenlightenment_info -wininfo\n" \
   "\tenlightenment_info -wininfo -id [win_id] -all\n" \
@@ -3339,7 +3383,7 @@ _e_info_client_proc_wininfo(int argc, char **argv)
 {
    Eina_Bool res;
    uint64_t win = 0;
-   int i, children = 0, tree = 0, stats = 0, wm = 0, size = 0, shape = 0;
+   int i, children = 0, tree = 0, stats = 0, wm = 0, size = 0, shape = 0, format = 0;
    char *name = NULL, *pid = NULL;
    Eina_List *win_list = NULL, *l;
 
@@ -3428,6 +3472,11 @@ _e_info_client_proc_wininfo(int argc, char **argv)
              shape = 1;
              continue;
           }
+        if (eina_streq (argv[i], "-format"))
+          {
+             format = 1;
+             continue;
+          }
         if (eina_streq (argv[i], "-all"))
           {
              tree = 1;
@@ -3435,6 +3484,7 @@ _e_info_client_proc_wininfo(int argc, char **argv)
              wm = 1;
              size = 1;
              shape = 1;
+             format = 1;
              continue;
           }
 
@@ -3469,7 +3519,8 @@ _e_info_client_proc_wininfo(int argc, char **argv)
 
    if (win)
      {
-        res = _e_info_client_display_wininfo(win, children, tree, stats, wm, size, shape);
+        res = _e_info_client_display_wininfo(win, children, tree, stats, wm,
+                                             size, shape, format);
         EINA_SAFETY_ON_FALSE_RETURN(res);
      }
    else
@@ -3479,7 +3530,8 @@ _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, wm, size, shape);
+             res = _e_info_client_display_wininfo(win, children, tree, stats, wm,
+                                                  size, shape, format);
              EINA_SAFETY_ON_FALSE_GOTO(res, finish);
           }
      }
index 72e0ed5cf88eef878dee75b3a404893579a0f4e2..64f15efd2eabd53cec4d04d454f3159d4a993fb7 100755 (executable)
@@ -46,6 +46,7 @@ void wl_map_for_each(struct wl_map *map, void *func, void *data);
 #define INVALID_PROPERTY_NAME        ERR_BASE"InvalidPropertyName"
 #define FAIL_TO_SET_PROPERTY         ERR_BASE"FailedToSetProperty"
 #define FAIL_TO_GET_PROPERTY         ERR_BASE"FailedToGetProperty"
+#define WININFO_FORMAT_FAIL          ERR_BASE"WininfoFormatFail"
 
 E_API int E_EVENT_INFO_ROTATION_MESSAGE = -1;
 
@@ -106,6 +107,9 @@ enum
    E_INFO_SERVER_SIGNAL_WIN_UNDER_TOUCH = 0
 };
 
+extern char *
+_tbm_surface_internal_format_to_str(tbm_format format);
+
 static E_Info_Transform *_e_info_transform_new(E_Client *ec, int id, int enable, int x, int y, int sx, int sy, int degree, int background);
 static E_Info_Transform *_e_info_transform_find(E_Client *ec, int id);
 static void              _e_info_transform_set(E_Info_Transform *transform, int enable, int x, int y, int sx, int sy, int degree);
@@ -4464,7 +4468,6 @@ _e_info_server_wininfo_tree_info_add(E_Client *ec, Eldbus_Message_Iter *iter,
                 num_child = eina_list_count(child->transients);
 
 #ifdef ENABLE_HWC_MULTI
-
                 if ((!child->iconic) && (!child->visibility.obscured) &&
                     evas_object_visible_get(ec->frame))
                   _e_info_server_ec_hwc_info_get(child, &hwc, &pl_zpos);
@@ -4730,6 +4733,101 @@ _e_info_server_cb_wininfo_shape(const Eldbus_Service_Interface *iface EINA_UNUSE
    return reply;
 }
 
+static char *
+_e_comp_wl_buffer_type_to_str(E_Comp_Wl_Buffer_Type type)
+{
+   if (type == E_COMP_WL_BUFFER_TYPE_SHM) return "E_COMP_WL_BUFFER_TYPE_SHM";
+   else if (type == E_COMP_WL_BUFFER_TYPE_NATIVE) return "E_COMP_WL_BUFFER_TYPE_NATIVE";
+   else if (type == E_COMP_WL_BUFFER_TYPE_VIDEO) return "E_COMP_WL_BUFFER_TYPE_VIDEO";
+   else if (type == E_COMP_WL_BUFFER_TYPE_TBM) return "E_COMP_WL_BUFFER_TYPE_TBM";
+
+   return "E_COMP_WL_BUFFER_TYPE_NONE";
+}
+
+static char *
+_wl_shm_format_to_str(uint32_t format)
+{
+   if (format == WL_SHM_FORMAT_ARGB8888) return "WL_SHM_FORMAT_ARGB8888";
+   else if (format == WL_SHM_FORMAT_XRGB8888) return "WL_SHM_FORMAT_XRGB8888";
+
+   return "unknwon";
+}
+
+static Eldbus_Message *
+_e_info_server_cb_wininfo_format(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
+{
+   Eldbus_Message *reply;
+   Eina_Bool res;
+   E_Client *ec;
+   uint64_t win;
+   int32_t w, h;
+   uint32_t format;
+   const char *format_str = NULL, *buffer_type_str = NULL;
+   E_Comp_Wl_Buffer *buffer = NULL;
+   struct wl_shm_buffer *shm_buffer;
+   tbm_surface_h tbm_surface;
+   tbm_surface_info_s info = {0};
+
+   res = eldbus_message_arguments_get(msg, "t", &win);
+   if (res != EINA_TRUE)
+     {
+        return eldbus_message_error_new(msg, GET_CALL_MSG_ARG_ERR,
+                      "wininfo_format: 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_format: specified window(s) doesn't exist");
+     }
+
+   buffer = e_pixmap_resource_get(ec->pixmap);
+   if (!buffer)
+     return eldbus_message_error_new(msg, WININFO_FORMAT_FAIL, "wininfo_format: cannot get Comp_Wl_Buffer");
+
+   switch (buffer->type)
+     {
+      case E_COMP_WL_BUFFER_TYPE_SHM:
+         shm_buffer = wl_shm_buffer_get(buffer->resource);
+         if (!buffer)
+           return eldbus_message_error_new(msg, WININFO_FORMAT_FAIL, "wininfo_format: cannot get shm_buffer");
+
+         w = wl_shm_buffer_get_width(shm_buffer);
+         h = wl_shm_buffer_get_height(shm_buffer);
+         format = wl_shm_buffer_get_format(shm_buffer);
+         format_str = _wl_shm_format_to_str(format);
+
+         break;
+      case E_COMP_WL_BUFFER_TYPE_NATIVE:
+      case E_COMP_WL_BUFFER_TYPE_VIDEO:
+      case E_COMP_WL_BUFFER_TYPE_TBM:
+         tbm_surface = wayland_tbm_server_get_surface(e_comp_wl->tbm.server, buffer->resource);
+         if (!tbm_surface)
+           return eldbus_message_error_new(msg, WININFO_FORMAT_FAIL, "wininfo_format: cannot get tbm_surface");
+
+         if (tbm_surface_get_info(tbm_surface, &info) != TBM_SURFACE_ERROR_NONE)
+            return eldbus_message_error_new(msg, WININFO_FORMAT_FAIL, "wininfo_format: cannot get surface info");
+
+         w = (int32_t)info.width;
+         h = (int32_t)info.height;
+         format = info.format;
+         format_str = _tbm_surface_internal_format_to_str(format);
+
+         break;
+      default:
+         return eldbus_message_error_new(msg, WININFO_FORMAT_FAIL, "wininfo_format: unknown buffer type");
+     }
+
+   buffer_type_str = _e_comp_wl_buffer_type_to_str(buffer->type);
+
+   reply = eldbus_message_method_return_new(msg);
+
+   eldbus_message_arguments_append(reply, "ssii", buffer_type_str, format_str,
+                                   w, h);
+
+   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 },
@@ -4778,6 +4876,7 @@ static const Eldbus_Method methods[] = {
    { "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 },
    { "wininfo_shape", ELDBUS_ARGS({"t", "window"}), ELDBUS_ARGS({"ia(iiii)ia(iiii)", "window shape"}), _e_info_server_cb_wininfo_shape, 0 },
+   { "wininfo_format", ELDBUS_ARGS({"t", "window"}), ELDBUS_ARGS({"ssii", "window format"}), _e_info_server_cb_wininfo_format, 0 },
    { NULL, NULL, NULL, NULL, 0 }
 };