]> git.mdlowis.com Git - proto/labwc.git/commitdiff
resize resistance support
authorARDiDo <90479315+ARDiDo@users.noreply.github.com>
Sun, 24 Oct 2021 02:48:04 +0000 (22:48 -0400)
committerJohan Malm <johanmalm@users.noreply.github.com>
Tue, 26 Oct 2021 20:15:13 +0000 (21:15 +0100)
include/labwc.h
src/cursor.c
src/strength.c

index 1790f52be2a43d3c69f2fb74b871e253bcd120f2..adc159693f50a0818b21b0c253f5b7993c62bb5c 100644 (file)
@@ -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);
index b0d9b4462d18d38ea42c02490f90b81444fee4cc..32d99271eef468a0a0c340438777f97d60fdf961 100644 (file)
@@ -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);
 }
 
index ca21400da35b599593d19a1617929faab522a73e..862631e2e70f50a1d6ba0065f292dcb3b83991ec 100644 (file)
@@ -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;
+                               }
+                       }
+               }
+       }
+}