first commit

This commit is contained in:
Maddie H 2022-02-25 16:27:27 +00:00
commit 0f0ad5dfdc
17 changed files with 1948 additions and 0 deletions

23
LICENSE Normal file
View File

@ -0,0 +1,23 @@
MIT/X Consortium License
© 2009-2011 Enno Boland <g s01 de>
© 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"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.

65
Makefile Normal file
View File

@ -0,0 +1,65 @@
# tabbed - tabbing interface
# See LICENSE file for copyright and license details.
include config.mk
SRC = tabbed.c xembed.c
OBJ = ${SRC:.c=.o}
BIN = ${OBJ:.o=}
all: options ${BIN}
options:
@echo tabbed build options:
@echo "CFLAGS = ${CFLAGS}"
@echo "LDFLAGS = ${LDFLAGS}"
@echo "CC = ${CC}"
.c.o:
@echo CC $<
@${CC} -c ${CFLAGS} $<
${OBJ}: config.h config.mk
config.h:
@echo creating $@ from config.def.h
@cp config.def.h $@
.o:
@echo CC -o $@
@${CC} -o $@ $< ${LDFLAGS}
clean:
@echo cleaning
@rm -f ${BIN} ${OBJ} tabbed-${VERSION}.tar.gz
dist: clean
@echo creating dist tarball
@mkdir -p tabbed-${VERSION}
@cp -R LICENSE Makefile README config.def.h config.mk \
tabbed.1 arg.h ${SRC} tabbed-${VERSION}
@tar -cf tabbed-${VERSION}.tar tabbed-${VERSION}
@gzip tabbed-${VERSION}.tar
@rm -rf tabbed-${VERSION}
install: all
@echo installing executable files to ${DESTDIR}${PREFIX}/bin
@mkdir -p "${DESTDIR}${PREFIX}/bin"
@cp -f ${BIN} "${DESTDIR}${PREFIX}/bin"
@chmod 755 "${DESTDIR}${PREFIX}/bin/tabbed"
@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 files from ${DESTDIR}${PREFIX}/bin
@rm -f "${DESTDIR}${PREFIX}/bin/tabbed"
@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

22
README Normal file
View File

@ -0,0 +1,22 @@
tabbed - generic tabbed interface
=================================
tabbed is a simple tabbed X window container.
Requirements
------------
In order to build tabbed you need the Xlib header files.
Installation
------------
Edit config.mk to match your local setup (tabbed is installed into
the /usr/local namespace by default).
Afterwards enter the following command to build and install tabbed
(if necessary as root):
make clean install
Running tabbed
--------------
See the man page for details.

2
README.md Normal file
View File

@ -0,0 +1,2 @@
# tabbed
# tabbed

4
TODO Normal file
View File

@ -0,0 +1,4 @@
# TODO
* add some way to detach windows
* add some way to attach windows

48
arg.h Normal file
View File

@ -0,0 +1,48 @@
/*
* Copy me if you can.
* by 20h
*/
#ifndef ARG_H__
#define ARG_H__
extern char *argv0;
/* use main(int argc, char *argv[]) */
#define ARGBEGIN for (argv0 = *argv, argv++, argc--;\
argv[0] && argv[0][0] == '-'\
&& argv[0][1];\
argc--, argv++) {\
char argc_;\
char **argv_;\
int brk_;\
if (argv[0][1] == '-' && argv[0][2] == '\0') {\
argv++;\
argc--;\
break;\
}\
for (brk_ = 0, argv[0]++, argv_ = argv;\
argv[0][0] && !brk_;\
argv[0]++) {\
if (argv_ != argv)\
break;\
argc_ = argv[0][0];\
switch (argc_)
#define ARGEND }\
}
#define ARGC() argc_
#define EARGF(x) ((argv[0][1] == '\0' && argv[1] == NULL)?\
((x), abort(), (char *)0) :\
(brk_ = 1, (argv[0][1] != '\0')?\
(&argv[0][1]) :\
(argc--, argv++, argv[0])))
#define ARGF() ((argv[0][1] == '\0' && argv[1] == NULL)?\
(char *)0 :\
(brk_ = 1, (argv[0][1] != '\0')?\
(&argv[0][1]) :\
(argc--, argv++, argv[0])))
#endif

