diff --git a/UI/data/locale/en-US.ini b/UI/data/locale/en-US.ini
index 7c997f385fa4f863d0c38016acf8d77473262e6e..472457fca3a0a2e46a444e49da1a337b0651b4f2 100644
--- a/UI/data/locale/en-US.ini
+++ b/UI/data/locale/en-US.ini
@@ -831,7 +831,10 @@ Basic.Settings.Advanced.Network="Network"
Basic.Settings.Advanced.Network.BindToIP="Bind to IP"
Basic.Settings.Advanced.Network.EnableNewSocketLoop="Enable new networking code"
Basic.Settings.Advanced.Network.EnableLowLatencyMode="Low latency mode"
+Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior="Hotkey Focus Behavior"
+Basic.Settings.Advanced.Hotkeys.NeverDisableHotkeys="Never disable hotkeys"
Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus="Disable hotkeys when main window is in focus"
+Basic.Settings.Advanced.Hotkeys.DisableHotkeysOutOfFocus="Disable hotkeys when main window is not in focus"
Basic.Settings.Advanced.AutoRemux="Automatically remux to mp4"
Basic.Settings.Advanced.AutoRemux.MP4="(record as mkv)"
diff --git a/UI/forms/OBSBasicSettings.ui b/UI/forms/OBSBasicSettings.ui
index c93f2f2e62dbd572c8e008cbe97286cb0331326e..0c8f94256809c257918397cf1f9ff4a969e12c4c 100644
--- a/UI/forms/OBSBasicSettings.ui
+++ b/UI/forms/OBSBasicSettings.ui
@@ -151,8 +151,8 @@
0
0
- 806
- 1225
+ 803
+ 954
@@ -1173,8 +1173,8 @@
0
0
- 813
- 761
+ 601
+ 631
@@ -3621,8 +3621,8 @@
0
0
- 767
- 582
+ 555
+ 469
@@ -4436,9 +4436,9 @@
0
- 0
- 806
- 933
+ -114
+ 803
+ 761
@@ -5136,17 +5136,23 @@
Basic.Settings.Hotkeys
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
2
- -
-
+
-
+
- Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus
+ Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior
- -
+
-
+
+
+ -
Qt::Horizontal
@@ -5154,7 +5160,7 @@
170
- 20
+ 0
@@ -5399,7 +5405,6 @@
enableNewSocketLoop
enableLowLatencyMode
browserHWAccel
- disableFocusHotkeys
diff --git a/UI/obs-app.cpp b/UI/obs-app.cpp
index 234e0d60cb451d35ea32554f49333dd200962520..46967e650f726a96b71ebe9287ed840dc42704ae 100644
--- a/UI/obs-app.cpp
+++ b/UI/obs-app.cpp
@@ -432,6 +432,9 @@ bool OBSApp::InitGlobalConfigDefaults()
"CurrentTheme", DEFAULT_THEME);
}
+ config_set_default_string(globalConfig, "General", "HotkeyFocusType",
+ "NeverDisableHotkeys");
+
config_set_default_bool(globalConfig, "BasicWindow",
"VerticalVolControl", false);
@@ -699,9 +702,10 @@ bool OBSApp::InitGlobalConfig()
}
}
+ uint32_t lastVersion =
+ config_get_int(globalConfig, "General", "LastVersion");
+
if (!config_has_user_value(globalConfig, "General", "Pre19Defaults")) {
- uint32_t lastVersion =
- config_get_int(globalConfig, "General", "LastVersion");
bool useOldDefaults = lastVersion &&
lastVersion <
MAKE_SEMANTIC_VERSION(19, 0, 0);
@@ -712,8 +716,6 @@ bool OBSApp::InitGlobalConfig()
}
if (!config_has_user_value(globalConfig, "General", "Pre21Defaults")) {
- uint32_t lastVersion =
- config_get_int(globalConfig, "General", "LastVersion");
bool useOldDefaults = lastVersion &&
lastVersion <
MAKE_SEMANTIC_VERSION(21, 0, 0);
@@ -724,8 +726,6 @@ bool OBSApp::InitGlobalConfig()
}
if (!config_has_user_value(globalConfig, "General", "Pre23Defaults")) {
- uint32_t lastVersion =
- config_get_int(globalConfig, "General", "LastVersion");
bool useOldDefaults = lastVersion &&
lastVersion <
MAKE_SEMANTIC_VERSION(23, 0, 0);
@@ -742,6 +742,16 @@ bool OBSApp::InitGlobalConfig()
changed |= UpdatePre22MultiviewLayout(layout);
}
+ if (lastVersion && lastVersion < MAKE_SEMANTIC_VERSION(24, 0, 0)) {
+ bool disableHotkeysInFocus = config_get_bool(
+ globalConfig, "General", "DisableHotkeysInFocus");
+ if (disableHotkeysInFocus)
+ config_set_string(globalConfig, "General",
+ "HotkeyFocusType",
+ "DisableHotkeysInFocus");
+ changed = true;
+ }
+
if (changed)
config_save_safe(globalConfig, "tmp", nullptr);
@@ -1227,8 +1237,7 @@ void OBSApp::AppInit()
EnableOSXVSync(false);
#endif
- enableHotkeysInFocus = !config_get_bool(globalConfig, "General",
- "DisableHotkeysInFocus");
+ UpdateHotkeyFocusSetting(false);
move_basic_to_profiles();
move_basic_to_scene_collections();
@@ -1257,12 +1266,33 @@ static bool StartupOBS(const char *locale, profiler_name_store_t *store)
inline void OBSApp::ResetHotkeyState(bool inFocus)
{
- obs_hotkey_enable_background_press(!inFocus || enableHotkeysInFocus);
+ obs_hotkey_enable_background_press(
+ (inFocus && enableHotkeysInFocus) ||
+ (!inFocus && enableHotkeysOutOfFocus));
+}
+
+void OBSApp::UpdateHotkeyFocusSetting(bool resetState)
+{
+ enableHotkeysInFocus = true;
+ enableHotkeysOutOfFocus = true;
+
+ const char *hotkeyFocusType =
+ config_get_string(globalConfig, "General", "HotkeyFocusType");
+
+ if (astrcmpi(hotkeyFocusType, "DisableHotkeysInFocus") == 0) {
+ enableHotkeysInFocus = false;
+ } else if (astrcmpi(hotkeyFocusType, "DisableHotkeysOutOfFocus") == 0) {
+ enableHotkeysOutOfFocus = false;
+ }
+
+ if (resetState)
+ ResetHotkeyState(applicationState() == Qt::ApplicationActive);
}
-void OBSApp::EnableInFocusHotkeys(bool enable)
+void OBSApp::DisableHotkeys()
{
- enableHotkeysInFocus = enable;
+ enableHotkeysInFocus = false;
+ enableHotkeysOutOfFocus = false;
ResetHotkeyState(applicationState() == Qt::ApplicationActive);
}
diff --git a/UI/obs-app.hpp b/UI/obs-app.hpp
index cc751ac68b9e1c76d151051f8cdbd8e181eb516d..b550ea80ad2eeda178cef6fcebe7924baf964631 100644
--- a/UI/obs-app.hpp
+++ b/UI/obs-app.hpp
@@ -80,6 +80,7 @@ private:
int sleepInhibitRefs = 0;
bool enableHotkeysInFocus = true;
+ bool enableHotkeysOutOfFocus = true;
std::deque translatorHooks;
@@ -105,7 +106,8 @@ public:
void AppInit();
bool OBSInit();
- void EnableInFocusHotkeys(bool enable);
+ void UpdateHotkeyFocusSetting(bool reset = true);
+ void DisableHotkeys();
inline bool HotkeysEnabledInFocus() const
{
diff --git a/UI/window-basic-settings.cpp b/UI/window-basic-settings.cpp
index 95f8cfa25b05e7fe3e8f341a030efc4214d2558f..4df5d77f7bbb457ae664e89049e56abb2652778f 100644
--- a/UI/window-basic-settings.cpp
+++ b/UI/window-basic-settings.cpp
@@ -463,10 +463,20 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
HookWidget(ui->bindToIP, COMBO_CHANGED, ADV_CHANGED);
HookWidget(ui->enableNewSocketLoop, CHECK_CHANGED, ADV_CHANGED);
HookWidget(ui->enableLowLatencyMode, CHECK_CHANGED, ADV_CHANGED);
- HookWidget(ui->disableFocusHotkeys, CHECK_CHANGED, ADV_CHANGED);
+ HookWidget(ui->hotkeyFocusType, COMBO_CHANGED, ADV_CHANGED);
HookWidget(ui->autoRemux, CHECK_CHANGED, ADV_CHANGED);
/* clang-format on */
+#define ADD_HOTKEY_FOCUS_TYPE(s) \
+ ui->hotkeyFocusType->addItem( \
+ QTStr("Basic.Settings.Advanced.Hotkeys." s), s)
+
+ ADD_HOTKEY_FOCUS_TYPE("NeverDisableHotkeys");
+ ADD_HOTKEY_FOCUS_TYPE("DisableHotkeysInFocus");
+ ADD_HOTKEY_FOCUS_TYPE("DisableHotkeysOutOfFocus");
+
+#undef ADD_HOTKEY_FOCUS_TYPE
+
ui->simpleOutputVBitrate->setSingleStep(50);
ui->simpleOutputVBitrate->setSuffix(" Kbps");
ui->advOutFFVBitrate->setSingleStep(50);
@@ -741,16 +751,15 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent)
UpdateAutomaticReplayBufferCheckboxes();
- App()->EnableInFocusHotkeys(false);
+ App()->DisableHotkeys();
}
OBSBasicSettings::~OBSBasicSettings()
{
- bool disableHotkeysInFocus = config_get_bool(
- App()->GlobalConfig(), "General", "DisableHotkeysInFocus");
delete ui->filenameFormatting->completer();
main->EnableOutputs(true);
- App()->EnableInFocusHotkeys(!disableHotkeysInFocus);
+
+ App()->UpdateHotkeyFocusSetting();
EnableThreadedMessageBoxes(false);
}
@@ -2243,6 +2252,8 @@ void OBSBasicSettings::LoadAdvancedSettings()
int rbTime = config_get_int(main->Config(), "AdvOut", "RecRBTime");
int rbSize = config_get_int(main->Config(), "AdvOut", "RecRBSize");
bool autoRemux = config_get_bool(main->Config(), "Video", "AutoRemux");
+ const char *hotkeyFocusType = config_get_string(
+ App()->GlobalConfig(), "General", "HotkeyFocusType");
loading = true;
@@ -2315,9 +2326,7 @@ void OBSBasicSettings::LoadAdvancedSettings()
ui->browserHWAccel->setChecked(browserHWAccel);
#endif
- bool disableFocusHotkeys = config_get_bool(
- App()->GlobalConfig(), "General", "DisableHotkeysInFocus");
- ui->disableFocusHotkeys->setChecked(disableFocusHotkeys);
+ SetComboByValue(ui->hotkeyFocusType, hotkeyFocusType);
loading = false;
}
@@ -2917,9 +2926,11 @@ void OBSBasicSettings::SaveAdvancedSettings()
browserHWAccel);
#endif
- bool disableFocusHotkeys = ui->disableFocusHotkeys->isChecked();
- config_set_bool(App()->GlobalConfig(), "General",
- "DisableHotkeysInFocus", disableFocusHotkeys);
+ if (WidgetChanged(ui->hotkeyFocusType)) {
+ QString str = GetComboData(ui->hotkeyFocusType);
+ config_set_string(App()->GlobalConfig(), "General",
+ "HotkeyFocusType", QT_TO_UTF8(str));
+ }
#ifdef __APPLE__
if (WidgetChanged(ui->disableOSXVSync)) {