gestures: Set kwin touch area to be gesture guide area height

Use a heuristic (the height of the gesture guide panel) to set the
gesture trigger area.
This commit is contained in:
Devin Lin 2025-12-16 19:55:50 -05:00
parent 97052dee2b
commit 22b095e340
6 changed files with 70 additions and 7 deletions

View file

@ -40,6 +40,13 @@ QtObject {
return root.panelSettings.navigationPanelHeight;
}
readonly property real screenEdgeTouchTarget: (ShellSettings.Settings.gesturePanelEnabled && !ShellSettings.Settings.navigationPanelEnabled) ? defaultGesturePanelThickness : 8
onScreenEdgeTouchTargetChanged: {
if (ShellSettings.KWinSettings.screenEdgeTouchTarget != screenEdgeTouchTarget) {
ShellSettings.KWinSettings.screenEdgeTouchTarget = screenEdgeTouchTarget;
}
}
function navigationPanelOnSide(screenWidth: real, screenHeight: real): bool {
// TODO: we have this disabled for now, we might consider just removing this feature entirely due to it causing several issues:
// (the feature being the navigation panel being moved to the right when the screen height is small)

View file

@ -7,17 +7,22 @@
#include "kwinsettings.h"
const QString CONFIG_FILE = QStringLiteral("kwinrc");
const QString OVERLAY_CONFIG_FILE = QStringLiteral("plasma-mobile/kwinrc");
const QString WAYLAND_CONFIG_GROUP = QStringLiteral("Wayland");
const QString SCREEN_EDGES_CONFIG_GROUP = QStringLiteral("ScreenEdges");
KWinSettings::KWinSettings(QObject *parent)
: QObject{parent}
, m_config{KSharedConfig::openConfig(CONFIG_FILE)}
, m_overlayConfig{KSharedConfig::openConfig(OVERLAY_CONFIG_FILE)}
{
m_configWatcher = KConfigWatcher::create(m_config);
connect(m_configWatcher.data(), &KConfigWatcher::configChanged, this, [this](const KConfigGroup &group, const QByteArrayList &names) -> void {
Q_UNUSED(names)
if (group.name() == WAYLAND_CONFIG_GROUP) {
Q_EMIT doubleTapWakeupChanged();
} else if (group.name() == SCREEN_EDGES_CONFIG_GROUP) {
Q_EMIT screenEdgeTouchTargetChanged();
}
});
}
@ -30,7 +35,25 @@ bool KWinSettings::doubleTapWakeup() const
void KWinSettings::setDoubleTapWakeup(bool enabled)
{
auto group = KConfigGroup{m_config, WAYLAND_CONFIG_GROUP};
group.writeEntry("DoubleTapWakeup", enabled, KConfigGroup::Notify);
m_config->sync();
if (enabled != doubleTapWakeup()) {
auto group = KConfigGroup{m_config, WAYLAND_CONFIG_GROUP};
group.writeEntry("DoubleTapWakeup", enabled, KConfigGroup::Notify);
m_config->sync();
}
}
int KWinSettings::screenEdgeTouchTarget() const
{
auto group = KConfigGroup{m_overlayConfig, SCREEN_EDGES_CONFIG_GROUP};
return group.readEntry("TouchTarget", 0);
}
void KWinSettings::setScreenEdgeTouchTarget(int target)
{
// Use m_overlayConfig instead of m_config so we don't affect other shells
if (target != screenEdgeTouchTarget()) {
auto group = KConfigGroup{m_overlayConfig, SCREEN_EDGES_CONFIG_GROUP};
group.writeEntry("TouchTarget", target, KConfigGroup::Notify);
m_overlayConfig->sync();
}
}

View file

@ -19,6 +19,7 @@ class KWinSettings : public QObject
QML_SINGLETON
Q_PROPERTY(bool doubleTapWakeup READ doubleTapWakeup WRITE setDoubleTapWakeup NOTIFY doubleTapWakeupChanged)
Q_PROPERTY(int screenEdgeTouchTarget READ screenEdgeTouchTarget WRITE setScreenEdgeTouchTarget NOTIFY screenEdgeTouchTargetChanged)
public:
KWinSettings(QObject *parent = nullptr);
@ -35,10 +36,24 @@ public:
*/
void setDoubleTapWakeup(bool enabled);
/**
* Get the screen edge touch target value.
*/
int screenEdgeTouchTarget() const;
/**
* Set the screen edge touch target value.
*
* @param target
*/
void setScreenEdgeTouchTarget(int target);
Q_SIGNALS:
void doubleTapWakeupChanged();
void screenEdgeTouchTargetChanged();
private:
KConfigWatcher::Ptr m_configWatcher;
KSharedConfig::Ptr m_config;
KSharedConfig::Ptr m_overlayConfig;
};

View file

@ -7,6 +7,7 @@ plasma_add_applet(org.kde.plasma.mobile.taskpanel
QML_SOURCES
qml/main.qml
qml/NavigationPanelComponent.qml
qml/GesturePanelComponent.qml
CPP_SOURCES
taskpanel.cpp
)

View file

@ -0,0 +1,20 @@
// SPDX-FileCopyrightText: 2015 Marco Martin <mart@kde.org>
// SPDX-FileCopyrightText: 2021-2023 Devin Lin <devin@kde.org>
// SPDX-License-Identifier: GPL-2.0-or-later
import QtQuick
import org.kde.kirigami 2.20 as Kirigami
import org.kde.plasma.plasmoid
import org.kde.plasma.private.mobileshell as MobileShell
import org.kde.plasma.private.mobileshell.state as MobileShellState
import org.kde.plasma.private.mobileshell.shellsettingsplugin as ShellSettings
MobileShell.GesturePanel {
id: root
onHandlePressedAndHeld: MobileShellState.ShellDBusClient.openHomeScreen()
onHandleClicked: Plasmoid.triggerTaskSwitcher()
}

View file

@ -197,15 +197,12 @@ ContainmentItem {
Component {
id: gesturePanelComponent
MobileShell.GesturePanel {
GesturePanelComponent {
opaqueBar: root.opaqueBar
Kirigami.Theme.inherit: false
Kirigami.Theme.colorSet: (!opaqueBar && !startupFeedbackColorAnimation.isShowing) ? Kirigami.Theme.Complementary : Kirigami.Theme.Window
onHandlePressedAndHeld: MobileShellState.ShellDBusClient.openHomeScreen()
onHandleClicked: Plasmoid.triggerTaskSwitcher()
transform: [
Translate {
y: inLandscape ? 0 : navigationPanel.offset