From 4bf91632557e438fb7cd5e93e1511a749aafcebd Mon Sep 17 00:00:00 2001 From: gotmor Date: Mon, 16 Jul 2007 21:14:38 +0000 Subject: clean up readded text longer than line markers git-svn-id: http://dzen.googlecode.com/svn/trunk@125 f2baff5b-bf2c-0410-a398-912abdc3d8b2 --- README | 12 ++++++- action.c | 7 ++-- draw.c | 114 ++++++++++++++++++++++++++++++--------------------------------- dzen.h | 2 +- main.c | 2 ++ 5 files changed, 73 insertions(+), 64 deletions(-) diff --git a/README b/README index 62dadc1..9cf1430 100644 --- a/README +++ b/README @@ -374,7 +374,8 @@ of lines to the slave window as defined by the parameter to '-l'. This feature allows to dynamically (at runtime) set foreground and background colors for dzen's input (colored text) working in all -modes (title only, slave window and menu mode). +modes (title only, slave window and menu mode). You can specify the +colors by using their symbolic names or '#rrggbb' values. The input must be in the following format: @@ -382,17 +383,26 @@ The input must be in the following format: ^fg(red)I'm red text ^fg(blue)I am blue + Escaped version, if you view this file with dzen: + ^^fg(red)I'm red text ^^fg(blue)I am blue + * Setting foreground and/or background colors: ^bg(#ffaaaa)The ^fg(yellow)text to ^bg(blue)^fg(orange)colorize + Escaped version, if you view this file with dzen: + ^^bg(#ffaaaa)The ^^fg(yellow)text to ^^bg(blue)^fg(orange)colorize + * If you need to print '^^' characters double them in order to escape them from being interpreted ^fg(grey70)Some text containing ^^ characters + Escaped version, if you view this file with dzen: + ^^fg(grey70)Some text containing ^^^^ characters + Examples: diff --git a/action.c b/action.c index a83944f..ea66889 100644 --- a/action.c +++ b/action.c @@ -202,12 +202,14 @@ void fill_ev_table(char *input) { char *str1, *str2, *str3, *str4, *token, *subtoken, *kommatoken, *dptoken; - char *saveptr1, *saveptr2, *saveptr3, *saveptr4; + char *saveptr1=NULL, + *saveptr2=NULL, + *saveptr3=NULL, + *saveptr4=NULL; int j, i=0, k=0; long eid=0; handlerf *ah=0; - saveptr1 = NULL; /* wtf, gcc? wtf? */ for (j = 1, str1 = input; ; j++, str1 = NULL) { token = strtok_r(str1, ";", &saveptr1); if (token == NULL) @@ -267,7 +269,6 @@ a_exit(char * opt[]) { int a_collapse(char * opt[]){ - int i; (void)opt; if(!dzen.slave_win.ishmenu && dzen.slave_win.max_lines diff --git a/draw.c b/draw.c index a32f860..48820b5 100644 --- a/draw.c +++ b/draw.c @@ -29,9 +29,6 @@ textnw(const char *text, unsigned int len) { void drawtext(const char *text, int reverse, int line, int align) { - int x=0, y=0, w, h; - static char buf[1024]; - unsigned int len, olen; XRectangle r = { dzen.x, dzen.y, dzen.w, dzen.h}; @@ -46,28 +43,6 @@ drawtext(const char *text, int reverse, int line, int align) { XSetForeground(dzen.dpy, dzen.rgc, dzen.norm[ColBG]); } - - w = 0; - olen = len = strlen(text); - /* - if(len >= sizeof buf) - len = sizeof buf - 1; - memcpy(buf, text, len); - buf[len] = 0; - h = dzen.font.ascent + dzen.font.descent; - - while(len && (w = textnw(buf, len)) > dzen.w - h) - buf[--len] = 0; - if(len < olen) { - if(len > 1) - buf[len - 1] = '.'; - if(len > 2) - buf[len - 2] = '.'; - if(len > 3) - buf[len - 3] = '.'; - } - */ - if(dzen.font.set) parse_line(text, line, align, reverse); else @@ -144,7 +119,7 @@ get_tokval(const char* line, char **retdata) { int get_token(const char *line, int * t, char **tval) { - int off=0, next_pos; + int off=0, next_pos=0; char *tokval = NULL; if(*(line+1) == '^') @@ -176,16 +151,14 @@ get_token(const char *line, int * t, char **tval) { void parse_line(const char *line, int lnr, int align, int reverse) { - int i, next_pos=0, j=0, px=0, py=0, xorig, h; - char lbuf[1024]; - int cnr=0, oc, he=0; + int i, next_pos=0, j=0, px=0, py=0, xorig, h, tw, ow; + char lbuf[MAX_LINE_LEN]; int t=-1; char *tval=NULL; Drawable pm; - GC tgc; + XRectangle r = { dzen.x, dzen.y, dzen.w, dzen.h}; - tgc = XCreateGC(dzen.dpy, RootWindow(dzen.dpy, DefaultScreen(dzen.dpy)), 0, 0); h = dzen.font.ascent + dzen.font.descent; xorig = 0; py = dzen.font.ascent + (dzen.line_height - h) / 2;; @@ -199,30 +172,28 @@ parse_line(const char *line, int lnr, int align, int reverse) { } if(!reverse) { - XSetBackground(dzen.dpy, tgc, dzen.norm[ColBG]); - XSetForeground(dzen.dpy, tgc, dzen.norm[ColBG]); + XSetBackground(dzen.dpy, dzen.tgc, dzen.norm[ColBG]); + XSetForeground(dzen.dpy, dzen.tgc, dzen.norm[ColBG]); } else { - XSetBackground(dzen.dpy, tgc, dzen.norm[ColFG]); - XSetForeground(dzen.dpy, tgc, dzen.norm[ColFG]); + XSetBackground(dzen.dpy, dzen.tgc, dzen.norm[ColFG]); + XSetForeground(dzen.dpy, dzen.tgc, dzen.norm[ColFG]); } - XRectangle r = { dzen.x, dzen.y, dzen.w, dzen.h}; - XFillRectangles(dzen.dpy, pm, tgc, &r, 1); + XFillRectangles(dzen.dpy, pm, dzen.tgc, &r, 1); if(!reverse) { - XSetForeground(dzen.dpy, tgc, dzen.norm[ColFG]); + XSetForeground(dzen.dpy, dzen.tgc, dzen.norm[ColFG]); } else { - XSetForeground(dzen.dpy, tgc, dzen.norm[ColBG]); + XSetForeground(dzen.dpy, dzen.tgc, dzen.norm[ColBG]); } if( (lnr + dzen.slave_win.first_line_vis) >= dzen.slave_win.tcnt) { XmbDrawImageString(dzen.dpy, pm, dzen.font.set, - tgc, px, py, " ", strlen(" ")); + dzen.tgc, px, py, "", 0); XCopyArea(dzen.dpy, pm, dzen.slave_win.drawable[lnr], dzen.gc, 0, 0, px, dzen.line_height, xorig, 0); XFreePixmap(dzen.dpy, pm); - XFreeGC(dzen.dpy, tgc); return; } @@ -234,19 +205,35 @@ parse_line(const char *line, int lnr, int align, int reverse) { switch(t) { case fg: reverse ? - XSetBackground(dzen.dpy, tgc, getcolor(tval)) : - XSetForeground(dzen.dpy, tgc, getcolor(tval)); + XSetBackground(dzen.dpy, dzen.tgc, getcolor(tval)) : + XSetForeground(dzen.dpy, dzen.tgc, getcolor(tval)); break; case bg: reverse ? - XSetForeground(dzen.dpy, tgc, getcolor(tval)) : - XSetBackground(dzen.dpy, tgc, getcolor(tval)); + XSetForeground(dzen.dpy, dzen.tgc, getcolor(tval)) : + XSetBackground(dzen.dpy, dzen.tgc, getcolor(tval)); break; } } + ow = j; + tw = textnw(lbuf, strlen(lbuf)); + while( (tw + px) > (dzen.w - h)) { + lbuf[--j] = '\0'; + tw = textnw(lbuf, strlen(lbuf)); + } + if(j < ow) { + if(j > 1) + lbuf[j - 1] = '.'; + if(j > 2) + lbuf[j - 2] = '.'; + if(j > 3) + lbuf[j - 3] = '.'; + } + + XmbDrawImageString(dzen.dpy, pm, dzen.font.set, - tgc, px, py, lbuf, strlen(lbuf)); - px += textnw(lbuf, strlen(lbuf)); + dzen.tgc, px, py, lbuf, tw); + px += tw; j=0; t=-1; tval=NULL; /* get values */ @@ -269,19 +256,34 @@ parse_line(const char *line, int lnr, int align, int reverse) { switch(t) { case fg: reverse ? - XSetBackground(dzen.dpy, tgc, getcolor(tval)) : - XSetForeground(dzen.dpy, tgc, getcolor(tval)); + XSetBackground(dzen.dpy, dzen.tgc, getcolor(tval)) : + XSetForeground(dzen.dpy, dzen.tgc, getcolor(tval)); break; case bg: reverse ? - XSetForeground(dzen.dpy, tgc, getcolor(tval)) : - XSetBackground(dzen.dpy, tgc, getcolor(tval)); + XSetForeground(dzen.dpy, dzen.tgc, getcolor(tval)) : + XSetBackground(dzen.dpy, dzen.tgc, getcolor(tval)); break; } } + ow = j; + tw = textnw(lbuf, strlen(lbuf)); + while( (tw + px) > (dzen.w - h)) { + lbuf[--j] = '\0'; + tw = textnw(lbuf, strlen(lbuf)); + } + if(j < ow) { + if(j > 1) + lbuf[j - 1] = '.'; + if(j > 2) + lbuf[j - 2] = '.'; + if(j > 3) + lbuf[j - 3] = '.'; + } + XmbDrawImageString(dzen.dpy, pm, dzen.font.set, - tgc, px, py, lbuf, strlen(lbuf)); - px += textnw(lbuf, strlen(lbuf)); + dzen.tgc, px, py, lbuf, tw); + px += tw; if(align == ALIGNLEFT) xorig = h/2; @@ -305,13 +307,10 @@ parse_line(const char *line, int lnr, int align, int reverse) { 0, 0, px, dzen.line_height, xorig, 0); } XFreePixmap(dzen.dpy, pm); - XFreeGC(dzen.dpy, tgc); } void drawheader(const char * text) { - const char *ctext; - unsigned long colfg, colbg; dzen.x = 0; dzen.y = 0; dzen.w = dzen.title_win.width; @@ -331,9 +330,6 @@ drawheader(const char * text) { void drawbody(char * text) { - const char *ctext; - unsigned long colfg, colbg; - if(dzen.slave_win.tcnt == dzen.slave_win.tsize) free_buffer(); if(dzen.slave_win.tcnt < dzen.slave_win.tsize) { diff --git a/dzen.h b/dzen.h index 1408045..3ea113a 100644 --- a/dzen.h +++ b/dzen.h @@ -100,7 +100,7 @@ struct DZEN { unsigned int depth; Visual *visual; - GC gc, rgc; + GC gc, rgc, tgc; Fnt font; Bool ispersistent; diff --git a/main.c b/main.c index 765d728..c209d24 100644 --- a/main.c +++ b/main.c @@ -433,6 +433,8 @@ x_create_windows(void) { dzen.rgc = XCreateGC(dzen.dpy, root, 0, 0); XSetForeground(dzen.dpy, dzen.rgc, dzen.norm[ColBG]); XSetBackground(dzen.dpy, dzen.rgc, dzen.norm[ColFG]); + dzen.tgc = XCreateGC(dzen.dpy, root, 0, 0); + } static void -- cgit v1.2.3-54-g00ecf