emacs-diffs
[Top][All Lists]
Advanced

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

master 9ff88dfc5b: Implement _NET_WM_PING protocol


From: Po Lu
Subject: master 9ff88dfc5b: Implement _NET_WM_PING protocol
Date: Fri, 4 Feb 2022 20:42:58 -0500 (EST)

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

    Implement _NET_WM_PING protocol
    
    * src/xfns.c (append_wm_protocols): New function.
    (x_window): Call `append_wm_protocols' after window creation.
    * src/xterm.c (handle_one_xevent): Handle _NET_WM_PING client
    messages.
    (x_term_init): Intern _NET_WM_PING atom.
    * src/xterm.h (struct x_display_info): New field
    `Xatom_net_wm_ping'.
---
 src/xfns.c  | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/xterm.c | 16 ++++++++++++++++
 src/xterm.h |  2 +-
 3 files changed, 70 insertions(+), 1 deletion(-)

diff --git a/src/xfns.c b/src/xfns.c
index 4b10f5035a..9bbefd79a0 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -2355,6 +2355,55 @@ hack_wm_protocols (struct frame *f, Widget widget)
 }
 #endif
 
+static void
+append_wm_protocols (struct x_display_info *dpyinfo,
+                    struct frame *f)
+{
+  unsigned char *existing = NULL;
+  int format = 0;
+  unsigned long nitems = 0;
+  Atom type;
+  Atom *existing_protocols;
+  Atom protos[10];
+  int num_protos = 0;
+  bool found_wm_ping = false;
+  unsigned long bytes_after;
+
+  block_input ();
+  if ((XGetWindowProperty (dpyinfo->display, FRAME_OUTER_WINDOW (f),
+                          dpyinfo->Xatom_wm_protocols,
+                          0, 100, False, XA_ATOM, &type, &format, &nitems,
+                          &bytes_after, &existing) == Success)
+      && format == 32 && type == XA_ATOM)
+    {
+      existing_protocols = (Atom *) existing;
+
+      while (nitems)
+       {
+         nitems--;
+
+         if (existing_protocols[nitems]
+             == dpyinfo->Xatom_net_wm_ping)
+           found_wm_ping = true;
+       }
+    }
+
+  if (existing)
+    XFree (existing);
+
+  if (!found_wm_ping)
+    protos[num_protos++] = dpyinfo->Xatom_net_wm_ping;
+
+  if (num_protos)
+    XChangeProperty (dpyinfo->display,
+                    FRAME_OUTER_WINDOW (f),
+                    dpyinfo->Xatom_wm_protocols,
+                    XA_ATOM, 32, PropModeAppend,
+                    (unsigned char *) protos,
+                    num_protos);
+  unblock_input ();
+}
+
 
 
 /* Support routines for XIC (X Input Context).  */
@@ -3630,6 +3679,7 @@ x_window (struct frame *f, long window_prompting)
               &f->output_data.x->wm_hints);
 
   hack_wm_protocols (f, shell_widget);
+  append_wm_protocols (FRAME_DISPLAY_INFO (f), f);
 
 #ifdef X_TOOLKIT_EDITRES
   XtAddEventHandler (shell_widget, 0, True, _XEditResCheckMessages, 0);
@@ -3750,6 +3800,8 @@ x_window (struct frame *f)
   }
 #endif
 
+  append_wm_protocols (FRAME_DISPLAY_INFO (f), f);
+
 #ifdef HAVE_XINPUT2
   if (FRAME_DISPLAY_INFO (f)->supports_xi2)
     setup_xi_event_mask (f);
@@ -3790,6 +3842,7 @@ x_window (struct frame *f)
                     FRAME_X_VISUAL (f),
                      attribute_mask, &attributes);
   initial_set_up_x_back_buffer (f);
+  append_wm_protocols (FRAME_DISPLAY_INFO (f), f);
 
 #ifdef HAVE_X_I18N
   if (use_xim)
diff --git a/src/xterm.c b/src/xterm.c
index deaa5b5961..34a85aa745 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -9071,6 +9071,21 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                goto done;
               }
 
+
+           if (event->xclient.data.l[0] == dpyinfo->Xatom_net_wm_ping
+               && event->xclient.format == 32)
+             {
+               XEvent send_event = *event;
+
+               send_event.xclient.window = dpyinfo->root_window;
+               XSendEvent (dpyinfo->display, dpyinfo->root_window, False,
+                           SubstructureRedirectMask | SubstructureNotifyMask,
+                           &send_event);
+
+               *finish = X_EVENT_DROP;
+               goto done;
+             }
+
            goto done;
           }
 
@@ -15914,6 +15929,7 @@ x_term_init (Lisp_Object display_name, char 
*xrm_option, char *resource_name)
       ATOM_REFS_INIT ("_NET_WM_STATE_ABOVE", Xatom_net_wm_state_above)
       ATOM_REFS_INIT ("_NET_WM_STATE_BELOW", Xatom_net_wm_state_below)
       ATOM_REFS_INIT ("_NET_WM_OPAQUE_REGION", Xatom_net_wm_opaque_region)
+      ATOM_REFS_INIT ("_NET_WM_PING", Xatom_net_wm_ping)
 #ifdef HAVE_XKB
       ATOM_REFS_INIT ("Meta", Xatom_Meta)
       ATOM_REFS_INIT ("Super", Xatom_Super)
diff --git a/src/xterm.h b/src/xterm.h
index 02270d6936..99d339e1f9 100644
--- a/src/xterm.h
+++ b/src/xterm.h
@@ -498,7 +498,7 @@ struct x_display_info
     Xatom_net_wm_state_sticky, Xatom_net_wm_state_above, 
Xatom_net_wm_state_below,
     Xatom_net_wm_state_hidden, Xatom_net_wm_state_skip_taskbar,
     Xatom_net_frame_extents, Xatom_net_current_desktop, Xatom_net_workarea,
-    Xatom_net_wm_opaque_region;
+    Xatom_net_wm_opaque_region, Xatom_net_wm_ping;
 
   /* XSettings atoms and windows.  */
   Atom Xatom_xsettings_sel, Xatom_xsettings_prop, Xatom_xsettings_mgr;



reply via email to

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