Skip to content

Commit efaf9a2

Browse files
committed
Add option to check if hotkey is released
This was already possible previously by inverting the logic with a "not", however, this should it make it more obvious that this type of check is possible.
1 parent edb2952 commit efaf9a2

File tree

9 files changed

+71
-37
lines changed

9 files changed

+71
-37
lines changed

data/locale/de-DE.ini

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,8 +287,8 @@ AdvSceneSwitcher.condition.sceneOrder.entry="Auf{{scenes}}{{sources}}{{condition
287287
AdvSceneSwitcher.condition.hotkey="Hotkey"
288288
AdvSceneSwitcher.condition.hotkey.name="Makro-Trigger-Hotkey"
289289
AdvSceneSwitcher.condition.hotkey.tip="Hinweis: Die Tastenkombinationen für diesen Hotkey können in den OBS-Einstellungen konfiguriert werden"
290-
AdvSceneSwitcher.condition.hotkey.entry.line1="Hotkey ist gedrückt"
291-
AdvSceneSwitcher.condition.hotkey.entry.line2="Name: {{name}}"
290+
AdvSceneSwitcher.condition.hotkey.entry.keyState="Hotkey ist{{keyState}}"
291+
AdvSceneSwitcher.condition.hotkey.entry.name="Name:{{name}}"
292292
AdvSceneSwitcher.condition.replay="Replay Buffer"
293293
AdvSceneSwitcher.condition.replay.state.stopped="Replay Buffer gestoppt"
294294
AdvSceneSwitcher.condition.replay.state.started="Replay Buffer gestartet"

data/locale/en-US.ini

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -482,10 +482,12 @@ AdvSceneSwitcher.condition.sceneOrder.type.position="Is at position"
482482
AdvSceneSwitcher.condition.sceneOrder.positionInfo="The position value starts at the bottom with 0 and increases by one for each scene item including the ones in scene groups"
483483
AdvSceneSwitcher.condition.sceneOrder.entry="On{{scenes}}{{sources}}{{conditions}}{{sources2}}{{position}}"
484484
AdvSceneSwitcher.condition.hotkey="Hotkey"
485+
AdvSceneSwitcher.condition.hotkey.pressed="pressed"
486+
AdvSceneSwitcher.condition.hotkey.released="released"
485487
AdvSceneSwitcher.condition.hotkey.name="Macro trigger hotkey"
486488
AdvSceneSwitcher.condition.hotkey.tip="Note: You can configure the keybindings for this hotkey in the OBS settings window"
487-
AdvSceneSwitcher.condition.hotkey.entry.line1="Hotkey is pressed"
488-
AdvSceneSwitcher.condition.hotkey.entry.line2="Name:{{name}}"
489+
AdvSceneSwitcher.condition.hotkey.entry.keyState="Hotkey is{{keyState}}"
490+
AdvSceneSwitcher.condition.hotkey.entry.name="Name:{{name}}"
489491
AdvSceneSwitcher.condition.replay="Replay buffer"
490492
AdvSceneSwitcher.condition.replay.state.stopped="Replay buffer stopped"
491493
AdvSceneSwitcher.condition.replay.state.started="Replay buffer started"

data/locale/es-ES.ini

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,8 +238,7 @@ AdvSceneSwitcher.condition.sceneOrder.entry="En{{scenes}}{{sources}}{{conditions
238238
AdvSceneSwitcher.condition.hotkey="Tecla de acceso rápido"
239239
AdvSceneSwitcher.condition.hotkey.name="Tecla de acceso directo de activación de macro"
240240
AdvSceneSwitcher.condition.hotkey.tip="Nota: puede configurar las combinaciones de teclas para esta tecla de acceso rápido en la ventana de configuración de OBS"
241-
AdvSceneSwitcher.condition.hotkey.entry.line1="Se presiona la tecla de acceso rápido"
242-
AdvSceneSwitcher.condition.hotkey.entry.line2="Nombre: {{name}}"
241+
AdvSceneSwitcher.condition.hotkey.entry.name="Nombre:{{name}}"
243242
AdvSceneSwitcher.condition.replay="Búfer de reproducción"
244243
AdvSceneSwitcher.condition.replay.state.stopped="Búfer de reproducción detenido"
245244
AdvSceneSwitcher.condition.replay.state.started="Búfer de reproducción iniciado"

