diff --git a/README.md b/README.md index 3e1732802..d1e2f4841 100644 --- a/README.md +++ b/README.md @@ -315,6 +315,14 @@ Permissions required: ALL window.obsstudio.stopVirtualcam() ``` +#### Signal the browser source +Permissions required: BASIC +```js +/** + * @param {string} signal - Width of the browser size + */ +window.obsstudio.singal(signal) +``` ### Register for visibility callbacks diff --git a/browser-app.cpp b/browser-app.cpp index 582b1c6ee..409357bdf 100644 --- a/browser-app.cpp +++ b/browser-app.cpp @@ -99,14 +99,26 @@ void BrowserApp::OnBeforeCommandLineProcessing( #endif } -std::vector exposedFunctions = { - "getControlLevel", "getCurrentScene", "getStatus", - "startRecording", "stopRecording", "startStreaming", - "stopStreaming", "pauseRecording", "unpauseRecording", - "startReplayBuffer", "stopReplayBuffer", "saveReplayBuffer", - "startVirtualcam", "stopVirtualcam", "getScenes", - "setCurrentScene", "getTransitions", "getCurrentTransition", - "setCurrentTransition"}; +std::vector exposedFunctions = {"getControlLevel", + "getCurrentScene", + "getStatus", + "startRecording", + "stopRecording", + "startStreaming", + "stopStreaming", + "pauseRecording", + "unpauseRecording", + "startReplayBuffer", + "stopReplayBuffer", + "saveReplayBuffer", + "startVirtualcam", + "stopVirtualcam", + "getScenes", + "setCurrentScene", + "getTransitions", + "getCurrentTransition", + "setCurrentTransition", + "signal"}; void BrowserApp::OnContextCreated(CefRefPtr browser, CefRefPtr, diff --git a/browser-client.cpp b/browser-client.cpp index d91ca7024..4ee83afcc 100644 --- a/browser-client.cpp +++ b/browser-client.cpp @@ -198,6 +198,26 @@ bool BrowserClient::OnProcessMessageReceived( case ControlLevel::Basic: if (name == "saveReplayBuffer") { obs_frontend_replay_buffer_save(); + } else if (name == "signal") { + struct calldata data; + calldata_init(&data); + calldata_set_ptr(&data, "source", bs->source); + if (input_args->GetType(1) == VTYPE_STRING) { + const std::string signal = + input_args->GetString(1).ToString(); + calldata_set_string(&data, "signal", + signal.c_str()); + } + signal_handler_t *gsh = obs_get_signal_handler(); + if (gsh && !obs_obj_is_private(bs->source)) + signal_handler_signal( + gsh, "source_browser_signal", &data); + signal_handler_t *sh = + obs_source_get_signal_handler(bs->source); + if (sh) + signal_handler_signal(sh, "browser_signal", + &data); + calldata_free(&data); } [[fallthrough]]; case ControlLevel::ReadUser: diff --git a/obs-browser-plugin.cpp b/obs-browser-plugin.cpp index 188958efe..c82688305 100644 --- a/obs-browser-plugin.cpp +++ b/obs-browser-plugin.cpp @@ -767,6 +767,9 @@ bool obs_module_load(void) cef_version_info(7), CEF_VERSION); RegisterBrowserSource(); + signal_handler_add( + obs_get_signal_handler(), + "void source_browser_signal(ptr source, string signal)"); obs_frontend_add_event_callback(handle_obs_frontend_event, nullptr); #ifdef ENABLE_BROWSER_SHARED_TEXTURE diff --git a/obs-browser-source.cpp b/obs-browser-source.cpp index 09b301718..fe086763f 100644 --- a/obs-browser-source.cpp +++ b/obs-browser-source.cpp @@ -102,6 +102,10 @@ BrowserSource::BrowserSource(obs_data_t *, obs_source_t *source_) "void javascript_event(string eventName, string jsonString)", jsEventFunction, (void *)this); + signal_handler_t *sh = obs_source_get_signal_handler(source); + signal_handler_add(sh, + "void browser_signal(ptr source, string signal)"); + /* defer update */ obs_source_update(source, nullptr);