move windows with vim bindings
This commit is contained in:
@@ -109,6 +109,10 @@ static const Key keys[] = {
|
|||||||
{ MODKEY, XK_b, togglebar, {0} },
|
{ MODKEY, XK_b, togglebar, {0} },
|
||||||
{ MODKEY, XK_j, focusstack, {.i = +1 } },
|
{ MODKEY, XK_j, focusstack, {.i = +1 } },
|
||||||
{ MODKEY, XK_k, focusstack, {.i = -1 } },
|
{ MODKEY, XK_k, focusstack, {.i = -1 } },
|
||||||
|
{ MODKEY, XK_Left, focusdir, {.i = 0 } }, // left
|
||||||
|
{ MODKEY, XK_Right, focusdir, {.i = 1 } }, // right
|
||||||
|
{ MODKEY, XK_Up, focusdir, {.i = 2 } }, // up
|
||||||
|
{ MODKEY, XK_Down, focusdir, {.i = 3 } }, // down
|
||||||
{ MODKEY, XK_i, incnmaster, {.i = +1 } },
|
{ MODKEY, XK_i, incnmaster, {.i = +1 } },
|
||||||
{ MODKEY, XK_d, incnmaster, {.i = -1 } },
|
{ MODKEY, XK_d, incnmaster, {.i = -1 } },
|
||||||
{ MODKEY, XK_h, setmfact, {.f = -0.05} },
|
{ MODKEY, XK_h, setmfact, {.f = -0.05} },
|
||||||
|
|||||||
@@ -1,25 +1,13 @@
|
|||||||
--- config.def.h
|
--- config.def.h
|
||||||
+++ config.def.h
|
+++ config.def.h
|
||||||
@@ -3,6 +3,7 @@
|
@@ -67,6 +67,10 @@ static const Key keys[] = {
|
||||||
/* appearance */
|
{ MODKEY, XK_b, togglebar, {0} },
|
||||||
static const unsigned int borderpx = 1; /* border pixel of windows */
|
{ MODKEY, XK_j, focusstack, {.i = +1 } },
|
||||||
static const unsigned int snap = 32; /* snap pixel */
|
{ MODKEY, XK_k, focusstack, {.i = -1 } },
|
||||||
+static const int swallowfloating = 0; /* 1 means swallow floating windows by default */
|
+ { MODKEY|ControlMask, XK_Left, placedir, {.i = 0 } }, // left
|
||||||
static const int showbar = 1; /* 0 means no bar */
|
+ { MODKEY|ControlMask, XK_Right, placedir, {.i = 1 } }, // right
|
||||||
static const int topbar = 1; /* 0 means bottom bar */
|
+ { MODKEY|ControlMask, XK_Up, placedir, {.i = 2 } }, // up
|
||||||
static const char *fonts[] = { "monospace:size=10" };
|
+ { MODKEY|ControlMask, XK_Down, placedir, {.i = 3 } }, // down
|
||||||
@@ -26,9 +27,11 @@ static const Rule rules[] = {
|
{ MODKEY, XK_i, incnmaster, {.i = +1 } },
|
||||||
* WM_CLASS(STRING) = instance, class
|
{ MODKEY, XK_d, incnmaster, {.i = -1 } },
|
||||||
* WM_NAME(STRING) = title
|
{ MODKEY, XK_h, setmfact, {.f = -0.05} },
|
||||||
*/
|
|
||||||
- /* class instance title tags mask isfloating monitor */
|
|
||||||
- { "Gimp", NULL, NULL, 0, 1, -1 },
|
|
||||||
- { "Firefox", NULL, NULL, 1 << 8, 0, -1 },
|
|
||||||
+ /* class instance title tags mask isfloating isterminal noswallow monitor */
|
|
||||||
+ { "Gimp", NULL, NULL, 0, 1, 0, 0, -1 },
|
|
||||||
+ { "Firefox", NULL, NULL, 1 << 8, 0, 0, -1, -1 },
|
|
||||||
+ { "St", NULL, NULL, 0, 0, 1, 0, -1 },
|
|
||||||
+ { NULL, NULL, "Event Tester", 0, 0, 0, 1, -1 }, /* xev */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* layout(s) */
|
|
||||||
|
|||||||
10
config.h
10
config.h
@@ -123,10 +123,14 @@ static const Key keys[] = {
|
|||||||
{ MODKEY, XK_i, incnmaster, {.i = +1 } },
|
{ MODKEY, XK_i, incnmaster, {.i = +1 } },
|
||||||
{ MODKEY, XK_p, incnmaster, {.i = -1 } },
|
{ MODKEY, XK_p, incnmaster, {.i = -1 } },
|
||||||
|
|
||||||
{ MODKEY, XK_h, focusdir, {.i = 0} },
|
{ MODKEY, XK_h, focusdir, {.i = 0 } },
|
||||||
{ MODKEY, XK_k, focusdir, {.i = 1 } },
|
{ MODKEY, XK_l, focusdir, {.i = 1 } },
|
||||||
{ MODKEY, XK_l, focusdir, {.i = 2 } },
|
{ MODKEY, XK_k, focusdir, {.i = 2 } },
|
||||||
{ MODKEY, XK_j, focusdir, {.i = 3 } },
|
{ MODKEY, XK_j, focusdir, {.i = 3 } },
|
||||||
|
{ MODKEY|ShiftMask, XK_h, placedir, {.i = 0 } },
|
||||||
|
{ MODKEY|ShiftMask, XK_l, placedir, {.i = 1 } },
|
||||||
|
{ MODKEY|ShiftMask, XK_k, placedir, {.i = 2 } },
|
||||||
|
{ MODKEY|ShiftMask, XK_j, placedir, {.i = 3 } },
|
||||||
|
|
||||||
{ MODKEY|ShiftMask, XK_h, setcfact, {.f = +0.25} },
|
{ MODKEY|ShiftMask, XK_h, setcfact, {.f = +0.25} },
|
||||||
{ MODKEY|ShiftMask, XK_l, setcfact, {.f = -0.25} },
|
{ MODKEY|ShiftMask, XK_l, setcfact, {.f = -0.25} },
|
||||||
|
|||||||
98
dwm.c
98
dwm.c
@@ -228,6 +228,7 @@ static void motionnotify(XEvent *e);
|
|||||||
static void movemouse(const Arg *arg);
|
static void movemouse(const Arg *arg);
|
||||||
static Client *nexttagged(Client *c);
|
static Client *nexttagged(Client *c);
|
||||||
static Client *nexttiled(Client *c);
|
static Client *nexttiled(Client *c);
|
||||||
|
static void placedir(const Arg *arg);
|
||||||
static void pop(Client *c);
|
static void pop(Client *c);
|
||||||
static void propertynotify(XEvent *e);
|
static void propertynotify(XEvent *e);
|
||||||
static void quit(const Arg *arg);
|
static void quit(const Arg *arg);
|
||||||
@@ -1577,6 +1578,103 @@ nexttiled(Client *c)
|
|||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
placedir(const Arg *arg)
|
||||||
|
{
|
||||||
|
Client *s = selmon->sel, *f = NULL, *c, *next, *fprior, *sprior;
|
||||||
|
|
||||||
|
if (!s || s->isfloating)
|
||||||
|
return;
|
||||||
|
|
||||||
|
unsigned int score = -1;
|
||||||
|
unsigned int client_score;
|
||||||
|
int dist;
|
||||||
|
int dirweight = 20;
|
||||||
|
|
||||||
|
next = s->next;
|
||||||
|
if (!next)
|
||||||
|
next = s->mon->clients;
|
||||||
|
for (c = next; c != s; c = next) {
|
||||||
|
|
||||||
|
next = c->next;
|
||||||
|
if (!next)
|
||||||
|
next = s->mon->clients;
|
||||||
|
|
||||||
|
if (!ISVISIBLE(c)) // || HIDDEN(c)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
switch (arg->i) {
|
||||||
|
case 0: // left
|
||||||
|
dist = s->x - c->x - c->w;
|
||||||
|
client_score =
|
||||||
|
dirweight * MIN(abs(dist), abs(dist + s->mon->ww)) +
|
||||||
|
abs(s->y - c->y);
|
||||||
|
break;
|
||||||
|
case 1: // right
|
||||||
|
dist = c->x - s->x - s->w;
|
||||||
|
client_score =
|
||||||
|
dirweight * MIN(abs(dist), abs(dist + s->mon->ww)) +
|
||||||
|
abs(c->y - s->y);
|
||||||
|
break;
|
||||||
|
case 2: // up
|
||||||
|
dist = s->y - c->y - c->h;
|
||||||
|
client_score =
|
||||||
|
dirweight * MIN(abs(dist), abs(dist + s->mon->wh)) +
|
||||||
|
abs(s->x - c->x);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
case 3: // down
|
||||||
|
dist = c->y - s->y - s->h;
|
||||||
|
client_score =
|
||||||
|
dirweight * MIN(abs(dist), abs(dist + s->mon->wh)) +
|
||||||
|
abs(c->x - s->x);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (((arg->i == 0 || arg->i == 2) && client_score <= score) || client_score < score) {
|
||||||
|
score = client_score;
|
||||||
|
f = c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (f && f != s) {
|
||||||
|
for (fprior = f->mon->clients; fprior && fprior->next != f; fprior = fprior->next);
|
||||||
|
for (sprior = s->mon->clients; sprior && sprior->next != s; sprior = sprior->next);
|
||||||
|
|
||||||
|
if (s == fprior) {
|
||||||
|
next = f->next;
|
||||||
|
if (sprior)
|
||||||
|
sprior->next = f;
|
||||||
|
else
|
||||||
|
f->mon->clients = f;
|
||||||
|
f->next = s;
|
||||||
|
s->next = next;
|
||||||
|
} else if (f == sprior) {
|
||||||
|
next = s->next;
|
||||||
|
if (fprior)
|
||||||
|
fprior->next = s;
|
||||||
|
else
|
||||||
|
s->mon->clients = s;
|
||||||
|
s->next = f;
|
||||||
|
f->next = next;
|
||||||
|
} else { // clients are not adjacent to each other
|
||||||
|
next = f->next;
|
||||||
|
f->next = s->next;
|
||||||
|
s->next = next;
|
||||||
|
if (fprior)
|
||||||
|
fprior->next = s;
|
||||||
|
else
|
||||||
|
s->mon->clients = s;
|
||||||
|
if (sprior)
|
||||||
|
sprior->next = f;
|
||||||
|
else
|
||||||
|
f->mon->clients = f;
|
||||||
|
}
|
||||||
|
|
||||||
|
arrange(f->mon);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
pop(Client *c)
|
pop(Client *c)
|
||||||
{
|
{
|
||||||
|
|||||||
67
dwm.c.orig
67
dwm.c.orig
@@ -206,6 +206,7 @@ static void drawbars(void);
|
|||||||
static void enternotify(XEvent *e);
|
static void enternotify(XEvent *e);
|
||||||
static void expose(XEvent *e);
|
static void expose(XEvent *e);
|
||||||
static void focus(Client *c);
|
static void focus(Client *c);
|
||||||
|
static void focusdir(const Arg *arg);
|
||||||
static void focusin(XEvent *e);
|
static void focusin(XEvent *e);
|
||||||
static void focusmon(const Arg *arg);
|
static void focusmon(const Arg *arg);
|
||||||
static void focusstack(const Arg *arg);
|
static void focusstack(const Arg *arg);
|
||||||
@@ -1051,6 +1052,72 @@ focus(Client *c)
|
|||||||
drawbars();
|
drawbars();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
focusdir(const Arg *arg)
|
||||||
|
{
|
||||||
|
Client *s = selmon->sel, *f = NULL, *c, *next;
|
||||||
|
|
||||||
|
if (!s)
|
||||||
|
return;
|
||||||
|
|
||||||
|
unsigned int score = -1;
|
||||||
|
unsigned int client_score;
|
||||||
|
int dist;
|
||||||
|
int dirweight = 20;
|
||||||
|
int isfloating = s->isfloating;
|
||||||
|
|
||||||
|
next = s->next;
|
||||||
|
if (!next)
|
||||||
|
next = s->mon->clients;
|
||||||
|
for (c = next; c != s; c = next) {
|
||||||
|
|
||||||
|
next = c->next;
|
||||||
|
if (!next)
|
||||||
|
next = s->mon->clients;
|
||||||
|
|
||||||
|
if (!ISVISIBLE(c) || c->isfloating != isfloating) // || HIDDEN(c)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
switch (arg->i) {
|
||||||
|
case 0: // left
|
||||||
|
dist = s->x - c->x - c->w;
|
||||||
|
client_score =
|
||||||
|
dirweight * MIN(abs(dist), abs(dist + s->mon->ww)) +
|
||||||
|
abs(s->y - c->y);
|
||||||
|
break;
|
||||||
|
case 1: // right
|
||||||
|
dist = c->x - s->x - s->w;
|
||||||
|
client_score =
|
||||||
|
dirweight * MIN(abs(dist), abs(dist + s->mon->ww)) +
|
||||||
|
abs(c->y - s->y);
|
||||||
|
break;
|
||||||
|
case 2: // up
|
||||||
|
dist = s->y - c->y - c->h;
|
||||||
|
client_score =
|
||||||
|
dirweight * MIN(abs(dist), abs(dist + s->mon->wh)) +
|
||||||
|
abs(s->x - c->x);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
case 3: // down
|
||||||
|
dist = c->y - s->y - s->h;
|
||||||
|
client_score =
|
||||||
|
dirweight * MIN(abs(dist), abs(dist + s->mon->wh)) +
|
||||||
|
abs(c->x - s->x);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (((arg->i == 0 || arg->i == 2) && client_score <= score) || client_score < score) {
|
||||||
|
score = client_score;
|
||||||
|
f = c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (f && f != s) {
|
||||||
|
focus(f);
|
||||||
|
restack(f->mon);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* there are some broken focus acquiring clients needing extra handling */
|
/* there are some broken focus acquiring clients needing extra handling */
|
||||||
void
|
void
|
||||||
focusin(XEvent *e)
|
focusin(XEvent *e)
|
||||||
|
|||||||
Reference in New Issue
Block a user