66
config.def.h Normal file
View File

@ -0,0 +1,66 @@
/* See LICENSE file for copyright and license details. */
/* appearance */
static const char font[] = "monospace:size=9";
static const char* normbgcolor = "#222222";
static const char* normfgcolor = "#cccccc";
static const char* selbgcolor = "#555555";
static const char* selfgcolor = "#ffffff";
static const char* urgbgcolor = "#111111";
static const char* urgfgcolor = "#cc0000";
static const char before[] = "<";
static const char after[] = ">";
static const char titletrim[] = "...";
static const int tabwidth = 200;
static const Bool foreground = True;
static Bool urgentswitch = False;
/*
* Where to place a new tab when it is opened. When npisrelative is True,
* then the current position is changed + newposition. If npisrelative
* is False, then newposition is an absolute position.
*/
static int newposition = 0;
static Bool npisrelative = False;
#define SETPROP(p) { \
.v = (char *[]){ "/bin/sh", "-c", \
"prop=\"`xwininfo -children -id $1 | grep '^ 0x' |" \
"sed -e's@^ *\\(0x[0-9a-f]*\\) \"\\([^\"]*\\)\".*@\\1 \\2@' |" \
"xargs -0 printf %b | dmenu -l 10 -w $1`\" &&" \
"xprop -id $1 -f $0 8s -set $0 \"$prop\"", \
p, winid, NULL \
} \
}
#define MODKEY ControlMask
static Key keys[] = {
/* modifier key function argument */
{ MODKEY|ShiftMask, XK_Return, focusonce, { 0 } },
{ MODKEY|ShiftMask, XK_Return, spawn, { 0 } },
{ MODKEY|ShiftMask, XK_l, rotate, { .i = +1 } },
{ MODKEY|ShiftMask, XK_h, rotate, { .i = -1 } },
{ MODKEY|ShiftMask, XK_j, movetab, { .i = -1 } },
{ MODKEY|ShiftMask, XK_k, movetab, { .i = +1 } },
{ MODKEY, XK_Tab, rotate, { .i = 0 } },
{ MODKEY, XK_grave, spawn, SETPROP("_TABBED_SELECT_TAB") },
{ MODKEY, XK_1, move, { .i = 0 } },
{ MODKEY, XK_2, move, { .i = 1 } },
{ MODKEY, XK_3, move, { .i = 2 } },
{ MODKEY, XK_4, move, { .i = 3 } },
{ MODKEY, XK_5, move, { .i = 4 } },
{ MODKEY, XK_6, move, { .i = 5 } },
{ MODKEY, XK_7, move, { .i = 6 } },
{ MODKEY, XK_8, move, { .i = 7 } },
{ MODKEY, XK_9, move, { .i = 8 } },
{ MODKEY, XK_0, move, { .i = 9 } },
{ MODKEY, XK_q, killclient, { 0 } },
{ MODKEY, XK_u, focusurgent, { 0 } },
{ MODKEY|ShiftMask, XK_u, toggle, { .v = (void*) &urgentswitch } },
{ 0, XK_F11, fullscreen, { 0 } },
};

58
config.h Normal file
View File

