diff options
author | emersion <contact@emersion.fr> | 2019-02-16 11:55:44 +0100 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2019-02-25 17:10:04 -0500 |
commit | 54ad31a9dcd1d9416d3373f40f3e3c6b5c95de32 (patch) | |
tree | 6491824f11e8769b9f57d4280ba34f2c29571be5 /sway/input/seat.c | |
parent | handle_seat_node_destroy: update seat->workspace (diff) | |
download | sway-54ad31a9dcd1d9416d3373f40f3e3c6b5c95de32.tar.gz sway-54ad31a9dcd1d9416d3373f40f3e3c6b5c95de32.tar.zst sway-54ad31a9dcd1d9416d3373f40f3e3c6b5c95de32.zip |
Update for swaywm/wlroots#1517
Diffstat (limited to 'sway/input/seat.c')
-rw-r--r-- | sway/input/seat.c | 57 |
1 files changed, 48 insertions, 9 deletions
diff --git a/sway/input/seat.c b/sway/input/seat.c index 6482a47c..a16d3f27 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c | |||
@@ -44,7 +44,8 @@ void seat_destroy(struct sway_seat *seat) { | |||
44 | } | 44 | } |
45 | sway_cursor_destroy(seat->cursor); | 45 | sway_cursor_destroy(seat->cursor); |
46 | wl_list_remove(&seat->new_node.link); | 46 | wl_list_remove(&seat->new_node.link); |
47 | wl_list_remove(&seat->new_drag_icon.link); | 47 | wl_list_remove(&seat->request_start_drag.link); |
48 | wl_list_remove(&seat->start_drag.link); | ||
48 | wl_list_remove(&seat->request_set_selection.link); | 49 | wl_list_remove(&seat->request_set_selection.link); |
49 | wl_list_remove(&seat->request_set_primary_selection.link); | 50 | wl_list_remove(&seat->request_set_primary_selection.link); |
50 | wl_list_remove(&seat->link); | 51 | wl_list_remove(&seat->link); |
@@ -261,12 +262,16 @@ void drag_icon_update_position(struct sway_drag_icon *icon) { | |||
261 | struct wlr_drag_icon *wlr_icon = icon->wlr_drag_icon; | 262 | struct wlr_drag_icon *wlr_icon = icon->wlr_drag_icon; |
262 | struct sway_seat *seat = icon->seat; | 263 | struct sway_seat *seat = icon->seat; |
263 | struct wlr_cursor *cursor = seat->cursor->cursor; | 264 | struct wlr_cursor *cursor = seat->cursor->cursor; |
264 | if (wlr_icon->is_pointer) { | 265 | switch (wlr_icon->drag->grab_type) { |
266 | case WLR_DRAG_GRAB_KEYBOARD: | ||
267 | return; | ||
268 | case WLR_DRAG_GRAB_KEYBOARD_POINTER: | ||
265 | icon->x = cursor->x; | 269 | icon->x = cursor->x; |
266 | icon->y = cursor->y; | 270 | icon->y = cursor->y; |
267 | } else { | 271 | break; |
272 | case WLR_DRAG_GRAB_KEYBOARD_TOUCH:; | ||
268 | struct wlr_touch_point *point = | 273 | struct wlr_touch_point *point = |
269 | wlr_seat_touch_get_point(seat->wlr_seat, wlr_icon->touch_id); | 274 | wlr_seat_touch_get_point(seat->wlr_seat, wlr_icon->drag->touch_id); |
270 | if (point == NULL) { | 275 | if (point == NULL) { |
271 | return; | 276 | return; |
272 | } | 277 | } |
@@ -305,9 +310,39 @@ static void drag_icon_handle_destroy(struct wl_listener *listener, void *data) { | |||
305 | free(icon); | 310 | free(icon); |
306 | } | 311 | } |
307 | 312 | ||
308 | static void handle_new_drag_icon(struct wl_listener *listener, void *data) { | 313 | static void handle_request_start_drag(struct wl_listener *listener, |
309 | struct sway_seat *seat = wl_container_of(listener, seat, new_drag_icon); | 314 | void *data) { |
310 | struct wlr_drag_icon *wlr_drag_icon = data; | 315 | struct sway_seat *seat = wl_container_of(listener, seat, request_start_drag); |
316 | struct wlr_seat_request_start_drag_event *event = data; | ||
317 | |||
318 | if (wlr_seat_validate_pointer_grab_serial(seat->wlr_seat, | ||
319 | event->origin, event->serial)) { | ||
320 | wlr_seat_start_pointer_drag(seat->wlr_seat, event->drag, event->serial); | ||
321 | return; | ||
322 | } | ||
323 | |||
324 | struct wlr_touch_point *point; | ||
325 | if (wlr_seat_validate_touch_grab_serial(seat->wlr_seat, | ||
326 | event->origin, event->serial, &point)) { | ||
327 | wlr_seat_start_touch_drag(seat->wlr_seat, | ||
328 | event->drag, event->serial, point); | ||
329 | return; | ||
330 | } | ||
331 | |||
332 | // TODO: tablet grabs | ||
333 | |||
334 | sway_log(SWAY_DEBUG, "Ignoring start_drag request: " | ||
335 | "could not validate pointer or touch serial %" PRIu32, event->serial); | ||
336 | wlr_data_source_destroy(event->drag->source); | ||
337 | } | ||
338 | |||
339 | static void handle_start_drag(struct wl_listener *listener, void *data) { | ||
340 | struct sway_seat *seat = wl_container_of(listener, seat, start_drag); | ||
341 | struct wlr_drag *wlr_drag = data; | ||
342 | struct wlr_drag_icon *wlr_drag_icon = wlr_drag->icon; | ||
343 | if (wlr_drag_icon == NULL) { | ||
344 | return; | ||
345 | } | ||
311 | 346 | ||
312 | struct sway_drag_icon *icon = calloc(1, sizeof(struct sway_drag_icon)); | 347 | struct sway_drag_icon *icon = calloc(1, sizeof(struct sway_drag_icon)); |
313 | if (icon == NULL) { | 348 | if (icon == NULL) { |
@@ -406,8 +441,12 @@ struct sway_seat *seat_create(const char *seat_name) { | |||
406 | wl_signal_add(&root->events.new_node, &seat->new_node); | 441 | wl_signal_add(&root->events.new_node, &seat->new_node); |
407 | seat->new_node.notify = handle_new_node; | 442 | seat->new_node.notify = handle_new_node; |
408 | 443 | ||
409 | wl_signal_add(&seat->wlr_seat->events.new_drag_icon, &seat->new_drag_icon); | 444 | wl_signal_add(&seat->wlr_seat->events.request_start_drag, |
410 | seat->new_drag_icon.notify = handle_new_drag_icon; | 445 | &seat->request_start_drag); |
446 | seat->request_start_drag.notify = handle_request_start_drag; | ||
447 | |||
448 | wl_signal_add(&seat->wlr_seat->events.start_drag, &seat->start_drag); | ||
449 | seat->start_drag.notify = handle_start_drag; | ||
411 | 450 | ||
412 | wl_signal_add(&seat->wlr_seat->events.request_set_selection, | 451 | wl_signal_add(&seat->wlr_seat->events.request_set_selection, |
413 | &seat->request_set_selection); | 452 | &seat->request_set_selection); |