Skip to content

Commit 22476b5

Browse files
committed
Add function to signal the browser source from JavaScript
1 parent b4f724a commit 22476b5

5 files changed

+55
-8
lines changed

Diff for: README.md

+8
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,14 @@ Permissions required: ALL
315315
window.obsstudio.stopVirtualcam()
316316
```
317317

318+
#### Signal the browser source
319+
Permissions required: BASIC
320+
```js
321+
/**
322+
* @param {string} signal - signal name
323+
*/
324+
window.obsstudio.signal(signal)
325+
```
318326

319327
### Register for visibility callbacks
320328

Diff for: browser-app.cpp

+20-8
Original file line numberDiff line numberDiff line change
@@ -99,14 +99,26 @@ void BrowserApp::OnBeforeCommandLineProcessing(
9999
#endif
100100
}
101101

102-
std::vector<std::string> exposedFunctions = {
103-
"getControlLevel", "getCurrentScene", "getStatus",
104-
"startRecording", "stopRecording", "startStreaming",
105-
"stopStreaming", "pauseRecording", "unpauseRecording",
106-
"startReplayBuffer", "stopReplayBuffer", "saveReplayBuffer",
107-
"startVirtualcam", "stopVirtualcam", "getScenes",
108-
"setCurrentScene", "getTransitions", "getCurrentTransition",
109-
"setCurrentTransition"};
102+
std::vector<std::string> exposedFunctions = {"getControlLevel",
103+
"getCurrentScene",
104+
"getStatus",
105+
"startRecording",
106+
"stopRecording",
107+
"startStreaming",
108+
"stopStreaming",
109+
"pauseRecording",
110+
"unpauseRecording",
111+
"startReplayBuffer",
112+
"stopReplayBuffer",
113+
"saveReplayBuffer",
114+
"startVirtualcam",
115+
"stopVirtualcam",
116+
"getScenes",
117+
"setCurrentScene",
118+
"getTransitions",
119+
"getCurrentTransition",
120+
"setCurrentTransition",
121+
"signal"};
110122

111123
void BrowserApp::OnContextCreated(CefRefPtr<CefBrowser> browser,
112124
CefRefPtr<CefFrame>,

Diff for: browser-client.cpp

+20
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,26 @@ bool BrowserClient::OnProcessMessageReceived(
198198
case ControlLevel::Basic:
199199
if (name == "saveReplayBuffer") {
200200
obs_frontend_replay_buffer_save();
201+
} else if (name == "signal") {
202+
struct calldata data;
203+
calldata_init(&data);
204+
calldata_set_ptr(&data, "source", bs->source);
205+
if (input_args->GetType(1) == VTYPE_STRING) {
206+
const std::string signal =
207+
input_args->GetString(1).ToString();
208+
calldata_set_string(&data, "signal",
209+
signal.c_str());
210+
}
211+
signal_handler_t *gsh = obs_get_signal_handler();
212+
if (gsh && !obs_obj_is_private(bs->source))
213+
signal_handler_signal(
214+
gsh, "source_browser_signal", &data);
215+
signal_handler_t *sh =
216+
obs_source_get_signal_handler(bs->source);
217+
if (sh)
218+
signal_handler_signal(sh, "browser_signal",
219+
&data);
220+
calldata_free(&data);
201221
}
202222
[[fallthrough]];
203223
case ControlLevel::ReadUser:

Diff for: obs-browser-plugin.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -767,6 +767,9 @@ bool obs_module_load(void)
767767
cef_version_info(7), CEF_VERSION);
768768

769769
RegisterBrowserSource();
770+
signal_handler_add(
771+
obs_get_signal_handler(),
772+
"void source_browser_signal(ptr source, string signal)");
770773
obs_frontend_add_event_callback(handle_obs_frontend_event, nullptr);
771774

772775
#ifdef ENABLE_BROWSER_SHARED_TEXTURE

Diff for: obs-browser-source.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,10 @@ BrowserSource::BrowserSource(obs_data_t *, obs_source_t *source_)
102102
"void javascript_event(string eventName, string jsonString)",
103103
jsEventFunction, (void *)this);
104104

105+
signal_handler_t *sh = obs_source_get_signal_handler(source);
106+
signal_handler_add(sh,
107+
"void browser_signal(ptr source, string signal)");
108+
105109
/* defer update */
106110
obs_source_update(source, nullptr);
107111

0 commit comments

Comments
 (0)