Merge pull request #23 from greg904/fix-resize

Fix wrong resize anchor point
This commit is contained in:
Joe 2020-04-30 22:02:14 -05:00 committed by GitHub
commit 93811898f0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 46 additions and 28 deletions

View file

@ -37,7 +37,7 @@ struct wb_server {
struct wb_view *grabbed_view; struct wb_view *grabbed_view;
double grab_x, grab_y; double grab_x, grab_y;
int grab_width, grab_height; struct wlr_box grab_geo_box;
uint32_t resize_edges; uint32_t resize_edges;
struct wlr_xdg_shell *xdg_shell; struct wlr_xdg_shell *xdg_shell;

View file

@ -10,33 +10,44 @@ static void process_cursor_move(struct wb_server *server) {
static void process_cursor_resize(struct wb_server *server) { static void process_cursor_resize(struct wb_server *server) {
struct wb_view *view = server->grabbed_view; struct wb_view *view = server->grabbed_view;
double dx = server->cursor->cursor->x - server->grab_x; double border_x = server->cursor->cursor->x - server->grab_x;
double dy = server->cursor->cursor->y - server->grab_y; double border_y = server->cursor->cursor->y - server->grab_y;
double x = view->x; int new_left = server->grab_geo_box.x;
double y = view->y; int new_right = server->grab_geo_box.x + server->grab_geo_box.width;
int width = server->grab_width; int new_top = server->grab_geo_box.y;
int height = server->grab_height; int new_bottom = server->grab_geo_box.y + server->grab_geo_box.height;
if (server->resize_edges & WLR_EDGE_TOP) { if (server->resize_edges & WLR_EDGE_TOP) {
y = server->grab_y + dy; new_top = border_y;
height -= dy; if (new_top >= new_bottom) {
if (height < 1) { new_top = new_bottom - 1;
y += height;
} }
} else if (server->resize_edges & WLR_EDGE_BOTTOM) { } else if (server->resize_edges & WLR_EDGE_BOTTOM) {
height += dy; new_bottom = border_y;
if (new_bottom <= new_top) {
new_bottom = new_top + 1;
}
} }
if (server->resize_edges & WLR_EDGE_LEFT) { if (server->resize_edges & WLR_EDGE_LEFT) {
x = server->grab_x + dx; new_left = border_x;
width -= dx; if (new_left >= new_right) {
if (width < 1) { new_left = new_right - 1;
x += width;
} }
} else if (server->resize_edges & WLR_EDGE_RIGHT) { } else if (server->resize_edges & WLR_EDGE_RIGHT) {
width += dx; new_right = border_x;
if (new_right <= new_left) {
new_right = new_left + 1;
}
} }
view->x = x;
view->y = y; struct wlr_box geo_box;
wlr_xdg_toplevel_set_size(view->xdg_surface, width, height); wlr_xdg_surface_get_geometry(view->xdg_surface, &geo_box);
view->x = new_left - geo_box.x;
view->y = new_top - geo_box.y;
int new_width = new_right - new_left;
int new_height = new_bottom - new_top;
wlr_xdg_toplevel_set_size(view->xdg_surface, new_width, new_height);
} }
static void process_cursor_motion(struct wb_server *server, uint32_t time) { static void process_cursor_motion(struct wb_server *server, uint32_t time) {

View file

@ -84,18 +84,25 @@ static void begin_interactive(struct wb_view *view,
} }
server->grabbed_view = view; server->grabbed_view = view;
server->cursor->cursor_mode = mode; server->cursor->cursor_mode = mode;
struct wlr_box geo_box;
wlr_xdg_surface_get_geometry(view->xdg_surface, &geo_box);
if (mode == WB_CURSOR_MOVE) { if (mode == WB_CURSOR_MOVE) {
server->grab_x = server->cursor->cursor->x - view->x; server->grab_x = server->cursor->cursor->x - view->x;
server->grab_y = server->cursor->cursor->y - view->y; server->grab_y = server->cursor->cursor->y - view->y;
} else { } else if (mode == WB_CURSOR_RESIZE) {
server->grab_x = server->cursor->cursor->x + geo_box.x; struct wlr_box geo_box;
server->grab_y = server->cursor->cursor->y + geo_box.y; wlr_xdg_surface_get_geometry(view->xdg_surface, &geo_box);
double border_x = (view->x + geo_box.x) + ((edges & WLR_EDGE_RIGHT) ? geo_box.width : 0);
double border_y = (view->y + geo_box.y) + ((edges & WLR_EDGE_BOTTOM) ? geo_box.height : 0);
server->grab_x = server->cursor->cursor->x - border_x;
server->grab_y = server->cursor->cursor->y - border_y;
server->grab_geo_box = geo_box;
server->grab_geo_box.x += view->x;
server->grab_geo_box.y += view->y;
server->resize_edges = edges;
} }
server->grab_width = geo_box.width;
server->grab_height = geo_box.height;
server->resize_edges = edges;
} }
static void xdg_toplevel_request_move( static void xdg_toplevel_request_move(