Tekproc.c      |    9 -
 VTPrsTbl.c     |    7 -
 VTparse.def    |    5 
 VTparse.h      |    6 
 button.c       |   10 +
 cachedGCs.c    |  143 +++++++++++++-------
 charclass.c    |    7 -
 charproc.c     |   45 +++++-
 ctlseqs.ms     |   19 ++
 ctlseqs.txt    |   13 +
 doublechr.c    |   21 +--
 fontutils.c    |  276 ++++++++++++++++++++++------------------
 fontutils.h    |   16 +-
 main.c         |  391 +++++++++++++++++++++------------------------------------
 main.h         |    8 -
 menu.c         |    6 
 minstall.sh    |    7 -
 misc.c         |   83 ++++++++++--
 ptyx.h         |   35 +++--
 screen.c       |   60 +++++++-
 tabs.c         |   18 +-
 util.c         |   14 --
 version.h      |    4 
 xterm.h        |   13 +
 xterm.log.html |   75 ++++++++++
 xterm.man      |   23 ++-
 26 files changed, 769 insertions(+), 545 deletions(-)

New commits:
commit a18a5b3f13d9355f885b7e67b37e355d57028f03
Author: Julien Cristau <[EMAIL PROTECTED]>
Date:   Sat Feb 9 02:04:30 2008 +0100

    Import xterm 232.

diff --git a/Tekproc.c b/Tekproc.c
index d7dd80e..8b1b89a 100644
--- a/Tekproc.c
+++ b/Tekproc.c
@@ -1,4 +1,4 @@
-/* $XTermId: Tekproc.c,v 1.157 2007/07/10 19:53:11 tom Exp $ */
+/* $XTermId: Tekproc.c,v 1.158 2008/01/26 01:21:10 tom Exp $ */
 
 /*
  * Warning, there be crufty dragons here.
@@ -7,7 +7,7 @@
 
 /*
 
-Copyright 2001-2006,2007 by Thomas E. Dickey
+Copyright 2001-2007,2008 by Thomas E. Dickey
 
                         All Rights Reserved
 
@@ -729,13 +729,16 @@ Tekparse(TekWidget tw)
                                   1);
            } else
 #endif
+           {
+               char ch2 = (char) ch;
                XDrawString(XtDisplay(tw),
                            TWindow(tekscr),
                            tekscr->TnormalGC,
                            x,
                            y,
-                           (char *) &ch,
+                           &ch2,
                            1);
+           }
            TCursorForward(tw);
            break;
        case CASE_OSC:
diff --git a/VTPrsTbl.c b/VTPrsTbl.c
index 38b04fa..47a2441 100644
--- a/VTPrsTbl.c
+++ b/VTPrsTbl.c
@@ -1,9 +1,8 @@
-/* $XTermId: VTPrsTbl.c,v 1.48 2006/07/31 22:14:03 tom Exp $ */
+/* $XTermId: VTPrsTbl.c,v 1.49 2008/01/27 17:41:05 tom Exp $ */
 
-/* $XFree86: xc/programs/xterm/VTPrsTbl.c,v 3.31 2006/02/13 01:14:58 dickey 
Exp $ */
 /*
  *
- * Copyright 1999-2005,2006 by Thomas E. Dickey
+ * Copyright 1999-2006,2008 by Thomas E. Dickey
  *
  *                         All Rights Reserved
  *
@@ -3141,7 +3140,7 @@ CASE_SET_MOD_FKEYS,
 CASE_SET_MOD_FKEYS0,
 CASE_GROUND_STATE,
 /*     p               q               r               s       */
-CASE_GROUND_STATE,
+CASE_HIDE_POINTER,
 CASE_GROUND_STATE,
 CASE_GROUND_STATE,
 CASE_GROUND_STATE,
diff --git a/VTparse.def b/VTparse.def
index be2c1cd..6c8751d 100644
--- a/VTparse.def
+++ b/VTparse.def
@@ -1,6 +1,6 @@
-# $XTermId: VTparse.def,v 1.30 2007/12/04 21:14:30 tom Exp $
+# $XTermId: VTparse.def,v 1.31 2008/01/27 17:08:54 tom Exp $
 #
-# vile:txtmode rs=lf
+# vile:confmode rs=lf
 #
 # List of symbols that need to be defined for VTparse.h.  If you need to
 # change any of the CASE_ macros, make the change here and rerun the command
@@ -140,3 +140,4 @@ CASE_DECRARA
 CASE_CSI_STAR_STATE
 CASE_SET_MOD_FKEYS
 CASE_SET_MOD_FKEYS0
+CASE_HIDE_POINTER
diff --git a/VTparse.h b/VTparse.h
index 0bbb399..db2fd07 100644
--- a/VTparse.h
+++ b/VTparse.h
@@ -1,8 +1,7 @@
-/* $XTermId: VTparse.h,v 1.42 2006/07/31 22:17:40 tom Exp $ */
+/* $XTermId: VTparse.h,v 1.43 2008/01/27 17:11:37 tom Exp $ */
 
-/* $XFree86: xc/programs/xterm/VTparse.h,v 3.24 2006/02/13 01:14:58 dickey Exp 
$ */
 /*
- * Copyright 2002-2005,2006 by Thomas E. Dickey
+ * Copyright 2002-2006,2008 by Thomas E. Dickey
  *
  *                         All Rights Reserved
  *
@@ -242,5 +241,6 @@ extern Const PARSE_T esc_pct_table[];
 #define CASE_CSI_STAR_STATE 130
 #define CASE_SET_MOD_FKEYS 131
 #define CASE_SET_MOD_FKEYS0 132
+#define CASE_HIDE_POINTER 133
 
 #endif /* included_VTparse_h */
