clang-format: Increase column limit from 80 to 120

This commit is contained in:
Ryan Foster
2024-10-04 18:19:27 -04:00
parent 109f64c446
commit a1fbf1015f
736 changed files with 22684 additions and 45435 deletions
@@ -41,8 +41,7 @@ static inline bool script_callback_removed(struct script_callback *cb)
return os_atomic_load_bool(&cb->removed);
}
static inline void *add_script_callback(struct script_callback **first,
obs_script_t *script, size_t extra_size)
static inline void *add_script_callback(struct script_callback **first, obs_script_t *script, size_t extra_size)
{
struct script_callback *cb = bzalloc(sizeof(*cb) + extra_size);
cb->script = script;
+6 -12
View File
@@ -37,16 +37,10 @@ typedef void (*defer_call_cb)(void *param);
extern void defer_call_post(defer_call_cb call, void *cb);
extern void script_log(obs_script_t *script, int level, const char *format,
...);
extern void script_log_va(obs_script_t *script, int level, const char *format,
va_list args);
extern void script_log(obs_script_t *script, int level, const char *format, ...);
extern void script_log_va(obs_script_t *script, int level, const char *format, va_list args);
#define script_error(script, format, ...) \
script_log(script, LOG_ERROR, format, ##__VA_ARGS__)
#define script_warn(script, format, ...) \
script_log(script, LOG_WARNING, format, ##__VA_ARGS__)
#define script_info(script, format, ...) \
script_log(script, LOG_INFO, format, ##__VA_ARGS__)
#define script_debug(script, format, ...) \
script_log(script, LOG_DEBUG, format, ##__VA_ARGS__)
#define script_error(script, format, ...) script_log(script, LOG_ERROR, format, ##__VA_ARGS__)
#define script_warn(script, format, ...) script_log(script, LOG_WARNING, format, ##__VA_ARGS__)
#define script_info(script, format, ...) script_log(script, LOG_INFO, format, ##__VA_ARGS__)
#define script_debug(script, format, ...) script_log(script, LOG_DEBUG, format, ##__VA_ARGS__)
+3 -6
View File
@@ -21,8 +21,7 @@
static scripting_log_handler_t callback = NULL;
static void *param = NULL;
void script_log_va(obs_script_t *script, int level, const char *format,
va_list args)
void script_log_va(obs_script_t *script, int level, const char *format, va_list args)
{
char msg[2048];
const char *lang = "(Unknown)";
@@ -41,8 +40,7 @@ void script_log_va(obs_script_t *script, int level, const char *format,
break;
}
start_len = snprintf(msg, sizeof(msg), "[%s: %s] ", lang,
script->file.array);
start_len = snprintf(msg, sizeof(msg), "[%s: %s] ", lang, script->file.array);
} else {
start_len = snprintf(msg, sizeof(msg), "[Unknown Script] ");
}
@@ -62,8 +60,7 @@ void script_log(obs_script_t *script, int level, const char *format, ...)
va_end(args);
}
void obs_scripting_set_log_callback(scripting_log_handler_t handler,
void *log_param)
void obs_scripting_set_log_callback(scripting_log_handler_t handler, void *log_param)
{
callback = handler;
param = log_param;
@@ -20,14 +20,11 @@
#include "obs-scripting-lua.h"
#define ls_get_libobs_obj(type, lua_index, obs_obj) \
ls_get_libobs_obj_(script, #type " *", lua_index, obs_obj, NULL, \
__FUNCTION__, __LINE__)
#define ls_push_libobs_obj(type, obs_obj, ownership) \
ls_push_libobs_obj_(script, #type " *", obs_obj, ownership, NULL, \
__FUNCTION__, __LINE__)
#define call_func(func, args, rets) \
call_func_(script, cb->reg_idx, args, rets, #func, "frontend API")
#define ls_get_libobs_obj(type, lua_index, obs_obj) \
ls_get_libobs_obj_(script, #type " *", lua_index, obs_obj, NULL, __FUNCTION__, __LINE__)
#define ls_push_libobs_obj(type, obs_obj, ownership) \
ls_push_libobs_obj_(script, #type " *", obs_obj, ownership, NULL, __FUNCTION__, __LINE__)
#define call_func(func, args, rets) call_func_(script, cb->reg_idx, args, rets, #func, "frontend API")
/* ----------------------------------- */
@@ -248,8 +245,7 @@ static int add_event_callback(lua_State *script)
/* ----------------------------------- */
static void frontend_save_callback(obs_data_t *save_data, bool saving,
void *priv)
static void frontend_save_callback(obs_data_t *save_data, bool saving, void *priv)
{
struct lua_obs_callback *cb = priv;
lua_State *script = cb->script;
@@ -305,38 +301,23 @@ typedef struct lua_function_tuple {
static const obs_frontend_func functions[] = {
{.name = "obs_frontend_get_scene_names", .function = get_scene_names},
{.name = "obs_frontend_get_scenes", .function = get_scenes},
{.name = "obs_frontend_get_current_scene",
.function = get_current_scene},
{.name = "obs_frontend_set_current_scene",
.function = set_current_scene},
{.name = "obs_frontend_get_current_scene", .function = get_current_scene},
{.name = "obs_frontend_set_current_scene", .function = set_current_scene},
{.name = "obs_frontend_get_transitions", .function = get_transitions},
{.name = "obs_frontend_get_current_transition",
.function = get_current_transition},
{.name = "obs_frontend_set_current_transition",
.function = set_current_transition},
{.name = "obs_frontend_get_transition_duration",
.function = get_transition_duration},
{.name = "obs_frontend_set_transition_duration",
.function = set_transition_duration},
{.name = "obs_frontend_get_scene_collections",
.function = get_scene_collections},
{.name = "obs_frontend_get_current_scene_collection",
.function = get_current_scene_collection},
{.name = "obs_frontend_set_current_scene_collection",
.function = set_current_scene_collection},
{.name = "obs_frontend_get_current_transition", .function = get_current_transition},
{.name = "obs_frontend_set_current_transition", .function = set_current_transition},
{.name = "obs_frontend_get_transition_duration", .function = get_transition_duration},
{.name = "obs_frontend_set_transition_duration", .function = set_transition_duration},
{.name = "obs_frontend_get_scene_collections", .function = get_scene_collections},
{.name = "obs_frontend_get_current_scene_collection", .function = get_current_scene_collection},
{.name = "obs_frontend_set_current_scene_collection", .function = set_current_scene_collection},
{.name = "obs_frontend_get_profiles", .function = get_profiles},
{.name = "obs_frontend_get_current_profile",
.function = get_current_profile},
{.name = "obs_frontend_set_current_profile",
.function = set_current_profile},
{.name = "obs_frontend_remove_event_callback",
.function = remove_event_callback},
{.name = "obs_frontend_add_event_callback",
.function = add_event_callback},
{.name = "obs_frontend_remove_save_callback",
.function = remove_save_callback},
{.name = "obs_frontend_add_save_callback",
.function = add_save_callback},
{.name = "obs_frontend_get_current_profile", .function = get_current_profile},
{.name = "obs_frontend_set_current_profile", .function = set_current_profile},
{.name = "obs_frontend_remove_event_callback", .function = remove_event_callback},
{.name = "obs_frontend_add_event_callback", .function = add_event_callback},
{.name = "obs_frontend_remove_save_callback", .function = remove_save_callback},
{.name = "obs_frontend_add_save_callback", .function = add_save_callback},
};
void add_lua_frontend_funcs(lua_State *script)
+22 -41
View File
@@ -22,8 +22,7 @@
/* ========================================================================= */
static inline const char *get_table_string_(lua_State *script, int idx,
const char *name, const char *func)
static inline const char *get_table_string_(lua_State *script, int idx, const char *name, const char *func)
{
const char *str = "";
@@ -38,8 +37,7 @@ static inline const char *get_table_string_(lua_State *script, int idx,
return str;
}
static inline int get_table_int_(lua_State *script, int idx, const char *name,
const char *func)
static inline int get_table_int_(lua_State *script, int idx, const char *name, const char *func)
{
int val = 0;
@@ -53,8 +51,7 @@ static inline int get_table_int_(lua_State *script, int idx, const char *name,
return val;
}
static inline void get_callback_from_table_(lua_State *script, int idx,
const char *name, int *p_reg_idx,
static inline void get_callback_from_table_(lua_State *script, int idx, const char *name, int *p_reg_idx,
const char *func)
{
*p_reg_idx = LUA_REFNIL;
@@ -71,21 +68,17 @@ static inline void get_callback_from_table_(lua_State *script, int idx,
}
}
#define get_table_string(script, idx, name) \
get_table_string_(script, idx, name, __FUNCTION__)
#define get_table_int(script, idx, name) \
get_table_int_(script, idx, name, __FUNCTION__)
#define get_table_string(script, idx, name) get_table_string_(script, idx, name, __FUNCTION__)
#define get_table_int(script, idx, name) get_table_int_(script, idx, name, __FUNCTION__)
#define get_callback_from_table(script, idx, name, p_reg_idx) \
get_callback_from_table_(script, idx, name, p_reg_idx, __FUNCTION__)
bool ls_get_libobs_obj_(lua_State *script, const char *type, int lua_idx,
void *libobs_out, const char *id, const char *func,
int line)
bool ls_get_libobs_obj_(lua_State *script, const char *type, int lua_idx, void *libobs_out, const char *id,
const char *func, int line)
{
swig_type_info *info = SWIG_TypeQuery(script, type);
if (info == NULL) {
warn("%s:%d: SWIG could not find type: %s%s%s", func, line,
id ? id : "", id ? "::" : "", type);
warn("%s:%d: SWIG could not find type: %s%s%s", func, line, id ? id : "", id ? "::" : "", type);
return false;
}
@@ -100,18 +93,15 @@ bool ls_get_libobs_obj_(lua_State *script, const char *type, int lua_idx,
return true;
}
#define ls_get_libobs_obj(type, lua_index, obs_obj) \
ls_get_libobs_obj_(ls->script, #type " *", lua_index, obs_obj, ls->id, \
__FUNCTION__, __LINE__)
#define ls_get_libobs_obj(type, lua_index, obs_obj) \
ls_get_libobs_obj_(ls->script, #type " *", lua_index, obs_obj, ls->id, __FUNCTION__, __LINE__)
bool ls_push_libobs_obj_(lua_State *script, const char *type, void *libobs_in,
bool ownership, const char *id, const char *func,
int line)
bool ls_push_libobs_obj_(lua_State *script, const char *type, void *libobs_in, bool ownership, const char *id,
const char *func, int line)
{
swig_type_info *info = SWIG_TypeQuery(script, type);
if (info == NULL) {
warn("%s:%d: SWIG could not find type: %s%s%s", func, line,
id ? id : "", id ? "::" : "", type);
warn("%s:%d: SWIG could not find type: %s%s%s", func, line, id ? id : "", id ? "::" : "", type);
return false;
}
@@ -119,9 +109,8 @@ bool ls_push_libobs_obj_(lua_State *script, const char *type, void *libobs_in,
return true;
}
#define ls_push_libobs_obj(type, obs_obj, ownership) \
ls_push_libobs_obj_(ls->script, #type " *", obs_obj, ownership, \
ls->id, __FUNCTION__, __LINE__)
#define ls_push_libobs_obj(type, obs_obj, ownership) \
ls_push_libobs_obj_(ls->script, #type " *", obs_obj, ownership, ls->id, __FUNCTION__, __LINE__)
/* ========================================================================= */
@@ -168,12 +157,9 @@ struct obs_lua_data {
struct obs_lua_data **p_prev_next;
};
#define call_func(name, args, rets) \
call_func_(ls->script, ls->func_##name, args, rets, #name, \
ls->display_name)
#define call_func(name, args, rets) call_func_(ls->script, ls->func_##name, args, rets, #name, ls->display_name)
#define have_func(name) (ls->func_##name != LUA_REFNIL)
#define ls_push_data() \
lua_rawgeti(ls->script, LUA_REGISTRYINDEX, ld->lua_data_ref)
#define ls_push_data() lua_rawgeti(ls->script, LUA_REGISTRYINDEX, ld->lua_data_ref)
#define ls_pop(count) lua_pop(ls->script, count)
#define lock_script() \
struct obs_lua_script *__data = ls->data; \
@@ -609,8 +595,7 @@ static int obs_lua_register_source(lua_State *script)
lua_pop(script, 1);
}
if (!v->display_name || !*v->display_name || !*info.id ||
!info.output_flags)
if (!v->display_name || !*v->display_name || !*info.id || !info.output_flags)
goto fail;
#define get_callback(val) \
@@ -635,8 +620,7 @@ static int obs_lua_register_source(lua_State *script)
get_callback(load);
#undef get_callback
get_callback_from_table(script, -1, "get_defaults",
&v->func_get_defaults);
get_callback_from_table(script, -1, "get_defaults", &v->func_get_defaults);
if (!existing) {
ls.data = current_lua_script;
@@ -671,15 +655,13 @@ static int obs_lua_register_source(lua_State *script)
if (have_func(create)) {
obs_source_t *source = ld->source;
obs_data_t *settings =
obs_source_get_settings(source);
obs_data_t *settings = obs_source_get_settings(source);
ls_push_libobs_obj(obs_data_t, settings, false);
ls_push_libobs_obj(obs_source_t, source, false);
call_func(create, 2, 1);
ld->lua_data_ref =
luaL_ref(ls->script, LUA_REGISTRYINDEX);
ld->lua_data_ref = luaL_ref(ls->script, LUA_REGISTRYINDEX);
obs_data_release(settings);
}
@@ -707,8 +689,7 @@ void add_lua_source_functions(lua_State *script)
lua_pop(script, 1);
}
static inline void undef_source_type(struct obs_lua_script *data,
struct obs_lua_source *ls)
static inline void undef_source_type(struct obs_lua_script *data, struct obs_lua_source *ls)
{
pthread_mutex_lock(&ls->definition_mutex);
pthread_mutex_lock(&data->mutex);
+38 -74
View File
@@ -60,14 +60,11 @@ static struct obs_lua_script *first_tick_script = NULL;
pthread_mutex_t lua_source_def_mutex;
#define ls_get_libobs_obj(type, lua_index, obs_obj) \
ls_get_libobs_obj_(script, #type " *", lua_index, obs_obj, NULL, \
__FUNCTION__, __LINE__)
#define ls_push_libobs_obj(type, obs_obj, ownership) \
ls_push_libobs_obj_(script, #type " *", obs_obj, ownership, NULL, \
__FUNCTION__, __LINE__)
#define call_func(name, args, rets) \
call_func_(script, cb->reg_idx, args, rets, #name, __FUNCTION__)
#define ls_get_libobs_obj(type, lua_index, obs_obj) \
ls_get_libobs_obj_(script, #type " *", lua_index, obs_obj, NULL, __FUNCTION__, __LINE__)
#define ls_push_libobs_obj(type, obs_obj, ownership) \
ls_push_libobs_obj_(script, #type " *", obs_obj, ownership, NULL, __FUNCTION__, __LINE__)
#define call_func(name, args, rets) call_func_(script, cb->reg_idx, args, rets, #name, __FUNCTION__)
/* ========================================================================= */
@@ -98,8 +95,7 @@ static bool load_lua_script(struct obs_lua_script *data)
luaopen_ffi(script);
if (luaL_dostring(script, startup_script) != 0) {
script_warn(&data->base, "Error executing startup script 1: %s",
lua_tostring(script, -1));
script_warn(&data->base, "Error executing startup script 1: %s", lua_tostring(script, -1));
goto fail;
}
@@ -108,8 +104,7 @@ static bool load_lua_script(struct obs_lua_script *data)
dstr_free(&str);
if (ret != 0) {
script_warn(&data->base, "Error executing startup script 2: %s",
lua_tostring(script, -1));
script_warn(&data->base, "Error executing startup script 2: %s", lua_tostring(script, -1));
goto fail;
}
@@ -123,23 +118,19 @@ static bool load_lua_script(struct obs_lua_script *data)
file_data = os_quick_read_utf8_file(data->base.path.array);
if (!file_data) {
script_warn(&data->base, "Error opening file: %s",
lua_tostring(script, -1));
script_warn(&data->base, "Error opening file: %s", lua_tostring(script, -1));
goto fail;
}
if (luaL_loadbuffer(script, file_data, strlen(file_data),
data->base.path.array) != 0) {
script_warn(&data->base, "Error loading file: %s",
lua_tostring(script, -1));
if (luaL_loadbuffer(script, file_data, strlen(file_data), data->base.path.array) != 0) {
script_warn(&data->base, "Error loading file: %s", lua_tostring(script, -1));
bfree(file_data);
goto fail;
}
bfree(file_data);
if (lua_pcall(script, 0, LUA_MULTRET, 0) != 0) {
script_warn(&data->base, "Error running file: %s",
lua_tostring(script, -1));
script_warn(&data->base, "Error running file: %s", lua_tostring(script, -1));
goto fail;
}
@@ -279,8 +270,7 @@ static inline void lua_obs_timer_remove(struct lua_obs_timer *timer)
*timer->p_prev_next = timer->next;
}
static inline struct lua_obs_callback *
lua_obs_timer_cb(struct lua_obs_timer *timer)
static inline struct lua_obs_callback *lua_obs_timer_cb(struct lua_obs_timer *timer)
{
return &((struct lua_obs_callback *)timer)[-1];
}
@@ -323,8 +313,7 @@ static int timer_add(lua_State *script)
if (!ms)
return 0;
struct lua_obs_callback *cb = add_lua_obs_callback_extra(
script, 1, sizeof(struct lua_obs_timer));
struct lua_obs_callback *cb = add_lua_obs_callback_extra(script, 1, sizeof(struct lua_obs_timer));
struct lua_obs_timer *timer = lua_obs_callback_extra_data(cb);
timer->interval = (uint64_t)ms * 1000000ULL;
@@ -342,8 +331,7 @@ static void obs_lua_main_render_callback(void *priv, uint32_t cx, uint32_t cy)
lua_State *script = cb->script;
if (script_callback_removed(&cb->base)) {
obs_remove_main_render_callback(obs_lua_main_render_callback,
cb);
obs_remove_main_render_callback(obs_lua_main_render_callback, cb);
return;
}
@@ -463,13 +451,10 @@ static int obs_lua_signal_handler_disconnect(lua_State *script)
struct lua_obs_callback *cb = find_lua_obs_callback(script, 3);
while (cb) {
signal_handler_t *cb_handler =
calldata_ptr(&cb->base.extra, "handler");
const char *cb_signal =
calldata_string(&cb->base.extra, "signal");
signal_handler_t *cb_handler = calldata_ptr(&cb->base.extra, "handler");
const char *cb_signal = calldata_string(&cb->base.extra, "signal");
if (cb_signal && strcmp(signal, cb_signal) == 0 &&
handler == cb_handler)
if (cb_signal && strcmp(signal, cb_signal) == 0 && handler == cb_handler)
break;
cb = find_next_lua_obs_callback(script, cb, 3);
@@ -511,8 +496,7 @@ static int obs_lua_signal_handler_connect(lua_State *script)
/* -------------------------------------------- */
static void calldata_signal_callback_global(void *priv, const char *signal,
calldata_t *cd)
static void calldata_signal_callback_global(void *priv, const char *signal, calldata_t *cd)
{
struct lua_obs_callback *cb = priv;
lua_State *script = cb->script;
@@ -542,8 +526,7 @@ static int obs_lua_signal_handler_disconnect_global(lua_State *script)
struct lua_obs_callback *cb = find_lua_obs_callback(script, 3);
while (cb) {
signal_handler_t *cb_handler =
calldata_ptr(&cb->base.extra, "handler");
signal_handler_t *cb_handler = calldata_ptr(&cb->base.extra, "handler");
if (handler == cb_handler)
break;
@@ -561,8 +544,7 @@ static void defer_connect_global(void *p_cb)
struct script_callback *cb = p_cb;
signal_handler_t *handler = calldata_ptr(&cb->extra, "handler");
signal_handler_connect_global(handler, calldata_signal_callback_global,
cb);
signal_handler_connect_global(handler, calldata_signal_callback_global, cb);
}
static int obs_lua_signal_handler_connect_global(lua_State *script)
@@ -603,8 +585,7 @@ static int enum_sources(lua_State *script)
/* -------------------------------------------- */
static void source_enum_filters_proc(obs_source_t *source, obs_source_t *filter,
void *param)
static void source_enum_filters_proc(obs_source_t *source, obs_source_t *filter, void *param)
{
UNUSED_PARAMETER(source);
@@ -630,8 +611,7 @@ static int source_enum_filters(lua_State *script)
/* -------------------------------------------- */
static bool enum_items_proc(obs_scene_t *scene, obs_sceneitem_t *item,
void *param)
static bool enum_items_proc(obs_scene_t *scene, obs_sceneitem_t *item, void *param)
{
lua_State *script = param;
@@ -707,8 +687,7 @@ static void defer_hotkey_unpressed(void *p_cb)
hotkey_pressed(p_cb, false);
}
static void hotkey_callback(void *p_cb, obs_hotkey_id id, obs_hotkey_t *hotkey,
bool pressed)
static void hotkey_callback(void *p_cb, obs_hotkey_id id, obs_hotkey_t *hotkey, bool pressed)
{
struct lua_obs_callback *cb = p_cb;
@@ -761,8 +740,7 @@ static int hotkey_register_frontend(lua_State *script)
/* -------------------------------------------- */
static bool button_prop_clicked(obs_properties_t *props, obs_property_t *p,
void *p_cb)
static bool button_prop_clicked(obs_properties_t *props, obs_property_t *p, void *p_cb)
{
struct lua_obs_callback *cb = p_cb;
lua_State *script = cb->script;
@@ -807,8 +785,7 @@ static int properties_add_button(lua_State *script)
return 0;
struct lua_obs_callback *cb = add_lua_obs_callback(script, 4);
p = obs_properties_add_button2(props, name, text, button_prop_clicked,
cb);
p = obs_properties_add_button2(props, name, text, button_prop_clicked, cb);
if (!p || !ls_push_libobs_obj(obs_property_t, p, false))
return 0;
@@ -817,8 +794,7 @@ static int properties_add_button(lua_State *script)
/* -------------------------------------------- */
static bool modified_callback(void *p_cb, obs_properties_t *props,
obs_property_t *p, obs_data_t *settings)
static bool modified_callback(void *p_cb, obs_properties_t *props, obs_property_t *p, obs_data_t *settings)
{
struct lua_obs_callback *cb = p_cb;
lua_State *script = cb->script;
@@ -1040,24 +1016,18 @@ static void add_hook_functions(lua_State *script)
add_func("sceneitem_list_release", sceneitem_list_release);
add_func("calldata_source", calldata_source);
add_func("calldata_sceneitem", calldata_sceneitem);
add_func("obs_add_main_render_callback",
obs_lua_add_main_render_callback);
add_func("obs_remove_main_render_callback",
obs_lua_remove_main_render_callback);
add_func("obs_add_main_render_callback", obs_lua_add_main_render_callback);
add_func("obs_remove_main_render_callback", obs_lua_remove_main_render_callback);
add_func("obs_add_tick_callback", obs_lua_add_tick_callback);
add_func("obs_remove_tick_callback", obs_lua_remove_tick_callback);
add_func("signal_handler_connect", obs_lua_signal_handler_connect);
add_func("signal_handler_disconnect",
obs_lua_signal_handler_disconnect);
add_func("signal_handler_connect_global",
obs_lua_signal_handler_connect_global);
add_func("signal_handler_disconnect_global",
obs_lua_signal_handler_disconnect_global);
add_func("signal_handler_disconnect", obs_lua_signal_handler_disconnect);
add_func("signal_handler_connect_global", obs_lua_signal_handler_connect_global);
add_func("signal_handler_disconnect_global", obs_lua_signal_handler_disconnect_global);
add_func("obs_hotkey_unregister", hotkey_unregister);
add_func("obs_hotkey_register_frontend", hotkey_register_frontend);
add_func("obs_properties_add_button", properties_add_button);
add_func("obs_property_set_modified_callback",
property_set_modified_callback);
add_func("obs_property_set_modified_callback", property_set_modified_callback);
add_func("remove_current_callback", remove_current_callback);
lua_pop(script, 1);
@@ -1130,8 +1100,7 @@ bool obs_lua_script_load(obs_script_t *s)
if (!data->base.loaded) {
data->base.loaded = load_lua_script(data);
if (data->base.loaded) {
blog(LOG_INFO, "[obs-scripting]: Loaded lua script: %s",
data->base.file.array);
blog(LOG_INFO, "[obs-scripting]: Loaded lua script: %s", data->base.file.array);
obs_lua_script_update(s, NULL);
}
}
@@ -1193,8 +1162,7 @@ void obs_lua_script_unload(obs_script_t *s)
* processor or operating system is going to schedule things. a more
* ideal method would be to reference count the script objects and
* atomically share ownership with callbacks when they're called. */
struct lua_obs_callback *cb =
(struct lua_obs_callback *)data->first_callback;
struct lua_obs_callback *cb = (struct lua_obs_callback *)data->first_callback;
while (cb) {
os_atomic_set_bool(&cb->base.removed, true);
cb = (struct lua_obs_callback *)cb->base.next;
@@ -1240,8 +1208,7 @@ void obs_lua_script_unload(obs_script_t *s)
cb = (struct lua_obs_callback *)data->first_callback;
while (cb) {
struct lua_obs_callback *next =
(struct lua_obs_callback *)cb->base.next;
struct lua_obs_callback *next = (struct lua_obs_callback *)cb->base.next;
remove_lua_obs_callback(cb);
cb = next;
}
@@ -1254,8 +1221,7 @@ void obs_lua_script_unload(obs_script_t *s)
lua_close(script);
s->loaded = false;
blog(LOG_INFO, "[obs-scripting]: Unloaded lua script: %s",
data->base.file.array);
blog(LOG_INFO, "[obs-scripting]: Unloaded lua script: %s", data->base.file.array);
}
void obs_lua_script_destroy(obs_script_t *s)
@@ -1311,8 +1277,7 @@ obs_properties_t *obs_lua_script_get_properties(obs_script_t *s)
current_lua_script = data;
pthread_mutex_lock(&data->mutex);
call_func_(script, data->get_properties, 0, 1, "script_properties",
__FUNCTION__);
call_func_(script, data->get_properties, 0, 1, "script_properties", __FUNCTION__);
ls_get_libobs_obj(obs_properties_t, -1, &props);
pthread_mutex_unlock(&data->mutex);
@@ -1386,8 +1351,7 @@ void obs_lua_load(void)
add_package_cpath(&package_cpath, import_path);
#if !defined(_WIN32) && !defined(__APPLE__)
char *relative_script_path =
os_get_executable_path_ptr("../" SCRIPT_DIR);
char *relative_script_path = os_get_executable_path_ptr("../" SCRIPT_DIR);
if (relative_script_path)
add_package_cpath(&package_cpath, relative_script_path);
bfree(relative_script_path);
+16 -29
View File
@@ -106,13 +106,11 @@ struct lua_obs_callback {
int reg_idx;
};
static inline struct lua_obs_callback *
add_lua_obs_callback_extra(lua_State *script, int stack_idx, size_t extra_size)
static inline struct lua_obs_callback *add_lua_obs_callback_extra(lua_State *script, int stack_idx, size_t extra_size)
{
struct obs_lua_script *data = current_lua_script;
struct lua_obs_callback *cb =
add_script_callback(&data->first_callback, (obs_script_t *)data,
sizeof(*cb) + extra_size);
add_script_callback(&data->first_callback, (obs_script_t *)data, sizeof(*cb) + extra_size);
lua_pushvalue(script, stack_idx);
cb->reg_idx = luaL_ref(script, LUA_REGISTRYINDEX);
@@ -120,8 +118,7 @@ add_lua_obs_callback_extra(lua_State *script, int stack_idx, size_t extra_size)
return cb;
}
static inline struct lua_obs_callback *add_lua_obs_callback(lua_State *script,
int stack_idx)
static inline struct lua_obs_callback *add_lua_obs_callback(lua_State *script, int stack_idx)
{
return add_lua_obs_callback_extra(script, stack_idx, 0);
}
@@ -131,20 +128,17 @@ static inline void *lua_obs_callback_extra_data(struct lua_obs_callback *cb)
return (void *)&cb[1];
}
static inline struct obs_lua_script *
lua_obs_callback_script(struct lua_obs_callback *cb)
static inline struct obs_lua_script *lua_obs_callback_script(struct lua_obs_callback *cb)
{
return (struct obs_lua_script *)cb->base.script;
}
static inline struct lua_obs_callback *
find_next_lua_obs_callback(lua_State *script, struct lua_obs_callback *cb,
int stack_idx)
static inline struct lua_obs_callback *find_next_lua_obs_callback(lua_State *script, struct lua_obs_callback *cb,
int stack_idx)
{
struct obs_lua_script *data = current_lua_script;
cb = cb ? (struct lua_obs_callback *)cb->base.next
: (struct lua_obs_callback *)data->first_callback;
cb = cb ? (struct lua_obs_callback *)cb->base.next : (struct lua_obs_callback *)data->first_callback;
while (cb) {
lua_rawgeti(script, LUA_REGISTRYINDEX, cb->reg_idx);
@@ -160,8 +154,7 @@ find_next_lua_obs_callback(lua_State *script, struct lua_obs_callback *cb,
return cb;
}
static inline struct lua_obs_callback *find_lua_obs_callback(lua_State *script,
int stack_idx)
static inline struct lua_obs_callback *find_lua_obs_callback(lua_State *script, int stack_idx)
{
return find_next_lua_obs_callback(script, NULL, stack_idx);
}
@@ -201,8 +194,7 @@ static inline int is_function(lua_State *script, int idx)
typedef int (*param_cb)(lua_State *script, int idx);
static inline bool verify_args1_(lua_State *script, param_cb param1_check,
const char *func)
static inline bool verify_args1_(lua_State *script, param_cb param1_check, const char *func)
{
if (lua_gettop(script) != 1) {
warn("Wrong number of parameters for %s", func);
@@ -216,11 +208,9 @@ static inline bool verify_args1_(lua_State *script, param_cb param1_check,
return true;
}
#define verify_args1(script, param1_check) \
verify_args1_(script, param1_check, __FUNCTION__)
#define verify_args1(script, param1_check) verify_args1_(script, param1_check, __FUNCTION__)
static inline bool call_func_(lua_State *script, int reg_idx, int args,
int rets, const char *func,
static inline bool call_func_(lua_State *script, int reg_idx, int args, int rets, const char *func,
const char *display_name)
{
if (reg_idx == LUA_REFNIL)
@@ -232,8 +222,7 @@ static inline bool call_func_(lua_State *script, int reg_idx, int args,
lua_insert(script, -1 - args);
if (lua_pcall(script, args, rets, 0) != 0) {
script_warn(&data->base, "Failed to call %s for %s: %s", func,
display_name, lua_tostring(script, -1));
script_warn(&data->base, "Failed to call %s for %s: %s", func, display_name, lua_tostring(script, -1));
lua_pop(script, 1);
return false;
}
@@ -241,11 +230,9 @@ static inline bool call_func_(lua_State *script, int reg_idx, int args,
return true;
}
bool ls_get_libobs_obj_(lua_State *script, const char *type, int lua_idx,
void *libobs_out, const char *id, const char *func,
int line);
bool ls_push_libobs_obj_(lua_State *script, const char *type, void *libobs_in,
bool ownership, const char *id, const char *func,
int line);
bool ls_get_libobs_obj_(lua_State *script, const char *type, int lua_idx, void *libobs_out, const char *id,
const char *func, int line);
bool ls_push_libobs_obj_(lua_State *script, const char *type, void *libobs_in, bool ownership, const char *id,
const char *func, int line);
extern void add_lua_source_functions(lua_State *script);
@@ -20,11 +20,9 @@
#include "obs-scripting-python.h"
#define libobs_to_py(type, obs_obj, ownership, py_obj) \
libobs_to_py_(#type " *", obs_obj, ownership, py_obj, NULL, __func__, \
__LINE__)
#define py_to_libobs(type, py_obj, libobs_out) \
py_to_libobs_(#type " *", py_obj, libobs_out, NULL, __func__, __LINE__)
#define libobs_to_py(type, obs_obj, ownership, py_obj) \
libobs_to_py_(#type " *", obs_obj, ownership, py_obj, NULL, __func__, __LINE__)
#define py_to_libobs(type, py_obj, libobs_out) py_to_libobs_(#type " *", py_obj, libobs_out, NULL, __func__, __LINE__)
/* ----------------------------------- */
@@ -275,8 +273,7 @@ static PyObject *set_current_profile(PyObject *self, PyObject *args)
/* ----------------------------------- */
static void frontend_save_callback(obs_data_t *save_data, bool saving,
void *priv)
static void frontend_save_callback(obs_data_t *save_data, bool saving, void *priv)
{
struct python_obs_callback *cb = priv;
@@ -290,8 +287,7 @@ static void frontend_save_callback(obs_data_t *save_data, bool saving,
PyObject *py_save_data;
if (libobs_to_py(obs_data_t, save_data, false, &py_save_data)) {
PyObject *args = Py_BuildValue("(ON)", py_save_data,
PyBool_FromLong(saving));
PyObject *args = Py_BuildValue("(ON)", py_save_data, PyBool_FromLong(saving));
struct python_obs_callback *last_cb = cur_python_cb;
cur_python_cb = cb;
@@ -323,8 +319,7 @@ static PyObject *remove_save_callback(PyObject *self, PyObject *args)
if (!py_cb || !PyFunction_Check(py_cb))
return python_none();
struct python_obs_callback *cb =
find_python_obs_callback(script, py_cb);
struct python_obs_callback *cb = find_python_obs_callback(script, py_cb);
if (cb)
remove_python_obs_callback(cb);
return python_none();
@@ -393,8 +388,7 @@ static PyObject *remove_event_callback(PyObject *self, PyObject *args)
if (!py_cb || !PyFunction_Check(py_cb))
return python_none();
struct python_obs_callback *cb =
find_python_obs_callback(script, py_cb);
struct python_obs_callback *cb = find_python_obs_callback(script, py_cb);
if (cb)
remove_python_obs_callback(cb);
return python_none();
@@ -51,8 +51,7 @@ bool import_python(const char *python_path, python_version_t *python_version)
python_path = "";
if (!python_version) {
blog(LOG_DEBUG,
"[Python] Invalid python_version pointer provided.");
blog(LOG_DEBUG, "[Python] Invalid python_version pointer provided.");
goto fail;
}
@@ -68,8 +67,7 @@ bool import_python(const char *python_path, python_version_t *python_version)
char cur_version[5];
char next_version[5];
snprintf(cur_version, sizeof(cur_version), VERSION_PATTERN,
PY_MAJOR_VERSION_MAX, PY_MINOR_VERSION_MAX);
snprintf(cur_version, sizeof(cur_version), VERSION_PATTERN, PY_MAJOR_VERSION_MAX, PY_MINOR_VERSION_MAX);
struct dstr temp;
dstr_init(&temp);
@@ -77,8 +75,7 @@ bool import_python(const char *python_path, python_version_t *python_version)
int minor_version = PY_MINOR_VERSION_MAX;
do {
dstr_printf(&lib_candidate_path, "%s%s", lib_path.array,
temp.array);
dstr_printf(&lib_candidate_path, "%s%s", lib_path.array, temp.array);
if (access(lib_candidate_path.array, F_OK) == 0) {
lib = os_dlopen(lib_candidate_path.array);
}
@@ -87,10 +84,8 @@ bool import_python(const char *python_path, python_version_t *python_version)
break;
}
snprintf(cur_version, sizeof(cur_version), VERSION_PATTERN,
PY_MAJOR_VERSION_MAX, minor_version);
snprintf(next_version, sizeof(next_version), VERSION_PATTERN,
PY_MAJOR_VERSION_MAX, --minor_version);
snprintf(cur_version, sizeof(cur_version), VERSION_PATTERN, PY_MAJOR_VERSION_MAX, minor_version);
snprintf(next_version, sizeof(next_version), VERSION_PATTERN, PY_MAJOR_VERSION_MAX, --minor_version);
dstr_replace(&temp, cur_version, next_version);
} while (minor_version > 5);
@@ -98,22 +93,20 @@ bool import_python(const char *python_path, python_version_t *python_version)
dstr_free(&lib_candidate_path);
if (!lib) {
blog(LOG_WARNING, "[Python] Could not load library: %s",
lib_path.array);
blog(LOG_WARNING, "[Python] Could not load library: %s", lib_path.array);
goto fail;
}
python_version->major = PY_MAJOR_VERSION_MAX;
python_version->minor = minor_version;
#define IMPORT_FUNC(x) \
do { \
Import_##x = os_dlsym(lib, #x); \
if (!Import_##x) { \
blog(LOG_WARNING, "[Python] Failed to import: %s", \
#x); \
goto fail; \
} \
#define IMPORT_FUNC(x) \
do { \
Import_##x = os_dlsym(lib, #x); \
if (!Import_##x) { \
blog(LOG_WARNING, "[Python] Failed to import: %s", #x); \
goto fail; \
} \
} while (false)
IMPORT_FUNC(PyType_Ready);
@@ -71,17 +71,14 @@ PY_EXTERN PyObject *(*Import_PyLong_FromLong)(long);
PY_EXTERN PyObject *(*Import_PyBool_FromLong)(long);
PY_EXTERN PyGILState_STATE (*Import_PyGILState_Ensure)(void);
PY_EXTERN PyThreadState *(*Import_PyGILState_GetThisThreadState)(void);
PY_EXTERN void (*Import_PyErr_SetString)(PyObject *exception,
const char *string);
PY_EXTERN void (*Import_PyErr_SetString)(PyObject *exception, const char *string);
PY_EXTERN PyObject *(*Import_PyErr_Occurred)(void);
PY_EXTERN void (*Import_PyErr_Fetch)(PyObject **, PyObject **, PyObject **);
PY_EXTERN void (*Import_PyErr_Restore)(PyObject *, PyObject *, PyObject *);
PY_EXTERN void (*Import_PyErr_WriteUnraisable)(PyObject *);
PY_EXTERN int (*Import_PyArg_UnpackTuple)(PyObject *, const char *, Py_ssize_t,
Py_ssize_t, ...);
PY_EXTERN int (*Import_PyArg_UnpackTuple)(PyObject *, const char *, Py_ssize_t, Py_ssize_t, ...);
PY_EXTERN PyObject *(*Import_Py_BuildValue)(const char *, ...);
PY_EXTERN int (*Import_PyRun_SimpleStringFlags)(const char *,
PyCompilerFlags *);
PY_EXTERN int (*Import_PyRun_SimpleStringFlags)(const char *, PyCompilerFlags *);
PY_EXTERN void (*Import_PyErr_Print)(void);
PY_EXTERN void (*Import_Py_SetPythonHome)(wchar_t *);
PY_EXTERN void (*Import_Py_Initialize)(void);
@@ -92,31 +89,23 @@ PY_EXTERN int (*Import_PyEval_ThreadsInitialized)(void);
PY_EXTERN void (*Import_PyEval_ReleaseThread)(PyThreadState *tstate);
PY_EXTERN void (*Import_PySys_SetArgv)(int, wchar_t **);
PY_EXTERN PyObject *(*Import_PyImport_ImportModule)(const char *name);
PY_EXTERN PyObject *(*Import_PyObject_CallFunctionObjArgs)(PyObject *callable,
...);
PY_EXTERN PyObject *(*Import_PyObject_CallFunctionObjArgs)(PyObject *callable, ...);
PY_EXTERN PyObject(*Import__Py_NotImplementedStruct);
PY_EXTERN PyObject *(*Import_PyExc_TypeError);
PY_EXTERN PyObject *(*Import_PyExc_RuntimeError);
PY_EXTERN PyObject *(*Import_PyObject_GetAttr)(PyObject *, PyObject *);
PY_EXTERN PyObject *(*Import_PyUnicode_FromString)(const char *u);
PY_EXTERN PyObject *(*Import_PyDict_New)(void);
PY_EXTERN PyObject *(*Import_PyDict_GetItemString)(PyObject *dp,
const char *key);
PY_EXTERN int (*Import_PyDict_SetItemString)(PyObject *dp, const char *key,
PyObject *item);
PY_EXTERN PyObject *(*Import_PyCFunction_NewEx)(PyMethodDef *, PyObject *,
PyObject *);
PY_EXTERN PyObject *(*Import_PyCMethod_New)(PyMethodDef *, PyObject *,
PyObject *, PyTypeObject *);
PY_EXTERN PyObject *(*Import_PyDict_GetItemString)(PyObject *dp, const char *key);
PY_EXTERN int (*Import_PyDict_SetItemString)(PyObject *dp, const char *key, PyObject *item);
PY_EXTERN PyObject *(*Import_PyCFunction_NewEx)(PyMethodDef *, PyObject *, PyObject *);
PY_EXTERN PyObject *(*Import_PyCMethod_New)(PyMethodDef *, PyObject *, PyObject *, PyTypeObject *);
PY_EXTERN PyObject *(*Import_PyModule_GetDict)(PyObject *);
PY_EXTERN PyObject *(*Import_PyModule_GetNameObject)(PyObject *);
PY_EXTERN int (*Import_PyModule_AddObject)(PyObject *, const char *,
PyObject *);
PY_EXTERN int (*Import_PyModule_AddStringConstant)(PyObject *, const char *,
const char *);
PY_EXTERN int (*Import_PyModule_AddObject)(PyObject *, const char *, PyObject *);
PY_EXTERN int (*Import_PyModule_AddStringConstant)(PyObject *, const char *, const char *);
PY_EXTERN PyObject *(*Import_PyImport_Import)(PyObject *name);
PY_EXTERN PyObject *(*Import_PyObject_CallObject)(PyObject *callable_object,
PyObject *args);
PY_EXTERN PyObject *(*Import_PyObject_CallObject)(PyObject *callable_object, PyObject *args);
PY_EXTERN struct _longobject(*Import__Py_FalseStruct);
PY_EXTERN struct _longobject(*Import__Py_TrueStruct);
PY_EXTERN void (*Import_PyGILState_Release)(PyGILState_STATE);
@@ -124,18 +113,15 @@ PY_EXTERN int (*Import_PyList_Append)(PyObject *, PyObject *);
PY_EXTERN PyObject *(*Import_PySys_GetObject)(const char *);
PY_EXTERN PyObject *(*Import_PyImport_ReloadModule)(PyObject *m);
PY_EXTERN PyObject *(*Import_PyObject_GetAttrString)(PyObject *, const char *);
PY_EXTERN PyObject *(*Import_PyCapsule_New)(void *pointer, const char *name,
PyCapsule_Destructor destructor);
PY_EXTERN void *(*Import_PyCapsule_GetPointer)(PyObject *capsule,
const char *name);
PY_EXTERN PyObject *(*Import_PyCapsule_New)(void *pointer, const char *name, PyCapsule_Destructor destructor);
PY_EXTERN void *(*Import_PyCapsule_GetPointer)(PyObject *capsule, const char *name);
PY_EXTERN int (*Import_PyArg_ParseTuple)(PyObject *, const char *, ...);
PY_EXTERN PyTypeObject(*Import_PyFunction_Type);
PY_EXTERN int (*Import_PyObject_SetAttr)(PyObject *, PyObject *, PyObject *);
PY_EXTERN PyObject *(*Import__PyObject_New)(PyTypeObject *);
PY_EXTERN void *(*Import_PyCapsule_Import)(const char *name, int no_block);
PY_EXTERN void (*Import_PyErr_Clear)(void);
PY_EXTERN PyObject *(*Import_PyObject_Call)(PyObject *callable_object,
PyObject *args, PyObject *kwargs);
PY_EXTERN PyObject *(*Import_PyObject_Call)(PyObject *callable_object, PyObject *args, PyObject *kwargs);
PY_EXTERN PyObject *(*Import_PyList_New)(Py_ssize_t size);
PY_EXTERN Py_ssize_t (*Import_PyList_Size)(PyObject *);
PY_EXTERN PyObject *(*Import_PyList_GetItem)(PyObject *, Py_ssize_t);
@@ -151,8 +137,7 @@ PY_EXTERN void (*Import__Py_Dealloc)(PyObject *obj);
PY_EXTERN PyTypeObject PyCFunction_Type;
extern bool import_python(const char *python_path,
python_version_t *python_version);
extern bool import_python(const char *python_path, python_version_t *python_version);
#ifndef NO_REDEFS
#define PyType_Ready Import_PyType_Ready
@@ -239,8 +224,7 @@ extern bool import_python(const char *python_path,
#endif
#if PY_VERSION_HEX >= 0x030800f0
static inline void Import__Py_DECREF(const char *filename, int lineno,
PyObject *op)
static inline void Import__Py_DECREF(const char *filename, int lineno, PyObject *op)
{
UNUSED_PARAMETER(filename);
UNUSED_PARAMETER(lineno);
@@ -271,8 +255,7 @@ static inline void Import__Py_XDECREF(PyObject *op)
#endif // PY_VERSION_HEX >= 0x030800f0
#if PY_VERSION_HEX >= 0x030900b0
static inline int Import_PyType_HasFeature(PyTypeObject *type,
unsigned long feature)
static inline int Import_PyType_HasFeature(PyTypeObject *type, unsigned long feature)
{
return ((PyType_GetFlags(type) & feature) != 0);
}
+63 -123
View File
@@ -64,13 +64,11 @@ struct python_obs_callback *cur_python_cb = NULL;
/* -------------------------------------------- */
bool py_to_libobs_(const char *type, PyObject *py_in, void *libobs_out,
const char *id, const char *func, int line)
bool py_to_libobs_(const char *type, PyObject *py_in, void *libobs_out, const char *id, const char *func, int line)
{
swig_type_info *info = SWIG_TypeQuery(type);
if (info == NULL) {
warn("%s:%d: SWIG could not find type: %s%s%s", func, line,
id ? id : "", id ? "::" : "", type);
warn("%s:%d: SWIG could not find type: %s%s%s", func, line, id ? id : "", id ? "::" : "", type);
return false;
}
@@ -85,14 +83,12 @@ bool py_to_libobs_(const char *type, PyObject *py_in, void *libobs_out,
return true;
}
bool libobs_to_py_(const char *type, void *libobs_in, bool ownership,
PyObject **py_out, const char *id, const char *func,
int line)
bool libobs_to_py_(const char *type, void *libobs_in, bool ownership, PyObject **py_out, const char *id,
const char *func, int line)
{
swig_type_info *info = SWIG_TypeQuery(type);
if (info == NULL) {
warn("%s:%d: SWIG could not find type: %s%s%s", func, line,
id ? id : "", id ? "::" : "", type);
warn("%s:%d: SWIG could not find type: %s%s%s", func, line, id ? id : "", id ? "::" : "", type);
return false;
}
@@ -107,11 +103,9 @@ bool libobs_to_py_(const char *type, void *libobs_in, bool ownership,
return true;
}
#define libobs_to_py(type, obs_obj, ownership, py_obj) \
libobs_to_py_(#type " *", obs_obj, ownership, py_obj, NULL, __func__, \
__LINE__)
#define py_to_libobs(type, py_obj, libobs_out) \
py_to_libobs_(#type " *", py_obj, libobs_out, NULL, __func__, __LINE__)
#define libobs_to_py(type, obs_obj, ownership, py_obj) \
libobs_to_py_(#type " *", obs_obj, ownership, py_obj, NULL, __func__, __LINE__)
#define py_to_libobs(type, py_obj, libobs_out) py_to_libobs_(#type " *", py_obj, libobs_out, NULL, __func__, __LINE__)
#define lock_callback(cb) \
lock_python(); \
@@ -201,8 +195,7 @@ static bool load_python_script(struct obs_python_script *data)
if (py_error() || ret != 0)
goto fail;
ret = PyModule_AddStringConstant(py_module, "__script_dir__",
data->dir.array);
ret = PyModule_AddStringConstant(py_module, "__script_dir__", data->dir.array);
if (py_error() || ret != 0)
goto fail;
@@ -211,10 +204,9 @@ static bool load_python_script(struct obs_python_script *data)
if (py_error() || ret != 0)
goto fail;
static PyMethodDef global_funcs[] = {
{"script_path", py_get_current_script_path, METH_NOARGS,
"Gets the script path"},
{0}};
static PyMethodDef global_funcs[] = {{"script_path", py_get_current_script_path, METH_NOARGS,
"Gets the script path"},
{0}};
add_functions_to_py_module(py_module, global_funcs);
@@ -226,8 +218,7 @@ static bool load_python_script(struct obs_python_script *data)
if (!data->save)
PyErr_Clear();
data->get_properties =
PyObject_GetAttrString(py_module, "script_properties");
data->get_properties = PyObject_GetAttrString(py_module, "script_properties");
if (!data->get_properties)
PyErr_Clear();
@@ -404,8 +395,7 @@ static inline void python_obs_timer_remove(struct python_obs_timer *timer)
*timer->p_prev_next = timer->next;
}
static inline struct python_obs_callback *
python_obs_timer_cb(struct python_obs_timer *timer)
static inline struct python_obs_callback *python_obs_timer_cb(struct python_obs_timer *timer)
{
return &((struct python_obs_callback *)timer)[-1];
}
@@ -420,8 +410,7 @@ static PyObject *timer_remove(PyObject *self, PyObject *args)
if (!parse_args(args, "O", &py_cb))
return python_none();
struct python_obs_callback *cb =
find_python_obs_callback(script, py_cb);
struct python_obs_callback *cb = find_python_obs_callback(script, py_cb);
if (cb)
remove_python_obs_callback(cb);
return python_none();
@@ -459,8 +448,7 @@ static PyObject *timer_add(PyObject *self, PyObject *args)
if (!parse_args(args, "Oi", &py_cb, &ms))
return python_none();
struct python_obs_callback *cb = add_python_obs_callback_extra(
script, py_cb, sizeof(struct python_obs_timer));
struct python_obs_callback *cb = add_python_obs_callback_extra(script, py_cb, sizeof(struct python_obs_timer));
struct python_obs_timer *timer = python_obs_callback_extra_data(cb);
timer->interval = (uint64_t)ms * 1000000ULL;
@@ -498,8 +486,7 @@ static PyObject *obs_python_remove_tick_callback(PyObject *self, PyObject *args)
PyObject *py_cb = NULL;
if (!script) {
PyErr_SetString(PyExc_RuntimeError,
"No active script, report this to Lain");
PyErr_SetString(PyExc_RuntimeError, "No active script, report this to Lain");
return NULL;
}
@@ -510,8 +497,7 @@ static PyObject *obs_python_remove_tick_callback(PyObject *self, PyObject *args)
if (!py_cb || !PyFunction_Check(py_cb))
return python_none();
struct python_obs_callback *cb =
find_python_obs_callback(script, py_cb);
struct python_obs_callback *cb = find_python_obs_callback(script, py_cb);
if (cb)
remove_python_obs_callback(cb);
return python_none();
@@ -523,8 +509,7 @@ static PyObject *obs_python_add_tick_callback(PyObject *self, PyObject *args)
PyObject *py_cb = NULL;
if (!script) {
PyErr_SetString(PyExc_RuntimeError,
"No active script, report this to Lain");
PyErr_SetString(PyExc_RuntimeError, "No active script, report this to Lain");
return NULL;
}
@@ -567,8 +552,7 @@ static void calldata_signal_callback(void *priv, calldata_t *cd)
unlock_callback();
}
static PyObject *obs_python_signal_handler_disconnect(PyObject *self,
PyObject *args)
static PyObject *obs_python_signal_handler_disconnect(PyObject *self, PyObject *args)
{
struct obs_python_script *script = cur_python_script;
PyObject *py_sh = NULL;
@@ -576,8 +560,7 @@ static PyObject *obs_python_signal_handler_disconnect(PyObject *self,
const char *signal;
if (!script) {
PyErr_SetString(PyExc_RuntimeError,
"No active script, report this to Lain");
PyErr_SetString(PyExc_RuntimeError, "No active script, report this to Lain");
return NULL;
}
@@ -593,16 +576,12 @@ static PyObject *obs_python_signal_handler_disconnect(PyObject *self,
if (!py_cb || !PyFunction_Check(py_cb))
return python_none();
struct python_obs_callback *cb =
find_python_obs_callback(script, py_cb);
struct python_obs_callback *cb = find_python_obs_callback(script, py_cb);
while (cb) {
signal_handler_t *cb_handler =
calldata_ptr(&cb->base.extra, "handler");
const char *cb_signal =
calldata_string(&cb->base.extra, "signal");
signal_handler_t *cb_handler = calldata_ptr(&cb->base.extra, "handler");
const char *cb_signal = calldata_string(&cb->base.extra, "signal");
if (cb_signal && strcmp(signal, cb_signal) == 0 &&
handler == cb_handler)
if (cb_signal && strcmp(signal, cb_signal) == 0 && handler == cb_handler)
break;
cb = find_next_python_obs_callback(script, cb, py_cb);
@@ -613,8 +592,7 @@ static PyObject *obs_python_signal_handler_disconnect(PyObject *self,
return python_none();
}
static PyObject *obs_python_signal_handler_connect(PyObject *self,
PyObject *args)
static PyObject *obs_python_signal_handler_connect(PyObject *self, PyObject *args)
{
struct obs_python_script *script = cur_python_script;
PyObject *py_sh = NULL;
@@ -622,8 +600,7 @@ static PyObject *obs_python_signal_handler_connect(PyObject *self,
const char *signal;
if (!script) {
PyErr_SetString(PyExc_RuntimeError,
"No active script, report this to Lain");
PyErr_SetString(PyExc_RuntimeError, "No active script, report this to Lain");
return NULL;
}
@@ -647,8 +624,7 @@ static PyObject *obs_python_signal_handler_connect(PyObject *self,
/* -------------------------------------------- */
static void calldata_signal_callback_global(void *priv, const char *signal,
calldata_t *cd)
static void calldata_signal_callback_global(void *priv, const char *signal, calldata_t *cd)
{
struct python_obs_callback *cb = priv;
@@ -673,16 +649,14 @@ static void calldata_signal_callback_global(void *priv, const char *signal,
unlock_callback();
}
static PyObject *obs_python_signal_handler_disconnect_global(PyObject *self,
PyObject *args)
static PyObject *obs_python_signal_handler_disconnect_global(PyObject *self, PyObject *args)
{
struct obs_python_script *script = cur_python_script;
PyObject *py_sh = NULL;
PyObject *py_cb = NULL;
if (!script) {
PyErr_SetString(PyExc_RuntimeError,
"No active script, report this to Lain");
PyErr_SetString(PyExc_RuntimeError, "No active script, report this to Lain");
return NULL;
}
@@ -698,11 +672,9 @@ static PyObject *obs_python_signal_handler_disconnect_global(PyObject *self,
if (!py_cb || !PyFunction_Check(py_cb))
return python_none();
struct python_obs_callback *cb =
find_python_obs_callback(script, py_cb);
struct python_obs_callback *cb = find_python_obs_callback(script, py_cb);
while (cb) {
signal_handler_t *cb_handler =
calldata_ptr(&cb->base.extra, "handler");
signal_handler_t *cb_handler = calldata_ptr(&cb->base.extra, "handler");
if (handler == cb_handler)
break;
@@ -715,16 +687,14 @@ static PyObject *obs_python_signal_handler_disconnect_global(PyObject *self,
return python_none();
}
static PyObject *obs_python_signal_handler_connect_global(PyObject *self,
PyObject *args)
static PyObject *obs_python_signal_handler_connect_global(PyObject *self, PyObject *args)
{
struct obs_python_script *script = cur_python_script;
PyObject *py_sh = NULL;
PyObject *py_cb = NULL;
if (!script) {
PyErr_SetString(PyExc_RuntimeError,
"No active script, report this to Lain");
PyErr_SetString(PyExc_RuntimeError, "No active script, report this to Lain");
return NULL;
}
@@ -742,8 +712,7 @@ static PyObject *obs_python_signal_handler_connect_global(PyObject *self,
struct python_obs_callback *cb = add_python_obs_callback(script, py_cb);
calldata_set_ptr(&cb->base.extra, "handler", handler);
signal_handler_connect_global(handler, calldata_signal_callback_global,
cb);
signal_handler_connect_global(handler, calldata_signal_callback_global, cb);
return python_none();
}
@@ -798,8 +767,7 @@ static inline PyObject *py_invalid_hotkey_id()
return PyLong_FromUnsignedLongLong(OBS_INVALID_HOTKEY_ID);
}
static void hotkey_callback(void *p_cb, obs_hotkey_id id, obs_hotkey_t *hotkey,
bool pressed)
static void hotkey_callback(void *p_cb, obs_hotkey_id id, obs_hotkey_t *hotkey, bool pressed)
{
struct python_obs_callback *cb = p_cb;
@@ -821,8 +789,7 @@ static PyObject *hotkey_unregister(PyObject *self, PyObject *args)
PyObject *py_cb = NULL;
if (!script) {
PyErr_SetString(PyExc_RuntimeError,
"No active script, report this to Lain");
PyErr_SetString(PyExc_RuntimeError, "No active script, report this to Lain");
return NULL;
}
@@ -831,8 +798,7 @@ static PyObject *hotkey_unregister(PyObject *self, PyObject *args)
if (!py_cb || !PyFunction_Check(py_cb))
return python_none();
struct python_obs_callback *cb =
find_python_obs_callback(script, py_cb);
struct python_obs_callback *cb = find_python_obs_callback(script, py_cb);
if (cb)
remove_python_obs_callback(cb);
@@ -867,8 +833,7 @@ static PyObject *hotkey_register_frontend(PyObject *self, PyObject *args)
/* -------------------------------------------- */
static bool button_prop_clicked(obs_properties_t *props, obs_property_t *p,
void *p_cb)
static bool button_prop_clicked(obs_properties_t *props, obs_property_t *p, void *p_cb)
{
struct python_obs_callback *cb = p_cb;
bool ret = false;
@@ -881,8 +846,7 @@ static bool button_prop_clicked(obs_properties_t *props, obs_property_t *p,
PyObject *py_props = NULL;
PyObject *py_p = NULL;
if (libobs_to_py(obs_properties_t, props, false, &py_props) &&
libobs_to_py(obs_property_t, p, false, &py_p)) {
if (libobs_to_py(obs_properties_t, props, false, &py_props) && libobs_to_py(obs_property_t, p, false, &py_p)) {
PyObject *args = Py_BuildValue("(OO)", py_props, py_p);
PyObject *py_ret = PyObject_CallObject(cb->func, args);
@@ -919,8 +883,7 @@ static PyObject *properties_add_button(PyObject *self, PyObject *args)
return python_none();
struct python_obs_callback *cb = add_python_obs_callback(script, py_cb);
p = obs_properties_add_button2(props, name, text, button_prop_clicked,
cb);
p = obs_properties_add_button2(props, name, text, button_prop_clicked, cb);
if (!p || !libobs_to_py(obs_property_t, p, false, &py_ret))
return python_none();
@@ -931,8 +894,7 @@ static PyObject *properties_add_button(PyObject *self, PyObject *args)
/* -------------------------------------------- */
static bool modified_callback(void *p_cb, obs_properties_t *props,
obs_property_t *p, obs_data_t *settings)
static bool modified_callback(void *p_cb, obs_properties_t *props, obs_property_t *p, obs_data_t *settings)
{
struct python_obs_callback *cb = p_cb;
bool ret = false;
@@ -946,12 +908,10 @@ static bool modified_callback(void *p_cb, obs_properties_t *props,
PyObject *py_p = NULL;
PyObject *py_settings = NULL;
if (libobs_to_py(obs_properties_t, props, false, &py_props) &&
libobs_to_py(obs_property_t, p, false, &py_p) &&
if (libobs_to_py(obs_properties_t, props, false, &py_props) && libobs_to_py(obs_property_t, p, false, &py_p) &&
libobs_to_py(obs_data_t, settings, false, &py_settings)) {
PyObject *args =
Py_BuildValue("(OOO)", py_props, py_p, py_settings);
PyObject *args = Py_BuildValue("(OOO)", py_props, py_p, py_settings);
PyObject *py_ret = PyObject_CallObject(cb->func, args);
if (!py_error())
ret = py_ret == Py_True;
@@ -1074,8 +1034,7 @@ static PyObject *enum_sources(PyObject *self, PyObject *args)
/* -------------------------------------------- */
static bool enum_items_proc(obs_scene_t *scene, obs_sceneitem_t *item,
void *param)
static bool enum_items_proc(obs_scene_t *scene, obs_sceneitem_t *item, void *param)
{
PyObject *list = param;
PyObject *py_item;
@@ -1170,8 +1129,7 @@ static PyObject *sceneitem_list_release(PyObject *self, PyObject *args)
struct dstr cur_py_log_chunk = {0};
static PyObject *py_script_log_internal(PyObject *self, PyObject *args,
bool add_endl)
static PyObject *py_script_log_internal(PyObject *self, PyObject *args, bool add_endl)
{
static bool calling_self = false;
int log_level;
@@ -1200,8 +1158,7 @@ static PyObject *py_script_log_internal(PyObject *self, PyObject *args,
while (endl) {
*endl = 0;
if (cur_python_script)
script_log(&cur_python_script->base, log_level, "%s",
start);
script_log(&cur_python_script->base, log_level, "%s", start);
else
script_log(NULL, log_level, "%s", start);
*endl = '\n';
@@ -1251,25 +1208,17 @@ static void add_hook_functions(PyObject *module)
DEF_FUNC("sceneitem_list_release", sceneitem_list_release),
DEF_FUNC("obs_enum_sources", enum_sources),
DEF_FUNC("obs_scene_enum_items", scene_enum_items),
DEF_FUNC("obs_sceneitem_group_enum_items",
sceneitem_group_enum_items),
DEF_FUNC("obs_remove_tick_callback",
obs_python_remove_tick_callback),
DEF_FUNC("obs_sceneitem_group_enum_items", sceneitem_group_enum_items),
DEF_FUNC("obs_remove_tick_callback", obs_python_remove_tick_callback),
DEF_FUNC("obs_add_tick_callback", obs_python_add_tick_callback),
DEF_FUNC("signal_handler_disconnect",
obs_python_signal_handler_disconnect),
DEF_FUNC("signal_handler_connect",
obs_python_signal_handler_connect),
DEF_FUNC("signal_handler_disconnect_global",
obs_python_signal_handler_disconnect_global),
DEF_FUNC("signal_handler_connect_global",
obs_python_signal_handler_connect_global),
DEF_FUNC("signal_handler_disconnect", obs_python_signal_handler_disconnect),
DEF_FUNC("signal_handler_connect", obs_python_signal_handler_connect),
DEF_FUNC("signal_handler_disconnect_global", obs_python_signal_handler_disconnect_global),
DEF_FUNC("signal_handler_connect_global", obs_python_signal_handler_connect_global),
DEF_FUNC("obs_hotkey_unregister", hotkey_unregister),
DEF_FUNC("obs_hotkey_register_frontend",
hotkey_register_frontend),
DEF_FUNC("obs_hotkey_register_frontend", hotkey_register_frontend),
DEF_FUNC("obs_properties_add_button", properties_add_button),
DEF_FUNC("obs_property_set_modified_callback",
property_set_modified_callback),
DEF_FUNC("obs_property_set_modified_callback", property_set_modified_callback),
DEF_FUNC("remove_current_callback", remove_current_callback),
#undef DEF_FUNC
@@ -1293,9 +1242,7 @@ bool obs_python_script_load(obs_script_t *s)
unlock_python();
if (data->base.loaded) {
blog(LOG_INFO,
"[obs-scripting]: Loaded python script: %s",
data->base.file.array);
blog(LOG_INFO, "[obs-scripting]: Loaded python script: %s", data->base.file.array);
obs_python_script_update(s, NULL);
}
}
@@ -1340,8 +1287,7 @@ obs_script_t *obs_python_script_create(const char *path, obs_data_t *settings)
add_to_python_path(data->dir.array);
data->base.loaded = load_python_script(data);
if (data->base.loaded) {
blog(LOG_INFO, "[obs-scripting]: Loaded python script: %s",
data->base.file.array);
blog(LOG_INFO, "[obs-scripting]: Loaded python script: %s", data->base.file.array);
cur_python_script = data;
obs_python_script_update(&data->base, NULL);
cur_python_script = NULL;
@@ -1422,8 +1368,7 @@ void obs_python_script_unload(obs_script_t *s)
s->loaded = false;
blog(LOG_INFO, "[obs-scripting]: Unloaded python script: %s",
data->base.file.array);
blog(LOG_INFO, "[obs-scripting]: Unloaded python script: %s", data->base.file.array);
}
void obs_python_script_destroy(obs_script_t *s)
@@ -1562,8 +1507,7 @@ static void python_tick(void *param, float seconds)
while (data) {
cur_python_script = data;
PyObject *py_ret =
PyObject_CallObject(data->tick, args);
PyObject *py_ret = PyObject_CallObject(data->tick, args);
Py_XDECREF(py_ret);
py_error();
@@ -1625,11 +1569,9 @@ bool obs_scripting_python_runtime_linked(void)
void obs_scripting_python_version(char *version, size_t version_length)
{
#if RUNTIME_LINK
snprintf(version, version_length, "%d.%d", python_version.major,
python_version.minor);
snprintf(version, version_length, "%d.%d", python_version.major, python_version.minor);
#else
snprintf(version, version_length, "%d.%d", PY_MAJOR_VERSION,
PY_MINOR_VERSION);
snprintf(version, version_length, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION);
#endif
}
@@ -1665,8 +1607,7 @@ bool obs_scripting_load_python(const char *python_path)
if (python_path && *python_path) {
#ifdef __APPLE__
char temp[PATH_MAX];
snprintf(temp, sizeof(temp),
"%s/Python.framework/Versions/Current", python_path);
snprintf(temp, sizeof(temp), "%s/Python.framework/Versions/Current", python_path);
os_utf8_to_wcs(temp, 0, home_path, PATH_MAX);
Py_SetPythonHome(home_path);
#else
@@ -1750,8 +1691,7 @@ bool obs_scripting_load_python(const char *python_path)
}
dstr_free(&resource_path);
#else
char *relative_script_path =
os_get_executable_path_ptr("../" SCRIPT_DIR);
char *relative_script_path = os_get_executable_path_ptr("../" SCRIPT_DIR);
if (relative_script_path) {
add_to_python_path(relative_script_path);
}
+19 -32
View File
@@ -52,8 +52,7 @@
#include <util/threading.h>
#include <util/base.h>
#define do_log(level, format, ...) \
blog(level, "[Python] " format, ##__VA_ARGS__)
#define do_log(level, format, ...) blog(level, "[Python] " format, ##__VA_ARGS__)
#define warn(format, ...) do_log(LOG_WARNING, format, ##__VA_ARGS__)
#define info(format, ...) do_log(LOG_INFO, format, ##__VA_ARGS__)
@@ -90,43 +89,36 @@ struct python_obs_callback {
PyObject *func;
};
static inline struct python_obs_callback *
add_python_obs_callback_extra(struct obs_python_script *script, PyObject *func,
size_t extra_size)
static inline struct python_obs_callback *add_python_obs_callback_extra(struct obs_python_script *script,
PyObject *func, size_t extra_size)
{
struct python_obs_callback *cb = add_script_callback(
&script->first_callback, (obs_script_t *)script,
sizeof(*cb) + extra_size);
struct python_obs_callback *cb =
add_script_callback(&script->first_callback, (obs_script_t *)script, sizeof(*cb) + extra_size);
Py_XINCREF(func);
cb->func = func;
return cb;
}
static inline struct python_obs_callback *
add_python_obs_callback(struct obs_python_script *script, PyObject *func)
static inline struct python_obs_callback *add_python_obs_callback(struct obs_python_script *script, PyObject *func)
{
return add_python_obs_callback_extra(script, func, 0);
}
static inline void *
python_obs_callback_extra_data(struct python_obs_callback *cb)
static inline void *python_obs_callback_extra_data(struct python_obs_callback *cb)
{
return (void *)&cb[1];
}
static inline struct obs_python_script *
python_obs_callback_script(struct python_obs_callback *cb)
static inline struct obs_python_script *python_obs_callback_script(struct python_obs_callback *cb)
{
return (struct obs_python_script *)cb->base.script;
}
static inline struct python_obs_callback *
find_next_python_obs_callback(struct obs_python_script *script,
struct python_obs_callback *cb, PyObject *func)
static inline struct python_obs_callback *find_next_python_obs_callback(struct obs_python_script *script,
struct python_obs_callback *cb, PyObject *func)
{
cb = cb ? (struct python_obs_callback *)cb->base.next
: (struct python_obs_callback *)script->first_callback;
cb = cb ? (struct python_obs_callback *)cb->base.next : (struct python_obs_callback *)script->first_callback;
while (cb) {
if (cb->func == func)
@@ -137,8 +129,7 @@ find_next_python_obs_callback(struct obs_python_script *script,
return cb;
}
static inline struct python_obs_callback *
find_python_obs_callback(struct obs_python_script *script, PyObject *func)
static inline struct python_obs_callback *find_python_obs_callback(struct obs_python_script *script, PyObject *func)
{
return find_next_python_obs_callback(script, NULL, func);
}
@@ -163,8 +154,7 @@ static inline void free_python_obs_callback(struct python_obs_callback *cb)
/* ------------------------------------------------------------ */
static int parse_args_(PyObject *args, const char *func, const char *format,
...)
static int parse_args_(PyObject *args, const char *func, const char *format, ...)
{
char new_format[128];
va_list va_args;
@@ -179,8 +169,7 @@ static int parse_args_(PyObject *args, const char *func, const char *format,
return ret;
}
#define parse_args(args, format, ...) \
parse_args_(args, __FUNCTION__, format, ##__VA_ARGS__)
#define parse_args(args, format, ...) parse_args_(args, __FUNCTION__, format, ##__VA_ARGS__)
static inline bool py_error_(const char *func, int line)
{
@@ -208,19 +197,17 @@ extern struct obs_python_script *cur_python_script;
extern void py_to_obs_source_info(py_source_t *py_info);
extern PyObject *py_obs_register_source(PyObject *self, PyObject *args);
extern PyObject *py_obs_get_script_config_path(PyObject *self, PyObject *args);
extern void add_functions_to_py_module(PyObject *module,
PyMethodDef *method_list);
extern void add_functions_to_py_module(PyObject *module, PyMethodDef *method_list);
/* ------------------------------------------------------------ */
/* Warning: the following functions expect python to be locked! */
extern bool py_to_libobs_(const char *type, PyObject *py_in, void *libobs_out,
const char *id, const char *func, int line);
extern bool libobs_to_py_(const char *type, void *libobs_in, bool ownership,
PyObject **py_out, const char *id, const char *func,
extern bool py_to_libobs_(const char *type, PyObject *py_in, void *libobs_out, const char *id, const char *func,
int line);
extern bool libobs_to_py_(const char *type, void *libobs_in, bool ownership, PyObject **py_out, const char *id,
const char *func, int line);
extern bool py_call(PyObject *call, PyObject **ret, const char *arg_def, ...);
extern bool py_import_script(const char *name);
+6 -13
View File
@@ -25,8 +25,7 @@
#include "obs-scripting-callback.h"
#if defined(LUAJIT_FOUND)
extern obs_script_t *obs_lua_script_create(const char *path,
obs_data_t *settings);
extern obs_script_t *obs_lua_script_create(const char *path, obs_data_t *settings);
extern bool obs_lua_script_load(obs_script_t *s);
extern void obs_lua_script_unload(obs_script_t *s);
extern void obs_lua_script_destroy(obs_script_t *s);
@@ -39,8 +38,7 @@ extern void obs_lua_script_save(obs_script_t *script);
#endif
#if defined(Python_FOUND)
extern obs_script_t *obs_python_script_create(const char *path,
obs_data_t *settings);
extern obs_script_t *obs_python_script_create(const char *path, obs_data_t *settings);
extern bool obs_python_script_load(obs_script_t *s);
extern void obs_python_script_unload(obs_script_t *s);
extern void obs_python_script_destroy(obs_script_t *s);
@@ -48,8 +46,7 @@ extern void obs_python_load(void);
extern void obs_python_unload(void);
extern obs_properties_t *obs_python_script_get_properties(obs_script_t *script);
extern void obs_python_script_update(obs_script_t *script,
obs_data_t *settings);
extern void obs_python_script_update(obs_script_t *script, obs_data_t *settings);
extern void obs_python_script_save(obs_script_t *script);
#endif
@@ -150,9 +147,7 @@ bool obs_scripting_load(void)
#if defined(Python_FOUND)
obs_python_load();
#if !defined(_WIN32) && \
!defined( \
__APPLE__) /* Win32 and macOS need user-provided Python library paths */
#if !defined(_WIN32) && !defined(__APPLE__) /* Win32 and macOS need user-provided Python library paths */
obs_scripting_load_python(NULL);
#endif
#endif
@@ -196,8 +191,7 @@ void obs_scripting_unload(void)
pthread_mutex_unlock(&detach_mutex);
pthread_mutex_destroy(&detach_mutex);
blog(LOG_INFO, "[Scripting] Total detached callbacks: %d",
total_detached);
blog(LOG_INFO, "[Scripting] Total detached callbacks: %d", total_detached);
/* ---------------------- */
@@ -224,8 +218,7 @@ const char **obs_scripting_supported_formats(void)
return supported_formats;
}
static inline bool pointer_valid(const void *x, const char *name,
const char *func)
static inline bool pointer_valid(const void *x, const char *name, const char *func)
{
if (!x) {
blog(LOG_WARNING, "obs-scripting: [%s] %s is null", func, name);
+3 -9
View File
@@ -29,21 +29,15 @@ extern "C" {
struct obs_script;
typedef struct obs_script obs_script_t;
enum obs_script_lang {
OBS_SCRIPT_LANG_UNKNOWN,
OBS_SCRIPT_LANG_LUA,
OBS_SCRIPT_LANG_PYTHON
};
enum obs_script_lang { OBS_SCRIPT_LANG_UNKNOWN, OBS_SCRIPT_LANG_LUA, OBS_SCRIPT_LANG_PYTHON };
EXPORT bool obs_scripting_load(void);
EXPORT void obs_scripting_unload(void);
EXPORT const char **obs_scripting_supported_formats(void);
typedef void (*scripting_log_handler_t)(void *p, obs_script_t *script, int lvl,
const char *msg);
typedef void (*scripting_log_handler_t)(void *p, obs_script_t *script, int lvl, const char *msg);
EXPORT void obs_scripting_set_log_callback(scripting_log_handler_t handler,
void *param);
EXPORT void obs_scripting_set_log_callback(scripting_log_handler_t handler, void *param);
EXPORT bool obs_scripting_python_runtime_linked(void);
EXPORT void obs_scripting_python_version(char *version, size_t version_length);