@ -0,0 +1,58 @@
/* See LICENSE file for copyright and license details. */
/* appearance */
static const char font[] = "Iosevka:pixelsize=14:antialias=true:autohint=true";
#include "/home/spy/.config/cols/tabbed.h"
static const char before[] = "<";
static const char after[] = ">";
static const char titletrim[] = "...";
static const int tabwidth = 200;
static const Bool foreground = True;
static Bool urgentswitch = False;
/*
* Where to place a new tab when it is opened. When npisrelative is True,
* then the current position is changed + newposition. If npisrelative
* is False, then newposition is an absolute position.
*/
static int newposition = 0;
static Bool npisrelative = False;
#define SETPROP(p) { \
.v = (char *[]){ "/bin/sh", "-c", \
"prop=\"`xwininfo -children -id $1 | grep '^ 0x' |" \
"sed -e's@^ *\\(0x[0-9a-f]*\\) \"\\([^\"]*\\)\".*@\\1 \\2@' |" \
"xargs -0 printf %b | dmenu -l 10 -w $1`\" &&" \
"xprop -id $1 -f $0 8s -set $0 \"$prop\"", \
p, winid, NULL \
} \
}
#define MODKEY ControlMask
static Key keys[] = {
/* modifier key function argument */
{ MODKEY, XK_Return, focusonce, { 0 } },
{ MODKEY, XK_Return, spawn, { 0 } },
{ MODKEY, XK_h, movetab, { .i = -1 } },
{ MODKEY, XK_l, movetab, { .i = +1 } },
{ MODKEY, XK_j, rotate, { .i = +1 } },
{ MODKEY, XK_k, rotate, { .i = -1 } },
{ MODKEY, XK_Tab, rotate, { .i = 0 } },
{ MODKEY, XK_grave, spawn, SETPROP("_TABBED_SELECT_TAB") },
{ MODKEY, XK_1, move, { .i = 0 } },
{ MODKEY, XK_2, move, { .i = 1 } },
{ MODKEY, XK_3, move, { .i = 2 } },
{ MODKEY, XK_4, move, { .i = 3 } },
{ MODKEY, XK_5, move, { .i = 4 } },
{ MODKEY, XK_6, move, { .i = 5 } },
{ MODKEY, XK_7, move, { .i = 6 } },
{ MODKEY, XK_8, move, { .i = 7 } },
{ MODKEY, XK_9, move, { .i = 8 } },
{ MODKEY, XK_0, move, { .i = 9 } },
{ MODKEY, XK_q, killclient, { 0 } },
{ MODKEY, XK_u, focusurgent, { 0 } },
{ MODKEY|ShiftMask, XK_u, toggle, { .v = (void*) &urgentswitch } },
{ MODKEY, XK_f, fullscreen, { 0 } },
};

33
config.mk Normal file
View File

@ -0,0 +1,33 @@
# tabbed version
VERSION = 0.6
# Customize below to fit your system
# paths
PREFIX = /usr/local
MANPREFIX = ${PREFIX}/share/man
X11INC = /usr/X11R6/include
X11LIB = /usr/X11R6/lib
# freetype
FREETYPELIBS = -lfontconfig -lXft
FREETYPEINC = /usr/include/freetype2
# OpenBSD (uncomment)
#FREETYPEINC = ${X11INC}/freetype2
# includes and libs
INCS = -I. -I/usr/include -I$(X11INC) -I${FREETYPEINC}
LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 ${FREETYPELIBS}
# flags
CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE
CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS}
LDFLAGS = -s ${LIBS}
# Solaris
#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\"
#LDFLAGS = ${LIBS}
# compiler and linker
CC = cc

BIN
tabbed Executable file

Binary file not shown.

171
tabbed.1 Normal file
View File

