mirror of
https://github.com/robbert-vdh/yabridge.git
synced 2026-05-10 04:30:12 +02:00
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:
@@ -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.
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user