From 3b7918b225ab9bf686b4590ae22400d57a53a82c Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Thu, 18 Aug 2016 16:35:01 +0900 Subject: [PATCH] add _e_eom_output_stop_presentation and execute it for disconnecting when presentation mode Change-Id: I9b37f3488f4dcc0c71d6f24e1a663086b17beb70 Signed-off-by: Junkyeong Kim --- src/e_mod_main.c | 42 ++++++++++++++++++++++++++++++++++-------- src/e_mod_main.h | 3 ++- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/e_mod_main.c b/src/e_mod_main.c index f9f6b33..24838c5 100644 --- a/src/e_mod_main.c +++ b/src/e_mod_main.c @@ -791,6 +791,8 @@ _e_eom_cb_tdm_output_status_change(tdm_output *output, tdm_output_change_type ty if (eom_output->state == MIRROR) _e_eom_output_stop_mirror(eom_output); + else if (eom_output->state == PRESENTATION) + _e_eom_output_stop_presentation(eom_output); /* update eom_output disconnect */ eom_output->width = 0; @@ -1338,13 +1340,34 @@ _e_eom_output_stop_mirror(E_EomOutputPtr eom_output) _e_eom_output_state_set_mode(eom_output, EOM_OUTPUT_MODE_NONE); _e_eom_output_state_set_attribute(eom_output, EOM_OUTPUT_ATTRIBUTE_NONE); - _e_eom_output_deinit(eom_output); + _e_eom_output_deinit(eom_output, 1); eom_output->state = NONE; } static void -_e_eom_output_deinit(E_EomOutputPtr eom_output) +_e_eom_output_stop_presentation(E_EomOutputPtr eom_output) +{ + E_EomClientPtr iterator = NULL; + Eina_List *l; + + if (eom_output->state == NONE) + return; + + _e_eom_output_state_set_status(eom_output, TDM_OUTPUT_CONN_STATUS_DISCONNECTED); + _e_eom_output_state_set_mode(eom_output, EOM_OUTPUT_MODE_NONE); + + _e_eom_output_deinit(eom_output, 0); + + EINA_LIST_FOREACH(g_eom->clients, l, iterator) + if (iterator && iterator->output_id == eom_output->id) + _e_eom_client_free_buffers(iterator); + + eom_output->state = NONE; +} + +static void +_e_eom_output_deinit(E_EomOutputPtr eom_output, int pp) { tdm_error err = TDM_ERROR_NONE; E_EomClientPtr iterator = NULL; @@ -1368,14 +1391,17 @@ _e_eom_output_deinit(E_EomOutputPtr eom_output) if (err != TDM_ERROR_NONE) EOM_ERR("set DPMS off:%d", err); - for (i = 0; i < NUM_MAIN_BUF; i++) + if (pp == 1) { - tdm_buffer_remove_release_handler(eom_output->dst_buffers[i], - _e_eom_cb_pp, eom_output); + for (i = 0; i < NUM_MAIN_BUF; i++) + { + tdm_buffer_remove_release_handler(eom_output->dst_buffers[i], + _e_eom_cb_pp, eom_output); - if (eom_output->dst_buffers[i]) - tbm_surface_destroy(eom_output->dst_buffers[i]); - } + if (eom_output->dst_buffers[i]) + tbm_surface_destroy(eom_output->dst_buffers[i]); + } + } if (g_eom->main_output_state == DOWN) EINA_LIST_FOREACH(g_eom->clients, l, iterator) diff --git a/src/e_mod_main.h b/src/e_mod_main.h index b24a5b8..da6653c 100644 --- a/src/e_mod_main.h +++ b/src/e_mod_main.h @@ -235,7 +235,8 @@ static const tdm_output_mode *_e_eom_output_get_best_mode(tdm_output *output); static int _e_eom_output_get_position(void); static void _e_eom_output_start_mirror(E_EomOutputPtr eom_output); static void _e_eom_output_stop_mirror(E_EomOutputPtr eom_output); -static void _e_eom_output_deinit(E_EomOutputPtr eom_output); +static void _e_eom_output_stop_presentation(E_EomOutputPtr eom_output); +static void _e_eom_output_deinit(E_EomOutputPtr eom_output, int pp); static tdm_layer *_e_eom_output_get_layer(E_EomOutputPtr eom_output); static E_EomOutputPtr _e_eom_output_get_by_id(int id); static Eina_Bool _e_eom_output_start_pp(E_EomOutputPtr eom_output); -- 2.7.4