/** * @param type: The Ewl_Engine_Hook type to find the best matching function * @return Returns a pointer to the appropriate engine callback on success. * @brief Retrieves the correct engine callback for the specified type. */ void * ewl_engine_hook_get(Ewl_Window *win, Ewl_Engine_Hook type) { Ewl_Engine *caller; void *match = NULL; DENTER_FUNCTION(DLEVEL_STABLE); DCHECK_PARAM_PTR("win", win); DCHECK_PARAM_PTR("valid type", (type >= 0 && type < EWL_ENGINE_MAX)); DCHECK_TYPE("win", win, EWL_WINDOW_TYPE); caller = EWL_ENGINE(win->engine); if (!caller->functions->engine_hooks[type] && caller->dependancies) { Ecore_List *deps; deps = caller->dependancies; ecore_list_goto_last(deps); while ((caller = ecore_dlist_previous(deps))) { if (caller->functions->engine_hooks[type]) break; } } if (caller && caller->functions->engine_hooks[type]) match = caller->functions->engine_hooks[type]; DRETURN_PTR(match, DLEVEL_STABLE); }