aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--action.c8
-rw-r--r--draw.c68
-rw-r--r--dzen.h12
-rw-r--r--main.c15
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<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