Skip to content

Commit 83c81e8

Browse files
Merged branch upstream/2.23.x (OBS 30) into streamlabs
2 parents 630848a + c710222 commit 83c81e8

31 files changed

+385
-96
lines changed

.github/workflows/clang-format.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ jobs:
77
runs-on: ubuntu-22.04
88
steps:
99
- name: Checkout
10-
uses: actions/checkout@v2
10+
uses: actions/checkout@v4
1111
with:
1212
submodules: 'recursive'
1313

CMakeLists.txt

+23-21
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ if(NOT ENABLE_BROWSER)
1111
return()
1212
endif()
1313

14-
find_package(CEF REQUIRED)
14+
find_package(CEF REQUIRED 95)
1515
find_package(nlohmann_json REQUIRED)
1616

1717
add_library(obs-browser MODULE)
@@ -20,26 +20,28 @@ add_library(OBS::browser ALIAS obs-browser)
2020
option(ENABLE_BROWSER_PANELS "Enable Qt web browser panel support" ON)
2121
mark_as_advanced(ENABLE_BROWSER_PANELS)
2222

23-
set(obs-browser_SOURCES
24-
obs-browser-plugin.cpp
25-
obs-browser-source.cpp
26-
obs-browser-source.hpp
27-
obs-browser-source-audio.cpp
28-
browser-app.cpp
29-
browser-app.hpp
30-
browser-client.cpp
31-
browser-client.hpp
32-
browser-scheme.cpp
33-
browser-scheme.hpp
34-
browser-version.h
35-
cef-headers.hpp
36-
deps/base64/base64.cpp
37-
deps/base64/base64.hpp
38-
deps/wide-string.cpp
39-
deps/wide-string.hpp
40-
deps/signal-restore.cpp
41-
deps/signal-restore.hpp
42-
deps/obs-websocket-api/obs-websocket-api.h browser-mac.mm browser-mac.h)
23+
target_sources(
24+
obs-browser
25+
PRIVATE # cmake-format: sortable
26+
browser-app.cpp
27+
browser-app.hpp
28+
browser-client.cpp
29+
browser-client.hpp
30+
browser-scheme.cpp
31+
browser-scheme.hpp
32+
browser-version.h
33+
cef-headers.hpp
34+
deps/base64/base64.cpp
35+
deps/base64/base64.hpp
36+
deps/obs-websocket-api/obs-websocket-api.h
37+
deps/signal-restore.cpp
38+
deps/signal-restore.hpp
39+
deps/wide-string.cpp
40+
deps/wide-string.hpp
41+
obs-browser-plugin.cpp
42+
obs-browser-source-audio.cpp
43+
obs-browser-source.cpp
44+
obs-browser-source.hpp)
4345

