From cebe627ab6e8ee851f682a7bc46d752c06fd35cd Mon Sep 17 00:00:00 2001 From: Michael Jennings Date: Tue, 28 Dec 1999 10:05:43 +0000 Subject: [PATCH] Tue Dec 28 11:44:10 PST 1999 Michael Jennings Thanks to a cl00 from raster, double buffering is much more efficient now. :-) SVN revision: 1780 --- ChangeLog | 6 ++++++ src/feature.h | 4 ---- src/options.c | 5 ----- src/screen.c | 35 +++++++++++++++++----------------- src/screen.h | 2 ++ src/term.c | 52 ++++++++++++--------------------------------------- src/term.h | 5 ----- 7 files changed, 38 insertions(+), 71 deletions(-) diff --git a/ChangeLog b/ChangeLog index c6c4338..e14f1be 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2952,3 +2952,9 @@ Tue Dec 21 16:04:39 PST 1999 Michael Jennings the menu. ------------------------------------------------------------------------------- +Tue Dec 28 11:44:10 PST 1999 Michael Jennings + + Thanks to a cl00 from raster, double buffering is much more efficient + now. :-) + +------------------------------------------------------------------------------- diff --git a/src/feature.h b/src/feature.h index 6448a4b..c74df6e 100644 --- a/src/feature.h +++ b/src/feature.h @@ -222,10 +222,6 @@ */ #define NO_VT100_ANS -/* Checks the current value of the window title and icon name before setting them. - Can save unnecessary screen refreshes */ -#define SMART_WINDOW_TITLE - /* Allow changing of the foreground and background colors with "\E]39;color^G" */ /* #define XTERM_COLOR_CHANGE */ diff --git a/src/options.c b/src/options.c index 1d0d625..c919fb7 100644 --- a/src/options.c +++ b/src/options.c @@ -754,11 +754,6 @@ version(void) #else printf(" -NO_VT100_ANS"); #endif -#ifdef SMART_WINDOW_TITLE - printf(" +SMART_WINDOW_TITLE"); -#else - printf(" -SMART_WINDOW_TITLE"); -#endif #ifdef XTERM_COLOR_CHANGE printf(" +XTERM_COLOR_CHANGE"); #else diff --git a/src/screen.c b/src/screen.c index 7e3d6df..7ee9b55 100644 --- a/src/screen.c +++ b/src/screen.c @@ -1763,17 +1763,14 @@ scr_refresh(int type) Drawable draw_buffer; Pixmap pmap = images[image_bg].current->pmap->pixmap; int (*draw_string) (), (*draw_image_string) (); - + register int low_x = 99999, low_y = 99999, high_x = 0, high_y = 0; #ifndef NO_BOLDFONT int bfont = 0; /* we've changed font to bold font */ - #endif - #ifdef OPTIMIZE_HACKS register int nrows = TermWin.nrow; register int ncols = TermWin.ncol; #endif - #ifdef PROFILE_SCREEN static long call_cnt = 0; static long long total_time = 0; @@ -2064,24 +2061,26 @@ scr_refresh(int type) SWAP_IT(gcvalue.foreground, gcvalue.background, ltmp); gcmask |= (GCForeground | GCBackground); XChangeGC(Xdisplay, TermWin.gc, gcmask, &gcvalue); - XFillRectangle(Xdisplay, draw_buffer, TermWin.gc, - xpixel, ypixel - TermWin.font->ascent, - Width2Pixel(1), Height2Pixel(1)); + XFillRectangle(Xdisplay, draw_buffer, TermWin.gc, xpixel, ypixel - TermWin.font->ascent, Width2Pixel(1), Height2Pixel(1)); SWAP_IT(gcvalue.foreground, gcvalue.background, ltmp); XChangeGC(Xdisplay, TermWin.gc, gcmask, &gcvalue); } else { CLEAR_CHARS(xpixel, ypixel - TermWin.font->ascent, 1); } DRAW_STRING(draw_string, xpixel, ypixel, buffer, 1); + UPDATE_BOX(xpixel, ypixel - TermWin.font->ascent, xpixel + Width2Pixel(1), ypixel + Height2Pixel(1)); #ifndef NO_BOLDOVERSTRIKE - if (MONO_BOLD(rend)) + if (MONO_BOLD(rend)) { DRAW_STRING(draw_string, xpixel + 1, ypixel, buffer, 1); + UPDATE_BOX(xpixel + 1, ypixel - TermWin.font->ascent, xpixel + 1 + Width2Pixel(1), ypixel + Height2Pixel(1)); + } #endif } else #ifdef PIXMAP_SUPPORT if (background_is_pixmap() && (back == bgColor)) { CLEAR_CHARS(xpixel, ypixel - TermWin.font->ascent, len); DRAW_STRING(draw_string, xpixel, ypixel, buffer, wlen); + UPDATE_BOX(xpixel, ypixel - TermWin.font->ascent, xpixel + Width2Pixel(len), ypixel + Height2Pixel(1)); } else #endif { @@ -2089,18 +2088,21 @@ scr_refresh(int type) CLEAR_CHARS(xpixel, ypixel - TermWin.font->ascent, len); #endif DRAW_STRING(draw_image_string, xpixel, ypixel, buffer, wlen); + UPDATE_BOX(xpixel, ypixel - TermWin.font->ascent, xpixel + Width2Pixel(len), ypixel + Height2Pixel(1)); } /* do the convoluted bold overstrike */ #ifndef NO_BOLDOVERSTRIKE - if (MONO_BOLD(rend)) + if (MONO_BOLD(rend)) { DRAW_STRING(draw_string, xpixel + 1, ypixel, buffer, wlen); + UPDATE_BOX(xpixel + 1, ypixel - TermWin.font->ascent, xpixel + 1 + Width2Pixel(len), ypixel + Height2Pixel(1)); + } #endif - if ((rend & RS_Uline) && (TermWin.font->descent > 1)) - XDrawLine(Xdisplay, draw_buffer, TermWin.gc, - xpixel, ypixel + 1, - xpixel + Width2Pixel(len) - 1, ypixel + 1); + if ((rend & RS_Uline) && (TermWin.font->descent > 1)) { + XDrawLine(Xdisplay, draw_buffer, TermWin.gc, xpixel, ypixel + 1, xpixel + Width2Pixel(len) - 1, ypixel + 1); + UPDATE_BOX(xpixel, ypixel + 1, xpixel + Width2Pixel(len) - 1, ypixel + 1); + } if (is_cursor == 1) { #ifndef NO_CURSORCOLOR if (PixColors[cursorColor] != PixColors[bgColor]) { @@ -2109,9 +2111,8 @@ scr_refresh(int type) XChangeGC(Xdisplay, TermWin.gc, gcmask, &gcvalue); } #endif - XDrawRectangle(Xdisplay, draw_buffer, TermWin.gc, - xpixel, ypixel - TermWin.font->ascent, - Width2Pixel(1 + wbyte) - 1, Height2Pixel(1) - 1); + XDrawRectangle(Xdisplay, draw_buffer, TermWin.gc, xpixel, ypixel - TermWin.font->ascent, Width2Pixel(1 + wbyte) - 1, Height2Pixel(1) - 1); + UPDATE_BOX(xpixel, ypixel - TermWin.font->ascent, Width2Pixel(1 + wbyte) - 1, Height2Pixel(1) - 1); } if (gcmask) { /* restore normal colors */ gcvalue.foreground = PixColors[fgColor]; @@ -2142,7 +2143,7 @@ scr_refresh(int type) #endif } if (buffer_pixmap) { - XClearWindow(Xdisplay, TermWin.vt); + XClearArea(Xdisplay, TermWin.vt, low_x, low_y, high_x - low_x + 1, high_y - low_y + 1, False); } else { if (boldlast) { XClearArea(Xdisplay, TermWin.vt, TermWin_TotalWidth() - 2, 0, diff --git a/src/screen.h b/src/screen.h index 907b976..e7aea31 100644 --- a/src/screen.h +++ b/src/screen.h @@ -49,6 +49,8 @@ #define CLEAR_CHARS(x, y, num) ((buffer_pixmap) \ ? (XCopyArea(Xdisplay, pmap, buffer_pixmap, TermWin.gc, x, y, Width2Pixel(num), Height2Pixel(1), x, y)) \ : (XClearArea(Xdisplay, TermWin.vt, x, y, Width2Pixel(num), Height2Pixel(1), 0))) +#define UPDATE_BOX(x1, y1, x2, y2) do {if (buffer_pixmap) {if (x1 < low_x) low_x = x1; if (x2 > high_x) high_x = x2; \ + if (y1 < low_y) low_y = y1; if (y2 > high_y) high_y = y2;}} while (0) #define ERASE_ROWS(row, num) (XFillRectangle(Xdisplay, draw_buffer, TermWin.gc, Col2Pixel(0), Row2Pixel(row), TermWin.width, Height2Pixel(num))) #define DRAW_STRING(Func, x, y, str, len) Func(Xdisplay, draw_buffer, TermWin.gc, x, y, str, len) #ifndef NO_BRIGHTCOLOR diff --git a/src/term.c b/src/term.c index a76d90e..196b5e9 100644 --- a/src/term.c +++ b/src/term.c @@ -1583,67 +1583,39 @@ set_colorfgbg(void) } #endif /* NO_BRIGHTCOLOR */ -#ifdef SMART_WINDOW_TITLE static void set_title(const char *str) { + static char *name = NULL; - char *name; - - if (!str) str = APL_NAME "-" VERSION; - if (XFetchName(Xdisplay, TermWin.parent, &name) == 0) { - D_X11(("set_title(): XFetchName() failed.\n")); - name = NULL; + if (!str) { + str = APL_NAME "-" VERSION; } if (name == NULL || strcmp(name, str)) { + if (name != NULL) { + FREE(name); + } D_X11(("set_title(): Setting window title to \"%s\"\n", str)); XStoreName(Xdisplay, TermWin.parent, str); -#if DEBUG >= DEBUG_X11 - if (debug_level >= DEBUG_X11) { - if (name) XFree(name); - if (XFetchName(Xdisplay, TermWin.parent, &name) == 0) { - print_error("set_title(): Unable to set the window title to \"%s\"! What the heck is going on?!\n"); - } else if (!name || strcmp(name, str)) { - print_error("set_title(): Window title still says \"%s\" after being set to \"%s\". I am a confused Eterm. :(\n", NONULL(name), str); - } else { - D_X11(("set_title(): Succeeded.\n")); - } - } -#endif + name = StrDup(str); } - if (name) XFree(name); } static void set_icon_name(const char *str) { - - char *name; + static char *name = NULL; if (!str) str = APL_NAME "-" VERSION; - if (XGetIconName(Xdisplay, TermWin.parent, &name) == 0) { - D_X11(("set_icon_name(): XGetIconName() failed.\n")); - name = NULL; - } if (name == NULL || strcmp(name, str)) { + if (name != NULL) { + FREE(name); + } D_X11(("set_icon_name(): Setting window icon name to \"%s\"\n", str)); XSetIconName(Xdisplay, TermWin.parent, str); -#if DEBUG >= DEBUG_X11 - if (debug_level >= DEBUG_X11) { - if (name) XFree(name); - if (XGetIconName(Xdisplay, TermWin.parent, &name) == 0) { - print_error("set_icon_name(): Unable to set the window icon name to \"%s\"! What the heck is going on?!\n"); - } else if (!name || strcmp(name, str)) { - print_error("set_icon_name(): Window icon name still says \"%s\" after being set to \"%s\". I am a confused Eterm. :(\n", NONULL(name), str); - } else { - D_X11(("set_icon_name(): Succeeded.\n")); - } - } -#endif + name = StrDup(str); } - if (name) XFree(name); } -#endif /* * XTerm escape sequences: ESC ] Ps;Pt BEL diff --git a/src/term.h b/src/term.h index d606078..9a544da 100644 --- a/src/term.h +++ b/src/term.h @@ -148,11 +148,6 @@ enum color_list { default: PrivMode(state, bit); break; \ }} while (0) -#ifndef SMART_WINDOW_TITLE -# define set_title(str) XStoreName(Xdisplay, TermWin.parent, ((str) ? (str) : (APL_NAME "-" VERSION))) -# define set_icon_name(str) XSetIconName(Xdisplay, TermWin.parent, ((str) ? (str) : (APL_NAME "-" VERSION))) -#endif - /************ Variables ************/ #ifdef META8_OPTION extern unsigned char meta_char; /* Alt-key prefix */