From 4fd66d4d1e2ffdea99d51a1a78321441dbacbdd0 Mon Sep 17 00:00:00 2001 From: SammyJames Date: Fri, 14 Jul 2017 23:26:53 -0400 Subject: [PATCH] libobs: Add post-load module callback This allows the ability for certain types of modules (particularly scripting-related modules) to initialize extra data when all other modules have loaded. Because front-ends may wish to have custom handling for loading modules, the front-end must manually call obs_post_load_modules after it has completed loading all plug-in modules. Closes jp9000/obs-studio#965 --- UI/window-basic-main.cpp | 2 ++ libobs/obs-internal.h | 1 + libobs/obs-module.c | 8 ++++++++ libobs/obs-module.h | 3 +++ libobs/obs.h | 4 ++++ 5 files changed, 18 insertions(+) diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 32b89fcb0..055179cd0 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -1317,6 +1317,8 @@ void OBSBasic::OBSInit() obs_load_all_modules(); blog(LOG_INFO, "---------------------------------"); obs_log_loaded_modules(); + blog(LOG_INFO, "---------------------------------"); + obs_post_load_modules(); blog(LOG_INFO, STARTUP_SEPARATOR); diff --git a/libobs/obs-internal.h b/libobs/obs-internal.h index 4d3a75c68..d4258718f 100644 --- a/libobs/obs-internal.h +++ b/libobs/obs-internal.h @@ -82,6 +82,7 @@ struct obs_module { bool (*load)(void); void (*unload)(void); + void (*post_load)(void); void (*set_locale)(const char *locale); void (*free_locale)(void); uint32_t (*ver)(void); diff --git a/libobs/obs-module.c b/libobs/obs-module.c index 41c46a4fa..06418e6f5 100644 --- a/libobs/obs-module.c +++ b/libobs/obs-module.c @@ -48,6 +48,7 @@ static int load_module_exports(struct obs_module *mod, const char *path) /* optional exports */ mod->unload = os_dlsym(mod->module, "obs_module_unload"); + mod->post_load = os_dlsym(mod->module, "obs_module_post_load"); mod->set_locale = os_dlsym(mod->module, "obs_module_set_locale"); mod->free_locale = os_dlsym(mod->module, "obs_module_free_locale"); mod->name = os_dlsym(mod->module, "obs_module_name"); @@ -254,6 +255,13 @@ void obs_load_all_modules(void) profile_end(obs_load_all_modules_name); } +void obs_post_load_modules(void) +{ + for (obs_module_t *mod = obs->first_module; !!mod; mod = mod->next) + if (mod->post_load) + mod->post_load(); +} + static inline void make_data_dir(struct dstr *parsed_data_dir, const char *data_dir, const char *name) { diff --git a/libobs/obs-module.h b/libobs/obs-module.h index cf449f3dd..09f484eee 100644 --- a/libobs/obs-module.h +++ b/libobs/obs-module.h @@ -97,6 +97,9 @@ MODULE_EXPORT bool obs_module_load(void); /** Optional: Called when the module is unloaded. */ MODULE_EXPORT void obs_module_unload(void); +/** Optional: Called when all modules have finished loading */ +MODULE_EXPORT void obs_module_post_load(void); + /** Called to set the current locale data for the module. */ MODULE_EXPORT void obs_module_set_locale(const char *locale); diff --git a/libobs/obs.h b/libobs/obs.h index cc554885b..503c4c80c 100644 --- a/libobs/obs.h +++ b/libobs/obs.h @@ -374,6 +374,10 @@ EXPORT void obs_add_module_path(const char *bin, const char *data); /** Automatically loads all modules from module paths (convenience function) */ EXPORT void obs_load_all_modules(void); +/** Notifies modules that all modules have been loaded. This function should + * be called after all modules have been loaded. */ +EXPORT void obs_post_load_modules(void); + struct obs_module_info { const char *bin_path; const char *data_path;