GNU bug report logs - #74312
31.0.50; Cygw32 build break

Previous Next

Package: emacs;

Reported by: Kazuhiro Ito <kzhr <at> d1.dion.ne.jp>

Date: Mon, 11 Nov 2024 14:52:01 UTC

Severity: normal

Found in version 31.0.50

Done: Ken Brown <kbrown <at> cornell.edu>

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: Cecilio Pardo <cpardo <at> imayhem.com>
To: Kazuhiro Ito <kzhr <at> d1.dion.ne.jp>, 74312 <at> debbugs.gnu.org, Eli Zaretskii <eliz <at> gnu.org>
Subject: bug#74312: 31.0.50; Cygw32 build break
Date: Thu, 14 Nov 2024 09:55:56 +0100
On 13/11/2024 16:55, Kazuhiro Ito wrote:
>>> Both Emacsen may fail to handle dropped files if I do drag-n-drop
>>> files very quickly.  I confirmed Microsoft Photo application on
>>> Windows 11.  And, once Emacs failed to handle drop event, it keeps
>>> ignoring dropping files or text event.
>>
>> I will look into this.
> 
> As far as I tested, drag-n-drop from Microsoft Photo worked only the
> first time.  Second operation was ignored.  Quick operation may fail
> even at the first time.  Drag-n-drop from explorer worked expectedly.

This should fix the Photo application problem.

I didn't expect ref counting to be needed for this, my bad.

diff --git a/src/w32fns.c b/src/w32fns.c
index 1bd3d5099e2..e2455b9271e 100644
--- a/src/w32fns.c
+++ b/src/w32fns.c
@@ -2562,6 +2562,7 @@ w32_process_dnd_data (int format, void *hGlobal)
   /* 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;







This bug report was last modified 281 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.