1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-21 06:55:39 +00:00

Fix drag-n-drop on MS-Windows

* src/w32fns.c (struct w32_drop_target): New member 'ref_count'.
(w32_drop_target_AddRef): Increment reference count.
(w32_drop_target_Release): Decrement reference count, and free the
target only if the reference count is zero.
(w32_createwindow): Initialize reference count.  (Bug#74312)
This commit is contained in:
Cecilio Pardo 2024-11-14 09:55:56 +01:00 committed by Eli Zaretskii
parent 70273dc9f7
commit b83a45eab5

View File

@ -2562,6 +2562,7 @@ struct w32_drop_target {
/* i_drop_target must be the first member. */
IDropTarget i_drop_target;
HWND hwnd;
int ref_count;
};
static HRESULT STDMETHODCALLTYPE
@ -2573,13 +2574,16 @@ w32_drop_target_QueryInterface (IDropTarget *t, REFIID ri, void **r)
static ULONG STDMETHODCALLTYPE
w32_drop_target_AddRef (IDropTarget *This)
{
return 1;
struct w32_drop_target *target = (struct w32_drop_target *) This;
return ++target->ref_count;
}
static ULONG STDMETHODCALLTYPE
w32_drop_target_Release (IDropTarget *This)
{
struct w32_drop_target *target = (struct w32_drop_target *) This;
if (--target->ref_count > 0)
return target->ref_count;
free (target->i_drop_target.lpVtbl);
free (target);
return 0;
@ -2770,6 +2774,7 @@ w32_createwindow (struct frame *f, int *coords)
if (vtbl != NULL)
{
drop_target->hwnd = hwnd;
drop_target->ref_count = 0;
drop_target->i_drop_target.lpVtbl = vtbl;
vtbl->QueryInterface = w32_drop_target_QueryInterface;
vtbl->AddRef = w32_drop_target_AddRef;