static bool input_overlay_load_overlays(input_overlay_t *ol, const char *path) { size_t i; bool ret = true; config_file_t *conf = config_file_new(path); if (!conf) { RARCH_ERR("Failed to load config file: %s.\n", path); return false; } unsigned overlays = 0; if (!config_get_uint(conf, "overlays", &overlays)) { RARCH_ERR("overlays variable not defined in config.\n"); ret = false; goto end; } if (!overlays) { ret = false; goto end; } ol->overlays = (struct overlay*)calloc(overlays, sizeof(*ol->overlays)); if (!ol->overlays) { ret = false; goto end; } ol->size = overlays; for (i = 0; i < ol->size; i++) { if (!input_overlay_load_overlay(ol, conf, path, &ol->overlays[i], i)) { RARCH_ERR("[Overlay]: Failed to load overlay #%u.\n", (unsigned)i); ret = false; goto end; } } for (i = 0; i < ol->size; i++) { if (!input_overlay_resolve_targets(ol->overlays, i, ol->size)) { RARCH_ERR("[Overlay]: Failed to resolve next targets.\n"); ret = false; goto end; } } end: config_file_free(conf); return ret; }
bool input_overlay_load_overlays_resolve_iterate(input_overlay_t *ol) { bool not_done = true; if (!ol) return false; not_done = ol->resolve_pos < ol->size; if (!not_done) { ol->state = OVERLAY_STATUS_DEFERRED_DONE; return true; } if (!input_overlay_resolve_targets(ol->overlays, ol->resolve_pos, ol->size)) { RARCH_ERR("[Overlay]: Failed to resolve next targets.\n"); goto error; } if (ol->resolve_pos == 0) { ol->active = &ol->overlays[0]; input_overlay_load_active(ol, ol->deferred.opacity); input_overlay_enable(ol, ol->deferred.enable); } ol->resolve_pos += 1; return true; error: ol->state = OVERLAY_STATUS_DEFERRED_ERROR; return false; }