libobs/UI: Allow Access To argc/argv

This paves the way for plugins to have access to the argc/argv used
when spawning OBS. Notably, this will allow a patch to obs-browser that
passes through command line arguments on macOS to CEF.
This commit is contained in:
David Cooper 2018-07-03 14:31:27 -07:00
parent 8c910a9e3b
commit 16e879ca51
3 changed files with 63 additions and 0 deletions

View file

@ -1981,6 +1981,8 @@ int main(int argc, char *argv[])
move_to_xdg();
#endif
obs_set_cmdline_args(argc, argv);
for (int i = 1; i < argc; i++) {
if (arg_is(argv[i], "--portable", "-p")) {
portable_mode = true;

View file

@ -851,6 +851,42 @@ bool obs_startup(const char *locale, const char *module_config_path,
return success;
}
static struct obs_cmdline_args cmdline_args = {0, NULL};
void obs_set_cmdline_args(int argc, char **argv)
{
char *data;
size_t len;
int i;
/* Once argc is set (non-zero) we shouldn't call again */
if (cmdline_args.argc)
return;
cmdline_args.argc = argc;
/* Safely copy over argv */
len = 0;
for (i = 0; i < argc; i++)
len += strlen(argv[i]) + 1;
cmdline_args.argv = bmalloc(sizeof(char *) * (argc + 1) + len);
data = (char *) cmdline_args.argv + sizeof(char *) * (argc + 1);
for (i = 0; i < argc; i++) {
cmdline_args.argv[i] = data;
len = strlen(argv[i]) + 1;
memcpy(data, argv[i], len);
data += len;
}
cmdline_args.argv[argc] = NULL;
}
struct obs_cmdline_args obs_get_cmdline_args(void)
{
return cmdline_args;
}
void obs_shutdown(void)
{
struct obs_module *module;
@ -916,6 +952,7 @@ void obs_shutdown(void)
bfree(core->module_config_path);
bfree(core->locale);
bfree(core);
bfree(cmdline_args.argv);
#ifdef _WIN32
uninitialize_com();

View file

@ -239,6 +239,12 @@ struct obs_source_frame {
bool prev_frame;
};
/** Access to the argc/argv used to start OBS. What you see is what you get. */
struct obs_cmdline_args {
int argc;
char **argv;
};
/* ------------------------------------------------------------------------- */
/* OBS context */
@ -291,6 +297,24 @@ EXPORT uint32_t obs_get_version(void);
/** @return The current core version string */
EXPORT const char *obs_get_version_string(void);
/**
* Sets things up for calls to obs_get_cmdline_args. Called onl yonce at startup
* and safely copies argv/argc from main(). Subsequent calls do nothing.
*
* @param argc The count of command line arguments, from main()
* @param argv An array of command line arguments, copied from main() and ends
* with NULL.
*/
EXPORT void obs_set_cmdline_args(int argc, char **argv);
/**
* Get the argc/argv used to start OBS
*
* @return The command line arguments used for main(). Don't modify this or
* you'll mess things up for other callers.
*/
EXPORT struct obs_cmdline_args obs_get_cmdline_args(void);
/**
* Sets a new locale to use for modules. This will call obs_module_set_locale
* for each module with the new locale.