From 48fc559e3a788c27e2ac69f9181e6e8e8f8a24f8 Mon Sep 17 00:00:00 2001 From: reionwong Date: Fri, 30 Jul 2021 01:07:21 +0800 Subject: [PATCH] Double click a blank area to toggle maximization --- qml/main.qml | 45 ++++++++++++++++++++++++++++++++++++++++ src/activity.cpp | 53 ++++++++++++++++++++++++++++++++++++++++++++++++ src/activity.h | 5 +++++ 3 files changed, 103 insertions(+) diff --git a/qml/main.qml b/qml/main.qml index d166e26..9916da8 100644 --- a/qml/main.qml +++ b/qml/main.qml @@ -370,6 +370,51 @@ Item { } + MouseArea { + id: _sliding + anchors.fill: parent + z: -1 + + property int startY: -1 + property bool activated: false + + onActivatedChanged: { + // TODO +// if (activated) +// acticity.move() + } + + onPressed: { + startY = mouse.y + } + + onReleased: { + startY = -1 + } + + onDoubleClicked: { + acticity.toggleMaximize() + } + + onMouseYChanged: { + if (startY === parseInt(mouse.y)) { + activated = false + return + } + + // Up + if (startY > parseInt(mouse.y)) { + activated = false + return + } + + if (mouse.y > rootItem.height) + activated = true + else + activated = false + } + } + // Components ControlCenter { id: controlCenter diff --git a/src/activity.cpp b/src/activity.cpp index 4c18640..32a7add 100644 --- a/src/activity.cpp +++ b/src/activity.cpp @@ -20,6 +20,7 @@ #include "activity.h" #include +#include #include #include #include @@ -63,6 +64,58 @@ void Activity::close() NETRootInfo(QX11Info::connection(), NET::CloseWindow).closeWindowRequest(KWindowSystem::activeWindow()); } +void Activity::minimize() +{ + KWindowSystem::minimizeWindow(KWindowSystem::activeWindow()); +} + +void Activity::restore() +{ + KWindowSystem::clearState(KWindowSystem::activeWindow(), NET::Max); +} + +void Activity::maximize() +{ + KWindowSystem::setState(KWindowSystem::activeWindow(), NET::Max); +} + +void Activity::toggleMaximize() +{ + KWindowInfo info(KWindowSystem::activeWindow(), NET::WMState); + bool isWindow = !info.hasState(NET::SkipTaskbar) || + info.windowType(NET::UtilityMask) != NET::Utility || + info.windowType(NET::DesktopMask) != NET::Desktop; + + if (!isWindow) + return; + + bool isMaximized = info.hasState(NET::Max); + isMaximized ? restore() : maximize(); +} + +void Activity::move() +{ + WId winId = KWindowSystem::activeWindow(); + KWindowInfo info(winId, NET::WMState | NET::WMGeometry | NET::WMDesktop); + bool window = !info.hasState(NET::SkipTaskbar) || + info.windowType(NET::UtilityMask) != NET::Utility || + info.windowType(NET::DesktopMask) != NET::Desktop; + + if (!window) + return; + + bool onCurrent = info.isOnCurrentDesktop(); + if (!onCurrent) { + KWindowSystem::setCurrentDesktop(info.desktop()); + KWindowSystem::forceActiveWindow(winId); + } + + NETRootInfo ri(QX11Info::connection(), NET::WMMoveResize); + ri.moveResizeRequest(winId, + QCursor::pos().x(), + QCursor::pos().y(), NET::Move); +} + bool Activity::isAcceptableWindow(quint64 wid) { QFlags ignoreList; diff --git a/src/activity.h b/src/activity.h index fae6fce..af7fcb5 100644 --- a/src/activity.h +++ b/src/activity.h @@ -39,6 +39,11 @@ public: QString icon() const; Q_INVOKABLE void close(); + Q_INVOKABLE void minimize(); + Q_INVOKABLE void restore(); + Q_INVOKABLE void maximize(); + Q_INVOKABLE void toggleMaximize(); + Q_INVOKABLE void move(); bool isAcceptableWindow(quint64 wid);