From: Junkyeong Kim Date: Wed, 15 Nov 2017 09:03:07 +0000 (+0900) Subject: e_eom: add e_eom_connect and e_eom_disconnect internal API X-Git-Tag: accepted/tizen/unified/20171208.062104~56 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=4466dd6b9f8282dff3580ba5df065ca4b9175343;p=platform%2Fupstream%2Fenlightenment.git e_eom: add e_eom_connect and e_eom_disconnect internal API Change-Id: I5c0772656ce379bb828e9be3b96da3afe808db91 Signed-off-by: Junkyeong Kim --- diff --git a/src/bin/e_eom.c b/src/bin/e_eom.c index e0e83b9..aa79446 100644 --- a/src/bin/e_eom.c +++ b/src/bin/e_eom.c @@ -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; +} diff --git a/src/bin/e_eom.h b/src/bin/e_eom.h index dd5513b..18a9a78 100644 --- a/src/bin/e_eom.h +++ b/src/bin/e_eom.h @@ -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