04a194c013
There is a compatibility issue between the dwm swallow patch and the newterm patch for st. The swallow patch identifies the terminal client to substitute by traversing the process tree checking if the new window is a descendant of a terminal client. The newterm patch for st spawns a new terminal that is a descendant of the parent st process. This can lead to situations where the swallow patch ends up replacing the wrong terminal window. Changed the forking mechanism to do a double fork and letting the first one die. This is a technique commonly used by daemons to spawn new orphan processes.
30 lines
496 B
C
30 lines
496 B
C
void
|
|
newterm(const Arg* a)
|
|
{
|
|
int res;
|
|
switch (fork()) {
|
|
case -1:
|
|
die("fork failed: %s\n", strerror(errno));
|
|
break;
|
|
case 0:
|
|
switch (fork()) {
|
|
case -1:
|
|
die("fork failed: %s\n", strerror(errno));
|
|
break;
|
|
case 0:
|
|
res = chdir(getcwd_by_pid(pid));
|
|
execlp("st", "./st", NULL);
|
|
break;
|
|
default:
|
|
exit(0);
|
|
}
|
|
default:
|
|
wait(NULL);
|
|
}
|
|
}
|
|
|
|
static char *getcwd_by_pid(pid_t pid) {
|
|
char buf[32];
|
|
snprintf(buf, sizeof buf, "/proc/%d/cwd", pid);
|
|
return realpath(buf, NULL);
|
|
} |