Review Request 128571: Add Qt::Dialog to default flags to make QXcbWindow::isTransient() happy.
Martin Gräßlin
mgraesslin at kde.org
Tue Aug 2 05:48:34 UTC 2016
-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://git.reviewboard.kde.org/r/128571/#review97990
-----------------------------------------------------------
Ship it!
Good investigation!
- Martin Gräßlin
On Aug. 1, 2016, 9:47 p.m., Eike Hein wrote:
>
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://git.reviewboard.kde.org/r/128571/
> -----------------------------------------------------------
>
> (Updated Aug. 1, 2016, 9:47 p.m.)
>
>
> Review request for Plasma and Marco Martin.
>
>
> Bugs: 366278
> http://bugs.kde.org/show_bug.cgi?id=366278
>
>
> Repository: plasma-framework
>
>
> Description
> -------
>
> Panel popup dialogs along with other applications of Plasma::Dialog
> (e.g. Kicker's submenus) currently don't correctly set WM_TRANSIENT_FOR
> to the id of their parent window on X11. This causes them to interact
> badly with auto-hide panels which do not set struts, e.g. Kicker's
> submenus open behind the panel.
>
> Internally, Dialog makes calls to QWindow::setFlags when its window
> type is "Normal" (the default) and otherwise uses KWindowSystem's
> setType. (Kicker's subclass, SubMenu, does an additional
> KWindowSystem::setType call for NET::Menu). Neither CompactApplet
> nor Kicker change their Dialog's 'type' property to anything else,
> so their dialogs are "Normal", thus going the setFlags route with
> no setType calls.
>
> Dialog also sets its transient parent to the window the visualParent
> item is inside of.
>
> Now here is where things break down: QXcbWindow will update
> WM_TRANSIENT_PARENT for in show(), but only when an inline function
> called isTransient returns true. isTransient decides this based on
> window type, which is determined from the flags set with
> QWindow::setFlags. Calls to KWindowSystem::setType would have no
> bearing on this; there seems to be no mapping back from external
> state. This is why setting Dialog.type to e.g. "DialogWindow" does
> nothing.
>
> This patch takes the route of adding Qt::Dialog to the starting
> flags - after all Dialog is a dialog. That means isTransient()
> will consider the window to be a transient and those
> setTransientParent calls Dialog does will not be ignored. In the
> case of CompactApplet, no further calls to KWS::setType are done;
> Kicker continues to call it with NET::Menu to get desired window
> manager behavior.
>
> In light testing everything still seems too work, with the added
> benefit of fixing:
> BUG:366278
>
> That said, the weird mess of setFlags and setType and state in the
> windowing system vs. Qt is horrible and sad.
>
>
> Diffs
> -----
>
> src/plasmaquick/dialog.cpp eb9fc79
>
> Diff: https://git.reviewboard.kde.org/r/128571/diff/
>
>
> Testing
> -------
>
>
> Thanks,
>
> Eike Hein
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/plasma-devel/attachments/20160802/12c1275e/attachment.html>
More information about the Plasma-devel
mailing list