diff --git a/UI/cmake/feature-browserpanels.cmake b/UI/cmake/feature-browserpanels.cmake
deleted file mode 100644
index 73ef6d2e4..000000000
--- a/UI/cmake/feature-browserpanels.cmake
+++ /dev/null
@@ -1,10 +0,0 @@
-if(TARGET OBS::browser-panels)
- target_enable_feature(obs-studio "Browser panels" BROWSER_AVAILABLE)
-
- target_link_libraries(obs-studio PRIVATE OBS::browser-panels)
-
- target_sources(
- obs-studio
- PRIVATE window-dock-browser.cpp window-dock-browser.hpp window-extra-browsers.cpp window-extra-browsers.hpp
- )
-endif()
diff --git a/UI/cmake/feature-importers.cmake b/UI/cmake/feature-importers.cmake
deleted file mode 100644
index d11ab27a2..000000000
--- a/UI/cmake/feature-importers.cmake
+++ /dev/null
@@ -1,10 +0,0 @@
-target_sources(
- obs-studio
- PRIVATE
- importers/classic.cpp
- importers/importers.cpp
- importers/importers.hpp
- importers/sl.cpp
- importers/studio.cpp
- importers/xsplit.cpp
-)
diff --git a/UI/cmake/ui-elements.cmake b/UI/cmake/ui-elements.cmake
deleted file mode 100644
index d68890945..000000000
--- a/UI/cmake/ui-elements.cmake
+++ /dev/null
@@ -1,78 +0,0 @@
-if(NOT TARGET OBS::properties-view)
- add_subdirectory("${CMAKE_SOURCE_DIR}/shared/properties-view" "${CMAKE_BINARY_DIR}/shared/properties-view")
-endif()
-
-if(NOT TARGET OBS::qt-plain-text-edit)
- add_subdirectory("${CMAKE_SOURCE_DIR}/shared/qt/plain-text-edit" "${CMAKE_BINARY_DIR}/shared/qt/plain-text-edit")
-endif()
-
-if(NOT TARGET OBS::qt-slider-ignorewheel)
- add_subdirectory(
- "${CMAKE_SOURCE_DIR}/shared/qt/slider-ignorewheel"
- "${CMAKE_BINARY_DIR}/shared/qt/slider-ignorewheel"
- )
-endif()
-
-if(NOT TARGET OBS::qt-vertical-scroll-area)
- add_subdirectory(
- "${CMAKE_SOURCE_DIR}/shared/qt/vertical-scroll-area"
- "${CMAKE_BINARY_DIR}/shared/qt/vertical-scroll-area"
- )
-endif()
-
-target_link_libraries(
- obs-studio
- PRIVATE OBS::properties-view OBS::qt-plain-text-edit OBS::qt-slider-ignorewheel OBS::qt-vertical-scroll-area
-)
-
-target_sources(
- obs-studio
- PRIVATE
- absolute-slider.cpp
- absolute-slider.hpp
- adv-audio-control.cpp
- adv-audio-control.hpp
- audio-encoders.cpp
- audio-encoders.hpp
- balance-slider.hpp
- basic-controls.cpp
- basic-controls.hpp
- clickable-label.hpp
- context-bar-controls.cpp
- context-bar-controls.hpp
- focus-list.cpp
- focus-list.hpp
- horizontal-scroll-area.cpp
- horizontal-scroll-area.hpp
- hotkey-edit.cpp
- hotkey-edit.hpp
- item-widget-helpers.cpp
- item-widget-helpers.hpp
- log-viewer.cpp
- log-viewer.hpp
- media-controls.cpp
- media-controls.hpp
- menu-button.cpp
- menu-button.hpp
- mute-checkbox.hpp
- noncheckable-button.hpp
- preview-controls.cpp
- preview-controls.hpp
- remote-text.cpp
- remote-text.hpp
- scene-tree.cpp
- scene-tree.hpp
- screenshot-obj.hpp
- source-label.cpp
- source-label.hpp
- source-tree.cpp
- source-tree.hpp
- undo-stack-obs.cpp
- undo-stack-obs.hpp
- url-push-button.cpp
- url-push-button.hpp
- visibility-item-widget.cpp
- visibility-item-widget.hpp
- volume-control.cpp
- volume-control.hpp
-)
diff --git a/UI/cmake/ui-qt.cmake b/UI/cmake/ui-qt.cmake
deleted file mode 100644
index 53d53671a..000000000
--- a/UI/cmake/ui-qt.cmake
+++ /dev/null
@@ -1,65 +0,0 @@
-find_package(Qt6 REQUIRED Widgets Network Svg Xml)
-
-if(OS_LINUX OR OS_FREEBSD OR OS_OPENBSD)
- find_package(Qt6 REQUIRED Gui DBus)
-endif()
-
-if(NOT TARGET OBS::qt-wrappers)
- add_subdirectory("${CMAKE_SOURCE_DIR}/shared/qt/wrappers" "${CMAKE_BINARY_DIR}/shared/qt/wrappers")
-endif()
-
-target_link_libraries(
- obs-studio
- PRIVATE Qt::Widgets Qt::Svg Qt::Xml Qt::Network OBS::qt-wrappers
-)
-
-set_target_properties(
- obs-studio
- PROPERTIES AUTOMOC ON AUTOUIC ON AUTORCC ON
-)
-
-set_property(TARGET obs-studio APPEND PROPERTY AUTOUIC_SEARCH_PATHS forms forms/source-toolbar)
-
-set(
- _qt_sources
- forms/AutoConfigFinishPage.ui
- forms/AutoConfigStartPage.ui
- forms/AutoConfigStartPage.ui
- forms/AutoConfigStreamPage.ui
- forms/AutoConfigTestPage.ui
- forms/AutoConfigVideoPage.ui
- forms/ColorSelect.ui
- forms/obs.qrc
- forms/OBSAbout.ui
- forms/OBSAdvAudio.ui
- forms/OBSBasic.ui
- forms/OBSBasicControls.ui
- forms/OBSBasicFilters.ui
- forms/OBSBasicInteraction.ui
- forms/OBSBasicProperties.ui
- forms/OBSBasicSettings.ui
- forms/OBSBasicSourceSelect.ui
- forms/OBSBasicTransform.ui
- forms/OBSBasicVCamConfig.ui
- forms/OBSExtraBrowsers.ui
- forms/OBSImporter.ui
- forms/OBSLogReply.ui
- forms/OBSLogViewer.ui
- forms/OBSMissingFiles.ui
- forms/OBSRemux.ui
- forms/OBSUpdate.ui
- forms/OBSYoutubeActions.ui
- forms/source-toolbar/browser-source-toolbar.ui
- forms/source-toolbar/color-source-toolbar.ui
- forms/source-toolbar/device-select-toolbar.ui
- forms/source-toolbar/game-capture-toolbar.ui
- forms/source-toolbar/image-source-toolbar.ui
- forms/source-toolbar/media-controls.ui
- forms/source-toolbar/text-source-toolbar.ui
-)
-
-target_sources(obs-studio PRIVATE ${_qt_sources})
-
-source_group(TREE "${CMAKE_CURRENT_SOURCE_DIR}/forms" PREFIX "UI Files" FILES ${_qt_sources})
-
-unset(_qt_sources)
diff --git a/UI/cmake/ui-windows.cmake b/UI/cmake/ui-windows.cmake
deleted file mode 100644
index 84f561edb..000000000
--- a/UI/cmake/ui-windows.cmake
+++ /dev/null
@@ -1,63 +0,0 @@
-target_sources(
- obs-studio
- PRIVATE
- window-basic-about.cpp
- window-basic-about.hpp
- window-basic-adv-audio.cpp
- window-basic-adv-audio.hpp
- window-basic-auto-config-test.cpp
- window-basic-auto-config.cpp
- window-basic-auto-config.hpp
- window-basic-filters.cpp
- window-basic-filters.hpp
- window-basic-interaction.cpp
- window-basic-interaction.hpp
- window-basic-main-browser.cpp
- window-basic-main-dropfiles.cpp
- window-basic-main-icons.cpp
- window-basic-main-outputs.cpp
- window-basic-main-outputs.hpp
- window-basic-main-profiles.cpp
- window-basic-main-scene-collections.cpp
- window-basic-main-screenshot.cpp
- window-basic-main-transitions.cpp
- window-basic-main.cpp
- window-basic-main.hpp
- window-basic-preview.cpp
- window-basic-preview.hpp
- window-basic-properties.cpp
- window-basic-properties.hpp
- window-basic-settings-a11y.cpp
- window-basic-settings-appearance.cpp
- window-basic-settings-stream.cpp
- window-basic-settings.cpp
- window-basic-settings.hpp
- window-basic-source-select.cpp
- window-basic-source-select.hpp
- window-basic-stats.cpp
- window-basic-stats.hpp
- window-basic-status-bar.cpp
- window-basic-status-bar.hpp
- window-basic-transform.cpp
- window-basic-transform.hpp
- window-basic-vcam-config.cpp
- window-basic-vcam-config.hpp
- window-basic-vcam.hpp
- window-dock.cpp
- window-dock.hpp
- window-importer.cpp
- window-importer.hpp
- window-log-reply.cpp
- window-log-reply.hpp
- window-main.hpp
- window-missing-files.cpp
- window-missing-files.hpp
- window-namedialog.cpp
- window-namedialog.hpp
- window-projector.cpp
- window-projector.hpp
- window-remux.cpp
- window-remux.hpp
- window-whats-new.cpp
- window-whats-new.hpp
-)
diff --git a/UI/obs.manifest b/UI/obs.manifest
deleted file mode 100644
index b20d07746..000000000
--- a/UI/obs.manifest
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
- OBS Studio
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/UI/obs.rc.in b/UI/obs.rc.in
deleted file mode 100644
index f1f06b697..000000000
--- a/UI/obs.rc.in
+++ /dev/null
@@ -1,26 +0,0 @@
-IDI_ICON1 ICON DISCARDABLE "../cmake/bundle/windows/obs-studio.ico"
-
-1 VERSIONINFO
-FILEVERSION ${UI_VERSION_MAJOR},${UI_VERSION_MINOR},${UI_VERSION_PATCH},0
-BEGIN
- BLOCK "StringFileInfo"
- BEGIN
- BLOCK "040904B0"
- BEGIN
- VALUE "CompanyName", "OBS"
- VALUE "FileDescription", "OBS Studio"
- VALUE "FileVersion", "${UI_VERSION}"
- VALUE "InternalName", "obs"
- VALUE "OriginalFilename", "obs"
- VALUE "ProductName", "OBS Studio"
- VALUE "ProductVersion", "${UI_VERSION}"
- VALUE "Comments", "Free and open source software for video recording and live streaming"
- VALUE "LegalCopyright", "(C) Lain Bailey"
- END
- END
-
- BLOCK "VarFileInfo"
- BEGIN
- VALUE "Translation", 0x0409, 0x04B0
- END
-END
diff --git a/UI/CMakeLists.txt b/frontend/CMakeLists.txt
similarity index 55%
rename from UI/CMakeLists.txt
rename to frontend/CMakeLists.txt
index 0917c82c8..380941569 100644
--- a/UI/CMakeLists.txt
+++ b/frontend/CMakeLists.txt
@@ -1,10 +1,10 @@
cmake_minimum_required(VERSION 3.28...3.30)
-add_subdirectory(obs-frontend-api)
+add_subdirectory(api)
-option(ENABLE_UI "Enable building with UI (requires Qt)" ON)
+option(ENABLE_FRONTEND "Enable building with UI frontend (requires Qt6)" ON)
-if(NOT ENABLE_UI)
+if(NOT ENABLE_FRONTEND)
target_disable_feature(obs "User Interface")
return()
else()
@@ -15,11 +15,15 @@ find_package(FFmpeg REQUIRED COMPONENTS avcodec avutil avformat)
find_package(CURL REQUIRED)
if(NOT TARGET OBS::json11)
- add_subdirectory("${CMAKE_SOURCE_DIR}/deps/json11" "${CMAKE_BINARY_DIR}/deps/json11")
+ add_subdirectory("${CMAKE_SOURCE_DIR}/deps/json11" json11)
+endif()
+
+if(NOT TARGET OBS::libobs)
+ add_subdirectory("${CMAKE_SOURCE_DIR}/libobs" libobs)
endif()
if(NOT TARGET OBS::bpm)
- add_subdirectory("${CMAKE_SOURCE_DIR}/shared/bpm" "${CMAKE_BINARY_DIR}/shared/bpm")
+ add_subdirectory("${CMAKE_SOURCE_DIR}/shared/bpm" bpm)
endif()
add_executable(obs-studio)
@@ -32,17 +36,23 @@ target_link_libraries(
FFmpeg::avcodec
FFmpeg::avutil
FFmpeg::avformat
- OBS::bpm
OBS::libobs
OBS::frontend-api
OBS::json11
+ OBS::bpm
)
-include(cmake/ui-qt.cmake)
-include(cmake/ui-elements.cmake)
-include(cmake/ui-windows.cmake)
+include(cmake/ui-components.cmake)
+include(cmake/ui-dialogs.cmake)
+include(cmake/ui-docks.cmake)
include(cmake/feature-importers.cmake)
+include(cmake/ui-oauth.cmake)
include(cmake/feature-browserpanels.cmake)
+include(cmake/ui-qt.cmake)
+include(cmake/ui-settings.cmake)
+include(cmake/ui-utility.cmake)
+include(cmake/ui-widgets.cmake)
+include(cmake/ui-wizards.cmake)
if(NOT OAUTH_BASE_URL)
set(OAUTH_BASE_URL "https://auth.obsproject.com/" CACHE STRING "Default OAuth base URL")
@@ -53,56 +63,13 @@ include(cmake/feature-restream.cmake)
include(cmake/feature-youtube.cmake)
include(cmake/feature-whatsnew.cmake)
-add_subdirectory(frontend-plugins)
+add_subdirectory(plugins)
-configure_file(ui-config.h.in ui-config.h)
+configure_file(cmake/templates/ui-config.h.in ui-config.h)
target_sources(
obs-studio
- PRIVATE
- api-interface.cpp
- auth-base.cpp
- auth-base.hpp
- auth-listener.cpp
- auth-listener.hpp
- auth-oauth.cpp
- auth-oauth.hpp
- display-helpers.hpp
- ffmpeg-utils.cpp
- ffmpeg-utils.hpp
- multiview.cpp
- multiview.hpp
- obf.c
- obf.h
- obs-app-theming.cpp
- obs-app-theming.hpp
- obs-app.cpp
- obs-app.hpp
- obs-proxy-style.cpp
- obs-proxy-style.hpp
- platform.hpp
- qt-display.cpp
- qt-display.hpp
- ui-config.h
- ui-validation.cpp
- ui-validation.hpp
-)
-
-target_sources(
- obs-studio
- PRIVATE
- goliveapi-censoredjson.cpp
- goliveapi-censoredjson.hpp
- goliveapi-network.cpp
- goliveapi-network.hpp
- goliveapi-postdata.cpp
- goliveapi-postdata.hpp
- models/multitrack-video.hpp
- multitrack-video-error.cpp
- multitrack-video-error.hpp
- multitrack-video-output.cpp
- multitrack-video-output.hpp
- system-info.hpp
+ PRIVATE obs-main.cpp OBSStudioAPI.cpp OBSStudioAPI.hpp OBSApp.cpp OBSApp.hpp OBSApp_Themes.cpp ui-config.h
)
if(OS_WINDOWS)
@@ -132,4 +99,18 @@ get_property(obs_module_list GLOBAL PROPERTY OBS_MODULES_ENABLED)
list(JOIN obs_module_list "|" SAFE_MODULES)
target_compile_definitions(obs-studio PRIVATE "SAFE_MODULES=\"${SAFE_MODULES}\"")
+get_target_property(target_sources obs-studio SOURCES)
+set(target_cpp_sources ${target_sources})
+set(target_hpp_sources ${target_sources})
+set(target_qt_sources ${target_sources})
+list(FILTER target_cpp_sources INCLUDE REGEX ".+\\.(cpp|mm|c|m)")
+list(SORT target_cpp_sources COMPARE NATURAL CASE SENSITIVE ORDER ASCENDING)
+list(FILTER target_hpp_sources INCLUDE REGEX ".+\\.(hpp|h)")
+list(SORT target_hpp_sources COMPARE NATURAL CASE SENSITIVE ORDER ASCENDING)
+list(FILTER target_qt_sources INCLUDE REGEX ".+\\.(ui|qrc)")
+list(SORT target_qt_sources COMPARE NATURAL CASE SENSITIVE ORDER ASCENDING)
+source_group(TREE "${CMAKE_CURRENT_SOURCE_DIR}" PREFIX "Source Files" FILES ${target_cpp_sources})
+source_group(TREE "${CMAKE_CURRENT_SOURCE_DIR}" PREFIX "Header Files" FILES ${target_hpp_sources})
+source_group(TREE "${CMAKE_CURRENT_SOURCE_DIR}" PREFIX "Qt Files" FILES ${target_qt_sources})
+
set_target_properties_obs(obs-studio PROPERTIES FOLDER frontend OUTPUT_NAME "$,obs64,obs>")
diff --git a/frontend/cmake/feature-browserpanels.cmake b/frontend/cmake/feature-browserpanels.cmake
new file mode 100644
index 000000000..04c36695b
--- /dev/null
+++ b/frontend/cmake/feature-browserpanels.cmake
@@ -0,0 +1,18 @@
+if(TARGET OBS::browser-panels)
+ target_enable_feature(obs-studio "Browser panels" BROWSER_AVAILABLE)
+
+ target_link_libraries(obs-studio PRIVATE OBS::browser-panels)
+
+ target_sources(
+ obs-studio
+ PRIVATE
+ dialogs/OBSExtraBrowsers.cpp
+ dialogs/OBSExtraBrowsers.hpp
+ docks/BrowserDock.cpp
+ docks/BrowserDock.hpp
+ utility/ExtraBrowsersDelegate.cpp
+ utility/ExtraBrowsersDelegate.hpp
+ utility/ExtraBrowsersModel.cpp
+ utility/ExtraBrowsersModel.hpp
+ )
+endif()
diff --git a/frontend/cmake/feature-importers.cmake b/frontend/cmake/feature-importers.cmake
new file mode 100644
index 000000000..b4f54eaca
--- /dev/null
+++ b/frontend/cmake/feature-importers.cmake
@@ -0,0 +1,16 @@
+target_sources(
+ obs-studio
+ PRIVATE
+ importer/ImporterEntryPathItemDelegate.cpp
+ importer/ImporterEntryPathItemDelegate.hpp
+ importer/ImporterModel.cpp
+ importer/ImporterModel.hpp
+ importer/OBSImporter.cpp
+ importer/OBSImporter.hpp
+ importers/classic.cpp
+ importers/importers.cpp
+ importers/importers.hpp
+ importers/sl.cpp
+ importers/studio.cpp
+ importers/xsplit.cpp
+)
diff --git a/UI/cmake/feature-macos-update.cmake b/frontend/cmake/feature-macos-update.cmake
similarity index 51%
rename from UI/cmake/feature-macos-update.cmake
rename to frontend/cmake/feature-macos-update.cmake
index 7c6327792..da654babf 100644
--- a/UI/cmake/feature-macos-update.cmake
+++ b/frontend/cmake/feature-macos-update.cmake
@@ -9,14 +9,16 @@ endif()
target_sources(
obs-studio
PRIVATE
- update/crypto-helpers-mac.mm
- update/crypto-helpers.hpp
- update/models/branches.hpp
- update/models/whatsnew.hpp
- update/shared-update.cpp
- update/shared-update.hpp
- update/update-helpers.cpp
- update/update-helpers.hpp
+ utility/crypto-helpers-mac.mm
+ utility/crypto-helpers.hpp
+ utility/models/branches.hpp
+ utility/models/whatsnew.hpp
+ utility/update-helpers.cpp
+ utility/update-helpers.hpp
+ utility/WhatsNewBrowserInitThread.cpp
+ utility/WhatsNewBrowserInitThread.hpp
+ utility/WhatsNewInfoThread.cpp
+ utility/WhatsNewInfoThread.hpp
)
target_link_libraries(
diff --git a/UI/cmake/feature-restream.cmake b/frontend/cmake/feature-restream.cmake
similarity index 78%
rename from UI/cmake/feature-restream.cmake
rename to frontend/cmake/feature-restream.cmake
index 65847a1ab..5e77f75dd 100644
--- a/UI/cmake/feature-restream.cmake
+++ b/frontend/cmake/feature-restream.cmake
@@ -1,5 +1,5 @@
if(RESTREAM_CLIENTID AND RESTREAM_HASH MATCHES "^(0|[a-fA-F0-9]+)$" AND TARGET OBS::browser-panels)
- target_sources(obs-studio PRIVATE auth-restream.cpp auth-restream.hpp)
+ target_sources(obs-studio PRIVATE oauth/RestreamAuth.cpp oauth/RestreamAuth.hpp)
target_enable_feature(obs-studio "Restream API connection" RESTREAM_ENABLED)
else()
target_disable_feature(obs-studio "Restream API connection")
diff --git a/UI/cmake/feature-sparkle.cmake b/frontend/cmake/feature-sparkle.cmake
similarity index 65%
rename from UI/cmake/feature-sparkle.cmake
rename to frontend/cmake/feature-sparkle.cmake
index eb9fe7d92..3c9935702 100644
--- a/UI/cmake/feature-sparkle.cmake
+++ b/frontend/cmake/feature-sparkle.cmake
@@ -1,8 +1,17 @@
if(SPARKLE_APPCAST_URL AND SPARKLE_PUBLIC_KEY)
find_library(SPARKLE Sparkle)
mark_as_advanced(SPARKLE)
- target_sources(obs-studio PRIVATE update/mac-update.cpp update/mac-update.hpp update/sparkle-updater.mm)
- set_source_files_properties(update/sparkle-updater.mm PROPERTIES COMPILE_FLAGS -fobjc-arc)
+ target_sources(
+ obs-studio
+ PRIVATE
+ utility/MacUpdateThread.cpp
+ utility/MacUpdateThread.hpp
+ utility/OBSSparkle.hpp
+ utility/OBSSparkle.mm
+ utility/OBSUpdateDelegate.h
+ utility/OBSUpdateDelegate.mm
+ )
+ set_source_files_properties(utility/OBSSparkle.mm PROPERTIES COMPILE_FLAGS -fobjc-arc)
target_link_libraries(obs-studio PRIVATE "$")
diff --git a/UI/cmake/feature-twitch.cmake b/frontend/cmake/feature-twitch.cmake
similarity index 78%
rename from UI/cmake/feature-twitch.cmake
rename to frontend/cmake/feature-twitch.cmake
index b8415749f..663c48e05 100644
--- a/UI/cmake/feature-twitch.cmake
+++ b/frontend/cmake/feature-twitch.cmake
@@ -1,5 +1,5 @@
if(TWITCH_CLIENTID AND TWITCH_HASH MATCHES "^(0|[a-fA-F0-9]+)$" AND TARGET OBS::browser-panels)
- target_sources(obs-studio PRIVATE auth-twitch.cpp auth-twitch.hpp)
+ target_sources(obs-studio PRIVATE oauth/TwitchAuth.cpp oauth/TwitchAuth.hpp)
target_enable_feature(obs-studio "Twitch API connection" TWITCH_ENABLED)
else()
target_disable_feature(obs-studio "Twitch API connection")
diff --git a/UI/cmake/feature-whatsnew.cmake b/frontend/cmake/feature-whatsnew.cmake
similarity index 68%
rename from UI/cmake/feature-whatsnew.cmake
rename to frontend/cmake/feature-whatsnew.cmake
index 8e6771821..c7afb49a9 100644
--- a/UI/cmake/feature-whatsnew.cmake
+++ b/frontend/cmake/feature-whatsnew.cmake
@@ -20,13 +20,15 @@ if(ENABLE_WHATSNEW AND TARGET OBS::browser-panels)
target_sources(
obs-studio
PRIVATE
- update/crypto-helpers-mbedtls.cpp
- update/crypto-helpers.hpp
- update/models/whatsnew.hpp
- update/shared-update.cpp
- update/shared-update.hpp
- update/update-helpers.cpp
- update/update-helpers.hpp
+ utility/crypto-helpers-mbedtls.cpp
+ utility/crypto-helpers.hpp
+ utility/models/whatsnew.hpp
+ utility/update-helpers.cpp
+ utility/update-helpers.hpp
+ utility/WhatsNewBrowserInitThread.cpp
+ utility/WhatsNewBrowserInitThread.hpp
+ utility/WhatsNewInfoThread.cpp
+ utility/WhatsNewInfoThread.hpp
)
endif()
diff --git a/UI/cmake/feature-youtube.cmake b/frontend/cmake/feature-youtube.cmake
similarity index 55%
rename from UI/cmake/feature-youtube.cmake
rename to frontend/cmake/feature-youtube.cmake
index 4db0e31ad..be87b509f 100644
--- a/UI/cmake/feature-youtube.cmake
+++ b/frontend/cmake/feature-youtube.cmake
@@ -8,14 +8,17 @@ if(
target_sources(
obs-studio
PRIVATE
- auth-youtube.cpp
- auth-youtube.hpp
- window-dock-youtube-app.cpp
- window-dock-youtube-app.hpp
- window-youtube-actions.cpp
- window-youtube-actions.hpp
- youtube-api-wrappers.cpp
- youtube-api-wrappers.hpp
+ dialogs/OBSYoutubeActions.cpp
+ dialogs/OBSYoutubeActions.hpp
+ docks/YouTubeAppDock.cpp
+ docks/YouTubeAppDock.hpp
+ docks/YouTubeChatDock.cpp
+ docks/YouTubeChatDock.hpp
+ forms/OBSYoutubeActions.ui
+ oauth/YoutubeAuth.cpp
+ oauth/YoutubeAuth.hpp
+ utility/YoutubeApiWrappers.cpp
+ utility/YoutubeApiWrappers.hpp
)
target_enable_feature(obs-studio "YouTube API connection" YOUTUBE_ENABLED)
diff --git a/UI/cmake/linux/com.obsproject.Studio.desktop b/frontend/cmake/linux/com.obsproject.Studio.desktop
similarity index 100%
rename from UI/cmake/linux/com.obsproject.Studio.desktop
rename to frontend/cmake/linux/com.obsproject.Studio.desktop
diff --git a/UI/cmake/linux/com.obsproject.Studio.metainfo.xml.in b/frontend/cmake/linux/com.obsproject.Studio.metainfo.xml.in
similarity index 100%
rename from UI/cmake/linux/com.obsproject.Studio.metainfo.xml.in
rename to frontend/cmake/linux/com.obsproject.Studio.metainfo.xml.in
diff --git a/UI/cmake/linux/icons/obs-logo-128.png b/frontend/cmake/linux/icons/obs-logo-128.png
similarity index 100%
rename from UI/cmake/linux/icons/obs-logo-128.png
rename to frontend/cmake/linux/icons/obs-logo-128.png
diff --git a/UI/cmake/linux/icons/obs-logo-256.png b/frontend/cmake/linux/icons/obs-logo-256.png
similarity index 100%
rename from UI/cmake/linux/icons/obs-logo-256.png
rename to frontend/cmake/linux/icons/obs-logo-256.png
diff --git a/UI/cmake/linux/icons/obs-logo-512.png b/frontend/cmake/linux/icons/obs-logo-512.png
similarity index 100%
rename from UI/cmake/linux/icons/obs-logo-512.png
rename to frontend/cmake/linux/icons/obs-logo-512.png
diff --git a/UI/cmake/linux/icons/obs-logo-scalable.svg b/frontend/cmake/linux/icons/obs-logo-scalable.svg
similarity index 100%
rename from UI/cmake/linux/icons/obs-logo-scalable.svg
rename to frontend/cmake/linux/icons/obs-logo-scalable.svg
diff --git a/UI/cmake/macos/Assets.xcassets/AppIcon.appiconset/Contents.json b/frontend/cmake/macos/Assets.xcassets/AppIcon.appiconset/Contents.json
similarity index 100%
rename from UI/cmake/macos/Assets.xcassets/AppIcon.appiconset/Contents.json
rename to frontend/cmake/macos/Assets.xcassets/AppIcon.appiconset/Contents.json
diff --git a/UI/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_128x128.png b/frontend/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_128x128.png
similarity index 100%
rename from UI/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_128x128.png
rename to frontend/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_128x128.png
diff --git a/UI/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png b/frontend/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png
similarity index 100%
rename from UI/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png
rename to frontend/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png
diff --git a/UI/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_16x16.png b/frontend/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_16x16.png
similarity index 100%
rename from UI/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_16x16.png
rename to frontend/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_16x16.png
diff --git a/UI/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png b/frontend/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png
similarity index 100%
rename from UI/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png
rename to frontend/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png
diff --git a/UI/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_256x256.png b/frontend/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_256x256.png
similarity index 100%
rename from UI/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_256x256.png
rename to frontend/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_256x256.png
diff --git a/UI/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png b/frontend/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png
similarity index 100%
rename from UI/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png
rename to frontend/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png
diff --git a/UI/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_32x32.png b/frontend/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_32x32.png
similarity index 100%
rename from UI/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_32x32.png
rename to frontend/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_32x32.png
diff --git a/UI/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png b/frontend/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png
similarity index 100%
rename from UI/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png
rename to frontend/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png
diff --git a/UI/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_512x512.png b/frontend/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_512x512.png
similarity index 100%
rename from UI/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_512x512.png
rename to frontend/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_512x512.png
diff --git a/UI/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png b/frontend/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png
similarity index 100%
rename from UI/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png
rename to frontend/cmake/macos/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png
diff --git a/UI/cmake/macos/Assets.xcassets/Contents.json b/frontend/cmake/macos/Assets.xcassets/Contents.json
similarity index 100%
rename from UI/cmake/macos/Assets.xcassets/Contents.json
rename to frontend/cmake/macos/Assets.xcassets/Contents.json
diff --git a/UI/cmake/macos/Info.plist.in b/frontend/cmake/macos/Info.plist.in
similarity index 100%
rename from UI/cmake/macos/Info.plist.in
rename to frontend/cmake/macos/Info.plist.in
diff --git a/UI/cmake/macos/entitlements-extension.plist b/frontend/cmake/macos/entitlements-extension.plist
similarity index 100%
rename from UI/cmake/macos/entitlements-extension.plist
rename to frontend/cmake/macos/entitlements-extension.plist
diff --git a/UI/cmake/macos/entitlements.plist b/frontend/cmake/macos/entitlements.plist
similarity index 100%
rename from UI/cmake/macos/entitlements.plist
rename to frontend/cmake/macos/entitlements.plist
diff --git a/UI/cmake/macos/exportOptions-extension.plist.in b/frontend/cmake/macos/exportOptions-extension.plist.in
similarity index 100%
rename from UI/cmake/macos/exportOptions-extension.plist.in
rename to frontend/cmake/macos/exportOptions-extension.plist.in
diff --git a/UI/cmake/macos/exportOptions.plist.in b/frontend/cmake/macos/exportOptions.plist.in
similarity index 100%
rename from UI/cmake/macos/exportOptions.plist.in
rename to frontend/cmake/macos/exportOptions.plist.in
diff --git a/UI/cmake/macos/qt.conf b/frontend/cmake/macos/qt.conf
similarity index 100%
rename from UI/cmake/macos/qt.conf
rename to frontend/cmake/macos/qt.conf
diff --git a/UI/cmake/os-freebsd.cmake b/frontend/cmake/os-freebsd.cmake
similarity index 92%
rename from UI/cmake/os-freebsd.cmake
rename to frontend/cmake/os-freebsd.cmake
index 93544ad16..d06d73874 100644
--- a/UI/cmake/os-freebsd.cmake
+++ b/frontend/cmake/os-freebsd.cmake
@@ -1,9 +1,7 @@
-target_sources(obs-studio PRIVATE platform-x11.cpp)
+target_sources(obs-studio PRIVATE utility/platform-x11.cpp utility/system-info-posix.cpp)
target_compile_definitions(obs-studio PRIVATE OBS_INSTALL_PREFIX="${OBS_INSTALL_PREFIX}")
target_link_libraries(obs-studio PRIVATE Qt::GuiPrivate Qt::DBus procstat)
-target_sources(obs-studio PRIVATE system-info-posix.cpp)
-
if(TARGET OBS::python)
find_package(Python REQUIRED COMPONENTS Interpreter Development)
target_link_libraries(obs-studio PRIVATE Python::Python)
diff --git a/UI/cmake/os-linux.cmake b/frontend/cmake/os-linux.cmake
similarity index 95%
rename from UI/cmake/os-linux.cmake
rename to frontend/cmake/os-linux.cmake
index ce9f873d7..a32a3312e 100644
--- a/UI/cmake/os-linux.cmake
+++ b/frontend/cmake/os-linux.cmake
@@ -1,12 +1,10 @@
-target_sources(obs-studio PRIVATE platform-x11.cpp)
+target_sources(obs-studio PRIVATE utility/platform-x11.cpp utility/system-info-posix.cpp)
target_compile_definitions(
obs-studio
PRIVATE OBS_INSTALL_PREFIX="${OBS_INSTALL_PREFIX}" $<$:ENABLE_PORTABLE_CONFIG>
)
target_link_libraries(obs-studio PRIVATE Qt::GuiPrivate Qt::DBus)
-target_sources(obs-studio PRIVATE system-info-posix.cpp)
-
if(TARGET OBS::python)
find_package(Python REQUIRED COMPONENTS Interpreter Development)
target_link_libraries(obs-studio PRIVATE Python::Python)
diff --git a/UI/cmake/os-macos.cmake b/frontend/cmake/os-macos.cmake
similarity index 75%
rename from UI/cmake/os-macos.cmake
rename to frontend/cmake/os-macos.cmake
index a965f1bff..0bd51c923 100644
--- a/UI/cmake/os-macos.cmake
+++ b/frontend/cmake/os-macos.cmake
@@ -1,10 +1,16 @@
include(cmake/feature-sparkle.cmake)
-target_sources(obs-studio PRIVATE platform-osx.mm forms/OBSPermissions.ui window-permissions.cpp window-permissions.hpp)
+target_sources(
+ obs-studio
+ PRIVATE
+ dialogs/OBSPermissions.cpp
+ dialogs/OBSPermissions.hpp
+ forms/OBSPermissions.ui
+ utility/platform-osx.mm
+ utility/system-info-macos.mm
+)
target_compile_options(obs-studio PRIVATE -Wno-quoted-include-in-framework-header -Wno-comma)
-target_sources(obs-studio PRIVATE system-info-macos.mm)
-
set_source_files_properties(platform-osx.mm PROPERTIES COMPILE_FLAGS -fobjc-arc)
if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 14.0.3)
diff --git a/UI/cmake/os-windows.cmake b/frontend/cmake/os-windows.cmake
similarity index 57%
rename from UI/cmake/os-windows.cmake
rename to frontend/cmake/os-windows.cmake
index f781c9db5..9c77a0263 100644
--- a/UI/cmake/os-windows.cmake
+++ b/frontend/cmake/os-windows.cmake
@@ -18,42 +18,48 @@ target_sources(
obs-studio
PRIVATE
cmake/windows/obs.manifest
+ dialogs/OBSUpdate.cpp
+ dialogs/OBSUpdate.hpp
+ forms/OBSUpdate.ui
obs.rc
- platform-windows.cpp
- update/crypto-helpers-mbedtls.cpp
- update/crypto-helpers.hpp
- update/models/branches.hpp
- update/models/whatsnew.hpp
- update/shared-update.cpp
- update/shared-update.hpp
- update/update-helpers.cpp
- update/update-helpers.hpp
- update/update-window.cpp
- update/update-window.hpp
- update/win-update.cpp
- update/win-update.hpp
- win-dll-blocklist.c
- win-update/updater/manifest.hpp
+ utility/AutoUpdateThread.cpp
+ utility/AutoUpdateThread.hpp
+ utility/crypto-helpers-mbedtls.cpp
+ utility/crypto-helpers.hpp
+ utility/models/branches.hpp
+ utility/models/whatsnew.hpp
+ utility/platform-windows.cpp
+ utility/system-info-windows.cpp
+ utility/update-helpers.cpp
+ utility/update-helpers.hpp
+ utility/WhatsNewBrowserInitThread.cpp
+ utility/WhatsNewBrowserInitThread.hpp
+ utility/WhatsNewInfoThread.cpp
+ utility/WhatsNewInfoThread.hpp
+ utility/win-dll-blocklist.c
)
-target_sources(obs-studio PRIVATE system-info-windows.cpp)
+add_library(obs-updater-manifest INTERFACE)
+add_library(OBS::updater-manifest ALIAS obs-updater-manifest)
+
+target_sources(obs-updater-manifest INTERFACE updater/manifest.hpp)
target_link_libraries(
obs-studio
- PRIVATE crypt32 OBS::blake2 OBS::w32-pthreads MbedTLS::mbedtls nlohmann_json::nlohmann_json Detours::Detours
+ PRIVATE
+ crypt32
+ OBS::blake2
+ OBS::updater-manifest
+ OBS::w32-pthreads
+ MbedTLS::mbedtls
+ nlohmann_json::nlohmann_json
+ Detours::Detours
)
target_compile_definitions(obs-studio PRIVATE PSAPI_VERSION=2)
target_link_options(obs-studio PRIVATE /IGNORE:4099 $<$:/NODEFAULTLIB:MSVCRT>)
-add_library(obs-update-helpers INTERFACE)
-add_library(OBS::update-helpers ALIAS obs-update-helpers)
-
-target_sources(obs-update-helpers INTERFACE win-update/win-update-helpers.cpp win-update/win-update-helpers.hpp)
-
-target_include_directories(obs-update-helpers INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/win-update")
-
# Set commit for untagged version comparisons in the Windows updater
if(OBS_VERSION MATCHES ".+g[a-f0-9]+.*")
string(REGEX REPLACE ".+g([a-f0-9]+).*$" "\\1" OBS_COMMIT ${OBS_VERSION})
@@ -61,9 +67,9 @@ else()
set(OBS_COMMIT "")
endif()
-set_source_files_properties(update/win-update.cpp PROPERTIES COMPILE_DEFINITIONS OBS_COMMIT="${OBS_COMMIT}")
+set_source_files_properties(utility/AutoUpdateThread.cpp PROPERTIES COMPILE_DEFINITIONS OBS_COMMIT="${OBS_COMMIT}")
-add_subdirectory(win-update/updater)
+add_subdirectory(updater)
set_property(TARGET obs-studio APPEND PROPERTY AUTORCC_OPTIONS --format-version 1)
diff --git a/UI/ui-config.h.in b/frontend/cmake/templates/ui-config.h.in
similarity index 100%
rename from UI/ui-config.h.in
rename to frontend/cmake/templates/ui-config.h.in
diff --git a/frontend/cmake/ui-components.cmake b/frontend/cmake/ui-components.cmake
new file mode 100644
index 000000000..acea2d66c
--- /dev/null
+++ b/frontend/cmake/ui-components.cmake
@@ -0,0 +1,85 @@
+if(NOT TARGET OBS::qt-slider-ignorewheel)
+ add_subdirectory(
+ "${CMAKE_SOURCE_DIR}/shared/qt/slider-ignorewheel"
+ "${CMAKE_BINARY_DIR}/shared/qt/slider-ignorewheel"
+ )
+endif()
+
+target_link_libraries(obs-studio PRIVATE OBS::qt-slider-ignorewheel)
+
+target_sources(
+ obs-studio
+ PRIVATE
+ components/AbsoluteSlider.cpp
+ components/AbsoluteSlider.hpp
+ components/ApplicationAudioCaptureToolbar.cpp
+ components/ApplicationAudioCaptureToolbar.hpp
+ components/AudioCaptureToolbar.cpp
+ components/AudioCaptureToolbar.hpp
+ components/BalanceSlider.hpp
+ components/BrowserToolbar.cpp
+ components/BrowserToolbar.hpp
+ components/ClickableLabel.hpp
+ components/ColorSourceToolbar.cpp
+ components/ColorSourceToolbar.hpp
+ components/ComboSelectToolbar.cpp
+ components/ComboSelectToolbar.hpp
+ components/DelButton.hpp
+ components/DeviceCaptureToolbar.cpp
+ components/DeviceCaptureToolbar.hpp
+ components/DisplayCaptureToolbar.cpp
+ components/DisplayCaptureToolbar.hpp
+ components/EditWidget.hpp
+ components/FocusList.cpp
+ components/FocusList.hpp
+ components/GameCaptureToolbar.cpp
+ components/GameCaptureToolbar.hpp
+ components/HScrollArea.cpp
+ components/HScrollArea.hpp
+ components/ImageSourceToolbar.cpp
+ components/ImageSourceToolbar.hpp
+ components/MediaControls.cpp
+ components/MediaControls.hpp
+ components/MenuButton.cpp
+ components/MenuButton.hpp
+ components/Multiview.cpp
+ components/Multiview.hpp
+ components/MuteCheckBox.hpp
+ components/NonCheckableButton.hpp
+ components/OBSAdvAudioCtrl.cpp
+ components/OBSAdvAudioCtrl.hpp
+ components/OBSPreviewScalingComboBox.cpp
+ components/OBSPreviewScalingComboBox.hpp
+ components/OBSPreviewScalingLabel.cpp
+ components/OBSPreviewScalingLabel.hpp
+ components/OBSSourceLabel.cpp
+ components/OBSSourceLabel.hpp
+ components/SceneTree.cpp
+ components/SceneTree.hpp
+ components/SilentUpdateCheckBox.hpp
+ components/SilentUpdateSpinBox.hpp
+ components/SourceToolbar.cpp
+ components/SourceToolbar.hpp
+ components/SourceTree.cpp
+ components/SourceTree.hpp
+ components/SourceTreeDelegate.cpp
+ components/SourceTreeDelegate.hpp
+ components/SourceTreeItem.cpp
+ components/SourceTreeItem.hpp
+ components/SourceTreeModel.cpp
+ components/SourceTreeModel.hpp
+ components/TextSourceToolbar.cpp
+ components/TextSourceToolbar.hpp
+ components/UIValidation.cpp
+ components/UIValidation.hpp
+ components/UrlPushButton.cpp
+ components/UrlPushButton.hpp
+ components/VisibilityItemDelegate.cpp
+ components/VisibilityItemDelegate.hpp
+ components/VisibilityItemWidget.cpp
+ components/VisibilityItemWidget.hpp
+ components/VolumeSlider.cpp
+ components/VolumeSlider.hpp
+ components/WindowCaptureToolbar.cpp
+ components/WindowCaptureToolbar.hpp
+)
diff --git a/frontend/cmake/ui-dialogs.cmake b/frontend/cmake/ui-dialogs.cmake
new file mode 100644
index 000000000..dfedb2b21
--- /dev/null
+++ b/frontend/cmake/ui-dialogs.cmake
@@ -0,0 +1,40 @@
+if(NOT TARGET OBS::properties-view)
+ add_subdirectory("${CMAKE_SOURCE_DIR}/shared/properties-view" "${CMAKE_BINARY_DIR}/shared/properties-view")
+endif()
+
+target_link_libraries(obs-studio PRIVATE OBS::properties-view)
+
+target_sources(
+ obs-studio
+ PRIVATE
+ dialogs/NameDialog.cpp
+ dialogs/NameDialog.hpp
+ dialogs/OAuthLogin.cpp
+ dialogs/OAuthLogin.hpp
+ dialogs/OBSAbout.cpp
+ dialogs/OBSAbout.hpp
+ dialogs/OBSBasicAdvAudio.cpp
+ dialogs/OBSBasicAdvAudio.hpp
+ dialogs/OBSBasicFilters.cpp
+ dialogs/OBSBasicFilters.hpp
+ dialogs/OBSBasicInteraction.cpp
+ dialogs/OBSBasicInteraction.hpp
+ dialogs/OBSBasicProperties.cpp
+ dialogs/OBSBasicProperties.hpp
+ dialogs/OBSBasicSourceSelect.cpp
+ dialogs/OBSBasicSourceSelect.hpp
+ dialogs/OBSBasicTransform.cpp
+ dialogs/OBSBasicTransform.hpp
+ dialogs/OBSBasicVCamConfig.cpp
+ dialogs/OBSBasicVCamConfig.hpp
+ dialogs/OBSLogReply.cpp
+ dialogs/OBSLogReply.hpp
+ dialogs/OBSLogViewer.cpp
+ dialogs/OBSLogViewer.hpp
+ dialogs/OBSMissingFiles.cpp
+ dialogs/OBSMissingFiles.hpp
+ dialogs/OBSRemux.cpp
+ dialogs/OBSRemux.hpp
+ dialogs/OBSWhatsNew.cpp
+ dialogs/OBSWhatsNew.hpp
+)
diff --git a/frontend/cmake/ui-docks.cmake b/frontend/cmake/ui-docks.cmake
new file mode 100644
index 000000000..0de10de2a
--- /dev/null
+++ b/frontend/cmake/ui-docks.cmake
@@ -0,0 +1 @@
+target_sources(obs-studio PRIVATE docks/OBSDock.cpp docks/OBSDock.hpp)
diff --git a/frontend/cmake/ui-oauth.cmake b/frontend/cmake/ui-oauth.cmake
new file mode 100644
index 000000000..b48f845e8
--- /dev/null
+++ b/frontend/cmake/ui-oauth.cmake
@@ -0,0 +1,4 @@
+target_sources(
+ obs-studio
+ PRIVATE oauth/Auth.cpp oauth/Auth.hpp oauth/AuthListener.cpp oauth/AuthListener.hpp oauth/OAuth.cpp oauth/OAuth.hpp
+)
diff --git a/frontend/cmake/ui-qt.cmake b/frontend/cmake/ui-qt.cmake
new file mode 100644
index 000000000..c4293e0eb
--- /dev/null
+++ b/frontend/cmake/ui-qt.cmake
@@ -0,0 +1,58 @@
+find_package(Qt6 REQUIRED Widgets Network Svg Xml)
+
+if(OS_LINUX OR OS_FREEBSD OR OS_OPENBSD)
+ find_package(Qt6 REQUIRED Gui DBus)
+endif()
+
+if(NOT TARGET OBS::qt-wrappers)
+ add_subdirectory("${CMAKE_SOURCE_DIR}/shared/qt/wrappers" "${CMAKE_BINARY_DIR}/shared/qt/wrappers")
+endif()
+
+target_link_libraries(
+ obs-studio
+ PRIVATE Qt::Widgets Qt::Svg Qt::Xml Qt::Network OBS::qt-wrappers
+)
+
+set_target_properties(
+ obs-studio
+ PROPERTIES AUTOMOC TRUE AUTOUIC TRUE AUTORCC TRUE AUTOGEN_PARALLEL AUTO
+)
+
+set_property(TARGET obs-studio APPEND PROPERTY AUTOUIC_SEARCH_PATHS forms forms/source-toolbar)
+
+target_sources(
+ obs-studio
+ PRIVATE
+ forms/AutoConfigFinishPage.ui
+ forms/AutoConfigStartPage.ui
+ forms/AutoConfigStartPage.ui
+ forms/AutoConfigStreamPage.ui
+ forms/AutoConfigTestPage.ui
+ forms/AutoConfigVideoPage.ui
+ forms/ColorSelect.ui
+ forms/obs.qrc
+ forms/OBSAbout.ui
+ forms/OBSAdvAudio.ui
+ forms/OBSBasic.ui
+ forms/OBSBasicControls.ui
+ forms/OBSBasicFilters.ui
+ forms/OBSBasicInteraction.ui
+ forms/OBSBasicProperties.ui
+ forms/OBSBasicSettings.ui
+ forms/OBSBasicSourceSelect.ui
+ forms/OBSBasicVCamConfig.ui
+ forms/OBSExtraBrowsers.ui
+ forms/OBSImporter.ui
+ forms/OBSLogReply.ui
+ forms/OBSLogReply.ui
+ forms/OBSMissingFiles.ui
+ forms/OBSRemux.ui
+ forms/source-toolbar/browser-source-toolbar.ui
+ forms/source-toolbar/color-source-toolbar.ui
+ forms/source-toolbar/device-select-toolbar.ui
+ forms/source-toolbar/game-capture-toolbar.ui
+ forms/source-toolbar/image-source-toolbar.ui
+ forms/source-toolbar/media-controls.ui
+ forms/source-toolbar/text-source-toolbar.ui
+ forms/StatusBarWidget.ui
+)
diff --git a/frontend/cmake/ui-settings.cmake b/frontend/cmake/ui-settings.cmake
new file mode 100644
index 000000000..cea9e5d52
--- /dev/null
+++ b/frontend/cmake/ui-settings.cmake
@@ -0,0 +1,15 @@
+target_sources(
+ obs-studio
+ PRIVATE
+ settings/OBSBasicSettings_A11y.cpp
+ settings/OBSBasicSettings_Appearance.cpp
+ settings/OBSBasicSettings_Stream.cpp
+ settings/OBSBasicSettings.cpp
+ settings/OBSBasicSettings.hpp
+ settings/OBSHotkeyEdit.cpp
+ settings/OBSHotkeyEdit.hpp
+ settings/OBSHotkeyLabel.cpp
+ settings/OBSHotkeyLabel.hpp
+ settings/OBSHotkeyWidget.cpp
+ settings/OBSHotkeyWidget.hpp
+)
diff --git a/frontend/cmake/ui-utility.cmake b/frontend/cmake/ui-utility.cmake
new file mode 100644
index 000000000..88535faff
--- /dev/null
+++ b/frontend/cmake/ui-utility.cmake
@@ -0,0 +1,69 @@
+target_sources(
+ obs-studio
+ PRIVATE
+ utility/AdvancedOutput.cpp
+ utility/AdvancedOutput.hpp
+ utility/audio-encoders.cpp
+ utility/audio-encoders.hpp
+ utility/BaseLexer.hpp
+ utility/BasicOutputHandler.cpp
+ utility/BasicOutputHandler.hpp
+ utility/display-helpers.hpp
+ utility/FFmpegCodec.cpp
+ utility/FFmpegCodec.hpp
+ utility/FFmpegFormat.cpp
+ utility/FFmpegFormat.hpp
+ utility/FFmpegShared.hpp
+ utility/GoLiveAPI_CensoredJson.cpp
+ utility/GoLiveAPI_CensoredJson.hpp
+ utility/GoLiveAPI_Network.cpp
+ utility/GoLiveAPI_Network.hpp
+ utility/GoLiveAPI_PostData.cpp
+ utility/GoLiveAPI_PostData.hpp
+ utility/item-widget-helpers.cpp
+ utility/item-widget-helpers.hpp
+ utility/MissingFilesModel.cpp
+ utility/MissingFilesModel.hpp
+ utility/MissingFilesPathItemDelegate.cpp
+ utility/MissingFilesPathItemDelegate.hpp
+ utility/models/multitrack-video.hpp
+ utility/MultitrackVideoError.cpp
+ utility/MultitrackVideoError.hpp
+ utility/MultitrackVideoOutput.cpp
+ utility/MultitrackVideoOutput.hpp
+ utility/obf.c
+ utility/obf.h
+ utility/OBSEventFilter.hpp
+ utility/OBSProxyStyle.cpp
+ utility/OBSProxyStyle.hpp
+ utility/OBSTheme.hpp
+ utility/OBSThemeVariable.hpp
+ utility/OBSTranslator.cpp
+ utility/OBSTranslator.hpp
+ utility/platform.hpp
+ utility/QuickTransition.cpp
+ utility/QuickTransition.hpp
+ utility/RemoteTextThread.cpp
+ utility/RemoteTextThread.hpp
+ utility/RemuxEntryPathItemDelegate.cpp
+ utility/RemuxEntryPathItemDelegate.hpp
+ utility/RemuxQueueModel.cpp
+ utility/RemuxQueueModel.hpp
+ utility/RemuxWorker.cpp
+ utility/RemuxWorker.hpp
+ utility/SceneRenameDelegate.cpp
+ utility/SceneRenameDelegate.hpp
+ utility/ScreenshotObj.cpp
+ utility/ScreenshotObj.hpp
+ utility/SettingsEventFilter.hpp
+ utility/SimpleOutput.cpp
+ utility/SimpleOutput.hpp
+ utility/StartMultiTrackVideoStreamingGuard.hpp
+ utility/SurfaceEventFilter.hpp
+ utility/system-info.hpp
+ utility/undo_stack.cpp
+ utility/undo_stack.hpp
+ utility/VCamConfig.hpp
+ utility/VolumeMeterTimer.cpp
+ utility/VolumeMeterTimer.hpp
+)
diff --git a/frontend/cmake/ui-widgets.cmake b/frontend/cmake/ui-widgets.cmake
new file mode 100644
index 000000000..20befdeb0
--- /dev/null
+++ b/frontend/cmake/ui-widgets.cmake
@@ -0,0 +1,66 @@
+if(NOT TARGET OBS::qt-vertical-scroll-area)
+ add_subdirectory(
+ "${CMAKE_SOURCE_DIR}/shared/qt/vertical-scroll-area"
+ "${CMAKE_BINARY_DIR}/shared/qt/vertical-scroll-area"
+ )
+endif()
+
+target_link_libraries(obs-studio PRIVATE OBS::qt-vertical-scroll-area)
+
+target_sources(
+ obs-studio
+ PRIVATE
+ widgets/ColorSelect.cpp
+ widgets/ColorSelect.hpp
+ widgets/OBSBasic.cpp
+ widgets/OBSBasic.hpp
+ widgets/OBSBasic_Browser.cpp
+ widgets/OBSBasic_Clipboard.cpp
+ widgets/OBSBasic_ContextToolbar.cpp
+ widgets/OBSBasic_Docks.cpp
+ widgets/OBSBasic_Dropfiles.cpp
+ widgets/OBSBasic_Hotkeys.cpp
+ widgets/OBSBasic_Icons.cpp
+ widgets/OBSBasic_MainControls.cpp
+ widgets/OBSBasic_OutputHandler.cpp
+ widgets/OBSBasic_Preview.cpp
+ widgets/OBSBasic_Profiles.cpp
+ widgets/OBSBasic_Projectors.cpp
+ widgets/OBSBasic_Recording.cpp
+ widgets/OBSBasic_ReplayBuffer.cpp
+ widgets/OBSBasic_SceneCollections.cpp
+ widgets/OBSBasic_SceneItems.cpp
+ widgets/OBSBasic_Scenes.cpp
+ widgets/OBSBasic_Screenshots.cpp
+ widgets/OBSBasic_Service.cpp
+ widgets/OBSBasic_StatusBar.cpp
+ widgets/OBSBasic_Streaming.cpp
+ widgets/OBSBasic_StudioMode.cpp
+ widgets/OBSBasic_SysTray.cpp
+ widgets/OBSBasic_Transitions.cpp
+ widgets/OBSBasic_Updater.cpp
+ widgets/OBSBasic_VirtualCam.cpp
+ widgets/OBSBasic_VolControl.cpp
+ widgets/OBSBasic_YouTube.cpp
+ widgets/OBSBasicControls.cpp
+ widgets/OBSBasicControls.hpp
+ widgets/OBSBasicPreview.cpp
+ widgets/OBSBasicPreview.hpp
+ widgets/OBSBasicStats.cpp
+ widgets/OBSBasicStats.hpp
+ widgets/OBSBasicStatusBar.cpp
+ widgets/OBSBasicStatusBar.hpp
+ widgets/OBSMainWindow.hpp
+ widgets/OBSProjector.cpp
+ widgets/OBSProjector.hpp
+ widgets/OBSQTDisplay.cpp
+ widgets/OBSQTDisplay.hpp
+ widgets/StatusBarWidget.cpp
+ widgets/StatusBarWidget.hpp
+ widgets/VolControl.cpp
+ widgets/VolControl.hpp
+ widgets/VolumeAccessibleInterface.cpp
+ widgets/VolumeAccessibleInterface.hpp
+ widgets/VolumeMeter.cpp
+ widgets/VolumeMeter.hpp
+)
diff --git a/frontend/cmake/ui-wizards.cmake b/frontend/cmake/ui-wizards.cmake
new file mode 100644
index 000000000..2dfc3f647
--- /dev/null
+++ b/frontend/cmake/ui-wizards.cmake
@@ -0,0 +1,15 @@
+target_sources(
+ obs-studio
+ PRIVATE
+ wizards/AutoConfig.cpp
+ wizards/AutoConfig.hpp
+ wizards/AutoConfigStartPage.cpp
+ wizards/AutoConfigStartPage.hpp
+ wizards/AutoConfigStreamPage.cpp
+ wizards/AutoConfigStreamPage.hpp
+ wizards/AutoConfigTestPage.cpp
+ wizards/AutoConfigTestPage.hpp
+ wizards/AutoConfigVideoPage.cpp
+ wizards/AutoConfigVideoPage.hpp
+ wizards/TestMode.hpp
+)
diff --git a/UI/cmake/windows/obs-studio.ico b/frontend/cmake/windows/obs-studio.ico
similarity index 100%
rename from UI/cmake/windows/obs-studio.ico
rename to frontend/cmake/windows/obs-studio.ico
diff --git a/UI/cmake/windows/obs.manifest b/frontend/cmake/windows/obs.manifest
similarity index 100%
rename from UI/cmake/windows/obs.manifest
rename to frontend/cmake/windows/obs.manifest
diff --git a/UI/cmake/windows/obs.rc.in b/frontend/cmake/windows/obs.rc.in
similarity index 100%
rename from UI/cmake/windows/obs.rc.in
rename to frontend/cmake/windows/obs.rc.in