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: