106 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* drag out an area using slop and resize the selected window to it. */
 | |
| int
 | |
| riodraw(Client *c, const char slopstyle[])
 | |
| {
 | |
| 	int i;
 | |
| 	char str[100];
 | |
| 	char strout[100];
 | |
| 	char tmpstring[30] = {0};
 | |
| 	char slopcmd[100] = "slop -f x%xx%yx%wx%hx ";
 | |
| 	int firstchar = 0;
 | |
| 	int counter = 0;
 | |
| 
 | |
| 	strcat(slopcmd, slopstyle);
 | |
| 	FILE *fp = popen(slopcmd, "r");
 | |
| 
 | |
| 	while (fgets(str, 100, fp) != NULL)
 | |
| 		strcat(strout, str);
 | |
| 
 | |
| 	pclose(fp);
 | |
| 
 | |
| 	if (strlen(strout) < 6)
 | |
| 		return 0;
 | |
| 
 | |
| 	for (i = 0; i < strlen(strout); i++){
 | |
| 		if (!firstchar) {
 | |
| 			if (strout[i] == 'x')
 | |
| 				firstchar = 1;
 | |
| 			continue;
 | |
| 		}
 | |
| 
 | |
| 		if (strout[i] != 'x')
 | |
| 			tmpstring[strlen(tmpstring)] = strout[i];
 | |
| 		else {
 | |
| 			riodimensions[counter] = atoi(tmpstring);
 | |
| 			counter++;
 | |
| 			memset(tmpstring,0,strlen(tmpstring));
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if (riodimensions[0] <= -40 || riodimensions[1] <= -40 || riodimensions[2] <= 50 || riodimensions[3] <= 50) {
 | |
| 		riodimensions[3] = -1;
 | |
| 		return 0;
 | |
| 	}
 | |
| 
 | |
| 	if (c) {
 | |
| 		rioposition(c, riodimensions[0], riodimensions[1], riodimensions[2], riodimensions[3]);
 | |
| 		return 0;
 | |
| 	}
 | |
| 
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| void
 | |
| rioposition(Client *c, int x, int y, int w, int h)
 | |
| {
 | |
| 	Monitor *m;
 | |
| 	if ((m = recttomon(x, y, w, h)) && m != c->mon) {
 | |
| 		detach(c);
 | |
| 		detachstack(c);
 | |
| 		arrange(c->mon);
 | |
| 		c->mon = m;
 | |
| 		c->tags = m->tagset[m->seltags];
 | |
| 		attach(c);
 | |
| 		attachstack(c);
 | |
| 		selmon = m;
 | |
| 		focus(c);
 | |
| 	}
 | |
| 
 | |
| 	c->isfloating = 1;
 | |
| 	if (riodraw_borders)
 | |
| 		resizeclient(c, x, y, w - (c->bw * 2), h - (c->bw * 2));
 | |
| 	else
 | |
| 		resizeclient(c, x - c->bw, y - c->bw, w, h);
 | |
| 	drawbar(c->mon);
 | |
| 	arrange(c->mon);
 | |
| 
 | |
| 	riodimensions[3] = -1;
 | |
| 	riopid = 0;
 | |
| }
 | |
| 
 | |
| /* drag out an area using slop and resize the selected window to it */
 | |
| void
 | |
| rioresize(const Arg *arg)
 | |
| {
 | |
| 	Client *c = (arg && arg->v ? (Client*)arg->v : selmon->sel);
 | |
| 	if (c)
 | |
| 		riodraw(c, slopresizestyle);
 | |
| }
 | |
| 
 | |
| /* Spawn a new window and drag out an area using slop to position it while the window is
 | |
|  * initialising in the background. */
 | |
| void
 | |
| riospawn(const Arg *arg)
 | |
| {
 | |
| 	riopid = spawncmd(arg);
 | |
| 	riodraw(NULL, slopspawnstyle);
 | |
| }
 | |
| 
 | |
| void
 | |
| riospawnsync(const Arg *arg)
 | |
| {
 | |
| 	if (riodraw(NULL, slopspawnstyle))
 | |
| 		riopid = spawncmd(arg);
 | |
| }
 | |
| 
 |