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>
This commit is contained in:
Connor Lane Smith 2015-05-06 17:46:10 +01:00 committed by Christoph Lohmann
parent 0728caee30
commit d60069a3e7
5 changed files with 100 additions and 14 deletions

View file

@ -1,8 +1,8 @@
MIT/X Consortium License
© 2009-2011 Enno Boland <g s01 de>
© 2011 Connor Lane Smith <cls@lubutu.com>
© 2012-2014 Christoph Lohmann <20h@r-36.net>
© 2011,2015 Connor Lane Smith <cls@lubutu.com>
© 2012-2015 Christoph Lohmann <20h@r-36.net>
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),

View file

@ -3,10 +3,11 @@
include config.mk
SRC = tabbed.c
SRC = tabbed.c xembed.c
OBJ = ${SRC:.c=.o}
BIN = ${OBJ:.o=}
all: options tabbed
all: options ${BIN}
options:
@echo tabbed build options:
@ -24,13 +25,13 @@ config.h:
@echo creating $@ from config.def.h
@cp config.def.h $@
tabbed: tabbed.o
.o:
@echo CC -o $@
@${CC} -o $@ tabbed.o ${LDFLAGS}
@${CC} -o $@ $< ${LDFLAGS}
clean:
@echo cleaning
@rm -f tabbed ${OBJ} tabbed-${VERSION}.tar.gz
@rm -f ${BIN} ${OBJ} tabbed-${VERSION}.tar.gz
dist: clean
@echo creating dist tarball
@ -42,19 +43,23 @@ dist: clean
@rm -rf tabbed-${VERSION}
install: all
@echo installing executable file to ${DESTDIR}${PREFIX}/bin
@echo installing executable files to ${DESTDIR}${PREFIX}/bin
@mkdir -p ${DESTDIR}${PREFIX}/bin
@cp -f tabbed ${DESTDIR}${PREFIX}/bin
@cp -f ${BIN} ${DESTDIR}${PREFIX}/bin
@chmod 755 ${DESTDIR}${PREFIX}/bin/tabbed
@echo installing manual page to ${DESTDIR}${MANPREFIX}/man1
@echo installing manual pages to ${DESTDIR}${MANPREFIX}/man1
@mkdir -p ${DESTDIR}${MANPREFIX}/man1
@sed "s/VERSION/${VERSION}/g" < tabbed.1 > ${DESTDIR}${MANPREFIX}/man1/tabbed.1
@chmod 644 ${DESTDIR}${MANPREFIX}/man1/tabbed.1
@sed "s/VERSION/${VERSION}/g" < xembed.1 > ${DESTDIR}${MANPREFIX}/man1/xembed.1
@chmod 644 ${DESTDIR}${MANPREFIX}/man1/xembed.1
uninstall:
@echo removing executable file from ${DESTDIR}${PREFIX}/bin
@echo removing executable files from ${DESTDIR}${PREFIX}/bin
@rm -f ${DESTDIR}${PREFIX}/bin/tabbed
@echo removing manual page from ${DESTDIR}${MANPREFIX}/man1
@rm -f ${DESTDIR}${PREFIX}/bin/xembed
@echo removing manual pages from ${DESTDIR}${MANPREFIX}/man1
@rm -f ${DESTDIR}${MANPREFIX}/man1/tabbed.1
@rm -f ${DESTDIR}${MANPREFIX}/man1/xembed.1
.PHONY: all options clean dist install uninstall

View file

@ -156,7 +156,7 @@ See the LICENSE file for the authors.
.SH LICENSE
See the LICENSE file for the terms of redistribution.
.SH SEE ALSO
.BR st (1)
.BR st (1),
.BR xembed (1)
.SH BUGS
Please report them.

35
xembed.1 Normal file
View file

@ -0,0 +1,35 @@
.TH XEMBED 1 tabbed\-VERSION
.SH NAME
xembed \- XEmbed foreground process
.SH SYNOPSIS
.B xembed
.I flag command
.RI [ "argument ..." ]
.SH DESCRIPTION
If the environment variable XEMBED is set, and
.B xembed
is in the foreground of its controlling tty, it will execute
.IP
command flag $XEMBED [argument ...]
.LP
Otherwise it will execute
.IP
command [argument ...]
.LP
.SH EXAMPLE
In a terminal emulator within a
.B tabbed
session, the shell alias
.IP
$ alias surf='xembed -e surf'
.LP
will cause `surf' to open in a new tab, unless it is run in the background,
i.e. `surf &', in which case it will instead open in a new window.
.SH AUTHORS
See the LICENSE file for the authors.
.SH LICENSE
See the LICENSE file for the terms of redistribution.
.SH SEE ALSO
.BR tabbed (1)
.SH BUGS
Please report them.

46
xembed.c Normal file
View file

@ -0,0 +1,46 @@
/*
* 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;
}