doubletaptolock: Simplify, and use "lock" instead of "sleep"

This MR does several things as a followup to
https://invent.kde.org/plasma/plasma-mobile/-/merge_requests/748:
- Use the word "lock" instead of "sleep" since we are locking the
  device, not putting it to sleep
- Simplify usage by using existing MouseAreas instead of including our
  own for this feature (I encountered several focus captures in folio that prevented the
SwipeArea from getting events)
This commit is contained in:
Devin Lin 2025-06-27 00:14:26 -04:00
parent f085843957
commit d4f1c78d61
12 changed files with 83 additions and 120 deletions

View file

@ -0,0 +1,21 @@
// SPDX-FileCopyrightText: 2025 Florian RICHER <florian.richer@protonmail.com>
// SPDX-License-Identifier: LGPL-2.0-or-later
import QtQuick
import org.kde.plasma.private.mobileshell.dpmsplugin as DPMS
import org.kde.plasma.private.mobileshell.state as MobileShellState
QtObject {
id: root
function triggerLock() {
MobileShellState.LockscreenDBusClient.lockScreen();
__dpms.turnDpmsOff();
}
property DPMS.DPMSUtil __dpms: DPMS.DPMSUtil {
id: dpms
}
}

View file

@ -1,66 +0,0 @@
// SPDX-FileCopyrightText: 2025 Florian RICHER <florian.richer@protonmail.com>
// SPDX-License-Identifier: LGPL-2.0-or-later
import QtQuick
import org.kde.plasma.private.mobileshell.dpmsplugin as DPMS
import org.kde.plasma.private.mobileshell.state as MobileShellState
Item {
id: root
property real doubleClickInterval: 400
property int tapCount: 0
property bool isSwiping: false
signal doubleTapped()
onDoubleTapped: {
MobileShellState.LockscreenDBusClient.lockScreen()
dpms.turnDpmsOff()
}
DPMS.DPMSUtil {
id: dpms
}
// Workaround for double tap detection without capture events for HomeScreen
Timer {
id: doubleClickTimer
interval: root.doubleClickInterval
onTriggered: {
root.tapCount = 0
}
}
MouseArea {
anchors.fill: parent
propagateComposedEvents: true
onReleased: {
mouse.accepted = false
if (root.isSwiping) {
// Reset the isSwiping flag to re-enable double tap detection
root.isSwiping = false
return
}
root.tapCount++;
if (root.tapCount === 2) {
root.doubleTapped()
}
doubleClickTimer.restart()
}
// If is swiping, we don't want to trigger the double tap
onPositionChanged: {
mouse.accepted = false
doubleClickTimer.stop()
root.tapCount = 0
root.isSwiping = true
}
}
}

View file

