From c4b0c1350abb41d2f6ce2feaf897e89290d7d5af Mon Sep 17 00:00:00 2001 From: Michael Cardell Widerkrantz Date: Wed, 20 Jul 2011 22:26:18 +0200 Subject: In commit 98d81f75a3e8509e841f9e180e2104e45f6460c5 committed on Jun 20, 2010, I decided to use pointer hints instead of pointer motion notify to possible speed up things. In commit 381e642a39187f615ba54955ef02d1e2fcf1f95d on Jul 17, 2010, I reverted and wrote: Stop querying for pointer position ourself. Don't use motion hinting anymore and get real coordinates with motion event. See Gajewska and Manasse: "Why X Is Not Our Ideal Window System". Since getting a trackball with high CPI and experiencing how slow moves and resizes suddenly were, especially when decreasing mouse acceleration, this is clearly wrong. The right way *is* to subscribe to just motion hints and request pointer coordinates ourselves. --- mcwm.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/mcwm.c b/mcwm.c index ccc35b7..efba40e 100644 --- a/mcwm.c +++ b/mcwm.c @@ -3485,7 +3485,8 @@ void events(void) */ xcb_grab_pointer(conn, 0, screen->root, XCB_EVENT_MASK_BUTTON_RELEASE - | XCB_EVENT_MASK_BUTTON_MOTION, + | XCB_EVENT_MASK_BUTTON_MOTION + | XCB_EVENT_MASK_POINTER_MOTION_HINT, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC, screen->root, @@ -3501,7 +3502,7 @@ void events(void) case XCB_MOTION_NOTIFY: { - xcb_motion_notify_event_t *e; + xcb_query_pointer_reply_t *pointer; /* * We can't do anything if we don't have a focused window @@ -3511,26 +3512,41 @@ void events(void) { break; } - - e = (xcb_motion_notify_event_t *) ev; + /* + * This is not really a real notify, but just a hint that + * the mouse pointer moved. This means we need to get the + * current pointer position ourselves. + */ + pointer = xcb_query_pointer_reply( + conn, xcb_query_pointer(conn, screen->root), 0); + + if (NULL == pointer) + { + PDEBUG("Couldn't get pointer position.\n"); + break; + } + /* * Our pointer is moving and since we even get this event * we're either resizing or moving a window. */ if (mode == MCWM_MOVE) { - mousemove(focuswin, e->root_x, e->root_y); + mousemove(focuswin, pointer->root_x, pointer->root_y); } else if (mode == MCWM_RESIZE) { - mouseresize(focuswin, e->root_x, e->root_y); + mouseresize(focuswin, pointer->root_x, pointer->root_y); } else { PDEBUG("Motion event when we're not moving our resizing!\n"); } + + free(pointer); } + break; case XCB_BUTTON_RELEASE: -- cgit v1.2.3