From bdf54d91e050b68f8b72b74c3494ce6b3326a37b Mon Sep 17 00:00:00 2001 From: gotmor Date: Thu, 14 Jun 2007 11:04:40 +0000 Subject: added dynamic color support git-svn-id: http://dzen.googlecode.com/svn/trunk@95 f2baff5b-bf2c-0410-a398-912abdc3d8b2 --- action.c | 8 ++++---- draw.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ dzen.h | 12 +++++++++++- main.c | 15 +++++++------- 4 files changed, 85 insertions(+), 18 deletions(-) diff --git a/action.c b/action.c index fe0e0d1..8923017 100644 --- a/action.c +++ b/action.c @@ -336,8 +336,8 @@ a_scrollup(char * opt[]) { if(opt[0]) n = atoi(opt[0]); - if(dzen.slave_win.max_lines) - scroll(-1*n); + if(dzen.slave_win.max_lines) + scroll(-1*n); return 0; } @@ -405,7 +405,7 @@ int a_menuprint(char * opt[]) { if(dzen.slave_win.ismenu && dzen.slave_win.sel_line != -1 && (dzen.slave_win.sel_line + dzen.slave_win.first_line_vis) < dzen.slave_win.tcnt) { - puts(dzen.slave_win.tbuf[dzen.slave_win.sel_line + dzen.slave_win.first_line_vis]); + puts(dzen.slave_win.tbuf[dzen.slave_win.sel_line + dzen.slave_win.first_line_vis].text); dzen.slave_win.sel_line = -1; fflush(stdout); } @@ -416,7 +416,7 @@ int a_menuexec(char * opt[]) { if(dzen.slave_win.ismenu && dzen.slave_win.sel_line != -1 && (dzen.slave_win.sel_line + dzen.slave_win.first_line_vis) < dzen.slave_win.tcnt) { - spawn(dzen.slave_win.tbuf[dzen.slave_win.sel_line + dzen.slave_win.first_line_vis]); + spawn(dzen.slave_win.tbuf[dzen.slave_win.sel_line + dzen.slave_win.first_line_vis].text); dzen.slave_win.sel_line = -1; } return 0; diff --git a/draw.c b/draw.c index 79d2dd2..3f670e7 100644 --- a/draw.c +++ b/draw.c @@ -31,8 +31,27 @@ drawtext(const char *text, int reverse, int line, int align) { XRectangle r = { dzen.x, dzen.y, dzen.w, dzen.h}; + if(line != -1) { + if(reverse) { + if(dzen.slave_win.tbuf[line].text) { + XSetForeground(dzen.dpy, dzen.rgc, dzen.norm[ColBG]); + XSetBackground(dzen.dpy, dzen.rgc, dzen.slave_win.tbuf[line].fg); + } else { + XSetForeground(dzen.dpy, dzen.rgc, dzen.norm[ColBG]); + XSetBackground(dzen.dpy, dzen.rgc, dzen.norm[ColFG]); + } + } else { + if(dzen.slave_win.tbuf[line].text) { + XSetForeground(dzen.dpy, dzen.gc, dzen.slave_win.tbuf[line].fg); + XSetBackground(dzen.dpy, dzen.gc, dzen.norm[ColBG]); + } else { + XSetForeground(dzen.dpy, dzen.gc, dzen.norm[ColFG]); + XSetBackground(dzen.dpy, dzen.gc, dzen.norm[ColBG]); + } + } + } + mgc = reverse ? dzen.gc : dzen.rgc; - if(line == -1) /* title window */ XFillRectangles(dzen.dpy, dzen.title_win.drawable, mgc, &r, 1); else /* slave window */ @@ -83,17 +102,19 @@ drawtext(const char *text, int reverse, int line, int align) { if(line == -1) XmbDrawString(dzen.dpy, dzen.title_win.drawable, dzen.font.set, mgc, x, y, buf, len); - else + else { XmbDrawString(dzen.dpy, dzen.slave_win.drawable[line], dzen.font.set, mgc, x, y, buf, len); + } } else { gcv.font = dzen.font.xfont->fid; XChangeGC(dzen.dpy, mgc, GCForeground | GCFont, &gcv); - if(line != -1) + if(line != -1) { XDrawString(dzen.dpy, dzen.slave_win.drawable[line], mgc, x, y, buf, len); + } else XDrawString(dzen.dpy, dzen.title_win.drawable, mgc, x, y, buf, len); @@ -153,25 +174,60 @@ textw(const char *text) { return textnw(text, strlen(text)) + dzen.font.height; } +char * +setlinecolor(char * text, unsigned long * col) { + char fgcolor[8]; + unsigned long newfg; + + if(text[0] == '^' && text[1] == '#') { + strncpy(fgcolor, text+1, 7); + fgcolor[7] = '\0'; + newfg = getcolor(fgcolor); + *col = newfg; + return text+8; + } + + return NULL; +} + void drawheader(char * text) { + char *ctext; + unsigned long col; dzen.x = 0; dzen.y = 0; dzen.w = dzen.title_win.width; dzen.h = dzen.line_height; - if(text) - drawtext(text, 0, -1, dzen.title_win.alignment); + if(text) { + if(ctext = setlinecolor(text, &col)) { + XSetForeground(dzen.dpy, dzen.gc, col); + drawtext(ctext, 0, -1, dzen.title_win.alignment); + XSetForeground(dzen.dpy, dzen.gc, dzen.norm[ColFG]); + } + else + drawtext(text, 0, -1, dzen.title_win.alignment); + } + XCopyArea(dzen.dpy, dzen.title_win.drawable, dzen.title_win.win, dzen.gc, 0, 0, dzen.title_win.width, dzen.line_height, 0, 0); } void drawbody(char * text) { + char *ctext; + unsigned long col; + if(dzen.slave_win.tcnt == dzen.slave_win.tsize) free_buffer(); if(dzen.slave_win.tcnt < dzen.slave_win.tsize) { - dzen.slave_win.tbuf[dzen.slave_win.tcnt] = estrdup(text); + if(ctext = setlinecolor(text, &col)) { + dzen.slave_win.tbuf[dzen.slave_win.tcnt].fg = col; + dzen.slave_win.tbuf[dzen.slave_win.tcnt].text = estrdup(ctext); + } else { + dzen.slave_win.tbuf[dzen.slave_win.tcnt].fg = dzen.norm[ColFG]; + dzen.slave_win.tbuf[dzen.slave_win.tcnt].text = estrdup(text); + } dzen.slave_win.tcnt++; } } diff --git a/dzen.h b/dzen.h index be82e44..654cdb6 100644 --- a/dzen.h +++ b/dzen.h @@ -28,6 +28,7 @@ typedef struct DZEN Dzen; typedef struct Fnt Fnt; typedef struct TW TWIN; typedef struct SW SWIN; +typedef struct _Sline Sline; struct Fnt { XFontStruct *xfont; @@ -37,6 +38,12 @@ struct Fnt { int height; }; +struct _Sline { + unsigned long fg; + unsigned long bg; + char * text; +}; + /* title window */ struct TW { int x, y, width, height; @@ -56,9 +63,12 @@ struct SW { Drawable *drawable; /* input buffer */ - char **tbuf; + //char **tbuf; + Sline *tbuf; int tsize; int tcnt; + /* line fg colors */ + unsigned long *tcol; int max_lines; int first_line_vis; diff --git a/main.c b/main.c index 930adb6..ff756cf 100644 --- a/main.c +++ b/main.c @@ -118,8 +118,9 @@ void free_buffer(void) { int i; for(i=0; i