emacs-diffs
[Top][All Lists]
Advanced

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

master 8d4551cbdb 2/2: Ignore tooltip frames when looking for DND target


From: Po Lu
Subject: master 8d4551cbdb 2/2: Ignore tooltip frames when looking for DND target
Date: Wed, 8 Jun 2022 22:06:09 -0400 (EDT)

branch: master
commit 8d4551cbdb03d74448eafa818005218191621aed
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Ignore tooltip frames when looking for DND target
    
    * src/xterm.c (x_dnd_get_target_window): When not using client
    lists, look beneath any tooltip frame.
---
 src/xterm.c | 28 +++++++++++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)

diff --git a/src/xterm.c b/src/xterm.c
index 00586d66a0..3cc730c4ee 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -1077,6 +1077,10 @@ static void x_scroll_bar_end_update (struct 
x_display_info *, struct scroll_bar
 static int x_filter_event (struct x_display_info *, XEvent *);
 #endif
 
+static struct frame *x_tooltip_window_to_frame (struct x_display_info *,
+                                               Window, bool *);
+static Window x_get_window_below (Display *, Window, int, int, int *, int *);
+
 /* Global state maintained during a drag-and-drop operation.  */
 
 /* Flag that indicates if a drag-and-drop operation is in progress.  */
@@ -3544,12 +3548,15 @@ x_dnd_get_target_window (struct x_display_info *dpyinfo,
 {
   Window child_return, child, dummy, proxy;
   int dest_x_return, dest_y_return, rc, proto, motif;
+  int parent_x, parent_y;
   bool extents_p;
 #if defined HAVE_XCOMPOSITE && (XCOMPOSITE_MAJOR > 0 || XCOMPOSITE_MINOR > 2)
   Window overlay_window;
   XWindowAttributes attrs;
 #endif
   int wmstate;
+  struct frame *tooltip;
+  bool unrelated;
 
   child_return = dpyinfo->root_window;
   dest_x_return = root_x;
@@ -3680,6 +3687,8 @@ x_dnd_get_target_window (struct x_display_info *dpyinfo,
   while (child_return != None)
     {
       child = child_return;
+      parent_x = dest_x_return;
+      parent_y = dest_y_return;
 
       x_catch_errors (dpyinfo->display);
       rc = XTranslateCoordinates (dpyinfo->display,
@@ -3696,6 +3705,23 @@ x_dnd_get_target_window (struct x_display_info *dpyinfo,
 
       if (child_return)
        {
+         /* If child_return is a tooltip frame, look beneath it.  We
+            never want to drop anything onto a tooltip frame.  */
+
+         tooltip = x_tooltip_window_to_frame (dpyinfo, child_return,
+                                              &unrelated);
+
+         if (tooltip || unrelated)
+           child_return = x_get_window_below (dpyinfo->display, child_return,
+                                              parent_x, parent_y, 
&dest_x_return,
+                                              &dest_y_return);
+
+         if (!child_return)
+           {
+             x_uncatch_errors ();
+             break;
+           }
+
          if (x_dnd_get_wm_state_and_proto (dpyinfo, child_return,
                                            &wmstate, &proto, &motif,
                                            &proxy)
@@ -11885,7 +11911,7 @@ x_note_mouse_movement (struct frame *frame, const 
XMotionEvent *event,
   return false;
 }
 
-/* Get a sibling of DPY below WINDOW at PARENT_X and PARENT_Y.  */
+/* Get a sibling below WINDOW on DPY at PARENT_X and PARENT_Y.  */
 static Window
 x_get_window_below (Display *dpy, Window window,
                    int parent_x, int parent_y,



reply via email to

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