From 4ed57c1f050262a87886a3123b8b089c2df25764 Mon Sep 17 00:00:00 2001 From: Jan Grulich Date: Mon, 12 Apr 2021 09:18:39 +0200 Subject: [PATCH] Improve double-click on titlebar to maximize/unmaximize reliability --- ...meplatform-double-click-improvements.patch | 99 +++++++++++++++++++ qgnomeplatform.spec | 8 +- 2 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 qgnomeplatform-double-click-improvements.patch diff --git a/qgnomeplatform-double-click-improvements.patch b/qgnomeplatform-double-click-improvements.patch new file mode 100644 index 0000000..11ee25c --- /dev/null +++ b/qgnomeplatform-double-click-improvements.patch @@ -0,0 +1,99 @@ +From 0a9e409563e8fa8caee04b60922de5283c0e08a1 Mon Sep 17 00:00:00 2001 +From: Jan Grulich +Date: Mon, 22 Feb 2021 11:48:02 +0100 +Subject: Improve double-click to maximize reliability + + +diff --git a/decoration/qgnomeplatformdecoration.cpp b/decoration/qgnomeplatformdecoration.cpp +index c8b381c..6f88c24 100644 +--- a/decoration/qgnomeplatformdecoration.cpp ++++ b/decoration/qgnomeplatformdecoration.cpp +@@ -360,6 +360,24 @@ bool QGnomePlatformDecoration::clickButton(Qt::MouseButtons b, Button btn) + return false; + } + ++bool QGnomePlatformDecoration::doubleClickButton(Qt::MouseButtons b, const QPointF &local, const QDateTime ¤tTime) ++{ ++ if (b & Qt::LeftButton) { ++ const qint64 clickInterval = m_lastButtonClick.msecsTo(currentTime); ++ m_lastButtonClick = currentTime; ++ const int doubleClickDistance = GnomeSettings::hint(QPlatformTheme::MouseDoubleClickDistance).toInt(); ++ const QPointF posDiff = m_lastButtonClickPosition - local; ++ if ((clickInterval <= GnomeSettings::hint(QPlatformTheme::MouseDoubleClickInterval).toInt()) && ++ ((posDiff.x() <= doubleClickDistance && posDiff.x() >= -doubleClickDistance) && ((posDiff.y() <= doubleClickDistance && posDiff.y() >= -doubleClickDistance)))) { ++ return true; ++ } ++ ++ m_lastButtonClickPosition = local; ++ } ++ ++ return false; ++} ++ + bool QGnomePlatformDecoration::handleMouse(QWaylandInputDevice *inputDevice, const QPointF &local, const QPointF &global, Qt::MouseButtons b, Qt::KeyboardModifiers mods) + { + Q_UNUSED(global); +@@ -459,31 +477,26 @@ void QGnomePlatformDecoration::processMouseTop(QWaylandInputDevice *inputDevice, + processMouseRight(inputDevice, local, b, mods); + } else if (closeButtonRect().contains(local)) { + updateButtonHoverState(Button::Close); +- if (clickButton(b, Close)) ++ if (clickButton(b, Close)) { + QWindowSystemInterface::handleCloseEvent(window()); +- } else if (m_hints->titlebarButtons().testFlag(GnomeHintsSettings::MaximizeButton) && maximizeButtonRect().contains(local)) { ++ } ++ } else if (GnomeSettings::titlebarButtons().testFlag(GnomeSettings::MaximizeButton) && maximizeButtonRect().contains(local)) { + updateButtonHoverState(Button::Maximize); +- if (clickButton(b, Maximize)) ++ if (clickButton(b, Maximize)) { + window()->setWindowStates(window()->windowStates() ^ Qt::WindowMaximized); +- } else if (m_hints->titlebarButtons().testFlag(GnomeHintsSettings::MinimizeButton) && minimizeButtonRect().contains(local)) { ++ } ++ } else if (GnomeSettings::titlebarButtons().testFlag(GnomeSettings::MinimizeButton) && minimizeButtonRect().contains(local)) { + updateButtonHoverState(Button::Minimize); +- if (clickButton(b, Minimize)) ++ if (clickButton(b, Minimize)) { + window()->setWindowState(Qt::WindowMinimized); ++ } ++ } else if (doubleClickButton(b, local, currentDateTime)) { ++ window()->setWindowStates(window()->windowStates() ^ Qt::WindowMaximized); + } else { +- if (clickButton(b, Maximize)) { +- const int doubleClickDistance = m_hints->hint(QPlatformTheme::MouseDoubleClickDistance).toInt(); +- QPointF posDiff = m_lastButtonClickPosition - local; +- if ((m_lastButtonClick.msecsTo(currentDateTime) <= m_hints->hint(QPlatformTheme::MouseDoubleClickInterval).toInt()) && +- ((posDiff.x() <= doubleClickDistance && posDiff.x() >= -doubleClickDistance) && ((posDiff.y() <= doubleClickDistance && posDiff.y() >= -doubleClickDistance)))) +- window()->setWindowStates(window()->windowStates() ^ Qt::WindowMaximized); +- m_lastButtonClick = currentDateTime; +- m_lastButtonClickPosition = local; +- } else { + #if QT_CONFIG(cursor) +- waylandWindow()->restoreMouseCursor(inputDevice); ++ waylandWindow()->restoreMouseCursor(inputDevice); + #endif +- startMove(inputDevice,b); +- } ++ startMove(inputDevice,b); + } + } + +diff --git a/decoration/qgnomeplatformdecoration.h b/decoration/qgnomeplatformdecoration.h +index c656b55..c8c793e 100644 +--- a/decoration/qgnomeplatformdecoration.h ++++ b/decoration/qgnomeplatformdecoration.h +@@ -60,6 +60,7 @@ private: + void processMouseLeft(QWaylandInputDevice *inputDevice, const QPointF &local, Qt::MouseButtons b,Qt::KeyboardModifiers mods); + void processMouseRight(QWaylandInputDevice *inputDevice, const QPointF &local, Qt::MouseButtons b,Qt::KeyboardModifiers mods); + bool clickButton(Qt::MouseButtons b, Button btn); ++ bool doubleClickButton(Qt::MouseButtons b, const QPointF &local, const QDateTime ¤tTime); + bool updateButtonHoverState(Button hoveredButton); + + QRectF closeButtonRect() const; +@@ -84,6 +85,7 @@ private: + // For double-click support + QDateTime m_lastButtonClick; + QPointF m_lastButtonClickPosition; ++ Button m_doubleClicking = None; + + QStaticText m_windowTitle; + Button m_clicking = None; diff --git a/qgnomeplatform.spec b/qgnomeplatform.spec index 996bec1..27388b8 100644 --- a/qgnomeplatform.spec +++ b/qgnomeplatform.spec @@ -1,7 +1,7 @@ Name: qgnomeplatform Version: 0.7.1 -Release: 1%{?dist} +Release: 2%{?dist} Summary: Qt Platform Theme aimed to accommodate Gnome settings License: LGPLv2+ @@ -9,8 +9,9 @@ URL: https://github.com/MartinBriza/QGnomePlatform Source0: https://github.com/MartinBriza/QGnomePlatform/archive/%{version}/QGnomePlatform-%{version}.tar.gz # Upstream patches +Patch0: qgnomeplatform-double-click-improvements.patch -BuildRequires: make +BuildRequires: make BuildRequires: pkgconfig(gio-2.0) BuildRequires: pkgconfig(udev) BuildRequires: pkgconfig(xkbcommon) @@ -56,6 +57,9 @@ make install INSTALL_ROOT=%{buildroot} -C %{_target_platform} %{_qt5_libdir}/qt5/plugins/wayland-decoration-client/libqgnomeplatformdecoration.so %changelog +* Mon Apr 12 2021 Jan Grulich - 0.7.1-2 +- Improve double-click on titlebar to maximize/unmaximize reliability + * Thu Apr 08 2021 Jan Grulich - 0.7.1-1 - 0.7.1