e_info: add ec list information for printing topvwins 89/198689/1 accepted/tizen/unified/20190129.064409 submit/tizen/20190129.011240
authorDoyoun Kang <doyoun.kang@samsung.com>
Tue, 29 Jan 2019 01:08:25 +0000 (10:08 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Tue, 29 Jan 2019 01:08:25 +0000 (10:08 +0900)
Change-Id: I8a144c1fd7716b18cc24a7ad5d3eb479f6bfffad

src/bin/e_info_client.c
src/bin/e_info_server.c

index aafa4446a71def21d0bd98ce67dfa0b278e3c8c4..00b3836ffbf4408cbad7d62dd404aced4ea5c843 100644 (file)
@@ -975,6 +975,113 @@ finish:
    if (new_s2) free(new_s2);
 }
 
+static void
+_cb_vec_info_get(const Eldbus_Message *msg)
+{
+   const char *name = NULL, *text = NULL;
+   Eldbus_Message_Iter *array;
+   char *engine;
+   Eina_Bool res;
+
+   res = eldbus_message_error_get(msg, &name, &text);
+   EINA_SAFETY_ON_TRUE_GOTO(res, finish);
+
+   res = eldbus_message_arguments_get(msg, "iiiiisiia("VALUE_TYPE_FOR_TOPVWINS")",
+                                      &e_info_client.use_gl, &e_info_client.use_hwc, &e_info_client.use_multi_layer,
+                                      &e_info_client.hwc, &e_info_client.hwc_windows, &engine,
+                                      &e_info_client.use_buffer_flush, &e_info_client.deiconify_approve,
+                                      &array);
+   EINA_SAFETY_ON_FALSE_GOTO(res, finish);
+   e_info_client.engine = eina_stringshare_add(engine);
+
+   _e_win_info_make_array(array);
+
+finish:
+   if ((name) || (text))
+     {
+        printf("errname:%s errmsg:%s\n", name, text);
+     }
+}
+
+static void
+_e_info_client_proc_ec_list_info(void)
+{
+   E_Win_Info *win;
+   Eina_List *l;
+   int i = 0;
+   int prev_layer = -1;
+   int hwc_off = 0;
+
+   const char *prev_layer_name = NULL;
+
+   if (!_e_info_client_eldbus_message("get_ec_info", _cb_vec_info_get))
+     return;
+
+   printf("\n\n%d Top level windows in EC list\n", eina_list_count(e_info_client.win_list));
+   printf("--------------------------------------[ topvwins ]----------------------------------------------------------------------------------\n");
+   printf(" No   Win_ID    RcsID    PID     w     h       x      y  Foc InReg Dep Opaq Vsbt Icon Vis Map  Frame  PL@ZPos  Parent     Title\n");
+   printf("------------------------------------------------------------------------------------------------------------------------------------\n");
+
+   if (!e_info_client.win_list)
+     {
+        printf("no ECs\n");
+        return;
+     }
+
+   EINA_LIST_FOREACH(e_info_client.win_list, l, win)
+     {
+        if (!win) return;
+        char tmp[20];
+        i++;
+        if (win->layer != prev_layer)
+          {
+             if (prev_layer != -1)
+                printf("------------------------------------------------------------------------------------------------------------------------------------[%s]\n",
+                       prev_layer_name ? prev_layer_name : " ");
+             prev_layer = win->layer;
+             prev_layer_name = win->layer_name;
+          }
+
+        if (win->hwc >= 0)
+          {
+             if ((!win->iconic) && (win->frame_visible))
+               {
+                  if (win->pl_zpos == -999)
+                    snprintf(tmp, sizeof(tmp), " - ");
+                  else
+                    {
+                       if (win->hwc) snprintf(tmp, sizeof(tmp), "hwc@%i", win->pl_zpos);
+                       else snprintf(tmp, sizeof(tmp), "comp@%i", win->pl_zpos);
+                    }
+               }
+             else
+               snprintf(tmp, sizeof(tmp), " - ");
+          }
+        else // hwc is not initialized or hwc_deactive 1
+          {
+             hwc_off = 1;
+             snprintf(tmp, sizeof(tmp), " - ");
+          }
+
+        printf("%3d 0x%08zx  %5d  %5d  %5d %5d %6d %6d   %c    %c   %3d  %2d   ", i, win->id, win->res_id, win->pid, win->w, win->h, win->x, win->y, win->focused ? 'O':' ', win->has_input_region?'C':' ', win->alpha? 32:24, win->opaque);
+        printf("%2d    %d   %d   %s   %3d    %-8s %-8zx   %s\n", win->visibility, win->iconic, win->vis, win->mapped? "V":"N", win->frame_visible, tmp, win->parent_id, win->name?:"No Name");
+     }
+
+   if (prev_layer_name)
+      printf("------------------------------------------------------------------------------------------------------------------------------------[%s]\n",
+             prev_layer_name ? prev_layer_name : " ");
+
+   if(hwc_off)
+     printf("\nHWC is disabled\n\n");
+
+   E_FREE_LIST(e_info_client.win_list, _e_win_info_free);
+   if (e_info_client.engine)
+     {
+        eina_stringshare_del(e_info_client.engine);
+        e_info_client.engine = NULL;
+     }
+}
+
 static void
 _e_info_client_proc_topvwins_info(int argc, char **argv)
 {
@@ -987,7 +1094,7 @@ _e_info_client_proc_topvwins_info(int argc, char **argv)
    const char *prev_layer_name = NULL;
 
    if (!_e_info_client_eldbus_message("get_window_info", _cb_vwindow_info_get))
-     return;
+     goto ec_info;
 
    printf("GL :  %s\n", e_info_client.use_gl ? "on":"off");
    printf("ENG:  %s\n", e_info_client.engine);
@@ -1013,7 +1120,7 @@ _e_info_client_proc_topvwins_info(int argc, char **argv)
    else
      printf("Deiconify Approve: %s\n", e_info_client.deiconify_approve ? "on":"off");
 
-   printf("\n%d Top level windows\n", eina_list_count(e_info_client.win_list));
+   printf("\n%d Top level windows in evas object list\n", eina_list_count(e_info_client.win_list));
    printf("--------------------------------------[ topvwins ]----------------------------------------------------------------------------------\n");
    printf(" No   Win_ID    RcsID    PID     w     h       x      y  Foc InReg Dep Opaq Vsbt Icon Vis Map  Frame  PL@ZPos  Parent     Title\n");
    printf("------------------------------------------------------------------------------------------------------------------------------------\n");
@@ -1021,12 +1128,12 @@ _e_info_client_proc_topvwins_info(int argc, char **argv)
    if (!e_info_client.win_list)
      {
         printf("no window\n");
-        return;
+        goto ec_info;
      }
 
    EINA_LIST_FOREACH(e_info_client.win_list, l, win)
      {
-        if (!win) return;
+        if (!win) goto ec_info;
         char tmp[20];
         i++;
         if (win->layer != prev_layer)
@@ -1076,6 +1183,10 @@ _e_info_client_proc_topvwins_info(int argc, char **argv)
         eina_stringshare_del(e_info_client.engine);
         e_info_client.engine = NULL;
      }
+
+ec_info:
+   _e_info_client_proc_ec_list_info();
+
 }
 
 static void
