[e_info] split the properties getting into separate functions
authorSergey Sizonov <s.sizonov@samsung.com>
Fri, 28 Apr 2017 13:08:00 +0000 (16:08 +0300)
committerSooChan Lim <sc1.lim@samsung.com>
Thu, 25 May 2017 23:26:07 +0000 (08:26 +0900)
To make some property 'setable' I got to provide separate
function for them. I think it seems reasonable to split the
function responsible for getting properties too.

Change-Id: I1b50ceebeb99b5f9beadbcc28b28d0a780f16885
Signed-off-by: Sergey Sizonov <s.sizonov@samsung.com>
src/bin/e_info_server.c

index 0d12be350a389553929fd00030e21a6716a7e3a2..70ed05a9610c07e6ba12a744bf9614f5d9d17e1b 100755 (executable)
@@ -43,6 +43,9 @@ void wl_map_for_each(struct wl_map *map, void *func, void *data);
 #define INVALID_ARGS         ERR_BASE"InvalidArguments"
 #define GET_CALL_MSG_ARG_ERR ERR_BASE"GetCallMsgArgFailed"
 #define WIN_NOT_EXIST        ERR_BASE"WindowNotExist"
+#define INVALID_PROPERTY_NAME        ERR_BASE"InvalidPropertyName"
+#define FAIL_TO_SET_PROPERTY         ERR_BASE"FailedToSetProperty"
+#define FAIL_TO_GET_PROPERTY         ERR_BASE"FailedToGetProperty"
 
 E_API int E_EVENT_INFO_ROTATION_MESSAGE = -1;
 
@@ -801,284 +804,1111 @@ _e_info_server_cb_res_lists_get(const Eldbus_Service_Interface *iface EINA_UNUSE
    return reply;
 }
 
-#define __WINDOW_PROP_ARG_APPEND(title, value) ({                                    \
-                                                eldbus_message_iter_arguments_append(iter, "(ss)", &struct_of_ec);    \
-                                                eldbus_message_iter_arguments_append(struct_of_ec, "ss", (title), (value));  \
-                                                eldbus_message_iter_container_close(iter, struct_of_ec);})
+/*
+ * behaves like strcat but also dynamically extends buffer when it's needed
+ *
+ * dst - the pointer to result string (dynamically allocated) will be stored to memory 'dst' points to
+ *       '*dst' MUST either point nothing (nullptr) or point a !_dynamically allocated_! null-terminated string
+ *       (e.g. returned by the previous call)
+ * src - null-terminated string to concatenate (can be either statically or dynamically allocated string)
+ *
+ * *dst got to be freed by free() when it's no longer needed
+ *
+ * return -1 in case of an error, 0 otherwise
+ */
+static int
+_astrcat(char **dst, const char *src)
+{
+   int new_size;
+   char *res;
 
-#define __WINDOW_PROP_ARG_APPEND_TYPE(title, str, x...) ({                           \
-                                                         char __temp[128] = {0,};                                                     \
-                                                         snprintf(__temp, sizeof(__temp), str, ##x);                                  \
-                                                         eldbus_message_iter_arguments_append(iter, "(ss)", &struct_of_ec);    \
-                                                         eldbus_message_iter_arguments_append(struct_of_ec, "ss", (title), (__temp)); \
-                                                         eldbus_message_iter_container_close(iter, struct_of_ec);})
+   if (!dst || !src)
+     return -1;
 
