emacs-diffs
[Top][All Lists]
Advanced

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

master cdf7e2e021: Don't allow tooltips to be transient for override red


From: Po Lu
Subject: master cdf7e2e021: Don't allow tooltips to be transient for override redirect windows
Date: Mon, 7 Feb 2022 20:26:40 -0500 (EST)

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

    Don't allow tooltips to be transient for override redirect windows
    
    * src/xfns.c (Fx_show_tip): Delete WM_TRANSIENT_FOR if the child
    window is override-redirect.
    
    * src/xterm.c (x_term_init): Intern new atom.
    * src/xterm.h (struct x_display_info): New atom
    `Xatom_wm_transient_for'.
---
 src/xfns.c  | 22 ++++++++++++++++++----
 src/xterm.c |  1 +
 src/xterm.h |  2 ++
 3 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/src/xfns.c b/src/xfns.c
index 7878ee62f5..2fd9ad6b05 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -7788,6 +7788,7 @@ Text larger than the specified size is clipped.  */)
   ptrdiff_t count_1;
   Lisp_Object window, size, tip_buf;
   Window child;
+  XWindowAttributes child_attrs;
   int dest_x_return, dest_y_return;
   AUTO_STRING (tip, " *tip*");
 
@@ -8028,11 +8029,24 @@ Text larger than the specified size is clipped.  */)
                             FRAME_DISPLAY_INFO (f)->root_window,
                             root_x, root_y, &dest_x_return,
                             &dest_y_return, &child))
-    XSetTransientForHint (FRAME_X_DISPLAY (tip_f),
-                         FRAME_X_WINDOW (tip_f), child);
+    {
+      /* But only if the child is not override-redirect, which can
+        happen if the pointer is above a menu.  */
+
+      if (XGetWindowAttributes (FRAME_X_DISPLAY (f),
+                               child, &child_attrs)
+         || child_attrs.override_redirect)
+       XDeleteProperty (FRAME_X_DISPLAY (tip_f),
+                        FRAME_X_WINDOW (tip_f),
+                        FRAME_DISPLAY_INFO (tip_f)->Xatom_wm_transient_for);
+      else
+       XSetTransientForHint (FRAME_X_DISPLAY (tip_f),
+                             FRAME_X_WINDOW (tip_f), child);
+    }
   else
-    XSetTransientForHint (FRAME_X_DISPLAY (tip_f),
-                         FRAME_X_WINDOW (tip_f), None);
+    XDeleteProperty (FRAME_X_DISPLAY (tip_f),
+                    FRAME_X_WINDOW (tip_f),
+                    FRAME_DISPLAY_INFO (tip_f)->Xatom_wm_transient_for);
 
 #ifndef USE_XCB
   XMoveResizeWindow (FRAME_X_DISPLAY (tip_f), FRAME_X_WINDOW (tip_f),
diff --git a/src/xterm.c b/src/xterm.c
index 38f181e5df..b49441ddb7 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -15984,6 +15984,7 @@ x_term_init (Lisp_Object display_name, char 
*xrm_option, char *resource_name)
       ATOM_REFS_INIT ("WM_CONFIGURE_DENIED", Xatom_wm_configure_denied)
       ATOM_REFS_INIT ("WM_MOVED", Xatom_wm_window_moved)
       ATOM_REFS_INIT ("WM_CLIENT_LEADER", Xatom_wm_client_leader)
+      ATOM_REFS_INIT ("WM_TRANSIENT_FOR", Xatom_wm_transient_for)
       ATOM_REFS_INIT ("Editres", Xatom_editres)
       ATOM_REFS_INIT ("CLIPBOARD", Xatom_CLIPBOARD)
       ATOM_REFS_INIT ("TIMESTAMP", Xatom_TIMESTAMP)
diff --git a/src/xterm.h b/src/xterm.h
index 63956fd643..854d87c83c 100644
--- a/src/xterm.h
+++ b/src/xterm.h
@@ -364,6 +364,8 @@ struct x_display_info
   Atom Xatom_wm_configure_denied; /* When our config request is denied */
   Atom Xatom_wm_window_moved;     /* When the WM moves us.  */
   Atom Xatom_wm_client_leader;    /* Id of client leader window.  */
+  Atom Xatom_wm_transient_for;    /* Id of whatever window we are
+                                    transient for. */
 
   /* EditRes protocol */
   Atom Xatom_editres;



reply via email to

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