]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix event mask and source indication of _NET_WM_STATE messages
authorPo Lu <luangruo@yahoo.com>
Wed, 4 May 2022 00:40:12 +0000 (08:40 +0800)
committerPo Lu <luangruo@yahoo.com>
Wed, 4 May 2022 00:40:12 +0000 (08:40 +0800)
* 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
src/xterm.c
src/xterm.h

index 6d167c0b6f84451b027d3c16329e29bda6db26f9..3acfcbe94b03f3883ea456629506076bc1b751b3 100644 (file)
@@ -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)
 {
index 90182a89f1fb275c05ce8a5f806da047156752b0..01832d60c9ee604e86c824d0c35345ef7cdefedb 100644 (file)
@@ -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
index 80b571379813bf2af04db1c81663a1df826b2f8d..74e6d1a96cb23539e79c945dab908234d578e64c 100644 (file)
@@ -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 *,