data-device: conform to reported source actions

fixes #7815
This commit is contained in:
Vaxry 2024-09-17 12:55:48 +01:00
parent e72ae6b25f
commit 581f6659f8
4 changed files with 25 additions and 4 deletions

View file

@ -82,8 +82,19 @@ void CWLDataOfferResource::sendData() {
if (!source)
return;
if (resource->version() >= 3)
resource->sendSourceActions(7);
const auto SOURCEACTIONS = source->actions();
if (resource->version() >= 3 && SOURCEACTIONS > 0) {
resource->sendSourceActions(SOURCEACTIONS);
if (SOURCEACTIONS & WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE)
resource->sendAction(WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE);
else if (SOURCEACTIONS & WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY)
resource->sendAction(WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY);
else {
LOGM(ERR, "Client bug? dnd source has no action move or copy. Sending move, f this.");
resource->sendAction(WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE);
}
}
for (auto const& m : source->mimes()) {
LOGM(LOG, " | offer {:x} supports mime {}", (uintptr_t)this, m);
@ -111,7 +122,7 @@ CWLDataSourceResource::CWLDataSourceResource(SP<CWlDataSource> resource_, SP<CWL
resource->setOffer([this](CWlDataSource* r, const char* mime) { mimeTypes.push_back(mime); });
resource->setSetActions([this](CWlDataSource* r, uint32_t a) {
LOGM(LOG, "DataSource {:x} actions {}", (uintptr_t)this, a);
actions = (wl_data_device_manager_dnd_action)a;
supportedActions = a;
});
}
@ -193,6 +204,10 @@ void CWLDataSourceResource::sendDndAction(wl_data_device_manager_dnd_action a) {
resource->sendAction(a);
}
uint32_t CWLDataSourceResource::actions() {
return supportedActions;
}
CWLDataDeviceResource::CWLDataDeviceResource(SP<CWlDataDevice> resource_) : resource(resource_) {
if (!good())
return;

View file

@ -65,6 +65,7 @@ class CWLDataSourceResource : public IDataSource {
virtual bool dndDone();
virtual void error(uint32_t code, const std::string& msg);
virtual void sendDndFinished();
virtual uint32_t actions(); // wl_data_device_manager.dnd_action
void sendDndDropPerformed();
void sendDndAction(wl_data_device_manager_dnd_action a);
@ -78,7 +79,7 @@ class CWLDataSourceResource : public IDataSource {
WP<CWLDataSourceResource> self;
std::vector<std::string> mimeTypes;
uint32_t actions = 0;
uint32_t supportedActions = 0;
private:
SP<CWlDataSource> resource;

View file

@ -23,3 +23,7 @@ eDataSourceType IDataSource::type() {
void IDataSource::sendDndFinished() {
;
}
uint32_t IDataSource::actions() {
return 7; // all
}

View file

@ -26,6 +26,7 @@ class IDataSource {
virtual void markUsed();
virtual void error(uint32_t code, const std::string& msg) = 0;
virtual eDataSourceType type();
virtual uint32_t actions(); // wl_data_device_manager.dnd_action
struct {
CSignal destroy;