MANIFEST | 2 XTerm.ad | 3 button.c | 16 ++- charproc.c | 38 ++++++++ debian/changelog | 12 ++ debian/patches/900_debian_xterm.diff | 6 - debian/patches/901_xterm_manpage.diff | 2 debian/patches/902_pointermode_never.diff | 21 ---- debian/patches/903_windowops.diff | 13 -- debian/patches/series | 2 debian/rules | 3 fontutils.c | 137 +++++++++++++++++++++++++++++- linedata.c | 3 main.h | 4 menu.c | 37 +++++++- menu.h | 6 + ptyx.h | 6 - screen.c | 33 ++++--- scrollbar.c | 5 - trace.c | 4 util.c | 90 ++++++++++++------- version.h | 4 xterm.h | 10 +- xterm.log.html | 53 +++++++++++ xterm.man | 32 ++++++- 25 files changed, 423 insertions(+), 119 deletions(-)
New commits: commit 454cb8832c9c26c9f14b5799869ab95a2c2d87c5 Author: Julien Cristau <jcris...@debian.org> Date: Sun Oct 4 15:35:31 2009 +0200 New upstream release. * Upstream changed the default of AllowWindowOps to false, remove patch 903_windowops.diff. * Use the upstream default for pointerMode; drop patch 902_pointermode_never.diff. diff --git a/debian/changelog b/debian/changelog index 6af25ab..1f80091 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,15 @@ +xterm (249-1) unstable; urgency=low + + * New upstream release. + + add limit-checks for result of visual_width() function, needed from + patch #242 and exposed by #244 changes (closes: #548321). + * Upstream changed the default of AllowWindowOps to false, remove patch + 903_windowops.diff. + * Use the upstream default for pointerMode; drop patch + 902_pointermode_never.diff. + + -- Julien Cristau <jcris...@debian.org> Sun, 04 Oct 2009 15:40:16 +0200 + xterm (248-1) unstable; urgency=low * New upstream release diff --git a/debian/patches/900_debian_xterm.diff b/debian/patches/900_debian_xterm.diff index f455a30..d2e3e7b 100644 --- a/debian/patches/900_debian_xterm.diff +++ b/debian/patches/900_debian_xterm.diff @@ -78,7 +78,7 @@ Index: xterm/XTerm.ad =================================================================== --- xterm.orig/XTerm.ad +++ xterm/XTerm.ad -@@ -121,6 +121,10 @@ +@@ -122,6 +122,10 @@ *tek4014*font3: 6x13 *tek4014*fontSmall: 6x10 @@ -93,7 +93,7 @@ Index: xterm/XTerm-col.ad =================================================================== --- xterm.orig/XTerm-col.ad +++ xterm/XTerm-col.ad -@@ -7,9 +7,9 @@ +@@ -6,9 +6,9 @@ *VT100*boldColors: on *VT100*dynamicColors: on @@ -106,7 +106,7 @@ Index: xterm/XTerm-col.ad ! - OR - ! Uncomment this for black text on a "white" background. -@@ -114,20 +114,32 @@ +@@ -113,20 +113,32 @@ *Form.background: AntiqueWhite *form.background: AntiqueWhite diff --git a/debian/patches/901_xterm_manpage.diff b/debian/patches/901_xterm_manpage.diff index ce7009f..0f9cb2b 100644 --- a/debian/patches/901_xterm_manpage.diff +++ b/debian/patches/901_xterm_manpage.diff @@ -7,7 +7,7 @@ Index: xterm/xterm.man =================================================================== --- xterm.orig/xterm.man +++ xterm/xterm.man -@@ -5051,10 +5051,10 @@ +@@ -5077,10 +5077,10 @@ .SH FILES The actual pathnames given may differ on your system. .TP 5 diff --git a/debian/patches/902_pointermode_never.diff b/debian/patches/902_pointermode_never.diff deleted file mode 100644 index e529489..0000000 --- a/debian/patches/902_pointermode_never.diff +++ /dev/null @@ -1,21 +0,0 @@ -Debian-specific tweak: the pointerMode resource is set to 0 (never) -by default. - -Index: xterm/xterm.man -=================================================================== ---- xterm.orig/xterm.man -+++ xterm/xterm.man -@@ -2691,11 +2691,11 @@ - .RS - .TP 3 - 0 --never -+never. -+This is the default. - .TP 3 - 1 - the application running in \fIxterm\fP has not activated mouse mode. --This is the default. - .TP 3 - 2 - always. diff --git a/debian/patches/903_windowops.diff b/debian/patches/903_windowops.diff deleted file mode 100644 index 771a5ff..0000000 --- a/debian/patches/903_windowops.diff +++ /dev/null @@ -1,13 +0,0 @@ -Index: xterm/xterm.man -=================================================================== ---- xterm.orig/xterm.man -+++ xterm/xterm.man -@@ -1536,7 +1536,7 @@ - .B "allowWindowOps (\fPclass\fB AllowWindowOps)" - Specifies whether extended window control sequences (as used in dtterm) - should be allowed. --The default is \*(``true.\*('' -+The default is \*(``false.\*('' - .TP 8 - .B "altIsNotMeta (\fPclass\fB AltIsNotMeta\fP)" - If \*(``true\*('', treat the Alt-key as if it were the Meta-key. diff --git a/debian/patches/series b/debian/patches/series index 8b585bb..7150b37 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,5 +1,3 @@ 900_debian_xterm.diff 901_xterm_manpage.diff -902_pointermode_never.diff -903_windowops.diff 904_fontops.diff diff --git a/debian/rules b/debian/rules index 32c5fea..21ae2b0 100755 --- a/debian/rules +++ b/debian/rules @@ -36,11 +36,8 @@ HTML2TEXT:=lynx -dump -nolist DESKTOP_FLAGS = --vendor debian \ --dir=$(DEBTREEDIR)/usr/share/applications -# by default, never hide the cursor -CFLAGS += -DDEF_POINTER_MODE=pNever # disable some unsafe operations CFLAGS += \ - -DDEF_ALLOW_WINDOW=False \ -DDEF_ALLOW_FONT=False \ -DDEF_ALLOW_TCAP=False commit 2ddbf56f023b3133b4b3a6274273747be0fce979 Author: Julien Cristau <jcris...@debian.org> Date: Sun Oct 4 15:29:38 2009 +0200 Import xterm 249 diff --git a/MANIFEST b/MANIFEST index 603e76f..83163f5 100644 --- a/MANIFEST +++ b/MANIFEST @@ -1,4 +1,4 @@ -MANIFEST for xterm-247, version xterm-247 +MANIFEST for xterm-249, version xterm-249 -------------------------------------------------------------------------------- MANIFEST this file 256colres.h resource-definitions for 256-color mode diff --git a/XTerm.ad b/XTerm.ad index f186e66..5670bdb 100644 --- a/XTerm.ad +++ b/XTerm.ad @@ -1,4 +1,4 @@ -! $XTermId: XTerm.ad,v 1.89 2009/08/15 15:58:44 tom Exp $ +! $XTermId: XTerm.ad,v 1.90 2009/09/27 22:02:30 tom Exp $ *saveLines: 1024 @@ -88,6 +88,7 @@ *fontMenu*font-linedrawing*Label: Line-Drawing Characters *fontMenu*font-doublesize*Label: Doublesized Characters *fontMenu*font-loadable*Label: VT220 Soft Fonts +*fontMenu*font-packed*Label: Packed Font *fontMenu*render-font*Label: TrueType Fonts *fontMenu*utf8-mode*Label: UTF-8 *fontMenu*utf8-title*Label: UTF-8 Titles diff --git a/button.c b/button.c index 41019b0..877b209 100644 --- a/button.c +++ b/button.c @@ -1,4 +1,4 @@ -/* $XTermId: button.c,v 1.352 2009/09/11 09:13:53 tom Exp $ */ +/* $XTermId: button.c,v 1.355 2009/10/01 09:06:20 tom Exp $ */ /* * Copyright 1999-2008,2009 by Thomas E. Dickey @@ -2427,7 +2427,7 @@ ResizeSelection(TScreen * screen GCC_UNUSED, int rows, int cols) Bool iswide(int i) { - return (i == HIDDEN_CHAR) || ((i >= FIRST_WIDECHAR) && my_wcwidth(i) == 2); + return (i == HIDDEN_CHAR) || (WideCells(i) == 2); } #define isWideCell(row, col) iswide((int)XTERM_CELL(row, col)) @@ -2624,12 +2624,16 @@ okPosition(TScreen * screen, LineData ** ld, CELL * cell) { - if (cell->col > (LastTextCol(screen, *ld, cell->row) + 1)) { + Boolean result = True; + + if (cell->row >= screen->max_row) { + result = False; + } else if (cell->col > (LastTextCol(screen, *ld, cell->row) + 1)) { cell->col = 0; *ld = GET_LINEDATA(screen, ++cell->row); - return False; + result = False; } - return True; + return result; } static void @@ -2637,7 +2641,7 @@ trimLastLine(TScreen * screen, LineData ** ld, CELL * last) { - if (screen->cutNewline) { + if (screen->cutNewline && last->row < screen->max_row) { last->col = 0; *ld = GET_LINEDATA(screen, ++last->row); } else { diff --git a/charproc.c b/charproc.c index 79b973f..6e7b7b6 100644 --- a/charproc.c +++ b/charproc.c @@ -1,4 +1,4 @@ -/* $XTermId: charproc.c,v 1.972 2009/09/10 09:03:49 tom Exp $ */ +/* $XTermId: charproc.c,v 1.974 2009/09/27 22:37:54 tom Exp $ */ /* @@ -328,6 +328,7 @@ static XtActionsRec actionsList[] = { #endif #if OPT_BOX_CHARS { "set-font-linedrawing", HandleFontBoxChars }, + { "set-font-packed", HandleFontPacked }, #endif #if OPT_DABBREV { "dabbrev-expand", HandleDabbrevExpand }, @@ -532,6 +533,7 @@ static XtResource resources[] = #if OPT_BOX_CHARS Bres(XtNforceBoxChars, XtCForceBoxChars, screen.force_box_chars, False), + Bres(XtNforcePackedFont, XtCForcePackedFont, screen.force_packed, True), Bres(XtNshowMissingGlyphs, XtCShowMissingGlyphs, screen.force_all_chars, False), #endif @@ -5497,6 +5499,7 @@ VTInitialize(Widget wrequest, #if OPT_BOX_CHARS init_Bres(screen.force_box_chars); + init_Bres(screen.force_packed); init_Bres(screen.force_all_chars); #endif init_Bres(screen.free_bold_box); @@ -7389,6 +7392,39 @@ HandleBlinking(XtPointer closure, XtIntervalId * id GCC_UNUSED) } #endif /* OPT_BLINK_CURS || OPT_BLINK_TEXT */ +void +RestartBlinking(TScreen * screen GCC_UNUSED) +{ +#if OPT_BLINK_CURS || OPT_BLINK_TEXT + if (screen->blink_timer == 0) { + Bool resume = False; + +#if OPT_BLINK_CURS + if (DoStartBlinking(screen)) { + resume = True; + } +#endif +#if OPT_BLINK_TEXT + if (!resume) { + int row; + + for (row = screen->max_row; row >= 0; row--) { + LineData *ld = getLineData(screen, ROW2INX(screen, row)); + if (LineTstBlinked(ld)) { + if (LineHasBlinking(screen, ld)) { + resume = True; + break; + } + } + } + } +#endif + if (resume) + StartBlinking(screen); + } +#endif +} + /* * Implement soft or hard (full) reset of the VTxxx emulation. There are a * couple of differences from real DEC VTxxx terminals (to avoid breaking diff --git a/fontutils.c b/fontutils.c index 9eb94a2..904b56c 100644 --- a/fontutils.c +++ b/fontutils.c @@ -1,4 +1,4 @@ -/* $XTermId: fontutils.c,v 1.307 2009/08/07 23:22:32 tom Exp $ */ +/* $XTermId: fontutils.c,v 1.314 2009/09/30 09:37:45 tom Exp $ */ /************************************************************ @@ -158,6 +158,37 @@ compatibleWideCounts(XFontStruct * wfs, XFontStruct * wbfs) } #endif /* OPT_WIDE_CHARS */ +#if OPT_BOX_CHARS +static void +setupPackedFonts(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + Bool value = False; + +#if OPT_RENDERFONT +#define MIXED(name) screen->name[fontnum].map.mixed + if (xw->misc.render_font) { + int fontnum = screen->menu_font_number; + + screen->allow_packing = (Boolean) (MIXED(renderFontNorm) + || MIXED(renderFontBold) + || MIXED(renderFontItal) +#if OPT_RENDERWIDE + || MIXED(renderWideNorm) + || MIXED(renderWideBold) + || MIXED(renderWideItal) +#endif + ); +#undef MIXED + } +#endif /* OPT_RENDERFONT */ + + value = screen->allow_packing; + + SetItemSensitivity(fontMenuEntries[fontMenu_font_packedfont].widget, value); +} +#endif + /* * Returns the fields from start to stop in a dash- separated string. This * function will modify the source, putting '\0's in the appropiate place and @@ -1090,7 +1121,11 @@ xtermLoadFont(XtermWidget xw, } }); - screen->fnt_prop = proportional; +#if OPT_BOX_CHARS + screen->allow_packing = proportional; + setupPackedFonts(xw); +#endif + screen->fnt_prop = (Boolean) (proportional && !(screen->force_packed)); screen->fnt_boxes = True; #if OPT_BOX_CHARS @@ -1438,6 +1473,87 @@ xtermSetCursorBox(TScreen * screen) #if OPT_RENDERFONT +#if OPT_TRACE > 1 +static FcChar32 +xtermXftFirstChar(XftFont * xft) +{ + FcChar32 map[FC_CHARSET_MAP_SIZE]; + FcChar32 next; + FcChar32 first; + int i; + + first = FcCharSetFirstPage(xft->charset, map, &next); + for (i = 0; i < FC_CHARSET_MAP_SIZE; i++) + if (map[i]) { + FcChar32 bits = map[i]; + first += i * 32; + while (!(bits & 0x1)) { + bits >>= 1; + first++; + } + break; + } + return first; +} + +static FcChar32 +xtermXftLastChar(XftFont * xft) +{ + FcChar32 this, last, next; + FcChar32 map[FC_CHARSET_MAP_SIZE]; + int i; + last = FcCharSetFirstPage(xft->charset, map, &next); + while ((this = FcCharSetNextPage(xft->charset, map, &next)) != FC_CHARSET_DONE) + last = this; + last &= ~0xff; + for (i = FC_CHARSET_MAP_SIZE - 1; i >= 0; i--) + if (map[i]) { + FcChar32 bits = map[i]; + last += i * 32 + 31; + while (!(bits & 0x80000000)) { + last--; + bits <<= 1; + } + break; + } + return (long) last; +} + +static void +dumpXft(XtermWidget xw, XTermXftFonts * data) +{ + XftFont *xft = data->font; + TScreen *screen = TScreenOf(xw); + VTwin *win = WhichVWin(screen); + + FcChar32 c; + FcChar32 first = xtermXftFirstChar(xft); + FcChar32 last = xtermXftLastChar(xft); + unsigned count = 0; + unsigned outside = 0; + + TRACE(("dumpXft {{\n")); + TRACE((" data range %#6x..%#6x\n", first, last)); + for (c = first; c <= last; ++c) { + if (FcCharSetHasChar(xft->charset, c)) { + int width = my_wcwidth((int) c); + XGlyphInfo extents; + + XftTextExtents32(XtDisplay(xw), xft, &c, 1, &extents); + TRACE(("%#6x %2d %.1f\n", c, width, + ((double) extents.width) / win->f_width)); + if (extents.width > win->f_width) + ++outside; + ++count; + } + } + TRACE(("}} %u total, %u outside\n", count, outside)); +} +#define DUMP_XFT(xw, data) dumpXft(xw, data) +#else +#define DUMP_XFT(xw, data) /* nothing */ +#endif + static void checkXft(XtermWidget xw, XTermXftFonts * data, XftFont * xft) { @@ -1449,6 +1565,8 @@ checkXft(XtermWidget xw, XTermXftFonts * data, XftFont * xft) data->map.max_width = (Dimension) xft->max_advance_width; for (c = 32; c < 256; ++c) { + if (c >= 128 && c < 159) + continue; if (FcCharSetHasChar(xft->charset, c)) { XGlyphInfo extents; @@ -1805,6 +1923,19 @@ xtermComputeFontInfo(XtermWidget xw, setRenderFontsize(screen, win, norm, NULL); setRenderFontsize(screen, win, bold, "bold"); setRenderFontsize(screen, win, ital, "ital"); +#if OPT_BOX_CHARS + setupPackedFonts(xw); + + if (screen->force_packed) { + XTermXftFonts *use = &(screen->renderFontNorm[fontnum]); + win->f_height = use->font->ascent + use->font->descent; + win->f_width = use->map.min_width; + TRACE(("...packed TrueType font %dx%d\n", + win->f_height, + win->f_width)); + } +#endif + DUMP_XFT(xw, &(screen->renderFontNorm[fontnum])); } } /* @@ -1813,7 +1944,7 @@ xtermComputeFontInfo(XtermWidget xw, if (!xw->misc.render_font || IsIconWin(screen, win)) #endif /* OPT_RENDERFONT */ { - if (is_double_width_font(font)) { + if (is_double_width_font(font) && !(screen->fnt_prop)) { win->f_width = (font->min_bounds.width); } else { win->f_width = (font->max_bounds.width); diff --git a/linedata.c b/linedata.c index 9896a44..e097b40 100644 --- a/linedata.c +++ b/linedata.c @@ -1,4 +1,4 @@ -/* $XTermId: linedata.c,v 1.71 2009/08/09 00:34:16 tom Exp $ */ +/* $XTermId: linedata.c,v 1.72 2009/09/28 23:58:59 tom Exp $ */ /************************************************************ @@ -61,6 +61,7 @@ getLineData(TScreen * screen, int row) #endif } if (row >= 0) { + assert(row <= screen->max_row); result = (LineData *) scrnHeadAddr(screen, buffer, (unsigned) row); if (result != 0) { #if 1 /* FIXME - these should be done in setupLineData, etc. */ diff --git a/main.h b/main.h index 8b0fe3a..8e18d4c 100644 --- a/main.h +++ b/main.h @@ -1,4 +1,4 @@ -/* $XTermId: main.h,v 1.42 2009/03/28 17:39:51 tom Exp $ */ +/* $XTermId: main.h,v 1.43 2009/10/02 00:02:26 tom Exp $ */ /* * Copyright 2000-2008,2009 by Thomas E. Dickey @@ -104,7 +104,7 @@ #endif #ifndef DEF_ALLOW_WINDOW -#define DEF_ALLOW_WINDOW True +#define DEF_ALLOW_WINDOW False #endif #if OPT_BLINK_TEXT diff --git a/menu.c b/menu.c index 19a1bb9..79377b3 100644 --- a/menu.c +++ b/menu.c @@ -1,4 +1,4 @@ -/* $XTermId: menu.c,v 1.252 2009/07/03 15:01:14 tom Exp $ */ +/* $XTermId: menu.c,v 1.253 2009/09/27 22:36:07 tom Exp $ */ /* @@ -177,6 +177,7 @@ static void do_cursorblink PROTO_XT_CALLBACK_ARGS; #if OPT_BOX_CHARS static void do_font_boxchars PROTO_XT_CALLBACK_ARGS; +static void do_font_packed PROTO_XT_CALLBACK_ARGS; #endif #if OPT_DEC_CHRSET @@ -351,6 +352,7 @@ MenuEntry fontMenuEntries[] = { { "line1", NULL, NULL }, #if OPT_BOX_CHARS { "font-linedrawing",do_font_boxchars,NULL }, + { "font-packed", do_font_packed,NULL }, #endif #if OPT_DEC_CHRSET { "font-doublesize",do_font_doublesize,NULL }, @@ -713,6 +715,10 @@ domenu(Widget w, SetItemSensitivity( fontMenuEntries[fontMenu_font_boxchars].widget, True); + update_font_packed(); + SetItemSensitivity( + fontMenuEntries[fontMenu_font_packedfont].widget, + True); #endif #if OPT_DEC_SOFTFONT /* FIXME: not implemented */ update_font_loadable(); @@ -1496,6 +1502,16 @@ do_font_boxchars(Widget gw GCC_UNUSED, update_font_boxchars(); Redraw(); } + +static void +do_font_packed(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + ToggleFlag(term->screen.force_packed); + update_font_packed(); + SetVTFont(term, term->screen.menu_font_number, True, NULL); +} #endif #if OPT_DEC_SOFTFONT @@ -2250,6 +2266,16 @@ HandleFontBoxChars(Widget w, handle_vt_toggle(do_font_boxchars, term->screen.force_box_chars, params, *param_count, w); } + +void +HandleFontPacked(Widget w, + XEvent * event GCC_UNUSED, + String * params, + Cardinal *param_count) +{ + handle_vt_toggle(do_font_packed, term->screen.force_packed, + params, *param_count, w); +} #endif #if OPT_DEC_SOFTFONT @@ -3176,6 +3202,15 @@ update_font_boxchars(void) fontMenu_font_boxchars, term->screen.force_box_chars); } + +void +update_font_packed(void) +{ + UpdateCheckbox("update_font_packed", + fontMenuEntries, + fontMenu_font_packedfont, + term->screen.force_packed); +} #endif #if OPT_DEC_SOFTFONT diff --git a/menu.h b/menu.h index ff056ee..20295fb 100644 --- a/menu.h +++ b/menu.h @@ -1,4 +1,4 @@ -/* $XTermId: menu.h,v 1.114 2009/05/02 14:35:39 Ovidiu.Gheorghioiu Exp $ */ +/* $XTermId: menu.h,v 1.116 2009/09/27 22:33:36 tom Exp $ */ /* @@ -90,6 +90,7 @@ extern void HandleDeleteIsDEL PROTO_XT_ACTIONS_ARGS; extern void HandleFontBoxChars PROTO_XT_ACTIONS_ARGS; extern void HandleFontDoublesize PROTO_XT_ACTIONS_ARGS; extern void HandleFontLoading PROTO_XT_ACTIONS_ARGS; +extern void HandleFontPacked PROTO_XT_ACTIONS_ARGS; extern void HandleHardReset PROTO_XT_ACTIONS_ARGS; extern void HandleHpFunctionKeys PROTO_XT_ACTIONS_ARGS; extern void HandleJumpscroll PROTO_XT_ACTIONS_ARGS; @@ -257,6 +258,7 @@ typedef enum { fontMenu_line1, #if OPT_BOX_CHARS fontMenu_font_boxchars, + fontMenu_font_packedfont, #endif #if OPT_DEC_CHRSET fontMenu_font_doublesize, @@ -427,8 +429,10 @@ extern void update_font_doublesize(void); #if OPT_BOX_CHARS extern void update_font_boxchars(void); +extern void update_font_packed(void); #else #define update_font_boxchars() /* nothing */ +#define update_font_packed() /* nothing */ #endif #if OPT_DEC_SOFTFONT diff --git a/ptyx.h b/ptyx.h index ee99a3e..4e015e6 100644 --- a/ptyx.h +++ b/ptyx.h @@ -1,4 +1,4 @@ -/* $XTermId: ptyx.h,v 1.627 2009/09/10 08:50:02 tom Exp $ */ +/* $XTermId: ptyx.h,v 1.629 2009/09/29 23:55:23 tom Exp $ */ /* * Copyright 1999-2008,2009 by Thomas E. Dickey @@ -1540,9 +1540,11 @@ typedef struct { Boolean fnt_prop; /* true if proportional fonts */ Boolean fnt_boxes; /* true if font has box-chars */ + Boolean force_packed; /* true to override proportional */ #if OPT_BOX_CHARS Boolean force_box_chars;/* true if we assume that */ - Boolean force_all_chars;/* true to outline missing chars*/ + Boolean force_all_chars;/* true to outline missing chars */ + Boolean allow_packing; /* true to allow packed-fonts */ #endif Dimension fnt_wide; Dimension fnt_high; diff --git a/screen.c b/screen.c index d1d8363..20ef3b0 100644 --- a/screen.c +++ b/screen.c @@ -1,4 +1,4 @@ -/* $XTermId: screen.c,v 1.396 2009/08/30 00:06:07 tom Exp $ */ +/* $XTermId: screen.c,v 1.403 2009/10/01 00:30:19 tom Exp $ */ /* * Copyright 1999-2008,2009 by Thomas E. Dickey @@ -704,7 +704,8 @@ ScrnClearCells(XtermWidget xw, int row, int col, unsigned len) if_OPT_WIDE_CHARS(screen, { int kl; int kr; - if (DamagedCells(screen, len, &kl, &kr, INX2ROW(screen, row), col) + + if (DamagedCells(screen, len, &kl, &kr, row, col) && kr >= kl) { ClearCells(xw, flags, (unsigned) (kr - kl + 1), row, kl); } @@ -755,6 +756,10 @@ ScrnWriteText(XtermWidget xw, (void) cur_fg_bg; + if (real_width + (unsigned) screen->cur_col > (unsigned) MaxCols(screen)) { + real_width = (unsigned) (MaxCols(screen) - screen->cur_col); + } + if (avail <= 0) return; if (length > (unsigned) avail) @@ -1156,7 +1161,7 @@ ScrnInsertChar(XtermWidget xw, unsigned n) assert(last > (int) n); if_OPT_WIDE_CHARS(screen, { - int xx = INX2ROW(screen, screen->cur_row); + int xx = screen->cur_row; int kl; int kr = screen->cur_col; if (DamagedCells(screen, n, &kl, (int *) 0, xx, kr) && kr > kl) { @@ -1220,7 +1225,7 @@ ScrnDeleteChar(XtermWidget xw, unsigned n) int kl; int kr; if (DamagedCells(screen, n, &kl, &kr, - INX2ROW(screen, screen->cur_row), + screen->cur_row, screen->cur_col)) ClearCells(xw, 0, (unsigned) (kr - kl + 1), row, kl); }); @@ -1647,13 +1652,15 @@ ClearBufRows(XtermWidget xw, TRACE(("ClearBufRows %d..%d\n", first, last)); for (row = first; row <= last; row++) { - LineData *ld = getLineData(screen, ROW2INX(screen, row)); - if_OPT_DEC_CHRSET({ - /* clearing the whole row resets the doublesize characters */ - SetLineDblCS(ld, CSET_SWL); - }); - LineClrWrapped(ld); - ClearCells(xw, 0, len, row, 0); + LineData *ld = getLineData(screen, row); + if (ld != 0) { + if_OPT_DEC_CHRSET({ + /* clearing the whole row resets the doublesize characters */ + SetLineDblCS(ld, CSET_SWL); + }); + LineClrWrapped(ld); + ClearCells(xw, 0, len, row, 0); + } } } @@ -1777,8 +1784,8 @@ ScreenResize(XtermWidget xw, if (amount < 0) { /* move line-data from visible-buffer to save-buffer */ - saveEditBufLines(screen, dst, -amount); - move_up = -amount; + saveEditBufLines(screen, dst, (unsigned) -amount); + move_up = (unsigned) -amount; move_down_by = amount; } else { move_down_by = 0; diff --git a/scrollbar.c b/scrollbar.c index 85ce150..5a81efb 100644 --- a/scrollbar.c +++ b/scrollbar.c @@ -1,4 +1,4 @@ -/* $XTermId: scrollbar.c,v 1.143 2009/08/09 17:23:47 tom Exp $ */ +/* $XTermId: scrollbar.c,v 1.144 2009/09/26 14:56:42 tom Exp $ */ /* * Copyright 2000-2008,2009 by Thomas E. Dickey @@ -374,6 +374,9 @@ WindowScroll(XtermWidget xw, int top) ScrnRefresh(xw, refreshtop, 0, lines, MaxCols(screen), False); ScrollBarDrawThumb(screen->scrollWidget); +#if OPT_BLINK_CURS || OPT_BLINK_TEXT + RestartBlinking(screen); +#endif } #ifdef SCROLLBAR_RIGHT diff --git a/trace.c b/trace.c index dd16945..f5306f1 100644 --- a/trace.c +++ b/trace.c @@ -1,4 +1,4 @@ -/* $XTermId: trace.c,v 1.102 2009/07/03 13:57:08 tom Exp $ */ +/* $XTermId: trace.c,v 1.103 2009/09/28 09:09:41 tom Exp $ */ /************************************************************ @@ -255,7 +255,7 @@ visibleIChar(IChar * buf, unsigned len) static unsigned used; if (buf != 0) { - unsigned limit = ((len + 1) * 6) + 1; + unsigned limit = ((len + 1) * 8) + 1; char *dst; if (limit > used) { diff --git a/util.c b/util.c index 4a740b6..02fcb6a 100644 --- a/util.c +++ b/util.c @@ -1,4 +1,4 @@ -/* $XTermId: util.c,v 1.489 2009/09/10 09:22:43 tom Exp $ */ +/* $XTermId: util.c,v 1.503 2009/10/01 09:01:21 tom Exp $ */ /* * Copyright 1999-2008,2009 by Thomas E. Dickey @@ -649,6 +649,10 @@ WriteText(XtermWidget xw, IChar * str, Cardinal len) screen->cur_col, len, visibleIChar(str, len))); + if (cells + (unsigned) screen->cur_col > (unsigned) MaxCols(screen)) { + cells = (unsigned) (MaxCols(screen) - screen->cur_col); + } + if (ScrnHaveSelection(screen) && ScrnIsLineInSelection(screen, INX2ROW(screen, screen->cur_row))) { ScrnDisownSelection(xw); @@ -744,7 +748,7 @@ InsertLine(XtermWidget xw, int n) int scrolltop; int scrollheight; - if (!ScrnIsLineInMargins(screen, INX2ROW(screen, screen->cur_row))) + if (!ScrnIsLineInMargins(screen, screen->cur_row)) return; TRACE(("InsertLine count=%d\n", n)); @@ -753,7 +757,12 @@ InsertLine(XtermWidget xw, int n) HideCursor(); if (ScrnHaveSelection(screen) - && ScrnAreLinesInSelection(screen, screen->top_marg, screen->bot_marg)) { + && ScrnAreLinesInSelection(screen, + INX2ROW(screen, screen->top_marg), + INX2ROW(screen, screen->cur_row - 1)) + && ScrnAreLinesInSelection(screen, + INX2ROW(screen, screen->cur_row), + INX2ROW(screen, screen->bot_marg))) { ScrnDisownSelection(xw); } @@ -820,7 +829,7 @@ DeleteLine(XtermWidget xw, int n) && !screen->whichBuf && screen->cur_row == 0); - if (!ScrnIsLineInMargins(screen, INX2ROW(screen, screen->cur_row))) + if (!ScrnIsLineInMargins(screen, screen->cur_row)) return; TRACE(("DeleteLine count=%d\n", n)); @@ -828,14 +837,17 @@ DeleteLine(XtermWidget xw, int n) if (screen->cursor_state) HideCursor(); + if (n > (i = screen->bot_marg - screen->cur_row + 1)) { + n = i; + } if (ScrnHaveSelection(screen) - && ScrnAreLinesInSelection(screen, screen->top_marg, screen->bot_marg)) { + && ScrnAreLinesInSelection(screen, + INX2ROW(screen, screen->cur_row), + INX2ROW(screen, screen->cur_row + n - 1))) { ScrnDisownSelection(xw); } screen->do_wrap = False; - if (n > (i = screen->bot_marg - screen->cur_row + 1)) - n = i; if (screen->jumpscroll) { if (screen->scroll_amt >= 0 && screen->cur_row == screen->top_marg) { if (screen->refresh_amt + n > MaxRows(screen)) @@ -847,8 +859,25 @@ DeleteLine(XtermWidget xw, int n) FlushScroll(xw); } } - if (!screen->scroll_amt) { + /* adjust screen->buf */ + if (n > 0) { + if (scroll_all_lines) + ScrnDeleteLine(xw, + screen->saveBuf_index, + screen->bot_marg + screen->savelines, + 0, + (unsigned) n); + else + ScrnDeleteLine(xw, + screen->visbuf, + screen->bot_marg, + screen->cur_row, + (unsigned) n); + } + + /* repaint the screen, as needed */ + if (!screen->scroll_amt) { shift = INX2ROW(screen, 0); bot = screen->max_row - shift; scrollheight = i - n; @@ -876,6 +905,14 @@ DeleteLine(XtermWidget xw, int n) } } vertical_copy_area(xw, scrolltop + n, scrollheight, n); + if (shift > 0 && refreshheight > 0) { + int rows = refreshheight; + if (rows > shift) + rows = shift; + ScrnUpdate(xw, refreshtop, 0, rows, MaxCols(screen), True); + refreshtop += shift; + refreshheight -= shift; + } if (refreshheight > 0) { ClearCurBackground(xw, (int) refreshtop * FontHeight(screen) + screen->border, @@ -884,21 +921,6 @@ DeleteLine(XtermWidget xw, int n) (unsigned) Width(screen)); } } - /* adjust screen->buf */ - if (n > 0) { - if (scroll_all_lines) - ScrnDeleteLine(xw, - screen->saveBuf_index, - screen->bot_marg + screen->savelines, - 0, - (unsigned) n); - else - ScrnDeleteLine(xw, - screen->visbuf, - screen->bot_marg, - screen->cur_row, - (unsigned) n); - } } /* @@ -1069,7 +1091,7 @@ ClearAbove(XtermWidget xw) if (screen->scroll_amt) FlushScroll(xw); if ((height = screen->cur_row + top) > screen->max_row) - height = screen->max_row; + height = screen->max_row + 1; if ((height -= top) > 0) { ClearCurBackground(xw, top * FontHeight(screen) + screen->border, @@ -1081,8 +1103,7 @@ ClearAbove(XtermWidget xw) ClearBufRows(xw, 0, screen->cur_row - 1); } - if (INX2ROW(screen, screen->cur_row) <= screen->max_row) - ClearLeft(xw); + ClearLeft(xw); } /* @@ -2909,16 +2930,16 @@ drawXtermText(XtermWidget xw, ? WhichVFontData(screen, fnts[fBold]) : WhichVFontData(screen, fnts[fNorm])); - xtermFillCells(xw, flags, gc, x, y, len); - while (len--) { + int cells = WideCells(*text); #if OPT_BOX_CHARS +#if OPT_WIDE_CHARS + if (*text == HIDDEN_CHAR) { + ++text; + continue; + } else +#endif if (IsXtermMissingChar(screen, *text, font)) { - - width = 1; -- To UNSUBSCRIBE, email to debian-x-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org