emacs-diffs
[Top][All Lists]
Advanced

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

master a8cf6567dd: Improve window manager user time reporting mode switc


From: Po Lu
Subject: master a8cf6567dd: Improve window manager user time reporting mode switching
Date: Thu, 16 Jun 2022 22:57:53 -0400 (EDT)

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

    Improve window manager user time reporting mode switching
    
    * src/xterm.c (x_display_set_last_user_time): Stop periodically
    checking for user time window support.
    (x_update_frame_user_time_window): New function.
    (handle_one_xevent): Call it on toplevel ReparentNotify if the
    frame has been visible at least once.
    
    * src/xterm.h (struct x_display_info): Remove
    `last_user_check_time'.
---
 src/xterm.c | 126 +++++++++++++++++++++++++++++++++---------------------------
 src/xterm.h |   5 +--
 2 files changed, 72 insertions(+), 59 deletions(-)

diff --git a/src/xterm.c b/src/xterm.c
index 96fe75f41e..e26cd58679 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -6915,7 +6915,6 @@ x_display_set_last_user_time (struct x_display_info 
*dpyinfo, Time time)
 {
 #ifndef USE_GTK
   struct frame *focus_frame = dpyinfo->x_focus_frame;
-  struct x_output *output;
 #endif
 
 #ifdef ENABLE_CHECKING
@@ -6925,56 +6924,6 @@ x_display_set_last_user_time (struct x_display_info 
*dpyinfo, Time time)
   dpyinfo->last_user_time = time;
 
 #ifndef USE_GTK
-  if (focus_frame
-      && (dpyinfo->last_user_time
-         > (dpyinfo->last_user_check_time + 2000)))
-    {
-      output = FRAME_X_OUTPUT (focus_frame);
-
-      if (!x_wm_supports (focus_frame,
-                         dpyinfo->Xatom_net_wm_user_time_window))
-       {
-         if (output->user_time_window == None)
-           output->user_time_window = FRAME_OUTER_WINDOW (focus_frame);
-         else if (output->user_time_window != FRAME_OUTER_WINDOW (focus_frame))
-           {
-             XDestroyWindow (dpyinfo->display,
-                             output->user_time_window);
-             XDeleteProperty (dpyinfo->display,
-                              FRAME_OUTER_WINDOW (focus_frame),
-                              dpyinfo->Xatom_net_wm_user_time_window);
-             output->user_time_window = FRAME_OUTER_WINDOW (focus_frame);
-           }
-       }
-      else
-       {
-         if (output->user_time_window == FRAME_OUTER_WINDOW (focus_frame)
-             || output->user_time_window == None)
-           {
-             XSetWindowAttributes attrs;
-             memset (&attrs, 0, sizeof attrs);
-
-             output->user_time_window
-               = XCreateWindow (dpyinfo->display,
-                                FRAME_X_WINDOW (focus_frame),
-                                -1, -1, 1, 1, 0, 0, InputOnly,
-                                CopyFromParent, 0, &attrs);
-
-             XDeleteProperty (dpyinfo->display,
-                              FRAME_OUTER_WINDOW (focus_frame),
-                              dpyinfo->Xatom_net_wm_user_time);
-             XChangeProperty (dpyinfo->display,
-                              FRAME_OUTER_WINDOW (focus_frame),
-                              dpyinfo->Xatom_net_wm_user_time_window,
-                              XA_WINDOW, 32, PropModeReplace,
-                              (unsigned char *) &output->user_time_window,
-                              1);
-           }
-       }
-
-      dpyinfo->last_user_check_time = time;
-    }
-
   if (focus_frame)
     {
       while (FRAME_PARENT_FRAME (focus_frame))
@@ -6990,6 +6939,57 @@ x_display_set_last_user_time (struct x_display_info 
*dpyinfo, Time time)
 #endif
 }
 
+/* Not needed on GTK because GTK handles reporting the user time
+   itself.  */
+
+#ifndef USE_GTK
+static void
+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);
+
+  if (!x_wm_supports (f, dpyinfo->Xatom_net_wm_user_time_window))
+    {
+      if (output->user_time_window == None)
+       output->user_time_window = FRAME_OUTER_WINDOW (f);
+      else if (output->user_time_window != FRAME_OUTER_WINDOW (f))
+       {
+         XDestroyWindow (dpyinfo->display,
+                         output->user_time_window);
+         XDeleteProperty (dpyinfo->display,
+                          FRAME_OUTER_WINDOW (f),
+                          dpyinfo->Xatom_net_wm_user_time_window);
+         output->user_time_window = FRAME_OUTER_WINDOW (f);
+       }
+    }
+  else
+    {
+      if (output->user_time_window == FRAME_OUTER_WINDOW (f)
+         || output->user_time_window == None)
+       {
+         memset (&attrs, 0, sizeof attrs);
+
+         output->user_time_window
+           = XCreateWindow (dpyinfo->display, FRAME_X_WINDOW (f),
+                            -1, -1, 1, 1, 0, 0, InputOnly,
+                            CopyFromParent, 0, &attrs);
+
+         XDeleteProperty (dpyinfo->display, FRAME_OUTER_WINDOW (f),
+                          dpyinfo->Xatom_net_wm_user_time);
+         XChangeProperty (dpyinfo->display, FRAME_OUTER_WINDOW (f),
+                          dpyinfo->Xatom_net_wm_user_time_window,
+                          XA_WINDOW, 32, PropModeReplace,
+                          (unsigned char *) &output->user_time_window, 1);
+       }
+    }
+}
+#endif
+
 void
 x_set_last_user_time_from_lisp (struct x_display_info *dpyinfo,
                                Time time)
@@ -16914,8 +16914,26 @@ handle_one_xevent (struct x_display_info *dpyinfo,
         {
          /* Maybe we shouldn't set this for child frames ??  */
          f->output_data.x->parent_desc = event->xreparent.parent;
+
          if (!FRAME_PARENT_FRAME (f))
-           x_real_positions (f, &f->left_pos, &f->top_pos);
+           {
+             x_real_positions (f, &f->left_pos, &f->top_pos);
+
+             /* Perhaps reparented due to a WM restart.  Reset this.  */
+             FRAME_DISPLAY_INFO (f)->wm_type = X_WMTYPE_UNKNOWN;
+             FRAME_DISPLAY_INFO (f)->net_supported_window = 0;
+
+#ifndef USE_GTK
+             /* The window manager could have restarted and the new
+                window manager might not support user time windows,
+                so update what is used accordingly.
+
+                Note that this doesn't handle changes between
+                non-reparenting window managers.  */
+             if (FRAME_X_OUTPUT (f)->has_been_visible)
+               x_update_frame_user_time_window (f);
+#endif
+           }
          else
            {
              Window root;
@@ -16928,10 +16946,6 @@ handle_one_xevent (struct x_display_info *dpyinfo,
              unblock_input ();
            }
 
-          /* Perhaps reparented due to a WM restart.  Reset this.  */
-          FRAME_DISPLAY_INFO (f)->wm_type = X_WMTYPE_UNKNOWN;
-          FRAME_DISPLAY_INFO (f)->net_supported_window = 0;
-
           x_set_frame_alpha (f);
         }
       goto OTHER;
diff --git a/src/xterm.h b/src/xterm.h
index 17402f962c..3ef523d782 100644
--- a/src/xterm.h
+++ b/src/xterm.h
@@ -495,9 +495,8 @@ struct x_display_info
   struct scroll_bar *last_mouse_scroll_bar;
 
   /* Time of last user interaction as returned in X events on this
-     display, and time where WM support for `_NET_WM_USER_TIME_WINDOW'
-     was last checked.  */
-  Time last_user_time, last_user_check_time;
+     display.  */
+  Time last_user_time;
 
   /* Position where the mouse was last time we reported a motion.
      This is a position on last_mouse_motion_frame.  */



reply via email to

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