tabbed

Simple tabbing application for X11.
git clone git://r-36.net/tabbed
Log | Files | Refs | README | LICENSE

commit d9230b5ab51485eb7624677bf874d7dbdae8ca94
parent 814d7166cca93d77eb399b90ed1e831b53eca77b
Author: Enno Boland (tox) <tox@s01.de>
Date:   Sun, 13 Sep 2009 12:13:10 +0200

start implementing xembed.
Diffstat:
tabbed.c | 69++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------
1 file changed, 58 insertions(+), 11 deletions(-)

diff --git a/tabbed.c b/tabbed.c @@ -21,15 +21,25 @@ #include <errno.h> /* macros */ -#define MAX(a, b) ((a) > (b) ? (a) : (b)) -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -#define LENGTH(x) (sizeof x / sizeof x[0]) -#define CLEANMASK(mask) (mask & ~(numlockmask|LockMask)) -#define TEXTW(x) (textnw(x, strlen(x)) + dc.font.height) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define LENGTH(x) (sizeof x / sizeof x[0]) +#define CLEANMASK(mask) (mask & ~(numlockmask|LockMask)) +#define TEXTW(x) (textnw(x, strlen(x)) + dc.font.height) +#define XEMBED_EMBEDDED_NOTIFY 0 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, +}; typedef union { int i; @@ -70,6 +80,7 @@ typedef struct Client { /* function declarations */ static void buttonpress(XEvent *e); static void cleanup(void); +static void clientmessage(XEvent *e); static void configurenotify(XEvent *e); static void destroynotify(XEvent *e); static void die(const char *errstr, ...); @@ -112,10 +123,11 @@ static void (*handler[LASTEvent]) (XEvent *) = { [ButtonPress] = buttonpress, [KeyPress] = keypress, [Expose] = expose, + [ClientMessage] = clientmessage, }; static Display *dpy; static DC dc; -static Atom wmatom[WMLast], netatom[NetLast]; +static Atom wmatom[WMLast], netatom[NetLast], xembedatom; static Window root, win; static Bool running = True; static unsigned int numlockmask = 0; @@ -149,6 +161,7 @@ cleanup(void) { XFreeFontSet(dpy, dc.font.set); else XFreeFont(dpy, dc.font.xfont); + puts("aaa"); XFreePixmap(dpy, dc.drawable); XFreeGC(dpy, dc.gc); XDestroyWindow(dpy, win); @@ -156,6 +169,16 @@ cleanup(void) { } void +clientmessage(XEvent *e) { + XClientMessageEvent *ev = &e->xclient; + + if(ev->message_type == xembedatom) { + puts("message!"); + printf("%ld %ld", ev->data.l[0], ev->data.l[1]); + puts(""); + } +} +void configurenotify(XEvent *e) { XConfigureEvent *ev = &e->xconfigure; Client *c; @@ -477,7 +500,7 @@ spawn(const Arg *arg) { close(ConnectionNumber(dpy)); setsid(); execvp(((char **)arg->v)[0], (char **)arg->v); - fprintf(stderr, "dwm: execvp %s", ((char **)arg->v)[0]); + fprintf(stderr, "tabbed: execvp %s", ((char **)arg->v)[0]); perror(" failed"); exit(0); } @@ -491,9 +514,12 @@ manage(Window w) { unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; KeyCode code; Client *c; + XEvent e; - XSync(dpy, False); + XSelectInput(dpy, w, StructureNotifyMask | PropertyChangeMask); + XWithdrawWindow(dpy, w, 0); XReparentWindow(dpy, w, win, 0, bh); + XSync(dpy, False); if(badwindow) { badwindow = False; return; @@ -512,6 +538,17 @@ manage(Window w) { updatetitle(c); resize(c, ww, wh - bh); drawbar(); + XMapRaised(dpy, w); + e.xclient.window = w; + 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_EMBEDDED_NOTIFY; + e.xclient.data.l[2] = 0; + e.xclient.data.l[3] = win; + e.xclient.data.l[4] = 0; + XSendEvent(dpy, root, False, NoEventMask, &e); } } @@ -603,6 +640,7 @@ setup(void) { wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False); netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); + xembedatom = XInternAtom(dpy, "_XEMBED", False); /* init appearance */ wx = 0; wy = 0; @@ -620,7 +658,7 @@ setup(void) { win = XCreateSimpleWindow(dpy, root, wx, wy, ww, wh, 0, dc.norm[ColFG], dc.norm[ColBG]); XSelectInput(dpy, win, StructureNotifyMask|PointerMotionMask| ButtonPressMask|ExposureMask|KeyPressMask| - LeaveWindowMask); + LeaveWindowMask|SubstructureRedirectMask); XMapRaised(dpy, win); xerrorxlib = XSetErrorHandler(xerror); XClassHint class_hint; @@ -710,10 +748,14 @@ xerror(Display *dpy, XErrorEvent *ee) { int main(int argc, char *argv[]) { + int detach = 0; + if(argc == 2 && !strcmp("-v", argv[1])) die("tabbed-"VERSION", © 2006-2008 surf engineers, see LICENSE for details\n"); + else if(argc == 2 && strcmp("-d", argv[1])) + detach = 1; else if(argc != 1) - die("usage: tabbed [-v]\n"); + die("usage: tabbed [-d] [-v]\n"); if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) fprintf(stderr, "warning: no locale support\n"); if(!(dpy = XOpenDisplay(0))) @@ -721,8 +763,13 @@ main(int argc, char *argv[]) { setup(); printf("%i\n", (int)win); fflush(NULL); + if(detach && fork() != 0) { + if(dpy) + close(ConnectionNumber(dpy)); + return EXIT_SUCCESS; + } run(); cleanup(); XCloseDisplay(dpy); - return 0; + return EXIT_SUCCESS; }