emacs-diffs
[Top][All Lists]
Advanced

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

master a1dc1512b3: Fix event mask and source indication of _NET_WM_STATE


From: Po Lu
Subject: master a1dc1512b3: Fix event mask and source indication of _NET_WM_STATE messages
Date: Tue, 3 May 2022 20:40:30 -0400 (EDT)

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

    Fix event mask and source indication of _NET_WM_STATE messages
    
    * src/xselect.c (x_send_client_event): Make static.
    * src/xterm.c (set_wm_state): Send event with correct mask and
    source indication set.
    * src/xterm.h: Update prototypes.
---
 src/xselect.c |  4 +++-
 src/xterm.c   | 33 ++++++++++++++++++++-------------
 src/xterm.h   |  7 -------
 3 files changed, 23 insertions(+), 21 deletions(-)

diff --git a/src/xselect.c b/src/xselect.c
index 6d167c0b6f..3acfcbe94b 100644
--- a/src/xselect.c
+++ b/src/xselect.c
@@ -60,6 +60,8 @@ static Lisp_Object selection_data_to_lisp_data (struct 
x_display_info *,
                                                ptrdiff_t, Atom, int);
 static void lisp_data_to_selection_data (struct x_display_info *, Lisp_Object,
                                         struct selection_data *);
+static void x_send_client_event (Lisp_Object, Lisp_Object, Lisp_Object,
+                                Atom, Lisp_Object, Lisp_Object);
 
 /* Printing traces to stderr.  */
 
@@ -2612,7 +2614,7 @@ are ignored.  */)
   return Qnil;
 }
 
-void
+static void
 x_send_client_event (Lisp_Object display, Lisp_Object dest, Lisp_Object from,
                      Atom message_type, Lisp_Object format, Lisp_Object values)
 {
diff --git a/src/xterm.c b/src/xterm.c
index 90182a89f1..01832d60c9 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -21071,19 +21071,26 @@ x_wm_supports (struct frame *f, Atom want_atom)
 static void
 set_wm_state (Lisp_Object frame, bool add, Atom atom, Atom value)
 {
-  struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (XFRAME (frame));
-
-  x_send_client_event (frame, make_fixnum (0), frame,
-                       dpyinfo->Xatom_net_wm_state,
-                       make_fixnum (32),
-                       /* 1 = add, 0 = remove */
-                       Fcons
-                       (make_fixnum (add),
-                        Fcons
-                        (INT_TO_INTEGER (atom),
-                         (value != 0
-                         ? list1 (INT_TO_INTEGER (value))
-                         : Qnil))));
+  struct x_display_info *dpyinfo;
+  XEvent msg;
+
+  dpyinfo = FRAME_DISPLAY_INFO (XFRAME (frame));
+  msg.xclient.type = ClientMessage;
+  msg.xclient.window = FRAME_OUTER_WINDOW (XFRAME (frame));
+  msg.xclient.message_type = dpyinfo->Xatom_net_wm_state;
+  msg.xclient.format = 32;
+
+  msg.xclient.data.l[0] = add ? 1 : 0;
+  msg.xclient.data.l[1] = atom;
+  msg.xclient.data.l[2] = value;
+  msg.xclient.data.l[3] = 1; /* Source indication.  */
+  msg.xclient.data.l[4] = 0;
+
+  block_input ();
+  XSendEvent (dpyinfo->display, dpyinfo->root_window,
+             False, (SubstructureRedirectMask
+                     | SubstructureNotifyMask), &msg);
+  unblock_input ();
 }
 
 void
diff --git a/src/xterm.h b/src/xterm.h
index 80b5713798..74e6d1a96c 100644
--- a/src/xterm.h
+++ b/src/xterm.h
@@ -1495,13 +1495,6 @@ extern void x_handle_selection_notify (const 
XSelectionEvent *);
 extern void x_handle_selection_event (struct selection_input_event *);
 extern void x_clear_frame_selections (struct frame *);
 
-extern void x_send_client_event (Lisp_Object display,
-                                 Lisp_Object dest,
-                                 Lisp_Object from,
-                                 Atom message_type,
-                                 Lisp_Object format,
-                                 Lisp_Object values);
-
 extern bool x_handle_dnd_message (struct frame *,
                                  const XClientMessageEvent *,
                                  struct x_display_info *,



reply via email to

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