[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

xterm: Changes to 'upstream-unstable'



 MANIFEST       |    2 
 XTerm.ad       |    3 -
 button.c       |   16 ++++--
 charproc.c     |   38 +++++++++++++++
 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 ++++++++++++-
 18 files changed, 407 insertions(+), 76 deletions(-)

New commits:
commit 2ddbf56f023b3133b4b3a6274273747be0fce979
Author: Julien Cristau <jcristau@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;
-		if_OPT_WIDE_CHARS(screen, {
-		    width = my_wcwidth((wchar_t) (*text)) * FontWidth(screen);
-		});
 		adj = 0;
 	    } else
 #endif
@@ -2935,7 +2956,10 @@ drawXtermText(XtermWidget xw,
 		    width = XTextWidth(font->fs, temp, 1);
 		});
 		adj = (FontWidth(screen) - width) / 2;
+		if (adj < 0)
+		    adj = 0;
 	    }
+	    xtermFillCells(xw, flags, gc, x, y, (Cardinal) cells);
 	    x = drawXtermText(xw,
 			      flags | NOBACKGROUND | CHARBYCHAR,
 			      gc, x + adj, y, chrset,
diff --git a/version.h b/version.h
index 8895fb8..c19c391 100644
--- a/version.h
+++ b/version.h
@@ -1,4 +1,4 @@
-/* $XTermId: version.h,v 1.304 2009/09/09 23:42:14 tom Exp $ */
+/* $XTermId: version.h,v 1.305 2009/10/01 21:12:56 tom Exp $ */
 
 /*
  * These definitions are used to build the string that's printed in response to
@@ -6,7 +6,7 @@
  * version of X to which this version of xterm has been built.  The number in
  * parentheses is my patch number (Thomas E. Dickey).
  */
-#define XTERM_PATCH   248
+#define XTERM_PATCH   249
 
 #ifndef __vendorversion__
 #define __vendorversion__ "XTerm"
diff --git a/xterm.h b/xterm.h
index a820427..a732c96 100644
--- a/xterm.h
+++ b/xterm.h
@@ -1,4 +1,4 @@
-/* $XTermId: xterm.h,v 1.582 2009/09/10 09:01:22 tom Exp $ */
+/* $XTermId: xterm.h,v 1.585 2009/10/01 09:04:48 tom Exp $ */
 
 /************************************************************
 
@@ -396,6 +396,7 @@ extern char **environ;
 #define XtNfontStyle		"fontStyle"
 #define XtNfontWarnings		"fontWarnings"
 #define XtNforceBoxChars	"forceBoxChars"
+#define XtNforcePackedFont	"forcePackedFont"
 #define XtNformatOtherKeys	"formatOtherKeys"
 #define XtNfreeBoldBox		"freeBoldBox"
 #define XtNhighlightColor	"highlightColor"
@@ -555,6 +556,7 @@ extern char **environ;
 #define XtCFontStyle		"FontStyle"
 #define XtCFontWarnings		"FontWarnings"
 #define XtCForceBoxChars	"ForceBoxChars"
+#define XtCForcePackedFont	"ForcePackedFont"
 #define XtCFormatOtherKeys	"FormatOtherKeys"
 #define XtCFreeBoldBox		"FreeBoldBox"
 #define XtCHighlightColorMode	"HighlightColorMode"
@@ -742,7 +744,10 @@ extern void ReadLineButton             PROTO_XT_ACTIONS_ARGS;
 #if OPT_WIDE_CHARS
 extern Bool iswide(int  /* i */);
 #define FIRST_WIDECHAR 256
-#define isWide(n) ((int) (n) >= FIRST_WIDECHAR && iswide(n))
+#define WideCells(n) (((IChar)(n) >= FIRST_WIDECHAR) ? my_wcwidth((wchar_t) (n)) : 1)
+#define isWide(n)    (((IChar)(n) >= FIRST_WIDECHAR) && iswide(n))
+#else
+#define WideCells(n) 1
 #endif
 
 /* cachedCgs.c */
