e_info: add output_mode command 11/90711/9
authorJunkyeong Kim <jk0430.kim@samsung.com>
Tue, 4 Oct 2016 04:39:24 +0000 (13:39 +0900)
committerGwanglim Lee <gl77.lee@samsung.com>
Fri, 21 Oct 2016 02:08:39 +0000 (19:08 -0700)
Change-Id: Ib73bf9d6459605484b59f70a9f9a7efd1939f443
Signed-off-by: Junkyeong Kim <jk0430.kim@samsung.com>
src/bin/e_info_client.c
src/bin/e_info_server.c
src/bin/e_info_shared_types.h

index 756892e3db438329e5a952f9da99d14c9afe772c..e324ab7634791f35ec5354d575d9376f2da51686 100644 (file)
@@ -18,6 +18,10 @@ typedef struct _E_Info_Client
    Eina_List         *win_list;
 
    Eina_List         *input_dev;
+
+   /* output mode */
+   Eina_List         *mode_list;
+   int               gl;
 } E_Info_Client;
 
 typedef struct _E_Win_Info
@@ -40,6 +44,16 @@ typedef struct _E_Win_Info
    const char  *layer_name; // layer name
 } E_Win_Info;
 
+typedef struct output_mode_info
+{
+   unsigned int hdisplay, hsync_start, hsync_end, htotal;
+   unsigned int vdisplay, vsync_start, vsync_end, vtotal;
+   unsigned int refresh, vscan, clock;
+   unsigned int flags;
+   int current, output, connect;
+   const char *name;
+} E_Info_Output_Mode;
+
 #define VALUE_TYPE_FOR_TOPVWINS "uuisiiiiibbiibbbiis"
 #define VALUE_TYPE_REQUEST_RESLIST "ui"
 #define VALUE_TYPE_REPLY_RESLIST "ssi"
@@ -1663,7 +1677,174 @@ _e_info_client_proc_buffer_shot(int argc, char **argv)
 err:
    printf("Error Check Args\n%s\n", DUMP_BUFFERS_USAGE);
 return;
