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

xterm: Changes to 'upstream-unstable'



 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 <jcristau@debian.org>
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) {


Reply to: