tabbed/xembed.c
Connor Lane Smith d60069a3e7 add xembed wrapper utility
xembed will cause a command to attempt to XEmbed into the window given
by the environment variable XEMBED, so long as it is in the foreground
of its controlling terminal. This causes a process to effectively take
the place of the terminal window, unless it is backgrounded.

Signed-off-by: Christoph Lohmann <20h@r-36.net>
2015-05-09 20:03:08 +02:00

47 lines
690 B
C

/*
* See LICENSE file for copyright and license details.
*/
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int
main(int argc, char **argv)
{
char *xembed;
int tty;
pid_t pgrp, tcpgrp;
if(argc < 3) {
fprintf(stderr, "usage: %s flag cmd ...\n", argv[0]);
return 2;
}
if(!(xembed = getenv("XEMBED")))
goto noembed;
if((tty = open("/dev/tty", O_RDONLY)) < 0)
goto noembed;
pgrp = getpgrp();
tcpgrp = tcgetpgrp(tty);
close(tty);
if(pgrp == tcpgrp) { /* in foreground of tty */
argv[0] = argv[2];
argv[2] = xembed;
}
else {
noembed:
argv += 2;
}
execvp(argv[0], argv);
perror(argv[0]); /* failed to execute */
return 1;
}