/****************************************************************************
- * Copyright (c) 1998-2016,2017 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2018,2019 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.289 2017/06/30 11:47:01 tom Exp $")
+MODULE_ID("$Id: tty_update.c,v 1.304 2019/06/23 16:22:17 tom Exp $")
/*
* This define controls the line-breakout optimization. Every once in a
}
#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
+#define is_wacs_value(ch) (_nc_wacs_width(ch) == 1 && wcwidth(ch) > 1)
+#endif /* !NCURSES_WCWIDTH_GRAPHICS */
static NCURSES_INLINE void
PutAttrChar(NCURSES_SP_DCLx CARG_CH_T ch)
* Determine the number of character cells which the 'ch' value will use
* on the screen. It should be at least one.
*/
- if ((chlen = wcwidth(CharOf(CHDEREF(ch)))) <= 0) {
+ if ((chlen = _nc_wacs_width(CharOf(CHDEREF(ch)))) <= 0) {
static const NCURSES_CH_T blank = NewChar(BLANK_TEXT);
/*
|| is_wacs_value(CharOfD(ch))
#endif
)) {
+ int c8;
my_ch = CHDEREF(ch); /* work around const param */
+ c8 = CharOf(my_ch);
#if USE_WIDEC_SUPPORT
/*
* This is crude & ugly, but works most of the time. It checks if the
chlen = 1;
}
#endif /* !NCURSES_WCWIDTH_GRAPHICS */
- }
+ } else
#endif
+ if (!SP_PARM->_screen_acs_map[c8]) {
+ /*
+ * If we found no mapping for a given alternate-character set item
+ * in the terminal description, attempt to use the ASCII fallback
+ * code which is populated in the _acs_map[] array. If that did
+ * not correspond to a line-drawing, etc., graphics character, the
+ * array entry would be empty.
+ */
+ chtype temp = UChar(SP_PARM->_acs_map[c8]);
+ if (temp) {
+ RemAttr(attr, A_ALTCHARSET);
+ SetChar(my_ch, temp, AttrOf(attr));
+ }
+ }
+
/*
* If we (still) have alternate character set, it is the normal 8bit
* flavor. The _screen_acs_map[] array tells if the character was
TR(TRACE_CHARPUT, ("turning off (%#lx) %s before wrapping",
(unsigned long) AttrOf(SCREEN_ATTRS(SP_PARM)),
_traceattr(AttrOf(SCREEN_ATTRS(SP_PARM)))));
- (void) VIDATTR(SP_PARM, A_NORMAL, 0);
+ VIDPUTS(SP_PARM, A_NORMAL, 0);
}
} else {
SP_PARM->_curscol--;
} else {
return 1; /* cursor stays in the middle */
}
- } else if (repeat_char && runcount > SP_PARM->_rep_cost) {
+ } else if (repeat_char != 0 &&
+#if USE_WIDEC_SUPPORT
+ (!SP_PARM->_screen_unicode &&
+ (CharOf(ntext0) < ((AttrOf(ntext0) & A_ALTCHARSET)
+ ? ACS_LEN
+ : 256))) &&
+#endif
+ runcount > SP_PARM->_rep_cost) {
+ NCURSES_CH_T temp;
bool wrap_possible = (SP_PARM->_curscol + runcount >=
screen_columns(SP_PARM));
int rep_count = runcount;
rep_count--;
UpdateAttrs(SP_PARM, ntext0);
+ temp = ntext0;
+ if ((AttrOf(temp) & A_ALTCHARSET) &&
+ SP_PARM->_acs_map != 0 &&
+ (SP_PARM->_acs_map[CharOf(temp)] & A_CHARTEXT) != 0) {
+ SetChar(temp,
+ (SP_PARM->_acs_map[CharOf(ntext0)] & A_CHARTEXT),
+ AttrOf(ntext0) | A_ALTCHARSET);
+ }
NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
TPARM_2(repeat_char,
- CharOf(ntext0),
+ CharOf(temp),
rep_count),
1,
NCURSES_SP_NAME(_nc_outch));
SP_PARM->_fifohold--;
#if USE_SIZECHANGE
- if (SP_PARM->_endwin || _nc_handle_sigwinch(SP_PARM)) {
+ if ((SP_PARM->_endwin == ewSuspend)
+ || _nc_handle_sigwinch(SP_PARM)) {
/*
* This is a transparent extension: XSI does not address it,
* and applications need not know that ncurses can do it.
}
#endif
- if (SP_PARM->_endwin) {
+ if (SP_PARM->_endwin == ewSuspend) {
T(("coming back from shell mode"));
NCURSES_SP_NAME(reset_prog_mode) (NCURSES_SP_ARG);
NCURSES_SP_NAME(_nc_screen_resume) (NCURSES_SP_ARG);
SP_PARM->_mouse_resume(SP_PARM);
- SP_PARM->_endwin = FALSE;
+ SP_PARM->_endwin = ewRunning;
}
#if USE_TRACE_TIMES
/* zero the metering machinery */
NCURSES_SP_NAME(_nc_reset_colors) (NCURSES_SP_ARG);
/* restore user-defined colors, if any */
- if (SP_PARM->_color_defs < 0) {
+ if (SP_PARM->_color_defs < 0 && !SP_PARM->_direct_color.value) {
int n;
SP_PARM->_color_defs = -(SP_PARM->_color_defs);
for (n = 0; n < SP_PARM->_color_defs; ++n) {