67 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			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);
 | 
						|
	}
 | 
						|
}
 | 
						|
 |