~kris/suckless

tabbed

ea0e34aa068303113c9e4cd84b386aa3f06c2b95 — Enno Boland (tox) 16 years ago d136cb3
embedding works nice now.
2 files changed, 56 insertions(+), 27 deletions(-)

M config.mk
M tabbed.c
M config.mk => config.mk +1 -0
@@ 18,6 18,7 @@ LIBS = -L/usr/lib -lc ${GTKLIB} -lgthread-2.0
# flags
CPPFLAGS = -DVERSION=\"${VERSION}\"
#CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS}
#CFLAGS = -std=c99 -pedantic -Wall -Werror -O0 ${INCS} ${CPPFLAGS}
CFLAGS = -g -std=c99 -pedantic -Wall -Werror -O0 ${INCS} ${CPPFLAGS}
#LDFLAGS = -s ${LIBS}
LDFLAGS = ${LIBS}

M tabbed.c => tabbed.c +55 -27
@@ 31,15 31,26 @@
enum { ColFG, ColBG, ColLast };                         /* color */
enum { NetSupported, NetWMName, NetLast };              /* EWMH atoms */
enum { WMProtocols, WMDelete, WMState, WMLast };        /* default atoms */
 /* XEMBED messages */
enum { XembNotify, XembWinAct, XembWinDeact, XembReqFoc,
	XembFocIn, XembFocOut, XembFocNext, XembFoxPrev,
XEMBED_MODALITY_ON = 10,
XEMBED_MODALITY_OFF = 11,
XEMBED_REGISTER_ACCELERATOR = 12,
XEMBED_UNREGISTER_ACCELERATOR = 13,
XEMBED_ACTIVATE_ACCELERATOR = 14, 
};
/* XEMBED messages */
#define XEMBED_EMBEDDED_NOTIFY		0
#define XEMBED_WINDOW_ACTIVATE  	1
#define XEMBED_WINDOW_DEACTIVATE  	2
#define XEMBED_REQUEST_FOCUS	 	3
#define XEMBED_FOCUS_IN 	 	4
#define XEMBED_FOCUS_OUT  		5
#define XEMBED_FOCUS_NEXT 		6
#define XEMBED_FOCUS_PREV 		7
/* 8-9 were used for XEMBED_GRAB_KEY/XEMBED_UNGRAB_KEY */
#define XEMBED_MODALITY_ON 		10
#define XEMBED_MODALITY_OFF 		11
#define XEMBED_REGISTER_ACCELERATOR     12
#define XEMBED_UNREGISTER_ACCELERATOR   13
#define XEMBED_ACTIVATE_ACCELERATOR     14

/* Details for  XEMBED_FOCUS_IN: */
#define XEMBED_FOCUS_CURRENT		0
#define XEMBED_FOCUS_FIRST 		1
#define XEMBED_FOCUS_LAST		2

