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.
66 lines
1.3 KiB
66 lines
1.3 KiB
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); |
|
} |
|
} |
|
|
|
|