+}
+
+static E_Info_Output_Mode *
+_e_output_mode_info_new(uint32_t h, uint32_t hsync_start, uint32_t hsync_end, uint32_t htotal,
+                        uint32_t v, uint32_t vsync_start, uint32_t vsync_end, uint32_t vtotal,
+                        uint32_t refresh, uint32_t vscan, uint32_t clock, uint32_t flags,
+                        int current, int output, int connect, const char *name)
+{
+   E_Info_Output_Mode *mode = NULL;
+
+   mode = E_NEW(E_Info_Output_Mode, 1);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(mode, NULL);
+
+   mode->hdisplay = h;
+   mode->hsync_start = hsync_start;
+   mode->hsync_end = hsync_end;
+   mode->htotal = htotal;
+   mode->vdisplay = v;
+   mode->vsync_start = vsync_start;
+   mode->vsync_end = vsync_end;
+   mode->vtotal = vtotal;
+   mode->refresh = refresh;
+   mode->vscan = vscan;
+   mode->clock = clock;
+   mode->flags = flags;
+   mode->current = current;
+   mode->output = output;
+   mode->connect = connect;
+   mode->name = eina_stringshare_add(name);
+
+   return mode;
+}
+
+static void
+_e_output_mode_info_free(E_Info_Output_Mode *mode)
+{
+   EINA_SAFETY_ON_NULL_RETURN(mode);
+
+   if (mode->name)
+     eina_stringshare_del(mode->name);
+
+   E_FREE(mode);
+}
+
+static void
+_cb_output_mode_info(const Eldbus_Message *msg)
+{
+   const char *name = NULL, *text = NULL;
+   Eldbus_Message_Iter *array, *ec;
+   Eina_Bool res;
+   int gl = 0;
+
+   res = eldbus_message_error_get(msg, &name, &text);
+   EINA_SAFETY_ON_TRUE_GOTO(res, finish);
+
+   res = eldbus_message_arguments_get(msg, "a("SIGNATURE_OUTPUT_MODE_SERVER")", &array);
+   EINA_SAFETY_ON_FALSE_GOTO(res, finish);
+
+   while (eldbus_message_iter_get_and_next(array, 'r', &ec))
+     {
+        uint32_t h, hsync_start, hsync_end, htotal;
+        uint32_t v, vsync_start, vsync_end, vtotal;
+        uint32_t refresh, vscan, clock, flag;
+        int current, output, connect;
+        const char *name;
+        E_Info_Output_Mode *mode = NULL;
+        res = eldbus_message_iter_arguments_get(ec,
+                                                SIGNATURE_OUTPUT_MODE_SERVER,
+                                                &h, &hsync_start, &hsync_end, &htotal,
+                                                &v, &vsync_start, &vsync_end, &vtotal,
+                                                &refresh, &vscan, &clock, &flag, &name,
+                                                &current, &output, &connect, &gl);
+        if (!res)
+          {
+             printf("Failed to get output mode info\n");
+             continue;
+          }
+
+        mode = _e_output_mode_info_new(h, hsync_start, hsync_end, htotal,
+                                       v, vsync_start, vsync_end, vtotal,
+                                       refresh, vscan, clock, flag,
+                                       current, output, connect, name);
+        e_info_client.mode_list = eina_list_append(e_info_client.mode_list, mode);
+     }
+   e_info_client.gl = gl;
+
+finish:
+   if ((name) || (text))
+     {
+        printf("errname:%s errmsg:%s\n", name, text);
+     }
+}
+
+static void
+_e_info_client_proc_output_mode(int argc, char **argv)
+{
+   E_Info_Output_Mode *mode = NULL;
+   Eina_List *l;
+   int output = 0;
+   int idx = 0;
+   char curr;
+
+   if (!_e_info_client_eldbus_message_with_args("output_mode", _cb_output_mode_info,
+                                                SIGNATURE_OUTPUT_MODE_CLIENT, E_INFO_CMD_OUTPUT_MODE_GET, 0))
+     {
+        printf("_e_info_client_proc_output_mode fail (%d)\n", 1);
+        return;
+     }
+
+   if (!e_info_client.mode_list)
+     {
+        printf("no list\n");
+        return;
+     }
+
+   if (e_info_client.gl == 0)
+     {
+        E_FREE_LIST(e_info_client.mode_list, _e_output_mode_info_free);
+
+        printf("not support output_mode.\n");
+        return;
+     }
+
+   printf("--------------------------------------[ output mode ]---------------------------------------------\n");
+   printf(" idx   modename     h  hss  hse  htot  v  vss  vse  vtot  refresh  clk  vscan  preferred  current\n");
+   printf("--------------------------------------------------------------------------------------------------\n");
+
+   EINA_LIST_FOREACH(e_info_client.mode_list, l, mode)
+     {
+        if (!mode) return;
+
+        if (output == mode->output)
+          {
+             printf("output %u : ", mode->output);
+             output++;
+             idx = 0;
+
+             if (mode->connect == 1)
+               printf("%s\n", "connected");
+             else
+               {
+                  printf("%s\n", "disconnected");
+                  continue;
+               }
+          }
+
+        if (mode->current == 1)
+          curr = 'O';
+        else
+          curr = ' ';
 
+        printf("%3d%13s %5u%5u%5u%5u%5u%5u%5u%5u  %3u %8u  %2u        ",
+               idx++, mode->name,
+               mode->hdisplay, mode->hsync_start, mode->hsync_end, mode->htotal,
+               mode->vdisplay, mode->vsync_start, mode->vsync_end, mode->vtotal,
+               mode->refresh, mode->clock, mode->vscan);
+
+        if (mode->flags == 1)
+          printf("O         %c\n", curr);
+        else
+          printf("          %c\n", curr);
+     }
+
+   E_FREE_LIST(e_info_client.mode_list, _e_output_mode_info_free);
+
+   printf("\n");
+
+   return;
 }
 
 #ifdef ENABLE_HWC_MULTI
@@ -1955,6 +2136,11 @@ static struct
       "Dump attach buffers [on:1,off:0] (default path:/tmp/dump_xxx/)",
       _e_info_client_proc_buffer_shot
    },
