Add support for XDG Foreign
This adds a KWindowSystem::setMainWindow
overload taking a
QString
for its parent window which consumes an XDG Foreign
handle.
This also adds an exportWindow
and unexportWindow
method to
KWaylandExtras
.
exportWindow(window)
asks the compositor for a handle and emits
the windowExported
signal once it received one. This token can then
be sent to a different application and a window parented to it using
setMainWindow(window, handle)
.
The wayland objects are parented to the respective QWaylandWindow
so that they are cleaned up when the window is destroyed.
Calling exportWindow
on the same window will re-use the existing
exported object. Even though you can technically export the same window
multiple times and get a separate token each time, this isn't covered
by this API and realistically not its primary use case.
Furthermore, calling unexportWindow(window)
will delete the
exported object, should one exist on the given window. Calling
setMainWindow
with an invalid handle will destroy the imported
object, severing the parent-child relationship.
Successfully used exportWindow
in kauth!57 (merged) and setForeignParent
in plasma/polkit-kde-agent-1!36 (merged)
Also tested unexportWindow(window)
and setMainWindow(window, QString())
. Haven’t tried parenting multiple windows to the same token or changing to a different (non-null) parent.
There’s at least three places (kwin killer, kauth/polkit prompt, colors kcm) where I could already use this. There’s plenty more: xdg desktop portal, window rules, kdialog, keditfiletype, soliduiserver, print-manager stuff, bluetooth kcm (generally any of those KCMs that use external helper apps for certain workflows), kpasswordprompt. Just a quick grep for QWindow::fromWinId
and KWindowSystem::setMainWindow
.
This is ABI-incompatible but should be source-compatible. In many cases you get the token from QCommandLineParser
which you can directly feed into setMainWindow(window, handleString)
now and need no specific code for Wayland, pretty nifty.