Compare commits

..

7 Commits
1.11 ... 1.11.2

Author SHA1 Message Date
WarmUpTill
e4bf5fa749 Add option to use transition overrides for transition changes (#164)
* Adjust switchScene() signature to support adjustActiveTransitionType and verbose parameters and only change the transition type if adjustActiveTransitionType, otherwise rely on transition overrides

* Add new adjustActiveTransitionType checkbox

* save and load adjustActiveTransitionType

* Add check to either enable transition type change or use of transition
overrides

* Add locale

* Adjust layout and locale
2021-04-10 19:58:17 +02:00
WarmUpTill
eb346da6f4 CI: Fix macOS build by disabling browser build (#163) 2021-04-09 20:57:35 +02:00
WarmUpTill
866480cde6 Fix crash on Linux if no ewmh is available (#159) 2021-04-07 21:03:54 +02:00
WarmUpTill
10e1c7b3a3 Resolve asio network crashes on macOS (#157)
* Reenable network tab functionality for macOS

* Set asio to b73dc1d and  websocketpp to c6d7e29
2021-04-03 22:02:42 +02:00
WarmUpTill
beb482bd5a Disable Network tab functionality on macOS (#155)
The asio library ran into issues when the obs-websocket plugin was also running leading to a crash in the obs-websocket's listen() calls.

As the use obs-websocket plugin is more widespread than the use of the advanced scene switcher the network tab functionality will be disabled for macOS for the time being.
2021-04-03 18:52:16 +02:00
WarmUpTill
e561d378dd CI: Disable PipeWire on Ubuntu (#156) 2021-04-03 12:43:52 +02:00
WarmUpTill
73ce88e2f0 Add option to save window size and position (#154) 2021-04-03 11:55:42 +02:00
13 changed files with 213 additions and 77 deletions

View File

@@ -63,7 +63,7 @@ jobs:
echo "add_subdirectory(${{ env.PLUGIN_NAME }})" >> UI/frontend-plugins/CMakeLists.txt echo "add_subdirectory(${{ env.PLUGIN_NAME }})" >> UI/frontend-plugins/CMakeLists.txt
mkdir ./build mkdir ./build
cd ./build cd ./build
cmake -DCMAKE_OSX_DEPLOYMENT_TARGET=10.13 -DDISABLE_PYTHON=ON -DDepsPath="/tmp/obsdeps" -DQTDIR="/tmp/obsdeps" .. cmake -DBUILD_BROWSER=OFF -DCMAKE_OSX_DEPLOYMENT_TARGET=10.13 -DDISABLE_PYTHON=ON -DDepsPath="/tmp/obsdeps" -DQTDIR="/tmp/obsdeps" ..
cd - cd -
- name: Build - name: Build
shell: bash shell: bash
@@ -173,7 +173,7 @@ jobs:
run: | run: |
mkdir ./build mkdir ./build
cd ./build cd ./build
cmake -DUNIX_STRUCTURE=0 -DCMAKE_INSTALL_PREFIX="${{ github.workspace }}/obs-studio-portable" -DWITH_RTMPS=OFF -DBUILD_BROWSER=OFF .. cmake -DENABLE_PIPEWIRE=OFF -DUNIX_STRUCTURE=0 -DCMAKE_INSTALL_PREFIX="${{ github.workspace }}/obs-studio-portable" -DWITH_RTMPS=OFF -DBUILD_BROWSER=OFF ..
- name: 'Build' - name: 'Build'
shell: bash shell: bash
working-directory: ${{ github.workspace }}/build working-directory: ${{ github.workspace }}/build

View File

@@ -27,6 +27,7 @@ AdvSceneSwitcher.generalTab.generalBehavior.onNoMet.switchTo="Wechsle zu:"
AdvSceneSwitcher.generalTab.generalBehavior.cooldown="Nach einem automatisierten Szenenwechsel wechsle nicht mehr für" AdvSceneSwitcher.generalTab.generalBehavior.cooldown="Nach einem automatisierten Szenenwechsel wechsle nicht mehr für"
AdvSceneSwitcher.generalTab.generalBehavior.cooldownHint="In diesem Zeitraum werden potentielle erfüllte Bedingungen ignoriert!" AdvSceneSwitcher.generalTab.generalBehavior.cooldownHint="In diesem Zeitraum werden potentielle erfüllte Bedingungen ignoriert!"
AdvSceneSwitcher.generalTab.generalBehavior.verboseLogging="Ausführliches Logging" AdvSceneSwitcher.generalTab.generalBehavior.verboseLogging="Ausführliches Logging"
AdvSceneSwitcher.generalTab.generalBehavior.saveWindowGeo="Fensterposition und -größe speichern"
AdvSceneSwitcher.generalTab.generalBehavior.disableUIHints="Deaktiviere UI Tipps" AdvSceneSwitcher.generalTab.generalBehavior.disableUIHints="Deaktiviere UI Tipps"
AdvSceneSwitcher.generalTab.priority="Priorität" AdvSceneSwitcher.generalTab.priority="Priorität"
AdvSceneSwitcher.generalTab.priority.description="Szenenwechselmethoden sortiert nach Priorität" AdvSceneSwitcher.generalTab.priority.description="Szenenwechselmethoden sortiert nach Priorität"
@@ -53,7 +54,10 @@ AdvSceneSwitcher.generalTab.priority.video="Video"
; Transition Tab ; Transition Tab
AdvSceneSwitcher.transitionTab.title="Szenenübergänge" AdvSceneSwitcher.transitionTab.title="Szenenübergänge"
AdvSceneSwitcher.transitionTab.transitionOverride="Szenenübergänge, die im Szenenwechsler konfiguriert werden, haben Vorrang vor Übergangsüberschreibung" AdvSceneSwitcher.transitionTab.setTransitionBy="Beim Ändern des Szenenübergangs:"
AdvSceneSwitcher.transitionTab.transitionOverride="Verwende Übergangsüberschreibungen"
AdvSceneSwitcher.transitionTab.adjustActiveTransitionType="Wechsle den aktiven Szenenübergangtyp"
AdvSceneSwitcher.transitionTab.transitionBehaviorSelectionError="Mindestens eine Option muss aktiv sein:\n\n - Verwende Übergangsüberschreibungen\n\n - Wechsle den aktiven Szenenübergangtyp"
AdvSceneSwitcher.transitionTab.transitionForAToB="Szenenübergänge für automatisierte Szenenwechsel von Szene A zu Szene B" AdvSceneSwitcher.transitionTab.transitionForAToB="Szenenübergänge für automatisierte Szenenwechsel von Szene A zu Szene B"
AdvSceneSwitcher.transitionTab.transitionsHelp="<html><head/><body><p>Diese Einstellungen beeinflussen <span style=\"font-style:italic;\">nur</span> vom Szenenwechsler ausgelöste Szenenübergänge - Siehe <a href=\"https://obsproject.com/forum/resources/transition-table.1174/\"><span style=\" text-decoration: underline; color:#268bd2;\">Transition Table</span></a> um auch manuelle Szenenübergänge zu konfigurieren.<br/>Einstellungen auf diesem Tab haben Vorrang, vor denen welche auf den übrigen Tabs konfiguriert wurden.<br/><br/>Klicke auf das Plus Symbol, um einen neuen Eintrag hinzuzufügen.</p></body></html>" AdvSceneSwitcher.transitionTab.transitionsHelp="<html><head/><body><p>Diese Einstellungen beeinflussen <span style=\"font-style:italic;\">nur</span> vom Szenenwechsler ausgelöste Szenenübergänge - Siehe <a href=\"https://obsproject.com/forum/resources/transition-table.1174/\"><span style=\" text-decoration: underline; color:#268bd2;\">Transition Table</span></a> um auch manuelle Szenenübergänge zu konfigurieren.<br/>Einstellungen auf diesem Tab haben Vorrang, vor denen welche auf den übrigen Tabs konfiguriert wurden.<br/><br/>Klicke auf das Plus Symbol, um einen neuen Eintrag hinzuzufügen.</p></body></html>"
AdvSceneSwitcher.transitionTab.defaultTransition="Ändere den Szenenübergang wenn eine Szene aktiv ist" AdvSceneSwitcher.transitionTab.defaultTransition="Ändere den Szenenübergang wenn eine Szene aktiv ist"
@@ -218,6 +222,7 @@ AdvSceneSwitcher.videoTab.help="<html><head/><body><p>Dieser Tab ermöglicht es
; Network Tab ; Network Tab
AdvSceneSwitcher.networkTab.title="Netzwerk" AdvSceneSwitcher.networkTab.title="Netzwerk"
AdvSceneSwitcher.networkTab.warning="Die Verwendung des Servers außerhalb eines lokalen Netzwerks kann dazu führen, dass die aktive Szene von dritten Personen ausgelesen werden kann." AdvSceneSwitcher.networkTab.warning="Die Verwendung des Servers außerhalb eines lokalen Netzwerks kann dazu führen, dass die aktive Szene von dritten Personen ausgelesen werden kann."
AdvSceneSwitcher.networkTab.Disabledwarning="Diese Funktionalität musste unter macOS leider aufgrund von Bibliotheksinkompatibilitäten mit dem obs-websocket plugin deaktiviert werden."
AdvSceneSwitcher.networkTab.server="Server starten (Sendet Szenenwechselnachrichten zu allen verbundenen Clients)" AdvSceneSwitcher.networkTab.server="Server starten (Sendet Szenenwechselnachrichten zu allen verbundenen Clients)"
AdvSceneSwitcher.networkTab.server.port="Port" AdvSceneSwitcher.networkTab.server.port="Port"
AdvSceneSwitcher.networkTab.server.lockToIPv4="Nur IPv4 verwenden (deaktiviert IPv6)" AdvSceneSwitcher.networkTab.server.lockToIPv4="Nur IPv4 verwenden (deaktiviert IPv6)"

View File

@@ -27,6 +27,7 @@ AdvSceneSwitcher.generalTab.generalBehavior.onNoMet.switchTo="Switch to:"
AdvSceneSwitcher.generalTab.generalBehavior.cooldown="After a match do not switch scenes for" AdvSceneSwitcher.generalTab.generalBehavior.cooldown="After a match do not switch scenes for"
AdvSceneSwitcher.generalTab.generalBehavior.cooldownHint="During this time potential matches will be ignored!" AdvSceneSwitcher.generalTab.generalBehavior.cooldownHint="During this time potential matches will be ignored!"
AdvSceneSwitcher.generalTab.generalBehavior.verboseLogging="Enable verbose logging" AdvSceneSwitcher.generalTab.generalBehavior.verboseLogging="Enable verbose logging"
AdvSceneSwitcher.generalTab.generalBehavior.saveWindowGeo="Save window position and size"
AdvSceneSwitcher.generalTab.generalBehavior.disableUIHints="Disable UI hints" AdvSceneSwitcher.generalTab.generalBehavior.disableUIHints="Disable UI hints"
AdvSceneSwitcher.generalTab.priority="Priority" AdvSceneSwitcher.generalTab.priority="Priority"
AdvSceneSwitcher.generalTab.priority.description="Switching methods priority (Highest priority is at the top)" AdvSceneSwitcher.generalTab.priority.description="Switching methods priority (Highest priority is at the top)"
@@ -53,7 +54,10 @@ AdvSceneSwitcher.generalTab.priority.video="Video"
; Transition Tab ; Transition Tab
AdvSceneSwitcher.transitionTab.title="Transition" AdvSceneSwitcher.transitionTab.title="Transition"
AdvSceneSwitcher.transitionTab.transitionOverride="Scene transitions defined in the scene switcher take priority over Transition Overrides defined per scene" AdvSceneSwitcher.transitionTab.setTransitionBy="When changing transitions:"
AdvSceneSwitcher.transitionTab.transitionOverride="Set transition overrides"
AdvSceneSwitcher.transitionTab.adjustActiveTransitionType="Change active transition type"
AdvSceneSwitcher.transitionTab.transitionBehaviorSelectionError="At least one option must be enabled:\n\n - Use transition overrides\n\n - Change active transition type"
AdvSceneSwitcher.transitionTab.transitionForAToB="Use transition for automated scene switch from scene A to scene B" AdvSceneSwitcher.transitionTab.transitionForAToB="Use transition for automated scene switch from scene A to scene B"
AdvSceneSwitcher.transitionTab.transitionsHelp="<html><head/><body><p>These settings <span style=\"font-style:italic;\">only</span> affect transitions caused by the scene switcher - Check out <a href=\"https://obsproject.com/forum/resources/transition-table.1174/\"><span style=\" text-decoration: underline; color:#268bd2;\">Transition Table</span></a> if you want to configure this for manual scene changes.<br/>Settings defined here take priority over transition settings configured elsewhere in the scene switcher.<br/><br/>Click the plus symbol below to add a new entry.</p></body></html>" AdvSceneSwitcher.transitionTab.transitionsHelp="<html><head/><body><p>These settings <span style=\"font-style:italic;\">only</span> affect transitions caused by the scene switcher - Check out <a href=\"https://obsproject.com/forum/resources/transition-table.1174/\"><span style=\" text-decoration: underline; color:#268bd2;\">Transition Table</span></a> if you want to configure this for manual scene changes.<br/>Settings defined here take priority over transition settings configured elsewhere in the scene switcher.<br/><br/>Click the plus symbol below to add a new entry.</p></body></html>"
AdvSceneSwitcher.transitionTab.defaultTransition="Change transition if scene is active" AdvSceneSwitcher.transitionTab.defaultTransition="Change transition if scene is active"
@@ -218,6 +222,7 @@ AdvSceneSwitcher.videoTab.help="<html><head/><body><p>This tab will allow you to
; Network Tab ; Network Tab
AdvSceneSwitcher.networkTab.title="Network" AdvSceneSwitcher.networkTab.title="Network"
AdvSceneSwitcher.networkTab.warning="Running the server outside of a local network will allow third parties to read the active scene." AdvSceneSwitcher.networkTab.warning="Running the server outside of a local network will allow third parties to read the active scene."
AdvSceneSwitcher.networkTab.DisabledWarning="This functionality unfortunately had to be disabled on macOS due to library incompatibilities when running the obs-websocket plugin in parallel."
AdvSceneSwitcher.networkTab.server="Start server (Sends scene switch messages to all connected clients)" AdvSceneSwitcher.networkTab.server="Start server (Sends scene switch messages to all connected clients)"
AdvSceneSwitcher.networkTab.server.port="Port" AdvSceneSwitcher.networkTab.server.port="Port"
AdvSceneSwitcher.networkTab.server.lockToIPv4="Lock server to only using IPv4" AdvSceneSwitcher.networkTab.server.lockToIPv4="Lock server to only using IPv4"

2
deps/asio vendored

Submodule deps/asio updated: 93f87fbdbf...b73dc1d2c0

View File

@@ -161,46 +161,8 @@
<property name="title"> <property name="title">
<string>AdvSceneSwitcher.generalTab.generalBehavior</string> <string>AdvSceneSwitcher.generalTab.generalBehavior</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_5"> <layout class="QVBoxLayout" name="verticalLayout_32">
<item row="1" column="0"> <item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>AdvSceneSwitcher.generalTab.generalBehavior.cooldown</string>
</property>
</widget>
</item>
<item>
<widget class="QDoubleSpinBox" name="cooldownTime">
<property name="suffix">
<string>s</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="3" column="0">
<widget class="Line" name="line_6">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="0" column="0">
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="0" column="2"> <item row="0" column="2">
<layout class="QHBoxLayout" name="horizontalLayout_43"> <layout class="QHBoxLayout" name="horizontalLayout_43">
@@ -295,7 +257,45 @@
</item> </item>
</layout> </layout>
</item> </item>
<item row="4" column="0"> <item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>AdvSceneSwitcher.generalTab.generalBehavior.cooldown</string>
</property>
</widget>
</item>
<item>
<widget class="QDoubleSpinBox" name="cooldownTime">
<property name="suffix">
<string>s</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="Line" name="line_6">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_52"> <layout class="QHBoxLayout" name="horizontalLayout_52">
<item> <item>
<widget class="QCheckBox" name="verboseLogging"> <widget class="QCheckBox" name="verboseLogging">
@@ -319,7 +319,31 @@
</item> </item>
</layout> </layout>
</item> </item>
<item row="5" column="0"> <item>
<layout class="QHBoxLayout" name="horizontalLayout_50">
<item>
<widget class="QCheckBox" name="saveWindowGeo">
<property name="text">
<string>AdvSceneSwitcher.generalTab.generalBehavior.saveWindowGeo</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_55">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_48"> <layout class="QHBoxLayout" name="horizontalLayout_48">
<item> <item>
<widget class="QCheckBox" name="uiHintsDisable"> <widget class="QCheckBox" name="uiHintsDisable">
@@ -542,18 +566,42 @@
</attribute> </attribute>
<layout class="QVBoxLayout" name="verticalLayout_15"> <layout class="QVBoxLayout" name="verticalLayout_15">
<item> <item>
<widget class="QCheckBox" name="transitionOverridecheckBox"> <layout class="QGridLayout" name="gridLayout_5">
<property name="text"> <item row="1" column="1">
<string>AdvSceneSwitcher.transitionTab.transitionOverride</string> <widget class="QCheckBox" name="adjustActiveTransitionType">
</property> <property name="text">
</widget> <string>AdvSceneSwitcher.transitionTab.adjustActiveTransitionType</string>
</item> </property>
<item> </widget>
<widget class="Line" name="line_17"> </item>
<property name="orientation"> <item row="0" column="0">
<enum>Qt::Horizontal</enum> <widget class="QLabel" name="label_12">
</property> <property name="text">
</widget> <string>AdvSceneSwitcher.transitionTab.setTransitionBy</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QCheckBox" name="transitionOverridecheckBox">
<property name="text">
<string>AdvSceneSwitcher.transitionTab.transitionOverride</string>
</property>
</widget>
</item>
<item row="0" column="2">
<spacer name="horizontalSpacer_9">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item> </item>
<item> <item>
<widget class="QGroupBox" name="transitionsGroup"> <widget class="QGroupBox" name="transitionsGroup">
@@ -3278,7 +3326,7 @@
</attribute> </attribute>
<layout class="QVBoxLayout" name="verticalLayout_30"> <layout class="QVBoxLayout" name="verticalLayout_30">
<item> <item>
<widget class="QLabel" name="label_12"> <widget class="QLabel" name="networkTabWarningLabel">
<property name="text"> <property name="text">
<string>AdvSceneSwitcher.networkTab.warning</string> <string>AdvSceneSwitcher.networkTab.warning</string>
</property> </property>

View File

@@ -65,6 +65,7 @@ void AdvSceneSwitcher::loadUI()
setupTriggerTab(); setupTriggerTab();
setTabOrder(); setTabOrder();
restoreWindowGeo();
loading = false; loading = false;
} }
@@ -551,7 +552,8 @@ void SwitcherData::Thread()
server.sendMessage(scene, transition); server.sendMessage(scene, transition);
} }
switchScene(scene, transition, switchScene(scene, transition,
tansitionOverrideOverride); tansitionOverrideOverride,
adjustActiveTransitionType, verbose);
} }
writeSceneInfoToFile(); writeSceneInfoToFile();
@@ -618,9 +620,10 @@ bool SwitcherData::checkForMatch(OBSWeakSource &scene,
} }
void switchScene(OBSWeakSource &scene, OBSWeakSource &transition, void switchScene(OBSWeakSource &scene, OBSWeakSource &transition,
bool &transitionOverrideOverride) bool transitionOverrideOverride,
bool adjustActiveTransitionType, bool verbose)
{ {
if (!scene && switcher->verbose) { if (!scene && verbose) {
blog(LOG_INFO, "nothing to switch to"); blog(LOG_INFO, "nothing to switch to");
return; return;
} }
@@ -631,13 +634,14 @@ void switchScene(OBSWeakSource &scene, OBSWeakSource &transition,
if (source && source != currentSource) { if (source && source != currentSource) {
transitionData td; transitionData td;
setNextTransition(scene, currentSource, transition, setNextTransition(scene, currentSource, transition,
transitionOverrideOverride, td); transitionOverrideOverride,
adjustActiveTransitionType, td);
obs_frontend_set_current_scene(source); obs_frontend_set_current_scene(source);
if (transitionOverrideOverride) { if (transitionOverrideOverride) {
restoreTransitionOverride(source, td); restoreTransitionOverride(source, td);
} }
if (switcher->verbose) { if (verbose) {
blog(LOG_INFO, "switched scene"); blog(LOG_INFO, "switched scene");
} }
} }

View File

@@ -156,6 +156,9 @@ void AdvSceneSwitcher::on_toggleStartButton_clicked()
void AdvSceneSwitcher::closeEvent(QCloseEvent *) void AdvSceneSwitcher::closeEvent(QCloseEvent *)
{ {
switcher->windowPos = this->pos();
switcher->windowSize = this->size();
obs_frontend_save(); obs_frontend_save();
} }
@@ -168,6 +171,15 @@ void AdvSceneSwitcher::on_verboseLogging_stateChanged(int state)
switcher->verbose = state; switcher->verbose = state;
} }
void AdvSceneSwitcher::on_saveWindowGeo_stateChanged(int state)
{
if (loading) {
return;
}
switcher->saveWindowGeo = state;
}
void AdvSceneSwitcher::on_uiHintsDisable_stateChanged(int state) void AdvSceneSwitcher::on_uiHintsDisable_stateChanged(int state)
{ {
if (loading) { if (loading) {
@@ -365,6 +377,14 @@ void AdvSceneSwitcher::setTabOrder()
connect(bar, &QTabBar::tabMoved, this, &AdvSceneSwitcher::on_tabMoved); connect(bar, &QTabBar::tabMoved, this, &AdvSceneSwitcher::on_tabMoved);
} }
void AdvSceneSwitcher::restoreWindowGeo()
{
if (switcher->saveWindowGeo) {
this->resize(switcher->windowSize);
this->move(switcher->windowPos);
}
}
void AdvSceneSwitcher::on_tabMoved(int from, int to) void AdvSceneSwitcher::on_tabMoved(int from, int to)
{ {
if (loading) { if (loading) {
@@ -505,6 +525,12 @@ void SwitcherData::saveGeneralSettings(obs_data_t *obj)
obs_data_set_int(obj, "networkTabPos", switcher->tabOrder[14]); obs_data_set_int(obj, "networkTabPos", switcher->tabOrder[14]);
obs_data_set_int(obj, "sceneGroupTabPos", switcher->tabOrder[15]); obs_data_set_int(obj, "sceneGroupTabPos", switcher->tabOrder[15]);
obs_data_set_int(obj, "triggerTabPos", switcher->tabOrder[16]); obs_data_set_int(obj, "triggerTabPos", switcher->tabOrder[16]);
obs_data_set_bool(obj, "saveWindowGeo", saveWindowGeo);
obs_data_set_int(obj, "windowPosX", switcher->windowPos.x());
obs_data_set_int(obj, "windowPosY", switcher->windowPos.y());
obs_data_set_int(obj, "windowWidth", switcher->windowSize.width());
obs_data_set_int(obj, "windowHeight", switcher->windowSize.height());
} }
void SwitcherData::loadGeneralSettings(obs_data_t *obj) void SwitcherData::loadGeneralSettings(obs_data_t *obj)
@@ -642,6 +668,12 @@ void SwitcherData::loadGeneralSettings(obs_data_t *obj)
if (!tabOrderValid()) { if (!tabOrderValid()) {
resetTabOrder(); resetTabOrder();
} }
saveWindowGeo = obs_data_get_bool(obj, "saveWindowGeo");
windowPos = {(int)obs_data_get_int(obj, "windowPosX"),
(int)obs_data_get_int(obj, "windowPosY")};
windowSize = {(int)obs_data_get_int(obj, "windowWidth"),
(int)obs_data_get_int(obj, "windowHeight")};
} }
bool SwitcherData::tabOrderValid() bool SwitcherData::tabOrderValid()
@@ -763,6 +795,7 @@ void AdvSceneSwitcher::setupGeneralTab()
"AdvSceneSwitcher.generalTab.generalBehavior.cooldownHint")); "AdvSceneSwitcher.generalTab.generalBehavior.cooldownHint"));
ui->verboseLogging->setChecked(switcher->verbose); ui->verboseLogging->setChecked(switcher->verbose);
ui->saveWindowGeo->setChecked(switcher->saveWindowGeo);
ui->uiHintsDisable->setChecked(switcher->disableHints); ui->uiHintsDisable->setChecked(switcher->disableHints);
for (int p : switcher->functionNamesByPriority) { for (int p : switcher->functionNamesByPriority) {

View File

@@ -62,6 +62,7 @@ public:
void setupVideoTab(); void setupVideoTab();
void setupNetworkTab(); void setupNetworkTab();
void setTabOrder(); void setTabOrder();
void restoreWindowGeo();
static bool DisplayMessage(QString msg, bool question = false); static bool DisplayMessage(QString msg, bool question = false);
static void AskBackup(obs_data_t *obj); static void AskBackup(obs_data_t *obj);
@@ -150,6 +151,7 @@ public slots:
void on_sceneSequenceSwitches_itemDoubleClicked(QListWidgetItem *item); void on_sceneSequenceSwitches_itemDoubleClicked(QListWidgetItem *item);
void on_verboseLogging_stateChanged(int state); void on_verboseLogging_stateChanged(int state);
void on_saveWindowGeo_stateChanged(int state);
void on_uiHintsDisable_stateChanged(int state); void on_uiHintsDisable_stateChanged(int state);
void on_exportSettings_clicked(); void on_exportSettings_clicked();
@@ -164,6 +166,7 @@ public slots:
void on_defaultTransitionsUp_clicked(); void on_defaultTransitionsUp_clicked();
void on_defaultTransitionsDown_clicked(); void on_defaultTransitionsDown_clicked();
void on_transitionOverridecheckBox_stateChanged(int state); void on_transitionOverridecheckBox_stateChanged(int state);
void on_adjustActiveTransitionType_stateChanged(int state);
void defTransitionDelayValueChanged(int value); void defTransitionDelayValueChanged(int value);
void on_browseButton_clicked(); void on_browseButton_clicked();
@@ -285,12 +288,14 @@ bool isInFocus(const QString &executable);
void setNextTransition(OBSWeakSource &targetScene, obs_source_t *currentSource, void setNextTransition(OBSWeakSource &targetScene, obs_source_t *currentSource,
OBSWeakSource &transition, OBSWeakSource &transition,
bool &transitionOverrideOverride, transitionData &td); bool transitionOverrideOverride,
bool adjustActiveTransitionType, transitionData &td);
void overwriteTransitionOverride(obs_weak_source_t *sceneWs, void overwriteTransitionOverride(obs_weak_source_t *sceneWs,
obs_source_t *transition, transitionData &td); obs_source_t *transition, transitionData &td);
void restoreTransitionOverride(obs_source_t *scene, transitionData td); void restoreTransitionOverride(obs_source_t *scene, transitionData td);
void switchScene(OBSWeakSource &scene, OBSWeakSource &transition, void switchScene(OBSWeakSource &scene, OBSWeakSource &transition,
bool &transitionOverrideOverride); bool transitionOverrideOverride,
bool adjustActiveTransitionType, bool verbose);
/****************************************************************************** /******************************************************************************
* Main SwitcherData * Main SwitcherData

View File

@@ -62,6 +62,7 @@ struct SwitcherData {
bool disableHints = false; bool disableHints = false;
bool showFrame = false; bool showFrame = false;
bool tansitionOverrideOverride = false; bool tansitionOverrideOverride = false;
bool adjustActiveTransitionType = true;
int interval = default_interval; int interval = default_interval;
@@ -166,6 +167,10 @@ struct SwitcherData {
obs_hotkey_id stopHotkey = 0; obs_hotkey_id stopHotkey = 0;
obs_hotkey_id toggleHotkey = 0; obs_hotkey_id toggleHotkey = 0;
bool saveWindowGeo = false;
QPoint windowPos = {};
QSize windowSize = {};
bool versionChanged(obs_data_t *obj, std::string currentVersion); bool versionChanged(obs_data_t *obj, std::string currentVersion);
void Thread(); void Thread();

View File

@@ -203,6 +203,10 @@ void GetCurrentWindowTitle(std::string &title)
&format, &num, &bytes, &format, &num, &bytes,
(uint8_t **)&data); (uint8_t **)&data);
if (data == nullptr) {
return;
}
int status = 0; int status = 0;
XTextProperty text; XTextProperty text;
if (xstatus == Success) { if (xstatus == Success) {
@@ -386,4 +390,4 @@ int secondsSinceLastInput()
XCloseDisplay(display); XCloseDisplay(display);
return idle_time; return idle_time;
} }

View File

@@ -268,7 +268,8 @@ std::string processMessage(std::string payload)
"'"; "'";
} }
switchScene(scene, transition, switcher->tansitionOverrideOverride); switchScene(scene, transition, switcher->tansitionOverrideOverride,
switcher->adjustActiveTransitionType, switcher->verbose);
return ret; return ret;
} }

View File

@@ -182,12 +182,31 @@ void AdvSceneSwitcher::on_transitionOverridecheckBox_stateChanged(int state)
return; return;
} }
std::lock_guard<std::mutex> lock(switcher->m); if (!state && !switcher->adjustActiveTransitionType) {
if (!state) { DisplayMessage(obs_module_text(
switcher->tansitionOverrideOverride = false; "AdvSceneSwitcher.transitionTab.transitionBehaviorSelectionError"));
} else { ui->adjustActiveTransitionType->setChecked(true);
switcher->tansitionOverrideOverride = true;
} }
std::lock_guard<std::mutex> lock(switcher->m);
switcher->tansitionOverrideOverride = state;
}
void AdvSceneSwitcher::on_adjustActiveTransitionType_stateChanged(int state)
{
if (loading) {
return;
}
// This option only makes sense if we are allowed to use transition overrides
if (!state && !switcher->tansitionOverrideOverride) {
DisplayMessage(obs_module_text(
"AdvSceneSwitcher.transitionTab.transitionBehaviorSelectionError"));
ui->transitionOverridecheckBox->setChecked(true);
}
std::lock_guard<std::mutex> lock(switcher->m);
switcher->adjustActiveTransitionType = state;
} }
void AdvSceneSwitcher::defTransitionDelayValueChanged(int value) void AdvSceneSwitcher::defTransitionDelayValueChanged(int value)
@@ -251,7 +270,8 @@ void restoreTransitionOverride(obs_source_t *scene, transitionData td)
void setNextTransition(OBSWeakSource &targetScene, obs_source_t *currentSource, void setNextTransition(OBSWeakSource &targetScene, obs_source_t *currentSource,
OBSWeakSource &transition, OBSWeakSource &transition,
bool &transitionOverrideOverride, transitionData &td) bool transitionOverrideOverride,
bool adjustActiveTransitionType, transitionData &td)
{ {
obs_weak_source_t *currentScene = obs_weak_source_t *currentScene =
obs_source_get_weak_source(currentSource); obs_source_get_weak_source(currentSource);
@@ -266,7 +286,7 @@ void setNextTransition(OBSWeakSource &targetScene, obs_source_t *currentSource,
nextTransition = obs_weak_source_get_source(transition); nextTransition = obs_weak_source_get_source(transition);
} }
if (nextTransition) { if (nextTransition && adjustActiveTransitionType) {
obs_frontend_set_current_transition(nextTransition); obs_frontend_set_current_transition(nextTransition);
} }
@@ -334,6 +354,8 @@ void SwitcherData::saveSceneTransitions(obs_data_t *obj)
obs_data_set_bool(obj, "tansitionOverrideOverride", obs_data_set_bool(obj, "tansitionOverrideOverride",
switcher->tansitionOverrideOverride); switcher->tansitionOverrideOverride);
obs_data_set_bool(obj, "adjustActiveTransitionType",
switcher->adjustActiveTransitionType);
obs_data_set_default_int(obj, "defTransitionDelay", obs_data_set_default_int(obj, "defTransitionDelay",
default_def_transition_dealy); default_def_transition_dealy);
obs_data_set_int(obj, "defTransitionDelay", obs_data_set_int(obj, "defTransitionDelay",
@@ -390,6 +412,8 @@ void SwitcherData::loadSceneTransitions(obs_data_t *obj)
switcher->tansitionOverrideOverride = switcher->tansitionOverrideOverride =
obs_data_get_bool(obj, "tansitionOverrideOverride"); obs_data_get_bool(obj, "tansitionOverrideOverride");
switcher->adjustActiveTransitionType =
obs_data_get_bool(obj, "adjustActiveTransitionType");
DefaultSceneTransition::delay = DefaultSceneTransition::delay =
obs_data_get_int(obj, "defTransitionDelay"); obs_data_get_int(obj, "defTransitionDelay");
} }
@@ -430,6 +454,8 @@ void AdvSceneSwitcher::setupTransitionsTab()
ui->transitionOverridecheckBox->setChecked( ui->transitionOverridecheckBox->setChecked(
switcher->tansitionOverrideOverride); switcher->tansitionOverrideOverride);
ui->adjustActiveTransitionType->setChecked(
switcher->adjustActiveTransitionType);
QSpinBox *defTransitionDelay = new QSpinBox(); QSpinBox *defTransitionDelay = new QSpinBox();
defTransitionDelay->setSuffix("ms"); defTransitionDelay->setSuffix("ms");