From: SooChan Lim Date: Thu, 25 Jul 2019 01:37:53 +0000 (+0900) Subject: e_output: add hook for output add/remove X-Git-Tag: accepted/tizen/unified/20190807.111846~7 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2133c491879ec24ef262be495fcb512e216bdc29;p=platform%2Fupstream%2Fenlightenment.git e_output: add hook for output add/remove Change-Id: Ic51ffd3eb2b9107943a2a4edc0c25e796494a9ab --- diff --git a/src/bin/e_comp_screen.c b/src/bin/e_comp_screen.c index 8cf790e..4845995 100644 --- a/src/bin/e_comp_screen.c +++ b/src/bin/e_comp_screen.c @@ -578,7 +578,6 @@ _e_comp_screen_output_destroy_cb(tdm_output *toutput, void *user_data) { e_comp_screen->num_outputs--; e_comp_screen->outputs = eina_list_remove_list(e_comp_screen->outputs, l); - e_eom_destroy(output); e_output_del(output); } } @@ -626,7 +625,6 @@ _e_comp_screen_output_create_cb(tdm_display *dpy, tdm_output *toutput, void *use return; } - e_eom_create(output, EINA_TRUE); e_comp_screen->outputs = eina_list_append(e_comp_screen->outputs, output); e_comp_screen->num_outputs++; diff --git a/src/bin/e_eom.c b/src/bin/e_eom.c index eaf2a30..2bedf9c 100644 --- a/src/bin/e_eom.c +++ b/src/bin/e_eom.c @@ -97,6 +97,8 @@ struct _E_Eom Eina_List *added_outputs; E_Output_Hook *output_connect_status_hook; E_Output_Hook *output_mode_changes_hook; + E_Output_Hook *output_add_hook; + E_Output_Hook *output_remove_hook; /* Internal output data */ E_Output *output_primary; @@ -1180,6 +1182,71 @@ _e_eom_output_find_added_output(E_Output *output) return eom_output; } +static Eina_Bool +_e_eom_create(E_Output *output, Eina_Bool added) +{ + 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 = output->toutput; + eom_output->type = (eom_output_type_e)output->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; + eom_output->added = added; + + if (eom_output->added) + g_eom->added_outputs = eina_list_append(g_eom->added_outputs, eom_output); + else + g_eom->eom_outputs = eina_list_append(g_eom->eom_outputs, eom_output); + + EOINF("create (%d)output, type:%d, name:%s added:%d", eom_output->eout, + eom_output->id, eom_output->type, eom_output->name, eom_output->added); + + return EINA_TRUE; + +err: + E_FREE(eom_output); + + return EINA_FALSE; +} + +static Eina_Bool +_e_eom_destroy(E_Output *output) +{ + E_EomOutputPtr eom_output = NULL; + + if (!g_eom) return EINA_TRUE; + + eom_output = _e_eom_output_find_added_output(output); + EINA_SAFETY_ON_NULL_RETURN_VAL(eom_output, EINA_FALSE); + + EOINF("destroy (%d)output, type:%d, name:%s added:%d", eom_output->eout, + eom_output->id, eom_output->type, eom_output->name, eom_output->added); + + if (eom_output->added) + g_eom->added_outputs = eina_list_remove(g_eom->added_outputs, eom_output); + else + g_eom->eom_outputs = eina_list_remove(g_eom->eom_outputs, eom_output); + + E_FREE(eom_output); + + return EINA_TRUE; +} + static void _e_eom_output_deinit(void) { @@ -1190,13 +1257,13 @@ _e_eom_output_deinit(void) if (!g_eom->eom_outputs) return; EINA_LIST_FOREACH(g_eom->added_outputs, l, eom_output) - e_eom_destroy(eom_output->eout); + _e_eom_destroy(eom_output->eout); eina_list_free(g_eom->eom_outputs); g_eom->added_outputs = NULL; EINA_LIST_FOREACH(g_eom->eom_outputs, l, eom_output) - e_eom_destroy(eom_output->eout); + _e_eom_destroy(eom_output->eout); eina_list_free(g_eom->eom_outputs); g_eom->eom_outputs = NULL; @@ -1223,9 +1290,9 @@ _e_eom_output_init(void) if (!output) continue; if (output == g_eom->output_primary) continue; - if (!e_eom_create(output, EINA_FALSE)) + if (!_e_eom_create(output, EINA_FALSE)) { - EOERR("e_eom_create fails.", output); + EOERR("_e_eom_create fails.", output); goto err; } } @@ -2309,12 +2376,54 @@ _e_eom_output_cb_output_mode_change(void *data, E_Output *output) } static void +_e_eom_output_cb_output_add(void *data, E_Output *output) +{ + EINA_SAFETY_ON_NULL_RETURN(g_eom->output_primary); + + /* doesn't care about the pirmary output */ + if (g_eom->output_primary == output) return; + + if (!_e_eom_create(output, EINA_TRUE)) + { + EOERR("_e_eom_create fails.", output); + return; + } +} + +static void +_e_eom_output_cb_output_remove(void *data, E_Output *output) +{ + EINA_SAFETY_ON_NULL_RETURN(g_eom->output_primary); + + /* doesn't care about the pirmary output */ + if (g_eom->output_primary == output) return; + + if (!_e_eom_destroy(output)) + { + EOERR("_e_eom_destroy fails.", output); + return; + } +} + +static void _e_eom_deinit() { Ecore_Event_Handler *h = NULL; if (g_eom == NULL) return; + if (g_eom->output_remove_hook) + { + e_output_hook_del(g_eom->output_remove_hook); + g_eom->output_remove_hook = NULL; + } + + if (g_eom->output_add_hook) + { + e_output_hook_del(g_eom->output_add_hook); + g_eom->output_add_hook = NULL; + } + if (g_eom->output_mode_changes_hook) { e_output_hook_del(g_eom->output_mode_changes_hook); @@ -2379,6 +2488,8 @@ _e_eom_init() g_eom->output_connect_status_hook = e_output_hook_add(E_OUTPUT_HOOK_CONNECT_STATUS_CHANGE, _e_eom_output_cb_output_connect_status_change, g_eom); g_eom->output_mode_changes_hook = e_output_hook_add(E_OUTPUT_HOOK_MODE_CHANGE, _e_eom_output_cb_output_mode_change, g_eom); + g_eom->output_add_hook = e_output_hook_add(E_OUTPUT_HOOK_ADD, _e_eom_output_cb_output_add, g_eom); + g_eom->output_remove_hook = e_output_hook_add(E_OUTPUT_HOOK_REMOVE, _e_eom_output_cb_output_remove, g_eom); return EINA_TRUE; @@ -2423,69 +2534,4 @@ e_eom_is_ec_external(E_Client *ec) return EINA_FALSE; return EINA_TRUE; -} - -EINTERN Eina_Bool -e_eom_create(E_Output *output, Eina_Bool added) -{ - 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 = output->toutput; - eom_output->type = (eom_output_type_e)output->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; - eom_output->added = added; - - if (eom_output->added) - g_eom->added_outputs = eina_list_append(g_eom->added_outputs, eom_output); - else - g_eom->eom_outputs = eina_list_append(g_eom->eom_outputs, eom_output); - - EOINF("create (%d)output, type:%d, name:%s added:%d", eom_output->eout, - eom_output->id, eom_output->type, eom_output->name, eom_output->added); - - 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; - - if (!g_eom) return EINA_TRUE; - - eom_output = _e_eom_output_find_added_output(output); - EINA_SAFETY_ON_NULL_RETURN_VAL(eom_output, EINA_FALSE); - - EOINF("destroy (%d)output, type:%d, name:%s added:%d", eom_output->eout, - eom_output->id, eom_output->type, eom_output->name, eom_output->added); - - if (eom_output->added) - g_eom->added_outputs = eina_list_remove(g_eom->added_outputs, eom_output); - else - g_eom->eom_outputs = eina_list_remove(g_eom->eom_outputs, eom_output); - - E_FREE(eom_output); - - return EINA_TRUE; -} +} \ No newline at end of file diff --git a/src/bin/e_eom.h b/src/bin/e_eom.h index 751c210..0f5761d 100644 --- a/src/bin/e_eom.h +++ b/src/bin/e_eom.h @@ -8,8 +8,8 @@ EINTERN int e_eom_init(void); EINTERN int e_eom_shutdown(void); + E_API Eina_Bool e_eom_is_ec_external(E_Client *ec); -EINTERN Eina_Bool e_eom_create(E_Output *output, Eina_Bool added); -EINTERN Eina_Bool e_eom_destroy(E_Output *output); + #endif #endif diff --git a/src/bin/e_output.c b/src/bin/e_output.c index d4d7a39..3ac867a 100644 --- a/src/bin/e_output.c +++ b/src/bin/e_output.c @@ -54,6 +54,8 @@ static Eina_Inlist *_e_output_hooks[] = [E_OUTPUT_HOOK_DPMS_CHANGE] = NULL, [E_OUTPUT_HOOK_CONNECT_STATUS_CHANGE] = NULL, [E_OUTPUT_HOOK_MODE_CHANGE] = NULL, + [E_OUTPUT_HOOK_ADD] = NULL, + [E_OUTPUT_HOOK_REMOVE] = NULL, }; static int _e_output_intercept_hooks_delete = 0; @@ -2336,6 +2338,9 @@ e_output_new(E_Comp_Screen *e_comp_screen, int index) if (output_caps & TDM_OUTPUT_CAPABILITY_ASYNC_DPMS) output->dpms_async = EINA_TRUE; + /* call output add hook */ + _e_output_hook_call(E_OUTPUT_HOOK_ADD, output); + return output; fail: @@ -2352,6 +2357,9 @@ e_output_del(E_Output *output) if (!output) return; + /* call output remove hook */ + _e_output_hook_call(E_OUTPUT_HOOK_REMOVE, output); + if (output->hwc) e_hwc_del(output->hwc); e_plane_shutdown(); diff --git a/src/bin/e_output.h b/src/bin/e_output.h index 8e7770d..75d593e 100644 --- a/src/bin/e_output.h +++ b/src/bin/e_output.h @@ -137,6 +137,8 @@ enum _E_Output_Hook_Point E_OUTPUT_HOOK_DPMS_CHANGE, E_OUTPUT_HOOK_CONNECT_STATUS_CHANGE, E_OUTPUT_HOOK_MODE_CHANGE, + E_OUTPUT_HOOK_ADD, + E_OUTPUT_HOOK_REMOVE, E_OUTPUT_HOOK_LAST };