dwm.c
changeset 1261 218a33808046
parent 1260 2d3d08d2dd19
child 1262 decf862df839
equal deleted inserted replaced
1260:2d3d08d2dd19 1261:218a33808046
    91 		XFontStruct *xfont;
    91 		XFontStruct *xfont;
    92 	} font;
    92 	} font;
    93 } DC; /* draw context */
    93 } DC; /* draw context */
    94 
    94 
    95 typedef union {
    95 typedef union {
    96 	const char *c;
       
    97 	int i;
    96 	int i;
    98 	uint ui;
    97 	uint ui;
    99 	float f;
    98 	float f;
   100 	void *aux;
    99 	void *v;
   101 } Arg;
   100 } Arg;
   102 
   101 
   103 typedef struct {
   102 typedef struct {
   104 	uint mod;
   103 	uint mod;
   105 	KeySym keysym;
   104 	KeySym keysym;
  1386 	grabkeys();
  1385 	grabkeys();
  1387 }
  1386 }
  1388 
  1387 
  1389 void
  1388 void
  1390 spawn(const Arg *arg) {
  1389 spawn(const Arg *arg) {
  1391 	static char *shell = NULL;
       
  1392 
       
  1393 	if(!shell && !(shell = getenv("SHELL")))
       
  1394 		shell = "/bin/sh";
       
  1395 	/* The double-fork construct avoids zombie processes and keeps the code
  1390 	/* The double-fork construct avoids zombie processes and keeps the code
  1396 	 * clean from stupid signal handlers. */
  1391 	 * clean from stupid signal handlers. */
  1397 	if(fork() == 0) {
  1392 	if(fork() == 0) {
  1398 		if(fork() == 0) {
  1393 		if(fork() == 0) {
  1399 			if(dpy)
  1394 			if(dpy)
  1400 				close(ConnectionNumber(dpy));
  1395 				close(ConnectionNumber(dpy));
  1401 			setsid();
  1396 			setsid();
  1402 			execl(shell, shell, "-c", arg->c, (char *)NULL);
  1397 			execvp(((char **)arg->v)[0], (char **)arg->v);
  1403 			fprintf(stderr, "dwm: execl '%s -c %s'", shell, arg->c);
  1398 			fprintf(stderr, "dwm: execvp %s", ((char **)arg->v)[0]);
  1404 			perror(" failed");
  1399 			perror(" failed");
  1405 		}
  1400 		}
  1406 		exit(0);
  1401 		exit(0);
  1407 	}
  1402 	}
  1408 	wait(0);
  1403 	wait(0);
  1479 	arrange();
  1474 	arrange();
  1480 }
  1475 }
  1481 
  1476 
  1482 void
  1477 void
  1483 togglelayout(const Arg *arg) {
  1478 togglelayout(const Arg *arg) {
  1484 	uint i;
  1479 	if(++lt == &layouts[LENGTH(layouts)])
  1485 
  1480 		lt = &layouts[0];
  1486 	if(!arg->c) {
       
  1487 		if(++lt == &layouts[LENGTH(layouts)])
       
  1488 			lt = &layouts[0];
       
  1489 	}
       
  1490 	else {
       
  1491 		for(i = 0; i < LENGTH(layouts); i++)
       
  1492 			if(!strcmp(arg->c, layouts[i].symbol))
       
  1493 				break;
       
  1494 		if(i == LENGTH(layouts))
       
  1495 			return;
       
  1496 		lt = &layouts[i];
       
  1497 	}
       
  1498 	if(sel)
  1481 	if(sel)
  1499 		arrange();
  1482 		arrange();
  1500 	else
  1483 	else
  1501 		drawbar();
  1484 		drawbar();
  1502 }
  1485 }