Skip to content

Commit ab64105

Browse files
Added multi pointer support (#2168)
- Propagate correct master pointer id though code in case multiple slave pointers are being used to generate events (e.g. touch screen). - Use `XIQueryPointer` in `query_x11_window_at_pos` when `BUILD_XINPUT` is enabled to correctly handle multiple pointer devices.
1 parent 97b4ec7 commit ab64105

File tree

5 files changed

+32
-6
lines changed

5 files changed

+32
-6
lines changed

src/mouse-events.cc

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,8 +233,17 @@ device_info *device_info::from_xi_id(xi_device_id device_id, Display *display) {
233233
XIDeviceInfo *device = XIQueryDevice(display, device_id, &num_devices);
234234
if (num_devices == 0) return nullptr;
235235

236+
int master;
237+
238+
if(device->use == XIMasterPointer){
239+
master = device->deviceid;
240+
}
241+
else{
242+
master = device->attachment;
243+
}
244+
236245
device_info info =
237-
device_info{.id = device_id, .name = std::string(device->name)};
246+
device_info{device_id, master, std::string(device->name)};
238247

239248
size_t id = last_device_id++;
240249
info.init_xi_device(display, device);

src/mouse-events.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,7 @@ struct conky_valuator_info {
282282
struct device_info {
283283
/// @brief Device name.
284284
xi_device_id id;
285+
xi_device_id master;
285286
std::string name;
286287
std::array<conky_valuator_info, VALUATOR_COUNT> valuators{};
287288

src/output/display-x11.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,7 @@ bool handle_event<x_event_handler::MOUSE_INPUT>(
453453
}
454454
*cookie = data;
455455

456-
Window event_window = query_x11_window_at_pos(display, data->pos_absolute);
456+
Window event_window = query_x11_window_at_pos(display, data->pos_absolute, data->device->master);
457457

458458
bool same_window = query_x11_top_parent(display, event_window) ==
459459
query_x11_top_parent(display, window.window);

src/output/x11.cc

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1498,17 +1498,32 @@ std::vector<Window> query_x11_windows(Display *display, bool eager) {
14981498
return result;
14991499
}
15001500

1501-
Window query_x11_window_at_pos(Display *display, conky::vec2i pos) {
1501+
Window query_x11_window_at_pos(Display *display, conky::vec2i pos, int device_id) {
1502+
(void) device_id;
15021503
Window root = DefaultVRootWindow(display);
15031504

1504-
// these values are ignored but NULL can't be passed to XQueryPointer.
1505+
15051506
Window root_return;
1507+
Window last = None;
1508+
1509+
#ifdef BUILD_XINPUT
1510+
// these values are ignored but NULL can't be passed to XIQueryPointer.
1511+
double root_x_return, root_y_return, win_x_return, win_y_return;
1512+
XIButtonState buttons_return;
1513+
XIModifierState modifiers_return;
1514+
XIGroupState group_return;
1515+
1516+
1517+
XIQueryPointer(display,device_id, window.root, &root_return, &last, &root_x_return,
1518+
&root_y_return, &win_x_return, &win_y_return, &buttons_return, &modifiers_return, &group_return);
1519+
#else
1520+
// these values are ignored but NULL can't be passed to XQueryPointer.
15061521
int root_x_return, root_y_return, win_x_return, win_y_return;
15071522
unsigned int mask_return;
15081523

1509-
Window last = None;
15101524
XQueryPointer(display, window.root, &root_return, &last, &root_x_return,
15111525
&root_y_return, &win_x_return, &win_y_return, &mask_return);
1526+
#endif
15121527

15131528
if (last == 0) return root;
15141529
return last;

src/output/x11.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,9 @@ Window query_x11_top_parent(Display *display, Window child);
157157
/// @param display display of parent
158158
/// @param x screen X position contained by window
159159
/// @param y screen Y position contained by window
160+
/// @param device_id pointer device id to be queried (will be ignored if BUILD_XINPUT is disabled)
160161
/// @return a top-most window at provided screen coordinates, or root
161-
Window query_x11_window_at_pos(Display *display, conky::vec2i pos);
162+
Window query_x11_window_at_pos(Display *display, conky::vec2i pos, int device_id);
162163

163164
/// @brief Returns a list of windows overlapping provided screen coordinates.
164165
///

0 commit comments

Comments
 (0)