-static void
-_msg_window_prop_client_append(Eldbus_Message_Iter *iter, E_Client *target_ec)
+   if (*dst)
+     new_size = strlen(*dst) + strlen(src) + 1; /* + '/0' */
+   else
+     new_size = strlen(src) + 1; /* + '/0' */
+
+   /* if *dst is nullptr realloc behaves like malloc */
+   res = realloc(*dst, new_size);
+   if (!res)
+     return -1;
+
+   /* if we were asked to concatenate to null string */
+   if (!*dst)
+     res[0] = '\0'; /* strncat looks for null-terminated string */
+
+   *dst = res;
+   strncat(*dst, src, new_size - strlen(*dst) - 1);
+
+   return 0;
+}
+
+#define astrcat_(str, mod, x...) ({                                  \
+                                  char *temp = NULL;                 \
+                                  if (asprintf(&temp, mod, ##x) < 0) \
+                                    goto fail;                      \
+                                  if (_astrcat(str, temp) < 0)       \
+                                    {                                \
+                                       free(temp);                   \
+                                       goto fail;                    \
+                                    }                                \
+                                  free(temp); })
+
+static inline const char*
+_get_win_prop_Rotation(const Evas_Object *evas_obj)
 {
-   Eldbus_Message_Iter* struct_of_ec;
-   pid_t pid = -1;
-   char win_resid[16] = {0,};
-   char char_True[] = "TRUE";
-   char char_False[] = "FALSE";
-   char layer_name[48] = {0,};
-   char layer[64] = {0,};
-   char transients[128] = {0,};
-   char shape_rects[128] = {0,};
-   char shape_input[128] = {0,};
+   const E_Client *ec;
+   char *str = NULL;
 
-   if (!target_ec) return;
+   int i, count;
 
-   if (target_ec->pixmap)
-      snprintf(win_resid, sizeof(win_resid), "%d", e_pixmap_res_id_get(target_ec->pixmap));
+   ec = evas_object_data_get(evas_obj, "E_Client");
+   count = ec->e.state.rot.count;
 
-   e_comp_layer_name_get(target_ec->layer, layer_name, sizeof(layer_name));
-   snprintf(layer, sizeof(layer), "[%d, %s]",  target_ec->layer, layer_name);
+   astrcat_(&str, "Support(%d) Type(%s)\n", ec->e.state.rot.support,
+           ec->e.state.rot.type == E_CLIENT_ROTATION_TYPE_NORMAL ? "normal" : "dependent");
 
-   if (target_ec->transients)
+   if (ec->e.state.rot.available_rots && count)
      {
-        E_Client *child;
-        const Eina_List *l;
+        astrcat_(&str, "Availables[%d] ", count);
 
-        EINA_LIST_FOREACH(target_ec->transients, l, child)
-          {
-             char temp[16];
-             snprintf(temp, sizeof(temp), "0x%x", e_client_util_win_get(child));
-             strncat(transients, temp, sizeof(transients) - strlen(transients));
-          }
+        for (i = 0; i < count; i++)
+          astrcat_(&str, "%d ", ec->e.state.rot.available_rots[i]);
      }
+   else
+     astrcat_(&str, "Availables[%d] N/A", count);
 
-   if (target_ec->shape_rects && target_ec->shape_rects_num > 0)
-     {
-        int i = 0;
-        for (i = 0 ; i < target_ec->shape_rects_num ; ++i)
-          {
-             char temp[32];
-             snprintf(temp, sizeof(temp), "[%d,%d,%d,%d] ", target_ec->shape_rects[i].x, target_ec->shape_rects[i].y,
-                      target_ec->shape_rects[i].w, target_ec->shape_rects[i].h);
-             strncat(shape_rects, temp, sizeof(shape_rects) - strlen(shape_rects));
-          }
-     }
 
-   if (target_ec->shape_input_rects && target_ec->shape_input_rects_num > 0)
-     {
-        int i = 0;
-        for (i = 0 ; i < target_ec->shape_input_rects_num ; ++i)
-          {
-             char temp[32];
-             snprintf(temp, sizeof(temp), "[%d,%d,%d,%d] ", target_ec->shape_input_rects[i].x, target_ec->shape_input_rects[i].y,
-                      target_ec->shape_input_rects[i].w, target_ec->shape_input_rects[i].h);
-             strncat(shape_input, temp, sizeof(shape_input) - strlen(shape_input));
-          }
-     }
+   astrcat_(&str, "\nAngle prev(%d) curr(%d) next(%d) reserve(%d) preferred(%d)\n",
+           ec->e.state.rot.ang.prev,
+           ec->e.state.rot.ang.curr,
+           ec->e.state.rot.ang.next,
+           ec->e.state.rot.ang.reserve,
+           ec->e.state.rot.preferred_rot);
+
+   astrcat_(&str, "pending_change_request(%d) pending_show(%d) nopending_render(%d) wait_for_done(%d)\n",
+           ec->e.state.rot.pending_change_request,
+           ec->e.state.rot.pending_show,
+           ec->e.state.rot.nopending_render,
+           ec->e.state.rot.wait_for_done);
+
+   if (ec->e.state.rot.geom_hint)
+     for (i = 0; i < 4; i++)
+       astrcat_(&str, "Geometry hint[%d] %d,%d   %dx%d\n",
+               i,
+               ec->e.state.rot.geom[i].x,
+               ec->e.state.rot.geom[i].y,
+               ec->e.state.rot.geom[i].w,
+               ec->e.state.rot.geom[i].h);
+
+   return str;
+
+fail:
+   free(str);
+   return NULL;
+}
+
+static inline const char*
+_get_win_prop_Transform(const Evas_Object *evas_obj)
+{
+   const E_Client *ec;
+   char *str = NULL;
+
+   int i, count;
 
-   if (target_ec->comp_data)
+   ec = evas_object_data_get(evas_obj, "E_Client");
+   count = e_client_transform_core_transform_count_get(ec);
+
+   astrcat_(&str, "transform count: %d\n", count);
+
+   if (count <= 0)
+     return str;
+
+   astrcat_(&str, "[id] [move] [scale] [rotation] [keep_ratio] [viewport]\n");
+
+   for (i = 0; i < count; ++i)
      {
+        double dsx, dsy;
+        int x = 0, y = 0, rz = 0;
+        int view_port = 0;
+        int vx = 0, vy = 0, vw = 0, vh = 0;
+        E_Util_Transform *transform = NULL;
 
-        E_Comp_Wl_Client_Data *cdata = (E_Comp_Wl_Client_Data*)target_ec->comp_data;
-        if (cdata->surface)
-          {
-             wl_client_get_credentials(wl_resource_get_client(cdata->surface), &pid, NULL, NULL);
-          }
-     }
+        transform = e_client_transform_core_transform_get(ec, i);
+        if (!transform) continue;
 
-   __WINDOW_PROP_ARG_APPEND("[WINDOW PROP]", "[WINDOW PROP]");
-   __WINDOW_PROP_ARG_APPEND_TYPE("Window_ID", "0x%x", e_client_util_win_get(target_ec));
-   __WINDOW_PROP_ARG_APPEND_TYPE("PID", "%d", pid);
-   __WINDOW_PROP_ARG_APPEND("ResourceID", win_resid);
-   __WINDOW_PROP_ARG_APPEND("Window_Name", e_client_util_name_get(target_ec) ?: "NO NAME");
-   __WINDOW_PROP_ARG_APPEND("Role", target_ec->icccm.window_role ?: "NO ROLE");
-   __WINDOW_PROP_ARG_APPEND_TYPE("Geometry", "[%d, %d, %d, %d]", target_ec->x, target_ec->y, target_ec->w, target_ec->h);
-   __WINDOW_PROP_ARG_APPEND_TYPE("ParentWindowID", "0x%x", target_ec->parent ? e_client_util_win_get(target_ec->parent) : 0);
-   __WINDOW_PROP_ARG_APPEND("Transients", transients);
-   __WINDOW_PROP_ARG_APPEND("Shape_rects", shape_rects);
-   __WINDOW_PROP_ARG_APPEND("Shape_input", shape_input);
-   __WINDOW_PROP_ARG_APPEND("Layer", layer);
-   __WINDOW_PROP_ARG_APPEND("Visible",  target_ec->visible ? char_True : char_False);
-   __WINDOW_PROP_ARG_APPEND("32bit",  target_ec->argb ? char_True : char_False);
-   __WINDOW_PROP_ARG_APPEND("Hidden", target_ec->hidden ? char_True : char_False);
-   __WINDOW_PROP_ARG_APPEND("Moving", target_ec->moving ? char_True : char_False);
-   __WINDOW_PROP_ARG_APPEND("Focused", target_ec->focused ? char_True : char_False);
-   __WINDOW_PROP_ARG_APPEND("Iconic", target_ec->iconic ? char_True : char_False);
-   __WINDOW_PROP_ARG_APPEND("Sticky", target_ec->sticky ? char_True : char_False);
-   __WINDOW_PROP_ARG_APPEND("Urgent", target_ec->urgent ? char_True : char_False);
-   __WINDOW_PROP_ARG_APPEND("Fullscreen", target_ec->fullscreen ? char_True : char_False);
-   __WINDOW_PROP_ARG_APPEND("Re_manage", target_ec->re_manage ? char_True : char_False);
-   __WINDOW_PROP_ARG_APPEND("Take_focus", target_ec->take_focus ? char_True : char_False);
-   __WINDOW_PROP_ARG_APPEND("Want_focus", target_ec->want_focus ? char_True : char_False);
-   __WINDOW_PROP_ARG_APPEND_TYPE("E_Maximize_Policy", "0x%x", target_ec->maximized);
-   __WINDOW_PROP_ARG_APPEND_TYPE("E_FullScreen_Policy", "%d", target_ec->fullscreen_policy);
-   __WINDOW_PROP_ARG_APPEND_TYPE("E_Transient_Policy", "%d", target_ec->transient_policy);
-   __WINDOW_PROP_ARG_APPEND("Override", target_ec->override ? char_True : char_False);
-   __WINDOW_PROP_ARG_APPEND("Input_only", target_ec->input_only ? char_True : char_False);
-   __WINDOW_PROP_ARG_APPEND("Dialog", target_ec->dialog ? char_True : char_False);
-   __WINDOW_PROP_ARG_APPEND("Tooltip", target_ec->tooltip ? char_True : char_False);
-   __WINDOW_PROP_ARG_APPEND("Redirected", target_ec->redirected ? char_True : char_False);
-   __WINDOW_PROP_ARG_APPEND("Unredirected_single", target_ec->unredirected_single ? char_True : char_False);
-   __WINDOW_PROP_ARG_APPEND("Shape_changed", target_ec->shape_changed ? char_True : char_False);
-   __WINDOW_PROP_ARG_APPEND("Layer_block", target_ec->layer_block ? char_True : char_False);
-   __WINDOW_PROP_ARG_APPEND("Ignored", target_ec->ignored ? char_True : char_False);
-   __WINDOW_PROP_ARG_APPEND("No_shape_cut", target_ec->no_shape_cut ? char_True : char_False);
-   __WINDOW_PROP_ARG_APPEND("Maximize_override", target_ec->maximize_override ? char_True : char_False);
-   __WINDOW_PROP_ARG_APPEND("Transformed", target_ec->transformed ? char_True : char_False);
-   __WINDOW_PROP_ARG_APPEND_TYPE("Ignore_first_unmap", "%c", target_ec->ignore_first_unmap);
-   __WINDOW_PROP_ARG_APPEND_TYPE("Video Client", "%d",target_ec->comp_data ? target_ec->comp_data->video_client : 0);
-
-   if (target_ec->comp_data)
-     {
-        E_Comp_Wl_Client_Data *cdata = (E_Comp_Wl_Client_Data*)target_ec->comp_data;
-        Eina_List *l;
-        E_Comp_Wl_Aux_Hint *hint;
-
-        EINA_LIST_FOREACH(cdata->aux_hint.hints, l, hint)
+        e_util_transform_move_round_get(transform, &x, &y, NULL);
+        e_util_transform_scale_get(transform, &dsx, &dsy, NULL);
+        e_util_transform_rotation_round_get(transform, NULL, NULL, &rz);
+        view_port = e_util_transform_viewport_flag_get(transform);
+
+        if (view_port)
+          e_util_transform_viewport_get(transform, &vx, &vy, &vw, &vh);
+
+        astrcat_(&str, "transform : [%d] [%d, %d] [%2.1f, %2.1f] [%d] [%d :%d, %d, %d, %d]\n",
+                i, x, y, dsx, dsy, rz, view_port, vx, vy, vw, vh);
+
+        if (e_util_transform_bg_transform_flag_get(transform))
           {
-             __WINDOW_PROP_ARG_APPEND_TYPE("Aux_Hint", "[%d][%s][%s]", hint->id, hint->hint, hint->val);
+             e_util_transform_bg_move_round_get(transform, &x, &y, NULL);
+             e_util_transform_bg_scale_get(transform, &dsx, &dsy, NULL);
+             e_util_transform_bg_rotation_round_get(transform, NULL, NULL, &rz);
+
+             astrcat_(&str, "transform_bg : --------- [%d] [%d, %d] [%2.1f, %2.1f] [%d]",
+                     i, x, y, dsx, dsy, rz);
           }
      }
 
-   if (target_ec->comp_data)
-     {
-        int i;
-        E_Comp_Wl_Client_Data *cdata = (E_Comp_Wl_Client_Data*)target_ec->comp_data;
+   return str;
 
-        if (cdata->sub.data)
-          {
-             __WINDOW_PROP_ARG_APPEND_TYPE("Subsurface Parent", "0x%x", e_client_util_win_get(cdata->sub.data->parent));
-          }
-        else
-          {
-             __WINDOW_PROP_ARG_APPEND_TYPE("Subsurface Parent", "0x%x", 0);
-          }
+fail:
+   free(str);
+   return NULL;
+}
 
-        for ( i = 0 ; i < 2 ; ++i)
-          {
-             Eina_List *list;
-             Eina_List *l;
-             E_Client *child;
-             char buffer[256] = {0,};
+static inline const char*
+_get_win_prop_Subsurface_Below_Child_List(const Evas_Object *evas_obj)
+{
+   const E_Comp_Wl_Client_Data *cdata;
+   const E_Client *ec;
+   char *str = NULL;
 
-             if (i == 0) list = cdata->sub.list;
-             else        list = cdata->sub.below_list;
+   const Eina_List *list;
+   const Eina_List *l;
+   const E_Client *child;
 
+   ec = evas_object_data_get(evas_obj, "E_Client");
 
-             EINA_LIST_FOREACH(list, l, child)
-               {
-                  snprintf(buffer + strlen(buffer), sizeof(buffer) - strlen(buffer) - 1, "0x%x, ", e_client_util_win_get(child));
-               }
+   if (!ec->comp_data)
+     return strdup("None");
 
-             if (i == 0) __WINDOW_PROP_ARG_APPEND("Subsurface Child List", buffer);
-             else        __WINDOW_PROP_ARG_APPEND("Subsurface Below Child List", buffer);
-          }
-     }
+   cdata = (E_Comp_Wl_Client_Data*)ec->comp_data;
+   list = cdata->sub.below_list;
 
-   __WINDOW_PROP_ARG_APPEND_TYPE("Transform_count", "%d", e_client_transform_core_transform_count_get(target_ec));
-   if (e_client_transform_core_transform_count_get(target_ec) > 0)
-     {
-        int i;
-        int count = e_client_transform_core_transform_count_get(target_ec);
+   EINA_LIST_FOREACH(list, l, child)
+     astrcat_(&str, "0x%x, ", e_client_util_win_get(child));
 
-        __WINDOW_PROP_ARG_APPEND(" ", "[id] [move] [scale] [rotation] [keep_ratio] [viewport]");
-        for (i = 0 ; i < count ; ++i)
-          {
-             double dsx, dsy;
-             int x = 0, y = 0, rz = 0;
-             int view_port = 0;
-             int vx = 0, vy = 0, vw = 0, vh = 0;
-             E_Util_Transform *transform = NULL;
+   return str;
 
-             transform = e_client_transform_core_transform_get(target_ec, i);
-             if (!transform) continue;
+fail:
+   free(str);
+   return NULL;
+}
 
-             e_util_transform_move_round_get(transform, &x, &y, NULL);
-             e_util_transform_scale_get(transform, &dsx, &dsy, NULL);
-             e_util_transform_rotation_round_get(transform, NULL, NULL, &rz);
-             view_port = e_util_transform_viewport_flag_get(transform);
+static inline const char*
+_get_win_prop_Subsurface_Child_List(const Evas_Object *evas_obj)
+{
+   const E_Comp_Wl_Client_Data *cdata;
+   const E_Client *ec;
+   char *str = NULL;
 
-             if (view_port)
-               {
-                  e_util_transform_viewport_get(transform, &vx, &vy, &vw, &vh);
-               }
+   const Eina_List *list;
+   const Eina_List *l;
+   const E_Client *child;
 
-             __WINDOW_PROP_ARG_APPEND_TYPE("Transform", "[%d] [%d, %d] [%2.1f, %2.1f] [%d] [%d :%d, %d, %d, %d]",
-                                           i, x, y, dsx, dsy, rz, view_port, vx, vy, vw, vh);
+   ec = evas_object_data_get(evas_obj, "E_Client");
 
-             if (e_util_transform_bg_transform_flag_get(transform))
-               {
-                  e_util_transform_bg_move_round_get(transform, &x, &y, NULL);
-                  e_util_transform_bg_scale_get(transform, &dsx, &dsy, NULL);
-                  e_util_transform_bg_rotation_round_get(transform, NULL, NULL, &rz);
+   if (!ec->comp_data)
+     return strdup("None");
 
-                  __WINDOW_PROP_ARG_APPEND_TYPE("Transform_BG", "--------- [%d] [%d, %d] [%2.1f, %2.1f] [%d]",
-                                                i, x, y, dsx, dsy, rz);
-               }
-          }
-     }
+   cdata = (E_Comp_Wl_Client_Data*)ec->comp_data;
+   list = cdata->sub.list;
 
-   /* Rotation info */
-   __WINDOW_PROP_ARG_APPEND_TYPE("Rotation", "Support(%d) Type(%s)",
-                                 target_ec->e.state.rot.support,
-                                 target_ec->e.state.rot.type == E_CLIENT_ROTATION_TYPE_NORMAL ? "normal" : "dependent");
+   EINA_LIST_FOREACH(list, l, child)
+     astrcat_(&str, "0x%x, ", e_client_util_win_get(child));
 
-   if ((target_ec->e.state.rot.available_rots) &&
-       (target_ec->e.state.rot.count))
-     {
-        int i = 0;
-        char availables[256] = { 0, };
+   return str;
 
-        for (i = 0; i < target_ec->e.state.rot.count; i++)
-          {
-             char tmp[16];
-             snprintf(tmp, sizeof(tmp), "%d ", target_ec->e.state.rot.available_rots[i]);
-             strncat(availables, tmp, sizeof(availables) - strlen(availables));
-          }
+fail:
+   free(str);
+   return NULL;
+}
 
-        __WINDOW_PROP_ARG_APPEND_TYPE(" ", "Availables[%d] %s", target_ec->e.state.rot.count, availables);
-     }
+static inline const char*
+_get_win_prop_Subsurface_Parent(const Evas_Object *evas_obj)
+{
+   const E_Comp_Wl_Client_Data *cdata;
+   const E_Client *ec;
+   char *str = NULL;
+
+   ec = evas_object_data_get(evas_obj, "E_Client");
+
+   if (!ec->comp_data)
+     return strdup("None");
+
+   cdata = (E_Comp_Wl_Client_Data*)ec->comp_data;
+
+   if (asprintf(&str, "0x%x", cdata->sub.data ? e_client_util_win_get(cdata->sub.data->parent) : 0) < 0)
+     return NULL;
+
+   return str;
+}
+
+static inline const char*
+_get_win_prop_Aux_Hint(const Evas_Object *evas_obj)
+{
+   const E_Comp_Wl_Client_Data *cdata;
+   const E_Comp_Wl_Aux_Hint *hint;
+   const Eina_List *l;
+
+   const E_Client *ec;
+   char *str = NULL;
+
+   ec = evas_object_data_get(evas_obj, "E_Client");
+
+   if (!ec->comp_data)
+     return strdup("None");
+
+   cdata = (E_Comp_Wl_Client_Data*)ec->comp_data;
+
+   EINA_LIST_FOREACH(cdata->aux_hint.hints, l, hint)
+     astrcat_(&str, "[%d][%s][%s]\n", hint->id, hint->hint, hint->val);
+
+   return str;
+
+fail:
+   free(str);
+   return NULL;
+}
+
+static inline const char*
+_get_win_prop_Video_Client(const Evas_Object *evas_obj)
+{
+   const E_Client *ec;
+   char *str = NULL;
+
+   ec = evas_object_data_get(evas_obj, "E_Client");
+
+   if (asprintf(&str, "%d", ec->comp_data ? ec->comp_data->video_client : 0) < 0)
+     return NULL;
+
+   return str;
+}
+
+static inline const char*
+_get_win_prop_Ignore_first_unmap(const Evas_Object *evas_obj)
+{
+   const E_Client *ec;
+   char *str = NULL;
+
+   ec = evas_object_data_get(evas_obj, "E_Client");
+
+   if (asprintf(&str, "%c", ec->ignore_first_unmap) < 0)
+     return NULL;
+
+   return str;
+}
+
+static inline const char*
+_get_win_prop_Transformed(const Evas_Object *evas_obj)
+{
+   const E_Client *ec = evas_object_data_get(evas_obj, "E_Client");
+
+   return ec->transformed ? strdup("TRUE") : strdup("FALSE");
+}
+
+static inline const char*
+_get_win_prop_Maximize_override(const Evas_Object *evas_obj)
+{
+   const E_Client *ec = evas_object_data_get(evas_obj, "E_Client");
+
+   return ec->maximize_override ? strdup("TRUE") : strdup("FALSE");
+}
+
+static inline const char*
+_get_win_prop_No_shape_cut(const Evas_Object *evas_obj)
+{
+   const E_Client *ec = evas_object_data_get(evas_obj, "E_Client");
+
+   return ec->no_shape_cut ? strdup("TRUE") : strdup("FALSE");
+}
+
+static inline const char*
+_get_win_prop_Ignored(const Evas_Object *evas_obj)
+{
+   const E_Client *ec = evas_object_data_get(evas_obj, "E_Client");
+
+   return ec->ignored ? strdup("TRUE") : strdup("FALSE");
+}
+
+static inline const char*
+_get_win_prop_Layer_block(const Evas_Object *evas_obj)
+{
+   const E_Client *ec = evas_object_data_get(evas_obj, "E_Client");
+
+   return ec->layer_block ? strdup("TRUE") : strdup("FALSE");
+}
+
+static inline const char*
+_get_win_prop_Shape_changed(const Evas_Object *evas_obj)
+{
+   const E_Client *ec = evas_object_data_get(evas_obj, "E_Client");
+
+   return ec->shape_changed ? strdup("TRUE") : strdup("FALSE");
+}
+
+static inline const char*
+_get_win_prop_Unredirected_single(const Evas_Object *evas_obj)
+{
+   const E_Client *ec = evas_object_data_get(evas_obj, "E_Client");
+
+   return ec->unredirected_single ? strdup("TRUE") : strdup("FALSE");
+}
+
+static inline const char*
+_get_win_prop_Redirected(const Evas_Object *evas_obj)
+{
+   const E_Client *ec = evas_object_data_get(evas_obj, "E_Client");
+
+   return ec->redirected ? strdup("TRUE") : strdup("FALSE");
+}
+
+static inline const char*
+_get_win_prop_Tooltip(const Evas_Object *evas_obj)
+{
+   const E_Client *ec = evas_object_data_get(evas_obj, "E_Client");
+
+   return ec->tooltip ? strdup("TRUE") : strdup("FALSE");
+}
+
+static inline const char*
+_get_win_prop_Dialog(const Evas_Object *evas_obj)
+{
+   const E_Client *ec = evas_object_data_get(evas_obj, "E_Client");
+
+   return ec->dialog ? strdup("TRUE") : strdup("FALSE");
+}
+
+static inline const char*
+_get_win_prop_Input_only(const Evas_Object *evas_obj)
+{
+   const E_Client *ec = evas_object_data_get(evas_obj, "E_Client");
+
+   return ec->input_only ? strdup("TRUE") : strdup("FALSE");
+}
+
+static inline const char*
+_get_win_prop_Override(const Evas_Object *evas_obj)
+{
+   const E_Client *ec = evas_object_data_get(evas_obj, "E_Client");
+
+   return ec->override ? strdup("TRUE") : strdup("FALSE");
+}
+
+static inline const char*
+_get_win_prop_E_Transient_Policy(const Evas_Object *evas_obj)
+{
+   const E_Client *ec;
+   char *str = NULL;
+
+   ec = evas_object_data_get(evas_obj, "E_Client");
+
+   if (asprintf(&str, "%d", ec->transient_policy) < 0)
+     return NULL;
+
+   return str;
+}
+
+static inline const char*
+_get_win_prop_E_FullScreen_Policy(const Evas_Object *evas_obj)
+{
+   const E_Client *ec;
+   char *str = NULL;
+
+   ec = evas_object_data_get(evas_obj, "E_Client");
+
+   if (asprintf(&str, "%d", ec->fullscreen_policy) < 0)
+     return NULL;
+
+   return str;
+}
+
+static inline const char*
+_get_win_prop_E_Maximize_Policy(const Evas_Object *evas_obj)
+{
+   const E_Client *ec;
+   char *str = NULL;
+
+   ec = evas_object_data_get(evas_obj, "E_Client");
+
+   if (asprintf(&str, "0x%x", ec->maximized) < 0)
+     return NULL;
+
+   return str;
+}
+
+static inline const char*
+_get_win_prop_Want_focus(const Evas_Object *evas_obj)
+{
+   const E_Client *ec = evas_object_data_get(evas_obj, "E_Client");
+
+   return ec->want_focus ? strdup("TRUE") : strdup("FALSE");
+}
+
+static inline const char*
+_get_win_prop_Take_focus(const Evas_Object *evas_obj)
+{
+   const E_Client *ec = evas_object_data_get(evas_obj, "E_Client");
+
+   return ec->take_focus ? strdup("TRUE") : strdup("FALSE");
+}
+
+static inline const char*
+_get_win_prop_Re_manage(const Evas_Object *evas_obj)
+{
+   const E_Client *ec = evas_object_data_get(evas_obj, "E_Client");
+
+   return ec->re_manage ? strdup("TRUE") : strdup("FALSE");
+}
+
+static inline const char*
+_get_win_prop_Fullscreen(const Evas_Object *evas_obj)
+{
+   const E_Client *ec = evas_object_data_get(evas_obj, "E_Client");
+
+   return ec->fullscreen ? strdup("TRUE") : strdup("FALSE");
+}
+
+static inline const char*
+_get_win_prop_Urgent(const Evas_Object *evas_obj)
+{
+   const E_Client *ec = evas_object_data_get(evas_obj, "E_Client");
+
+   return ec->urgent ? strdup("TRUE") : strdup("FALSE");
+}
+
+static inline const char*
+_get_win_prop_Sticky(const Evas_Object *evas_obj)
+{
+   const E_Client *ec = evas_object_data_get(evas_obj, "E_Client");
+
+   return ec->sticky ? strdup("TRUE") : strdup("FALSE");
+}
+
+static inline const char*
+_get_win_prop_Iconic(const Evas_Object *evas_obj)
+{
+   const E_Client *ec = evas_object_data_get(evas_obj, "E_Client");
+
+   return ec->iconic ? strdup("TRUE") : strdup("FALSE");
+}
+
+static inline const char*
+_get_win_prop_Focused(const Evas_Object *evas_obj)
+{
+   const E_Client *ec = evas_object_data_get(evas_obj, "E_Client");
+
+   return ec->focused ? strdup("TRUE") : strdup("FALSE");
+}
+
+static inline const char*
+_get_win_prop_Moving(const Evas_Object *evas_obj)
+{
+   const E_Client *ec = evas_object_data_get(evas_obj, "E_Client");
+
+   return ec->moving ? strdup("TRUE") : strdup("FALSE");
+}
+
+static inline const char*
+_get_win_prop_Hidden(const Evas_Object *evas_obj)
+{
+   const E_Client *ec = evas_object_data_get(evas_obj, "E_Client");
+
+   return ec->hidden ? strdup("TRUE") : strdup("FALSE");
+}
+
+static inline const char*
+_set_win_prop_Hidden(Evas_Object *evas_obj, const char *prop_value)
+{
+   if(strstr(prop_value, "TRUE"))
+     evas_object_hide(evas_obj);
+   else if(strstr(prop_value, "FALSE"))
+     evas_object_show(evas_obj);
    else
+     return strdup("invalid property value");
+
+   return NULL;
+}
+
+static inline const char*
+_get_win_prop_32bit(const Evas_Object *evas_obj)
+{
+   const E_Client *ec = evas_object_data_get(evas_obj, "E_Client");
+
+   return ec->argb ? strdup("TRUE") : strdup("FALSE");
+}
+
+static inline const char*
+_get_win_prop_Visible(const Evas_Object *evas_obj)
+{
+   const E_Client *ec = evas_object_data_get(evas_obj, "E_Client");
+
+   return ec->visible ? strdup("TRUE") : strdup("FALSE");
+}
+
+static inline const char*
+_get_win_prop_Layer(const Evas_Object *evas_obj)
+{
+   const E_Client *ec;
+   char *str = NULL;
+
+   char layer_name[48] = {0,};
+
+   ec = evas_object_data_get(evas_obj, "E_Client");
+   e_comp_layer_name_get(ec->layer, layer_name, sizeof(layer_name));
+
+   if (asprintf(&str, "[%d, %s]", ec->layer, layer_name) < 0)
+     return NULL;
+
+   return str;
+}
+
+static inline const char*
+_get_win_prop_Shape_input(const Evas_Object *evas_obj)
+{
+   const E_Client *ec;
+   char *str = NULL;
+   int i = 0;
+
+   ec = evas_object_data_get(evas_obj, "E_Client");
+
+   if (!ec->shape_input_rects || ec->shape_input_rects_num <= 0)
+     return strdup("None");
+
+   for (i = 0 ; i < ec->shape_input_rects_num ; ++i)
+     astrcat_(&str, "[%d,%d,%d,%d]\n", ec->shape_input_rects[i].x, ec->shape_input_rects[i].y,
+             ec->shape_input_rects[i].w, ec->shape_input_rects[i].h);
+
+   return str;
+
+fail:
+   free(str);
+   return NULL;
+}
+
+static inline const char*
+_get_win_prop_Shape_rects(const Evas_Object *evas_obj)
+{
+   const E_Client *ec;
+   char *str = NULL;
+   int i = 0;
+
+   ec = evas_object_data_get(evas_obj, "E_Client");
+
+   if (!ec->shape_rects || ec->shape_rects_num <= 0)
+     return strdup("None");
+
+   for (i = 0 ; i < ec->shape_rects_num ; ++i)
+     astrcat_(&str, "[%d,%d,%d,%d]\n", ec->shape_rects[i].x, ec->shape_rects[i].y,
+             ec->shape_rects[i].w, ec->shape_rects[i].h);
+
+   return str;
+
+fail:
+   free(str);
+   return NULL;
+}
+
+static inline const char*
+_get_win_prop_Transients(const Evas_Object *evas_obj)
+{
+   const E_Client *ec;
+   char *str = NULL;
+
+   const E_Client *child;
+   const Eina_List *l;
+
+   ec = evas_object_data_get(evas_obj, "E_Client");
+
+   if (!ec->transients)
+     return strdup("None");
+
+   EINA_LIST_FOREACH(ec->transients, l, child)
+     astrcat_(&str, "0x%x, ", e_client_util_win_get(child));
+
+   return str;
+
+fail:
+   free(str);
+   return NULL;
+}
+
+static inline const char*
+_get_win_prop_ParentWindowID(const Evas_Object *evas_obj)
+{
+   const E_Client *ec;
+   char *str = NULL;
+
+   ec = evas_object_data_get(evas_obj, "E_Client");
+
+   if (!ec->parent)
+     return strdup("None");
+
+   if (asprintf(&str, "0x%x", e_client_util_win_get(ec->parent)) < 0)
+     return NULL;
+
+   return str;
+}
+
+static inline const char*
+_get_win_prop_Geometry(const Evas_Object *evas_obj)
+{
+   const E_Client *ec;
+   char *str = NULL;
+
+   ec = evas_object_data_get(evas_obj, "E_Client");
+
+   if (asprintf(&str, "[%d, %d, %d, %d]", ec->x, ec->y, ec->w, ec->h) < 0)
+     return NULL;
+
+   return str;
+}
+
+static inline const char*
+_get_win_prop_Role(const Evas_Object *evas_obj)
+{
+   const E_Client *ec;
+   char *str = NULL;
+
+   ec = evas_object_data_get(evas_obj, "E_Client");
+
+   if (asprintf(&str, "%s", ec->icccm.window_role ?: "NO ROLE") < 0)
+     return NULL;
+
+   return str;
+}
+
+static inline const char*
+_get_win_prop_Window_Name(const Evas_Object *evas_obj)
+{
+   const E_Client *ec;
+   char *str = NULL;
+
+   ec = evas_object_data_get(evas_obj, "E_Client");
+
+   if (asprintf(&str, "%s", e_client_util_name_get(ec) ?: "NO NAME") < 0)
+     return NULL;
+
+   return str;
+}
+
+static inline const char*
+_get_win_prop_ResourceID(const Evas_Object *evas_obj)
+{
+   const E_Client *ec;
+   char *str = NULL;
+
+   ec = evas_object_data_get(evas_obj, "E_Client");
+
+   if (!ec->pixmap)
+     return strdup("None");
+
+   if (asprintf(&str, "%d", e_pixmap_res_id_get(ec->pixmap)) < 0)
+     return NULL;
+
+   return str;
+}
+
+static inline const char*
+_get_win_prop_PID(const Evas_Object *evas_obj)
+{
+   const E_Client *ec;
+   char *str = NULL;
+   pid_t pid = -1;
+
+   ec = evas_object_data_get(evas_obj, "E_Client");
+
+   if (ec->comp_data)
      {
-        __WINDOW_PROP_ARG_APPEND_TYPE(" ", "Availables[%d] N/A", target_ec->e.state.rot.count);
+        const E_Comp_Wl_Client_Data *cdata = (const 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 (asprintf(&str, "%d", pid) < 0)
+     return NULL;
+
+   return str;
+}
+
+static inline const char*
+_get_win_prop_Window_ID(const Evas_Object *evas_obj)
+{
+   const E_Client *ec;
+   char *str = NULL;
+
+   ec = evas_object_data_get(evas_obj, "E_Client");
 
-   __WINDOW_PROP_ARG_APPEND_TYPE(" ", "Angle prev(%d) curr(%d) next(%d) reserve(%d) preferred(%d)",
-                                 target_ec->e.state.rot.ang.prev,
-                                 target_ec->e.state.rot.ang.curr,
-                                 target_ec->e.state.rot.ang.next,
-                                 target_ec->e.state.rot.ang.reserve,
-                                 target_ec->e.state.rot.preferred_rot);
+   if (asprintf(&str, "0x%x", e_client_util_win_get(ec)) < 0)
+     return NULL;
 
-   __WINDOW_PROP_ARG_APPEND_TYPE(" ", "pending_change_request(%d) pending_show(%d) nopending_render(%d) wait_for_done(%d)",
-                                 target_ec->e.state.rot.pending_change_request,
-                                 target_ec->e.state.rot.pending_show,
-                                 target_ec->e.state.rot.nopending_render,
-                                 target_ec->e.state.rot.wait_for_done);
+   return str;
+}
+
+typedef const char* (*get_prop_t)(const Evas_Object *evas_obj);
+typedef const char* (*set_prop_t)(Evas_Object *evas_obj, const char *prop_value);
 
-   if (target_ec->e.state.rot.geom_hint)
+static struct property_manager
+{
+    const char* prop_name;
+
+    /*
+     * get one property
+     *
+     * evas_obj - an evas_obj (which is e_client) a property value has to be got for
+     * return nullptr in case of an error, property value string otherwise
+     *
+     * property value string should be freed with free() when it's no longer needed
+     *
+     * can be nullptr if this property isn't getable */
+    get_prop_t get_prop;
+
+    /*
+     * set one property
+     *
+     * evas_obj - an evas_obj (which is e_client) a property value has to be set for
+     * prop_value - a value of property to set
+     * return pointer to an error string in case of an error, nullptr otherwise
+     *
+     * error string should be freed with free() when it's no longer needed
+     * it's this function responsibility to check property_value sanity
+     *
+     * can be nullptr if this property isn't setable */
+    set_prop_t set_prop;
+} win_properties[] =
+{
+    {
+        "Window_ID",
+        _get_win_prop_Window_ID,
+        NULL
+    },
+    {
+        "PID",
+        _get_win_prop_PID,
+        NULL
+    },
+    {
+        "ResourceID",
+        _get_win_prop_ResourceID,
+        NULL
+    },
+    {
+        "Window_Name",
+        _get_win_prop_Window_Name,
+        NULL
+    },
+    {
+        "Role",
+        _get_win_prop_Role,
+        NULL
+    },
+    {
+        "Geometry",
+        _get_win_prop_Geometry,
+        NULL
+    },
+    {
+        "ParentWindowID",
+        _get_win_prop_ParentWindowID,
+        NULL
+    },
+    {
+        "Transients",
+        _get_win_prop_Transients,
+        NULL
+    },
+    {
+        "Shape_rects",
+        _get_win_prop_Shape_rects,
+        NULL
+    },
+    {
+        "Shape_input",
+        _get_win_prop_Shape_input,
+        NULL
+    },
+    {
+        "Layer",
+        _get_win_prop_Layer,
+        NULL
+    },
+    {
+        "Visible",
+        _get_win_prop_Visible,
+        NULL
+    },
+    {
+        "32bit",
+        _get_win_prop_32bit,
+        NULL
+    },
+    {
+        "Hidden",
+        _get_win_prop_Hidden,
+        _set_win_prop_Hidden
+    },
+    {
+        "Moving",
+        _get_win_prop_Moving,
+        NULL
+    },
+    {
+        "Focused",
+        _get_win_prop_Focused,
+        NULL
+    },
+    {
+        "Iconic",
+        _get_win_prop_Iconic,
+        NULL
+    },
+    {
+        "Sticky",
+        _get_win_prop_Sticky,
+        NULL
+    },
+    {
+        "Urgent",
+        _get_win_prop_Urgent,
+        NULL
+    },
+    {
+        "Fullscreen",
+        _get_win_prop_Fullscreen,
+        NULL
+    },
+    {
+        "Re_manage",
+        _get_win_prop_Re_manage,
+        NULL
+    },
+    {
+        "Take_focus",
+        _get_win_prop_Take_focus,
+        NULL
+    },
+    {
+        "Want_focus",
+        _get_win_prop_Want_focus,
+        NULL
+    },
+    {
+        "E_Maximize_Policy",
+        _get_win_prop_E_Maximize_Policy,
+        NULL
+    },
+    {
+        "E_FullScreen_Policy",
+        _get_win_prop_E_FullScreen_Policy,
+        NULL
+    },
+    {
+        "E_Transient_Policy",
+        _get_win_prop_E_Transient_Policy,
+        NULL
+    },
+    {
+        "Override",
+        _get_win_prop_Override,
+        NULL
+    },
+    {
+        "Input_only",
+        _get_win_prop_Input_only,
+        NULL
+    },
+    {
+        "Dialog",
+        _get_win_prop_Dialog,
+        NULL
+    },
+    {
+        "Tooltip",
+        _get_win_prop_Tooltip,
+        NULL
+    },
+    {
+        "Redirected",
+        _get_win_prop_Redirected,
+        NULL
+    },
+    {
+        "Unredirected_single",
+        _get_win_prop_Unredirected_single,
+        NULL
+    },
+    {
+        "Shape_changed",
+        _get_win_prop_Shape_changed,
+        NULL
+    },
+    {
+        "Layer_block",
+        _get_win_prop_Layer_block,
+        NULL
+    },
+    {
+        "Ignored",
+        _get_win_prop_Ignored,
+        NULL
+    },
+    {
+        "No_shape_cut",
+        _get_win_prop_No_shape_cut,
+        NULL
+    },
+    {
+        "Maximize_override",
+        _get_win_prop_Maximize_override,
+        NULL
+    },
+    {
+        "Transformed",
+        _get_win_prop_Transformed,
+        NULL
+    },
+    {
+        "Ignore_first_unmap",
+        _get_win_prop_Ignore_first_unmap,
+        NULL
+    },
+    {
+        "Video Client",
+        _get_win_prop_Video_Client,
+        NULL
+    },
+    {
+        "Aux_Hint Client",
+        _get_win_prop_Aux_Hint,
+        NULL
+    },
+    {
+        "Subsurface Parent",
+        _get_win_prop_Subsurface_Parent,
+        NULL
+    },
+    {
+        "Subsurface Child List",
+        _get_win_prop_Subsurface_Child_List,
+        NULL
+    },
+    {
+        "Subsurface Below Child List",
+        _get_win_prop_Subsurface_Below_Child_List,
+        NULL
+    },
+    {
+        "Transform",
+        _get_win_prop_Transform,
+        NULL
+    },
+    {
+        "Rotation",
+        _get_win_prop_Rotation,
+        NULL
+    }
+};
+
+#define __WINDOW_PROP_ARG_APPEND(title, value) ({                                    \
+                                                eldbus_message_iter_arguments_append(iter, "(ss)", &struct_of_ec);    \
+                                                eldbus_message_iter_arguments_append(struct_of_ec, "ss", (title), (value));  \
+                                                eldbus_message_iter_container_close(iter, struct_of_ec);})
+
+static Eldbus_Message*
+_msg_fill_out_window_props(const Eldbus_Message *msg, Eldbus_Message_Iter *iter, Evas_Object *evas_obj,
+        const char *property_name, const char *property_value)
+{
+   const int win_property_size = sizeof(win_properties)/sizeof(struct property_manager);
+   Eldbus_Message_Iter* struct_of_ec;
+   int idx;
+
+   __WINDOW_PROP_ARG_APPEND("[WINDOW PROP]", "[WINDOW PROP]");
+
+   /* accordingly to -prop option rules (if user's provided some property name) */
+   if (strlen(property_name))
+     {
+        /* check the property_name sanity */
+        for (idx = 0; idx < win_property_size; ++idx)
+          if (!strncmp(win_properties[idx].prop_name, property_name, sizeof(win_properties[idx])))
+            break;
+
+        if (idx == win_property_size)
+          return eldbus_message_error_new(msg, INVALID_PROPERTY_NAME,
+                  "get_window_prop: invalid property name");
+
+        /* accordingly to -prop option rules (if user wanna set property) */
+        if (strlen(property_value))
+          {
+             if (win_properties[idx].set_prop)
+               {
+                  /* in case of a success we just return an empty reply message */
+                  const char* error_str = win_properties[idx].set_prop(evas_obj, property_value);
+                  if (error_str)
+                    {
+                       Eldbus_Message* err_msg = eldbus_message_error_new(msg,
+                               FAIL_TO_SET_PROPERTY, error_str);
+                       free((void*)error_str);
+
+                       return err_msg;
+                    }
+               }
+             else
+               return eldbus_message_error_new(msg, FAIL_TO_SET_PROPERTY,
+                       "get_window_prop: this property isn't setable");
+          }
+        else
+          {
+             if (win_properties[idx].get_prop)
+               {
+                  const char* res_str = win_properties[idx].get_prop(evas_obj);
+                  if (res_str)
+                    {
+                       __WINDOW_PROP_ARG_APPEND(win_properties[idx].prop_name, res_str);
+                       free((void*)res_str);
+                    }
+                  else
+                    return eldbus_message_error_new(msg, FAIL_TO_GET_PROPERTY, "");
+               }
+             else
+               return eldbus_message_error_new(msg, FAIL_TO_GET_PROPERTY,
+                       "get_window_prop: this property isn't getable");
+          }
+     }
+   else
      {
-        int i = 0;
-        for (i = 0; i < 4; i++)
+        for (idx = 0; idx < win_property_size; ++idx)
           {
-             __WINDOW_PROP_ARG_APPEND_TYPE(" ", "Geometry hint[%d] %d,%d   %dx%d",
-                                           i,
-                                           target_ec->e.state.rot.geom[i].x,
-                                           target_ec->e.state.rot.geom[i].y,
-                                           target_ec->e.state.rot.geom[i].w,
-                                           target_ec->e.state.rot.geom[i].h);
+             if (win_properties[idx].get_prop)
+               {
+                  const char* res_str = win_properties[idx].get_prop(evas_obj);
+                  if (res_str)
+                    {
+                       __WINDOW_PROP_ARG_APPEND(win_properties[idx].prop_name, res_str);
+                       free((void*)res_str);
+                    }
+                  else
+                    return eldbus_message_error_new(msg, FAIL_TO_GET_PROPERTY, "");
+               }
           }
      }
+
+   return NULL;
+
 #undef __WINDOW_PROP_ARG_APPEND
-#undef __WINDOW_PROP_ARG_APPEND_TYPE
 }
 
 static Eldbus_Message *