index da95c447beb61ef19d29109d87c2d18265a81896..1f955f5e4fb9ad66152e73db81b0dae5f477864c 100644 (file)
@@ -223,6 +223,88 @@ _e_info_server_ec_hwc_info_get(E_Client *ec, int *hwc, int *pl_zpos)
      }
 }
 
+static void
+_msg_ecs_append(Eldbus_Message_Iter *iter, Eina_Bool is_visible)
+{
+   Eldbus_Message_Iter *array_of_ec;
+   E_Client *ec;
+
+   eldbus_message_iter_arguments_append(iter, "a("VALUE_TYPE_FOR_TOPVWINS")", &array_of_ec);
+
+   // append clients.
+   E_CLIENT_REVERSE_FOREACH(ec)
+     {
+        Eldbus_Message_Iter* struct_of_ec;
+        Ecore_Window win;
+        Ecore_Window pwin;
+        uint32_t res_id = 0;
+        pid_t pid = -1;
+        char layer_name[32];
+        int hwc = -1, pl_zpos = -999;
+        int iconified = 0;
+        Eina_Bool has_input_region = EINA_FALSE;
+        Eina_List *list_input_region = NULL;
+        Eina_Bool mapped = EINA_FALSE;
+
+        if (!ec) continue;
+        if (is_visible && e_client_util_ignored_get(ec)) continue;
+
+        win = e_client_util_win_get(ec);
+        e_comp_layer_name_get(ec->layer, layer_name, sizeof(layer_name));
+
+        pwin = e_client_util_win_get(ec->parent);
+
+        if (ec->pixmap)
+          res_id = e_pixmap_res_id_get(ec->pixmap);
+
+        pid = ec->netwm.pid;
+        if (pid <= 0)
+          {
+             if (ec->comp_data)
+               {
+                  E_Comp_Wl_Client_Data *cdata = (E_Comp_Wl_Client_Data*)ec->comp_data;
+                  if (cdata->surface)
+                    wl_client_get_credentials(wl_resource_get_client(cdata->surface), &pid, NULL, NULL);
+               }
+          }
+
+        if (ec->iconic)
+          {
+             if (ec->exp_iconify.by_client)
+               iconified = 2;
+             else
+               iconified = 1;
+          }
+        else
+          iconified = 0;
+
+        if (ec->comp_data)
+          mapped = ec->comp_data->mapped;
+
+        _e_info_server_ec_hwc_info_get(ec, &hwc, &pl_zpos);
+
+        e_comp_object_input_rect_get(ec->frame, &list_input_region);
+        if (list_input_region && (eina_list_count(list_input_region) > 0))
+          has_input_region = EINA_TRUE;
+
+        eldbus_message_iter_arguments_append(array_of_ec, "("VALUE_TYPE_FOR_TOPVWINS")", &struct_of_ec);
+
+        eldbus_message_iter_arguments_append
+           (struct_of_ec, VALUE_TYPE_FOR_TOPVWINS,
+            win,
+            res_id,
+            pid,
+            e_client_util_name_get(ec) ?: "NO NAME",
+            ec->x, ec->y, ec->w, ec->h, ec->layer,
+            ec->visible, mapped, ec->argb, ec->visibility.opaque, ec->visibility.obscured, iconified,
+            evas_object_visible_get(ec->frame), ec->focused, hwc, pl_zpos, pwin, layer_name, has_input_region);
+
+        eldbus_message_iter_container_close(array_of_ec, struct_of_ec);
+     }
+
+   eldbus_message_iter_container_close(iter, array_of_ec);
+}
+
 static void
 _msg_clients_append(Eldbus_Message_Iter *iter, Eina_Bool is_visible)
 {
@@ -343,6 +425,27 @@ _e_info_server_cb_window_info_get(const Eldbus_Service_Interface *iface EINA_UNU
    return reply;
 }
 
+/* Method Handlers */
+static Eldbus_Message *
+_e_info_server_cb_ec_info_get(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
+{
+   Eldbus_Message *reply = eldbus_message_method_return_new(msg);
+   Eldbus_Message_Iter *iter = eldbus_message_iter_get(reply);
+
+   eldbus_message_iter_basic_append(iter, 'i', e_comp_config_get()->engine);
+   eldbus_message_iter_basic_append(iter, 'i', e_comp_config_get()->hwc);
+   eldbus_message_iter_basic_append(iter, 'i', e_comp_config_get()->hwc_use_multi_plane);
+   eldbus_message_iter_basic_append(iter, 'i', e_comp->hwc);
+   eldbus_message_iter_basic_append(iter, 'i', _e_info_server_is_hwc_windows());
+   eldbus_message_iter_basic_append(iter, 's', ecore_evas_engine_name_get(e_comp->ee));
+   eldbus_message_iter_basic_append(iter, 'i', e_config->use_buffer_flush);
+   eldbus_message_iter_basic_append(iter, 'i', e_config->deiconify_approve);
+
+   _msg_ecs_append(iter, EINA_TRUE);
+
+   return reply;
+}
+
 /* Method Handlers */
 static Eldbus_Message *
 _e_info_server_cb_all_window_info_get(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
@@ -5737,6 +5840,7 @@ _e_info_server_cb_input_region(const Eldbus_Service_Interface *iface EINA_UNUSED
 //{ "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({"iiiiisa("VALUE_TYPE_FOR_TOPVWINS")", "array of ec"}), _e_info_server_cb_window_info_get, 0 },
+   { "get_ec_info", NULL, ELDBUS_ARGS({"iiiiisa("VALUE_TYPE_FOR_TOPVWINS")", "array of ec"}), _e_info_server_cb_ec_info_get, 0 },
    { "get_all_window_info", NULL, ELDBUS_ARGS({"a("VALUE_TYPE_FOR_TOPVWINS")", "array of ec"}), _e_info_server_cb_all_window_info_get, 0 },
    { "compobjs", NULL, ELDBUS_ARGS({"a("SIGNATURE_COMPOBJS_CLIENT")", "array of comp objs"}), _e_info_server_cb_compobjs, 0 },
    { "subsurface", NULL, ELDBUS_ARGS({"a("SIGNATURE_SUBSURFACE")", "array of ec"}), _e_info_server_cb_subsurface, 0 },