e_eom: add e_eom_connect and e_eom_disconnect internal API 10/160310/9
authorJunkyeong Kim <jk0430.kim@samsung.com>
Wed, 15 Nov 2017 09:03:07 +0000 (18:03 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Tue, 21 Nov 2017 01:28:45 +0000 (01:28 +0000)
Change-Id: I5c0772656ce379bb828e9be3b96da3afe808db91
Signed-off-by: Junkyeong Kim <jk0430.kim@samsung.com>
src/bin/e_eom.c
src/bin/e_eom.h

index e0e83b9..aa79446 100644 (file)
@@ -112,6 +112,7 @@ struct _E_Eom_Output
    Eina_Bool need_overlay_pp;
 
    E_EomOutputState state;
+   Eina_Bool connection_status;
    tdm_output_conn_status status;
    eom_output_attribute_e attribute;
    eom_output_attribute_state_e attribute_state;
@@ -3364,6 +3365,24 @@ _e_eom_cb_rotation_end(void *data, int evtype EINA_UNUSED, void *event)
 }
 #endif
 
+static E_EomOutputPtr
+_e_eom_output_find(E_Output *output)
+{
+   E_EomOutputPtr eom_output = NULL, eom_output_tmp = NULL;
+   Eina_List *l;
+
+   if (g_eom->outputs)
+     {
+        EINA_LIST_FOREACH(g_eom->outputs, l, eom_output_tmp)
+          {
+             if (eom_output_tmp->output == output->toutput)
+               eom_output = eom_output_tmp;
+          }
+     }
+
+   return eom_output;
+}
+
 static Eina_Bool
 _e_eom_external_output_check()
 {
@@ -3468,3 +3487,158 @@ e_eom_tdm_output_by_ec_get(E_Client *ec)
 
    return eom_output->output;
 }
