widgets: setTransientParent() when a QMenu is a window
authorDebian Qt/KDE Maintainers <debian-qt-kde@lists.debian.org>
Sat, 3 Dec 2022 17:38:46 +0000 (17:38 +0000)
committerDmitry Shachnev <mitya57@debian.org>
Sat, 3 Dec 2022 17:38:46 +0000 (17:38 +0000)
Origin: upstream, https://code.qt.io/cgit/qt/qtbase.git/commit/?id=493a85a9e4688744
Last-Update: 2022-10-16

On some platforms, such as X11 and Wayland with some compositors,
QMenu could be a popup window, which should be set a transient parent
to get relative position, which is requested by Wayland.

Added transientParentWindow() for QMenuPrivate like QDialogPrivate.

Gbp-Pq: Name qmenu_set_transient_parent.diff

src/widgets/widgets/qmenu.cpp
src/widgets/widgets/qmenu_p.h

index a23d8b790d5ef3f05e1fa0b4ce48f5b6749563d0..2809bebcf5412aae4fcb8ab943f0cc3f40236695 100644 (file)
@@ -624,6 +624,29 @@ void QMenuPrivate::hideMenu(QMenu *menu)
     menu->d_func()->causedPopup.widget = nullptr;
 }
 
+QWindow *QMenuPrivate::transientParentWindow() const
+{
+    Q_Q(const QMenu);
+    if (const QWidget *parent = q->nativeParentWidget()) {
+        if (parent->windowHandle())
+            return parent->windowHandle();
+    }
+
+    if (const QWindow *w = q->windowHandle()) {
+        if (w->transientParent())
+            return w->transientParent();
+    }
+
+    if (causedPopup.widget) {
+        if (const QWidget *w = causedPopup.widget.data()) {
+            if (const QWidget *ww = w->window())
+                return ww->windowHandle();
+        }
+    }
+
+    return nullptr;
+}
+
 void QMenuPrivate::popupAction(QAction *action, int delay, bool activateFirst)
 {
     Q_Q(QMenu);
@@ -3060,6 +3083,8 @@ QMenu::event(QEvent *e)
         d->sloppyState.reset();
         if (d->currentAction)
             d->popupAction(d->currentAction, 0, false);
+        if (isWindow() && window() && window()->windowHandle() && !window()->windowHandle()->transientParent())
+            window()->windowHandle()->setTransientParent(d->transientParentWindow());
         break;
 #ifndef QT_NO_TOOLTIP
     case QEvent::ToolTip:
index 3871d6763c9c8fd30bd3953c15bc18b1d191bf0b..fa3929ea2d361b23130e1d704227e763acbc4ff4 100644 (file)
@@ -440,6 +440,7 @@ public:
     QMenuCaused causedPopup;
     void hideUpToMenuBar();
     void hideMenu(QMenu *menu);
+    QWindow *transientParentWindow() const;
 
     //index mappings
     inline QAction *actionAt(int i) const { return q_func()->actions().at(i); }