diff --git a/config.def.h b/config.def.h index 8a6eda0..24e55ef 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 320910d..5eff11c 100644 --- a/dwl.c +++ b/dwl.c @@ -1863,6 +1863,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; @@ -1920,7 +1921,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 = (int)round(cursor->x) - grabcx, .y = (int)round(cursor->y) - grabcy, + nx = (int)round(cursor->x) - grabcx; + ny = (int)round(cursor->y) - grabcy; + if (abs(selmon->w.x - nx) < (int)snap) + nx = selmon->w.x; + else if (abs((selmon->w.x + selmon->w.width) - (nx + grabc->geom.width)) < (int)snap) + nx = selmon->w.x + selmon->w.width - grabc->geom.width; + if (abs(selmon->w.y - ny) < (int)snap) + ny = selmon->w.y; + else if (abs((selmon->w.y + selmon->w.height) - (ny + grabc->geom.height)) < (int)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) {