emacs-diffs
[Top][All Lists]
Advanced

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

master 2a907bcd4bb: Don't excessively sync in some other code


From: Po Lu
Subject: master 2a907bcd4bb: Don't excessively sync in some other code
Date: Mon, 5 Dec 2022 06:58:17 -0500 (EST)

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

    Don't excessively sync in some other code
    
    * configure.ac (USE_XCB): Remove xcb-util dependency.
    * src/frame.h: Remove x_sync.
    * src/gtkutil.c (xg_frame_restack, xg_update_scrollbar_pos)
    (xg_update_horizontal_scrollbar_pos): Call XSync manually
    instead of x_sync.
    * src/xfns.c (x_sync): Delete unused function.
    * src/xterm.c (x_send_hourglass_message): New function.
    (x_show_hourglass, x_hide_hourglass): Avoid XSync in these two
    pieces of frequently used code.
    (handle_one_xevent): Handle hourglass messages.
    (x_make_frame_invisible): Stop using x_sync.
---
 configure.ac  | 17 +++--------------
 src/frame.h   |  1 -
 src/gtkutil.c |  6 +++---
 src/xfns.c    | 14 --------------
 src/xterm.c   | 47 +++++++++++++++++++++++++++++++++++++++--------
 5 files changed, 45 insertions(+), 40 deletions(-)

diff --git a/configure.ac b/configure.ac
index 9f431fc78b2..2770694b9c5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3933,21 +3933,10 @@ if test "${HAVE_X11}" = "yes"; then
   if test "${HAVE_XCB}" = "yes"; then
     AC_CHECK_LIB([X11-xcb], [XGetXCBConnection], [HAVE_X11_XCB=yes])
     if test "${HAVE_X11_XCB}" = "yes"; then
-      AC_CHECK_LIB([xcb-util], [xcb_aux_sync], [HAVE_XCB_UTIL=yes])
-      if test "${HAVE_XCB_UTIL}" = "yes"; then
-       AC_DEFINE([USE_XCB], [1],
+      AC_DEFINE([USE_XCB], [1],
 [Define to 1 if you have the XCB library and X11-XCB library for mixed
-  X11/XCB programming.])
-        XCB_LIBS="-lX11-xcb -lxcb -lxcb-util"
-      else
-       AC_CHECK_LIB([xcb-aux], [xcb_aux_sync], [HAVE_XCB_AUX=yes])
-        if test "${HAVE_XCB_AUX}" = "yes"; then
-         AC_DEFINE([USE_XCB], [1],
-[Define to 1 if you have the XCB library and X11-XCB library for mixed
- X11/XCB programming.])
-          XCB_LIBS="-lX11-xcb -lxcb -lxcb-aux"
-        fi
-      fi
+X11/XCB programming.])
+      XCB_LIBS="-lX11-xcb -lxcb"
     fi
   fi
 fi
diff --git a/src/frame.h b/src/frame.h
index d6fd62b2ac2..dcd32036b86 100644
--- a/src/frame.h
+++ b/src/frame.h
@@ -1718,7 +1718,6 @@ extern void x_wm_set_icon_position (struct frame *, int, 
int);
 #if !defined USE_X_TOOLKIT
 extern const char *x_get_resource_string (const char *, const char *);
 #endif
-extern void x_sync (struct frame *);
 #endif /* HAVE_X_WINDOWS */
 
 #if !defined (HAVE_NS) && !defined (HAVE_PGTK)
diff --git a/src/gtkutil.c b/src/gtkutil.c
index a6bba096a43..592bb497749 100644
--- a/src/gtkutil.c
+++ b/src/gtkutil.c
@@ -2103,7 +2103,7 @@ xg_frame_restack (struct frame *f1, struct frame *f2, 
bool above_flag)
 
       gdk_window_restack (gwin1, gwin2, above_flag);
 #ifndef HAVE_PGTK
-      x_sync (f1);
+      XSync (FRAME_X_DISPLAY (f1), False);
 #else
       gdk_flush ();
 #endif
