emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 41540b9324: Don't send XdndPosition before XdndStatus arrives


From: Po Lu
Subject: master 41540b9324: Don't send XdndPosition before XdndStatus arrives
Date: Wed, 22 Jun 2022 23:31:22 -0400 (EDT)

branch: master
commit 41540b9324283ec924d0f818e649b4b9d7679d10
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Don't send XdndPosition before XdndStatus arrives
    
    * src/xterm.c (x_dnd_send_position): Set pending DND message if
    target is right.
    (x_dnd_send_leave): Clear pending status target.
    (x_dnd_begin_drag_and_drop): Clear new flags.
    (handle_one_xevent): Respect those flags.
---
 src/xterm.c | 42 +++++++++++++++++++++++++++++++++++++++---
 1 file changed, 39 insertions(+), 3 deletions(-)

diff --git a/src/xterm.c b/src/xterm.c
index b6300f831f..d3e6c5323b 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -1235,6 +1235,14 @@ static Window x_dnd_mouse_rect_target;
    drop target if the mouse pointer lies within.  */
 static XRectangle x_dnd_mouse_rect;
 
+/* If not None, Emacs is waiting for an XdndStatus event from this
+   window.  */
+static Window x_dnd_waiting_for_status_window;
+
+/* If .type != 0, an event that should be sent to .xclient.window
+   upon receiving an XdndStatus event from said window.  */
+static XEvent x_dnd_pending_send_position;
+
 /* The action the drop target actually chose to perform.
 
    Under XDND, this is set upon receiving the XdndFinished or
@@ -4380,9 +4388,16 @@ x_dnd_send_position (struct frame *f, Window target, int 
supported,
   if (supported >= 4)
     msg.xclient.data.l[4] = action;
 
-  x_catch_errors (dpyinfo->display);
-  XSendEvent (FRAME_X_DISPLAY (f), target, False, NoEventMask, &msg);
-  x_uncatch_errors ();
+  if (x_dnd_waiting_for_status_window == target)
+    x_dnd_pending_send_position = msg;
+  else
+    {
+      x_catch_errors (dpyinfo->display);
+      XSendEvent (FRAME_X_DISPLAY (f), target, False, NoEventMask, &msg);
+      x_uncatch_errors ();
+
+      x_dnd_waiting_for_status_window = target;
+    }
 }
 
 static void
@@ -4401,6 +4416,9 @@ x_dnd_send_leave (struct frame *f, Window target)
   msg.xclient.data.l[3] = 0;
   msg.xclient.data.l[4] = 0;
 
+  puts ("RESET PENDING");
+  x_dnd_waiting_for_status_window = None;
+
   x_catch_errors (dpyinfo->display);
   XSendEvent (FRAME_X_DISPLAY (f), target, False, NoEventMask, &msg);
   x_uncatch_errors ();
@@ -11437,6 +11455,8 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time, 
Atom xaction,
   x_dnd_return_frame = 0;
   x_dnd_waiting_for_finish = false;
   x_dnd_waiting_for_motif_finish = 0;
+  x_dnd_waiting_for_status_window = None;
+  x_dnd_pending_send_position.type = 0;
   x_dnd_xm_use_help = false;
   x_dnd_motif_setup_p = false;
   x_dnd_end_window = None;
@@ -16326,6 +16346,22 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                  x_dnd_action = None;
              }
 
+           /* Send any pending XdndPosition message.  */
+           if (x_dnd_waiting_for_status_window == target)
+             {
+               if (x_dnd_pending_send_position.type != 0)
+                 {
+                   x_catch_errors (dpyinfo->display);
+                   XSendEvent (dpyinfo->display, target,
+                               False, NoEventMask,
+                               &x_dnd_pending_send_position);
+                   x_uncatch_errors ();
+                 }
+
+               x_dnd_pending_send_position.type = 0;
+               x_dnd_waiting_for_status_window = None;
+             }
+
            goto done;
          }
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]