diff --git a/Utils.cpp b/Utils.cpp index fcc45d23..a4588a3a 100644 --- a/Utils.cpp +++ b/Utils.cpp @@ -276,67 +276,8 @@ QLayout* Utils::GetPreviewLayout() { return main->findChild("previewLayout"); } -bool Utils::IsPreviewModeActive() { - QMainWindow* main = (QMainWindow*)obs_frontend_get_main_window(); - - // Clue 1 : "Studio Mode" button is toggled on - bool buttonToggledOn = GetPreviewModeButtonControl()->isChecked(); - - // Clue 2 : Preview layout has more than one item - int previewChildCount = GetPreviewLayout()->count(); - blog(LOG_INFO, "preview layout children count : %d", previewChildCount); - - return buttonToggledOn || (previewChildCount >= 2); -} - -void Utils::EnablePreviewMode() { - if (!IsPreviewModeActive()) - GetPreviewModeButtonControl()->click(); -} - -void Utils::DisablePreviewMode() { - if (IsPreviewModeActive()) - GetPreviewModeButtonControl()->click(); -} - -void Utils::TogglePreviewMode() { - GetPreviewModeButtonControl()->click(); -} - -obs_scene_t* Utils::GetPreviewScene() { - if (IsPreviewModeActive()) { - QListWidget* sceneList = GetSceneListControl(); - QList selected = sceneList->selectedItems(); - - // Qt::UserRole == QtUserRole::OBSRef - obs_scene_t* scene = Utils::SceneListItemToScene(selected.first()); - - obs_scene_addref(scene); - return scene; - } - - return nullptr; -} - -bool Utils::SetPreviewScene(const char* name) { - if (IsPreviewModeActive()) { - QListWidget* sceneList = GetSceneListControl(); - QList matchingItems = - sceneList->findItems(name, Qt::MatchExactly); - - if (matchingItems.count() > 0) { - sceneList->setCurrentItem(matchingItems.first()); - return true; - } else { - return false; - } - } - - return false; -} - void Utils::TransitionToProgram() { - if (!IsPreviewModeActive()) + if (!obs_frontend_preview_program_mode_active()) return; // WARNING : if the layout created in OBS' CreateProgramOptions() changes @@ -517,13 +458,13 @@ bool Utils::ReplayBufferEnabled() { bool Utils::RPHotkeySet() { obs_output_t* rp_output = obs_frontend_get_replay_buffer_output(); - + obs_data_t *hotkeys = obs_hotkeys_save_output(rp_output); obs_data_array_t *bindings = obs_data_get_array(hotkeys, "ReplayBuffer.Save"); size_t count = obs_data_array_count(bindings); - + obs_data_array_release(bindings); obs_data_release(hotkeys); obs_output_release(rp_output); diff --git a/Utils.h b/Utils.h index 6b75e9c4..9564f041 100644 --- a/Utils.h +++ b/Utils.h @@ -44,7 +44,7 @@ class Utils { static obs_data_array_t* GetSceneCollections(); static obs_data_array_t* GetProfiles(); - + static QSpinBox* GetTransitionDurationControl(); static int GetTransitionDuration(); static void SetTransitionDuration(int ms); @@ -56,13 +56,6 @@ class Utils { static QListWidget* GetSceneListControl(); static obs_scene_t* SceneListItemToScene(QListWidgetItem* item); - static bool IsPreviewModeActive(); - static void EnablePreviewMode(); - static void DisablePreviewMode(); - static void TogglePreviewMode(); - - static obs_scene_t* GetPreviewScene(); - static bool SetPreviewScene(const char* name); static void TransitionToProgram(); static const char* OBSVersionString(); diff --git a/WSEvents.cpp b/WSEvents.cpp index 367cdab7..b8c5168d 100644 --- a/WSEvents.cpp +++ b/WSEvents.cpp @@ -78,9 +78,6 @@ WSEvents::WSEvents(WSServer* srv) { connect(sceneList, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(SelectedSceneChanged(QListWidgetItem*, QListWidgetItem*))); - QPushButton* modeSwitch = Utils::GetPreviewModeButtonControl(); - connect(modeSwitch, SIGNAL(clicked(bool)), this, SLOT(ModeSwitchClicked(bool))); - transition_handler = nullptr; scene_handler = nullptr; @@ -179,6 +176,12 @@ void WSEvents::FrontendEventHandler(enum obs_frontend_event event, void* private else if (event == OBS_FRONTEND_EVENT_REPLAY_BUFFER_STOPPED) { owner->OnReplayStopped(); } + else if (event == OBS_FRONTEND_EVENT_STUDIO_MODE_ENABLED) { + owner->OnStudioModeSwitched(true); + } + else if (event == OBS_FRONTEND_EVENT_STUDIO_MODE_DISABLED) { + owner->OnStudioModeSwitched(false); + } else if (event == OBS_FRONTEND_EVENT_EXIT) { owner->OnExit(); } @@ -303,7 +306,7 @@ void WSEvents::OnSceneChange() { // Dirty fix : OBS blocks signals when swapping scenes in Studio Mode // after transition end, so SelectedSceneChanged is never called... - if (Utils::IsPreviewModeActive()) { + if (obs_frontend_preview_program_mode_active()) { QListWidget* list = Utils::GetSceneListControl(); SelectedSceneChanged(list->currentItem(), nullptr); } @@ -914,7 +917,7 @@ void WSEvents::OnSceneItemVisibilityChanged(void* param, calldata_t* data) { * @since 4.1.0 */ void WSEvents::SelectedSceneChanged(QListWidgetItem* current, QListWidgetItem* prev) { - if (Utils::IsPreviewModeActive()) { + if (obs_frontend_preview_program_mode_active()) { obs_scene_t* scene = Utils::SceneListItemToScene(current); if (!scene) return; @@ -942,7 +945,7 @@ void WSEvents::SelectedSceneChanged(QListWidgetItem* current, QListWidgetItem* p * @category studio mode * @since 4.1.0 */ -void WSEvents::ModeSwitchClicked(bool checked) { +void WSEvents::OnStudioModeSwitched(bool checked) { obs_data_t* data = obs_data_create(); obs_data_set_bool(data, "new-state", checked); diff --git a/WSEvents.h b/WSEvents.h index 30edb679..6a0458b3 100644 --- a/WSEvents.h +++ b/WSEvents.h @@ -49,7 +49,6 @@ class WSEvents : public QObject { void TransitionDurationChanged(int ms); void SelectedSceneChanged( QListWidgetItem* current, QListWidgetItem* prev); - void ModeSwitchClicked(bool checked); private: WSServer* _srv; @@ -96,6 +95,8 @@ class WSEvents : public QObject { void OnReplayStopping(); void OnReplayStopped(); + void OnStudioModeSwitched(bool enabled); + void OnExit(); static void OnTransitionBegin(void* param, calldata_t* data); diff --git a/WSRequestHandler.cpp b/WSRequestHandler.cpp index 059c9293..b8720c6a 100644 --- a/WSRequestHandler.cpp +++ b/WSRequestHandler.cpp @@ -40,7 +40,8 @@ WSRequestHandler::WSRequestHandler(QWebSocket* client) : _messageId(0), _requestType(""), data(nullptr), - _client(client) { + _client(client) +{ messageMap["GetVersion"] = WSRequestHandler::HandleGetVersion; messageMap["GetAuthRequired"] = WSRequestHandler::HandleGetAuthRequired; messageMap["Authenticate"] = WSRequestHandler::HandleAuthenticate; @@ -68,7 +69,7 @@ WSRequestHandler::WSRequestHandler(QWebSocket* client) : messageMap["StartStopReplayBuffer"] = WSRequestHandler::HandleStartStopReplayBuffer; messageMap["StartReplayBuffer"] = WSRequestHandler::HandleStartReplayBuffer; - messageMap["StopReplayBuffer"] = WSRequestHandler::HandleStopReplayBuffer; + messageMap["StopReplayBuffer"] = WSRequestHandler::HandleStopReplayBuffer; messageMap["SaveReplayBuffer"] = WSRequestHandler::HandleSaveReplayBuffer; messageMap["SetRecordingFolder"] = WSRequestHandler::HandleSetRecordingFolder; @@ -1581,7 +1582,7 @@ void WSRequestHandler::HandleListProfiles(WSRequestHandler* req) { * @since 4.1.0 */ void WSRequestHandler::HandleGetStudioModeStatus(WSRequestHandler* req) { - bool previewActive = Utils::IsPreviewModeActive(); + bool previewActive = obs_frontend_preview_program_mode_active(); obs_data_t* response = obs_data_create(); obs_data_set_bool(response, "studio-mode", previewActive); @@ -1603,25 +1604,21 @@ void WSRequestHandler::HandleGetStudioModeStatus(WSRequestHandler* req) { * @since 4.1.0 */ void WSRequestHandler::HandleGetPreviewScene(WSRequestHandler* req) { - if (!Utils::IsPreviewModeActive()) { + if (!obs_frontend_preview_program_mode_active()) { req->SendErrorResponse("studio mode not enabled"); return; } - obs_scene_t* preview_scene = Utils::GetPreviewScene(); - obs_source_t* source = obs_scene_get_source(preview_scene); - const char* name = obs_source_get_name(source); - - obs_data_array_t* scene_items = Utils::GetSceneItems(source); + obs_source_t* scene = obs_frontend_get_current_preview_scene(); + obs_data_array_t* scene_items = Utils::GetSceneItems(scene); obs_data_t* data = obs_data_create(); - obs_data_set_string(data, "name", name); + obs_data_set_string(data, "name", obs_source_get_name(scene)); obs_data_set_array(data, "sources", scene_items); req->SendOKResponse(data); obs_data_release(data); obs_data_array_release(scene_items); - obs_scene_release(preview_scene); } /** @@ -1636,7 +1633,7 @@ void WSRequestHandler::HandleGetPreviewScene(WSRequestHandler* req) { * @since 4.1.0 */ void WSRequestHandler::HandleSetPreviewScene(WSRequestHandler* req) { - if (!Utils::IsPreviewModeActive()) { + if (!obs_frontend_preview_program_mode_active()) { req->SendErrorResponse("studio mode not enabled"); return; } @@ -1647,11 +1644,16 @@ void WSRequestHandler::HandleSetPreviewScene(WSRequestHandler* req) { } const char* scene_name = obs_data_get_string(req->data, "scene-name"); - bool success = Utils::SetPreviewScene(scene_name); - if (success) + obs_source_t* scene = Utils::GetSceneFromNameOrCurrent(scene_name); + + if (scene) { + obs_frontend_set_current_preview_scene(scene); req->SendOKResponse(); - else + } else { req->SendErrorResponse("specified scene doesn't exist"); + } + + obs_source_release(scene); } /** @@ -1668,7 +1670,7 @@ void WSRequestHandler::HandleSetPreviewScene(WSRequestHandler* req) { * @since 4.1.0 */ void WSRequestHandler::HandleTransitionToProgram(WSRequestHandler* req) { - if (!Utils::IsPreviewModeActive()) { + if (!obs_frontend_preview_program_mode_active()) { req->SendErrorResponse("studio mode not enabled"); return; } @@ -1715,7 +1717,7 @@ void WSRequestHandler::HandleTransitionToProgram(WSRequestHandler* req) { * @since 4.1.0 */ void WSRequestHandler::HandleEnableStudioMode(WSRequestHandler* req) { - Utils::EnablePreviewMode(); + obs_frontend_set_preview_program_mode(true); req->SendOKResponse(); } @@ -1728,7 +1730,7 @@ void WSRequestHandler::HandleEnableStudioMode(WSRequestHandler* req) { * @since 4.1.0 */ void WSRequestHandler::HandleDisableStudioMode(WSRequestHandler* req) { - Utils::DisablePreviewMode(); + obs_frontend_set_preview_program_mode(false); req->SendOKResponse(); } @@ -1741,7 +1743,8 @@ void WSRequestHandler::HandleDisableStudioMode(WSRequestHandler* req) { * @since 4.1.0 */ void WSRequestHandler::HandleToggleStudioMode(WSRequestHandler* req) { - Utils::TogglePreviewMode(); + bool previewProgramMode = obs_frontend_preview_program_mode_active(); + obs_frontend_set_preview_program_mode(!previewProgramMode); req->SendOKResponse(); }