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*/, LONG /*idChild*/,
DWORD /*idEventThread*/, DWORD /*idEventThread*/,
DWORD /*dwmsEventTime*/) { 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)) { if (!(event == EVENT_OBJECT_CREATE && idObject == OBJID_WINDOW)) {
return; 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 // Wine's drag-and-drop tracker windows always have the same window
// class name, so we can easily identify them // class name, so we can easily identify them
{ {
@@ -68,7 +72,7 @@ void CALLBACK dnd_winevent_callback(HWINEVENTHOOK /*hWinEventHook*/,
// data // data
auto tracker_info = auto tracker_info =
reinterpret_cast<TrackerWindowInfo*>(GetWindowLongPtr(hwnd, 0)); reinterpret_cast<TrackerWindowInfo*>(GetWindowLongPtr(hwnd, 0));
if (!tracker_info) { if (!tracker_info || !tracker_info->dataObject) {
return; return;
} }
@@ -122,9 +126,9 @@ void CALLBACK dnd_winevent_callback(HWINEVENTHOOK /*hWinEventHook*/,
} break; } break;
} }
// We won't release the storage, because we're not actually doing if (storage.pUnkForRelease) {
// the Windows drag and drop. We're just snooping in on the data storage.pUnkForRelease->Release();
// that's being dragged. }
} }
} }
} }
+4 -3
View File
@@ -35,9 +35,10 @@ class WineXdndProxy {
* is started, we will initiate the XDND protocol with the same file. This * 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, * will allow us to drag files from Wine windows to X11 applications,
* something that's normally not possible. Calling this function more than * 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 * once doesn't have any effect, but this should still be called at least
* plugin host instance. Because of that we'll use a global Win32 mutex to * once from every plugin host instance. Because the actual data is stored
* ensure that this is done from only one thread at a time. * in a COM object, we can only handle drag-and-drop coming form this
* process.
*/ */
static WineXdndProxy& init_proxy(); static WineXdndProxy& init_proxy();