@ -19,7 +19,7 @@ const QString CFG_KEY_DELEGATE_ICON_SIZE = QStringLiteral("delegateIconSize");
const QString CFG_KEY_SHOW_FAVORITES_BAR_BACKGROUND = QStringLiteral("showFavoritesBarBackground");
const QString CFG_KEY_PAGE_TRANSITION_EFFECT = QStringLiteral("pageTransitionEffect");
const QString CFG_KEY_SHOW_WALLPAPER_BLUR = QStringLiteral("showWallpaperBlur");
const QString CFG_KEY_DOUBLE_TAP_TO_SLEEP = QStringLiteral("doubleTapToSleep");
const QString CFG_KEY_DOUBLE_TAP_TO_LOCK = QStringLiteral("doubleTapToLock");
FolioSettings::FolioSettings(HomeScreen *parent)
: QObject{parent}
@ -154,16 +154,16 @@ void FolioSettings::setShowWallpaperBlur(bool showWallpaperBlur)
}
}
bool FolioSettings::doubleTapToSleep() const
bool FolioSettings::doubleTapToLock() const
{
return m_doubleTapToSleep;
return m_doubleTapToLock;
}
void FolioSettings::setDoubleTapToSleep(bool doubleTapToSleep)
void FolioSettings::setDoubleTapToLock(bool doubleTapToLock)
{
if (m_doubleTapToSleep != doubleTapToSleep) {
m_doubleTapToSleep = doubleTapToSleep;
Q_EMIT doubleTapToSleepChanged();
if (m_doubleTapToLock != doubleTapToLock) {
m_doubleTapToLock = doubleTapToLock;
Q_EMIT doubleTapToLockChanged();
save();
}
}
@ -183,7 +183,7 @@ void FolioSettings::save()
m_homeScreen->config().writeEntry(CFG_KEY_SHOW_FAVORITES_BAR_BACKGROUND, m_showFavouritesBarBackground);
m_homeScreen->config().writeEntry(CFG_KEY_PAGE_TRANSITION_EFFECT, (int)m_pageTransitionEffect);
m_homeScreen->config().writeEntry(CFG_KEY_SHOW_WALLPAPER_BLUR, m_showWallpaperBlur);
m_homeScreen->config().writeEntry(CFG_KEY_DOUBLE_TAP_TO_SLEEP, m_doubleTapToSleep);
m_homeScreen->config().writeEntry(CFG_KEY_DOUBLE_TAP_TO_LOCK, m_doubleTapToLock);
Q_EMIT m_homeScreen->configNeedsSaving();
}
@ -203,7 +203,7 @@ void FolioSettings::load()
m_showFavouritesBarBackground = m_homeScreen->config().readEntry(CFG_KEY_SHOW_FAVORITES_BAR_BACKGROUND, true);
m_pageTransitionEffect = static_cast<PageTransitionEffect>(m_homeScreen->config().readEntry(CFG_KEY_PAGE_TRANSITION_EFFECT, (int)SlideTransition));
m_showWallpaperBlur = m_homeScreen->config().readEntry(CFG_KEY_SHOW_WALLPAPER_BLUR, true);
m_doubleTapToSleep = m_homeScreen->config().readEntry(CFG_KEY_DOUBLE_TAP_TO_SLEEP, true);
m_doubleTapToLock = m_homeScreen->config().readEntry(CFG_KEY_DOUBLE_TAP_TO_LOCK, true);
Q_EMIT homeScreenRowsChanged();
Q_EMIT homeScreenColumnsChanged();
@ -212,7 +212,7 @@ void FolioSettings::load()
Q_EMIT lockLayoutChanged();
Q_EMIT delegateIconSizeChanged();
Q_EMIT showWallpaperBlurChanged();
Q_EMIT doubleTapToSleepChanged();
Q_EMIT doubleTapToLockChanged();
}
bool FolioSettings::saveLayoutToFile(QString path)

View file

@ -24,7 +24,7 @@ class FolioSettings : public QObject
Q_PROPERTY(
FolioSettings::PageTransitionEffect pageTransitionEffect READ pageTransitionEffect WRITE setPageTransitionEffect NOTIFY pageTransitionEffectChanged)
Q_PROPERTY(bool showWallpaperBlur READ showWallpaperBlur WRITE setShowWallpaperBlur NOTIFY showWallpaperBlurChanged)
Q_PROPERTY(bool doubleTapToSleep READ doubleTapToSleep WRITE setDoubleTapToSleep NOTIFY doubleTapToSleepChanged)
Q_PROPERTY(bool doubleTapToLock READ doubleTapToLock WRITE setDoubleTapToLock NOTIFY doubleTapToLockChanged)
public:
FolioSettings(HomeScreen *parent = nullptr);
@ -69,8 +69,8 @@ public:
bool showWallpaperBlur() const;
void setShowWallpaperBlur(bool showWallpaperBlur);
bool doubleTapToSleep() const;
void setDoubleTapToSleep(bool doubleTapToSleep);
bool doubleTapToLock() const;
void setDoubleTapToLock(bool doubleTapToLock);
Q_INVOKABLE void load();
@ -87,7 +87,7 @@ Q_SIGNALS:
void showFavouritesBarBackgroundChanged();
void pageTransitionEffectChanged();
void showWallpaperBlurChanged();
void doubleTapToSleepChanged();
void doubleTapToLockChanged();
private:
void save();
@ -103,5 +103,5 @@ private:
bool m_showFavouritesBarBackground{false};
PageTransitionEffect m_pageTransitionEffect{SlideTransition};
bool m_showWallpaperBlur{false};
bool m_doubleTapToSleep{false};
bool m_doubleTapToLock{false};
};

