From 20b76a182ccf51f65332535802b7eb0b0beea919 Mon Sep 17 00:00:00 2001 From: Michail Vourlakos Date: Sun, 10 Feb 2019 02:39:09 +0200 Subject: [PATCH] add/enable option for MetaPressAndHold action --user can now enable/disable the Meta pressAndHold behavior that shows shortcuts badges. The new option is located at Latte preferences. BUG: 403840 --- app/lattecorona.cpp | 2 +- app/lattecorona.h | 2 +- app/settings/settingsdialog.cpp | 11 +++++++++-- app/settings/universalsettings.cpp | 22 ++++++++++++++++++++++ app/settings/universalsettings.h | 5 +++++ app/shortcuts/globalshortcuts.cpp | 10 ++++++++++ app/shortcuts/modifiertracker.cpp | 20 +++++++++++++++++++- app/shortcuts/modifiertracker.h | 6 ++++++ 8 files changed, 73 insertions(+), 5 deletions(-) diff --git a/app/lattecorona.cpp b/app/lattecorona.cpp index 68e6c800a..63abddb05 100644 --- a/app/lattecorona.cpp +++ b/app/lattecorona.cpp @@ -79,8 +79,8 @@ Corona::Corona(bool defaultLayoutOnStartup, QString layoutNameOnStartUp, int use m_layoutNameOnStartUp(layoutNameOnStartUp), m_activityConsumer(new KActivities::Consumer(this)), m_screenPool(new ScreenPool(KSharedConfig::openConfig(), this)), - m_globalShortcuts(new GlobalShortcuts(this)), m_universalSettings(new UniversalSettings(KSharedConfig::openConfig(), this)), + m_globalShortcuts(new GlobalShortcuts(this)), m_plasmaScreenPool(new PlasmaExtended::ScreenPool(this)), m_themeExtended(new PlasmaExtended::Theme(KSharedConfig::openConfig(), this)), m_layoutManager(new LayoutManager(this)) diff --git a/app/lattecorona.h b/app/lattecorona.h index 2bc065eca..93d0e5629 100644 --- a/app/lattecorona.h +++ b/app/lattecorona.h @@ -177,8 +177,8 @@ private: AbstractWindowInterface *m_wm{nullptr}; ScreenPool *m_screenPool{nullptr}; - GlobalShortcuts *m_globalShortcuts{nullptr}; UniversalSettings *m_universalSettings{nullptr}; + GlobalShortcuts *m_globalShortcuts{nullptr}; LayoutManager *m_layoutManager{nullptr}; PlasmaExtended::ScreenPool *m_plasmaScreenPool{nullptr}; diff --git a/app/settings/settingsdialog.cpp b/app/settings/settingsdialog.cpp index c7ef22499..68f4f0126 100644 --- a/app/settings/settingsdialog.cpp +++ b/app/settings/settingsdialog.cpp @@ -197,6 +197,7 @@ SettingsDialog::SettingsDialog(QWidget *parent, Latte::Corona *corona) connect(ui->autostartChkBox, &QCheckBox::stateChanged, this, &SettingsDialog::updateApplyButtonsState); connect(ui->metaPressChkBox, &QCheckBox::stateChanged, this, &SettingsDialog::updateApplyButtonsState); + connect(ui->metaPressHoldChkBox, &QCheckBox::stateChanged, this, &SettingsDialog::updateApplyButtonsState); connect(ui->infoWindowChkBox, &QCheckBox::stateChanged, this, &SettingsDialog::updateApplyButtonsState); connect(ui->tabWidget, &QTabWidget::currentChanged, this, &SettingsDialog::updateApplyButtonsState); @@ -754,6 +755,7 @@ void SettingsDialog::restoreDefaults() ui->autostartChkBox->setChecked(true); ui->infoWindowChkBox->setChecked(true); ui->metaPressChkBox->setChecked(false); + ui->metaPressHoldChkBox->setChecked(true); ui->noBordersForMaximizedChkBox->setChecked(false); ui->highSensitivityBtn->setChecked(true); ui->screenTrackerSpinBox->setValue(SCREENTRACKERDEFAULTVALUE); @@ -921,6 +923,7 @@ void SettingsDialog::loadSettings() ui->autostartChkBox->setChecked(m_corona->universalSettings()->autostart()); ui->infoWindowChkBox->setChecked(m_corona->universalSettings()->showInfoWindow()); ui->metaPressChkBox->setChecked(m_corona->universalSettings()->metaForwardedToLatte()); + ui->metaPressHoldChkBox->setChecked(m_corona->universalSettings()->metaPressAndHoldEnabled()); ui->noBordersForMaximizedChkBox->setChecked(m_corona->universalSettings()->canDisableBorders()); if (m_corona->universalSettings()->mouseSensitivity() == Types::LowSensitivity) { @@ -954,6 +957,7 @@ QList SettingsDialog::currentSettings() settings << (int)ui->autostartChkBox->isChecked(); settings << (int)ui->infoWindowChkBox->isChecked(); settings << (int)ui->metaPressChkBox->isChecked(); + settings << (int)ui->metaPressHoldChkBox->isChecked(); settings << (int)ui->noBordersForMaximizedChkBox->isChecked(); settings << m_mouseSensitivityButtons->checkedId(); settings << ui->screenTrackerSpinBox->value(); @@ -1209,6 +1213,7 @@ void SettingsDialog::updateApplyButtonsState() if (!ui->autostartChkBox->isChecked() || ui->metaPressChkBox->isChecked() + || !ui->metaPressHoldChkBox->isChecked() || !ui->infoWindowChkBox->isChecked() || ui->noBordersForMaximizedChkBox->isChecked() || !ui->highSensitivityBtn->isChecked() @@ -1333,13 +1338,15 @@ bool SettingsDialog::saveAllChanges() //! Update universal settings Latte::Types::MouseSensitivity sensitivity = static_cast(m_mouseSensitivityButtons->checkedId()); bool autostart = ui->autostartChkBox->isChecked(); - bool forwardMeta = ui->metaPressChkBox->isChecked(); + bool forwardMetaPress = ui->metaPressChkBox->isChecked(); + bool metaPressAndHold = ui->metaPressHoldChkBox->isChecked(); bool showInfoWindow = ui->infoWindowChkBox->isChecked(); bool noBordersForMaximized = ui->noBordersForMaximizedChkBox->isChecked(); m_corona->universalSettings()->setMouseSensitivity(sensitivity); m_corona->universalSettings()->setAutostart(autostart); - m_corona->universalSettings()->forwardMetaToLatte(forwardMeta); + m_corona->universalSettings()->forwardMetaToLatte(forwardMetaPress); + m_corona->universalSettings()->setMetaPressAndHoldEnabled(metaPressAndHold); m_corona->universalSettings()->setShowInfoWindow(showInfoWindow); m_corona->universalSettings()->setCanDisableBorders(noBordersForMaximized); m_corona->universalSettings()->setScreenTrackerInterval(ui->screenTrackerSpinBox->value()); diff --git a/app/settings/universalsettings.cpp b/app/settings/universalsettings.cpp index 72eb6232a..9bc35be09 100644 --- a/app/settings/universalsettings.cpp +++ b/app/settings/universalsettings.cpp @@ -52,6 +52,7 @@ UniversalSettings::UniversalSettings(KSharedConfig::Ptr config, QObject *parent) connect(this, &UniversalSettings::layoutsColumnWidthsChanged, this, &UniversalSettings::saveConfig); connect(this, &UniversalSettings::layoutsMemoryUsageChanged, this, &UniversalSettings::saveConfig); connect(this, &UniversalSettings::layoutsWindowSizeChanged, this, &UniversalSettings::saveConfig); + connect(this, &UniversalSettings::metaPressAndHoldEnabledChanged, this, &UniversalSettings::saveConfig); connect(this, &UniversalSettings::mouseSensitivityChanged, this, &UniversalSettings::saveConfig); connect(this, &UniversalSettings::screenTrackerIntervalChanged, this, &UniversalSettings::saveConfig); connect(this, &UniversalSettings::showInfoWindowChanged, this, &UniversalSettings::saveConfig); @@ -75,6 +76,9 @@ void UniversalSettings::load() //! load configuration loadConfig(); + + //! this is needed to inform globalshortcuts to update its modifiers tracking + emit metaPressAndHoldEnabledChanged(); } bool UniversalSettings::showInfoWindow() const @@ -323,6 +327,22 @@ void UniversalSettings::kwin_forwardMetaToLatte(bool forward) } } +bool UniversalSettings::metaPressAndHoldEnabled() const +{ + return m_metaPressAndHoldEnabled; +} + +void UniversalSettings::setMetaPressAndHoldEnabled(bool enabled) +{ + if (m_metaPressAndHoldEnabled == enabled) { + return; + } + + m_metaPressAndHoldEnabled = enabled; + + emit metaPressAndHoldEnabledChanged(); +} + Types::LayoutsMemoryUsage UniversalSettings::layoutsMemoryUsage() const { return m_memoryUsage; @@ -363,6 +383,7 @@ void UniversalSettings::loadConfig() m_layoutsWindowSize = m_universalGroup.readEntry("layoutsWindowSize", QSize(700, 450)); m_layoutsColumnWidths = m_universalGroup.readEntry("layoutsColumnWidths", QStringList()); m_launchers = m_universalGroup.readEntry("launchers", QStringList()); + m_metaPressAndHoldEnabled = m_universalGroup.readEntry("metaPressAndHoldEnabled", true); m_screenTrackerInterval = m_universalGroup.readEntry("screenTrackerInterval", 2500); m_showInfoWindow = m_universalGroup.readEntry("showInfoWindow", true); m_memoryUsage = static_cast(m_universalGroup.readEntry("memoryUsage", (int)Types::SingleLayout)); @@ -379,6 +400,7 @@ void UniversalSettings::saveConfig() m_universalGroup.writeEntry("layoutsWindowSize", m_layoutsWindowSize); m_universalGroup.writeEntry("layoutsColumnWidths", m_layoutsColumnWidths); m_universalGroup.writeEntry("launchers", m_launchers); + m_universalGroup.writeEntry("metaPressAndHoldEnabled", m_metaPressAndHoldEnabled); m_universalGroup.writeEntry("screenTrackerInterval", m_screenTrackerInterval); m_universalGroup.writeEntry("showInfoWindow", m_showInfoWindow); m_universalGroup.writeEntry("memoryUsage", (int)m_memoryUsage); diff --git a/app/settings/universalsettings.h b/app/settings/universalsettings.h index 30a5b171d..55afb3c7c 100644 --- a/app/settings/universalsettings.h +++ b/app/settings/universalsettings.h @@ -72,6 +72,9 @@ public: bool metaForwardedToLatte() const; void forwardMetaToLatte(bool forward); + bool metaPressAndHoldEnabled() const; + void setMetaPressAndHoldEnabled(bool enabled); + bool showInfoWindow() const; void setShowInfoWindow(bool show); @@ -120,6 +123,7 @@ signals: void layoutsWindowSizeChanged(); void launchersChanged(); void layoutsMemoryUsageChanged(); + void metaPressAndHoldEnabledChanged(); void mouseSensitivityChanged(); void screenTrackerIntervalChanged(); void showInfoWindowChanged(); @@ -140,6 +144,7 @@ private: private: bool m_canDisableBorders{false}; + bool m_metaPressAndHoldEnabled{true}; bool m_showInfoWindow{true}; //when there isnt a version it is an old universal file diff --git a/app/shortcuts/globalshortcuts.cpp b/app/shortcuts/globalshortcuts.cpp index ae7fdb185..4d494a8f3 100644 --- a/app/shortcuts/globalshortcuts.cpp +++ b/app/shortcuts/globalshortcuts.cpp @@ -193,6 +193,16 @@ void GlobalShortcuts::init() m_singleMetaAction = new QAction(this); m_singleMetaAction->setShortcut(QKeySequence(Qt::META)); + connect(m_corona->universalSettings(), &UniversalSettings::metaPressAndHoldEnabledChanged , this, [&]() { + if (!m_corona->universalSettings()->metaPressAndHoldEnabled()) { + m_modifierTracker->blockModifierTracking(Qt::Key_Super_L); + m_modifierTracker->blockModifierTracking(Qt::Key_Super_R); + } else { + m_modifierTracker->unblockModifierTracking(Qt::Key_Super_L); + m_modifierTracker->unblockModifierTracking(Qt::Key_Super_R); + } + }); + //display shortcut badges while holding Meta connect(m_modifierTracker, &ShortcutsPart::ModifierTracker::metaModifierPressed, this, [&]() { m_metaShowedViews = true; diff --git a/app/shortcuts/modifiertracker.cpp b/app/shortcuts/modifiertracker.cpp index 28e6edafe..a8c0c7ee0 100644 --- a/app/shortcuts/modifiertracker.cpp +++ b/app/shortcuts/modifiertracker.cpp @@ -76,7 +76,25 @@ void ModifierTracker::init() bool ModifierTracker::modifierIsTracked(Qt::Key key) { - return(key == Qt::Key_Super_L || key == Qt::Key_Super_R || key == Qt::Key_Control || key == Qt::Key_Alt || key == Qt::Key_Shift); + if (m_blockedModifiers.contains(key)) { + return false; + } + + return (key == Qt::Key_Super_L || key == Qt::Key_Super_R || key == Qt::Key_Control || key == Qt::Key_Alt || key == Qt::Key_Shift); +} + +void ModifierTracker::blockModifierTracking(Qt::Key key) +{ + if (!m_blockedModifiers.contains(key)) { + m_blockedModifiers.append(key); + } +} + +void ModifierTracker::unblockModifierTracking(Qt::Key key) +{ + if (m_blockedModifiers.contains(key)) { + m_blockedModifiers.removeAll(key); + } } bool ModifierTracker::noModifierPressed() diff --git a/app/shortcuts/modifiertracker.h b/app/shortcuts/modifiertracker.h index c13d9c5bb..f5741813f 100644 --- a/app/shortcuts/modifiertracker.h +++ b/app/shortcuts/modifiertracker.h @@ -50,6 +50,9 @@ public: //! only is pressed and no other modifier bool singleModifierPressed(Qt::Key key); + void blockModifierTracking(Qt::Key key); + void unblockModifierTracking(Qt::Key key); + signals: void metaModifierPressed(); void modifiersChanged(); @@ -67,6 +70,9 @@ private: KModifierKeyInfo m_modifierKeyInfo; QTimer m_metaPressedTimer; + //! modifiers that the user does not want to track anymore + QList m_blockedModifiers; + //! keep a record for modifiers QHash m_pressed;