data/locale/fr-FR.ini

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -351,8 +351,7 @@ AdvSceneSwitcher.condition.sceneOrder.entry="Sur{{scenes}}{{sources}}{{condition
351351
AdvSceneSwitcher.condition.hotkey="Raccourci clavier"
352352
AdvSceneSwitcher.condition.hotkey.name="Raccourci clavier de déclenchement de macro"
353353
AdvSceneSwitcher.condition.hotkey.tip="Remarque : Vous pouvez configurer les raccourcis clavier pour ce raccourci dans la fenêtre de paramètres d'OBS"
354-
AdvSceneSwitcher.condition.hotkey.entry.line1="Raccourci clavier est enfoncé"
355-
AdvSceneSwitcher.condition.hotkey.entry.line2="Nom :{{name}}"
354+
AdvSceneSwitcher.condition.hotkey.entry.name="Nom:{{name}}"
356355
AdvSceneSwitcher.condition.replay="Tampon de répétition"
357356
AdvSceneSwitcher.condition.replay.state.stopped="Tampon de répétition arrêté"
358357
AdvSceneSwitcher.condition.replay.state.started="Tampon de répétition démarré"

data/locale/zh-CN.ini

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -332,8 +332,7 @@ AdvSceneSwitcher.condition.sceneOrder.entry="在 {{scenes}} {{sources}} {{condit
332332
AdvSceneSwitcher.condition.hotkey="热键"
333333
AdvSceneSwitcher.condition.hotkey.name="宏触发热键"
334334
AdvSceneSwitcher.condition.hotkey.tip="注意:您可以在OBS设置窗口中为此热键配置按键绑定"
335-
AdvSceneSwitcher.condition.hotkey.entry.line1="热键被按下"
336-
AdvSceneSwitcher.condition.hotkey.entry.line2="名称: {{name}}"
335+
AdvSceneSwitcher.condition.hotkey.entry.name="名称:{{name}}"
337336
AdvSceneSwitcher.condition.replay="回放缓存"
338337
AdvSceneSwitcher.condition.replay.state.stopped="回放缓存已停止"
339338
AdvSceneSwitcher.condition.replay.state.started="回放缓存已启动"

plugins/base/macro-condition-hotkey.cpp

Lines changed: 53 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,17 @@ MacroConditionHotkey::MacroConditionHotkey(Macro *m) : MacroCondition(m)
2323

2424
bool MacroConditionHotkey::CheckCondition()
2525
{
26-
const bool hotkeyIsCurrentlyPressed = _hotkey->GetPressed();
27-
const bool hotkeyWasPressedSinceLastCheck = _hotkey->GetLastPressed() >
28-
_lastCheck;
26+
const bool keyStateCurrentlyMatches =
27+
_checkPressed ? _hotkey->GetPressed() : !_hotkey->GetPressed();
28+
const auto lastKeyStateMatch = _checkPressed
29+
? _hotkey->GetLastPressed()
30+
: _hotkey->GetLastReleased();
31+
const bool hotkeySateChangedSinceLastCheck = lastKeyStateMatch >
32+
_lastCheck;
2933
const bool macroWasPausedSinceLastCheck =
3034
MacroWasPausedSince(GetMacro(), _lastCheck);
31-
bool ret = hotkeyIsCurrentlyPressed ||
32-
(hotkeyWasPressedSinceLastCheck &&
35+
bool ret = keyStateCurrentlyMatches ||
36+
(hotkeySateChangedSinceLastCheck &&
3337
!macroWasPausedSinceLastCheck);
3438
_lastCheck = std::chrono::high_resolution_clock::now();
3539
return ret;
@@ -39,6 +43,7 @@ bool MacroConditionHotkey::Save(obs_data_t *obj) const
3943
{
4044
MacroCondition::Save(obj);
4145
_hotkey->Save(obj);
46+
obs_data_set_bool(obj, "checkPressed", _checkPressed);
4247
return true;
4348
}
4449

@@ -52,34 +57,47 @@ bool MacroConditionHotkey::Load(obs_data_t *obj)
5257
"hotkey name conflict for \"%s\" - using previous key bind",
5358
description);
5459
}
60+
if (obs_data_has_user_value(obj, "checkPressed")) {
61+
_checkPressed = obs_data_get_bool(obj, "checkPressed");
62+
} else { // TODO: Remove fallback at some point in the future
63+
_checkPressed = true;
64+
}
5565
return true;
5666
}
5767

