From: ARDiDo <90479315+ARDiDo@users.noreply.github.com> Date: Sat, 23 Oct 2021 15:25:37 +0000 (-0400) Subject: Partial screen_edge_strength X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=e1c8b3c6418f9a7b23eafc6f782bc661afaea1cd;p=proto%2Flabwc.git Partial screen_edge_strength --- diff --git a/include/config/rcxml.h b/include/config/rcxml.h index d68af98c..63008583 100644 --- a/include/config/rcxml.h +++ b/include/config/rcxml.h @@ -14,6 +14,7 @@ struct rcxml { bool xdg_shell_server_side_deco; int gap; bool adaptive_sync; + int strength; /* focus */ bool focus_follow_mouse; diff --git a/src/config/rcxml.c b/src/config/rcxml.c index 9490ec0c..99bf2a25 100644 --- a/src/config/rcxml.c +++ b/src/config/rcxml.c @@ -322,6 +322,8 @@ entry(xmlNode *node, char *nodename, char *content) rc.repeat_rate = atoi(content); } else if (!strcasecmp(nodename, "repeatDelay.keyboard")) { rc.repeat_delay = atoi(content); + } else if (!strcasecmp(nodename, "screenEdgeStrength.core")) { + rc.strength = atoi(content); } } @@ -417,6 +419,7 @@ rcxml_init() rc.doubleclick_time = 500; rc.repeat_rate = 25; rc.repeat_delay = 600; + rc.strength = 0; } static struct { diff --git a/src/view.c b/src/view.c index a8b91ac7..7515c68e 100644 --- a/src/view.c +++ b/src/view.c @@ -16,6 +16,8 @@ view_set_activated(struct view *view, bool activated) } } +static void view_move_resistance(struct view *view, double *x, double *y); + void view_move_resize(struct view *view, struct wlr_box geo) { @@ -29,6 +31,7 @@ void view_move(struct view *view, double x, double y) { if (view->impl->move) { + view_move_resistance(view, &x, &y); view->impl->move(view, x, y); } } @@ -423,6 +426,55 @@ view_snap_to_edge(struct view *view, const char *direction) view_move_resize(view, dst); } +static void +view_move_resistance(struct view *view, double *x, double *y) +{ + struct wlr_box mgeom; + struct output *output; + 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 */ + + if (!rc.strength) { + return; + } + + output = view_output(view); + if (!output) { + return; + } + + 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 = *x - border.left - rc.gap; + tt = *y - border.top - rc.gap; + tr = *x + view->w + border.right + rc.gap; + tb = *y + view->h + border.bottom + rc.gap; + + 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 (l >= ml && tl < ml && tl >= ml - rc.strength) { + *x = ml + border.left + rc.gap; + } else if (r <= mr && tr > mr && tr <= mr + rc.strength) { + *x = mr - view->w - border.right - rc.gap; + } + + if (t >= mt && tt < mt && tt >= mt - rc.strength) { + *y = mt + border.top + rc.gap; + } else if (b <= mb && tb > mb && tb <= mb + rc.strength) { + *y = mb - view->h - border.bottom - rc.gap; + } +} + const char * view_get_string_prop(struct view *view, const char *prop) {