View file

@ -27,14 +27,18 @@ MouseArea {
haptics.buttonVibrate();
}
onDoubleClicked: {
if (folio.FolioSettings.doubleTapToLock) {
deviceLock.triggerLock();
}
}
MobileShell.HapticsEffect {
id: haptics
}
MobileShell.DoubleTapToSleep {
id: doubleTapToSleep
enabled: folio.FolioSettings.doubleTapToSleep
anchors.fill: parent
MobileShell.DeviceLock {
id: deviceLock
}
Repeater {

View file

@ -28,12 +28,6 @@ Item {
id: haptics
}
MobileShell.DoubleTapToSleep {
id: doubleTapToSleep
enabled: folio.FolioSettings.doubleTapToSleep
anchors.fill: parent
}
// background when in settings view (for rearranging pages)
Rectangle {
id: settingsViewBackground

View file

@ -19,13 +19,23 @@ MouseArea {
readonly property real verticalMargin: Math.round((folio.HomeScreenState.pageHeight - folio.HomeScreenState.pageContentHeight) / 2)
readonly property real horizontalMargin: Math.round((folio.HomeScreenState.pageWidth - folio.HomeScreenState.pageContentWidth) / 2)
onPressAndHold: {
folio.HomeScreenState.openSettingsView()
haptics.buttonVibrate();
}
onDoubleClicked: {
if (folio.FolioSettings.doubleTapToLock) {
deviceLock.triggerLock();
}
}
MobileShell.HapticsEffect {
id: haptics
}
onPressAndHold: {
folio.HomeScreenState.openSettingsView()
haptics.buttonVibrate();
MobileShell.DeviceLock {
id: deviceLock
}
Repeater {

View file

@ -234,15 +234,15 @@ Window {
onCurrentValueChanged: folio.FolioSettings.pageTransitionEffect = currentValue
}
FormCard.FormDelegateSeparator { above: pageTransitionCombobox; below: doubleTapToSleepSwitch }
FormCard.FormDelegateSeparator { above: pageTransitionCombobox; below: doubleTapToLockSwitch }
FormCard.FormSwitchDelegate {
id: doubleTapToSleepSwitch
id: doubleTapToLockSwitch
text: i18n("Double tap to lock device")
checked: folio.FolioSettings.doubleTapToSleep
checked: folio.FolioSettings.doubleTapToLock
onCheckedChanged: {
if (checked != folio.FolioSettings.doubleTapToSleep) {
folio.FolioSettings.doubleTapToSleep = checked;
if (checked != folio.FolioSettings.doubleTapToLock) {
folio.FolioSettings.doubleTapToLock = checked;
}
}
}

View file

@ -4,7 +4,7 @@
#include "halcyonsettings.h"
const QString CFG_KEY_SHOW_WALLPAPER_BLUR = QStringLiteral("showWallpaperBlur");
const QString CFG_KEY_DOUBLE_TAP_TO_SLEEP = QStringLiteral("doubleTapToSleep");
const QString CFG_KEY_DOUBLE_TAP_TO_LOCK = QStringLiteral("doubleTapToLock");
HalcyonSettings::HalcyonSettings(QObject *parent, KConfigGroup config)
: QObject{parent}
@ -27,16 +27,16 @@ void HalcyonSettings::setShowWallpaperBlur(bool showWallpaperBlur)
}
}
bool HalcyonSettings::doubleTapToSleep() const
bool HalcyonSettings::doubleTapToLock() const
{
return m_doubleTapToSleep;
return m_doubleTapToLock;
}
void HalcyonSettings::setDoubleTapToSleep(bool doubleTapToSleep)
void HalcyonSettings::setDoubleTapToLock(bool doubleTapToLock)
{
if (m_doubleTapToSleep != doubleTapToSleep) {
m_doubleTapToSleep = doubleTapToSleep;
Q_EMIT doubleTapToSleepChanged();
if (m_doubleTapToLock != doubleTapToLock) {
m_doubleTapToLock = doubleTapToLock;
Q_EMIT doubleTapToLockChanged();
save();
}
}
@ -44,7 +44,7 @@ void HalcyonSettings::setDoubleTapToSleep(bool doubleTapToSleep)
void HalcyonSettings::save()
{
m_config.writeEntry(CFG_KEY_SHOW_WALLPAPER_BLUR, m_showWallpaperBlur);
m_config.writeEntry(CFG_KEY_DOUBLE_TAP_TO_SLEEP, m_doubleTapToSleep);
m_config.writeEntry(CFG_KEY_DOUBLE_TAP_TO_LOCK, m_doubleTapToLock);
m_config.sync();
}
@ -52,5 +52,5 @@ void HalcyonSettings::save()
void HalcyonSettings::load()
{
m_showWallpaperBlur = m_config.readEntry(CFG_KEY_SHOW_WALLPAPER_BLUR, false);
m_doubleTapToSleep = m_config.readEntry(CFG_KEY_DOUBLE_TAP_TO_SLEEP, true);
m_doubleTapToLock = m_config.readEntry(CFG_KEY_DOUBLE_TAP_TO_LOCK, true);
}

View file

@ -11,7 +11,7 @@ class HalcyonSettings : public QObject
{
Q_OBJECT
Q_PROPERTY(bool showWallpaperBlur READ showWallpaperBlur WRITE setShowWallpaperBlur NOTIFY showWallpaperBlurChanged)
Q_PROPERTY(bool doubleTapToSleep READ doubleTapToSleep WRITE setDoubleTapToSleep NOTIFY doubleTapToSleepChanged)
Q_PROPERTY(bool doubleTapToLock READ doubleTapToLock WRITE setDoubleTapToLock NOTIFY doubleTapToLockChanged)
public:
HalcyonSettings(QObject *parent = nullptr, KConfigGroup config = {});
@ -19,19 +19,19 @@ public:
bool showWallpaperBlur() const;
void setShowWallpaperBlur(bool blurWallpaper);
bool doubleTapToSleep() const;
void setDoubleTapToSleep(bool doubleTapToSleep);
bool doubleTapToLock() const;
void setDoubleTapToLock(bool doubleTapToLock);
Q_SIGNALS:
void showWallpaperBlurChanged();
void doubleTapToSleepChanged();
void doubleTapToLockChanged();
private:
void save();
void load();
bool m_showWallpaperBlur{false};
bool m_doubleTapToSleep{true};
bool m_doubleTapToLock{true};
KConfigGroup m_config;
};

View file

@ -108,14 +108,14 @@ Item {
onLongPressed: root.openConfigure()
onDoubleTapped: {
if (Plasmoid.settings.doubleTapToSleep) {
doubleTapToSleep.doubleTapped();
if (Plasmoid.settings.doubleTapToLock) {
deviceLock.triggerLock();
}
}
}
MobileShell.DoubleTapToSleep {
id: doubleTapToSleep
MobileShell.DeviceLock {
id: deviceLock
}
FavoritesView {

View file

@ -103,10 +103,10 @@ Window {
FormCard.FormSwitchDelegate {
id: doubleTapToSleepSwitch
text: i18n("Double tap to lock device")
checked: Plasmoid.settings.doubleTapToSleep
checked: Plasmoid.settings.doubleTapToLock
onCheckedChanged: {
if (checked != Plasmoid.settings.doubleTapToSleep) {
Plasmoid.settings.doubleTapToSleep = checked;
if (checked != Plasmoid.settings.doubleTapToLock) {
Plasmoid.settings.doubleTapToLock = checked;
}
}
}