emacs-diffs
[Top][All Lists]
Advanced

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

master 7f425613a7: Add support for _NET_WM_USER_TIME_WINDOW


From: Po Lu
Subject: master 7f425613a7: Add support for _NET_WM_USER_TIME_WINDOW
Date: Wed, 9 Feb 2022 05:49:37 -0500 (EST)

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

    Add support for _NET_WM_USER_TIME_WINDOW
    
    * src/xterm.c (x_make_frame_visible):
    (x_display_set_last_user_time): Use and set user time window if
    the WM supports it.
    (x_term_init): Intern new atom.
    
    * src/xterm.h (struct x_display_info): New atom
    `_NET_WM_USER_TIME_WINDOW'.
    (struct x_output): New field `user_time_window'.
---
 src/xterm.c | 51 ++++++++++++++++++++++++++++++++++++++++++++-------
 src/xterm.h |  8 +++++++-
 2 files changed, 51 insertions(+), 8 deletions(-)

diff --git a/src/xterm.c b/src/xterm.c
index 38b50bcd3b..e6d7d5d133 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -2220,24 +2220,29 @@ static void x_check_font (struct frame *, struct font 
*);
 void
 x_display_set_last_user_time (struct x_display_info *dpyinfo, Time time)
 {
+#ifndef USE_GTK
   struct frame *focus_frame = dpyinfo->x_focus_frame;
+#endif
 
 #ifdef ENABLE_CHECKING
   eassert (t <= X_ULONG_MAX);
 #endif
   dpyinfo->last_user_time = time;
 
+#ifndef USE_GTK
   if (focus_frame)
     {
       while (FRAME_PARENT_FRAME (focus_frame))
        focus_frame = FRAME_PARENT_FRAME (focus_frame);
 
-      XChangeProperty (dpyinfo->display,
-                      FRAME_OUTER_WINDOW (dpyinfo->x_focus_frame),
-                      dpyinfo->Xatom_net_wm_user_time,
-                      XA_CARDINAL, 32, PropModeReplace,
-                      (unsigned char *) &time, 1);
+      if (FRAME_X_OUTPUT (focus_frame)->user_time_window != None)
+       XChangeProperty (dpyinfo->display,
+                        FRAME_X_OUTPUT (focus_frame)->user_time_window,
+                        dpyinfo->Xatom_net_wm_user_time,
+                        XA_CARDINAL, 32, PropModeReplace,
+                        (unsigned char *) &time, 1);
     }
+#endif
 }
 
 
@@ -14481,6 +14486,9 @@ void
 x_make_frame_visible (struct frame *f)
 {
   struct x_display_info *dpyinfo;
+#ifndef USE_GTK
+  struct x_output *output;
+#endif
 
   if (FRAME_PARENT_FRAME (f))
     {
@@ -14518,16 +14526,44 @@ x_make_frame_visible (struct frame *f)
          && ! f->output_data.x->asked_for_visible)
        x_set_offset (f, f->left_pos, f->top_pos, 0);
 
+#ifndef USE_GTK
+      output = FRAME_X_OUTPUT (f);
+
+      if (output->user_time_window == None)
+       {
+         XSetWindowAttributes attrs;
+         memset (&attrs, 0, sizeof attrs);
+
+         output->user_time_window
+           = FRAME_OUTER_WINDOW (f);
+
+         if (x_wm_supports (f, dpyinfo->Xatom_net_wm_user_time_window))
+           {
+             output->user_time_window
+               = XCreateWindow (dpyinfo->display, FRAME_X_WINDOW (f),
+                                -1, -1, 1, 1, 0, 0, InputOnly,
+                                CopyFromParent, 0, &attrs);
+
+             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);
+           }
+       }
+
       if (dpyinfo->last_user_time)
        XChangeProperty (dpyinfo->display,
-                        FRAME_OUTER_WINDOW (f),
+                        output->user_time_window,
                         dpyinfo->Xatom_net_wm_user_time,
                         XA_CARDINAL, 32, PropModeReplace,
                         (unsigned char *) &dpyinfo->last_user_time, 1);
       else
        XDeleteProperty (dpyinfo->display,
-                        FRAME_OUTER_WINDOW (f),
+                        output->user_time_window,
                         dpyinfo->Xatom_net_wm_user_time);
+#endif
 
       f->output_data.x->asked_for_visible = true;
 
@@ -16133,6 +16169,7 @@ x_term_init (Lisp_Object display_name, char 
*xrm_option, char *resource_name)
       ATOM_REFS_INIT ("_NET_WM_SYNC_REQUEST_COUNTER", 
Xatom_net_wm_sync_request_counter)
       ATOM_REFS_INIT ("_NET_WM_FRAME_DRAWN", Xatom_net_wm_frame_drawn)
       ATOM_REFS_INIT ("_NET_WM_USER_TIME", Xatom_net_wm_user_time)
+      ATOM_REFS_INIT ("_NET_WM_USER_TIME_WINDOW", 
Xatom_net_wm_user_time_window)
       /* Session management */
       ATOM_REFS_INIT ("SM_CLIENT_ID", Xatom_SM_CLIENT_ID)
       ATOM_REFS_INIT ("_XSETTINGS_SETTINGS", Xatom_xsettings_prop)
diff --git a/src/xterm.h b/src/xterm.h
index 9aa7021c4d..afd6a1757c 100644
--- a/src/xterm.h
+++ b/src/xterm.h
@@ -506,7 +506,7 @@ struct x_display_info
     Xatom_net_frame_extents, Xatom_net_current_desktop, Xatom_net_workarea,
     Xatom_net_wm_opaque_region, Xatom_net_wm_ping, Xatom_net_wm_sync_request,
     Xatom_net_wm_sync_request_counter, Xatom_net_wm_frame_drawn,
-    Xatom_net_wm_user_time;
+    Xatom_net_wm_user_time, Xatom_net_wm_user_time_window;
 
   /* XSettings atoms and windows.  */
   Atom Xatom_xsettings_sel, Xatom_xsettings_prop, Xatom_xsettings_mgr;
@@ -677,6 +677,12 @@ struct x_output
   Widget menubar_widget;
 #endif
 
+#ifndef USE_GTK
+  /* A window used to store the user time property.  May be None or
+     the frame's outer window.  */
+  Window user_time_window;
+#endif
+
 #ifdef USE_GTK
   /* The widget of this screen.  This is the window of a top widget.  */
   GtkWidget *widget;



reply via email to

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