From e40e54d9f53c11dcc00aa24b26b13eff5d2d9fb5 Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Fri, 11 Jan 2019 16:59:23 +0900 Subject: [PATCH] e_eom: add e_eom create and destroy function to support added output Change-Id: I11fb2058b199bbf939d790cd666ea1ee21cfb2e2 Signed-off-by: Junkyeong Kim --- src/bin/e_eom.c | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- src/bin/e_eom.h | 2 + 2 files changed, 114 insertions(+), 4 deletions(-) diff --git a/src/bin/e_eom.c b/src/bin/e_eom.c index 8862202..06bf920 100644 --- a/src/bin/e_eom.c +++ b/src/bin/e_eom.c @@ -81,6 +81,7 @@ struct _E_Eom Eina_List *comp_object_intercept_hooks; unsigned int virtual_output_count; Eina_List *virtual_outputs; + Eina_List *added_outputs; /* Internal output data */ Eina_Bool main_output_state; @@ -1156,6 +1157,24 @@ _e_eom_output_find(E_Output *output) return eom_output; } +static E_EomOutputPtr +_e_eom_output_find_added_output(E_Output *output) +{ + E_EomOutputPtr eom_output = NULL, eom_output_tmp = NULL; + Eina_List *l; + + if (g_eom->added_outputs) + { + EINA_LIST_FOREACH(g_eom->added_outputs, l, eom_output_tmp) + { + if (eom_output_tmp->output == output->toutput) + eom_output = eom_output_tmp; + } + } + + return eom_output; +} + static void _e_eom_main_output_info_get() { @@ -1188,7 +1207,6 @@ _e_eom_output_init(tdm_display *dpy) Eina_List *l; count = e_comp->e_comp_screen->num_outputs; - EINA_SAFETY_ON_FALSE_RETURN_VAL(count > 1, EINA_FALSE); g_eom->output_count = count - 1; EOMDB("external output count : %d", g_eom->output_count); @@ -1396,6 +1414,8 @@ _e_eom_init_internal() goto err; } + g_eom->added_outputs = NULL; + g_eom->timer = ecore_timer_add(EOM_CONNECT_CHECK_TIMEOUT, _e_eom_boot_connection_check, NULL); return EINA_TRUE; @@ -2389,7 +2409,7 @@ _e_eom_init() EINA_SAFETY_ON_NULL_GOTO(e_comp_wl, err); - if (e_comp->e_comp_screen->num_outputs <= 1) + if (e_comp->e_comp_screen->num_outputs < 1) return EINA_TRUE; g_eom = E_NEW(E_Eom, 1); @@ -2473,10 +2493,20 @@ e_eom_connect(E_Output *output) E_EomClientPtr iterator = NULL; Eina_List *l; + if (!g_eom) return EINA_TRUE; + 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 == NULL) + { + eom_output = _e_eom_output_find_added_output(output); + if (!eom_output) + { + EOMER("cannot find output"); + return EINA_FALSE; + } + } if (eom_output->connection_status == EINA_TRUE) return EINA_TRUE; @@ -2560,10 +2590,20 @@ e_eom_disconnect(E_Output *output) E_EomClientPtr iterator = NULL; Eina_List *l; + if (!g_eom) return EINA_TRUE; + 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 == NULL) + { + eom_output = _e_eom_output_find_added_output(output); + if (!eom_output) + { + EOMER("cannot find output"); + return EINA_FALSE; + } + } if (eom_output->connection_status == EINA_FALSE) return EINA_TRUE; @@ -2637,3 +2677,71 @@ e_eom_disconnect(E_Output *output) return EINA_TRUE; } + +EINTERN Eina_Bool +e_eom_create(E_Output *output) +{ + E_EomOutputPtr eom_output = NULL; + + if (!g_eom) return EINA_TRUE; + + eom_output = E_NEW(E_EomOutput, 1); + EINA_SAFETY_ON_NULL_RETURN_VAL(eom_output, EINA_FALSE); + + eom_output->id = output->index; + eom_output->mode = EOM_OUTPUT_MODE_NONE; + eom_output->connection = WL_EOM_STATUS_NONE; + eom_output->eout = output; + EINA_SAFETY_ON_NULL_GOTO(eom_output->eout, err); + + eom_output->output = eom_output->eout->toutput; + eom_output->type = (eom_output_type_e)eom_output->eout->toutput_type; + + eom_output->connection_status = EINA_FALSE; + eom_output->width = 0; + eom_output->height = 0; + eom_output->phys_width = 0; + eom_output->phys_height = 0; + + EOMDB("create (%d)output, type:%d, name:%s", + eom_output->id, eom_output->type, eom_output->name); + + g_eom->added_outputs = eina_list_append(g_eom->added_outputs, eom_output); + + return EINA_TRUE; + +err: + E_FREE(eom_output); + + return EINA_FALSE; +} + +EINTERN Eina_Bool +e_eom_destroy(E_Output *output) +{ + E_EomOutputPtr eom_output = NULL; + E_EomOutputPtr eom_output_delete = NULL; + Eina_List *l; + + if (!g_eom) return EINA_TRUE; + + EINA_LIST_FOREACH(g_eom->added_outputs, l, eom_output) + { + if (eom_output && eom_output->eout == output) + { + eom_output_delete = eom_output; + break; + } + } + + if (!eom_output_delete) return EINA_FALSE; + + EOMDB("destroy (%d)output, type:%d, name:%s", + eom_output->id, eom_output->type, eom_output->name); + + g_eom->added_outputs = eina_list_remove(g_eom->added_outputs, eom_output_delete); + + E_FREE(eom_output_delete); + + return EINA_TRUE; +} diff --git a/src/bin/e_eom.h b/src/bin/e_eom.h index 18a9a78..ec78e39 100644 --- a/src/bin/e_eom.h +++ b/src/bin/e_eom.h @@ -12,6 +12,8 @@ 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); +EINTERN Eina_Bool e_eom_create(E_Output *output); +EINTERN Eina_Bool e_eom_destroy(E_Output *output); #endif #endif -- 2.7.4