equal
deleted
inserted
replaced
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 } |