From b22b0f86406f2badda328954b584e82e9ebd8681 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Wed, 20 May 2026 15:43:21 +0200 Subject: [PATCH] Prevent stacked bar tooltips --- shell/Ui/WidgetButton.qml | 7 +++++++ shell/plugins/bar/Bar.qml | 37 +++++++++++++++++++++++++++++++------ 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/shell/Ui/WidgetButton.qml b/shell/Ui/WidgetButton.qml index 87611876..3ca7c345 100644 --- a/shell/Ui/WidgetButton.qml +++ b/shell/Ui/WidgetButton.qml @@ -34,6 +34,10 @@ Item { root.pressed(button) } + function hideOwnTooltip() { + if (root.bar) root.bar.hideTooltip(root) + } + function syncClickRegistration() { if (registeredBar && registeredBar.unregisterClickTarget) registeredBar.unregisterClickTarget(root) registeredBar = root.bar @@ -41,6 +45,9 @@ Item { } onBarChanged: syncClickRegistration() + onVisibleChanged: if (!visible) hideOwnTooltip() + onInteractiveChanged: if (!interactive) hideOwnTooltip() + onConcealedChanged: if (concealed) hideOwnTooltip() Component.onCompleted: syncClickRegistration() Component.onDestruction: if (registeredBar && registeredBar.unregisterClickTarget) registeredBar.unregisterClickTarget(root) diff --git a/shell/plugins/bar/Bar.qml b/shell/plugins/bar/Bar.qml index 5ced9a60..a28fe17c 100644 --- a/shell/plugins/bar/Bar.qml +++ b/shell/plugins/bar/Bar.qml @@ -58,8 +58,11 @@ Item { property bool updateAvailable: false property bool clockAlt: false property var tooltipTarget: null + property var pendingTooltipTarget: null property string tooltipText: "" + property string pendingTooltipText: "" property bool tooltipShown: false + property int tooltipRequest: 0 property var activePopout: null property var clickTargets: [] property bool indicatorAreaHovered: false @@ -385,18 +388,40 @@ Item { } function showTooltip(target, text) { - if (!text) return - - tooltipTarget = target - tooltipText = text + tooltipTimer.stop() + tooltipTarget = null + tooltipText = "" tooltipShown = false - tooltipTimer.restart() + + if (!target || !text) { + pendingTooltipTarget = null + pendingTooltipText = "" + tooltipRequest += 1 + return + } + + var request = tooltipRequest + 1 + tooltipRequest = request + pendingTooltipTarget = target + pendingTooltipText = text + + Qt.callLater(function() { + if (request !== tooltipRequest) return + tooltipTarget = pendingTooltipTarget + tooltipText = pendingTooltipText + pendingTooltipTarget = null + pendingTooltipText = "" + tooltipTimer.restart() + }) } function hideTooltip(target) { - if (tooltipTarget !== target) return + if (tooltipTarget !== target && pendingTooltipTarget !== target) return tooltipTimer.stop() + tooltipRequest += 1 + pendingTooltipTarget = null + pendingTooltipText = "" tooltipTarget = null tooltipText = "" tooltipShown = false