diff --git a/button.c b/button.c
index 63a0e33..3e63306 100644
--- a/button.c
+++ b/button.c
@@ -1,4 +1,4 @@
-/* $XTermId: button.c,v 1.281 2007/12/31 21:11:05 tom Exp $ */
+/* $XTermId: button.c,v 1.283 2008/01/07 22:56:37 tom Exp $ */
 
 /*
  * Copyright 1999-2006,2007 by Thomas E. Dickey
@@ -3154,6 +3154,7 @@ ConvertSelection(Widget w,
        return False;           /* can this happen? */
 
     if (*target == XA_TARGETS(dpy)) {
+       Atom *allocP;
        Atom *targetP;
        Atom *std_targets;
        XPointer std_return = 0;
@@ -3165,8 +3166,12 @@ ConvertSelection(Widget w,
                                        &std_length, format)) {
            std_targets = (Atom *) (std_return);
            *length = std_length + 6;
+
            targetP = (Atom *) XtMalloc(sizeof(Atom) * (*length));
+           allocP = targetP;
+
            *value = (XtPointer) targetP;
+
            *targetP++ = XA_STRING;
            *targetP++ = XA_TEXT(dpy);
 #ifdef X_HAVE_UTF8_STRING
@@ -3181,6 +3186,9 @@ ConvertSelection(Widget w,
 #endif
            *targetP++ = XA_LENGTH(dpy);
            *targetP++ = XA_LIST_LENGTH(dpy);
+
+           *length = std_length + (targetP - allocP);
+
            memcpy(targetP, std_targets, sizeof(Atom) * std_length);
            XtFree((char *) std_targets);
            *type = XA_ATOM;
diff --git a/cachedGCs.c b/cachedGCs.c
index 720b884..93913a3 100644
--- a/cachedGCs.c
+++ b/cachedGCs.c
@@ -1,8 +1,8 @@
-/* $XTermId: cachedGCs.c,v 1.38 2007/06/09 00:08:39 tom Exp $ */
+/* $XTermId: cachedGCs.c,v 1.47 2008/01/30 00:56:13 tom Exp $ */
 
 /************************************************************
 
-Copyright 2007 by Thomas E. Dickey
+Copyright 2007,2008 by Thomas E. Dickey
 
                         All Rights Reserved
 
@@ -58,7 +58,7 @@ typedef struct {
     GC gc;
     unsigned used;
     unsigned cset;
-    XFontStruct *font;
+    XTermFonts *font;
     Pixel tile;
     Pixel fg;
     Pixel bg;
@@ -160,16 +160,18 @@ traceCSet(unsigned cset)
 }
 
 static String
-traceFont(XFontStruct * font)
+traceFont(XTermFonts * font)
 {
     static char result[80];
-    if (font != 0) {
+    XFontStruct *fs;
+
+    if (font != 0 && (fs = font->fs) != 0) {
        sprintf(result, "%p(%dx%d %d %#lx)",
-               font,
-               font->max_bounds.width,
-               font->max_bounds.ascent + font->max_bounds.descent,
-               font->max_bounds.descent,
-               (unsigned long) (font->fid));
+               fs,
+               fs->max_bounds.width,
+               fs->max_bounds.ascent + fs->max_bounds.descent,
+               fs->max_bounds.descent,
+               (unsigned long) (fs->fid));
     } else {
        strcpy(result, "null");
     }
@@ -255,6 +257,18 @@ allocCache(void **cache_pointer)
     return *((CgsCache **) cache_pointer);
 }
 
+static int
+dataIndex(CgsCache * me)
+{
+    return ITEM();
+}
+
+static void
+relinkData(CgsCache * me, int item)
+{
+    LINK(item);
+}
+
 /*
  * Returns the appropriate cache pointer.
  */
@@ -313,7 +327,7 @@ newCache(XtermWidget xw, VTwin * cgsWin, CgsEnum cgsId, 
CgsCache * me)
     THIS(bg) = NEXT(bg);
 
     memset(&xgcv, 0, sizeof(xgcv));
-    xgcv.font = NEXT(font)->fid;
+    xgcv.font = NEXT(font)->fs->fid;
     mask = (GCForeground | GCBackground | GCFont);
 
     switch (cgsId) {
@@ -379,6 +393,24 @@ newCache(XtermWidget xw, VTwin * cgsWin, CgsEnum cgsId, 
CgsCache * me)
     return THIS(gc);
 }
 
+static Boolean
+HaveFont(XTermFonts * a)
+{
+    return (a != 0 && a->fs != 0);
+}
+
+static Boolean
+SameFont(XTermFonts * a, XTermFonts * b)
+{
+    return (HaveFont(a)
+           && HaveFont(b)
+           && (a->fs == b->fs)
+           && !memcmp(a->fs, b->fs, sizeof(*(a->fs))));
+}
+
+#define SameColor(a,b) ((a) == (b))
+#define SameCSet(a,b)  ((a) == (b))
+
 static GC
 chgCache(XtermWidget xw, CgsEnum cgsId GCC_UNUSED, CgsCache * me)
 {
@@ -387,38 +419,39 @@ chgCache(XtermWidget xw, CgsEnum cgsId GCC_UNUSED, 
CgsCache * me)
 
     memset(&xgcv, 0, sizeof(xgcv));
 
-    TRACE2(("...Cgs old data fg=%s, bg=%s, font=%s cset %s\n",
+    TRACE2(("chgCache(%s) old data fg=%s, bg=%s, font=%s cset %s\n",
+           traceCgsEnum(cgsId),
            tracePixel(xw, THIS(fg)),
            tracePixel(xw, THIS(bg)),
            traceFont(THIS(font)),
            traceCSet(THIS(cset))));
+#if OPT_TRACE > 1
+    if (!SameFont(THIS(font), NEXT(font)))
+       TRACE2(("...chgCache new font=%s\n", traceFont(NEXT(font))));
+    if (!SameCSet(THIS(cset), NEXT(cset)))
+       TRACE2(("...chgCache new cset=%s\n", traceCSet(NEXT(cset))));
+    if (!SameColor(THIS(fg), NEXT(fg)))
+       TRACE2(("...chgCache new fg=%s\n", tracePixel(xw, NEXT(fg))));
+    if (!SameColor(THIS(bg), NEXT(bg)))
+       TRACE2(("...chgCache new bg=%s\n", tracePixel(xw, NEXT(bg))));
+#endif
 
     THIS(font) = NEXT(font);
     THIS(cset) = NEXT(cset);
     THIS(fg) = NEXT(fg);
     THIS(bg) = NEXT(bg);
 
-    xgcv.font = THIS(font)->fid;
+    xgcv.font = THIS(font)->fs->fid;
     xgcv.foreground = THIS(fg);
     xgcv.background = THIS(bg);
 
     XChangeGC(myDisplay(xw), THIS(gc), mask, &xgcv);
-    TRACE(("getCgsGC(%s) updated gc %p(%d)\n",
-          traceCgsEnum(cgsId), THIS(gc), ITEM()));
+    TRACE2(("...chgCache(%s) updated gc %p(%d)\n",
+           traceCgsEnum(cgsId), THIS(gc), ITEM()));
 
     THIS(used) = 0;
     return THIS(gc);
 }
-
-static Boolean
-SameFont(XFontStruct * a, XFontStruct * b)
-{
-    return ((a != 0) && (b != 0) && (a == b) && !memcmp(a, b, sizeof(*a)));
-}
-
-#define SameColor(a,b) ((a) == (b))
-#define SameCSet(a,b)  ((a) == (b))
-
 /*
  * Use the "setCgsXXXX()" calls to initialize parameters for a new GC.
  */
@@ -466,22 +499,22 @@ setCgsCSet(XtermWidget xw, VTwin * cgsWin, CgsEnum cgsId, 
unsigned cset)
 #endif
 
 void
-setCgsFont(XtermWidget xw, VTwin * cgsWin, CgsEnum cgsId, XFontStruct * font)
+setCgsFont(XtermWidget xw, VTwin * cgsWin, CgsEnum cgsId, XTermFonts * font)
 {
     CgsCache *me;
 
     if ((me = myCache(xw, cgsWin, cgsId)) != 0) {
-       if (font == 0) {
+       if (!HaveFont(font)) {
            if (cgsId != gcNorm)
                (void) getCgsGC(xw, cgsWin, gcNorm);
 #ifndef NO_ACTIVE_ICON
            if (cgsWin == &(xw->screen.iconVwin))
-               font = xw->screen.fnt_icon;
+               font = &(xw->screen.fnt_icon);
            else
 #endif
-               font = xw->screen.fnts[fNorm];
+               font = &(xw->screen.fnts[fNorm]);
        }
-       if (okFont(font) && !SameFont(NEXT(font), font)) {
+       if (okFont(font->fs) && !SameFont(NEXT(font), font)) {
            TRACE2(("...updated next font for %s to %s\n",
                    traceCgsEnum(cgsId), traceFont(font)));
            TRACE2(("...next font was %s\n", traceFont(NEXT(font))));
@@ -499,32 +532,34 @@ setCgsFont(XtermWidget xw, VTwin * cgsWin, CgsEnum cgsId, 
XFontStruct * font)
  * Keep the GC's so we can simply change them rather than creating new ones.
  */
 void
-clrCgsFonts(XtermWidget xw, VTwin * cgsWin, XFontStruct * font)
+clrCgsFonts(XtermWidget xw, VTwin * cgsWin, XTermFonts * font)
 {
     CgsCache *me;
     int j, k;
 
-    for_each_gc(j) {
-       if ((me = myCache(xw, cgsWin, (CgsEnum) j)) != 0) {
-           for (k = 0; k < DEPTH; ++k) {
-               if (SameFont(LIST(k).font, font)) {
-                   TRACE2(("clrCgsFonts %s gc %p(%d) %s\n",
+    if (HaveFont(font)) {
+       for_each_gc(j) {
+           if ((me = myCache(xw, cgsWin, (CgsEnum) j)) != 0) {
+               for (k = 0; k < DEPTH; ++k) {
+                   if (SameFont(LIST(k).font, font)) {
+                       TRACE2(("clrCgsFonts %s gc %p(%d) %s\n",
+                               traceCgsEnum((CgsEnum) j),
+                               LIST(k).gc,
+                               k,
+                               traceFont(font)));
+                       LIST(k).font = 0;
+                       LIST(k).cset = 0;
+                   }
+               }
+               if (SameFont(NEXT(font), font)) {
+                   TRACE2(("clrCgsFonts %s next %s\n",
                            traceCgsEnum((CgsEnum) j),
-                           LIST(k).gc,
-                           k,
                            traceFont(font)));
-                   LIST(k).font = 0;
-                   LIST(k).cset = 0;
+                   NEXT(font) = 0;
+                   NEXT(cset) = 0;
+                   me->mask &= ~(GCFont | GC_CSet);
                }
            }
-           if (SameFont(NEXT(font), font)) {
-               TRACE2(("clrCgsFonts %s next %s\n",
-                       traceCgsEnum((CgsEnum) j),
-                       traceFont(font)));
-               NEXT(font) = 0;
-               NEXT(cset) = 0;
-               me->mask &= ~(GCFont | GC_CSet);
-           }
        }
     }
 }
@@ -643,11 +678,11 @@ getCgsId(XtermWidget xw, VTwin * cgsWin, GC gc)
 /*
  * Return the font for the given GC.
  */
-XFontStruct *
+XTermFonts *
 getCgsFont(XtermWidget xw, VTwin * cgsWin, GC gc)
 {
     int n;
-    XFontStruct *result = 0;
+    XTermFonts *result = 0;
 
     for_each_gc(n) {
        CgsCache *me;
@@ -772,13 +807,19 @@ swapCgs(XtermWidget xw, VTwin * cgsWin, CgsEnum dstCgsId, 
CgsEnum srcCgsId)
     if (dstCgsId != srcCgsId) {
        CgsCache *dst;
        CgsCache *src;
+       CgsCache tmp;
 
        if ((src = myCache(xw, cgsWin, srcCgsId)) != 0) {
            if ((dst = myCache(xw, cgsWin, dstCgsId)) != 0) {
-               CgsCache tmp;
+               int srcIndex = dataIndex(src);
+               int dstIndex = dataIndex(dst);
+
                tmp = *dst;
                *dst = *src;
                *src = tmp;
+
+               relinkData(src, dstIndex);
+               relinkData(dst, srcIndex);
            }
        }
     }
diff --git a/charclass.c b/charclass.c
index b8fd759..ea2d2ed 100644
--- a/charclass.c
+++ b/charclass.c
@@ -1,4 +1,4 @@
-/* $XTermId: charclass.c,v 1.18 2007/07/15 16:18:41 tom Exp $ */
+/* $XTermId: charclass.c,v 1.20 2008/01/31 01:07:23 tom Exp $ */
 
 /*
  * Compact and efficient reimplementation of the
@@ -23,7 +23,6 @@
  * can be accessed via binary search, but merging in new intervals is
  * significantly more hassle and not worth the effort here.
  */
-/* $XFree86: xc/programs/xterm/charclass.c,v 1.7 2006/02/13 01:14:58 dickey 
Exp $ */
 
 #include <xterm.h>
 #include <charclass.h>
@@ -66,11 +65,11 @@ SetCharacterClassRange(int low, int high, int value)
     return 0;
 }
 
-enum {
+typedef enum {
     IDENT = -1,
     ALNUM = 48,
     CNTRL = 1,
-    BLANK = 32,
+    BLANK = 32
 } Classes;
 
 void
diff --git a/charproc.c b/charproc.c
index b101404..1b47ae6 100644
--- a/charproc.c
+++ b/charproc.c
@@ -1,8 +1,8 @@
-/* $XTermId: charproc.c,v 1.824 2007/12/31 21:03:26 tom Exp $ */
+/* $XTermId: charproc.c,v 1.834 2008/01/27 17:39:53 tom Exp $ */
 
 /*
 
-Copyright 1999-2006,2007 by Thomas E. Dickey
+Copyright 1999-2007,2008 by Thomas E. Dickey
 
                         All Rights Reserved
 
@@ -450,6 +450,7 @@ static XtResource resources[] =
     Ires(XtNlimitResize, XtCLimitResize, misc.limit_resize, 1),
     Ires(XtNmultiClickTime, XtCMultiClickTime, screen.multiClickTime, 
MULTICLICKTIME),
     Ires(XtNnMarginBell, XtCColumn, screen.nmarginbell, N_MARGINBELL),
+    Ires(XtNpointerMode, XtCPointerMode, screen.pointer_mode, 
DEF_POINTER_MODE),
     Ires(XtNprinterControlMode, XtCPrinterControlMode,
         screen.printer_controlmode, 0),
     Ires(XtNvisualBellDelay, XtCVisualBellDelay, screen.visualBellDelay, 100),
@@ -497,7 +498,7 @@ static XtResource resources[] =
 #ifndef NO_ACTIVE_ICON
     Bres("activeIcon", "ActiveIcon", misc.active_icon, False),
     Ires("iconBorderWidth", XtCBorderWidth, misc.icon_border_width, 2),
-    Fres("iconFont", "IconFont", screen.fnt_icon, XtDefaultFont),
+    Fres("iconFont", "IconFont", screen.fnt_icon.fs, XtDefaultFont),
     Cres("iconBorderColor", XtCBorderColor, misc.icon_border_pixel, 
XtDefaultBackground),
 #endif                         /* NO_ACTIVE_ICON */
 
@@ -2562,6 +2563,7 @@ doparsing(XtermWidget xw, unsigned c, struct ParseState 
*sp)
            } else {
                TRACE(("DECELR - Enable Locator Reports\n"));
                screen->send_mouse_pos = DEC_LOCATOR;
+               xtermShowPointer(xw, True);
                if (param[0] == 2) {
                    screen->locator_reset = True;
                } else {
@@ -2839,6 +2841,14 @@ doparsing(XtermWidget xw, unsigned c, struct ParseState 
*sp)
            }
            break;
 #endif
+       case CASE_HIDE_POINTER:
+           TRACE(("CASE_HIDE_POINTER\n"));
+           if (nparam >= 1 && param[0] != DEFAULT) {
+               screen->pointer_mode = param[0];
+           } else {
+               screen->pointer_mode = DEF_POINTER_MODE;
+           }
+           break;
 
        case CASE_CSI_IGNORE:
            sp->parsestate = cigtable;
@@ -3718,7 +3728,8 @@ really_set_mousemode(XtermWidget xw,
                     unsigned mode)
 {
     xw->screen.send_mouse_pos = enabled ? mode : MOUSE_OFF;
-    xtermShowPointer(xw, enabled);
+    if (xw->screen.send_mouse_pos != MOUSE_OFF)
+       xtermShowPointer(xw, True);
 }
 
 #define set_mousemode(mode) really_set_mousemode(xw, IsSM(), mode)
@@ -5457,6 +5468,7 @@ VTInitialize(Widget wrequest,
     init_Bres(screen.trim_selection);
 
     wnew->screen.pointer_cursor = request->screen.pointer_cursor;
+    init_Ires(screen.pointer_mode);
 
     init_Sres(screen.answer_back);
 
@@ -5491,7 +5503,7 @@ VTInitialize(Widget wrequest,
     init_Bres(screen.quiet_grab);
 
 #ifndef NO_ACTIVE_ICON
-    wnew->screen.fnt_icon = request->screen.fnt_icon;
+    wnew->screen.fnt_icon.fs = request->screen.fnt_icon.fs;
     init_Bres(misc.active_icon);
     init_Ires(misc.icon_border_width);
     wnew->misc.icon_border_pixel = request->misc.icon_border_pixel;
@@ -5947,8 +5959,14 @@ VTDestroy(Widget w GCC_UNUSED)
     TRACE_FREE_LEAK(screen->allbuf);
     TRACE_FREE_LEAK(screen->abuf_address);
     TRACE_FREE_LEAK(screen->altbuf);
+    TRACE_FREE_LEAK(screen->keyboard_dialect);
+    TRACE_FREE_LEAK(screen->term_id);
 #if OPT_WIDE_CHARS
     TRACE_FREE_LEAK(screen->draw_buf);
+#if OPT_LUIT_PROG
+    TRACE_FREE_LEAK(xw->misc.locale_str);
+    TRACE_FREE_LEAK(xw->misc.localefilter);
+#endif
 #endif
 #if OPT_INPUT_METHOD
     if (screen->xim) {
@@ -5962,6 +5980,9 @@ VTDestroy(Widget w GCC_UNUSED)
     releaseWindowGCs(xw, &(screen->iconVwin));
 #endif
 
+    if (screen->hidden_cursor)
+       XFreeCursor(screen->display, screen->hidden_cursor);
+
     xtermCloseFonts(xw, screen->fnts);
     noleaks_cachedCgs(xw);
 
@@ -5976,10 +5997,12 @@ VTDestroy(Widget w GCC_UNUSED)
     }
 #endif
 
+#if OPT_COLOR_RES
     /* free local copies of resource strings */
     for (n = 0; n < NCOLORS; ++n) {
        FREE_LEAK(screen->Tcolors[n].resource);
     }
+#endif
 #if OPT_SELECT_REGEX
     for (n = 0; n < NSELECTUNITS; ++n) {
        FREE_LEAK(screen->selectExpr[n]);
@@ -6040,7 +6063,7 @@ VTRealize(Widget w,
     }
 
     /* really screwed if we couldn't open default font */
-    if (!screen->fnts[fNorm]) {
+    if (!screen->fnts[fNorm].fs) {
        fprintf(stderr, "%s:  unable to locate a suitable font\n",
                xterm_name);
        Exit(1);
@@ -6188,14 +6211,14 @@ VTRealize(Widget w,
     screen->event_mask = values->event_mask;
 
 #ifndef NO_ACTIVE_ICON
-    if (xw->misc.active_icon && screen->fnt_icon) {
+    if (xw->misc.active_icon && screen->fnt_icon.fs) {
        int iconX = 0, iconY = 0;
        Widget shell = SHELL_OF(xw);
        VTwin *win = &(screen->iconVwin);
 
        TRACE(("Initializing active-icon\n"));
        XtVaGetValues(shell, XtNiconX, &iconX, XtNiconY, &iconY, (XtPointer) 0);
-       xtermComputeFontInfo(xw, &(screen->iconVwin), screen->fnt_icon, 0);
+       xtermComputeFontInfo(xw, &(screen->iconVwin), screen->fnt_icon.fs, 0);
 
        /* since only one client is permitted to select for Button
         * events, we have to let the window manager get 'em...
@@ -6219,13 +6242,13 @@ VTRealize(Widget w,
                      (XtPointer) 0);
        XtRegisterDrawable(XtDisplay(xw), screen->iconVwin.window, w);
 
-       setCgsFont(xw, win, gcNorm, screen->fnt_icon);
+       setCgsFont(xw, win, gcNorm, &(screen->fnt_icon));
        setCgsFore(xw, win, gcNorm, T_COLOR(screen, TEXT_FG));
        setCgsBack(xw, win, gcNorm, T_COLOR(screen, TEXT_BG));
 
        copyCgs(xw, win, gcBold, gcNorm);
 
-       setCgsFont(xw, win, gcNormReverse, screen->fnt_icon);
+       setCgsFont(xw, win, gcNormReverse, &(screen->fnt_icon));
        setCgsFore(xw, win, gcNormReverse, T_COLOR(screen, TEXT_BG));
        setCgsBack(xw, win, gcNormReverse, T_COLOR(screen, TEXT_FG));
 
@@ -7182,6 +7205,8 @@ VTReset(XtermWidget xw, Bool full, Bool saved)
        screen->waitingForTrackInfo = False;
        screen->eventMode = NORMAL;
 
+       xtermShowPointer(xw, True);
+
        TabReset(xw->tabs);
        xw->keyboard.flags = MODE_SRM;
 #if OPT_INITIAL_ERASE
diff --git a/ctlseqs.ms b/ctlseqs.ms
index 2f08c7c..903e251 100644
--- a/ctlseqs.ms
+++ b/ctlseqs.ms
@@ -1,9 +1,9 @@
 .\"#! troff -ms $1             -*- Nroff -*-
 .\" "Xterm Control Sequences" document
-.\" $XTermId: ctlseqs.ms,v 1.184 2007/12/12 23:39:18 tom Exp $
+.\" $XTermId: ctlseqs.ms,v 1.186 2008/01/27 17:39:00 tom Exp $
 .\"
 .\"
-.\" Copyright 1996-2006,2007 by Thomas E. Dickey
+.\" Copyright 1996-2007,2008 by Thomas E. Dickey
 .\"
 .\"                         All Rights Reserved
 .\"
@@ -288,7 +288,7 @@ X Consortium (1994)
 Thomas Dickey
 .AI
 XFree86 Project (1996-2006)
-invisible-island.net (2006-2007)
+invisible-island.net (2006-2008)
 .AU
 .
 .am BT                  \" add page numbers after first page
@@ -957,7 +957,7 @@ Device Status Report (DSR)
 .br
 \*(Cs\*(Ir\*s\*;\*(Ic\*s\*R
 .
-.IP \\*(Cs\\*(Ps\\*>\\*n
+.IP \\*(Cs\\*>\\*(Ps\\*s\\*n
 Disable modifiers which may be enabled via the
 \*(Cs\*>\*(Ps\*;\*(Ps\*s\*m
 sequence.
@@ -996,6 +996,17 @@ The last two parameters apply to VT400 & up, and denote 
keyboard ready and LK01
 .br
 \*(Cs\*?\*5\*0\*s\*n No Locator, if not.
 .
+.IP \\*(Cs\\*>\\*(Ps\\*s\\*p
+Set resource value \fIpointerMode\fP,
+used by \fIxterm\fP to decide whether to
+hide the pointer cursor as the user types.
+Valid values for the parameter:
+  \*(Ps = \*0 \(-> never hide the pointer
+  \*(Ps = \*1 \(-> hide if the mouse tracking mode is not enabled
+  \*(Ps = \*2 \(-> always hide the pointer
+If no parameter is given, \fIxterm\fP uses the default,
+which is \*1.
+.
 .IP \\*(Cs\\*!\\*p
 Soft terminal reset (DECSTR)
 .
diff --git a/ctlseqs.txt b/ctlseqs.txt
index 242c63b..624e19b 100644
--- a/ctlseqs.txt
+++ b/ctlseqs.txt
@@ -19,7 +19,7 @@
 
                              Thomas Dickey
                       XFree86 Project (1996-2006)
-                    invisible-island.net (2006-2007)
+                    invisible-island.net (2006-2008)
 
 
 
@@ -507,7 +507,8 @@ CSI Ps n  Device Status Report (DSR)
             Ps = 5  -> Status Report CSI 0 n  (``OK'')
             Ps = 6  -> Report Cursor Position (CPR) [row;column] as
           CSI r ; c R
-CSI Ps> n Disable modifiers which may be enabled via the CSI > Ps; Ps m
+CSI > Ps n
+          Disable modifiers which may be enabled via the CSI > Ps; Ps m
           sequence.  This corresponds to a resource value of "-1", which
           cannot be set with the other sequence.  The parameter identi-
           fies the resource to be disabled:
@@ -533,6 +534,14 @@ CSI ? Ps n
             Ps = 5 3  -> Report Locator status as
           CSI ? 5 3  n  Locator available, if compiled-in, or
           CSI ? 5 0  n  No Locator, if not.
+CSI > Ps p
+          Set resource value pointerMode, used by xterm to decide
+          whether to hide the pointer cursor as the user types.  Valid
+          values for the parameter:
+            Ps = 0  -> never hide the pointer
+            Ps = 1  -> hide if the mouse tracking mode is not enabled
+            Ps = 2  -> always hide the pointer If no parameter is given,
+          xterm uses the default, which is 1 .
 CSI ! p   Soft terminal reset (DECSTR)
 CSI Ps ; Ps " p
           Set conformance level (DECSCL) Valid values for the first
diff --git a/doublechr.c b/doublechr.c
index a61a564..91685c3 100644
--- a/doublechr.c
+++ b/doublechr.c
@@ -1,8 +1,8 @@
-/* $XTermId: doublechr.c,v 1.57 2007/12/31 18:25:03 tom Exp $ */
+/* $XTermId: doublechr.c,v 1.60 2008/01/27 15:07:16 tom Exp $ */
 
 /************************************************************
 
-Copyright 1997-2006,2007 by Thomas E. Dickey
+Copyright 1997-2007,2008 by Thomas E. Dickey
 
                         All Rights Reserved
 
@@ -152,7 +152,7 @@ discard_font(XtermWidget xw, int n)
        free(data->fn);
        data->fn = 0;
     }
-    data->fs = xtermCloseFont(xw, data->fs);
+    (void) xtermCloseFont(xw, data);
 
     screen->fonts_used -= 1;
     while (n < screen->fonts_used) {
@@ -245,6 +245,7 @@ xterm_DoubleGC(XtermWidget xw,
                if (!strcmp(data->fn, name)
                    && data->fs != 0) {
                    found = True;
+                   free(name);
                } else {
                    discard_font(xw, n);
                }
@@ -262,22 +263,18 @@ xterm_DoubleGC(XtermWidget xw,
            temp.chrset = chrset;
            temp.flags = (flags & BOLD);
 
-           if ((temp.fs = xtermOpenFont(xw, name)) == 0) {
+           if (!xtermOpenFont(xw, name, &temp)) {
                /* Retry with * in resolutions */
                char *nname = xtermSpecialFont(screen, flags | NORESOLUTION, 
chrset);
 
                if (nname != 0) {
-                   if ((temp.fs = xtermOpenFont(xw, nname)) == 0) {
-                       free(nname);
-                   } else {
-                       free(name);
-                       temp.fn = nname;
-                       found = True;
-                   }
+                   found = xtermOpenFont(xw, nname, &temp);
+                   free(nname);
                }
            } else {
                found = True;
            }
+           free(name);
 
            if (found) {
                n = 0;
@@ -289,7 +286,7 @@ xterm_DoubleGC(XtermWidget xw,
 
        if (found) {
            setCgsCSet(xw, cgsWin, cgsId, chrset);
-           setCgsFont(xw, cgsWin, cgsId, data->fs);
+           setCgsFont(xw, cgsWin, cgsId, data);
            setCgsFore(xw, cgsWin, cgsId, getCgsFore(xw, cgsWin, old_gc));
            setCgsBack(xw, cgsWin, cgsId, getCgsBack(xw, cgsWin, old_gc));
            result = getCgsGC(xw, cgsWin, cgsId);
diff --git a/fontutils.c b/fontutils.c
index cfa7112..b23b369 100644
--- a/fontutils.c
+++ b/fontutils.c
@@ -1,8 +1,8 @@
-/* $XTermId: fontutils.c,v 1.259 2007/12/31 02:00:02 tom Exp $ */
+/* $XTermId: fontutils.c,v 1.267 2008/01/27 14:44:07 tom Exp $ */
 
 /************************************************************
 
-Copyright 1998-2006,2007 by Thomas E. Dickey
+Copyright 1998-2007,2008 by Thomas E. Dickey
 
                         All Rights Reserved
 
@@ -429,7 +429,7 @@ xtermSpecialFont(TScreen * screen, unsigned atts, unsigned 
chrset)
     int res_x;
     int res_y;
 
-    props = get_font_name_props(screen->display, screen->fnts[fNorm], 0);
+    props = get_font_name_props(screen->display, screen->fnts[fNorm].fs, 0);
     if (props == 0)
        return result;
 
@@ -680,29 +680,33 @@ cache_menu_font_name(TScreen * screen, int fontnum, int 
which, const char *name)
  * Open the given font and verify that it is non-empty.  Return a null on
  * failure.
  */
-XFontStruct *
-xtermOpenFont(XtermWidget xw, char *name)
+Bool
+xtermOpenFont(XtermWidget xw, char *name, XTermFonts * result)
 {
+    Bool code = False;
     TScreen *screen = TScreenOf(xw);
-    XFontStruct *nfs = 0;
 
     if (name != 0
-       && (nfs = XLoadQueryFont(screen->display, name)) != 0) {
-       if (EmptyFont(nfs)) {
-           nfs = xtermCloseFont(xw, nfs);
+       && (result->fs = XLoadQueryFont(screen->display, name)) != 0) {
+       code = True;
+       if (EmptyFont(result->fs)) {
+           result = xtermCloseFont(xw, result);
+           code = False;
+       } else {
+           result->fn = x_strdup(name);
        }
     }
-    return nfs;
+    return code;
 }
 
-XFontStruct *
-xtermCloseFont(XtermWidget xw, XFontStruct * fnt)
+XTermFonts *
+xtermCloseFont(XtermWidget xw, XTermFonts * fnt)
 {
-    if (fnt != 0) {
+    if (fnt != 0 && fnt->fs != 0) {
        TScreen *screen = TScreenOf(xw);
 
        clrCgsFonts(xw, WhichVWin(screen), fnt);
-       XFreeFont(screen->display, fnt);
+       XFreeFont(screen->display, fnt->fs);
     }
     return 0;
 }
@@ -711,22 +715,48 @@ xtermCloseFont(XtermWidget xw, XFontStruct * fnt)
  * Close the listed fonts, noting that some may use copies of the pointer.
  */
 void
-xtermCloseFonts(XtermWidget xw, XFontStruct ** fnts)
+xtermCloseFonts(XtermWidget xw, XTermFonts * fnts)
 {
     int j, k;
 
     for (j = 0; j < fMAX; ++j) {
-       if (fnts[j] != 0) {
-           xtermCloseFont(xw, fnts[j]);
+       if (fnts[j].fs != 0) {
+           xtermCloseFont(xw, &fnts[j]);
            for (k = j + 1; k < fMAX; ++k) {
-               if (fnts[j] == fnts[k])
-                   fnts[k] = 0;
+               if (fnts[j].fs == fnts[k].fs)
+                   xtermFreeFontInfo(&fnts[k]);
            }
-           fnts[j] = 0;
+           xtermFreeFontInfo(&fnts[j]);
        }
     }
 }
 
+/*
+ * Make a copy of the source, assuming the XFontStruct's to be unique, but
+ * ensuring that the names are reallocated to simplify freeing.
+ */
+void
+xtermCopyFontInfo(XTermFonts * target, XTermFonts * source)
+{
+    xtermFreeFontInfo(target);
+    target->chrset = source->chrset;
+    target->flags = source->flags;
+    target->fn = x_strdup(source->fn);
+    target->fs = source->fs;
+}
+
+void
+xtermFreeFontInfo(XTermFonts * target)
+{
+    target->chrset = 0;
+    target->flags = 0;
+    if (target->fn != 0) {
+       free(target->fn);
+       target->fn = 0;
+    }
+    target->fs = 0;
+}
+
 int
 xtermLoadFont(XtermWidget xw,
              const VTFontNames * fonts,
@@ -738,7 +768,7 @@ xtermLoadFont(XtermWidget xw,
 
     VTFontNames myfonts;
     FontNameProperties *fp;
-    XFontStruct *fnts[fMAX];
+    XTermFonts fnts[fMAX];
     Pixel new_normal;
     Pixel new_revers;
     char *tmpname = NULL;
@@ -769,34 +799,34 @@ xtermLoadFont(XtermWidget xw,
     TRACE(("xtermLoadFont #%d w/bold %s\n", fontnum, NonNull(myfonts.f_wb)));
 #endif
 
-    if (!(fnts[fNorm] = xtermOpenFont(xw, myfonts.f_n)))
+    if (!xtermOpenFont(xw, myfonts.f_n, &fnts[fNorm]))
        goto bad;
 
     strcpy(normal, myfonts.f_n);
     if (myfonts.f_b == 0) {
-       fp = get_font_name_props(screen->display, fnts[fNorm], normal);
+       fp = get_font_name_props(screen->display, fnts[fNorm].fs, normal);
        if (fp != 0) {
            myfonts.f_b = bold_font_name(fp, fp->average_width);
-           if ((fnts[fBold] = xtermOpenFont(xw, myfonts.f_b)) == 0) {
+           if (!xtermOpenFont(xw, myfonts.f_b, &fnts[fBold])) {
                myfonts.f_b = bold_font_name(fp, -1);
-               fnts[fBold] = xtermOpenFont(xw, myfonts.f_b);
+               (void) xtermOpenFont(xw, myfonts.f_b, &fnts[fBold]);
            }
            TRACE(("...derived bold %s\n", NonNull(myfonts.f_b)));
        }
-       if (fp == 0 || fnts[fBold] == 0) {
-           fnts[fBold] = fnts[fNorm];
+       if (fp == 0 || fnts[fBold].fs == 0) {
+           xtermCopyFontInfo(&fnts[fBold], &fnts[fNorm]);
            TRACE(("...cannot load a matching bold font\n"));
-       } else if (same_font_size(xw, fnts[fNorm], fnts[fBold])
-                  && got_bold_font(screen->display, fnts[fBold], myfonts.f_b)) 
{
+       } else if (same_font_size(xw, fnts[fNorm].fs, fnts[fBold].fs)
+                  && got_bold_font(screen->display, fnts[fBold].fs, 
myfonts.f_b)) {
            TRACE(("...got a matching bold font\n"));
            cache_menu_font_name(screen, fontnum, fBold, myfonts.f_b);
        } else {
-           xtermCloseFont(xw, fnts[fBold]);
+           xtermCloseFont(xw, &fnts[fBold]);
            fnts[fBold] = fnts[fNorm];
            TRACE(("...did not get a matching bold font\n"));
        }
-    } else if ((fnts[fBold] = xtermOpenFont(xw, myfonts.f_b)) == 0) {
-       fnts[fBold] = fnts[fNorm];
+    } else if (!xtermOpenFont(xw, myfonts.f_b, &fnts[fBold])) {
+       xtermCopyFontInfo(&fnts[fBold], &fnts[fNorm]);
        TRACE(("...cannot load bold font %s\n", NonNull(myfonts.f_b)));
     } else {
        cache_menu_font_name(screen, fontnum, fBold, myfonts.f_b);
@@ -813,8 +843,8 @@ xtermLoadFont(XtermWidget xw,
 
        if (myfonts.f_w != 0) {
            cache_menu_font_name(screen, fontnum, fWide, myfonts.f_w);
-       } else if (!is_double_width_font(fnts[fNorm])) {
-           fp = get_font_name_props(screen->display, fnts[fNorm], normal);
+       } else if (!is_double_width_font(fnts[fNorm].fs)) {
+           fp = get_font_name_props(screen->display, fnts[fNorm].fs, normal);
            if (fp != 0) {


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to