Skip to content

Commit

Permalink
Allow concurrent clicks
Browse files Browse the repository at this point in the history
If two cursor buttons are pressed at the same time, the client will now
be notified of the second button press.

The main reason for not sending the concurrent presses was due to an
early return in dispatch_cursor_button if a seatop is in progress. This
patch makes it call seat_pointer_notify_button prior to returning. But
it also has to make sure there's not a mismatch in events such as a
release without a press.

Prior to this patch, the down seatop would send press and release events
in its begin and finish functions. No other seatops did this. A press
event would be sent prior to starting tiling drag, but never an
associated release.

After this patch, no seatops send their own press or release events. We
send them prior to calling the seatop begin functions, then the first
part of dispatch_cursor_button handles all presses during seatops and
when releasing the seatop.
  • Loading branch information
RyanDwyer authored and ddevault committed Mar 4, 2019
1 parent 1749f24 commit 0c16057
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 3 deletions.
7 changes: 7 additions & 0 deletions sway/input/cursor.c
Original file line number Diff line number Diff line change
Expand Up @@ -613,6 +613,7 @@ void dispatch_cursor_button(struct sway_cursor *cursor,
} else {
state_erase_button(cursor, button);
}
seat_pointer_notify_button(seat, time_msec, button, state);
return;
}

Expand Down Expand Up @@ -681,6 +682,7 @@ void dispatch_cursor_button(struct sway_cursor *cursor,
if (cont && resize_edge && button == BTN_LEFT &&
state == WLR_BUTTON_PRESSED && !is_floating) {
seat_set_focus_container(seat, cont);
seat_pointer_notify_button(seat, time_msec, button, state);
seatop_begin_resize_tiling(seat, cont, button, edge);
return;
}
Expand Down Expand Up @@ -711,6 +713,7 @@ void dispatch_cursor_button(struct sway_cursor *cursor,
}
cursor_set_image(seat->cursor, image, NULL);
seat_set_focus_container(seat, cont);
seat_pointer_notify_button(seat, time_msec, button, state);
seatop_begin_resize_tiling(seat, cont, button, edge);
return;
}
Expand All @@ -726,6 +729,7 @@ void dispatch_cursor_button(struct sway_cursor *cursor,
cont = cont->parent;
}
seat_set_focus_container(seat, cont);
seat_pointer_notify_button(seat, time_msec, button, state);
seatop_begin_move_floating(seat, cont, button);
return;
}
Expand All @@ -736,6 +740,7 @@ void dispatch_cursor_button(struct sway_cursor *cursor,
state == WLR_BUTTON_PRESSED) {
// Via border
if (button == BTN_LEFT && resize_edge != WLR_EDGE_NONE) {
seat_pointer_notify_button(seat, time_msec, button, state);
seatop_begin_resize_floating(seat, cont, button, resize_edge);
return;
}
Expand All @@ -753,6 +758,7 @@ void dispatch_cursor_button(struct sway_cursor *cursor,
WLR_EDGE_RIGHT : WLR_EDGE_LEFT;
edge |= cursor->cursor->y > floater->y + floater->height / 2 ?
WLR_EDGE_BOTTOM : WLR_EDGE_TOP;
seat_pointer_notify_button(seat, time_msec, button, state);
seatop_begin_resize_floating(seat, floater, button, edge);
return;
}
Expand Down Expand Up @@ -784,6 +790,7 @@ void dispatch_cursor_button(struct sway_cursor *cursor,
if (surface && cont && state == WLR_BUTTON_PRESSED) {
seat_set_focus_container(seat, cont);
seatop_begin_down(seat, cont, time_msec, button, sx, sy);
seat_pointer_notify_button(seat, time_msec, button, WLR_BUTTON_PRESSED);
return;
}

Expand Down
3 changes: 0 additions & 3 deletions sway/input/seatop_down.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,6 @@ static void handle_finish(struct sway_seat *seat, uint32_t time_msec) {
cursor->cursor->x, cursor->cursor->y, &surface, &sx, &sy);
cursor_send_pointer_motion(cursor, 0, node, surface, sx, sy);
}
seat_pointer_notify_button(seat, time_msec,
seat->seatop_button, WLR_BUTTON_RELEASED);
}

static void handle_abort(struct sway_seat *seat) {
Expand Down Expand Up @@ -82,6 +80,5 @@ void seatop_begin_down(struct sway_seat *seat, struct sway_container *con,
seat->seatop_data = e;
seat->seatop_button = button;

seat_pointer_notify_button(seat, time_msec, button, WLR_BUTTON_PRESSED);
container_raise_floating(con);
}

0 comments on commit 0c16057

Please sign in to comment.