From d1a62c51efcf2aded8d2fa12515b7b1fb97531ca Mon Sep 17 00:00:00 2001 From: evgeny Date: Sat, 31 Oct 2026 17:19:23 +0100 Subject: [PATCH] Persist optional double-press locking for the radio hotkey --- tools/chatgui/src/ptt_hotkey_manager.cpp | 12 ++++++++++-- tools/chatgui/src/ptt_hotkey_manager.h | 3 +++ tools/chatgui/src/settingsdialog.cpp | 5 +++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/tools/chatgui/src/ptt_hotkey_manager.cpp b/tools/chatgui/src/ptt_hotkey_manager.cpp index b0de1432..c9794fd7 100644 --- a/tools/chatgui/src/ptt_hotkey_manager.cpp +++ b/tools/chatgui/src/ptt_hotkey_manager.cpp @@ -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) diff --git a/tools/chatgui/src/ptt_hotkey_manager.h b/tools/chatgui/src/ptt_hotkey_manager.h index 4d7f0f8d..87ec218e 100644 --- a/tools/chatgui/src/ptt_hotkey_manager.h +++ b/tools/chatgui/src/ptt_hotkey_manager.h @@ -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 от этой настройки не зависит. }; diff --git a/tools/chatgui/src/settingsdialog.cpp b/tools/chatgui/src/settingsdialog.cpp index 941c6ba8..e9b265d1 100644 --- a/tools/chatgui/src/settingsdialog.cpp +++ b/tools/chatgui/src/settingsdialog.cpp @@ -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 policies[] = {{"join_policy", m_joinPolicyCombo->currentIndex()},