typedef union {
	int i;


@@ 85,8 96,10 @@ static void destroynotify(XEvent *e);
static void die(const char *errstr, ...);
static void drawbar();
static void drawtext(const char *text, unsigned long col[ColLast]);
static void enternotify(XEvent *e);
static void expose(XEvent *e);
static void focus(Client *c);
static void focusin(XEvent *e);
static unsigned long getcolor(const char *colstr);
static Client *getclient(Window w);
static Client *getfirsttab();


@@ 98,7 111,6 @@ static void killclient(const Arg *arg);
static void move(const Arg *arg);
static void spawn(const Arg *arg);
static void manage(Window win);
static void maprequest(XEvent *e);
static void propertynotify(XEvent *e);
static void reparentnotify(XEvent *e);
static void resize(Client *c, int w, int h);


@@ 119,13 131,14 @@ static void (*handler[LASTEvent]) (XEvent *) = {
	[DestroyNotify] = destroynotify,
	[PropertyNotify] = propertynotify,
	[UnmapNotify] = unmapnotify,
	[MapRequest] = maprequest,
	[ButtonPress] = buttonpress,
	[KeyPress] = keypress,
	[Expose] = expose,
	[ClientMessage] = clientmessage,
	[CreateNotify] = createnotify,
	[ReparentNotify] = reparentnotify,
	[EnterNotify] = enternotify,
	[FocusIn] = focusin,
};
static Display *dpy;
static DC dc;


@@ 197,7 210,7 @@ void
createnotify(XEvent *e) {
	XCreateWindowEvent *ev = &e->xcreatewindow;

	if(!getclient(ev->window))
	if(ev->window != win && !getclient(ev->window))
		manage(ev->window);
}



@@ 308,6 321,10 @@ emallocz(size_t size) {
	return p;
}

void enternotify(XEvent *e) {
	focus(sel);
}

void
expose(XEvent *e) {
	XExposeEvent *ev = &e->xexpose;


@@ 318,20 335,37 @@ expose(XEvent *e) {

void
focus(Client *c) {
	XEvent e;

	if(!c)
		c = clients;
	if(!c) {
		sel = NULL;
		XStoreName(dpy, win, "tabbed-"VERSION);
		return;
	}
	XRaiseWindow(dpy, c->win);
//	XSetInputFocus(dpy, c->win, RevertToNone, CurrentTime);
	XSelectInput(dpy, c->win, PropertyChangeMask|StructureNotifyMask);
	XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
		e.xclient.window = c->win;
		e.xclient.type = ClientMessage;
		e.xclient.message_type = xembedatom;
		e.xclient.format = 32;
		e.xclient.data.l[0] = CurrentTime;
		e.xclient.data.l[1] = XEMBED_FOCUS_IN;
		e.xclient.data.l[2] = XEMBED_FOCUS_CURRENT;
		e.xclient.data.l[3] = 0;
		e.xclient.data.l[4] = 0;
		XSendEvent(dpy, root, False, NoEventMask, &e);
	sel = c;
	XStoreName(dpy, win, sel->name);
	drawbar();
}

void
focusin(XEvent *e) {
	focus(sel);
}

unsigned long
getcolor(const char *colstr) {
	Colormap cmap = DefaultColormap(dpy, screen);


@@ 523,9 557,9 @@ manage(Window w) {
		Client *c;
		XEvent e;

		XSelectInput(dpy, w, StructureNotifyMask|PropertyChangeMask);
		XWithdrawWindow(dpy, w, 0);
		XReparentWindow(dpy, w, win, 0, bh);
		XSelectInput(dpy, w, PropertyChangeMask|StructureNotifyMask|EnterWindowMask);
		XSync(dpy, False);
		if(badwindow) {
			badwindow = False;


@@ 541,7 575,6 @@ manage(Window w) {
		c->next = clients;
		c->win = w;
		clients = c;
		focus(c);
		updatetitle(c);
		resize(c, ww, wh - bh);
		drawbar();


@@ 556,16 589,11 @@ manage(Window w) {
		e.xclient.data.l[3] = win;
		e.xclient.data.l[4] = 0;
		XSendEvent(dpy, root, False, NoEventMask, &e);
		XSync(dpy, False);
		focus(c);
	}
}

void maprequest(XEvent *e) {
	XMapRequestEvent *ev = &e->xmaprequest;

	if(!getclient(ev->window))
		manage(ev->window);
}

void
propertynotify(XEvent *e) {
	Client *c;


@@ 661,13 689,13 @@ setup(void) {
		XSetFont(dpy, dc.gc, dc.font.xfont->fid);

	win = XCreateSimpleWindow(dpy, root, wx, wy, ww, wh, 0, dc.norm[ColFG], dc.norm[ColBG]);
	XSelectInput(dpy, win, PointerMotionMask|SubstructureNotifyMask|
			ButtonPressMask|ExposureMask|KeyPressMask|
			LeaveWindowMask|StructureNotifyMask);
	XMapRaised(dpy, win);
	XSelectInput(dpy, win, SubstructureNotifyMask|FocusChangeMask|
			ButtonPressMask|ExposureMask|KeyPressMask|
			StructureNotifyMask);
	xerrorxlib = XSetErrorHandler(xerror);
	XClassHint class_hint;
	XStoreName(dpy, win, "Tabbed");
	XStoreName(dpy, win, "tabbed-"VERSION);
	class_hint.res_name = "tabbed";
	class_hint.res_class = "Tabbed";
	XSetClassHint(dpy, win, &class_hint);