]> git.eshelyaron.com Git - emacs.git/commitdiff
Make `mouse-position' work correctly with GTK tooltips
authorPo Lu <luangruo@yahoo.com>
Sun, 5 Jun 2022 01:24:20 +0000 (09:24 +0800)
committerPo Lu <luangruo@yahoo.com>
Sun, 5 Jun 2022 01:24:20 +0000 (09:24 +0800)
* src/xterm.c (x_tooltip_window_to_frame): New parameter
`unrelated_tooltip_p'.
(XTmouse_position): Pass that, and if it turns out to be true,
look beneath the tooltip window.

src/xterm.c

index 34a40da548f1f8165651d694b069b11d8e7bc545..3eb9ee21daa82423bca6ee66d6c89beffbb93e2c 100644 (file)
@@ -10281,13 +10281,22 @@ x_window_to_frame (struct x_display_info *dpyinfo, int wdesc)
   return 0;
 }
 
-/* Like x_any_window_to_frame but only try to find tooltip frames.  */
+/* Like x_any_window_to_frame but only try to find tooltip frames.
+
+   If wdesc is a toolkit tooltip without an associated frame, set
+   UNRELATED_TOOLTIP_P to true.  Otherwise, set it to false.  */
 static struct frame *
 x_tooltip_window_to_frame (struct x_display_info *dpyinfo,
-                          Window wdesc)
+                          Window wdesc, bool *unrelated_tooltip_p)
 {
   Lisp_Object tail, frame;
   struct frame *f;
+#ifdef USE_GTK
+  GtkWidget *widget;
+  GdkWindow *tooltip_window;
+#endif
+
+  *unrelated_tooltip_p = false;
 
   FOR_EACH_FRAME (tail, frame)
     {
@@ -10297,6 +10306,25 @@ x_tooltip_window_to_frame (struct x_display_info *dpyinfo,
          && FRAME_DISPLAY_INFO (f) == dpyinfo
          && FRAME_X_WINDOW (f) == wdesc)
        return f;
+
+#ifdef USE_GTK
+      if (FRAME_X_OUTPUT (f)->ttip_window)
+       widget = GTK_WIDGET (FRAME_X_OUTPUT (f)->ttip_window);
+      else
+       widget = NULL;
+
+      if (widget)
+       tooltip_window = gtk_widget_get_window (widget);
+      else
+       tooltip_window = NULL;
+
+      if (tooltip_window
+         && (gdk_x11_window_get_xid (tooltip_window) == wdesc))
+       {
+         *unrelated_tooltip_p = true;
+         break;
+       }
+#endif
     }
 
   return NULL;
@@ -11782,6 +11810,7 @@ XTmouse_position (struct frame **fp, int insist, Lisp_Object *bar_window,
 {
   struct frame *f1, *maybe_tooltip;
   struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (*fp);
+  bool unrelated_tooltip;
 
   block_input ();
 
@@ -11882,9 +11911,10 @@ XTmouse_position (struct frame **fp, int insist, Lisp_Object *bar_window,
                    && (EQ (track_mouse, Qdrag_source)
                        || EQ (track_mouse, Qdropping)))
                  {
-                   maybe_tooltip = x_tooltip_window_to_frame (dpyinfo, child);
+                   maybe_tooltip = x_tooltip_window_to_frame (dpyinfo, child,
+                                                              &unrelated_tooltip);
 
-                   if (maybe_tooltip)
+                   if (maybe_tooltip || unrelated_tooltip)
                      child = x_get_window_below (dpyinfo->display, child,
                                                  parent_x, parent_y, &win_x,
                                                  &win_y);