From f19301ef6843f48a91868c0318766f8e30983d05 Mon Sep 17 00:00:00 2001 From: sewn Date: Mon, 1 Apr 2024 16:02:45 +0300 Subject: [PATCH] replicate dwm behavior for snap resize --- config.def.h | 1 + dwl.c | 13 ++++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/config.def.h b/config.def.h index 8847e58..38b6aa4 100644 --- a/config.def.h +++ b/config.def.h @@ -7,6 +7,7 @@ static const int sloppyfocus = 1; /* focus follows mouse */ static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */ static const unsigned int borderpx = 1; /* border pixel of windows */ +static const unsigned int snap = 32; /* snap pixel */ static const float rootcolor[] = COLOR(0x222222ff); static const float bordercolor[] = COLOR(0x444444ff); static const float focuscolor[] = COLOR(0x005577ff); diff --git a/dwl.c b/dwl.c index 39ce68c..254dd70 100644 --- a/dwl.c +++ b/dwl.c @@ -1688,6 +1688,7 @@ void motionnotify(uint32_t time, struct wlr_input_device *device, double dx, double dy, double dx_unaccel, double dy_unaccel) { + int nx, ny; double sx = 0, sy = 0, sx_confined, sy_confined; Client *c = NULL, *w = NULL; LayerSurface *l = NULL; @@ -1733,7 +1734,17 @@ motionnotify(uint32_t time, struct wlr_input_device *device, double dx, double d /* If we are currently grabbing the mouse, handle and return */ if (cursor_mode == CurMove) { /* Move the grabbed client to the new position. */ - resize(grabc, (struct wlr_box){.x = ROUND(cursor->x) - grabcx, .y = ROUND(cursor->y) - grabcy, + nx = ROUND(cursor->x) - grabcx; + ny = ROUND(cursor->y) - grabcy; + if (abs(selmon->w.x - nx) < snap) + nx = selmon->w.x; + else if (abs((selmon->w.x + selmon->w.width) - (nx + grabc->geom.width)) < snap) + nx = selmon->w.x + selmon->w.width - grabc->geom.width; + if (abs(selmon->w.y - ny) < snap) + ny = selmon->w.y; + else if (abs((selmon->w.y + selmon->w.height) - (ny + grabc->geom.height)) < snap) + ny = selmon->w.y + selmon->w.height - grabc->geom.height; + resize(grabc, (struct wlr_box){.x = nx, .y = ny, .width = grabc->geom.width, .height = grabc->geom.height}, 1); return; } else if (cursor_mode == CurResize) {