From b90192b50e59ff987ef2102c1538e94b7864b1fd Mon Sep 17 00:00:00 2001 From: Po Lu Date: Fri, 19 Aug 2022 10:06:29 +0800 Subject: [PATCH] Fix more calls to XQueryPointer for MPX * src/xterm.c (x_dnd_begin_drag_and_drop): Set DND devices to -1 if XI2 is not supported on the given display. (x_query_pointer): Make wrapper around x_query_pointer_1. (x_query_pointer_1): Split off most of x_query_pointer to this function. Allow a specific client pointer to be specified. (x_dnd_update_tooltip_now, x_dnd_update_state): Use x_query_pointer_1 with the right device instead of XQueryPointer. --- src/xterm.c | 77 +++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 60 insertions(+), 17 deletions(-) diff --git a/src/xterm.c b/src/xterm.c index a329ca59d0f..12c7b7d4dcc 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -12186,6 +12186,11 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time, Atom xaction, if (device) x_dnd_keyboard_device = device->attachment; } + else + { + x_dnd_pointer_device = -1; + x_dnd_keyboard_device = -1; + } #endif @@ -13401,18 +13406,17 @@ get_keysym_name (int keysym) return value; } -/* Like XQueryPointer, but always use the right client pointer - device. */ - -Bool -x_query_pointer (Display *dpy, Window w, Window *root_return, - Window *child_return, int *root_x_return, - int *root_y_return, int *win_x_return, - int *win_y_return, unsigned int *mask_return) +static Bool +x_query_pointer_1 (struct x_display_info *dpyinfo, + int client_pointer_device, Window w, + Window *root_return, Window *child_return, + int *root_x_return, int *root_y_return, + int *win_x_return, int *win_y_return, + unsigned int *mask_return) { Bool rc; + Display *dpy; #ifdef HAVE_XINPUT2 - struct x_display_info *dpyinfo; bool had_errors; XIModifierState modifiers; XIButtonState buttons; @@ -13421,9 +13425,10 @@ x_query_pointer (Display *dpy, Window w, Window *root_return, unsigned int state; #endif + dpy = dpyinfo->display; + #ifdef HAVE_XINPUT2 - dpyinfo = x_display_info_for_display (dpy); - if (dpyinfo && dpyinfo->client_pointer_device != -1) + if (client_pointer_device != -1) { /* Catch errors caused by the device going away. This is not very expensive, since XIQueryPointer will sync anyway. */ @@ -13463,6 +13468,31 @@ x_query_pointer (Display *dpy, Window w, Window *root_return, return rc; } +Bool +x_query_pointer (Display *dpy, Window w, Window *root_return, + Window *child_return, int *root_x_return, + int *root_y_return, int *win_x_return, + int *win_y_return, unsigned int *mask_return) +{ + struct x_display_info *dpyinfo; + + dpyinfo = x_display_info_for_display (dpy); + + if (!dpyinfo) + emacs_abort (); + +#ifdef HAVE_XINPUT2 + return x_query_pointer_1 (dpyinfo, dpyinfo->client_pointer_device, + w, root_return, child_return, root_x_return, + root_y_return, win_x_return, win_y_return, + mask_return); +#else + return x_query_pointer_1 (dpyinfo, -1, w, root_return, child_return, + root_x_return, root_y_return, win_x_return, + win_y_return, mask_return); +#endif +} + /* Mouse clicks and mouse movement. Rah. Formerly, we used PointerMotionHintMask (in standard_event_mask) @@ -16902,11 +16932,19 @@ x_dnd_update_tooltip_now (void) dpyinfo = FRAME_DISPLAY_INFO (x_dnd_frame); +#ifndef HAVE_XINPUT2 rc = XQueryPointer (dpyinfo->display, dpyinfo->root_window, &root, &child, &root_x, &root_y, &win_x, &win_y, &mask); +#else + rc = x_query_pointer_1 (dpyinfo, x_dnd_pointer_device, + dpyinfo->root_window, + &root, &child, &root_x, + &root_y, &win_x, &win_y, + &mask); +#endif if (rc) x_dnd_update_tooltip_position (root_x, root_y); @@ -16926,12 +16964,17 @@ x_dnd_update_state (struct x_display_info *dpyinfo, Time timestamp) xm_drop_start_message dsmsg; bool was_frame; - if (XQueryPointer (dpyinfo->display, - dpyinfo->root_window, - &dummy, &dummy_child, - &root_x, &root_y, - &dummy_x, &dummy_y, - &dummy_mask)) + if (x_query_pointer_1 (dpyinfo, +#ifdef HAVE_XINPUT2 + x_dnd_pointer_device, +#else + -1, +#endif + dpyinfo->root_window, + &dummy, &dummy_child, + &root_x, &root_y, + &dummy_x, &dummy_y, + &dummy_mask)) { target = x_dnd_get_target_window (dpyinfo, root_x, root_y, &target_proto, -- 2.39.2