diff --git a/libobs/callback/signal.c b/libobs/callback/signal.c index 7cc90740b..025e4430f 100644 --- a/libobs/callback/signal.c +++ b/libobs/callback/signal.c @@ -236,10 +236,18 @@ void signal_handler_disconnect(signal_handler_t *handler, const char *signal, else da_erase(sig->callbacks, idx); } - + pthread_mutex_unlock(&sig->mutex); } +static THREAD_LOCAL struct signal_callback *current_signal_cb = NULL; + +void signal_handler_remove_current(void) +{ + if (current_signal_cb) + current_signal_cb->remove = true; +} + void signal_handler_signal(signal_handler_t *handler, const char *signal, calldata_t *params) { @@ -253,8 +261,11 @@ void signal_handler_signal(signal_handler_t *handler, const char *signal, for (size_t i = 0; i < sig->callbacks.num; i++) { struct signal_callback *cb = sig->callbacks.array+i; - if (!cb->remove) + if (!cb->remove) { + current_signal_cb = cb; cb->callback(cb->data, params); + current_signal_cb = NULL; + } } for (size_t i = sig->callbacks.num; i > 0; i--) { diff --git a/libobs/callback/signal.h b/libobs/callback/signal.h index be9138b6b..f70beff7b 100644 --- a/libobs/callback/signal.h +++ b/libobs/callback/signal.h @@ -60,6 +60,8 @@ EXPORT void signal_handler_connect(signal_handler_t *handler, EXPORT void signal_handler_disconnect(signal_handler_t *handler, const char *signal, signal_callback_t callback, void *data); +EXPORT void signal_handler_remove_current(void); + EXPORT void signal_handler_signal(signal_handler_t *handler, const char *signal, calldata_t *params);