# HG changeset patch # User paulo@localhost # Date 1240479793 25200 # Node ID faa4cb9d7bd615563d047d23ed859779c3f728d4 # Parent de6bb7885c97b63b0ab37b79c0f2df503ce288e4 add TASKBAR and CLICK_TO_FOCUS diff -r de6bb7885c97 -r faa4cb9d7bd6 config.h --- a/config.h Tue Mar 24 12:52:45 2009 -0700 +++ b/config.h Thu Apr 23 02:43:13 2009 -0700 @@ -12,6 +12,8 @@ #define SELBGCOLOR "#222222" #define SELFGCOLOR "#00ff00" #define TOPBAR True /* False */ +#define TASKBAR True /* False */ +#define CLICK_TO_FOCUS True /* False */ /* behavior */ #define SNAP 10 /* pixel */ diff -r de6bb7885c97 -r faa4cb9d7bd6 draw.c --- a/draw.c Tue Mar 24 12:52:45 2009 -0700 +++ b/draw.c Thu Apr 23 02:43:13 2009 -0700 @@ -80,25 +80,31 @@ drawtext(stext, dc.norm); if((dc.w = dc.x - x) > bh) { dc.x = x; + drawtext(sel ? sel->name : NULL, sel ? dc.sel : dc.norm); + } + XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, sw, bh, 0, 0); + + if (TASKBAR) { + dc.x = dc.y = 0; + dc.w = sw; for(j=0, c = clients; c; c = c->next) { if(isvisible(c)) j++; } if(j && j < MAX_TASKS) dc.w /= j; - else { - drawtext(sel ? sel->name : NULL, sel ? dc.sel : dc.norm); - j = 0; - } - for(c = clients; j && c; c = c->next) { + else + drawtext("", dc.norm); + for(c = clients; j && c && dc.x < sw; c = c->next) { if(isvisible(c)) { drawtext(c->name, (c == sel) ? dc.sel : dc.norm); dc.x += dc.w; j--; } } + XCopyArea(dpy, dc.drawable, tbarwin, dc.gc, 0, 0, sw, bh, 0, 0); } - XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, sw, bh, 0, 0); + XSync(dpy, False); } diff -r de6bb7885c97 -r faa4cb9d7bd6 dwm.h --- a/dwm.h Tue Mar 24 12:52:45 2009 -0700 +++ b/dwm.h Thu Apr 23 02:43:13 2009 -0700 @@ -100,7 +100,7 @@ extern DC dc; /* global draw context */ extern Display *dpy; extern Layout *lt; -extern Window root, barwin; +extern Window root, barwin, tbarwin; /* client.c */ extern void configure(Client *c); /* send synthetic configure event */ diff -r de6bb7885c97 -r faa4cb9d7bd6 event.c --- a/event.c Tue Mar 24 12:52:45 2009 -0700 +++ b/event.c Thu Apr 23 02:43:13 2009 -0700 @@ -158,13 +158,38 @@ } if(ev->x > x + blw) switch(ev->button) { - case Button1: zoom(NULL); break; - case Button2: toggleversatile(NULL); break; - case Button3: killclient(NULL); break; - case Button4: focusprev(NULL); break; - case Button5: focusnext(NULL); break; + case Button1: zoom(NULL); break; + case Button2: toggleversatile(NULL); break; + case Button3: killclient(NULL); break; + case Button4: pushup(NULL); break; + case Button5: pushdown(NULL); break; + } + } + else if(tbarwin == ev->window) { + int i, w; + switch(ev->button) { + case Button4: focusprev(NULL); return; break; + case Button5: focusnext(NULL); return; break; } - } + for(i=0, c = clients; c; c = c->next) { + if(isvisible(c)) + i++; + } + if(!i && i >= MAX_TASKS) + return; + else + w = sw/i; + for(i=1, c = clients; c && i*w<=sw; c = c->next, i++) { + for(; c && !isvisible(c); c = c->next); + if(i*w > ev->x) { + switch(ev->button) { + case Button1: focus(c); restack(); break; + case Button3: focus(c); zoom(NULL); break; + } + break; + } + } + } else if((c = getclient(ev->window))) { focus(c); if(CLEANMASK(ev->state) != MODKEY) @@ -242,7 +267,7 @@ if(ev->mode != NotifyNormal || ev->detail == NotifyInferior) return; - if((c = getclient(ev->window)) && isvisible(c)) + if(!CLICK_TO_FOCUS && (c = getclient(ev->window)) && isvisible(c)) focus(c); else if(ev->window == root) { selscreen = True; @@ -256,7 +281,7 @@ XExposeEvent *ev = &e->xexpose; if(ev->count == 0) { - if(barwin == ev->window) + if(barwin == ev->window || tbarwin == ev->window) drawstatus(); } } diff -r de6bb7885c97 -r faa4cb9d7bd6 layout.c --- a/layout.c Tue Mar 24 12:52:45 2009 -0700 +++ b/layout.c Thu Apr 23 02:43:13 2009 -0700 @@ -233,8 +233,8 @@ break; cols = (rows && (rows - 1) * rows >= n) ? rows - 1 : rows; - th = (sh - dc.h) / (rows ? rows : 1); - tw = sw / (cols ? cols : 1); + th = wah / (rows ? rows : 1); + tw = waw / (cols ? cols : 1); nw = tw - 2 * BORDERPX; nh = th - 2 * BORDERPX; @@ -249,8 +249,8 @@ nx = (i / rows) * tw; ny = (i % rows) * th + (TOPBAR ? dc.h : 0); /* adjust height and width of last row's and last column's windows */ - ah = ((i + 1) % rows == 0) ? sh - th * rows - dc.h : 0; - aw = (i >= rows * (cols - 1)) ? sw - tw * cols : 0; + ah = ((i + 1) % rows == 0) ? wah - th * rows : 0; + aw = (i >= rows * (cols - 1)) ? waw - tw * cols : 0; resize(c, nx, ny, nw + aw, nh + ah, False); i++; } diff -r de6bb7885c97 -r faa4cb9d7bd6 main.c --- a/main.c Tue Mar 24 12:52:45 2009 -0700 +++ b/main.c Thu Apr 23 02:43:13 2009 -0700 @@ -29,7 +29,7 @@ Cursor cursor[CurLast]; Display *dpy; DC dc = {0}; -Window root, barwin; +Window root, barwin, tbarwin; /* static */ @@ -53,6 +53,8 @@ XFreePixmap(dpy, dc.drawable); XFreeGC(dpy, dc.gc); XDestroyWindow(dpy, barwin); + if (TASKBAR) + XDestroyWindow(dpy, tbarwin); XFreeCursor(dpy, cursor[CurNormal]); XFreeCursor(dpy, cursor[CurResize]); XFreeCursor(dpy, cursor[CurMove]); @@ -196,10 +198,21 @@ XDefineCursor(dpy, barwin, cursor[CurNormal]); XMapRaised(dpy, barwin); strcpy(stext, "dwm-"VERSION); + /* taskbar */ + if (TASKBAR) { + wa.override_redirect = 1; + wa.background_pixmap = ParentRelative; + wa.event_mask = ButtonPressMask | ExposureMask; + tbarwin = XCreateWindow(dpy, root, sx, sy + (TOPBAR ? sh - bh : 0 ), sw, bh, 0, + DefaultDepth(dpy, screen), CopyFromParent, DefaultVisual(dpy, screen), + CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa); + XDefineCursor(dpy, tbarwin, cursor[CurNormal]); + XMapRaised(dpy, tbarwin); + } /* windowarea */ wax = sx; - way = sy + (TOPBAR ? bh : 0); - wah = sh - bh; + way = sy + (TASKBAR ? bh : (TOPBAR ? bh : 0)); + wah = sh - bh - (TASKBAR ? bh : 0); waw = sw; /* pixmap for everything */ dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen));