implemented bar for dwm (I miss status text), I plan that status text is read from stdin in dwm

This commit is contained in:
Anselm R. Garbe 2006-07-14 10:07:38 +02:00
parent 1549faf3b9
commit 9cd686c93a
6 changed files with 95 additions and 31 deletions

View file

@ -3,7 +3,7 @@
include config.mk include config.mk
SRC = client.c dev.c draw.c event.c main.c util.c SRC = bar.c client.c dev.c draw.c event.c main.c util.c
OBJ = ${SRC:.c=.o} OBJ = ${SRC:.c=.o}
MAN1 = dwm.1 MAN1 = dwm.1
BIN = dwm BIN = dwm

40
bar.c Normal file
View file

@ -0,0 +1,40 @@
/*
* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#include "dwm.h"
void
draw_bar()
{
int i;
dc.x = dc.y = 0;
dc.w = bw;
drawtext(NULL, False);
dc.w = 0;
for(i = 0; i < TLast; i++) {
dc.x += dc.w;
dc.w = textw(tags[i]) + dc.font.height;
if(i == tsel) {
swap((void **)&dc.fg, (void **)&dc.bg);
drawtext(tags[i], True);
swap((void **)&dc.fg, (void **)&dc.bg);
}
else
drawtext(tags[i], True);
}
if(sel) {
swap((void **)&dc.fg, (void **)&dc.bg);
dc.x += dc.w;
dc.w = textw(sel->name) + dc.font.height;
drawtext(sel->name, True);
swap((void **)&dc.fg, (void **)&dc.bg);
}
dc.w = textw(stext) + dc.font.height;
dc.x = bx + bw - dc.w;
drawtext(stext, False);
XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, bw, bh, 0, 0);
XFlush(dpy);
}

View file

@ -49,9 +49,9 @@ max(Arg *arg)
if(!sel) if(!sel)
return; return;
sel->x = sx; sel->x = sx;
sel->y = sy; sel->y = sy + bh;
sel->w = sw - 2 * sel->border; sel->w = sw - 2 * sel->border;
sel->h = sh - 2 * sel->border; sel->h = sh - 2 * sel->border - bh;
craise(sel); craise(sel);
resize(sel, False); resize(sel, False);
discard_events(EnterWindowMask); discard_events(EnterWindowMask);
@ -67,6 +67,7 @@ view(Arg *arg)
for(c = clients; c; c = next(c->next)) for(c = clients; c; c = next(c->next))
draw_client(c); draw_client(c);
draw_bar();
} }
void void
@ -131,7 +132,10 @@ tiling(Arg *arg)
if(c->tags[tsel] && !c->floating) if(c->tags[tsel] && !c->floating)
n++; n++;
h = (n > 1) ? sh / (n - 1) : sh; if(n > 1)
h = (sh - bh) / (n - 1);
else
h = sh - bh;
for(i = 0, c = clients; c; c = c->next) { for(i = 0, c = clients; c; c = c->next) {
if(c->tags[tsel]) { if(c->tags[tsel]) {
@ -142,19 +146,19 @@ tiling(Arg *arg)
} }
if(n == 1) { if(n == 1) {
c->x = sx; c->x = sx;
c->y = sy; c->y = sy + bh;
c->w = sw - 2 * c->border; c->w = sw - 2 * c->border;
c->h = sh - 2 * c->border; c->h = sh - 2 * c->border - bh;
} }
else if(i == 0) { else if(i == 0) {
c->x = sx; c->x = sx;
c->y = sy; c->y = sy + bh;
c->w = mw - 2 * c->border; c->w = mw - 2 * c->border;
c->h = sh - 2 * c->border; c->h = sh - 2 * c->border - bh;
} }
else { else {
c->x = sx + mw; c->x = sx + mw;
c->y = sy + (i - 1) * h; c->y = sy + (i - 1) * h + bh;
c->w = w - 2 * c->border; c->w = w - 2 * c->border;
c->h = h - 2 * c->border; c->h = h - 2 * c->border;
} }
@ -373,9 +377,11 @@ manage(Window w, XWindowAttributes *wa)
c->win = w; c->win = w;
c->tx = c->x = wa->x; c->tx = c->x = wa->x;
c->ty = c->y = wa->y; c->ty = c->y = wa->y;
if(c->y < bh)
c->ty = c->y += bh;
c->tw = c->w = wa->width; c->tw = c->w = wa->width;
c->h = wa->height; c->h = wa->height;
c->th = th; c->th = bh;
c->border = 1; c->border = 1;
c->proto = win_proto(c->win); c->proto = win_proto(c->win);
update_size(c); update_size(c);
@ -570,6 +576,7 @@ draw_client(Client *c)
{ {
int i; int i;
if(c == sel) { if(c == sel) {
draw_bar();
XUnmapWindow(dpy, c->title); XUnmapWindow(dpy, c->title);
XSetWindowBorder(dpy, c->win, dc.fg); XSetWindowBorder(dpy, c->win, dc.fg);
return; return;
@ -579,19 +586,18 @@ draw_client(Client *c)
XMapWindow(dpy, c->title); XMapWindow(dpy, c->title);
dc.x = dc.y = 0; dc.x = dc.y = 0;
dc.h = c->th;
dc.w = 0; dc.w = 0;
for(i = 0; i < TLast; i++) { for(i = 0; i < TLast; i++) {
if(c->tags[i]) { if(c->tags[i]) {
dc.x += dc.w; dc.x += dc.w;
dc.w = textw(c->tags[i]) + dc.font.height; dc.w = textw(c->tags[i]) + dc.font.height;
draw(True, c->tags[i]); drawtext(c->tags[i], True);
} }
} }
dc.x += dc.w; dc.x += dc.w;
dc.w = textw(c->name) + dc.font.height; dc.w = textw(c->name) + dc.font.height;
draw(True, c->name); drawtext(c->name, True);
XCopyArea(dpy, dc.drawable, c->title, dc.gc, XCopyArea(dpy, dc.drawable, c->title, dc.gc,
0, 0, c->tw, c->th, 0, 0); 0, 0, c->tw, c->th, 0, 0);
XFlush(dpy); XFlush(dpy);

2
draw.c
View file

@ -30,7 +30,7 @@ drawborder(void)
} }
void void
draw(Bool border, const char *text) drawtext(const char *text, Bool border)
{ {
int x, y, w, h; int x, y, w, h;
unsigned int len; unsigned int len;

11
dwm.h
View file

@ -88,19 +88,22 @@ struct Key {
}; };
extern Display *dpy; extern Display *dpy;
extern Window root; extern Window root, barwin;
extern Atom wm_atom[WMLast], net_atom[NetLast]; extern Atom wm_atom[WMLast], net_atom[NetLast];
extern Cursor cursor[CurLast]; extern Cursor cursor[CurLast];
extern Bool running, issel; extern Bool running, issel;
extern void (*handler[LASTEvent])(XEvent *); extern void (*handler[LASTEvent])(XEvent *);
extern void (*arrange)(Arg *); extern void (*arrange)(Arg *);
extern int tsel, screen, sx, sy, sw, sh, mw, th; extern int tsel, screen, sx, sy, sw, sh, bx, by, bw, bh, mw;
extern char *tags[TLast]; extern char *tags[TLast], stext[1024];
extern DC dc; extern DC dc;
extern Client *clients, *sel; extern Client *clients, *sel;
/* bar.c */
extern void draw_bar();
/* client.c */ /* client.c */
extern void manage(Window w, XWindowAttributes *wa); extern void manage(Window w, XWindowAttributes *wa);
extern void unmanage(Client *c); extern void unmanage(Client *c);
@ -126,7 +129,7 @@ extern void zoom(Arg *arg);
extern void gravitate(Client *c, Bool invert); extern void gravitate(Client *c, Bool invert);
/* draw.c */ /* draw.c */
extern void draw(Bool border, const char *text); extern void drawtext(const char *text, Bool border);
extern unsigned long initcolor(const char *colstr); extern unsigned long initcolor(const char *colstr);
extern void initfont(const char *fontstr); extern void initfont(const char *fontstr);
extern unsigned int textnw(char *text, unsigned int len); extern unsigned int textnw(char *text, unsigned int len);

