dwm-tiledmove-20231210-b731.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dwm-tiledmove-20231210-b731.diff (2197B)
---
1 From 427c5fef13676179621949f0a8a4036e49d4b74e Mon Sep 17 00:00:00 2001
2 From: Niki <>
3 Date: Sun, 10 Dec 2023 00:29:59 +0000
4 Subject: [PATCH] The function `movemouse` now doesn't force clients to be
5 floating.
6
7 Tiling clients when moved will swap with any existing clients that
8 overlap with the cursor, and snap to other monitors.
9 ---
10 dwm.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++---
11 1 file changed, 53 insertions(+), 3 deletions(-)
12
13 diff --git a/dwm.c b/dwm.c
14 index d12be2d..b1023e0 100644
15 --- a/dwm.c
16 +++ b/dwm.c
17 @@ -1189,11 +1189,60 @@ movemouse(const Arg *arg)
18 ny = selmon->wy;
19 else if (abs((selmon->wy + selmon->wh) - (ny + HEIGHT(c))) < snap)
20 ny = selmon->wy + selmon->wh - HEIGHT(c);
21 - if (!c->isfloating && selmon->lt[selmon->sellt]->arrange
22 - && (abs(nx - c->x) > snap || abs(ny - c->y) > snap))
23 - togglefloating(NULL);
24 if (!selmon->lt[selmon->sellt]->arrange || c->isfloating)
25 resize(c, nx, ny, c->w, c->h, 1);
26 + else if (selmon->lt[selmon->sellt]->arrange || !c->isfloating) {
27 + if ((m = recttomon(ev.xmotion.x_root, ev.xmotion.y_root, 1, 1)) != selmon) {
28 + sendmon(c, m);
29 + selmon = m;
30 + focus(NULL);
31 + }
32 +
33 + Client *cc = c->mon->clients;
34 + while (1) {
35 + if (cc == 0) break;
36 + if(
37 + cc != c && !cc->isfloating && ISVISIBLE(cc) &&
38 + ev.xmotion.x_root > cc->x &&
39 + ev.xmotion.x_root < cc->x + cc->w &&
40 + ev.xmotion.y_root > cc->y &&
41 + ev.xmotion.y_root < cc->y + cc->h ) {
42 + break;
43 + }
44 +
45 + cc = cc->next;
46 + }
47 +
48 + if (cc) {
49 + Client *cl1, *cl2, ocl1;
50 +
51 + if (!selmon->lt[selmon->sellt]->arrange) return;
52 +
53 + cl1 = c;
54 + cl2 = cc;
55 + ocl1 = *cl1;
56 + strcpy(cl1->name, cl2->name);
57 + cl1->win = cl2->win;
58 + cl1->x = cl2->x;
59 + cl1->y = cl2->y;
60 + cl1->w = cl2->w;
61 + cl1->h = cl2->h;
62 +
63 + cl2->win = ocl1.win;
64 + strcpy(cl2->name, ocl1.name);
65 + cl2->x = ocl1.x;
66 + cl2->y = ocl1.y;
67 + cl2->w = ocl1.w;
68 + cl2->h = ocl1.h;
69 +
70 + selmon->sel = cl2;
71 +
72 + c = cc;
73 + focus(c);
74 +
75 + arrange(cl1->mon);
76 + }
77 + }
78 break;
79 }
80 } while (ev.type != ButtonRelease);
81 --
82 2.43.0
83