emacs-diffs
[Top][All Lists]
Advanced

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

master ee58141785: Speed up querying for window manager support


From: Po Lu
Subject: master ee58141785: Speed up querying for window manager support
Date: Fri, 8 Jul 2022 20:06:09 -0400 (EDT)

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

    Speed up querying for window manager support
    
    * src/xterm.c (handle_one_xevent): Clear net_supported_window if
    it is destroyed.
    (x_get_wm_check_window): New function.
    (x_wm_supports_1): First try net_supported_window.  If it still
    exists, don't ask for _NET_SUPPORTING_WM_CHECK.
---
 src/xterm.c | 76 +++++++++++++++++++++++++++++++++++++++++++++----------------
 1 file changed, 56 insertions(+), 20 deletions(-)

diff --git a/src/xterm.c b/src/xterm.c
index 23a784ade8..1afb8adcfe 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -19215,6 +19215,10 @@ handle_one_xevent (struct x_display_info *dpyinfo,
       goto OTHER;
 
     case DestroyNotify:
+      if (event->xdestroywindow.window
+         == dpyinfo->net_supported_window)
+       dpyinfo->net_supported_window = None;
+
       xft_settings_event (dpyinfo, event);
       break;
 
@@ -24076,6 +24080,36 @@ x_set_offset (struct frame *f, int xoff, int yoff, int 
change_gravity)
   unblock_input ();
 }
 
+static Window
+x_get_wm_check_window (struct x_display_info *dpyinfo)
+{
+  Window result;
+  unsigned char *tmp_data = NULL;
+  int rc, actual_format;
+  unsigned long actual_size, bytes_remaining;
+  Atom actual_type;
+
+  rc = XGetWindowProperty (dpyinfo->display, dpyinfo->root_window,
+                          dpyinfo->Xatom_net_supporting_wm_check,
+                           0, 1, False, XA_WINDOW, &actual_type,
+                          &actual_format, &actual_size,
+                           &bytes_remaining, &tmp_data);
+
+  if (rc != Success || actual_type != XA_WINDOW
+      || actual_format != 32 || actual_size != 1)
+    {
+      if (tmp_data)
+       XFree (tmp_data);
+
+      return None;
+    }
+
+  result = *(Window *) tmp_data;
+  XFree (tmp_data);
+
+  return result;
+}
+
 /* Return true if _NET_SUPPORTING_WM_CHECK window exists and _NET_SUPPORTED
    on the root window for frame F contains ATOMNAME.
    This is how a WM check shall be done according to the Window Manager
@@ -24099,30 +24133,32 @@ x_wm_supports_1 (struct x_display_info *dpyinfo, Atom 
want_atom)
   block_input ();
 
   x_catch_errors (dpy);
-  rc = XGetWindowProperty (dpy, target_window,
-                           dpyinfo->Xatom_net_supporting_wm_check,
-                           0, max_len, False, target_type,
-                           &actual_type, &actual_format, &actual_size,
-                           &bytes_remaining, &tmp_data);
 
-  if (rc != Success || actual_type != XA_WINDOW || x_had_errors_p (dpy))
-    {
-      if (tmp_data) XFree (tmp_data);
-      x_uncatch_errors ();
-      unblock_input ();
-      return false;
-    }
+  wmcheck_window = dpyinfo->net_supported_window;
 
-  wmcheck_window = *(Window *) tmp_data;
-  XFree (tmp_data);
+  if (wmcheck_window == None)
+    wmcheck_window = x_get_wm_check_window (dpyinfo);
 
-  /* Check if window exists. */
-  XSelectInput (dpy, wmcheck_window, StructureNotifyMask);
-  if (x_had_errors_p (dpy))
+  if (!x_special_window_exists_p (dpyinfo, wmcheck_window))
     {
-      x_uncatch_errors_after_check ();
-      unblock_input ();
-      return false;
+      if (dpyinfo->net_supported_window != None)
+       {
+         dpyinfo->net_supported_window = None;
+         wmcheck_window = x_get_wm_check_window (dpyinfo);
+
+         if (!x_special_window_exists_p (dpyinfo, wmcheck_window))
+           {
+             x_uncatch_errors ();
+             unblock_input ();
+             return false;
+           }
+       }
+      else
+       {
+         x_uncatch_errors ();
+         unblock_input ();
+         return false;
+       }
     }
 
   if (dpyinfo->net_supported_window != wmcheck_window)



reply via email to

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