diff --git a/UI/data/locale/en-US.ini b/UI/data/locale/en-US.ini
index f17721779..308d2947e 100644
--- a/UI/data/locale/en-US.ini
+++ b/UI/data/locale/en-US.ini
@@ -844,7 +844,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 b63a4ddd7..7e511263f 100644
--- a/UI/forms/OBSBasicSettings.ui
+++ b/UI/forms/OBSBasicSettings.ui
@@ -151,8 +151,8 @@
0
0
- 806
- 1225
+ 803
+ 954
@@ -1180,8 +1180,8 @@
0
0
- 813
- 761
+ 601
+ 631
@@ -3628,8 +3628,8 @@
0
0
- 767
- 582
+ 555
+ 469
@@ -4443,9 +4443,9 @@
0
- 0
- 806
- 933
+ -114
+ 803
+ 761
@@ -5143,17 +5143,23 @@
Basic.Settings.Hotkeys
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
2
- -
-
+
-
+
- Basic.Settings.Advanced.Hotkeys.DisableHotkeysInFocus
+ Basic.Settings.Advanced.Hotkeys.HotkeyFocusBehavior
- -
+
-
+
+
+ -
Qt::Horizontal
@@ -5161,7 +5167,7 @@
170
- 20
+ 0
@@ -5407,7 +5413,6 @@
enableNewSocketLoop
enableLowLatencyMode
browserHWAccel
- disableFocusHotkeys
diff --git a/UI/obs-app.cpp b/UI/obs-app.cpp
index ca5b0e976..46967e650 100644
--- a/UI/obs-app.cpp
+++ b/UI/obs-app.cpp
@@ -93,6 +93,9 @@ QObject *CreateShortcutFilter()
{
return new OBSEventFilter([](QObject *obj, QEvent *event) {
auto mouse_event = [](QMouseEvent &event) {
+ if (!App()->HotkeysEnabledInFocus())
+ return true;
+
obs_key_combination_t hotkey = {0, OBS_KEY_NONE};
bool pressed = event.type() == QEvent::MouseButtonPress;
@@ -147,6 +150,9 @@ QObject *CreateShortcutFilter()
};
auto key_event = [&](QKeyEvent *event) {
+ if (!App()->HotkeysEnabledInFocus())
+ return true;
+
QDialog *dialog = qobject_cast(obj);
obs_key_combination_t hotkey = {0, OBS_KEY_NONE};
@@ -426,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);
@@ -693,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);
@@ -706,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);
@@ -718,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);
@@ -736,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);
@@ -1221,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();
@@ -1251,13 +1266,34 @@ 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::EnableInFocusHotkeys(bool enable)
+void OBSApp::UpdateHotkeyFocusSetting(bool resetState)
{
- enableHotkeysInFocus = enable;
- ResetHotkeyState(applicationState() != Qt::ApplicationActive);
+ 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::DisableHotkeys()
+{
+ enableHotkeysInFocus = false;
+ enableHotkeysOutOfFocus = false;
+ ResetHotkeyState(applicationState() == Qt::ApplicationActive);
}
Q_DECLARE_METATYPE(VoidFunc)
@@ -1307,9 +1343,9 @@ bool OBSApp::OBSInit()
connect(this, &QGuiApplication::applicationStateChanged,
[this](Qt::ApplicationState state) {
- ResetHotkeyState(state != Qt::ApplicationActive);
+ ResetHotkeyState(state == Qt::ApplicationActive);
});
- ResetHotkeyState(applicationState() != Qt::ApplicationActive);
+ ResetHotkeyState(applicationState() == Qt::ApplicationActive);
return true;
}
diff --git a/UI/obs-app.hpp b/UI/obs-app.hpp
index 94ae84460..b550ea80a 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,13 @@ public:
void AppInit();
bool OBSInit();
- void EnableInFocusHotkeys(bool enable);
+ void UpdateHotkeyFocusSetting(bool reset = true);
+ void DisableHotkeys();
+
+ inline bool HotkeysEnabledInFocus() const
+ {
+ return enableHotkeysInFocus;
+ }
inline QMainWindow *GetMainWindow() const { return mainWindow.data(); }
diff --git a/UI/window-basic-settings.cpp b/UI/window-basic-settings.cpp
index e2e753b78..c2083e169 100644
--- a/UI/window-basic-settings.cpp
+++ b/UI/window-basic-settings.cpp
@@ -464,10 +464,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);
@@ -742,16 +752,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);
}
@@ -2253,6 +2262,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;
@@ -2325,9 +2336,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;
}
@@ -2930,9 +2939,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)) {