From ac58ab10a7f7577c4c003d294ca5a60015d0bb9a Mon Sep 17 00:00:00 2001 From: ARDiDo <90479315+ARDiDo@users.noreply.github.com> Date: Sat, 23 Oct 2021 22:48:04 -0400 Subject: [PATCH] resize resistance support --- include/labwc.h | 2 ++ src/cursor.c | 1 + src/strength.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+) diff --git a/include/labwc.h b/include/labwc.h index 1790f52b..adc15969 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -346,6 +346,8 @@ void subsurface_create(struct view *view, struct wlr_subsurface *wlr_subsurface) void view_set_activated(struct view *view, bool activated); void move_resistance(struct view *view, double *x, double *y, bool screen_edge); +void resize_resistance(struct view *view, struct wlr_box *new_view_geo, + bool screen_edge); struct border view_border(struct view *view); void view_move_resize(struct view *view, struct wlr_box geo); void view_move(struct view *view, double x, double y); diff --git a/src/cursor.c b/src/cursor.c index b0d9b446..32d99271 100644 --- a/src/cursor.c +++ b/src/cursor.c @@ -125,6 +125,7 @@ process_cursor_resize(struct server *server, uint32_t time) new_view_geo.width = server->grab_box.width + dx; } + resize_resistance(view, &new_view_geo, true); view_move_resize(view, new_view_geo); } diff --git a/src/strength.c b/src/strength.c index ca21400d..862631e2 100644 --- a/src/strength.c +++ b/src/strength.c @@ -54,3 +54,70 @@ move_resistance(struct view *view, double *x, double *y, bool screen_edge) } } } + +void +resize_resistance(struct view *view, struct wlr_box *new_view_geo, + bool screen_edge) +{ + struct server *server = view->server; + struct output *output; + struct wlr_box mgeom; + struct border border = view_border(view); + int l, r, t, b; /* The edges of the current view */ + int tl, tr, tt, tb; /* The desired edges */ + int ml, mr, mt, mb; /* The edges of the monitor/other view */ + + l = view->x - border.left - rc.gap; + t = view->y - border.top - rc.gap; + r = view->x + view->w + border.right + rc.gap; + b = view->y + view->h + border.bottom + rc.gap; + + tl = new_view_geo->x - border.left - rc.gap; + tt = new_view_geo->y - border.top - rc.gap; + tr = new_view_geo->x + new_view_geo->width + border.right + rc.gap; + tb = new_view_geo->y + new_view_geo->height + border.bottom + rc.gap; + + if (screen_edge) { + if (!rc.screen_edge_strength) { + return; + } + wl_list_for_each(output, &server->outputs, link) { + mgeom = output_usable_area_in_layout_coords(output); + ml = mgeom.x; + mt = mgeom.y; + mr = mgeom.x + mgeom.width; + mb = mgeom.y + mgeom.height; + + if (server->resize_edges & WLR_EDGE_LEFT) { + if (l >= ml && tl < ml && tl >= ml + - rc.screen_edge_strength) { + new_view_geo->x = ml + border.left + + rc.gap; + new_view_geo->width = view->w; + } + } else if (server->resize_edges & WLR_EDGE_RIGHT) { + if (r <= mr && tr > mr && tr <= mr + + rc.screen_edge_strength) { + new_view_geo->width = mr - l + - (border.right + rc.gap) * 2 ; + } + } + + if (server->resize_edges & WLR_EDGE_TOP) { + if (t >= mt && tt < mt && tt >= mt + - rc.screen_edge_strength) { + new_view_geo->y = mt + border.top + + rc.gap; + new_view_geo->height = view->h; + } + } else if (server->resize_edges & WLR_EDGE_BOTTOM) { + if (b <= mb && tb > mb && tb <= mb + + rc.screen_edge_strength) { + new_view_geo->height = mb - t + - border.bottom - border.top + - rc.gap * 2; + } + } + } + } +}