Persist optional double-press locking for the radio hotkey

This commit is contained in:
evgeny committed 2026-10-31 17:19:23 +01:00
1 parent 11e9946549
commit d1a62c51ef
3 files changed
+16 -4

No files matched your search

+10 -2
View File
@@ -68,10 +68,10 @@ bool PttHotkeyManager::isSupported() {
void PttHotkeyManager::init(DbManager* db) {
m_db = db;
reload();
#ifdef UTUN_PTT_PORTAL
if (m_portal) { m_portal->initialize(); return; }
#endif
reload();
if (isSupported()) {
#ifdef Q_OS_LINUX
if (!m_display) return;
@@ -93,9 +93,17 @@ void PttHotkeyManager::setHotkey(const QString& value) {
}
void PttHotkeyManager::reload() {
setDoublePressEnabled(!m_db || !m_db->isOpen() || m_db->getUiState("radio_ptt_double_press") != "0");
setHotkey(m_db && m_db->isOpen() ? m_db->getUiState("radio_ptt_hotkey") : QString());
}
void PttHotkeyManager::setDoublePressEnabled(bool enabled) {
if (m_doublePressEnabled == enabled) return;
resetHotkey("double-press-setting-changed");
m_doublePressEnabled = enabled;
DEBUG_INFO(DEBUG_CATEGORY_RADIO, "PTT: shortcut double-press locking enabled=%d", enabled);
}
/* Одинаковое поведение физического сочетания и Wayland-сигналов, без реакции на автоповтор. */
void PttHotkeyManager::updatePressed(bool pressed) {
auto* engine = RadioAudioEngine::instance();
@@ -106,7 +114,7 @@ void PttHotkeyManager::updatePressed(bool pressed) {
}
if (m_activation.pressed == pressed) return;
bool latched = m_activation.latched;
m_activation.observe(pressed, m_clock.elapsed(), QApplication::doubleClickInterval());
m_activation.observe(pressed, m_clock.elapsed(), m_doublePressEnabled ? QApplication::doubleClickInterval() : 0);
DEBUG_DEBUG(DEBUG_CATEGORY_RADIO, "PTT: shortcut pressed=%d latched=%d talking=%d group=%016llx",
pressed, m_activation.latched, m_activation.talking, (unsigned long long)engine->groupId());
if (latched != m_activation.latched)
+3
View File
@@ -27,6 +27,8 @@ public:
/* Применяет одно физическое сочетание в памяти, снимая удержание/фиксацию; невалидное значение отключает хоткей.
* В режиме портала ничего не делает; БД не меняет. */
void setHotkey(const QString& chord);
/* Включает фиксацию двойным нажатием только для хоткея; изменение сбрасывает его текущее PTT, БД не меняет. */
void setDoublePressEnabled(bool enabled);
/* Загружает radio_ptt_hotkey; без открытой БД отключает сочетание. */
void reload();
/* Поддержка платформы: Windows, Linux/xcb либо выбранный portal; не проверяет доступность сервиса/устройства. */
@@ -78,4 +80,5 @@ private:
bool m_captureArmed = false; // Исходные клавиши полностью отпущены, можно выдавать keysChanged.
PttHotkeyState m_activation; // Общая для всех backend логика удержания/двойного нажатия.
QElapsedTimer m_clock; // Монотонные мс для двойного нажатия, запускаются в конструкторе.
bool m_doublePressEnabled = true; // radio_ptt_double_press: кнопка PTT от этой настройки не зависит.
};
+3 -2
View File
@@ -422,9 +422,10 @@ void SettingsDialog::onSave() {
return;
}
/* Физические сочетания сохраняем в БД; Wayland-хоткеями владеет системный портал. */
/* Фиксация относится только к хоткею; физическое назначение сохраняем сами, Wayland-назначением владеет портал. */
gui_bridge_post_setting(GUI_SETTING_UI_STATE, "radio_ptt_double_press", m_radioPage->doublePressEnabled() ? "1" : "0");
if (!PttHotkeyManager::usesPortal()) {
gui_bridge_post_setting(GUI_SETTING_UI_STATE, "radio_ptt_hotkeys", m_radioPage->hotkeys().join('|').toUtf8().constData());
gui_bridge_post_setting(GUI_SETTING_UI_STATE, "radio_ptt_hotkey", m_radioPage->hotkey().toUtf8().constData());
}
const QPair<const char*, int> policies[] = {{"join_policy", m_joinPolicyCombo->currentIndex()},