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

Reply via email to