Introduction
Introduction Statistics Contact Development Disclaimer Help
add xembed wrapper utility - tabbed - tab interface for application supporting …
git clone git://git.suckless.org/tabbed
Log
Files
Refs
README
LICENSE
---
commit d60069a3e7a9e382f3221f8e405ad8c05abeea20
parent 0728caee306423cd1dc139e000828329c9285ab7
Author: Connor Lane Smith <[email protected]>
Date: Wed, 6 May 2015 17:46:10 +0100
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 <[email protected]>
Diffstat:
M LICENSE | 4 ++--
M Makefile | 25 +++++++++++++++----------
M tabbed.1 | 4 ++--
A xembed.1 | 35 +++++++++++++++++++++++++++++…
A xembed.c | 46 +++++++++++++++++++++++++++++…
5 files changed, 100 insertions(+), 14 deletions(-)
---
diff --git a/LICENSE b/LICENSE
@@ -1,8 +1,8 @@
MIT/X Consortium License
© 2009-2011 Enno Boland <g s01 de>
-© 2011 Connor Lane Smith <[email protected]>
-© 2012-2014 Christoph Lohmann <[email protected]>
+© 2011,2015 Connor Lane Smith <[email protected]>
+© 2012-2015 Christoph Lohmann <[email protected]>
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
diff --git a/Makefile b/Makefile
@@ -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…
@chmod 644 ${DESTDIR}${MANPREFIX}/man1/tabbed.1
+ @sed "s/VERSION/${VERSION}/g" < xembed.1 > ${DESTDIR}${MANPREFIX}/man1…
+ @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
diff --git a/tabbed.1 b/tabbed.1
@@ -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.
-
diff --git a/xembed.1 b/xembed.1
@@ -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.
diff --git a/xembed.c b/xembed.c
@@ -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;
+}
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.