diff options
-rw-r--r-- | action.c | 8 | ||||
-rw-r--r-- | draw.c | 68 | ||||
-rw-r--r-- | dzen.h | 12 | ||||
-rw-r--r-- | main.c | 15 |
4 files changed, 85 insertions, 18 deletions
@@ -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; @@ -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++; } } @@ -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; @@ -118,8 +118,9 @@ void free_buffer(void) { int i; for(i=0; i<dzen.slave_win.tsize; i++) { - free(dzen.slave_win.tbuf[i]); - dzen.slave_win.tbuf[i] = NULL; + free(dzen.slave_win.tbuf[i].text); + dzen.slave_win.tbuf[i].text = NULL; + dzen.slave_win.tbuf[i].fg = dzen.norm[ColFG]; } dzen.slave_win.tcnt = dzen.slave_win.last_line_vis = @@ -159,14 +160,14 @@ read_stdin(void *ptr) { void x_highlight_line(int line) { - drawtext(dzen.slave_win.tbuf[line + dzen.slave_win.first_line_vis], 1, line, dzen.slave_win.alignment); + drawtext(dzen.slave_win.tbuf[line + dzen.slave_win.first_line_vis].text, 1, line, dzen.slave_win.alignment); XCopyArea(dzen.dpy, dzen.slave_win.drawable[line], dzen.slave_win.line[line], dzen.rgc, 0, 0, dzen.slave_win.width, dzen.line_height, 0, 0); } void x_unhighlight_line(int line) { - drawtext(dzen.slave_win.tbuf[line + dzen.slave_win.first_line_vis], 0, line, dzen.slave_win.alignment); + drawtext(dzen.slave_win.tbuf[line + dzen.slave_win.first_line_vis].text, 0, line, dzen.slave_win.alignment); XCopyArea(dzen.dpy, dzen.slave_win.drawable[line], dzen.slave_win.line[line], dzen.gc, 0, 0, dzen.slave_win.width, dzen.line_height, 0, 0); } @@ -192,7 +193,7 @@ x_draw_body(void) { for(i=0; i < dzen.slave_win.max_lines; i++) { if(i < dzen.slave_win.last_line_vis) - drawtext(dzen.slave_win.tbuf[i + dzen.slave_win.first_line_vis], 0, i, dzen.slave_win.alignment); + drawtext(dzen.slave_win.tbuf[i + dzen.slave_win.first_line_vis].text, 0, i, dzen.slave_win.alignment); else if(i < dzen.slave_win.max_lines) drawtext("", 0, i, dzen.slave_win.alignment); } @@ -484,7 +485,7 @@ handle_newl(void) { dzen.slave_win.last_line_vis = 0; x_draw_body(); } - /* needed for scrollhome */ + /* needed for a_scrollhome */ else if(wa.map_state != IsUnmapped && dzen.slave_win.last_line_vis == dzen.slave_win.max_lines) x_draw_body(); @@ -577,7 +578,7 @@ init_input_buffer(void) { else dzen.slave_win.tsize = MIN_BUF_SIZE; - dzen.slave_win.tbuf = emalloc(dzen.slave_win.tsize); + dzen.slave_win.tbuf = emalloc(dzen.slave_win.tsize * sizeof(Sline)); } int |