Bugfix: Don’t warp the pointer if it already is on the target output (Thanks cls, pnutzh4x0r)

My testcase was putting a floating window on the left output, but overlapping a
little to the right output. Then switch to a workspace on the right output.
next
Michael Stapelberg 2011-09-17 20:53:24 +01:00
parent 18129cf0b0
commit 755c618cd4
1 changed files with 18 additions and 1 deletions

19
src/x.c
View File

@ -759,6 +759,12 @@ static void x_push_node_unmaps(Con *con) {
*/
void x_push_changes(Con *con) {
con_state *state;
xcb_query_pointer_cookie_t pointercookie;
/* If we need to warp later, we request the pointer position as soon as possible */
if (warp_to) {
pointercookie = xcb_query_pointer(conn, root);
}
DLOG("-- PUSHING WINDOW STACK --\n");
//DLOG("Disabling EnterNotify\n");
@ -868,7 +874,18 @@ void x_push_changes(Con *con) {
}
if (warp_to) {
xcb_warp_pointer_rect(conn, warp_to);
xcb_query_pointer_reply_t *pointerreply = xcb_query_pointer_reply(conn, pointercookie, NULL);
if (!pointerreply) {
ELOG("Could not query pointer position, not warping pointer\n");
} else {
int mid_x = warp_to->x + (warp_to->width / 2);
int mid_y = warp_to->y + (warp_to->height / 2);
Output *current = get_output_containing(pointerreply->root_x, pointerreply->root_y);
Output *target = get_output_containing(mid_x, mid_y);
if (current != target)
xcb_warp_pointer(conn, XCB_NONE, root, 0, 0, 0, 0, mid_x, mid_y);
}
warp_to = NULL;
}