From f56eb1958726097b75ea13370188a9d8d2031591 Mon Sep 17 00:00:00 2001 From: gotmor Date: Sat, 9 Jun 2007 10:17:43 +0000 Subject: reduce flicker git-svn-id: http://dzen.googlecode.com/svn/trunk@76 f2baff5b-bf2c-0410-a398-912abdc3d8b2 --- draw.c | 12 +++++++----- dzen.h | 2 +- main.c | 44 +++++++++++++++++++++----------------------- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/draw.c b/draw.c index ed6ade3..c98ae77 100644 --- a/draw.c +++ b/draw.c @@ -19,7 +19,7 @@ textnw(const char *text, unsigned int len) { } -void +void drawtext(const char *text, int reverse, int line, int align) { int x, y, w, h; static char buf[1024]; @@ -30,10 +30,12 @@ drawtext(const char *text, int reverse, int line, int align) { mgc = reverse ? dzen.gc : dzen.rgc; + if(line == -1) /* title window */ XFillRectangles(dzen.dpy, dzen.title_win.drawable, mgc, &r, 1); else /* slave window */ - XFillRectangles(dzen.dpy, dzen.slave_win.drawable, mgc, &r, 1); + XFillRectangles(dzen.dpy, dzen.slave_win.drawable[line], mgc, &r, 1); + if(!text) return; @@ -77,10 +79,10 @@ drawtext(const char *text, int reverse, int line, int align) { mgc = reverse ? dzen.rgc : dzen.gc; if(dzen.font.set) { if(line == -1) - XmbDrawString(dzen.dpy, dzen.title_win.drawable, dzen.font.set, + XmbDrawString(dzen.dpy, dzen.title_win.drawable, dzen.font.set, mgc, x, y, buf, len); else - XmbDrawString(dzen.dpy, dzen.slave_win.drawable, dzen.font.set, + XmbDrawString(dzen.dpy, dzen.slave_win.drawable[line], dzen.font.set, mgc, x, y, buf, len); } else { @@ -88,7 +90,7 @@ drawtext(const char *text, int reverse, int line, int align) { XChangeGC(dzen.dpy, mgc, GCForeground | GCFont, &gcv); if(line != -1) - XDrawString(dzen.dpy, dzen.slave_win.drawable, + XDrawString(dzen.dpy, dzen.slave_win.drawable[line], mgc, x, y, buf, len); else XDrawString(dzen.dpy, dzen.title_win.drawable, diff --git a/dzen.h b/dzen.h index dfaac23..34a68da 100644 --- a/dzen.h +++ b/dzen.h @@ -51,7 +51,7 @@ struct SW { Window win; Window *line; - Drawable drawable; + Drawable *drawable; char *tbuf[BUF_SIZE]; int tcnt; diff --git a/main.c b/main.c index 827cc0e..75780e3 100644 --- a/main.c +++ b/main.c @@ -36,9 +36,10 @@ clean_up(void) { XFreePixmap(dzen.dpy, dzen.title_win.drawable); if(dzen.slave_win.max_lines) { - XFreePixmap(dzen.dpy, dzen.slave_win.drawable); - for(i=0; i < dzen.slave_win.max_lines; i++) + for(i=0; i < dzen.slave_win.max_lines; i++) { + XFreePixmap(dzen.dpy, dzen.slave_win.drawable[i]); XDestroyWindow(dzen.dpy, dzen.slave_win.line[i]); + } free(dzen.slave_win.line); XDestroyWindow(dzen.dpy, dzen.slave_win.win); } @@ -150,15 +151,15 @@ read_stdin(void *ptr) { static void x_highlight_line(int line) { - drawtext(dzen.slave_win.tbuf[line + dzen.slave_win.first_line_vis], 1, line+1, dzen.slave_win.alignment); - XCopyArea(dzen.dpy, dzen.slave_win.drawable, dzen.slave_win.line[line], dzen.rgc, + drawtext(dzen.slave_win.tbuf[line + dzen.slave_win.first_line_vis], 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); } static void x_unhighlight_line(int line) { - drawtext(dzen.slave_win.tbuf[line + dzen.slave_win.first_line_vis], 0, line+1, dzen.slave_win.alignment); - XCopyArea(dzen.dpy, dzen.slave_win.drawable, dzen.slave_win.line[line], dzen.gc, + drawtext(dzen.slave_win.tbuf[line + dzen.slave_win.first_line_vis], 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); } @@ -182,17 +183,14 @@ x_draw_body(void) { } for(i=0; i < dzen.slave_win.max_lines; i++) { - if(i < dzen.slave_win.last_line_vis) { + 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); - XCopyArea(dzen.dpy, dzen.slave_win.drawable, dzen.slave_win.line[i], dzen.gc, - 0, 0, dzen.slave_win.width, dzen.line_height, 0, 0); - } - else if(i < dzen.slave_win.max_lines) { + else if(i < dzen.slave_win.max_lines) drawtext("", 0, i, dzen.slave_win.alignment); - XCopyArea(dzen.dpy, dzen.slave_win.drawable, dzen.slave_win.line[i], dzen.gc, - 0, 0, dzen.slave_win.width, dzen.line_height, 0, 0); - } } + for(i=0; i < dzen.slave_win.max_lines; i++) + XCopyArea(dzen.dpy, dzen.slave_win.drawable[i], dzen.slave_win.line[i], dzen.gc, + 0, 0, dzen.slave_win.width, dzen.line_height, 0, 0); } static void @@ -305,6 +303,8 @@ x_create_windows(void) { if(dzen.slave_win.max_lines) { dzen.slave_win.first_line_vis = 0; dzen.slave_win.last_line_vis = 0; + dzen.slave_win.line = emalloc(sizeof(Window) * dzen.slave_win.max_lines); + dzen.slave_win.drawable = emalloc(sizeof(Drawable) * dzen.slave_win.max_lines); /* horizontal menu mode */ if(dzen.slave_win.ishmenu) { @@ -322,11 +322,11 @@ x_create_windows(void) { DefaultVisual(dzen.dpy, dzen.screen), CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa); - dzen.slave_win.drawable = XCreatePixmap(dzen.dpy, root, ew+r, - dzen.line_height, DefaultDepth(dzen.dpy, dzen.screen)); + for(i=0; i < dzen.slave_win.max_lines; i++) + dzen.slave_win.drawable[i] = XCreatePixmap(dzen.dpy, root, ew+r, + dzen.line_height, DefaultDepth(dzen.dpy, dzen.screen)); /* windows holding the lines */ - dzen.slave_win.line = emalloc(sizeof(Window) * dzen.slave_win.max_lines); for(i=0; i < dzen.slave_win.max_lines; i++) dzen.slave_win.line[i] = XCreateWindow(dzen.dpy, dzen.slave_win.win, i*ew, 0, (i == dzen.slave_win.max_lines-1) ? ew+r : ew, dzen.line_height, 0, @@ -355,19 +355,17 @@ x_create_windows(void) { DefaultVisual(dzen.dpy, dzen.screen), CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa); - dzen.slave_win.drawable = XCreatePixmap(dzen.dpy, root, dzen.slave_win.width, - dzen.line_height, DefaultDepth(dzen.dpy, dzen.screen)); + for(i=0; i < dzen.slave_win.max_lines; i++) + dzen.slave_win.drawable[i] = XCreatePixmap(dzen.dpy, root, dzen.slave_win.width, + dzen.line_height, DefaultDepth(dzen.dpy, dzen.screen)); /* windows holding the lines */ - dzen.slave_win.line = emalloc(sizeof(Window) * dzen.slave_win.max_lines); - for(i=0; i < dzen.slave_win.max_lines; i++) { + for(i=0; i < dzen.slave_win.max_lines; i++) dzen.slave_win.line[i] = XCreateWindow(dzen.dpy, dzen.slave_win.win, 0, i*dzen.line_height, dzen.slave_win.width, dzen.line_height, 0, DefaultDepth(dzen.dpy, dzen.screen), CopyFromParent, DefaultVisual(dzen.dpy, dzen.screen), CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa); - } - } } /* normal GC */ -- cgit v1.2.3-54-g00ecf