From 39964b94c993d23de07df26e18a62b4bc5bb9ea5 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 31 Oct 2012 14:23:26 +0100 Subject: XCB: Use screen's client leader as fallback for transient parent. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modal dialogs that do not have a QWidget parent may be hidden by their parent unless they actually have a transient parent. Task-number: QTBUG-27786 Change-Id: I7847df3517e5ba6e8d77a2a18c905e908a3cd2f4 Reviewed-by: Samuel Rødal --- src/plugins/platforms/xcb/qxcbwindow.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp index 48754b0a60..eab18e2435 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.cpp +++ b/src/plugins/platforms/xcb/qxcbwindow.cpp @@ -542,16 +542,18 @@ void QXcbWindow::show() propagateSizeHints(); // update WM_TRANSIENT_FOR - if (window()->transientParent() && isTransient(window())) { - QXcbWindow *transientXcbParent = static_cast(window()->transientParent()->handle()); - if (transientXcbParent) { - // ICCCM 4.1.2.6 - xcb_window_t parentWindow = transientXcbParent->xcb_window(); - - // todo: set transient for group (wm_client_leader) if no parent, a la qwidget_x11.cpp + if (isTransient(window())) { + xcb_window_t transientXcbParent = 0; + if (const QWindow *tp = window()->transientParent()) + transientXcbParent = static_cast(tp->handle())->winId(); + // Default to client leader if there is no transient parent, else modal dialogs can + // be hidden by their parents. + if (!transientXcbParent) + transientXcbParent = static_cast(screen())->clientLeader(); + if (transientXcbParent) { // ICCCM 4.1.2.6 Q_XCB_CALL(xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, m_window, XCB_ATOM_WM_TRANSIENT_FOR, XCB_ATOM_WINDOW, 32, - 1, &parentWindow)); + 1, &transientXcbParent)); } } -- cgit v1.2.3