@@ -771,6 +776,7 @@ extern int VTInit (XtermWidget /* xw */);
 extern int v_write (int  /* f */, Char * /* d */, unsigned  /* len */);
 extern void FindFontSelection (XtermWidget /* xw */, const char * /* atom_name */, Bool  /* justprobe */);
 extern void HideCursor (void);
+extern void RestartBlinking(TScreen * /* screen */);
 extern void ShowCursor (void);
 extern void SwitchBufPtrs (TScreen * /* screen */);
 extern void ToggleAlternate (XtermWidget /* xw */);
diff --git a/xterm.log.html b/xterm.log.html
index 1cc906e..7fecb92 100644
--- a/xterm.log.html
+++ b/xterm.log.html
@@ -20,7 +20,7 @@
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF   *
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.            *
  *****************************************************************************
-  $XTermId: xterm.log.html,v 1.790 2009/09/11 23:10:00 tom Exp $
+  $XTermId: xterm.log.html,v 1.802 2009/10/02 00:16:00 tom Exp $
   -->
 <HTML>
 <HEAD>
@@ -45,6 +45,7 @@ Most of these are summarized in the XFree86 CHANGELOG
 is the latest version of this file.
 
 <UL>
+<LI><A HREF="#xterm_249">Patch #249 - 2009/10/1</A>
 <LI><A HREF="#xterm_248">Patch #248 - 2009/9/11</A>
 <LI><A HREF="#xterm_247">Patch #247 - 2009/8/30</A>
 <LI><A HREF="#xterm_246">Patch #246 - 2009/8/16</A>
@@ -296,6 +297,56 @@ is the latest version of this file.
 <LI><A HREF="#xterm_01">Patch #1 - 1996/1/6</A>
 </UL>
 
+<H1><A NAME="xterm_249">Patch #249 - 2009/10/1</A></H1>
+<ul>
+	<li>change default for <code>allowWindowOps</code> resource to false.
+	    <!-- on the other hand, gnome-terminal, pterm and rxvt-unicode
+	        leave most of the related functionality enabled ;-) -->
+
+	<li>add limit-checks for result of visual_width() function,
+	    needed from <a href="#xterm_242">patch #242</a> and
+	    exposed by #244 changes (Debian #548321).
+
+	<li>improve limit-checks in select/paste.
+
+	<li>fix a remaining bug from 
+	    <a href="#xterm_230">patch #230</a>
+	    changes for displaying multi-column
+	    characters in a proportional font (report by Chris Jones).
+
+	<li>add new resource forcePackedFont and menu entry "Packed Font" to
+	    control whether to use the font's minimum (default) or maximum
+	    width when those differ.  The workaround which xterm uses to
+	    accommodate proportional fonts is not necessary with certain
+	    fonts such as unifont which happen to store a mixture of
+	    multicolumn glyphs (report by Chris Jones).
+
+	<li>fix an (old) bug which did not restart the timer for blinking text
+	    if the only blinking text was temporarily scrolled out of view,
+	    e.g., using the scrollbar.
+
+	<li>fix an (old) flaw in the delete-line operation where the text which
+	    is scrolled into view while the display is scrolled up was not
+	    repainted.
+
+	<li>improve delete-line and insert-line operations, retaining selection
+	    when the selection does not intersect the deleted/inserted lines.
+
+	<li>fix an (old) off-by-one error when an application cleared above the
+	    cursor position while the display was scrolled up, that would leave
+	    an extra line of text uncleared.
+
+	<li>fix a similar problem where the double-size attribute would not be
+	    reset when clearing the screen while the display was scrolled up.
+
+	<li>fix an indexing error which would occur if an application cleared
+	    a line while the display was scrolled up and was also in UTF-8 mode
+	    (Redhat #524503).
+	    The error was from <a href="#xterm_228">patch #228</a>
+	    but more visible after
+	    changes from <a href="#xterm_244">patch #244</a>.


Reply to: