INSTALL | 6 MANIFEST | 2 charproc.c | 24 - configure | 6 configure.in | 6 ctlseqs.ms | 129 ++++- ctlseqs.txt | 119 ++++- fontutils.c | 53 +- graphics.c | 53 +- graphics.h | 7 graphics_regis.c | 1022 ++++++++++++++++++++++++++++++++++------------- main.c | 7 misc.c | 17 package/debian/changelog | 6 package/freebsd/Makefile | 2 package/xterm.spec | 4 version.h | 6 vttests/fonts.sh | 7 xterm.h | 4 xterm.log.html | 60 ++ xterm.man | 6 xtermcfg.hin | 3 22 files changed, 1134 insertions(+), 415 deletions(-)
New commits: commit e27b1046f0ab81daba99fa741507e5bf9826867d Author: Sven Joachim <[email protected]> Date: Thu Aug 20 19:54:05 2015 +0200 Imported Upstream version 319 diff --git a/INSTALL b/INSTALL index 7c4dfd2..f049a7c 100644 --- a/INSTALL +++ b/INSTALL @@ -1,4 +1,4 @@ --- $XTermId: INSTALL,v 1.157 2015/04/12 20:44:43 tom Exp $ +-- $XTermId: INSTALL,v 1.158 2015/08/10 23:38:32 tom Exp $ ------------------------------------------------------------------------------- -- Copyright 1997-2014,2015 by Thomas E. Dickey -- @@ -385,14 +385,14 @@ The options (in alphabetic order): This sets the default resource value, which is shown in the manpage. - --enable-broken-osc allow broken Linux OSC-strings], + --enable-broken-osc allow broken Linux OSC-strings Compile-in code to accommodate scripts that write Linux's malformed palette control strings without checking. The result makes xterm appear to freeze. This workaround makes xterm ignore the strings, and is compiled-in by default for Linux. - --enable-builtin-xpms allow broken Linux OSC-strings], + --enable-builtin-xpms compile-in icon data Compile-in X pixmap data for these icons: filled-xterm diff --git a/MANIFEST b/MANIFEST index 455149c..424d573 100644 --- a/MANIFEST +++ b/MANIFEST @@ -1,4 +1,4 @@ -MANIFEST for xterm-318, version xterm-318 +MANIFEST for xterm-319, version xterm-319 -------------------------------------------------------------------------------- MANIFEST this file 256colres.h resource-definitions for 256-color mode diff --git a/charproc.c b/charproc.c index df6adf4..c331a5f 100644 --- a/charproc.c +++ b/charproc.c @@ -1,4 +1,4 @@ -/* $XTermId: charproc.c,v 1.1409 2015/04/12 16:57:00 tom Exp $ */ +/* $XTermId: charproc.c,v 1.1413 2015/07/15 09:21:40 tom Exp $ */ /* * Copyright 1999-2014,2015 by Thomas E. Dickey @@ -7075,9 +7075,23 @@ RequestResize(XtermWidget xw, int rows, int cols, Bool text) TRACE(("RequestResize(rows=%d, cols=%d, text=%d)\n", rows, cols, text)); - if ((int) (askedWidth = (Dimension) cols) < cols - || (int) (askedHeight = (Dimension) rows) < rows) - return; + /* check first if the row/column values fit into a Dimension */ + if (cols > 0) { + if ((int) (askedWidth = (Dimension) cols) < cols) { + TRACE(("... cols too large for Dimension\n")); + return; + } + } else { + askedWidth = 0; + } + if (rows > 0) { + if ((int) (askedHeight = (Dimension) rows) < rows) { + TRACE(("... rows too large for Dimension\n")); + return; + } + } else { + askedHeight = 0; + } if (askedHeight == 0 || askedWidth == 0 @@ -10921,7 +10935,7 @@ HandleKeymapChange(Widget w, size_t len; TRACE(("HandleKeymapChange(%#lx, %s)\n", - w, + (unsigned long) w, (*param_count ? params[0] : "missing"))); diff --git a/configure b/configure index 39486ea..3919996 100755 --- a/configure +++ b/configure @@ -15807,13 +15807,13 @@ if test "${enable_builtin_xpms+set}" = set; then enableval="$enable_builtin_xpms" test "$enableval" != yes && enableval=no if test "$enableval" != "no" ; then - enable_builtin_xpms=no - else enable_builtin_xpms=yes + else + enable_builtin_xpms=no fi else enableval=no - enable_builtin_xpms=yes + enable_builtin_xpms=no fi; echo "$as_me:15819: result: $enable_builtin_xpms" >&5 diff --git a/configure.in b/configure.in index ff5d563..d5139f4 100644 --- a/configure.in +++ b/configure.in @@ -1,4 +1,4 @@ -dnl $XTermId: configure.in,v 1.335 2015/04/12 20:41:52 tom Exp $ +dnl $XTermId: configure.in,v 1.336 2015/08/10 23:45:36 tom Exp $ dnl dnl ----------------------------------------------------------------------------- dnl this file is part of xterm @@ -495,8 +495,8 @@ test "$enable_broken_st" = no && AC_DEFINE(OPT_BROKEN_ST,0,[Define to 0 to disal AC_MSG_CHECKING(if you want to compile-in icon data) CF_ARG_ENABLE(builtin-xpms, [ --enable-builtin-xpms compile-in icon data], - [enable_builtin_xpms=no], - [enable_builtin_xpms=yes]) + [enable_builtin_xpms=yes], + [enable_builtin_xpms=no]) AC_MSG_RESULT($enable_builtin_xpms) test "$enable_builtin_xpms" = yes && AC_DEFINE(OPT_BUILTIN_XPMS,1,[Define to 1 to compile-in icon data]) diff --git a/ctlseqs.ms b/ctlseqs.ms index 8a42eee..89f3a89 100644 --- a/ctlseqs.ms +++ b/ctlseqs.ms @@ -1,6 +1,6 @@ .\"#! troff -ms $1 -*- Nroff -*- .\" "Xterm Control Sequences" document -.\" $XTermId: ctlseqs.ms,v 1.320 2015/04/12 20:55:48 tom Exp $ +.\" $XTermId: ctlseqs.ms,v 1.324 2015/08/19 23:20:41 tom Exp $ .\" .\" .\" Copyright 1996-2014,2015 by Thomas E. Dickey @@ -70,7 +70,7 @@ .ds XT XTerm .ds xt xterm .ds LF Patch #318 -.ds RF 2015/04/12 +.ds RF 2015/08/19 .\" .if n .pl 9999v \" no page breaks in nroff .ND @@ -114,6 +114,13 @@ \\$* .br .. +.\" Escape single quotes in literal strings from groff's Unicode transform. +.ie \n(.g .ds AQ \(aq +.el .ds AQ ' +.ie \n(.g .ds `` \(lq +.el .ds `` `` +.ie \n(.g .ds '' \(rq +.el .ds '' '' .ds CH \" as nothing .ds LH \*(XT Control Sequences .nr s 6*\n(PS/10 @@ -351,6 +358,62 @@ Individual values for the parameters are listed with \*(Ps . .IP \*(Pt A text parameter composed of printable characters. . +.Sh "Control Bytes, Characters, and Sequences" +.LP +ECMA-48 (aka "ISO 6429") documents C1 (8-bit) and C0 (7-bit) codes. +Those are respectively codes 128 to 159 and 0 to 31. +ECMA-48 avoids referring to these codes as characters, +because that term is associated with \fIgraphic characters\fP. +Instead, it uses \*(``bytes\*('' and \*(``codes\*('', +with occasional lapses to \*(``characters\*('' +where the meaning cannot be mistaken. +.LP +Controls (including the escape code 27) are processed once: +.bP +This means that a C1 control can be mistaken for badly-formed UTF-8 +when the terminal runs +in UTF-8 mode because C1 controls are valid \fIcontinuation bytes\fP of +a UTF-8 encoded (multibyte) value. +.bP +It is not possible to use a C1 control obtained from decoding the UTF-8 text, +because that would require reprocessing the data. +Consequently there is no ambiguity in the way +this document uses the term \*(``character\*('' to refer to +bytes in a control sequence. +.LP +The order of processing is a necessary consequence of the way ECMA-48 +is designed: +.bP +Each byte sent to the terminal can be unambiguously determined to +fall into one of a few categories (C0, C1 and graphic characters). +.bP +ECMA-48 is \fImodal\fP; once it starts processing a control sequence, +the terminal continues until the sequence is complete, +or some byte is found which is not allowed in the sequence. +.bP +Intermediate, parameter and final bytes may +use the same codes as graphic characters, +but they are processed as part of a control sequence and are not actually +graphic characters. +.bP +Eight-bit controls can have intermediate, etc., bytes in the range 160 to 255. +Those can be treated as their counterparts in the range 32 to 127. +.bP +Single-byte controls can be handled separately from multi-byte +control sequences because ECMA-48's rules are unambiguous. +.IP +As a special case, ECMA-48 (section 9) mentions that the control functions +shift-in and shift-out are allowed to occur within a 7-bit multibyte control +sequence because those cannot alter the meaning of the control sequence. +.bP +Some controls (such as \*(Os) introduce a string mode, +which is ended on a \*(ST (string terminator). +.IP +Again, the terminal should accept single-byte controls within the string. +However, \fIxterm\fP has a resource setting \fBbrokenLinuxOSC\fP to allow +recovery from applications which rely upon malformed palette sequences +used by the Linux console. +. .Sh "C1 (8-Bit) Control Characters" .LP The \fIxterm\fP program recognizes both 8-bit and 7-bit control characters. @@ -808,12 +871,12 @@ Repeat the preceding graphic character \*(Ps times (REP). Send Device Attributes (Primary DA). \*(Ps = \*0 or omitted \(-> request attributes from terminal. The response depends on the \fBdecTerminalID\fP resource setting. - \(->\ \*(Cs\*?\*1\*;\*2\*c (``VT100 with Advanced Video Option'') - \(->\ \*(Cs\*?\*1\*;\*0\*c (``VT101 with No Options'') - \(->\ \*(Cs\*?\*6\*c (``VT102'') - \(->\ \*(Cs\*?\*6\*2\*;\*(Ps\*c (``VT220'') - \(->\ \*(Cs\*?\*6\*3\*;\*(Ps\*c (``VT320'') - \(->\ \*(Cs\*?\*6\*4\*;\*(Ps\*c (``VT420'') + \(->\ \*(Cs\*?\*1\*;\*2\*c (\*(``VT100 with Advanced Video Option\*('') + \(->\ \*(Cs\*?\*1\*;\*0\*c (\*(``VT101 with No Options\*('') + \(->\ \*(Cs\*?\*6\*c (\*(``VT102\*('') + \(->\ \*(Cs\*?\*6\*2\*;\*(Ps\*c (\*(``VT220\*('') + \(->\ \*(Cs\*?\*6\*3\*;\*(Ps\*c (\*(``VT320\*('') + \(->\ \*(Cs\*?\*6\*4\*;\*(Ps\*c (\*(``VT420\*('') .br The VT100-style response parameters do not mean anything by themselves. VT220 (and higher) parameters do, telling the host what features the terminal supports: @@ -838,16 +901,16 @@ It should apply only to VT220 and up, but \fIxterm\fP extends this to VT100. \(-> \*(Cs\*s\*>\*(Pp\*s\*;\*(Pv\*s\*;\*(Pc\*s\*c .br where \*(Pp denotes the terminal type - \*(Pp = \*0 \(-> ``VT100''. - \*(Pp = \*1 \(-> ``VT220''. - \*(Pp = \*2 \(-> ``VT240''. - \*(Pp = \*18 \(-> ``VT330''. - \*(Pp = \*19 \(-> ``VT340''. - \*(Pp = \*24 \(-> ``VT320''. - \*(Pp = \*41 \(-> ``VT420''. - \*(Pp = \*61 \(-> ``VT510''. - \*(Pp = \*64 \(-> ``VT520''. - \*(Pp = \*65 \(-> ``VT525''. + \*(Pp = \*0 \(-> \*(``VT100\*(''. + \*(Pp = \*1 \(-> \*(``VT220\*(''. + \*(Pp = \*2 \(-> \*(``VT240\*(''. + \*(Pp = \*18 \(-> \*(``VT330\*(''. + \*(Pp = \*19 \(-> \*(``VT340\*(''. + \*(Pp = \*24 \(-> \*(``VT320\*(''. + \*(Pp = \*41 \(-> \*(``VT420\*(''. + \*(Pp = \*61 \(-> \*(``VT510\*(''. + \*(Pp = \*64 \(-> \*(``VT520\*(''. + \*(Pp = \*65 \(-> \*(``VT525\*(''. .br and \*(Pv is the firmware version (for \fIxterm\fP, this was originally the XFree86 patch number, starting with 95). @@ -1154,7 +1217,7 @@ If no parameters are given, all resources are reset to their initial values. Device Status Report (DSR). \*(Ps = \*5 \(-> Status Report. .br -Result (``OK'') is +Result (\*(``OK\*('') is \*(Cs\*0\*n \*(Ps = \*6 \(-> Report Cursor Position (CPR) [row;column]. .br @@ -1542,17 +1605,17 @@ Valid values for the event: \*(Pe = \*9 \(-> M4 button up. \*(Pe = \*1\*0 \(-> locator outside filter rectangle. .br -The ``\fIbutton\fP'' parameter is a bitmask indicating which buttons are pressed: +The \*(``\fIbutton\fP\*('' parameter is a bitmask indicating which buttons are pressed: \*(Pb = \*0 \(<- no buttons down. \*(Pb & \*1 \(<- right button down. \*(Pb & \*2 \(<- middle button down. \*(Pb & \*4 \(<- left button down. \*(Pb & \*8 \(<- M4 button down. .br -The ``\fIrow\fP'' and ``\fIcolumn\fP'' parameters are the coordinates of the locator +The \*(``\fIrow\fP\*('' and \*(``\fIcolumn\fP\*('' parameters are the coordinates of the locator position in the \fI\*(xt\fP window, encoded as ASCII decimal. .br -The ``\fIpage\fP'' parameter is not used by \*(xt. +The \*(``\fIpage\fP\*('' parameter is not used by \*(xt. . .IP \\*(Cs\\*(Pm\\*s\\*(qu\\*} Insert \*(Ps Column(s) (default = 1) (DECIC), VT420 and up. @@ -1916,9 +1979,13 @@ F12 \*(Cs\*2\*4\*(c~ _ .TE .sP -Older versions of \fIxterm\fP implement different escape sequences for F1 through F4. +Note that F1 through F4 are prefixed with \*(S3, +while the other keys are prefixed with \*(Cs. +Older versions of \fIxterm\fP implement different escape sequences +for F1 through F4, with a \*(Cs prefix. These can be activated by setting the \fBoldXtermFKeys\fP resource. -However, since they do not correspond to any hardware terminal, they have been deprecated. +However, since they do not correspond to any hardware terminal, +they have been deprecated. (The DEC VT220 reserves F1 through F5 for local functions such as \fBSetup\fP). .TS H center; @@ -1935,10 +2002,14 @@ F4 \*(Cs\*1\*4\*(c~ _ .TE In normal mode, i.e., a Sun/PC keyboard -when the \fBsunKeyboard\fP resource is false, -\fIxterm\fP recognizes function key modifiers -which are parameters appended before the final character -of the control sequence. +when the \fBsunKeyboard\fP resource is false +(and none of the other keyboard resources +such as \fBoldXtermFKeys\fP resource is set), +\fIxterm\fP encodes function key modifiers +as parameters appended before the \fIfinal\fP character of the control sequence. +As a special case, +the \*(S3 sent before F1 through F4 is altered to \*(Cs when sending +a function key modifier as a parameter. .TS H center; cf3w(2c) lf3w(2c) . @@ -2646,7 +2717,7 @@ Erase from the cursor to the end of the line. Move the cursor to given row and column. .IP \\*(Es\\*Z Identify. - \(-> \*(Es\*s\*/\*s\*Z (``I am a VT52.''). + \(-> \*(Es\*s\*/\*s\*Z (\*(``I am a VT52.\*(''). .IP \\*(Es\\*= Enter alternate keypad mode. .IP \\*(Es\\*> diff --git a/ctlseqs.txt b/ctlseqs.txt index 4cb0a70..4a8858b 100644 --- a/ctlseqs.txt +++ b/ctlseqs.txt @@ -21,7 +21,7 @@ Thomas Dickey XFree86 Project (1996-2006) invisible-island.net (2006-2015) - updated for XTerm Patch #318 (2015/04/12) + updated for XTerm Patch #318 (2015/08/19) @@ -40,6 +40,59 @@ Pm A multiple numeric parameter composed of any number of single Pt A text parameter composed of printable characters. +Control Bytes, Characters, and Sequences + +ECMA-48 (aka "ISO 6429") documents C1 (8-bit) and C0 (7-bit) codes. +Those are respectively codes 128 to 159 and 0 to 31. ECMA-48 avoids +referring to these codes as characters, because that term is associated +with graphic characters. Instead, it uses "bytes" and "codes", with +occasional lapses to "characters" where the meaning cannot be mistaken. + +Controls (including the escape code 27) are processed once: + +o This means that a C1 control can be mistaken for badly-formed UTF-8 + when the terminal runs in UTF-8 mode because C1 controls are valid + continuation bytes of a UTF-8 encoded (multibyte) value. + +o It is not possible to use a C1 control obtained from decoding the + UTF-8 text, because that would require reprocessing the data. Conse- + quently there is no ambiguity in the way this document uses the term + "character" to refer to bytes in a control sequence. + +The order of processing is a necessary consequence of the way ECMA-48 is +designed: + +o Each byte sent to the terminal can be unambiguously determined to fall + into one of a few categories (C0, C1 and graphic characters). + +o ECMA-48 is modal; once it starts processing a control sequence, the + terminal continues until the sequence is complete, or some byte is + found which is not allowed in the sequence. + +o Intermediate, parameter and final bytes may use the same codes as + graphic characters, but they are processed as part of a control + sequence and are not actually graphic characters. + +o Eight-bit controls can have intermediate, etc., bytes in the range 160 + to 255. Those can be treated as their counterparts in the range 32 to + 127. + +o Single-byte controls can be handled separately from multi-byte control + sequences because ECMA-48's rules are unambiguous. + + As a special case, ECMA-48 (section 9) mentions that the control func- + tions shift-in and shift-out are allowed to occur within a 7-bit + multibyte control sequence because those cannot alter the meaning of + the control sequence. + +o Some controls (such as OSC ) introduce a string mode, which is ended + on a ST (string terminator). + + Again, the terminal should accept single-byte controls within the + string. However, xterm has a resource setting brokenLinuxOSC to allow + recovery from applications which rely upon malformed palette sequences + used by the Linux console. + C1 (8-Bit) Control Characters The xterm program recognizes both 8-bit and 7-bit control characters. @@ -312,12 +365,12 @@ CSI Ps b Repeat the preceding graphic character Ps times (REP). CSI Ps c Send Device Attributes (Primary DA). Ps = 0 or omitted -> request attributes from terminal. The response depends on the decTerminalID resource setting. - -> CSI ? 1 ; 2 c (``VT100 with Advanced Video Option'') - -> CSI ? 1 ; 0 c (``VT101 with No Options'') - -> CSI ? 6 c (``VT102'') - -> CSI ? 6 2 ; Psc (``VT220'') - -> CSI ? 6 3 ; Psc (``VT320'') - -> CSI ? 6 4 ; Psc (``VT420'') + -> CSI ? 1 ; 2 c ("VT100 with Advanced Video Option") + -> CSI ? 1 ; 0 c ("VT101 with No Options") + -> CSI ? 6 c ("VT102") + -> CSI ? 6 2 ; Psc ("VT220") + -> CSI ? 6 3 ; Psc ("VT320") + -> CSI ? 6 4 ; Psc ("VT420") The VT100-style response parameters do not mean anything by themselves. VT220 (and higher) parameters do, telling the host what features the terminal supports: @@ -341,16 +394,16 @@ CSI > Ps c this to VT100. -> CSI > Pp ; Pv ; Pc c where Pp denotes the terminal type - Pp = 0 -> ``VT100''. - Pp = 1 -> ``VT220''. - Pp = 2 -> ``VT240''. - Pp = 1 8 -> ``VT330''. - Pp = 1 9 -> ``VT340''. - Pp = 2 4 -> ``VT320''. - Pp = 4 1 -> ``VT420''. - Pp = 6 1 -> ``VT510''. - Pp = 6 4 -> ``VT520''. - Pp = 6 5 -> ``VT525''. + Pp = 0 -> "VT100". + Pp = 1 -> "VT220". + Pp = 2 -> "VT240". + Pp = 1 8 -> "VT330". + Pp = 1 9 -> "VT340". + Pp = 2 4 -> "VT320". + Pp = 4 1 -> "VT420". + Pp = 6 1 -> "VT510". + Pp = 6 4 -> "VT520". + Pp = 6 5 -> "VT525". and Pv is the firmware version (for xterm, this was originally the XFree86 patch number, starting with 95). In a DEC termi- nal, Pc indicates the ROM cartridge registration number and is @@ -647,7 +700,7 @@ CSI > Ps; Ps m initial values. CSI Ps n Device Status Report (DSR). Ps = 5 -> Status Report. - Result (``OK'') is CSI 0 n + Result ("OK") is CSI 0 n Ps = 6 -> Report Cursor Position (CPR) [row;column]. Result is CSI r ; c R @@ -963,17 +1016,17 @@ CSI Ps ' | Pe = 8 -> M4 button down. Pe = 9 -> M4 button up. Pe = 1 0 -> locator outside filter rectangle. - The ``button'' parameter is a bitmask indicating which buttons + The "button" parameter is a bitmask indicating which buttons are pressed: Pb = 0 <- no buttons down. Pb & 1 <- right button down. Pb & 2 <- middle button down. Pb & 4 <- left button down. Pb & 8 <- M4 button down. - The ``row'' and ``column'' parameters are the coordinates of - the locator position in the xterm window, encoded as ASCII - decimal. - The ``page'' parameter is not used by xterm. + The "row" and "column" parameters are the coordinates of the + locator position in the xterm window, encoded as ASCII deci- + mal. + The "page" parameter is not used by xterm. CSI Pm ' } Insert Ps Column(s) (default = 1) (DECIC), VT420 and up. CSI Pm ' ~ @@ -1267,11 +1320,12 @@ pose keys: ---------+----------------- -Older versions of xterm implement different escape sequences for F1 -through F4. These can be activated by setting the oldXtermFKeys -resource. However, since they do not correspond to any hardware termi- -nal, they have been deprecated. (The DEC VT220 reserves F1 through F5 -for local functions such as Setup). +Note that F1 through F4 are prefixed with SS3 , while the other keys are +prefixed with CSI . Older versions of xterm implement different escape +sequences for F1 through F4, with a CSI prefix. These can be activated +by setting the oldXtermFKeys resource. However, since they do not cor- +respond to any hardware terminal, they have been deprecated. (The DEC +VT220 reserves F1 through F5 for local functions such as Setup). Key Escape Sequence ---------+----------------- @@ -1282,8 +1336,11 @@ for local functions such as Setup). ---------+----------------- In normal mode, i.e., a Sun/PC keyboard when the sunKeyboard resource is -false, xterm recognizes function key modifiers which are parameters -appended before the final character of the control sequence. +false (and none of the other keyboard resources such as oldXtermFKeys +resource is set), xterm encodes function key modifiers as parameters +appended before the final character of the control sequence. As a spe- +cial case, the SS3 sent before F1 through F4 is altered to CSI when +sending a function key modifier as a parameter. Code Modifiers ---------+--------------------------- @@ -1805,7 +1862,7 @@ ESC K Erase from the cursor to the end of the line. ESC Y Ps Ps Move the cursor to given row and column. ESC Z Identify. - -> ESC / Z (``I am a VT52.''). + -> ESC / Z ("I am a VT52."). ESC = Enter alternate keypad mode. ESC > Exit alternate keypad mode. ESC < Exit VT52 mode (Enter VT100 mode). diff --git a/fontutils.c b/fontutils.c index 3bfc919..9487dc2 100644 --- a/fontutils.c +++ b/fontutils.c @@ -1,4 +1,4 @@ -/* $XTermId: fontutils.c,v 1.448 2015/03/02 13:19:36 tom Exp $ */ +/* $XTermId: fontutils.c,v 1.451 2015/08/18 00:55:19 tom Exp $ */ /* * Copyright 1998-2014,2015 by Thomas E. Dickey @@ -534,7 +534,7 @@ xtermSpecialFont(TScreen *screen, unsigned attr_flags, unsigned draw_flags, unsi TRACE(("pixel_size = %d\n", pixel_size)); TRACE(("spacing = %s\n", props->spacing)); old_props.res_x = res_x; - old_props.res_x = res_y; + old_props.res_y = res_y; old_props.pixel_size = pixel_size; old_props.spacing = old_spacing; sprintf(old_spacing, "%.*s", (int) sizeof(old_spacing) - 2, props->spacing); @@ -865,25 +865,36 @@ xtermCloseFont(XtermWidget xw, XTermFonts * fnt) } /* + * Close and free the font (as well as any aliases). + */ +static void +xtermCloseFont2(XtermWidget xw, XTermFonts * fnts, int which) +{ + XFontStruct *thisFont = fnts[which].fs; + int k; + + if (thisFont != 0) { + xtermCloseFont(xw, &fnts[which]); + for (k = 0; k < fMAX; ++k) { + if (k != which) { + if (thisFont == fnts[k].fs) { + xtermFreeFontInfo(&fnts[k]); + } + } + } + } +} + +/* * Close the listed fonts, noting that some may use copies of the pointer. */ void xtermCloseFonts(XtermWidget xw, XTermFonts * fnts) { - int j, k; + int j; for (j = 0; j < fMAX; ++j) { - /* - * Need to save the pointer since xtermCloseFont zeroes it - */ - XFontStruct *thisFont = fnts[j].fs; - if (thisFont != 0) { - xtermCloseFont(xw, &fnts[j]); - for (k = j + 1; k < fMAX; ++k) { - if (thisFont == fnts[k].fs) - xtermFreeFontInfo(&fnts[k]); - } - } + xtermCloseFont2(xw, fnts, j); } } @@ -1162,7 +1173,7 @@ xtermLoadFont(XtermWidget xw, TRACE(("...got a matching bold font\n")); cache_menu_font_name(screen, fontnum, fBold, myfonts.f_b); } else { - xtermCloseFont(xw, &fnts[fBold]); + xtermCloseFont2(xw, fnts, fBold); fnts[fBold] = fnts[fNorm]; TRACE(("...did not get a matching bold font\n")); } @@ -1225,7 +1236,7 @@ xtermLoadFont(XtermWidget xw, if (derived && !compatibleWideCounts(fnts[fWide].fs, fnts[fWBold].fs)) { - xtermCloseFont(xw, &fnts[fWBold]); + xtermCloseFont2(xw, fnts, fWBold); } if (fnts[fWBold].fs == 0) { FREE_FNAME(f_wb); @@ -1277,7 +1288,7 @@ xtermLoadFont(XtermWidget xw, if (!same_font_size(xw, fnts[fNorm].fs, fnts[fBold].fs) && (is_fixed_font(fnts[fNorm].fs) && is_fixed_font(fnts[fBold].fs))) { TRACE(("...ignoring mismatched normal/bold fonts\n")); - xtermCloseFont(xw, &fnts[fBold]); + xtermCloseFont2(xw, fnts, fBold); xtermCopyFontInfo(&fnts[fBold], &fnts[fNorm]); } @@ -1289,7 +1300,7 @@ xtermLoadFont(XtermWidget xw, && is_fixed_font(fnts[fWide].fs) && is_fixed_font(fnts[fWBold].fs)))) { TRACE(("...ignoring mismatched normal/bold wide fonts\n")); - xtermCloseFont(xw, &fnts[fWBold]); + xtermCloseFont2(xw, fnts, fWBold); xtermCopyFontInfo(&fnts[fWBold], &fnts[fWide]); } }); @@ -3091,7 +3102,7 @@ dec2ucs(unsigned ch) #endif /* OPT_WIDE_CHARS */ -#if OPT_SHIFT_FONTS +#if OPT_RENDERFONT || OPT_SHIFT_FONTS static int lookupOneFontSize(XtermWidget xw, int fontnum) { @@ -3133,6 +3144,7 @@ lookupFontSizes(XtermWidget xw) (void) lookupOneFontSize(xw, n); } } +#endif /* OPT_RENDERFONT || OPT_SHIFT_FONTS */ #if OPT_RENDERFONT static double @@ -3268,6 +3280,7 @@ useFaceSizes(XtermWidget xw) } #endif /* OPT_RENDERFONT */ +#if OPT_SHIFT_FONTS /* * Find the index of a larger/smaller font (according to the sign of 'relative' * and its magnitude), starting from the 'old' index. @@ -3391,7 +3404,7 @@ HandleSmallerFont(Widget w GCC_UNUSED, } } } -#endif +#endif /* OPT_SHIFT_FONTS */ int xtermGetFont(const char *param) diff --git a/graphics.c b/graphics.c index 665b749..e76f562 100644 --- a/graphics.c +++ b/graphics.c @@ -1,7 +1,7 @@ -/* $XTermId: graphics.c,v 1.62 2014/12/23 00:08:58 Ross.Combs Exp $ */ +/* $XTermId: graphics.c,v 1.68 2015/07/13 08:58:48 Ross.Combs Exp $ */ /* - * Copyright 2013,2014 by Ross Combs + * Copyright 2013-2014,2015 by Ross Combs * * All Rights Reserved * @@ -52,13 +52,14 @@ * graphics TODO list * * ReGIS: - * - find a suitable default alphabet zero font instead of scaling Xft fonts + * - ship a default alphabet zero font instead of scaling Xft fonts * - input and output cursors * - mouse input - * - investigate second graphic page for ReGIS -- does it also apply to text and sixel graphics? are the contents preserved? + * - fix graphic pages for ReGIS -- they should also apply to text and sixel graphics * - fix interpolated curves to more closely match implementation (identical despite direction and starting point) * - non-ASCII alphabets - * - enter/leave during a command + * - enter/leave anywhere in a command + * - locator key definitions (DECLKD) * - command display mode * - re-rasterization on resize * - macros @@ -94,7 +95,9 @@ * - ability to show non-scroll-mode sixel graphics in a separate window * - ability to show ReGIS graphics in a separate window * - ability to show Tektronix graphics in VT100 window - * - truncate graphics at bottom edge of window? + * - truncate graphics at bottom edge of terminal? + * - locator events (DECEFR DECSLE DECELR DECLRP) + * - locator controller mode (CSI6i / CSI7i) * * new escape sequences: * - way to query text font size without "window ops" (or make "window ops" permissions more fine grained) @@ -690,6 +693,7 @@ init_graphic(Graphic *graphic, TRACE(("initializing graphic object\n")); + graphic->hidden = 0; graphic->dirty = 1; for (i = 0U; i < max_pixels; i++) graphic->pixels[i] = COLOR_HOLE; @@ -804,15 +808,24 @@ get_new_or_matching_graphic(XtermWidget xw, unsigned ii; FOR_EACH_SLOT(ii) { - if ((graphic = getActiveSlot(ii)) && - graphic->type == type && - graphic->bufferid == bufferid && - graphic->charrow == charrow && - graphic->charcol == charcol && - graphic->actual_width == actual_width && - graphic->actual_height == actual_height) { - TRACE(("found existing graphic index=%u id=%u\n", ii, graphic->id)); - return graphic; + TRACE(("checking slot=%u for graphic at %d,%d %dx%d bufferid=%d type=%u\n", ii, + charrow, charcol, + actual_width, actual_height, + bufferid, type)); + if ((graphic = getActiveSlot(ii))) { + if (graphic->type == type && + graphic->bufferid == bufferid && + graphic->charrow == charrow && + graphic->charcol == charcol && + graphic->actual_width == actual_width && + graphic->actual_height == actual_height) { + TRACE(("found existing graphic slot=%u id=%u\n", ii, graphic->id)); + return graphic; + } + TRACE(("not a match: graphic at %d,%d %dx%d bufferid=%d type=%u\n", + graphic->charrow, graphic->charcol, + graphic->actual_width, graphic->actual_height, + graphic->bufferid, graphic->type)); } } @@ -820,6 +833,10 @@ get_new_or_matching_graphic(XtermWidget xw, if ((graphic = get_new_graphic(xw, charrow, charcol, type))) { graphic->actual_width = actual_width; graphic->actual_height = actual_height; + TRACE(("no match; created graphic at %d,%d %dx%d bufferid=%d type=%u\n", + graphic->charrow, graphic->charcol, + graphic->actual_width, graphic->actual_height, + graphic->bufferid, graphic->type)); } return graphic; } @@ -1340,6 +1357,8 @@ refresh_graphics(XtermWidget xw, continue; } } + if (graphic->hidden) + continue; ordered_graphics[active_count++] = graphic; } @@ -1688,6 +1707,8 @@ scroll_displayed_graphics(XtermWidget xw, int rows) continue; if (graphic->bufferid != screen->whichBuf) continue; + if (graphic->hidden) + continue; graphic->charrow -= rows; } @@ -1716,6 +1737,8 @@ pixelarea_clear_displayed_graphics(TScreen const *screen, continue; if (graphic->bufferid != screen->whichBuf) continue; + if (graphic->hidden) + continue; graph_x = graphic->charcol * FontWidth(screen); graph_y = graphic->charrow * FontHeight(screen); diff --git a/graphics.h b/graphics.h index f1edaca..724e847 100644 --- a/graphics.h +++ b/graphics.h @@ -1,8 +1,8 @@ -/* $XTermId: graphics.h,v 1.20 2014/11/28 19:48:36 tom Exp $ */ +/* $XTermId: graphics.h,v 1.22 2015/04/23 00:47:24 tom Exp $ */ /* - * Copyright 2013,2014 by Ross Combs - * Copyright 2013,2014 by Thomas E. Dickey + * Copyright 2013-2014,2015 by Ross Combs + * Copyright 2013-2014,2015 by Thomas E. Dickey * * All Rights Reserved * @@ -73,6 +73,7 @@ typedef struct { unsigned id; /* sequential id used for preserving layering */ int valid; /* if the graphic has been initialized */ int dirty; /* if the graphic needs to be redrawn */ + int hidden; /* if the graphic should not be displayed */ } Graphic; extern Graphic *get_new_graphic(XtermWidget xw, int charrow, int charcol, unsigned type); diff --git a/graphics_regis.c b/graphics_regis.c index 3a983a8..59e92c2 100644 --- a/graphics_regis.c +++ b/graphics_regis.c @@ -1,7 +1,7 @@ -/* $XTermId: graphics_regis.c,v 1.62 2014/12/23 01:39:00 tom Exp $ */ +/* $XTermId: graphics_regis.c,v 1.76 2015/07/13 22:52:29 tom Exp $ */ /* - * Copyright 2014 by Ross Combs + * Copyright 2014,2015 by Ross Combs * * All Rights Reserved * @@ -79,12 +79,15 @@ #define SCALE_FIXED_POINT 16U +#undef DEBUG_PARSING +#undef DEBUG_ALPHABET_LOOKUP #undef DEBUG_ALPHABETS #undef DEBUG_BEZIER #undef DEBUG_SPLINE_SEGMENTS #undef DEBUG_SPLINE_POINTS #undef DEBUG_SPLINE_WITH_ROTATION #undef DEBUG_SPLINE_WITH_OVERDRAW +#undef DEBUG_ARC_POINTS #undef DEBUG_ARC_CENTER #undef DEBUG_ARC_START #undef DEBUG_ARC_END @@ -94,6 +97,7 @@ #undef DEBUG_FONT_NAME #undef DEBUG_FONT_SIZE_SEARCH #undef DEBUG_XFT_GLYPH +#undef DEBUG_USER_GLYPH #undef DEBUG_LOAD /* controls for extensions over VT3x0 limitations */ @@ -104,8 +108,8 @@ #define ENABLE_USER_FONT_SIZE #define ENABLE_VARIABLE_ITALICS -#define MIN_ITERATIONS_BEFORE_REFRESH 20U -#define MIN_MS_BEFORE_REFRESH 30 +#define MIN_ITERATIONS_BEFORE_REFRESH 10U +#define MIN_MS_BEFORE_REFRESH 33 /* *INDENT-OFF* */ typedef struct RegisPoint { int x, y; @@ -144,6 +148,8 @@ typedef struct RegisTextControls { #define FixedCopy(dst, src, len) strncpy(dst, src, len - 1)[len - 1] = '\0' #define CopyFontname(dst, src) FixedCopy(dst, src, REGIS_FONTNAME_LEN) +#define MAX_REGIS_PAGES 8U + #define MAX_REGIS_ALPHABETS 8U #define REGIS_ALPHABET_NAME_LEN 11U #define REGIS_FONTNAME_LEN 256U @@ -212,7 +218,8 @@ typedef struct RegisParseState { } RegisParseState; typedef struct RegisGraphicsContext { - Graphic *graphic; + Graphic *destination_graphic; + Graphic *display_graphic; int terminal_id; int x_off, y_off; int x_div, y_div; @@ -234,9 +241,13 @@ typedef struct RegisGraphicsContext { int fill_mode; RegisPoint fill_points[MAX_FILL_POINTS]; unsigned fill_point_count; + unsigned destination_page; + unsigned display_page; + int force_refresh; } RegisGraphicsContext; static RegisGraphicsContext persistent_context; +static RegisParseState persistent_state; #define MAX_PATTERN_BITS 8U @@ -247,6 +258,7 @@ static RegisGraphicsContext persistent_context; #define WRITE_SHADING_REF_Y 0U #define WRITE_SHADING_REF_X 1U +#define WRITE_SHADING_REF_NONE 2U /* keypress event example: http://iraf.net/forum/viewtopic.php?showtopic=61692 */ @@ -259,15 +271,24 @@ static RegisGraphicsContext persistent_context; ((V) >> (8U - ((N) & 3U))) ) #define ROT_LEFT(V) ( (((V) << 1U) & 255U) | ((V) >> 7U) ) +/* convert user coordinates to absolute pixel coordinates */ #define SCALE_XCOORD(C, X, S) ( ( (X) * ((C)->width - 1) ) / ( (C)->x_div * (S) ) ) #define SCALE_YCOORD(C, Y, S) ( ( (Y) * ((C)->height - 1) ) / ( (C)->y_div * (S) ) ) #define TRANSLATE_XCOORD(C, X, S) SCALE_XCOORD((C), (X) - (C)->x_off * (S), (S) ) #define TRANSLATE_YCOORD(C, Y, S) SCALE_YCOORD((C), (Y) - (C)->y_off * (S), (S) ) -#define READ_PIXEL(C, X, Y) read_pixel((C)->graphic, (X), (Y)) -#define DRAW_PIXEL(C, X, Y, COL) draw_solid_pixel((C)->graphic, (X), (Y), (COL)) +#if 0 +/* convert absolute pixel coordinate to user coordinates */ +#define SCALE_XPIX(C, X, S) ( ( (X) * ((C)->x_div * (S) ) ) / ((C)->width - 1) ) +#define SCALE_YPIX(C, Y, S) ( ( (Y) * ((C)->y_div * (S) ) ) / ((C)->height - 1) ) +#define TRANSLATE_XPIX(C, X, S) ( SCALE_XPIX((C), (X), (S) ) + (C)->x_off * (S) ) +#define TRANSLATE_YPIX(C, Y, S) ( SCALE_YPIX((C), (Y), (S) ) + (C)->y_off * (S) ) +#endif + +#define READ_PIXEL(C, X, Y) read_pixel((C)->destination_graphic, (X), (Y)) +#define DRAW_PIXEL(C, X, Y, COL) draw_solid_pixel((C)->destination_graphic, (X), (Y), (COL)) #define DRAW_ALL(C, COL) \ - draw_solid_rectangle((C)->graphic, 0, 0, (C)->width, (C)->height, (COL)) + draw_solid_rectangle((C)->destination_graphic, 0, 0, (C)->width, (C)->height, (COL)) static unsigned get_shade_character_pixel(unsigned char const *pixels, unsigned w, unsigned h, @@ -379,7 +400,7 @@ shade_pattern_to_pixel(RegisGraphicsContext *context, unsigned dim, int ref, context->pattern_bit; draw_regis_pixel(context, curr_x, y, value); } - } else { + } else if (dim == WRITE_SHADING_REF_Y) { int delta = y > ref ? 1 : -1; int curr_y; @@ -389,6 +410,8 @@ shade_pattern_to_pixel(RegisGraphicsContext *context, unsigned dim, int ref, context->pattern_bit; draw_regis_pixel(context, x, curr_y, value); } + } else { + TRACE(("ERROR: shading requested, but there is no reference axis\n")); } } @@ -421,7 +444,7 @@ shade_char_to_pixel(RegisGraphicsContext *context, unsigned char const *pixels, curr_x, y); draw_regis_pixel(context, curr_x, y, value); } - } else { + } else if (dim == WRITE_SHADING_REF_Y) { int delta = y > ref ? 1 : -1; int curr_y; @@ -430,6 +453,8 @@ shade_char_to_pixel(RegisGraphicsContext *context, unsigned char const *pixels, curr_y); draw_regis_pixel(context, x, curr_y, value); }