@ -0,0 +1,171 @@
.TH TABBED 1 tabbed\-VERSION
.SH NAME
tabbed \- generic tabbed interface
.SH SYNOPSIS
.B tabbed
.RB [ \-c ]
.RB [ \-d ]
.RB [ \-k ]
.RB [ \-s ]
.RB [ \-v ]
.RB [ \-g
.IR geometry ]
.RB [ \-n
.IR name ]
.RB [ \-p
.RB [ s {+/-} ] \fIpos\fR ]
.RB [ \-o
.IR normbgcol ]
.RB [ \-O
.IR normfgcol ]
.RB [ \-t
.IR selbgcol ]
.RB [ \-T
.IR selfgcol ]
.RB [ \-u
.IR urgbgcol ]
.RB [ \-U
.IR urgfgcol ]
.RB [ \-r
.IR narg ]
.RI [ "command ..." ]
.SH DESCRIPTION
.B tabbed
is a simple tabbed container for applications which support XEmbed. Tabbed
will then run the provided command with the xid of tabbed as appended
argument. (See EXAMPLES.) The automatic spawning of the command can be
disabled by providing the -s parameter. If no command is provided
tabbed will just print its xid and run no command.
.SH OPTIONS
.TP
.B \-c
close tabbed when the last tab is closed. Mutually exclusive with -f.
.TP
.B \-d
detaches tabbed from the terminal and prints its XID to stdout.
.TP
.B \-f
fill up tabbed again by spawning the provided command, when the last tab is
closed. Mutually exclusive with -c.
.TP
.BI \-g " geometry"
defines the X11 geometry string, which will fixate the height and width of
tabbed.
The syntax is
.RI [=][ width {xX} height ][{+-} xoffset {+-} yoffset ].
See
.BR XParseGeometry (3)
for further details.
.TP
.B \-k
close foreground tabbed client (instead of tabbed and all clients) when
WM_DELETE_WINDOW is sent.
.TP
.BI \-n " name"
will set the WM_CLASS attribute to
.I name.
.TP
.BR \-p " [" s {+-}] \fIpos\fR
will set the absolute or relative position of where to start a new tab. When
.I pos
is is given without 's' in front it is an absolute position. Then negative
numbers will be the position from the last tab, where -1 is the last tab.
If 's' is given, then
.I pos
is a relative position to the current selected tab. If this reaches the limits
of the tabs; those limits then apply.
.TP
.BI \-r " narg"
will replace the
.I narg
th argument in
.I command
with the window id, rather than appending it to the end.
.TP
.B \-s
will disable automatic spawning of the command.
.TP
.BI \-o " normbgcol"
defines the normal background color.
.RI # RGB ,
.RI # RRGGBB ,
and X color names are supported.
.TP
.BI \-O " normfgcol"
defines the normal foreground color.
.TP
.BI \-t " selbgcol"
defines the selected background color.
.TP
.BI \-T " selfgbcol"
defines the selected foreground color.
.TP
.BI \-u " urgbgcol"
defines the urgent background color.
.TP
.BI \-U " urgfgbcol"
defines the urgent foreground color.
.TP
.B \-v
prints version information to stderr, then exits.
.SH USAGE
.TP
.B Ctrl\-Shift\-Return
open new tab
.TP
.B Ctrl\-Shift\-h
previous tab
.TP
.B Ctrl\-Shift\-l
next tab
.TP
.B Ctrl\-Shift\-j
move selected tab one to the left
.TP
.B Ctrl\-Shift\-k
move selected tab one to the right
.TP
.B Ctrl\-Shift\-u
toggle autofocus of urgent tabs
.TP
.B Ctrl\-Tab
toggle between the selected and last selected tab
.TP
.B Ctrl\-`
open dmenu to either create a new tab appending the entered string or select
an already existing tab.
.TP
.B Ctrl\-q
close tab
.TP
.B Ctrl\-u
focus next urgent tab
.TP
.B Ctrl\-[0..9]
jumps to nth tab
.TP
.B F11
Toggle fullscreen mode.
.SH EXAMPLES
$ tabbed surf -e
.TP
$ tabbed urxvt -embed
.TP
$ tabbed xterm -into
.TP
$ $(tabbed -d >/tmp/tabbed.xid); urxvt -embed $(</tmp/tabbed.xid);
.TP
$ tabbed -r 2 st -w '' -e tmux
.SH CUSTOMIZATION
.B tabbed
can be customized by creating a custom config.h and (re)compiling the source
code. This keeps it fast, secure and simple.
.SH AUTHORS
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 xembed (1)
.SH BUGS
Please report them.

1376
tabbed.c Normal file

File diff suppressed because it is too large Load Diff

BIN
tabbed.o Normal file

Binary file not shown.

BIN
xembed Executable file

Binary file not shown.

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.

45
xembed.c Normal file
View File

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

BIN
xembed.o Normal file

Binary file not shown.