39
main.c
View file

@ -6,6 +6,7 @@
#include <stdarg.h> #include <stdarg.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#include <X11/cursorfont.h> #include <X11/cursorfont.h>
#include <X11/Xatom.h> #include <X11/Xatom.h>
@ -34,7 +35,8 @@ Bool running = True;
Bool issel; Bool issel;
int tsel = Tdev; /* default tag */ int tsel = Tdev; /* default tag */
int screen, sx, sy, sw, sh, mw, th; int screen, sx, sy, sw, sh, bx, by, bw, bh, mw;
char stext[1024];
DC dc = {0}; DC dc = {0};
Client *clients = NULL; Client *clients = NULL;
@ -219,12 +221,6 @@ main(int argc, char *argv[])
if(other_wm_running) if(other_wm_running)
error("dwm: another window manager is already running\n"); error("dwm: another window manager is already running\n");
sx = sy = 0;
sw = DisplayWidth(dpy, screen);
sh = DisplayHeight(dpy, screen);
mw = (sw * MASTERW) / 100;
issel = XQueryPointer(dpy, root, &w, &w, &i, &i, &i, &i, &mask);
XSetErrorHandler(0); XSetErrorHandler(0);
x_error_handler = XSetErrorHandler(error_handler); x_error_handler = XSetErrorHandler(error_handler);
@ -233,11 +229,9 @@ main(int argc, char *argv[])
wm_atom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False); wm_atom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False);
net_atom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); net_atom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False);
net_atom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); net_atom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False);
XChangeProperty(dpy, root, net_atom[NetSupported], XA_ATOM, 32, XChangeProperty(dpy, root, net_atom[NetSupported], XA_ATOM, 32,
PropModeReplace, (unsigned char *) net_atom, NetLast); PropModeReplace, (unsigned char *) net_atom, NetLast);
/* init cursors */ /* init cursors */
cursor[CurNormal] = XCreateFontCursor(dpy, XC_left_ptr); cursor[CurNormal] = XCreateFontCursor(dpy, XC_left_ptr);
cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing); cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing);
@ -251,17 +245,38 @@ main(int argc, char *argv[])
dc.border = initcolor(BORDERCOLOR); dc.border = initcolor(BORDERCOLOR);
initfont(FONT); initfont(FONT);
th = dc.font.height + 4; sx = sy = 0;
sw = DisplayWidth(dpy, screen);
sh = DisplayHeight(dpy, screen);
mw = (sw * MASTERW) / 100;
dc.drawable = XCreatePixmap(dpy, root, sw, th, DefaultDepth(dpy, screen)); wa.override_redirect = 1;
dc.gc = XCreateGC(dpy, root, 0, 0); wa.background_pixmap = ParentRelative;
wa.event_mask = ExposureMask;
bx = by = 0;
bw = sw;
dc.h = bh = dc.font.height + 4;
barwin = XCreateWindow(dpy, root, bx, by, bw, bh, 0, DefaultDepth(dpy, screen),
CopyFromParent, DefaultVisual(dpy, screen),
CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);
XDefineCursor(dpy, barwin, cursor[CurNormal]);
XMapRaised(dpy, barwin);
issel = XQueryPointer(dpy, root, &w, &w, &i, &i, &i, &i, &mask);
wa.event_mask = SubstructureRedirectMask | EnterWindowMask \ wa.event_mask = SubstructureRedirectMask | EnterWindowMask \
| LeaveWindowMask; | LeaveWindowMask;
wa.cursor = cursor[CurNormal]; wa.cursor = cursor[CurNormal];
XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa); XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa);
dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen));
dc.gc = XCreateGC(dpy, root, 0, 0);
strcpy(stext, "dwm-"VERSION);
scan_wins(); scan_wins();
draw_bar();
while(running) { while(running) {
XNextEvent(dpy, &ev); XNextEvent(dpy, &ev);