-_msg_window_prop_append(const Eldbus_Message *msg, uint32_t mode, const char *value)
+_msg_window_prop_append(const Eldbus_Message *msg, uint32_t mode, const char *value,
+        const char *property_name, const char *property_value)
 {
    const static int WINDOW_ID_MODE = 0;
    const static int WINDOW_PID_MODE = 1;
    const static int WINDOW_NAME_MODE = 2;
 
    Eldbus_Message_Iter *iter, *array_of_ec;
-   Eldbus_Message *reply;
+   Eldbus_Message *reply_msg, *error_msg = NULL;
    E_Client *ec;
    Evas_Object *o;
    uint64_t value_number = 0;
@@ -1106,8 +1936,8 @@ _msg_window_prop_append(const Eldbus_Message *msg, uint32_t mode, const char *va
      }
 
    /* msg - is a method call message */
-   reply = eldbus_message_method_return_new(msg);
-   iter = eldbus_message_iter_get(reply);
+   reply_msg = eldbus_message_method_return_new(msg);
+   iter = eldbus_message_iter_get(reply_msg);
    eldbus_message_iter_arguments_append(iter, "a(ss)", &array_of_ec);
 
    for (o = evas_object_top_get(e_comp->evas); o; o = evas_object_below_get(o))
@@ -1122,7 +1952,7 @@ _msg_window_prop_append(const Eldbus_Message *msg, uint32_t mode, const char *va
              if (win == value_number)
                {
                   window_exists = EINA_TRUE;
-                  _msg_window_prop_client_append(array_of_ec, ec);
+                  error_msg = _msg_fill_out_window_props(msg, array_of_ec, o, property_name, property_value);
                   break;
                }
           }
@@ -1140,7 +1970,9 @@ _msg_window_prop_append(const Eldbus_Message *msg, uint32_t mode, const char *va
              if (pid == value_number)
                {
                   window_exists = EINA_TRUE;
-                  _msg_window_prop_client_append(array_of_ec, ec);
+                  error_msg = _msg_fill_out_window_props(msg, array_of_ec, o, property_name, property_value);
+                  if (error_msg)
+                    break;
                }
           }
         else if (mode == WINDOW_NAME_MODE)
@@ -1154,7 +1986,9 @@ _msg_window_prop_append(const Eldbus_Message *msg, uint32_t mode, const char *va
                   if (find)
                     {
                        window_exists = EINA_TRUE;
-                       _msg_window_prop_client_append(array_of_ec, ec);
+                       error_msg = _msg_fill_out_window_props(msg, array_of_ec, o, property_name, property_value);
+                       if (error_msg)
+                         break;
                     }
                }
           }
