65 lines
No EOL
1.3 KiB
C
65 lines
No EOL
1.3 KiB
C
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);
|
|
}
|
|
} |