diff --git a/obs/data/locale/en-US.ini b/obs/data/locale/en-US.ini index 0c0dc76cab59fbf902493684b8a7955862796926..8b9770c95bb6ef70e365050d3976bbea53f64c78 100644 --- a/obs/data/locale/en-US.ini +++ b/obs/data/locale/en-US.ini @@ -362,6 +362,10 @@ Basic.Settings.Hotkeys="Hotkeys" Basic.Settings.Hotkeys.Pair="Key combinations shared with '%1' act as toggles" # basic mode hotkeys +Basic.Hotkeys.StartStreaming="Start Streaming" +Basic.Hotkeys.StopStreaming="Stop Streaming" +Basic.Hotkeys.StartRecording="Start Recording" +Basic.Hotkeys.StopRecording="Stop Recording" Basic.Hotkeys.SelectScene="Switch to scene" # hotkeys that may lack translation on certain operating systems diff --git a/obs/window-basic-main.cpp b/obs/window-basic-main.cpp index e0532bb26c6e58037ddd5a534e99fcc2d7bdf0fc..ed4e838e6ab20eae852b2847f1a812e01c07b625 100644 --- a/obs/window-basic-main.cpp +++ b/obs/window-basic-main.cpp @@ -662,6 +662,7 @@ void OBSBasic::OBSInit() obs_load_all_modules(); ResetOutputs(); + CreateHotkeys(); if (!InitService()) throw "Failed to initialize service"; @@ -750,6 +751,77 @@ void OBSBasic::HotkeyTriggered(void *data, obs_hotkey_id id, bool pressed) Q_ARG(obs_hotkey_id, id), Q_ARG(bool, pressed)); } +void OBSBasic::CreateHotkeys() +{ + auto LoadHotkeyData = [&](const char *name) -> OBSData + { + const char *info = config_get_string(basicConfig, + "Hotkeys", name); + if (!info) + return {}; + + obs_data_t *data = obs_data_create_from_json(info); + if (!data) + return {}; + + OBSData res = data; + obs_data_release(data); + return res; + }; + + auto LoadHotkeyPair = [&](obs_hotkey_pair_id id, const char *name0, + const char *name1) + { + obs_data_array_t *array0 = + obs_data_get_array(LoadHotkeyData(name0), "bindings"); + obs_data_array_t *array1 = + obs_data_get_array(LoadHotkeyData(name1), "bindings"); + + obs_hotkey_pair_load(id, array0, array1); + obs_data_array_release(array0); + obs_data_array_release(array1); + }; + +#define MAKE_CALLBACK(pred, method) \ + [](void *data, obs_hotkey_pair_id, obs_hotkey_t*, bool pressed) \ + { \ + OBSBasic &basic = *static_cast(data); \ + if (pred && pressed) { \ + method(); \ + return true; \ + } \ + return false; \ + } + + streamingHotkeys = obs_hotkey_pair_register_frontend( + "OBSBasic.StartStreaming", + Str("Basic.Hotkeys.StartStreaming"), + "OBSBasic.StopStreaming", + Str("Basic.Hotkeys.StopStreaming"), + MAKE_CALLBACK(!basic.outputHandler->StreamingActive(), + basic.StartStreaming), + MAKE_CALLBACK(basic.outputHandler->StreamingActive(), + basic.StopStreaming), + this, this); + LoadHotkeyPair(streamingHotkeys, + "OBSBasic.StartStreaming", "OBSBasic.StopStreaming"); + + recordingHotkeys = obs_hotkey_pair_register_frontend( + "OBSBasic.StartRecording", + Str("Basic.Hotkeys.StartRecording"), + "OBSBasic.StopRecording", + Str("Basic.Hotkeys.StopRecording"), + MAKE_CALLBACK(!basic.outputHandler->RecordingActive(), + basic.StartRecording), + MAKE_CALLBACK(basic.outputHandler->RecordingActive(), + basic.StopRecording), + this, this); + LoadHotkeyPair(recordingHotkeys, + "OBSBasic.StartRecording", "OBSBasic.StopRecording"); + +#undef MAKE_CALLBACK +} + OBSBasic::~OBSBasic() { bool previewEnabled = obs_preview_enabled(); @@ -764,6 +836,8 @@ OBSBasic::~OBSBasic() os_cpu_usage_info_destroy(cpuUsageInfo); obs_hotkey_set_callback_routing_func(nullptr, nullptr); + obs_hotkey_pair_unregister(streamingHotkeys); + obs_hotkey_pair_unregister(recordingHotkeys); service = nullptr; outputHandler.reset(); diff --git a/obs/window-basic-main.hpp b/obs/window-basic-main.hpp index a628e3fd5e5c853ae35f52d746f74727eda52eb9..f200db73d4bff3dff3a692edcd425a4940289d02 100644 --- a/obs/window-basic-main.hpp +++ b/obs/window-basic-main.hpp @@ -113,6 +113,7 @@ private: void Load(const char *file); void InitHotkeys(); + void CreateHotkeys(); bool InitService(); @@ -151,6 +152,8 @@ private: void Nudge(int dist, MoveDir dir); void OpenProjector(obs_source_t *source, int monitor); + obs_hotkey_pair_id streamingHotkeys, recordingHotkeys; + public slots: void StartStreaming(); void StopStreaming();