@@ -1163,12 +1997,16 @@ _msg_window_prop_append(const Eldbus_Message *msg, uint32_t mode, const char *va
 finish:
    eldbus_message_iter_container_close(iter, array_of_ec);
 
-   if (window_exists == EINA_TRUE)
-     return reply;
+   if (window_exists == EINA_TRUE && !error_msg)
+     return reply_msg;
 
    /* TODO: I'm not sure we gotta do it. But, who's responsible for message freeing if we've not it
     *       returned to caller(eldbus)? */
-   eldbus_message_unref(reply);
+   eldbus_message_unref(reply_msg);
+
+   /* some error while filling out the reply message */
+   if (error_msg)
+     return error_msg;
 
    return eldbus_message_error_new(msg, WIN_NOT_EXIST, "get_window_prop: specified window(s) doesn't exist");
 }
@@ -1245,9 +2083,9 @@ _e_info_server_cb_window_prop_get(const Eldbus_Service_Interface *iface EINA_UNU
                 "get_window_prop: an attempt to get arguments from method call message failed");
      }
 
-   INF("property_name: %s, property_value: %s", property_name, property_value);
-
-   return _msg_window_prop_append(msg, mode, value);
+   /* TODO: it's guaranteed, by client logic, that 'value', 'property_name' and 'property_value'
+    *       can be ONLY either empty string or string. Should I check this? <if( !property_name )> */
+   return _msg_window_prop_append(msg, mode, value, property_name, property_value);
 }
 
 static Eldbus_Message *