+
+EINTERN Eina_Bool
+e_eom_connect(E_Output *output)
+{
+   E_EomOutputPtr eom_output = NULL;
+   E_EomClientPtr iterator = NULL;
+   Eina_List *l;
+
+   g_eom->check_first_boot = 1;
+
+   eom_output = _e_eom_output_find(output);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(eom_output, EINA_FALSE);
+
+   if (eom_output->connection_status == EINA_TRUE)
+     return EINA_TRUE;
+
+   /* update eom_output connect */
+   eom_output->width = output->config.mode.w;
+   eom_output->height = output->config.mode.h;
+   eom_output->phys_width = output->info.size.w;
+   eom_output->phys_height = output->info.size.h;
+   eom_output->name = eina_stringshare_add(output->id);
+   eom_output->connection_status = EINA_TRUE;
+
+   EOMDB("Setup new output: %s (%dx%d)", eom_output->name, eom_output->width, eom_output->height);
+
+   /* TODO: check output mode(presentation set) and HDMI type */
+   if (eom_output->state == WAIT_PRESENTATION)
+     {
+        EOMDB("Start wait Presentation");
+
+        e_output_external_set(output, E_OUTPUT_EXT_WAIT_PRESENTATION);
+     }
+   else
+     {
+        EOMDB("Start Mirroring");
+
+        _e_eom_output_state_set_mode(eom_output, EOM_OUTPUT_MODE_MIRROR);
+        eom_output->state = MIRROR;
+
+        e_output_external_set(output, E_OUTPUT_EXT_MIRROR);
+     }
+
+   eom_output->connection = WL_EOM_STATUS_CONNECTION;
+
+   /* If there were previously connected clients to the output - notify them */
+   EINA_LIST_FOREACH(g_eom->clients, l, iterator)
+     {
+        if (iterator && iterator->resource)
+          {
+             EOMDB("Send output connected notification to client: %p", iterator);
+
+             if (iterator->current)
+               wl_eom_send_output_info(iterator->resource, eom_output->id,
+                                       eom_output->type, eom_output->mode,
+                                       eom_output->width, eom_output->height,
+                                       eom_output->phys_width, eom_output->phys_height,
+                                       eom_output->connection,
+                                       0,
+                                       _e_eom_output_state_get_attribute(eom_output),
+                                       EOM_OUTPUT_ATTRIBUTE_STATE_ACTIVE,
+                                       EOM_ERROR_NONE);
+             else
+               wl_eom_send_output_info(iterator->resource, eom_output->id,
+                                       eom_output->type, eom_output->mode,
+                                       eom_output->width, eom_output->height,
+                                       eom_output->phys_width, eom_output->phys_height,
+                                       eom_output->connection,
+                                       1, 0, 0, 0);
+          }
+     }
+
+   return EINA_TRUE;
+}
+
+EINTERN Eina_Bool
+e_eom_disconnect(E_Output *output)
+{
+   E_EomOutputPtr eom_output = NULL;
+   E_EomClientPtr iterator = NULL;
+   Eina_List *l;
+
+   g_eom->check_first_boot = 1;
+
+   eom_output = _e_eom_output_find(output);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(eom_output, EINA_FALSE);
+
+   if (eom_output->connection_status == EINA_FALSE)
+     return EINA_TRUE;
+
+   if (eom_output->delay)
+     ecore_timer_del(eom_output->delay);
+
+   if (eom_output->watchdog)
+     ecore_timer_del(eom_output->watchdog);
+
+   if (g_eom->rotate_output == eom_output)
+     {
+        if (g_eom->rotate_timer)
+          ecore_timer_del(g_eom->rotate_timer);
+        g_eom->rotate_timer = NULL;
+        g_eom->rotate_output = NULL;
+     }
+
+   /* update eom_output disconnect */
+   eom_output->width = 0;
+   eom_output->height = 0;
+   eom_output->phys_width = 0;
+   eom_output->phys_height = 0;
+   eom_output->connection = WL_EOM_STATUS_DISCONNECTION;
+
+   e_output_external_unset(output);
+
+   eom_output->connection_status = EINA_FALSE;
+
+   _e_eom_output_state_set_mode(eom_output, EOM_OUTPUT_MODE_NONE);
+
+   if (_e_eom_client_get_current_by_id(eom_output->id))
+     eom_output->state = WAIT_PRESENTATION;
+   else
+     eom_output->state = NONE;
+
+   /* If there were previously connected clients to the output - notify them */
+   EINA_LIST_FOREACH(g_eom->clients, l, iterator)
+     {
+        if (iterator && iterator->resource)
+          {
+             EOMDB("Send output disconnected notification to client: %p", iterator);
+
+             if (iterator->current)
+               wl_eom_send_output_info(iterator->resource, eom_output->id,
+                                       eom_output->type, eom_output->mode,
+                                       eom_output->width, eom_output->height,
+                                       eom_output->phys_width, eom_output->phys_height,
+                                       eom_output->connection,
+                                       0,
+                                       _e_eom_output_state_get_attribute(eom_output),
+                                       EOM_OUTPUT_ATTRIBUTE_STATE_INACTIVE,
+                                       EOM_ERROR_NONE);
+             else
+               wl_eom_send_output_info(iterator->resource, eom_output->id,
+                                       eom_output->type, eom_output->mode,
+                                       eom_output->width, eom_output->height,
+                                       eom_output->phys_width, eom_output->phys_height,
+                                       eom_output->connection,
+                                       1, 0, 0, 0);
+          }
+     }
+
+   EOMDB("Destory output: %s", eom_output->name);
+   eina_stringshare_del(eom_output->name);
+   eom_output->name = NULL;
+
+   return EINA_TRUE;
+}
index dd5513b..18a9a78 100644 (file)
@@ -10,6 +10,8 @@ EINTERN int e_eom_init(void);
 EINTERN int e_eom_shutdown(void);
 EINTERN Eina_Bool e_eom_is_ec_external(E_Client *ec);
 EINTERN tdm_output* e_eom_tdm_output_by_ec_get(E_Client *ec);
+EINTERN Eina_Bool e_eom_connect(E_Output *output);
+EINTERN Eina_Bool e_eom_disconnect(E_Output *output);
 
 #endif
 #endif