From: Po Lu Date: Wed, 4 May 2022 00:40:12 +0000 (+0800) Subject: Fix event mask and source indication of _NET_WM_STATE messages X-Git-Tag: emacs-29.0.90~1931^2~87 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=a1dc1512b357e99e78c6f01a20e483f465de0738;p=emacs.git 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. --- diff --git a/src/xselect.c b/src/xselect.c index 6d167c0b6f8..3acfcbe94b0 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 90182a89f1f..01832d60c9e 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 80b57137981..74e6d1a96cb 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 *,