diff options
author | Kristian Høgsberg <krh@bitplanet.net> | 2013-03-27 15:14:07 -0400 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2013-03-27 15:14:07 -0400 |
commit | 5006596a729524100a345e426bef7b2ed93bc561 (patch) | |
tree | 68f0f13ff2cb67388a54ad6c558cbc5ebc85a20b | |
parent | c088e2c01145d05eddb3314de17c8dbec6b8cb62 (diff) |
compositor-x11: Fix relative motion reporting for multiple outputs
-rw-r--r-- | src/compositor-x11.c | 21 | ||||
-rw-r--r-- | src/compositor.c | 9 |
2 files changed, 13 insertions, 17 deletions
diff --git a/src/compositor-x11.c b/src/compositor-x11.c index 8e052dde..a95c1fbf 100644 --- a/src/compositor-x11.c +++ b/src/compositor-x11.c @@ -90,8 +90,8 @@ struct x11_compositor { /* We could map multi-pointer X to multiple wayland seats, but * for now we only support core X input. */ struct weston_seat core_seat; - int prev_x; - int prev_y; + wl_fixed_t prev_x; + wl_fixed_t prev_y; struct { xcb_atom_t wm_protocols; @@ -1010,13 +1010,15 @@ x11_compositor_deliver_motion_event(struct x11_compositor *c, if (!c->has_xkb) update_xkb_state_from_core(c, motion_notify->state); output = x11_compositor_find_output(c, motion_notify->event); - x = wl_fixed_from_int(motion_notify->event_x - c->prev_x); - y = wl_fixed_from_int(motion_notify->event_y - c->prev_y); - c->prev_x = motion_notify->event_x; - c->prev_y = motion_notify->event_y; + x = wl_fixed_from_int(motion_notify->event_x); + y = wl_fixed_from_int(motion_notify->event_y); x11_output_transform_coordinate(output, &x, &y); - notify_motion(&c->core_seat, weston_compositor_get_time(), x, y); + notify_motion(&c->core_seat, weston_compositor_get_time(), + x - c->prev_x, y - c->prev_y); + + c->prev_x = x; + c->prev_y = y; } static void @@ -1033,13 +1035,14 @@ x11_compositor_deliver_enter_event(struct x11_compositor *c, if (!c->has_xkb) update_xkb_state_from_core(c, enter_notify->state); output = x11_compositor_find_output(c, enter_notify->event); - c->prev_x = enter_notify->event_x; - c->prev_y = enter_notify->event_y; x = wl_fixed_from_int(enter_notify->event_x); y = wl_fixed_from_int(enter_notify->event_y); x11_output_transform_coordinate(output, &x, &y); notify_pointer_focus(&c->core_seat, &output->base, x, y); + + c->prev_x = x; + c->prev_y = y; } static int diff --git a/src/compositor.c b/src/compositor.c index d3394726..b846d8e7 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -2078,15 +2078,8 @@ notify_pointer_focus(struct weston_seat *seat, struct weston_output *output, struct wl_pointer *pointer = seat->seat.pointer; if (output) { - clip_pointer_motion(seat, &x, &y); - weston_seat_update_drag_surface(seat, - x - pointer->x, - y - pointer->y); - - pointer->x = x; - pointer->y = y; + move_pointer(seat, x, y); compositor->focus = 1; - weston_compositor_repick(compositor); } else { compositor->focus = 0; /* FIXME: We should call wl_pointer_set_focus(seat, |