/****************************************************************************
- * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2014,2015 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
#include <ctype.h>
-MODULE_ID("$Id: tty_update.c,v 1.279 2014/07/12 23:16:30 tom Exp $")
+MODULE_ID("$Id: tty_update.c,v 1.282 2015/12/20 00:59:09 tom Exp $")
/*
* This define controls the line-breakout optimization. Every once in a
SP_PARM->_curscol, "GoTo2");
}
+#if !NCURSES_WCWIDTH_GRAPHICS
+static bool
+is_wacs_value(unsigned ch)
+{
+ bool result;
+ switch (ch) {
+ case 0x00a3: /* FALLTHRU - ncurses pound-sterling symbol */
+ case 0x00b0: /* FALLTHRU - VT100 degree symbol */
+ case 0x00b1: /* FALLTHRU - VT100 plus/minus */
+ case 0x00b7: /* FALLTHRU - VT100 bullet */
+ case 0x03c0: /* FALLTHRU - ncurses greek pi */
+ case 0x2190: /* FALLTHRU - Teletype arrow pointing left */
+ case 0x2191: /* FALLTHRU - Teletype arrow pointing up */
+ case 0x2192: /* FALLTHRU - Teletype arrow pointing right */
+ case 0x2193: /* FALLTHRU - Teletype arrow pointing down */
+ case 0x2260: /* FALLTHRU - ncurses not-equal */
+ case 0x2264: /* FALLTHRU - ncurses less-than-or-equal-to */
+ case 0x2265: /* FALLTHRU - ncurses greater-than-or-equal-to */
+ case 0x23ba: /* FALLTHRU - VT100 scan line 1 */
+ case 0x23bb: /* FALLTHRU - ncurses scan line 3 */
+ case 0x23bc: /* FALLTHRU - ncurses scan line 7 */
+ case 0x23bd: /* FALLTHRU - VT100 scan line 9 */
+ case 0x2500: /* FALLTHRU - VT100 horizontal line */
+ case 0x2501: /* FALLTHRU - thick horizontal line */
+ case 0x2502: /* FALLTHRU - VT100 vertical line */
+ case 0x2503: /* FALLTHRU - thick vertical line */
+ case 0x250c: /* FALLTHRU - VT100 upper left corner */
+ case 0x250f: /* FALLTHRU - thick upper left corner */
+ case 0x2510: /* FALLTHRU - VT100 upper right corner */
+ case 0x2513: /* FALLTHRU - thick upper right corner */
+ case 0x2514: /* FALLTHRU - VT100 lower left corner */
+ case 0x2517: /* FALLTHRU - thick lower left corner */
+ case 0x2518: /* FALLTHRU - VT100 lower right corner */
+ case 0x251b: /* FALLTHRU - thick lower right corner */
+ case 0x251c: /* FALLTHRU - VT100 tee pointing left */
+ case 0x2523: /* FALLTHRU - thick tee pointing left */
+ case 0x2524: /* FALLTHRU - VT100 tee pointing right */
+ case 0x252b: /* FALLTHRU - thick tee pointing right */
+ case 0x252c: /* FALLTHRU - VT100 tee pointing down */
+ case 0x2533: /* FALLTHRU - thick tee pointing down */
+ case 0x2534: /* FALLTHRU - VT100 tee pointing up */
+ case 0x253b: /* FALLTHRU - thick tee pointing up */
+ case 0x253c: /* FALLTHRU - VT100 large plus or crossover */
+ case 0x254b: /* FALLTHRU - thick large plus or crossover */
+ case 0x2550: /* FALLTHRU - double horizontal line */
+ case 0x2551: /* FALLTHRU - double vertical line */
+ case 0x2554: /* FALLTHRU - double upper left corner */
+ case 0x2557: /* FALLTHRU - double upper right corner */
+ case 0x255a: /* FALLTHRU - double lower left corner */
+ case 0x255d: /* FALLTHRU - double lower right corner */
+ case 0x2560: /* FALLTHRU - double tee pointing right */
+ case 0x2563: /* FALLTHRU - double tee pointing left */
+ case 0x2566: /* FALLTHRU - double tee pointing down */
+ case 0x2569: /* FALLTHRU - double tee pointing up */
+ case 0x256c: /* FALLTHRU - double large plus or crossover */
+ case 0x2592: /* FALLTHRU - VT100 checker board (stipple) */
+ case 0x25ae: /* FALLTHRU - Teletype solid square block */
+ case 0x25c6: /* FALLTHRU - VT100 diamond */
+ case 0x2603: /* FALLTHRU - Teletype lantern symbol */
+ result = TRUE;
+ break;
+ default:
+ result = FALSE;
+ break;
+ }
+ return result;
+}
+#endif
+
static NCURSES_INLINE void
PutAttrChar(NCURSES_SP_DCLx CARG_CH_T ch)
{
if ((AttrOf(attr) & A_ALTCHARSET)
&& SP_PARM->_acs_map != 0
- && CharOfD(ch) < ACS_LEN) {
+ && ((CharOfD(ch) < ACS_LEN)
+#if !NCURSES_WCWIDTH_GRAPHICS
+ || is_wacs_value(CharOfD(ch))
+#endif
+ )) {
my_ch = CHDEREF(ch); /* work around const param */
#if USE_WIDEC_SUPPORT
/*
* character, and uses the wide-character mapping when we expect the
* normal one to be broken (by mis-design ;-).
*/
- if (SP_PARM->_screen_acs_fix
- && SP_PARM->_screen_acs_map[CharOf(my_ch)]) {
- RemAttr(attr, A_ALTCHARSET);
- my_ch = _nc_wacs[CharOf(my_ch)];
- } else if (SP_PARM->_screen_unicode
- && !SP_PARM->_screen_acs_map[CharOf(my_ch)]
- && _nc_wacs[CharOf(my_ch)].chars[0]) {
- RemAttr(attr, A_ALTCHARSET);
- my_ch = _nc_wacs[CharOf(my_ch)];
+ if (SP_PARM->_screen_unicode
+ && _nc_wacs[CharOf(my_ch)].chars[0]) {
+ if (SP_PARM->_screen_acs_map[CharOf(my_ch)]) {
+ if (SP_PARM->_screen_acs_fix) {
+ RemAttr(attr, A_ALTCHARSET);
+ my_ch = _nc_wacs[CharOf(my_ch)];
+ }
+ } else {
+ RemAttr(attr, A_ALTCHARSET);
+ my_ch = _nc_wacs[CharOf(my_ch)];
+ }
+#if !NCURSES_WCWIDTH_GRAPHICS
+ if (!(AttrOf(attr) & A_ALTCHARSET)) {
+ chlen = 1;
+ }
+#endif /* !NCURSES_WCWIDTH_GRAPHICS */
}
#endif
/*
}
ch = CHREF(my_ch);
}
+#if USE_WIDEC_SUPPORT && !NCURSES_WCWIDTH_GRAPHICS
+ else if (chlen > 1 && is_wacs_value(CharOfD(ch))) {
+ chlen = 1;
+ }
+#endif
if (tilde_glitch && (CharOfD(ch) == L('~'))) {
SetChar(tilde, L('`'), AttrOf(attr));
ch = CHREF(tilde);
int first, int last)
{
int i, j, same;
+ int rc;
TR(TRACE_CHARPUT, ("PutRange(%p, %p, %p, %d, %d, %d)",
(void *) SP_PARM,
* Always return 1 for the next GoTo() after a PutRange() if we found
* identical characters at end of interval
*/
- return (same == 0 ? i : 1);
+ rc = (same == 0 ? i : 1);
+ } else {
+ rc = EmitRange(NCURSES_SP_ARGx ntext + first, last - first + 1);
}
- return EmitRange(NCURSES_SP_ARGx ntext + first, last - first + 1);
+ return rc;
}
/* leave unbracketed here so 'indent' works */
if (oLastChar < nLastChar) {
int m = max(nLastNonblank, oLastNonblank);
#if USE_WIDEC_SUPPORT
- while (isWidecExt(newLine[n + 1]) && n) {
- --n;
- --oLastChar;
+ if (n) {
+ while (isWidecExt(newLine[n + 1]) && n) {
+ --n;
+ --oLastChar; /* increase cost */
+ }
+ } else if (n >= firstChar &&
+ isWidecBase(newLine[n])) {
+ while (isWidecExt(newLine[n + 1])) {
+ ++n;
+ ++oLastChar; /* decrease cost */
+ }
}
#endif
GoTo(NCURSES_SP_ARGx lineno, n + 1);
if (DelCharCost(SP_PARM, oLastChar - nLastChar)
> SP_PARM->_el_cost + nLastNonblank - (n + 1)) {
if (PutRange(NCURSES_SP_ARGx oldLine, newLine, lineno,
- n + 1, nLastNonblank))
- GoTo(NCURSES_SP_ARGx lineno, nLastNonblank + 1);
+ n + 1, nLastNonblank)) {
+ GoTo(NCURSES_SP_ARGx lineno, nLastNonblank + 1);
+ }
ClrToEOL(NCURSES_SP_ARGx blank, FALSE);
} else {
/*