5868
MacroConditionHotkeyEdit::MacroConditionHotkeyEdit(
5969
QWidget *parent, std::shared_ptr<MacroConditionHotkey> entryData)
60-
: QWidget(parent)
70+
: QWidget(parent),
71+
_name(new QLineEdit()),
72+
_keyState(new QComboBox())
6173
{
62-
_name = new QLineEdit();
63-
QLabel *line1 = new QLabel(obs_module_text(
64-
"AdvSceneSwitcher.condition.hotkey.entry.line1"));
65-
QLabel *hint = new QLabel(
66-
obs_module_text("AdvSceneSwitcher.condition.hotkey.tip"));
74+
_keyState->addItems(
75+
QStringList()
76+
<< obs_module_text("AdvSceneSwitcher.condition.hotkey.pressed")
77+
<< obs_module_text(
78+
"AdvSceneSwitcher.condition.hotkey.released"));
6779

6880
QWidget::connect(_name, SIGNAL(editingFinished()), this,
6981
SLOT(NameChanged()));
70-
71-
QHBoxLayout *switchLayout = new QHBoxLayout;
72-
std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
73-
{"{{name}}", _name},
74-
};
75-
PlaceWidgets(obs_module_text(
76-
"AdvSceneSwitcher.condition.hotkey.entry.line2"),
77-
switchLayout, widgetPlaceholders);
78-
79-
QVBoxLayout *mainLayout = new QVBoxLayout;
80-
mainLayout->addWidget(line1);
81-
mainLayout->addLayout(switchLayout);
82-
mainLayout->addWidget(hint);
82+
QWidget::connect(_keyState, SIGNAL(currentIndexChanged(int)), this,
83+
SLOT(KeyStateChanged(int)));
84+
85+
auto keyStateLayout = new QHBoxLayout;
86+
PlaceWidgets(
87+
obs_module_text(
88+
"AdvSceneSwitcher.condition.hotkey.entry.keyState"),
89+
keyStateLayout, {{"{{keyState}}", _keyState}});
90+
91+
auto nameLayout = new QHBoxLayout;
92+
PlaceWidgets(
93+
obs_module_text("AdvSceneSwitcher.condition.hotkey.entry.name"),
94+
nameLayout, {{"{{name}}", _name}});
95+
96+
auto mainLayout = new QVBoxLayout;
97+
mainLayout->addLayout(keyStateLayout);
98+
mainLayout->addLayout(nameLayout);
99+
mainLayout->addWidget(new QLabel(
100+
obs_module_text("AdvSceneSwitcher.condition.hotkey.tip")));
83101
setLayout(mainLayout);
84102

85103
_entryData = entryData;
@@ -116,6 +134,17 @@ void MacroConditionHotkeyEdit::UpdateEntryData()
116134

117135
_name->setText(
118136
QString::fromStdString(_entryData->_hotkey->GetDescription()));
137+
_keyState->setCurrentIndex(_entryData->_checkPressed ? 0 : 1);
138+
}
139+
140+
void MacroConditionHotkeyEdit::KeyStateChanged(int index)
141+
{
142+
if (_loading || !_entryData) {
143+
return;
144+
}
145+
146+
auto lock = LockContext();
147+
_entryData->_checkPressed = index == 0;
119148
}
120149

121150
} // namespace advss

plugins/base/macro-condition-hotkey.hpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class MacroConditionHotkey : public MacroCondition {
2020
}
2121

2222
std::shared_ptr<Hotkey> _hotkey;
23+
bool _checkPressed = true;
2324

2425
private:
2526
std::chrono::high_resolution_clock::time_point _lastCheck{};
@@ -46,12 +47,12 @@ class MacroConditionHotkeyEdit : public QWidget {
4647

4748
private slots:
4849
void NameChanged();
50+
void KeyStateChanged(int);
4951

50-
protected:
52+
private:
5153
QLineEdit *_name;
54+
QComboBox *_keyState;
5255
std::shared_ptr<MacroConditionHotkey> _entryData;
53-
54-
private:
5556
bool _loading = true;
5657
};
5758

plugins/base/utils/hotkey-helpers.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,9 @@ void Hotkey::Callback(void *data, obs_hotkey_id, obs_hotkey_t *, bool pressed)
116116
if (pressed) {
117117
hotkey->_lastPressed =
118118
std::chrono::high_resolution_clock::now();
119+
} else {
120+
hotkey->_lastReleased =
121+
std::chrono::high_resolution_clock::now();
119122
}
120123
hotkey->_pressed = pressed;
121124
}

plugins/base/utils/hotkey-helpers.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class Hotkey {
2727

2828
bool GetPressed() const { return _pressed; }
2929
auto GetLastPressed() const { return _lastPressed; }
30+
auto GetLastReleased() const { return _lastReleased; }
3031
std::string GetDescription() const { return _description; }
3132
bool UpdateDescription(const std::string &);
3233

@@ -43,6 +44,7 @@ class Hotkey {
4344
obs_hotkey_id _hotkeyID = OBS_INVALID_HOTKEY_ID;
4445
bool _pressed = false;
4546
std::chrono::high_resolution_clock::time_point _lastPressed{};
47+
std::chrono::high_resolution_clock::time_point _lastReleased{};
4648
// When set will not attempt to share settings with existing hotkey
4749
bool _ignoreExistingHotkeys = false;
4850
};

0 commit comments

Comments
 (0)