shell: Stop moving surfae after touch point 0 goes up
The grab stays alive as long as at least one touch point is down. If touch point 0 is lifted while other touch points are down, the surface will jump around when touch point 0 is put down again. This change marks the grab as inactive once touch point 0 is lifted and then ignores touch events until all touch points eventually are lifted and the grab terminates. https://bugs.freedesktop.org/show_bug.cgi?id=73750
This commit is contained in:
@@ -198,6 +198,7 @@ struct weston_move_grab {
|
|||||||
|
|
||||||
struct weston_touch_move_grab {
|
struct weston_touch_move_grab {
|
||||||
struct shell_touch_grab base;
|
struct shell_touch_grab base;
|
||||||
|
int active;
|
||||||
wl_fixed_t dx, dy;
|
wl_fixed_t dx, dy;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1313,6 +1314,9 @@ touch_move_grab_up(struct weston_touch_grab *grab, uint32_t time, int touch_id)
|
|||||||
(struct weston_touch_move_grab *) container_of(
|
(struct weston_touch_move_grab *) container_of(
|
||||||
grab, struct shell_touch_grab, grab);
|
grab, struct shell_touch_grab, grab);
|
||||||
|
|
||||||
|
if (touch_id == 0)
|
||||||
|
move->active = 0;
|
||||||
|
|
||||||
if (grab->touch->num_tp == 0) {
|
if (grab->touch->num_tp == 0) {
|
||||||
shell_touch_grab_end(&move->base);
|
shell_touch_grab_end(&move->base);
|
||||||
free(move);
|
free(move);
|
||||||
@@ -1329,7 +1333,7 @@ touch_move_grab_motion(struct weston_touch_grab *grab, uint32_t time,
|
|||||||
int dx = wl_fixed_to_int(grab->touch->grab_x + move->dx);
|
int dx = wl_fixed_to_int(grab->touch->grab_x + move->dx);
|
||||||
int dy = wl_fixed_to_int(grab->touch->grab_y + move->dy);
|
int dy = wl_fixed_to_int(grab->touch->grab_y + move->dy);
|
||||||
|
|
||||||
if (!shsurf)
|
if (!shsurf || !move->active)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
es = shsurf->surface;
|
es = shsurf->surface;
|
||||||
@@ -1374,6 +1378,7 @@ surface_touch_move(struct shell_surface *shsurf, struct weston_seat *seat)
|
|||||||
if (!move)
|
if (!move)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
move->active = 1;
|
||||||
move->dx = wl_fixed_from_double(shsurf->view->geometry.x) -
|
move->dx = wl_fixed_from_double(shsurf->view->geometry.x) -
|
||||||
seat->touch->grab_x;
|
seat->touch->grab_x;
|
||||||
move->dy = wl_fixed_from_double(shsurf->view->geometry.y) -
|
move->dy = wl_fixed_from_double(shsurf->view->geometry.y) -
|
||||||
|
|||||||
Reference in New Issue
Block a user