commit a9ad7e7201fddb96e41060292a0a1c060daac579
parent 204af1549bb5f1e8e848579ff41ee52d58dd593f
Author: Enno Boland (tox) <tox@s01.de>
Date:   Tue, 13 Oct 2009 08:13:30 +0200
handle configurerequest.
Diffstat:
| tabbed.c | | | 38 | ++++++++++++++++++++++++++++++-------- | 
1 file changed, 30 insertions(+), 8 deletions(-)
diff --git a/tabbed.c b/tabbed.c
@@ -92,6 +92,7 @@ static void buttonpress(XEvent *e);
 static void cleanup(void);
 static void clientmessage(XEvent *e);
 static void configurenotify(XEvent *e);
+static void configurerequest(XEvent *e);
 static void createnotify(XEvent *e);
 static void destroynotify(XEvent *e);
 static void die(const char *errstr, ...);
@@ -133,6 +134,7 @@ static void (*handler[LASTEvent]) (XEvent *) = {
 	[ButtonPress] = buttonpress,
 	[ClientMessage] = clientmessage,
 	[ConfigureNotify] = configurenotify,
+	[ConfigureRequest] = configurerequest,
 	[CreateNotify] = createnotify,
 	[DestroyNotify] = destroynotify,
 	[EnterNotify] = enternotify,
@@ -152,7 +154,7 @@ static Atom wmatom[WMLast], netatom[NetLast], xembedatom;
 static Window root, win;
 static Client *clients = NULL, *sel = NULL;
 static int (*xerrorxlib)(Display *, XErrorEvent *);
-static char winid[128];
+static char winid[64];
 /* configuration, allows nested code to access above variables */
 #include "config.h"
 
@@ -193,6 +195,7 @@ clientmessage(XEvent *e) {
 		printf("%ld %ld %ld %ld %ld\n", ev->data.l[0], ev->data.l[1], ev->data.l[2], ev->data.l[3], ev->data.l[4]);
 	}
 }
+
 void
 configurenotify(XEvent *e) {
 	XConfigureEvent *ev = &e->xconfigure;
@@ -210,6 +213,24 @@ configurenotify(XEvent *e) {
 }
 
 void
+configurerequest(XEvent *e) {
+	XConfigureRequestEvent *ev = &e->xconfigurerequest;
+	XWindowChanges wc;
+	Client *c;
+
+	if((c = getclient(ev->window))) {
+		wc.x = 0;
+		wc.y = bh;
+		wc.width = ww;
+		wc.height = wh - bh;
+		wc.border_width = 0;
+		wc.sibling = ev->above;
+		wc.stack_mode = ev->detail;
+		XConfigureWindow(dpy, c->win, ev->value_mask, &wc);
+	}
+}
+
+void
 createnotify(XEvent *e) {
 	XCreateWindowEvent *ev = &e->xcreatewindow;
 
@@ -241,11 +262,13 @@ drawbar() {
 	unsigned long *col;
 	int n, width;
 	Client *c, *fc;
+	char *name = NULL;
 
 	if(!clients) {
 		dc.x = 0;
 		dc.w = ww;
-		drawtext("tabbed-"VERSION, dc.norm);
+		XFetchName(dpy, win, &name);
+		drawtext(name ? name : "", dc.norm);
 		XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, ww, bh, 0, 0);
 		XSync(dpy, False);
 		return;
@@ -341,13 +364,12 @@ void
 focus(Client *c) {
 	XEvent e;
 
-	if(!c)
-		c = clients;
-	if(!c) {
-		sel = NULL;
+	if(!clients) {
 		XStoreName(dpy, win, "tabbed-"VERSION);
 		return;
 	}
+	if(!c)
+		return;
 	XRaiseWindow(dpy, c->win);
 	XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
 	e.xclient.window = c->win;
@@ -683,11 +705,11 @@ setup(void) {
 			StructureNotifyMask);
 	xerrorxlib = XSetErrorHandler(xerror);
 	XClassHint class_hint;
-	XStoreName(dpy, win, "tabbed-"VERSION);
 	class_hint.res_name = "tabbed";
 	class_hint.res_class = "Tabbed";
 	XSetClassHint(dpy, win, &class_hint);
 	snprintf(winid, LENGTH(winid), "%u", (int)win);
+	focus(clients);
 }
 
 void
@@ -725,7 +747,6 @@ void
 unmanage(Client *c) {
 	Client *pc;
 
-	focus(NULL);
 	if(!clients)
 		return;
 	else if(c == clients)
@@ -735,6 +756,7 @@ unmanage(Client *c) {
 		pc->next = c->next;
 	}
 	free(c);
+	focus(clients);
 	XSync(dpy, False);
 }