4446
if(OS_MACOS)
4547
list(APPEND obs-browser_SOURCES

README.md

+3
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ window.addEventListener('obsSceneChanged', function(event) {
5555
Descriptions for these events can be [found here](https://obsproject.com/docs/reference-frontend-api.html?highlight=paused#c.obs_frontend_event).
5656

5757
* obsSceneChanged
58+
* obsSceneListChanged
59+
* obsTransitionChanged
60+
* obsTransitionListChanged
5861
* obsSourceVisibleChanged
5962
* obsSourceActiveChanged
6063
* obsStreamingStarting

browser-app.cpp

+53-8
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,56 @@ void BrowserApp::SetDocumentVisibility(CefRefPtr<CefBrowser> browser,
296296
}
297297
#endif
298298

299+
CefRefPtr<CefV8Value> CefValueToCefV8Value(CefRefPtr<CefValue> value)
300+
{
301+
CefRefPtr<CefV8Value> result;
302+
switch (value->GetType()) {
303+
case VTYPE_INVALID:
304+
result = CefV8Value::CreateNull();
305+
break;
306+
case VTYPE_NULL:
307+
result = CefV8Value::CreateNull();
308+
break;
309+
case VTYPE_BOOL:
310+
result = CefV8Value::CreateBool(value->GetBool());
311+
break;
312+
case VTYPE_INT:
313+
result = CefV8Value::CreateInt(value->GetInt());
314+
break;
315+
case VTYPE_DOUBLE:
316+
result = CefV8Value::CreateDouble(value->GetDouble());
317+
break;
318+
case VTYPE_STRING:
319+
result = CefV8Value::CreateString(value->GetString());
320+
break;
321+
case VTYPE_BINARY:
322+
result = CefV8Value::CreateNull();
323+
break;
324+
case VTYPE_DICTIONARY: {
325+
result = CefV8Value::CreateObject(nullptr, nullptr);
326+
CefRefPtr<CefDictionaryValue> dict = value->GetDictionary();
327+
CefDictionaryValue::KeyList keys;
328+
dict->GetKeys(keys);
329+
for (unsigned int i = 0; i < keys.size(); i++) {
330+
CefString key = keys[i];
331+
result->SetValue(
332+
key, CefValueToCefV8Value(dict->GetValue(key)),
333+
V8_PROPERTY_ATTRIBUTE_NONE);
334+
}
335+
} break;
336+
case VTYPE_LIST: {
337+
CefRefPtr<CefListValue> list = value->GetList();
338+
size_t size = list->GetSize();
339+
result = CefV8Value::CreateArray((int)size);
340+
for (size_t i = 0; i < size; i++) {
341+
result->SetValue((int)i, CefValueToCefV8Value(
342+
list->GetValue(i)));
343+
}
344+
} break;
345+
}
346+
return result;
347+
}
348+
299349
bool BrowserApp::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser,
300350
CefRefPtr<CefFrame> frame,
301351
CefProcessId source_process,
@@ -369,25 +419,20 @@ bool BrowserApp::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser,
369419
} else if (message->GetName() == "executeCallback") {
370420
CefRefPtr<CefV8Context> context =
371421
browser->GetMainFrame()->GetV8Context();
372-
CefRefPtr<CefV8Value> retval;
373-
CefRefPtr<CefV8Exception> exception;
374422

375423
context->Enter();
376424

377425
CefRefPtr<CefListValue> arguments = message->GetArgumentList();
378426
int callbackID = arguments->GetInt(0);
379427
CefString jsonString = arguments->GetString(1);
380428

381-
std::string script;
382-
script += "JSON.parse('";
383-
script += arguments->GetString(1).ToString();
384-
script += "');";
429+
CefRefPtr<CefValue> json =
430+
CefParseJSON(arguments->GetString(1).ToString(), {});
385431

386432
CefRefPtr<CefV8Value> callback = callbackMap[callbackID];
387433
CefV8ValueList args;
388434

389-
context->Eval(script, browser->GetMainFrame()->GetURL(), 0,
390-
retval, exception);
435+
CefRefPtr<CefV8Value> retval = CefValueToCefV8Value(json);
391436

392437
args.push_back(retval);
393438

browser-client.cpp

+5-4
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ bool BrowserClient::OnProcessMessageReceived(
201201
if (name == "getScenes") {
202202
struct obs_frontend_source_list list = {};
203203
obs_frontend_get_scenes(&list);
204-
std::vector<const char *> scenes_vector;
204+
std::vector<nlohmann::json> scenes_vector;
205205
for (size_t i = 0; i < list.sources.num; i++) {
206206
obs_source_t *source = list.sources.array[i];
207207
scenes_vector.push_back(
@@ -227,7 +227,7 @@ bool BrowserClient::OnProcessMessageReceived(
227227
} else if (name == "getTransitions") {
228228
struct obs_frontend_source_list list = {};
229229
obs_frontend_get_transitions(&list);
230-
std::vector<const char *> transitions_vector;
230+
std::vector<nlohmann::json> transitions_vector;
231231
for (size_t i = 0; i < list.sources.num; i++) {
232232
obs_source_t *source = list.sources.array[i];
233233
transitions_vector.push_back(
@@ -668,8 +668,9 @@ void BrowserClient::OnLoadEnd(CefRefPtr<CefBrowser>, CefRefPtr<CefFrame> frame,
668668

669669
std::string script;
670670
script += "const obsCSS = document.createElement('style');";
671-
script += "obsCSS.innerHTML = decodeURIComponent(\"" +
672-
uriEncodedCSS + "\");";
671+
script += "obsCSS.appendChild(document.createTextNode("
672+
"decodeURIComponent(\"" +
673+
uriEncodedCSS + "\")));";
673674
script += "document.querySelector('head').appendChild(obsCSS);";
674675

675676
frame->ExecuteJavaScript(script, "", 0);

browser-version.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
#pragma once
22

33
#define OBS_BROWSER_VERSION_MAJOR 2
4-
#define OBS_BROWSER_VERSION_MINOR 21
5-
#define OBS_BROWSER_VERSION_PATCH 1
4+
#define OBS_BROWSER_VERSION_MINOR 23
5+
#define OBS_BROWSER_VERSION_PATCH 6
66

77
#ifndef MAKE_SEMANTIC_VERSION
88
#define MAKE_SEMANTIC_VERSION(major, minor, patch) \

cmake/feature-panels.cmake

+10-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
find_qt(COMPONENTS Widgets)
1+
find_package(Qt6 REQUIRED Widgets)
22

33
add_library(browser-panels INTERFACE)
44
add_library(OBS::browser-panels ALIAS browser-panels)
@@ -9,8 +9,11 @@ target_include_directories(browser-panels INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}
99

1010
target_compile_definitions(browser-panels INTERFACE BROWSER_AVAILABLE)
1111

12-
target_sources(obs-browser PRIVATE panel/browser-panel-client.hpp panel/browser-panel-internal.hpp
13-
panel/browser-panel.cpp panel/browser-panel-client.cpp)
12+
target_sources(
13+
obs-browser
14+
PRIVATE # cmake-format: sortable
15+
panel/browser-panel-client.cpp panel/browser-panel-client.hpp panel/browser-panel-internal.hpp
16+
panel/browser-panel.cpp)
1417

1518
target_link_libraries(obs-browser PRIVATE OBS::browser-panels Qt::Widgets)
1619

@@ -19,3 +22,7 @@ set_target_properties(
1922
PROPERTIES AUTOMOC ON
2023
AUTOUIC ON
2124
AUTORCC ON)
25+
26+
if(OS_WINDOWS)
27+
set_property(SOURCE browser-app.hpp PROPERTY SKIP_AUTOMOC TRUE)
28+
endif()

cmake/legacy.cmake

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ option(ENABLE_BROWSER_QT_LOOP "Enable running CEF on the main UI thread alongsid
2525

2626
mark_as_advanced(ENABLE_BROWSER_LEGACY ENABLE_BROWSER_SHARED_TEXTURE ENABLE_BROWSER_PANELS ENABLE_BROWSER_QT_LOOP)
2727

28-
find_package(CEF REQUIRED)
28+
find_package(CEF REQUIRED 95)
2929

3030
if(NOT TARGET CEF::Wrapper)
3131
message(

cmake/os-linux.cmake

+6-3
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,23 @@ set_target_properties(obs-browser PROPERTIES BUILD_RPATH "$ORIGIN/" INSTALL_RPAT
66
add_executable(browser-helper)
77
add_executable(OBS::browser-helper ALIAS browser-helper)
88

9-
target_sources(browser-helper PRIVATE cef-headers.hpp obs-browser-page/obs-browser-page-main.cpp browser-app.cpp
10-
browser-app.hpp deps/json11/json11.cpp deps/json11/json11.hpp)
9+
target_sources(
10+
browser-helper PRIVATE # cmake-format: sortable
11+
browser-app.cpp browser-app.hpp cef-headers.hpp obs-browser-page/obs-browser-page-main.cpp)
1112

1213
target_include_directories(browser-helper PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/deps"
1314
"${CMAKE_CURRENT_SOURCE_DIR}/obs-browser-page")
1415

1516
target_link_libraries(browser-helper PRIVATE CEF::Wrapper CEF::Library)
1617

1718
set(OBS_EXECUTABLE_DESTINATION "${OBS_PLUGIN_DESTINATION}")
19+
20+
# cmake-format: off
1821
set_target_properties_obs(
1922
browser-helper
2023
PROPERTIES FOLDER plugins/obs-browser
2124
BUILD_RPATH "$ORIGIN/"
2225
INSTALL_RPATH "$ORIGIN/"
2326
PREFIX ""
2427
OUTPUT_NAME obs-browser-page)
25-
28+
# cmake-format: on

cmake/os-macos.cmake

+9-8
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
1-
find_qt(COMPONENTS Widgets)
2-
3-
find_library(COREFOUNDATION CoreFoundation)
4-
find_library(APPKIT AppKit)
5-
mark_as_advanced(COREFOUNDATION APPKIT)
1+
find_package(Qt6 REQUIRED Widgets)
62

73
target_compile_definitions(obs-browser PRIVATE ENABLE_BROWSER_SHARED_TEXTURE ENABLE_BROWSER_QT_LOOP)
4+
85
if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 14.0.3)
96
target_compile_options(obs-browser PRIVATE -Wno-error=unqualified-std-cast-call)
107
endif()
118

12-
target_link_libraries(obs-browser PRIVATE Qt::Widgets ${COREFOUNDATION} ${APPKIT} CEF::Wrapper)
9+
target_link_libraries(obs-browser PRIVATE Qt::Widgets CEF::Wrapper "$<LINK_LIBRARY:FRAMEWORK,CoreFoundation.framework>"
10+
"$<LINK_LIBRARY:FRAMEWORK,AppKit.framework>")
1311

1412
set(helper_basename browser-helper)
1513
set(helper_output_name "obs64 Helper")
@@ -31,9 +29,12 @@ foreach(helper IN LISTS helper_suffixes)
3129
add_executable(${target_name} MACOSX_BUNDLE EXCLUDE_FROM_ALL)
3230
add_executable(OBS::${target_name} ALIAS ${target_name})
3331

34-
target_sources(${target_name} PRIVATE browser-app.cpp browser-app.hpp obs-browser-page/obs-browser-page-main.cpp
35-
cef-headers.hpp browser-mac.mm browser-mac.h)
32+
target_sources(
33+
${target_name} PRIVATE # cmake-format: sortable
34+
browser-app.cpp browser-app.hpp browser-mac.mm browser-mac.h cef-headers.hpp obs-browser-page/obs-browser-page-main.cpp)
35+
3636
target_compile_definitions(${target_name} PRIVATE ENABLE_BROWSER_SHARED_TEXTURE)
37+
3738
if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 14.0.3)
3839
target_compile_options(${target_name} PRIVATE -Wno-error=unqualified-std-cast-call)
3940
endif()

cmake/os-windows.cmake

+3-5
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,9 @@ add_executable(OBS::browser-helper ALIAS obs-browser-helper)
99

1010
target_sources(
1111
obs-browser-helper
12-
PRIVATE cef-headers.hpp
13-
obs-browser-page/obs-browser-page-main.cpp
14-
browser-app.cpp
15-
browser-app.hpp
16-
obs-browser-page.manifest)
12+
PRIVATE # cmake-format: sortable
13+
browser-app.cpp browser-app.hpp cef-headers.hpp obs-browser-page.manifest
14+
obs-browser-page/obs-browser-page-main.cpp)
1715

1816
target_include_directories(obs-browser-helper PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/deps"
1917
"${CMAKE_CURRENT_SOURCE_DIR}/obs-browser-page")

data/locale/af-ZA.ini

+28
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,40 @@
11
LocalFile="Lokale lêer"
22
Width="Breedte"
33
Height="Hoogte"
4+
FPS="RPS"
5+
CSS="Pasgemaakte CSS"
46
BrowserSource="Blaaier"
7+
CustomFrameRate="Gebruik pasgemaakte beeldduur"
8+
RerouteAudio="Beheer oudio d.m.v. OBS"
9+
Inspect="Inspekteer"
10+
DevTools="Inspekteer blaaierdok ‘%1’"
511
CopyUrl="Kopieer huidige adres"
612
WebpageControlLevel="Bladtoestemmings"
713
WebpageControlLevel.Level.None="Geen toegang tot OBS"
14+
WebpageControlLevel.Level.ReadObs="Leestoegang tot OBS-statusinligting"
15+
WebpageControlLevel.Level.ReadUser="Leestoegang tot gebruikerinligting (huidige toneelversameling, oorgange)"
16+
WebpageControlLevel.Level.Basic="Basiese toegang tot OBS (bewaar terugspeelbuffer, ens.)"
817
WebpageControlLevel.Level.Advanced="Gevorderde toegang tot OBS (Verander tonele, Begin/stop herhaalbuffer, ens.)"
18+
WebpageControlLevel.Level.All="Volle toegang tot OBS (begin/stop stroming sonder waarskuwing, ens.)"
19+
Dialog.Alert="JavaScript-waarskuwing"
20+
Dialog.Confirm="JavaScript-bevestiging"
21+
Dialog.Prompt="JavaScript-melding"
22+
Dialog.BrowserDock="Blaaierdok"
923
Dialog.ReceivedFrom="Ontvang van ‘%1’"
24+
Error.Title="Kon nie daardie blad laai nie!"
25+
Error.Description="Maak seker die adres is korrek en dat die werf nie probleme ervaar nie."
26+
Error.Retry="Klik hier om weer te probeer"
1027
Error.Code="Fout: %1"
28+
Zoom.Reset="Herstel zoem"
29+
Zoom.Out="Zoem uit"
30+
Zoom.In="Zoem in"
1131
ErrorCode.ERR_CONNECTION_REFUSED="Bediener het die koppeling geweier"
32+
ErrorCode.ERR_NAME_NOT_RESOLVED="Bediener se IP-adres nie gevind nie"
33+
ErrorCode.ERR_CONNECTION_TIMED_OUT="Verbinding het uitgetel"
34+
ErrorCode.ERR_TIMED_OUT="Bewerking het uitgetel"
1235
ErrorCode.ERR_FILE_NOT_FOUND="Lêer nie gevind nie"
36+
ErrorCode.ERR_FAILED="Kon nie koppel nie"
37+
ErrorCode.ERR_NETWORK_CHANGED="Netwerk het verander"
38+
ErrorCode.ERR_SSL_VERSION_INTERFERENCE="SSL-weergawekoppelvlak. TLS 1.3 is dalk versper of gewysig."
39+
ErrorCode.ERR_SSL_PROTOCOL_ERROR="SSL-protokolfout. Kon nie ’n beveiligde verbinding maak nie."
40+
ErrorCode.ERR_CERT_DATE_INVALID="Bediener se SSL-sertifikaat is verouderd of u rekenaar se tyd is verkeerd."

0 commit comments

Comments
 (0)