aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWarrick Lo <warrick.s.z.lo@gmail.com>2021-11-24 18:30:32 -0800
committerWarrick Lo <warrick.s.z.lo@gmail.com>2021-11-24 18:30:32 -0800
commit160f58b959f81d4fb8d2910ee7ce8b82809aa127 (patch)
tree4cfb3e13ffcdfcb60151cd1ce0efd9f1fb5f8c0a
parentAllow moving and resizing windows with keyboard (diff)
Change behaviour of moveresize(), moveresizeedge()
Removed cursor warping when moving/resizing, since dwm has already been patched to focus windows only when clicked. Removed some options for moveresize(). We (likely) aren't going to be using them anyway. Replaced the if statments in moveresizeedge() with a switch statement.
-rw-r--r--config.def.h16
-rw-r--r--dwm.c115
2 files changed, 34 insertions, 97 deletions
diff --git a/config.def.h b/config.def.h
index d57ab76..cbf49de 100644
--- a/config.def.h
+++ b/config.def.h
@@ -92,14 +92,14 @@ static Key keys[] = {
{ MODKEY, XK_m, setlayout, {.v = &layouts[2]} },
{ MODKEY, XK_space, setlayout, {0} },
{ MODKEY|ShiftMask, XK_space, togglefloating, {0} },
- { MODKEY, XK_Down, moveresize, {.v = "0x 25y 0w 0h" } },
- { MODKEY, XK_Up, moveresize, {.v = "0x -25y 0w 0h" } },
- { MODKEY, XK_Right, moveresize, {.v = "25x 0y 0w 0h" } },
- { MODKEY, XK_Left, moveresize, {.v = "-25x 0y 0w 0h" } },
- { MODKEY|ShiftMask, XK_Down, moveresize, {.v = "0x 0y 0w 25h" } },
- { MODKEY|ShiftMask, XK_Up, moveresize, {.v = "0x 0y 0w -25h" } },
- { MODKEY|ShiftMask, XK_Right, moveresize, {.v = "0x 0y 25w 0h" } },
- { MODKEY|ShiftMask, XK_Left, moveresize, {.v = "0x 0y -25w 0h" } },
+ { MODKEY, XK_Down, moveresize, {.v = "0 25 0 0" } },
+ { MODKEY, XK_Up, moveresize, {.v = "0 -25 0 0" } },
+ { MODKEY, XK_Right, moveresize, {.v = "25 0 0 0" } },
+ { MODKEY, XK_Left, moveresize, {.v = "-25 0 0 0" } },
+ { MODKEY|ShiftMask, XK_Down, moveresize, {.v = "0 0 0 25" } },
+ { MODKEY|ShiftMask, XK_Up, moveresize, {.v = "0 0 0 -25" } },
+ { MODKEY|ShiftMask, XK_Right, moveresize, {.v = "0 0 25 0" } },
+ { MODKEY|ShiftMask, XK_Left, moveresize, {.v = "0 0 -25 0" } },
{ MODKEY|ControlMask, XK_Up, moveresizeedge, {.v = "t"} },
{ MODKEY|ControlMask, XK_Down, moveresizeedge, {.v = "b"} },
{ MODKEY|ControlMask, XK_Left, moveresizeedge, {.v = "l"} },
diff --git a/dwm.c b/dwm.c
index a1da650..80fc7b4 100644
--- a/dwm.c
+++ b/dwm.c
@@ -1342,81 +1342,32 @@ movemouse(const Arg *arg)
void
moveresize(const Arg *arg) {
/* only floating windows can be moved */
- Client *c;
- c = selmon->sel;
- int x, y, w, h, nx, ny, nw, nh, ox, oy, ow, oh;
- char xAbs, yAbs, wAbs, hAbs;
- int msx, msy, dx, dy, nmx, nmy;
- unsigned int dui;
- Window dummy;
+ Client *c = selmon->sel;
+ int x, y, w, h, nx, ny, nw, nh;
if (!c || !arg)
return;
if (selmon->lt[selmon->sellt]->arrange && !c->isfloating)
- return;
- if (sscanf((char *)arg->v, "%d%c %d%c %d%c %d%c", &x, &xAbs, &y, &yAbs, &w, &wAbs, &h, &hAbs) != 8)
+ togglefloating(NULL);
+ if (sscanf((char *)arg->v, "%d %d %d %d", &x, &y, &w, &h) != 4)
return;
- /* compute new window position; prevent window from be positioned outside the current monitor */
nw = c->w + w;
- if (wAbs == 'W')
- nw = w < selmon->mw - 2 * c->bw ? w : selmon->mw - 2 * c->bw;
-
nh = c->h + h;
- if (hAbs == 'H')
- nh = h < selmon->mh - 2 * c->bw ? h : selmon->mh - 2 * c->bw;
-
nx = c->x + x;
- if (xAbs == 'X') {
- if (x < selmon->mx)
- nx = selmon->mx;
- else if (x > selmon->mx + selmon->mw)
- nx = selmon->mx + selmon->mw - nw - 2 * c->bw;
- else
- nx = x;
- }
-
ny = c->y + y;
- if (yAbs == 'Y') {
- if (y < selmon->my)
- ny = selmon->my;
- else if (y > selmon->my + selmon->mh)
- ny = selmon->my + selmon->mh - nh - 2 * c->bw;
- else
- ny = y;
- }
-
- ox = c->x;
- oy = c->y;
- ow = c->w;
- oh = c->h;
XRaiseWindow(dpy, c->win);
- Bool xqp = XQueryPointer(dpy, root, &dummy, &dummy, &msx, &msy, &dx, &dy, &dui);
resize(c, nx, ny, nw, nh, True);
-
- /* move cursor along with the window to avoid problems caused by the sloppy focus */
- if (xqp && ox <= msx && (ox + ow) >= msx && oy <= msy && (oy + oh) >= msy)
- {
- nmx = c->x - ox + c->w - ow;
- nmy = c->y - oy + c->h - oh;
- /* make sure the cursor stays inside the window */
- if ((msx + nmx) > c->x && (msy + nmy) > c->y)
- XWarpPointer(dpy, None, None, 0, 0, 0, 0, nmx, nmy);
- }
}
void
moveresizeedge(const Arg *arg) {
/* move or resize floating window to edge of screen */
- Client *c;
- c = selmon->sel;
+ Client *c = selmon->sel;
char e;
- int nx, ny, nw, nh, ox, oy, ow, oh, bp;
- int msx, msy, dx, dy, nmx, nmy;
+ int nx, ny, nw, nh, bp;
int starty;
- unsigned int dui;
- Window dummy;
nx = c->x;
ny = c->y;
@@ -1429,24 +1380,25 @@ moveresizeedge(const Arg *arg) {
if (!c || !arg)
return;
if (selmon->lt[selmon->sellt]->arrange && !c->isfloating)
- return;
+ togglefloating(NULL);
if(sscanf((char *)arg->v, "%c", &e) != 1)
return;
- if(e == 't')
+ switch(e) {
+ case 't':
ny = starty;
-
- if(e == 'b')
+ break;
+ case 'b':
ny = c->h > selmon->mh - 2 * c->bw ? c->h - bp : selmon->mh - c->h - 2 * c->bw - bp;
-
- if(e == 'l')
+ break;
+ case 'l':
nx = selmon->mx;
-
- if(e == 'r')
+ break;
+ case 'r':
nx = c->w > selmon->mw - 2 * c->bw ? selmon->mx + c->w : selmon->mx + selmon->mw - c->w - 2 * c->bw;
-
- if(e == 'T') {
- /* if you click to resize again, it will return to old size/position */
+ break;
+ /* if you click to resize again, it will return to old size/position */
+ case 'T':
if(c->h + starty == c->oldh + c->oldy) {
nh = c->oldh;
ny = c->oldy;
@@ -1454,12 +1406,11 @@ moveresizeedge(const Arg *arg) {
nh = c->h + c->y - starty;
ny = starty;
}
- }
-
- if(e == 'B')
+ break;
+ case 'B':
nh = c->h + c->y + 2 * c->bw + bp == selmon->mh ? c->oldh : selmon->mh - c->y - 2 * c->bw - bp;
-
- if(e == 'L') {
+ break;
+ case 'L':
if(selmon->mx + c->w == c->oldw + c->oldx) {
nw = c->oldw;
nx = c->oldx;
@@ -1467,28 +1418,14 @@ moveresizeedge(const Arg *arg) {
nw = c->w + c->x - selmon->mx;
nx = selmon->mx;
}
- }
-
- if(e == 'R')
+ break;
+ case 'R':
nw = c->w + c->x + 2 * c->bw == selmon->mx + selmon->mw ? c->oldw : selmon->mx + selmon->mw - c->x - 2 * c->bw;
-
- ox = c->x;
- oy = c->y;
- ow = c->w;
- oh = c->h;
+ break;
+ }
XRaiseWindow(dpy, c->win);
- Bool xqp = XQueryPointer(dpy, root, &dummy, &dummy, &msx, &msy, &dx, &dy, &dui);
resize(c, nx, ny, nw, nh, True);
-
- /* move cursor along with the window to avoid problems caused by the sloppy focus */
- if (xqp && ox <= msx && (ox + ow) >= msx && oy <= msy && (oy + oh) >= msy) {
- nmx = c->x - ox + c->w - ow;
- nmy = c->y - oy + c->h - oh;
- /* make sure the cursor stays inside the window */
- if ((msx + nmx) > c->x && (msy + nmy) > c->y)
- XWarpPointer(dpy, None, None, 0, 0, 0, 0, nmx, nmy);
- }
}
void