diff --git a/src/advanced-scene-switcher.cpp b/src/advanced-scene-switcher.cpp index 5bb7c5c8..6891ab41 100644 --- a/src/advanced-scene-switcher.cpp +++ b/src/advanced-scene-switcher.cpp @@ -20,9 +20,9 @@ #include #include -#include "headers/switcher-data-structs.hpp" -#include "headers/utility.hpp" -#include "headers/advanced-scene-switcher.hpp" +#include "switcher-data-structs.hpp" +#include "utility.hpp" +#include "advanced-scene-switcher.hpp" SwitcherData* switcher = nullptr; @@ -1207,7 +1207,13 @@ extern "C" void InitSceneSwitcher() } bfree(path); - obs_hotkey_id pauseHotkeyId = obs_hotkey_register_frontend("startStopSwitcherHotkey", - "Toggle Start/Stop for the Advanced Scene Switcher", startStopHotkeyFunc, NULL); - loadKeybinding(pauseHotkeyId); + obs_hotkey_id toggleHotkeyId = obs_hotkey_register_frontend("startStopToggleSwitcherHotkey", + "Toggle Start/Stop for the Advanced Scene Switcher", startStopToggleHotkeyFunc, NULL); + loadKeybinding(toggleHotkeyId, TOGGLE_HOTKEY_PATH); + obs_hotkey_id startHotkeyId = obs_hotkey_register_frontend("startSwitcherHotkey", + "Start the Advanced Scene Switcher", startHotkeyFunc, NULL); + loadKeybinding(startHotkeyId, START_HOTKEY_PATH); + obs_hotkey_id stopHotkeyId = obs_hotkey_register_frontend("stopSwitcherHotkey", + "Stop the Advanced Scene Switcher", stopHotkeyFunc, NULL); + loadKeybinding(stopHotkeyId, STOP_HOTKEY_PATH); } diff --git a/src/advanced-scene-switcher.hpp b/src/advanced-scene-switcher.hpp new file mode 100644 index 00000000..37911130 --- /dev/null +++ b/src/advanced-scene-switcher.hpp @@ -0,0 +1,182 @@ +#pragma once + +#include +#include +#include +#include +#include "ui_advanced-scene-switcher.h" +#include "switcher-data-structs.hpp" + +class QCloseEvent; + + +/******************************************************************************* + * Advanced Scene Switcher window + *******************************************************************************/ +class SceneSwitcher : public QDialog { + Q_OBJECT + +public: + std::unique_ptr ui; + bool loading = true; + + SceneSwitcher(QWidget *parent); + + void closeEvent(QCloseEvent *event) override; + + void SetStarted(); + void SetStopped(); + + int FindByData(const QString &window); + int ScreenRegionFindByData(const QString ®ion); + int PauseScenesFindByData(const QString &scene); + int PauseWindowsFindByData(const QString &window); + int IgnoreWindowsFindByData(const QString &window); + int SceneRoundTripFindByData(const QString &scene1); + int SceneTransitionsFindByData(const QString &scene1, const QString &scene2); + int DefaultTransitionsFindByData(const QString &scene); + int executableFindByData(const QString &exe); + int IgnoreIdleWindowsFindByData(const QString& window); + int randomFindByData(const QString& scene); + + void UpdateNonMatchingScene(const QString &name); + void UpdateAutoStopScene(const QString &name); + void UpdateIdleDataTransition(const QString& name); + void UpdateIdleDataScene(const QString& name); + +public slots: + void on_switches_currentRowChanged(int idx); + void on_add_clicked(); + void on_remove_clicked(); + void on_noMatchDontSwitch_clicked(); + void on_noMatchSwitch_clicked(); + void on_noMatchRandomSwitch_clicked(); + void on_startAtLaunch_toggled(bool value); + void on_noMatchSwitchScene_currentTextChanged(const QString &text); + void on_checkInterval_valueChanged(int value); + void on_toggleStartButton_clicked(); + + void on_screenRegions_currentRowChanged(int idx); + void on_screenRegionAdd_clicked(); + void on_screenRegionRemove_clicked(); + + void on_pauseScenes_currentRowChanged(int idx); + void on_pauseScenesAdd_clicked(); + void on_pauseScenesRemove_clicked(); + + void on_pauseWindows_currentRowChanged(int idx); + void on_pauseWindowsAdd_clicked(); + void on_pauseWindowsRemove_clicked(); + + void on_ignoreWindows_currentRowChanged(int idx); + void on_ignoreWindowsAdd_clicked(); + void on_ignoreWindowsRemove_clicked(); + + void on_sceneRoundTrips_currentRowChanged(int idx); + void on_sceneRoundTripAdd_clicked(); + void on_sceneRoundTripRemove_clicked(); + void on_sceneRoundTripSave_clicked(); + void on_sceneRoundTripLoad_clicked(); + + void on_autoStopSceneCheckBox_stateChanged(int state); + void on_autoStopScenes_currentTextChanged(const QString &text); + + void on_sceneTransitions_currentRowChanged(int idx); + void on_transitionsAdd_clicked(); + void on_transitionsRemove_clicked(); + void on_defaultTransitions_currentRowChanged(int idx); + void on_defaultTransitionsAdd_clicked(); + void on_defaultTransitionsRemove_clicked(); + + void on_browseButton_clicked(); + void on_readFileCheckBox_stateChanged(int state); + void on_readPathLineEdit_textChanged(const QString & text); + void on_writePathLineEdit_textChanged(const QString & text); + void on_browseButton_2_clicked(); + + void on_executableAdd_clicked(); + void on_executableRemove_clicked(); + void on_executables_currentRowChanged(int idx); + + void on_idleCheckBox_stateChanged(int state); + void on_idleTransitions_currentTextChanged(const QString& text); + void on_idleScenes_currentTextChanged(const QString& text); + void on_idleSpinBox_valueChanged(int i); + void on_ignoreIdleWindows_currentRowChanged(int idx); + void on_ignoreIdleAdd_clicked(); + void on_ignoreIdleRemove_clicked(); + + void on_randomAdd_clicked(); + void on_randomRemove_clicked(); + void on_randomScenesList_currentRowChanged(int idx); + + void on_fileAdd_clicked(); + void on_fileRemove_clicked(); + void on_fileScenesList_currentRowChanged(int idx); + void on_browseButton_3_clicked(); + + void on_priorityUp_clicked(); + void on_priorityDown_clicked(); + + void updateScreenRegionCursorPos(); + + void on_close_clicked(); +}; + + +/******************************************************************************** + * Windowtitle helper + ********************************************************************************/ +void GetWindowList(std::vector &windows); +void GetCurrentWindowTitle(std::string &title); +bool isFullscreen(); + + +/******************************************************************************** + * Screenregion helper + ********************************************************************************/ +pair getCursorPos(); + + +/******************************************************************************** + * Idle detection helper + ********************************************************************************/ +int secondsSinceLastInput(); + + +/******************************************************************************** + * Executable helper + ********************************************************************************/ +void GetProcessList(QStringList &processes); +bool isInFocus(const QString &exeToCheck); + + +/******************************************************************************** + * Sceneswitch helper + ********************************************************************************/ +struct obs_weak_source; +typedef struct obs_weak_source obs_weak_source_t; + +obs_weak_source_t* getNextTransition(obs_weak_source_t* scene1, obs_weak_source_t* scene2); +void switchScene(OBSWeakSource& scene, OBSWeakSource& transition); + + +/******************************************************************************** + * Hotkey helper + ********************************************************************************/ + +#define TOGGLE_HOTKEY_PATH "hotkey_toggle.txt" +#define STOP_HOTKEY_PATH "hotkey_stop.txt" +#define START_HOTKEY_PATH "hotkey_start.txt" + +void stopHotkeyFunc(void* data, obs_hotkey_id id, obs_hotkey_t* hotkey, bool pressed); +void startHotkeyFunc(void* data, obs_hotkey_id id, obs_hotkey_t* hotkey, bool pressed); +void startStopToggleHotkeyFunc(void* data, obs_hotkey_id id, obs_hotkey_t* hotkey, bool pressed); +void loadKeybinding(obs_hotkey_id hotkeyId, string path); + + +/******************************************************************************** + * Main SwitcherData + ********************************************************************************/ +struct SwitcherData; +extern SwitcherData* switcher; diff --git a/src/hotkey.cpp b/src/hotkey.cpp index 03c47e36..56985422 100644 --- a/src/hotkey.cpp +++ b/src/hotkey.cpp @@ -1,7 +1,77 @@ #include -#include "headers/advanced-scene-switcher.hpp" +#include "advanced-scene-switcher.hpp" -void startStopHotkeyFunc(void* data, obs_hotkey_id id, obs_hotkey_t* hotkey, bool pressed) +void startHotkeyFunc(void* data, obs_hotkey_id id, obs_hotkey_t* hotkey, bool pressed) +{ + UNUSED_PARAMETER(data); + UNUSED_PARAMETER(hotkey); + + if (pressed) + { + if (!switcher->th.joinable()) + switcher->Start(); + } + + obs_data_array* hotkeyData = obs_hotkey_save(id); + + if (hotkeyData != NULL) + { + char* path = obs_module_config_path(""); + ofstream file; + file.open(string(path).append(START_HOTKEY_PATH), ofstream::trunc); + if (file.is_open()) + { + size_t num = obs_data_array_count(hotkeyData); + for (size_t i = 0; i < num; i++) + { + obs_data_t* data = obs_data_array_item(hotkeyData, i); + string temp = obs_data_get_json(data); + obs_data_release(data); + file << temp; + } + file.close(); + } + bfree(path); + } + obs_data_array_release(hotkeyData); +} + +void stopHotkeyFunc(void* data, obs_hotkey_id id, obs_hotkey_t* hotkey, bool pressed) +{ + UNUSED_PARAMETER(data); + UNUSED_PARAMETER(hotkey); + + if (pressed) + { + if (switcher->th.joinable()) + switcher->Stop(); + } + + obs_data_array* hotkeyData = obs_hotkey_save(id); + + if (hotkeyData != NULL) + { + char* path = obs_module_config_path(""); + ofstream file; + file.open(string(path).append(STOP_HOTKEY_PATH), ofstream::trunc); + if (file.is_open()) + { + size_t num = obs_data_array_count(hotkeyData); + for (size_t i = 0; i < num; i++) + { + obs_data_t* data = obs_data_array_item(hotkeyData, i); + string temp = obs_data_get_json(data); + obs_data_release(data); + file << temp; + } + file.close(); + } + bfree(path); + } + obs_data_array_release(hotkeyData); +} + +void startStopToggleHotkeyFunc(void* data, obs_hotkey_id id, obs_hotkey_t* hotkey, bool pressed) { UNUSED_PARAMETER(data); UNUSED_PARAMETER(hotkey); @@ -20,7 +90,7 @@ void startStopHotkeyFunc(void* data, obs_hotkey_id id, obs_hotkey_t* hotkey, boo { char* path = obs_module_config_path(""); ofstream file; - file.open(string(path).append("hotkey.txt"), ofstream::trunc); + file.open(string(path).append(TOGGLE_HOTKEY_PATH), ofstream::trunc); if (file.is_open()) { size_t num = obs_data_array_count(hotkeyData); @@ -57,9 +127,9 @@ string loadConfigFile(string filename) return value; } -void loadKeybinding(obs_hotkey_id hotkeyId) +void loadKeybinding(obs_hotkey_id hotkeyId, string path) { - string bindings = loadConfigFile("hotkey.txt"); + string bindings = loadConfigFile(path); if (!bindings.empty()) { obs_data_array_t* hotkeyData = obs_data_array_create();