emacs-diffs
[Top][All Lists]
Advanced

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

master 5404bf50ad: Port hourglass display to XCB


From: Po Lu
Subject: master 5404bf50ad: Port hourglass display to XCB
Date: Wed, 19 Jan 2022 22:28:29 -0500 (EST)

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

    Port hourglass display to XCB
    
    * src/xterm.c (x_show_hourglass):
    (x_hide_hourglass): Use straightforward translations to XCB if
    available.
---
 src/xterm.c | 40 +++++++++++++++++++++++++++++++++++++++-
 1 file changed, 39 insertions(+), 1 deletion(-)

diff --git a/src/xterm.c b/src/xterm.c
index 7a63d9353a..5adbf210be 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -101,6 +101,8 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 
 #ifdef USE_XCB
 #include <xcb/xproto.h>
+#include <xcb/xcb.h>
+#include <xcb/xcb_aux.h>
 #endif
 
 /* If we have Xfixes extension, use it for pointer blanking.  */
@@ -4547,6 +4549,7 @@ x_show_hourglass (struct frame *f)
 
          if (!x->hourglass_window)
            {
+#ifndef USE_XCB
             unsigned long mask = CWCursor;
             XSetWindowAttributes attrs;
 #ifdef USE_GTK
@@ -4559,12 +4562,41 @@ x_show_hourglass (struct frame *f)
              x->hourglass_window = XCreateWindow
                (dpy, parent, 0, 0, 32000, 32000, 0, 0,
                 InputOnly, CopyFromParent, mask, &attrs);
+#else
+            uint32_t cursor = (uint32_t) x->hourglass_cursor;
+#ifdef USE_GTK
+             xcb_window_t parent = (xcb_window_t) FRAME_X_WINDOW (f);
+#else
+             xcb_window_t parent = (xcb_window_t) FRAME_OUTER_WINDOW (f);
+#endif
+            x->hourglass_window
+              = (Window) xcb_generate_id (FRAME_DISPLAY_INFO 
(f)->xcb_connection);
+
+            xcb_create_window (FRAME_DISPLAY_INFO (f)->xcb_connection,
+                               XCB_COPY_FROM_PARENT,
+                               (xcb_window_t) x->hourglass_window,
+                               parent, 0, 0, FRAME_PIXEL_WIDTH (f),
+                               FRAME_PIXEL_HEIGHT (f), 0,
+                               XCB_WINDOW_CLASS_INPUT_OUTPUT,
+                               XCB_COPY_FROM_PARENT, XCB_CW_CURSOR,
+                               &cursor);
+#endif
            }
 
+#ifndef USE_XCB
          XMapRaised (dpy, x->hourglass_window);
-         XFlush (dpy);
         /* Ensure that the spinning hourglass is shown.  */
         flush_frame (f);
+#else
+        uint32_t value = XCB_STACK_MODE_ABOVE;
+
+        xcb_configure_window (FRAME_DISPLAY_INFO (f)->xcb_connection,
+                              (xcb_window_t) x->hourglass_window,
+                              XCB_CONFIG_WINDOW_STACK_MODE, &value);
+        xcb_map_window (FRAME_DISPLAY_INFO (f)->xcb_connection,
+                        (xcb_window_t) x->hourglass_window);
+        xcb_flush (FRAME_DISPLAY_INFO (f)->xcb_connection);
+#endif
        }
     }
 }
@@ -4579,10 +4611,16 @@ x_hide_hourglass (struct frame *f)
   /* Watch out for newly created frames.  */
   if (x->hourglass_window)
     {
+#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;
     }
 }



reply via email to

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