X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Ftty%2Ftty_update.c;h=17f641136d8ac165c0e77df8021cfed92cbd4b68;hp=482d66daab7669038431fa52ff34ac467046966e;hb=093902b4199bbc1d9afec433759e48344c06ed1a;hpb=b22573b1ba4b51da883fa5f805b52f153fa5fae9 diff --git a/ncurses/tty/tty_update.c b/ncurses/tty/tty_update.c index 482d66da..17f64113 100644 --- a/ncurses/tty/tty_update.c +++ b/ncurses/tty/tty_update.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2016,2017 Free Software Foundation, Inc. * + * Copyright (c) 1998-2017,2018 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 * @@ -84,7 +84,7 @@ #include -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.299 2018/09/08 21:33:59 tom Exp $") /* * This define controls the line-breakout optimization. Every once in a @@ -344,7 +344,9 @@ PutAttrChar(NCURSES_SP_DCLx CARG_CH_T ch) || 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 @@ -368,8 +370,23 @@ PutAttrChar(NCURSES_SP_DCLx CARG_CH_T ch) 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 @@ -666,7 +683,14 @@ EmitRange(NCURSES_SP_DCLx const NCURSES_CH_T * ntext, int num) } 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 && + ((AttrOf(ntext0) & A_ALTCHARSET) == 0 || + (CharOf(ntext0) < ACS_LEN))) && +#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; @@ -675,9 +699,17 @@ EmitRange(NCURSES_SP_DCLx const NCURSES_CH_T * ntext, int num) 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)); @@ -816,7 +848,8 @@ TINFO_DOUPDATE(NCURSES_SP_DCL0) 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. @@ -829,7 +862,7 @@ TINFO_DOUPDATE(NCURSES_SP_DCL0) } #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); @@ -838,7 +871,7 @@ TINFO_DOUPDATE(NCURSES_SP_DCL0) 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 */ @@ -2180,7 +2213,7 @@ NCURSES_SP_NAME(_nc_screen_resume) (NCURSES_SP_DCL0) 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) {