+   {
+      "output_mode", NULL,
+      "Get output mode info",
+      _e_info_client_proc_output_mode
+   },
 #ifdef ENABLE_HWC_MULTI
    {
       "hwc_trace",
index d967c71e3a6ddce186ea5eae94200e1f7edda85a..39e7adb73bfb1f136bed86345ce1a0c2204152f7 100644 (file)
@@ -1938,6 +1938,121 @@ _e_info_server_cb_buffer_dump(const Eldbus_Service_Interface *iface EINA_UNUSED,
    return reply;
 }
 
+static void
+_output_mode_msg_clients_append(Eldbus_Message_Iter *iter, E_Comp_Screen *e_comp_screen, int gl)
+{
+   Eldbus_Message_Iter *array_of_mode;
+   Eldbus_Message_Iter *struct_of_mode;
+   tdm_display *tdpy;
+   tdm_output *output = NULL;
+   tdm_output_conn_status status;
+   const tdm_output_mode *mode = NULL;
+   const tdm_output_mode *modes = NULL;
+   tdm_error ret = TDM_ERROR_NONE;
+   int i, j, count, mode_count, current;
+   unsigned int preferred;
+
+   eldbus_message_iter_arguments_append(iter, "a("SIGNATURE_OUTPUT_MODE_SERVER")",
+                                        &array_of_mode);
+
+   if (gl == 0)
+     {
+        eldbus_message_iter_arguments_append(array_of_mode, "("SIGNATURE_OUTPUT_MODE_SERVER")",
+                                             &struct_of_mode);
+        eldbus_message_iter_arguments_append(struct_of_mode, SIGNATURE_OUTPUT_MODE_SERVER,
+                                             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "none",
+                                             0, 0, 0, 0);
+        eldbus_message_iter_container_close(array_of_mode, struct_of_mode);
+
+        eldbus_message_iter_container_close(iter, array_of_mode);
+
+        return;
+     }
+
+   count = e_comp_screen->num_outputs;
+   tdpy = e_comp_screen->tdisplay;
+
+   for (i = 0; i < count; i++)
+     {
+        output = tdm_display_get_output(tdpy, i, &ret);
+        if (ret != TDM_ERROR_NONE || output == NULL)
+          continue;
+
+        ret = tdm_output_get_conn_status(output, &status);
+        if (ret != TDM_ERROR_NONE)
+          continue;
+
+        if (status == TDM_OUTPUT_CONN_STATUS_DISCONNECTED)
+          {
+             eldbus_message_iter_arguments_append(array_of_mode, "("SIGNATURE_OUTPUT_MODE_SERVER")",
+                                                  &struct_of_mode);
+             eldbus_message_iter_arguments_append(struct_of_mode, SIGNATURE_OUTPUT_MODE_SERVER,
+                                                  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "none",
+                                                  0, i, 0, 1);
+             eldbus_message_iter_container_close(array_of_mode, struct_of_mode);
+
+             continue;
+          }
+
+        ret = tdm_output_get_mode(output, &mode);
+        if (ret != TDM_ERROR_NONE)
+          continue;
+
+        ret = tdm_output_get_available_modes(output, &modes, &mode_count);
+        if (ret != TDM_ERROR_NONE)
+          continue;
+
+        for (j = 0; j < mode_count; j++)
+          {
+             eldbus_message_iter_arguments_append(array_of_mode, "("SIGNATURE_OUTPUT_MODE_SERVER")",
+                                                  &struct_of_mode);
+             current = 0;
+             if (mode == modes + j) current = 1;
+
+             preferred = 0;
+             if (modes[j].type & TDM_OUTPUT_MODE_TYPE_PREFERRED) preferred = 1;
+
+             eldbus_message_iter_arguments_append(struct_of_mode, SIGNATURE_OUTPUT_MODE_SERVER,
+                                                  modes[j].hdisplay, modes[j].hsync_start, modes[j].hsync_end, modes[j].htotal,
+                                                  modes[j].vdisplay, modes[j].vsync_start, modes[j].vsync_end, modes[j].vtotal,
+                                                  modes[j].vrefresh, modes[j].vscan, modes[j].clock, preferred, modes[j].name,
+                                                  current, i, 1, 1);
+             eldbus_message_iter_container_close(array_of_mode, struct_of_mode);
+          }
+     }
+
+   eldbus_message_iter_container_close(iter, array_of_mode);
+}
+
+static Eldbus_Message *
+_e_info_server_cb_output_mode(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
+{
+   Eldbus_Message *reply = eldbus_message_method_return_new(msg);
+   E_Comp_Screen *e_comp_screen = NULL;
+   tdm_display *tdpy = NULL;
+   int mode = 0;
+   int count = 0;
+
+   if (!eldbus_message_arguments_get(msg, SIGNATURE_OUTPUT_MODE_CLIENT, &mode, &count))
+     {
+        ERR("Error getting arguments.");
+        return reply;
+     }
+
+   if (mode == E_INFO_CMD_OUTPUT_MODE_GET)
+     {
+        e_comp_screen = e_comp->e_comp_screen;
+        tdpy = e_comp_screen->tdisplay;
+
+        if (tdpy != NULL)
+          _output_mode_msg_clients_append(eldbus_message_iter_get(reply), e_comp_screen, 1);
+        else
+          _output_mode_msg_clients_append(eldbus_message_iter_get(reply), e_comp_screen, 0);
+     }
+
+   return reply;
+}
+
 #ifdef ENABLE_HWC_MULTI
 static Eldbus_Message *
 e_info_server_cb_hwc_trace_message(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
@@ -2100,6 +2215,7 @@ static const Eldbus_Method methods[] = {
    { "punch", ELDBUS_ARGS({"iiiiiiiii", "punch_geometry"}), NULL, _e_info_server_cb_punch, 0},
    { "transform_message", ELDBUS_ARGS({"siiiiiiii", "transform_message"}), NULL, e_info_server_cb_transform_message, 0},
    { "dump_buffers", ELDBUS_ARGS({"iis", "start"}), NULL, _e_info_server_cb_buffer_dump, 0 },
+   { "output_mode", ELDBUS_ARGS({SIGNATURE_OUTPUT_MODE_CLIENT, "output mode"}), ELDBUS_ARGS({"a("SIGNATURE_OUTPUT_MODE_SERVER")", "array of ec"}), _e_info_server_cb_output_mode, 0 },
 #ifdef ENABLE_HWC_MULTI
    { "hwc_trace_message", ELDBUS_ARGS({"i", "hwc_trace_message"}), NULL, e_info_server_cb_hwc_trace_message, 0},
    { "hwc", ELDBUS_ARGS({"i", "hwc"}), NULL, e_info_server_cb_hwc, 0},
index 5dde6b74da7bec4e6fed025520f5a3b28ffe94e3..935d2a4ab69146308b5d3465430f158c7a310d53 100644 (file)
@@ -39,6 +39,41 @@ typedef enum _E_Info_Cmd_Scrsaver
                                         */
 #define SIGNATURE_SCRSAVER_SERVER "s" /* s: result string from server */
 
+/* ------------------------------------------------------------------------- */
+/* OUTPUT_MODE                                                               */
+/* ------------------------------------------------------------------------- */
+#define USAGE_OUTPUT_MODE \
+   "enlightenment_info -output_mode\n"
+
+typedef enum _E_Info_Cmd_Output_Mode
+{
+   E_INFO_CMD_OUTPUT_MODE_UNKNOWN,
+   E_INFO_CMD_OUTPUT_MODE_GET
+} E_Info_Cmd_Output_Mode;
+
+#define SIGNATURE_OUTPUT_MODE_CLIENT "ii" /* i: E_Info_Cmd_Output_Mode
+                                           * i: mode number
+                                           */
+#define SIGNATURE_OUTPUT_MODE_SERVER "uuuuuuuuuuuusiiii" /* u: h value of outputmode
+                                                          * u: hsync_start value of outputmode
+                                                          * u: hsync_end value of outputmode
+                                                          * u: htotal value of outputmode
+                                                          * u: v value of outputmode
+                                                          * u: vsync_start value of outputmode
+                                                          * u: vsync_end value of outputmode
+                                                          * u: vtotal value of outputmode
+                                                          * u: refresh value of outputmode
+                                                          * u: vscan value of outputmode
+                                                          * u: clock value of outputmode
+                                                          * u: flag value of outputmode
+                                                          * s: name(resolution) of outputmode
+                                                          * i: check flag for current set mode
+                                                          * i: output id
+                                                          * i: check flag for output connection
+                                                          * i: check flag for gl support
+                                                          */
+
+
 #define USAGE_SLOT                                                                           \
    "(start   | list     | create   | modify   | del \n"                                      \
    "\t\t\t    raise   | lower    | add_ec_t | add_ec_r | del_ec | focus\n"                   \