aboutsummaryrefslogtreecommitdiff
path: root/sway/input/seatop_down.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/input/seatop_down.c')
-rw-r--r--sway/input/seatop_down.c43
1 files changed, 11 insertions, 32 deletions
diff --git a/sway/input/seatop_down.c b/sway/input/seatop_down.c
index fb2cf1d0..95ea7cbb 100644
--- a/sway/input/seatop_down.c
+++ b/sway/input/seatop_down.c
@@ -3,21 +3,26 @@
#include "sway/input/cursor.h"
#include "sway/input/seat.h"
#include "sway/tree/view.h"
+#include "log.h"
struct seatop_down_event {
struct sway_container *con;
double ref_lx, ref_ly; // cursor's x/y at start of op
double ref_con_lx, ref_con_ly; // container's x/y at start of op
- bool moved;
};
static void handle_button(struct sway_seat *seat, uint32_t time_msec,
struct wlr_input_device *device, uint32_t button,
enum wlr_button_state state) {
seat_pointer_notify_button(seat, time_msec, button, state);
+
+ if (seat->cursor->pressed_button_count == 0) {
+ seatop_begin_default(seat);
+ }
}
-static void handle_motion(struct sway_seat *seat, uint32_t time_msec) {
+static void handle_motion(struct sway_seat *seat, uint32_t time_msec,
+ double dx, double dy) {
struct seatop_down_event *e = seat->seatop_data;
struct sway_container *con = e->con;
if (seat_is_input_allowed(seat, con->view->surface)) {
@@ -27,49 +32,25 @@ static void handle_motion(struct sway_seat *seat, uint32_t time_msec) {
double sy = e->ref_con_ly + moved_y;
wlr_seat_pointer_notify_motion(seat->wlr_seat, time_msec, sx, sy);
}
- e->moved = true;
-}
-
-static void handle_finish(struct sway_seat *seat, uint32_t time_msec) {
- struct seatop_down_event *e = seat->seatop_data;
- struct sway_cursor *cursor = seat->cursor;
- // Set the cursor's previous coords to the x/y at the start of the
- // operation, so the container change will be detected if using
- // focus_follows_mouse and the cursor moved off the original container
- // during the operation.
- cursor->previous.x = e->ref_lx;
- cursor->previous.y = e->ref_ly;
- if (e->moved) {
- struct wlr_surface *surface = NULL;
- double sx, sy;
- struct sway_node *node = node_at_coords(seat,
- cursor->cursor->x, cursor->cursor->y, &surface, &sx, &sy);
- cursor_send_pointer_motion(cursor, 0, node, surface, sx, sy);
- }
-}
-
-static void handle_abort(struct sway_seat *seat) {
- cursor_set_image(seat->cursor, "left_ptr", NULL);
}
static void handle_unref(struct sway_seat *seat, struct sway_container *con) {
struct seatop_down_event *e = seat->seatop_data;
if (e->con == con) {
- seatop_abort(seat);
+ seatop_begin_default(seat);
}
}
static const struct sway_seatop_impl seatop_impl = {
.button = handle_button,
.motion = handle_motion,
- .finish = handle_finish,
- .abort = handle_abort,
.unref = handle_unref,
+ .allow_set_cursor = true,
};
void seatop_begin_down(struct sway_seat *seat, struct sway_container *con,
- uint32_t time_msec, uint32_t button, int sx, int sy) {
- seatop_abort(seat);
+ uint32_t time_msec, int sx, int sy) {
+ seatop_end(seat);
struct seatop_down_event *e =
calloc(1, sizeof(struct seatop_down_event));
@@ -81,11 +62,9 @@ void seatop_begin_down(struct sway_seat *seat, struct sway_container *con,
e->ref_ly = seat->cursor->cursor->y;
e->ref_con_lx = sx;
e->ref_con_ly = sy;
- e->moved = false;
seat->seatop_impl = &seatop_impl;
seat->seatop_data = e;
- seat->seatop_button = button;
container_raise_floating(con);
}