┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKai Uwe Broulik <[email protected]>2025-12-30 10:28:57 +0100
committerKai Uwe Broulik <[email protected]>2026-01-08 15:57:11 +0000
commit1e817f3b8b921b81a6b8011b898c5e35035574c4 (patch)
tree0cd7451fde439b5d67c47a12e677ca8094ed98f7 /src
parent5b6dfad767522060596ba2a76044e14ca99db57b (diff)
Install middle click event handler on KXmlGui Toolbar menu
For ease of access, KXmlGui adds actions in a delayed/split toolbar button to its own context menu. We have no access to this menu, so we cannot install our middle-click event handler for the back/forward action menus. To address this, we detect the action showing for the first time and install an event filter on the associated object if we think it's the menu.
Diffstat (limited to 'src')
-rw-r--r--src/middleclickactioneventfilter.cpp18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/middleclickactioneventfilter.cpp b/src/middleclickactioneventfilter.cpp
index 7f98e727e..2d943475a 100644
--- a/src/middleclickactioneventfilter.cpp
+++ b/src/middleclickactioneventfilter.cpp
@@ -7,6 +7,7 @@
#include "middleclickactioneventfilter.h"
#include <QAction>
+#include <QActionEvent>
#include <QEvent>
#include <QMenu>
#include <QMouseEvent>
@@ -55,6 +56,23 @@ bool MiddleClickActionEventFilter::eventFilter(QObject *watched, QEvent *event)
}
}
}
+
+ } else if (event->type() == QEvent::ActionChanged) {
+ // KXmlGui adds delayed popup menu's actions to its own context menu.
+ // In order for middle click to work, we need to somehow detect when the action is added
+ // on this menu and install the event filter on it.
+ // Visibility of the action changes when the menu shows in the menu for the first time,
+ // so we'll receive an ActionChanged event and use that.
+ auto *actionEvent = static_cast<QActionEvent *>(event);
+
+ const auto items = actionEvent->action()->associatedObjects();
+ for (auto *item : items) {
+ if (auto *menu = qobject_cast<QMenu *>(item)) {
+ if (menu != actionEvent->action()->parent()) { // Parent is the regular menu.
+ menu->installEventFilter(this);
+ }
+ }
+ }
}
return QObject::eventFilter(watched, event);