Only handle drag-and-drop from this process

When called from another process the data pointer will of course be
invalid, so every process must handle their own drag-and-drop.
This commit is contained in:
Robbert van der Helm
2021-07-09 21:32:56 +02:00
parent f33c02f4f7
commit dd14a90f9a
2 changed files with 16 additions and 11 deletions
+12 -8
View File
@@ -46,14 +46,18 @@ void CALLBACK dnd_winevent_callback(HWINEVENTHOOK /*hWinEventHook*/,
LONG /*idChild*/,
DWORD /*idEventThread*/,
DWORD /*dwmsEventTime*/) {
// FIXME: Prevent this from being run by multiple processes at the same time
// XXX: `EVENT_OBJECT_DESTROY` doesn't seem to be implemented by Wine, so we
// can't rely on that.
if (!(event == EVENT_OBJECT_CREATE && idObject == OBJID_WINDOW)) {
return;
}
// Don't handle windows that weren't created in this process, because
// otherwise we obviously cannot access the `IDataObject` object
uint32_t process_id = 0;
GetWindowThreadProcessId(hwnd, &process_id);
if (process_id != GetCurrentProcessId()) {
return;
}
// Wine's drag-and-drop tracker windows always have the same window
// class name, so we can easily identify them
{
@@ -68,7 +72,7 @@ void CALLBACK dnd_winevent_callback(HWINEVENTHOOK /*hWinEventHook*/,
// data
auto tracker_info =
reinterpret_cast<TrackerWindowInfo*>(GetWindowLongPtr(hwnd, 0));
if (!tracker_info) {
if (!tracker_info || !tracker_info->dataObject) {
return;
}
@@ -122,9 +126,9 @@ void CALLBACK dnd_winevent_callback(HWINEVENTHOOK /*hWinEventHook*/,
} break;
}
// We won't release the storage, because we're not actually doing
// the Windows drag and drop. We're just snooping in on the data
// that's being dragged.
if (storage.pUnkForRelease) {
storage.pUnkForRelease->Release();
}
}
}
}
+4 -3
View File
@@ -35,9 +35,10 @@ class WineXdndProxy {
* is started, we will initiate the XDND protocol with the same file. This
* will allow us to drag files from Wine windows to X11 applications,
* something that's normally not possible. Calling this function more than
* once doesn't have any effect, but this will still be called from every
* plugin host instance. Because of that we'll use a global Win32 mutex to
* ensure that this is done from only one thread at a time.
* once doesn't have any effect, but this should still be called at least
* once from every plugin host instance. Because the actual data is stored
* in a COM object, we can only handle drag-and-drop coming form this
* process.
*/
static WineXdndProxy& init_proxy();