[xwl] Create a new datasource on offer changes

Offers shoul be set on a source before data_device.set_selection. Doing
so afterwards appears to be against the spec and as such we may not pass
the update to wayland clients / klipper.
This commit is contained in:
David Edmundson 2021-06-04 13:03:28 +01:00
parent f280423b92
commit bc6eba6114

View file

@ -167,22 +167,16 @@ void Clipboard::x11OffersChanged(const QStringList &added, const QStringList &re
const Mimes offers = source->offers();
if (!offers.isEmpty()) {
if (!source->dataSource() || !removed.isEmpty()) {
// create new Wl DataSource if there is none or when types
// were removed (Wl Data Sources can only add types)
KWayland::Client::DataDeviceManager *dataDeviceManager =
waylandServer()->internalDataDeviceManager();
KWayland::Client::DataSource *dataSource =
dataDeviceManager->createDataSource(source);
// create new Wl DataSource if there is none or when types
// were removed (Wl Data Sources can only add types)
KWayland::Client::DataDeviceManager *dataDeviceManager =
waylandServer()->internalDataDeviceManager();
KWayland::Client::DataSource *dataSource =
dataDeviceManager->createDataSource(source);
// also offers directly the currently available types
source->setDataSource(dataSource);
DataBridge::self()->dataDevice()->setSelection(0, dataSource);
} else if (auto *dataSource = source->dataSource()) {
for (const QString &mime : added) {
dataSource->offer(mime);
}
}
// also offers directly the currently available types
source->setDataSource(dataSource);
DataBridge::self()->dataDevice()->setSelection(0, dataSource);
} else {
KWaylandServer::AbstractDataSource *currentSelection = waylandServer()->seat()->selection();
if (!ownsSelection(currentSelection)) {