#include "wm.h"
 
-static const char *status[] = {
-       "sh", "-c", "echo -n `date` `uptime | sed 's/.*://; s/,//g'`"
-               " `acpi | awk '{print $4}' | sed 's/,//'`", 0 \
-};
-
 void
 draw_bar()
 {
-       static char buf[1024];
-
-       buf[0] = 0;
-       pipe_spawn(buf, sizeof(buf), dpy, (char **)status);
-
        brush.rect = barrect;
        brush.rect.x = brush.rect.y = 0;
-       draw(dpy, &brush, False, buf);
+       draw(dpy, &brush, False, NULL);
+
+       if(stack) {
+               brush.rect.width = textwidth(&brush.font, stack->name) + labelheight(&brush.font);
+               swap((void **)&brush.fg, (void **)&brush.bg);
+               draw(dpy, &brush, False, stack->name);
+               swap((void **)&brush.fg, (void **)&brush.bg);
+               brush.rect.x += brush.rect.width;
+       }
+
+       brush.rect.width = textwidth(&brush.font, statustext) + labelheight(&brush.font);
+       brush.rect.x = barrect.x + barrect.width - brush.rect.width;
+       draw(dpy, &brush, False, statustext);
 
        XCopyArea(dpy, brush.drawable, barwin, brush.gc, 0, 0, barrect.width,
                        barrect.height, 0, 0);
 
                }
        }
        XFree(name.value);
+       if(c == stack)
+               draw_bar();
+       else
+               draw_client(c);
 }
 
 void
        c->r[RFloat].height = wa->height;
        c->border = wa->border_width;
        XSetWindowBorderWidth(dpy, c->win, 0);
+       XSelectInput(dpy, c->win, StructureNotifyMask | PropertyChangeMask | EnterWindowMask);
        XGetTransientForHint(dpy, c->win, &c->trans);
        if(!XGetWMNormalHints(dpy, c->win, &c->size, &msize) || !c->size.flags)
                c->size.flags = PSize;
 
 #define BGCOLOR                "#000000"
 #define FGCOLOR                "#ffaa00"
 #define BORDERCOLOR    "#000000"
-#define STATUSDELAY 1 /* milliseconds */
+#define STATUSDELAY    10 /* milliseconds */
 
                }
                if(ev->atom == XA_WM_NAME || ev->atom == net_atom[NetWMName]) {
                        update_name(c);
-                       /*draw_frame(c->sel);*/
                }
        }
 }
 
                        n += l;
                }
                close(pfd[0]);
-               buf[n - 1] = 0;
+               buf[n < len ? n : len - 1] = 0;
        }
        wait(0);
 }
 
 Bool running = True;
 Bool sel_screen;
 
-char *bartext, tag[256];
+char statustext[1024], tag[256];
 int screen;
 
 Brush brush = {0};
 Client *stack = NULL;
 
 static Bool other_wm_running;
-static char version[] = "gridwm - " VERSION ", (C)opyright MMVI Anselm R. Garbe\n";
+static const char version[] = "gridwm - " VERSION ", (C)opyright MMVI Anselm R. Garbe\n";
 static int (*x_error_handler) (Display *, XErrorEvent *);
 
+static const char *status[] = {
+       "sh", "-c", "echo -n `date '+%Y/%m/%d %H:%M'`" 
+       " `uptime | sed 's/.*://; s/,//g'`"
+       " `acpi | awk '{print $4}' | sed 's/,//'`", 0
+};
+
 static void
 usage()
 {
                        barrect.width, barrect.height, 0, DefaultDepth(dpy, screen),
                        CopyFromParent, DefaultVisual(dpy, screen),
                        CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);
-       bartext = NULL;
        XDefineCursor(dpy, barwin, cursor[CurNormal]);
        XMapRaised(dpy, barwin);
+       pipe_spawn(statustext, sizeof(statustext), dpy, (char **)status);
        draw_bar();
 
        wa.event_mask = SubstructureRedirectMask | EnterWindowMask \
                t = timeout;
                if(select(ConnectionNumber(dpy) + 1, &fds, NULL, NULL, &t) > 0)
                        continue;
-               else if(errno != EINTR)
+               else if(errno != EINTR) {
+                       pipe_spawn(statustext, sizeof(statustext), dpy, (char **)status);
                        draw_bar();
+               }
        }
 
        cleanup();
 
 extern void (*handler[LASTEvent]) (XEvent *);
 
 extern int screen;
-extern char *bartext, tag[256];
+extern char statustext[1024], tag[256];
 
 extern Brush brush;
 extern Client *clients, *stack;
 extern Client *getclient(Window w);
 extern void focus(Client *c);
 extern void update_name(Client *c);
+extern void draw_client(Client *c);
 
 /* event.c */
 extern unsigned int flush_events(long even_mask);