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:
parent
0728caee30
commit
d60069a3e7
4
LICENSE
4
LICENSE
|
@ -1,8 +1,8 @@
|
||||||
MIT/X Consortium License
|
MIT/X Consortium License
|
||||||
|
|
||||||
© 2009-2011 Enno Boland <g s01 de>
|
© 2009-2011 Enno Boland <g s01 de>
|
||||||
© 2011 Connor Lane Smith <cls@lubutu.com>
|
© 2011,2015 Connor Lane Smith <cls@lubutu.com>
|
||||||
© 2012-2014 Christoph Lohmann <20h@r-36.net>
|
© 2012-2015 Christoph Lohmann <20h@r-36.net>
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
copy of this software and associated documentation files (the "Software"),
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
|
25
Makefile
25
Makefile
|
@ -3,10 +3,11 @@
|
||||||
|
|
||||||
include config.mk
|
include config.mk
|
||||||
|
|
||||||
SRC = tabbed.c
|
SRC = tabbed.c xembed.c
|
||||||
OBJ = ${SRC:.c=.o}
|
OBJ = ${SRC:.c=.o}
|
||||||
|
BIN = ${OBJ:.o=}
|
||||||
|
|
||||||
all: options tabbed
|
all: options ${BIN}
|
||||||
|
|
||||||
options:
|
options:
|
||||||
@echo tabbed build options:
|
@echo tabbed build options:
|
||||||
|
@ -24,13 +25,13 @@ config.h:
|
||||||
@echo creating $@ from config.def.h
|
@echo creating $@ from config.def.h
|
||||||
@cp config.def.h $@
|
@cp config.def.h $@
|
||||||
|
|
||||||
tabbed: tabbed.o
|
.o:
|
||||||
@echo CC -o $@
|
@echo CC -o $@
|
||||||
@${CC} -o $@ tabbed.o ${LDFLAGS}
|
@${CC} -o $@ $< ${LDFLAGS}
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@echo cleaning
|
@echo cleaning
|
||||||
@rm -f tabbed ${OBJ} tabbed-${VERSION}.tar.gz
|
@rm -f ${BIN} ${OBJ} tabbed-${VERSION}.tar.gz
|
||||||
|
|
||||||
dist: clean
|
dist: clean
|
||||||
@echo creating dist tarball
|
@echo creating dist tarball
|
||||||
|
@ -42,19 +43,23 @@ dist: clean
|
||||||
@rm -rf tabbed-${VERSION}
|
@rm -rf tabbed-${VERSION}
|
||||||
|
|
||||||
install: all
|
install: all
|
||||||
@echo installing executable file to ${DESTDIR}${PREFIX}/bin
|
@echo installing executable files to ${DESTDIR}${PREFIX}/bin
|
||||||
@mkdir -p ${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
|
@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
|
@mkdir -p ${DESTDIR}${MANPREFIX}/man1
|
||||||
@sed "s/VERSION/${VERSION}/g" < tabbed.1 > ${DESTDIR}${MANPREFIX}/man1/tabbed.1
|
@sed "s/VERSION/${VERSION}/g" < tabbed.1 > ${DESTDIR}${MANPREFIX}/man1/tabbed.1
|
||||||
@chmod 644 ${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:
|
uninstall:
|
||||||
@echo removing executable file from ${DESTDIR}${PREFIX}/bin
|
@echo removing executable files from ${DESTDIR}${PREFIX}/bin
|
||||||
@rm -f ${DESTDIR}${PREFIX}/bin/tabbed
|
@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/tabbed.1
|
||||||
|
@rm -f ${DESTDIR}${MANPREFIX}/man1/xembed.1
|
||||||
|
|
||||||
.PHONY: all options clean dist install uninstall
|
.PHONY: all options clean dist install uninstall
|
||||||
|
|
4
tabbed.1
4
tabbed.1
|
@ -156,7 +156,7 @@ See the LICENSE file for the authors.
|
||||||
.SH LICENSE
|
.SH LICENSE
|
||||||
See the LICENSE file for the terms of redistribution.
|
See the LICENSE file for the terms of redistribution.
|
||||||
.SH SEE ALSO
|
.SH SEE ALSO
|
||||||
.BR st (1)
|
.BR st (1),
|
||||||
|
.BR xembed (1)
|
||||||
.SH BUGS
|
.SH BUGS
|
||||||
Please report them.
|
Please report them.
|
||||||
|
|
||||||
|
|
35
xembed.1
Normal file
35
xembed.1
Normal 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
46
xembed.c
Normal 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;
|
||||||
|
}
|
Loading…
Reference in a new issue