diff options
| author | Warrick Lo <warrick.s.z.lo@gmail.com> | 2021-11-24 18:30:32 -0800 |
|---|---|---|
| committer | Warrick Lo <warrick.s.z.lo@gmail.com> | 2021-11-24 18:30:32 -0800 |
| commit | 160f58b959f81d4fb8d2910ee7ce8b82809aa127 (patch) | |
| tree | 4cfb3e13ffcdfcb60151cd1ce0efd9f1fb5f8c0a | |
| parent | Allow 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.h | 16 | ||||
| -rw-r--r-- | dwm.c | 115 |
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"} }, @@ -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 |