From 752825793ae0f61db9245e543d5b085ef01d684d Mon Sep 17 00:00:00 2001 From: nerix Date: Fri, 6 Oct 2023 23:26:25 +0200 Subject: [PATCH] Ignore invisible widgets when hit testing (#4873) Co-authored-by: Felanbird <41973452+Felanbird@users.noreply.github.com> --- CHANGELOG.md | 1 + src/widgets/BaseWindow.cpp | 31 ++++++++++++++++++++----------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ace836f8e2a..4544df17abe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ - Bugfix: Fixed the Quick Switcher (CTRL+K) from sometimes showing up on the wrong window. (#4819) - Bugfix: Fixed too much text being copied when copying chat messages. (#4812, #4830, #4839) - Bugfix: Fixed empty page being added when showing out of bounds dialog. (#4849) +- Bugfix: Fixed issue on Windows preventing the title bar from being dragged in the top left corner. (#4873) - Dev: Fixed UTF16 encoding of `modes` file for the installer. (#4791) - Dev: Temporarily disable High DPI scaling on Qt6 builds on Windows. (#4767) - Dev: Tests now run on Ubuntu 22.04 instead of 20.04 to loosen C++ restrictions in tests. (#4774) diff --git a/src/widgets/BaseWindow.cpp b/src/widgets/BaseWindow.cpp index 7fc1a3b53f5..48e6361ac17 100644 --- a/src/widgets/BaseWindow.cpp +++ b/src/widgets/BaseWindow.cpp @@ -379,7 +379,7 @@ void BaseWindow::mousePressEvent(QMouseEvent *event) { std::function recursiveCheckMouseTracking; recursiveCheckMouseTracking = [&](QWidget *widget) { - if (widget == nullptr) + if (widget == nullptr || widget->isHidden()) { return false; } @@ -934,17 +934,23 @@ bool BaseWindow::handleNCHITTEST(MSG *msg, long *result) { bool client = false; - for (QWidget *widget : this->ui_.buttons) + // Check the main layout first, as it's the largest area + if (this->ui_.layoutBase->geometry().contains(point)) { - if (widget->geometry().contains(point)) - { - client = true; - } + client = true; } - if (this->ui_.layoutBase->geometry().contains(point)) + // Check the titlebar buttons + if (!client && this->ui_.titlebarBox->geometry().contains(point)) { - client = true; + for (QWidget *widget : this->ui_.buttons) + { + if (widget->isVisible() && + widget->geometry().contains(point)) + { + client = true; + } + } } if (client) @@ -959,16 +965,17 @@ bool BaseWindow::handleNCHITTEST(MSG *msg, long *result) return true; } - else if (this->flags_.has(FramelessDraggable)) + + if (this->flags_.has(FramelessDraggable)) { *result = 0; bool client = false; - if (auto widget = this->childAt(point)) + if (auto *widget = this->childAt(point)) { std::function recursiveCheckMouseTracking; recursiveCheckMouseTracking = [&](QWidget *widget) { - if (widget == nullptr) + if (widget == nullptr || widget->isHidden()) { return false; } @@ -998,6 +1005,8 @@ bool BaseWindow::handleNCHITTEST(MSG *msg, long *result) return true; } + + // don't handle the message return false; #else return false;