You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
1.3 KiB
67 lines
1.3 KiB
3 years ago
|
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);
|
||
|
}
|
||
|
}
|
||
|
|