@@ -4793,7 +4793,7 @@ xg_update_scrollbar_pos (struct frame *f,
          here to get some events.  */
 
 #ifndef HAVE_PGTK
-      x_sync (f);
+      XSync (FRAME_X_DISPLAY (f), False);
 #else
       gdk_flush ();
 #endif
@@ -4894,7 +4894,7 @@ xg_update_horizontal_scrollbar_pos (struct frame *f,
       }
 
 #ifndef HAVE_PGTK
-      x_sync (f);
+      XSync (FRAME_X_DISPLAY (f), False);
 #else
       gdk_flush ();
 #endif
diff --git a/src/xfns.c b/src/xfns.c
index df805d66db9..d713d3c378c 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -7377,20 +7377,6 @@ If TERMINAL is omitted or nil, that stands for the 
selected frame's display.  */
   return Qnil;
 }
 
-/* Wait for responses to all X commands issued so far for frame F.  */
-
-void
-x_sync (struct frame *f)
-{
-  block_input ();
-#ifndef USE_XCB
-  XSync (FRAME_X_DISPLAY (f), False);
-#else
-  xcb_aux_sync (FRAME_DISPLAY_INFO (f)->xcb_connection);
-#endif
-  unblock_input ();
-}
-
 
 /***********************************************************************
                            Window properties
diff --git a/src/xterm.c b/src/xterm.c
index d57830163cb..d3842810c3f 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -11005,6 +11005,31 @@ x_clear_frame (struct frame *f)
   unblock_input ();
 }
 
+/* Send a message to frame F telling the event loop to track whether
+   or not an hourglass is being displayed.  This is required to ignore
+   the right events when the hourglass is mapped without callig XSync
+   after displaying or hiding the hourglass.  */
+
+static void
+x_send_hourglass_message (struct frame *f, bool hourglass_enabled)
+{
+  struct x_display_info *dpyinfo;
+  XEvent msg;
+
+  dpyinfo = FRAME_DISPLAY_INFO (f);
+  memset (&msg, 0, sizeof msg);
+
+  msg.xclient.type = ClientMessage;
+  msg.xclient.message_type
+    = dpyinfo->Xatom_EMACS_TMP;
+  msg.xclient.format = 8;
+  msg.xclient.window = FRAME_X_WINDOW (f);
+  msg.xclient.data.b[0] = hourglass_enabled ? 1 : 0;
+
+  XSendEvent (dpyinfo->display, FRAME_X_WINDOW (f),
+             False, NoEventMask, &msg);
+}
+
 /* RIF: Show hourglass cursor on frame F.  */
 
 static void
@@ -11025,14 +11050,14 @@ x_show_hourglass (struct frame *f)
       if (popup_activated ())
        return;
 
+      x_send_hourglass_message (f, true);
+
 #ifdef USE_X_TOOLKIT
       if (x->widget)
 #else
       if (FRAME_OUTER_WINDOW (f))
 #endif
        {
-         x->hourglass_p = true;
-
          if (!x->hourglass_window)
            {
 #ifndef USE_XCB
@@ -11099,15 +11124,11 @@ x_hide_hourglass (struct frame *f)
     {
 #ifndef USE_XCB
       XUnmapWindow (FRAME_X_DISPLAY (f), x->hourglass_window);
-      /* Sync here because XTread_socket looks at the
-        hourglass_p flag that is reset to zero below.  */
-      XSync (FRAME_X_DISPLAY (f), False);
 #else
       xcb_unmap_window (FRAME_DISPLAY_INFO (f)->xcb_connection,
                        (xcb_window_t) x->hourglass_window);
-      xcb_aux_sync (FRAME_DISPLAY_INFO (f)->xcb_connection);
 #endif
-      x->hourglass_p = false;
+      x_send_hourglass_message (f, false);
     }
 }
 
@@ -18620,6 +18641,16 @@ handle_one_xevent (struct x_display_info *dpyinfo,
              }
          }
 
+       if (event->xclient.message_type == dpyinfo->Xatom_EMACS_TMP
+           && event->xclient.format == 8)
+         {
+           /* This is actually an hourglass message.  Set whether or
+              not events from here on have the hourglass enabled.  */
+
+           if (any)
+             FRAME_X_OUTPUT (any)->hourglass_p = event->xclient.data.b[0];
+         }
+
         if (event->xclient.message_type == dpyinfo->Xatom_wm_protocols
             && event->xclient.format == 32)
           {
@@ -28273,7 +28304,7 @@ x_make_frame_invisible (struct frame *f)
        error ("Can't notify window manager of window withdrawal");
       }
 
-  x_sync (f);
+  XSync (FRAME_X_DISPLAY (f), False);
 
   /* We can't distinguish this from iconification
      just by the event that we get from the server.



reply via email to

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