xdg: account for drag resistance in do_late_positioning()

The position where the view should be anchored can now be slightly
different from the current cursor position.

Addresses a TODO from #2009.
This commit is contained in:
John Lindgren 2024-08-02 20:18:21 -04:00 committed by Hiroaki Yamamoto
parent 4bda13d870
commit 1a339f9c7e
3 changed files with 18 additions and 12 deletions

View file

@ -503,8 +503,12 @@ void seat_output_layout_changed(struct seat *seat);
* *
* geometry->{width,height} are provided by the caller. * geometry->{width,height} are provided by the caller.
* geometry->{x,y} are computed by this function. * geometry->{x,y} are computed by this function.
*
* @note When drag-resistance is used, cursor_x/y should be the original
* cursor position when the button was pressed.
*/ */
void interactive_anchor_to_cursor(struct view *view, struct wlr_box *geometry); void interactive_anchor_to_cursor(struct view *view, struct wlr_box *geometry,
int cursor_x, int cursor_y);
/** /**
* interactive_move_tiled_view_to() - Un-tile the tiled/maximized view at the * interactive_move_tiled_view_to() - Un-tile the tiled/maximized view at the

View file

@ -23,12 +23,12 @@ max_move_scale(double pos_cursor, double pos_current,
} }
void void
interactive_anchor_to_cursor(struct view *view, struct wlr_box *geometry) interactive_anchor_to_cursor(struct view *view, struct wlr_box *geometry,
int cursor_x, int cursor_y)
{ {
struct wlr_cursor *cursor = view->server->seat.cursor; geometry->x = max_move_scale(cursor_x, view->current.x,
geometry->x = max_move_scale(cursor->x, view->current.x,
view->current.width, geometry->width); view->current.width, geometry->width);
geometry->y = max_move_scale(cursor->y, view->current.y, geometry->y = max_move_scale(cursor_y, view->current.y,
view->current.height, geometry->height); view->current.height, geometry->height);
} }
@ -113,7 +113,8 @@ interactive_begin(struct view *view, enum input_mode mode, uint32_t edges)
geometry.width = view->natural_geometry.width; geometry.width = view->natural_geometry.width;
geometry.height = view->natural_geometry.height; geometry.height = view->natural_geometry.height;
if (!wlr_box_empty(&geometry)) { if (!wlr_box_empty(&geometry)) {
interactive_anchor_to_cursor(view, &geometry); interactive_anchor_to_cursor(view, &geometry,
seat->cursor->x, seat->cursor->y);
} }
/* /*

View file

@ -93,13 +93,14 @@ do_late_positioning(struct view *view)
struct server *server = view->server; struct server *server = view->server;
if (server->input_mode == LAB_INPUT_STATE_MOVE if (server->input_mode == LAB_INPUT_STATE_MOVE
&& view == server->grabbed_view) { && view == server->grabbed_view) {
/* Keep view underneath cursor */ /* Anchor view to original grab position */
/* TODO: resistance is not considered */ interactive_anchor_to_cursor(view, &view->pending,
interactive_anchor_to_cursor(view, &view->pending); server->grab_x, server->grab_y);
/* Update grab offsets */ /* Next update grab offsets */
server->grab_x = server->seat.cursor->x;
server->grab_y = server->seat.cursor->y;
server->grab_box = view->pending; server->grab_box = view->pending;
/* Finally, move by same distance cursor has moved */
view->pending.x += server->seat.cursor->x - server->grab_x;
view->pending.y += server->seat.cursor->y - server->grab_y;
} else { } else {
/* TODO: smart placement? */ /* TODO: smart placement? */
view_compute_centered_position(view, NULL, view_compute_centered_position(view, NULL,