emacs-diffs
[Top][All Lists]
Advanced

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

master a01bd1a208: Reduce duplicate code for creating "special windows"


From: Po Lu
Subject: master a01bd1a208: Reduce duplicate code for creating "special windows"
Date: Sun, 23 Oct 2022 02:13:31 -0400 (EDT)

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

    Reduce duplicate code for creating "special windows"
    
    * src/xterm.c (x_create_special_window): Define on all non-GTK
    builds and all builds with XFixes.
    (x_update_frame_user_time_window): Use x_create_special_window.
    Also write a comment explaining what user time windows are.
    * src/xterm.h: Fix style of `x_parse_color' prototype.
---
 src/xterm.c | 58 +++++++++++++++++++++++++++++++---------------------------
 src/xterm.h |  3 +--
 2 files changed, 32 insertions(+), 29 deletions(-)

diff --git a/src/xterm.c b/src/xterm.c
index fecfc50ab5..06c84e2b53 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -7735,6 +7735,28 @@ x_set_gtk_user_time (struct frame *f, Time time)
 
 #endif
 
+#if !defined USE_GTK || defined HAVE_XFIXES
+
+/* Create and return a special window for receiving events such as
+   selection notify events, and reporting user time.  The window is an
+   1x1 unmapped override-redirect InputOnly window at -1, -1 relative
+   to the parent, which should prevent it from doing anything.  */
+
+static Window
+x_create_special_window (struct x_display_info *dpyinfo,
+                        Window parent_window)
+{
+  XSetWindowAttributes attrs;
+
+  attrs.override_redirect = True;
+
+  return XCreateWindow (dpyinfo->display, parent_window,
+                       -1, -1, 1, 1, 0, CopyFromParent, InputOnly,
+                       CopyFromParent, CWOverrideRedirect, &attrs);
+}
+
+#endif
+
 /* Not needed on GTK because GTK handles reporting the user time
    itself.  */
 
@@ -7745,7 +7767,6 @@ x_update_frame_user_time_window (struct frame *f)
 {
   struct x_output *output;
   struct x_display_info *dpyinfo;
-  XSetWindowAttributes attrs;
 
   output = FRAME_X_OUTPUT (f);
   dpyinfo = FRAME_DISPLAY_INFO (f);
@@ -7787,12 +7808,16 @@ x_update_frame_user_time_window (struct frame *f)
       if (output->user_time_window == FRAME_OUTER_WINDOW (f)
          || output->user_time_window == None)
        {
-         memset (&attrs, 0, sizeof attrs);
+         /* Create a "user time" window that is used to report user
+            activity on a given frame.  This is used in preference to
+            _NET_WM_USER_TIME, as using a separate window allows the
+            window manager to express interest in other properties
+            while only reading the user time when necessary, thereby
+            improving battery life by not involving the window
+            manager in each key press.  */
 
          output->user_time_window
-           = XCreateWindow (dpyinfo->display, FRAME_X_WINDOW (f),
-                            -1, -1, 1, 1, 0, 0, InputOnly,
-                            CopyFromParent, 0, &attrs);
+           = x_create_special_window (dpyinfo, FRAME_X_WINDOW (f));
 
          XDeleteProperty (dpyinfo->display, FRAME_OUTER_WINDOW (f),
                           dpyinfo->Xatom_net_wm_user_time);
@@ -28802,27 +28827,6 @@ xi_check_toolkit (Display *display)
 
 #endif
 
-#ifdef HAVE_XFIXES
-
-/* Create and return a special window for receiving events such as
-   selection notify events.  The window is an 1x1 unmapped
-   override-redirect InputOnly window at -1, -1, which should prevent
-   it from doing anything.  */
-
-static Window
-x_create_special_window (struct x_display_info *dpyinfo)
-{
-  XSetWindowAttributes attrs;
-
-  attrs.override_redirect = True;
-
-  return XCreateWindow (dpyinfo->display, dpyinfo->root_window,
-                       -1, -1, 1, 1, 0, CopyFromParent, InputOnly,
-                       CopyFromParent, CWOverrideRedirect, &attrs);
-}
-
-#endif
-
 /* Open a connection to X display DISPLAY_NAME, and return the
    structure that describes the open display.  If obtaining the XCB
    connection or toolkit-specific display fails, return NULL.  Signal
@@ -29838,7 +29842,7 @@ x_term_init (Lisp_Object display_name, char 
*xrm_option, char *resource_name)
 
       dpyinfo->n_monitored_selections = num_fast_selections;
       dpyinfo->selection_tracking_window
-       = x_create_special_window (dpyinfo);
+       = x_create_special_window (dpyinfo, dpyinfo->root_window);
       dpyinfo->monitored_selections
        = xmalloc (num_fast_selections
                   * sizeof *dpyinfo->monitored_selections);
diff --git a/src/xterm.h b/src/xterm.h
index 0f00dc42f7..2967d105ea 100644
--- a/src/xterm.h
+++ b/src/xterm.h
@@ -295,8 +295,7 @@ struct xi_device_t
 };
 #endif
 
-Status x_parse_color (struct frame *f, const char *color_name,
-                     XColor *color);
+extern Status x_parse_color (struct frame *, const char *, XColor *);
 
 struct x_failable_request
 {



reply via email to

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