X-Git-Url: https://ncurses.scripts.mit.edu/?a=blobdiff_plain;f=ncurses%2Ftty%2Ftty_update.c;h=80815244bb9b1162dd54fb4a9cb7d8215236fb4b;hb=aaa5142e4bdde469fbc59d1c91455cbd0c45281a;hp=69de9c2e13cc8d387376e43c80e8a41e7e1b15e1;hpb=88e7914acafc37f84af25b80f403eb4290e423d4;p=ncurses.git diff --git a/ncurses/tty/tty_update.c b/ncurses/tty/tty_update.c index 69de9c2e..80815244 100644 --- a/ncurses/tty/tty_update.c +++ b/ncurses/tty/tty_update.c @@ -1,5 +1,6 @@ /**************************************************************************** - * Copyright (c) 1998-2018,2019 Free Software Foundation, Inc. * + * Copyright 2018-2021,2022 Thomas E. Dickey * + * Copyright 1998-2016,2017 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 +85,7 @@ #include -MODULE_ID("$Id: tty_update.c,v 1.302 2019/05/04 22:43:40 tom Exp $") +MODULE_ID("$Id: tty_update.c,v 1.314 2022/07/23 22:12:59 tom Exp $") /* * This define controls the line-breakout optimization. Every once in a @@ -116,14 +117,14 @@ static int ClrBottom(SCREEN *, int total); static void ClearScreen(SCREEN *, NCURSES_CH_T blank); static void ClrUpdate(SCREEN *); static void DelChar(SCREEN *, int count); -static void InsStr(SCREEN *, NCURSES_CH_T * line, int count); +static void InsStr(SCREEN *, NCURSES_CH_T *line, int count); static void TransformLine(SCREEN *, int const lineno); #else static int ClrBottom(int total); static void ClearScreen(NCURSES_CH_T blank); static void ClrUpdate(void); static void DelChar(int count); -static void InsStr(NCURSES_CH_T * line, int count); +static void InsStr(NCURSES_CH_T *line, int count); static void TransformLine(int const lineno); #endif @@ -135,7 +136,7 @@ static void TransformLine(int const lineno); ****************************************************************************/ static void -position_check(NCURSES_SP_DCLx int expected_y, int expected_x, char *legend) +position_check(NCURSES_SP_DCLx int expected_y, int expected_x, const char *legend) /* check to see if the real cursor position matches the virtual */ { char buf[20]; @@ -169,9 +170,9 @@ position_check(NCURSES_SP_DCLx int expected_y, int expected_x, char *legend) if (y - 1 != expected_y || x - 1 != expected_x) { NCURSES_SP_NAME(beep) (NCURSES_SP_ARG); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx - tparm("\033[%d;%dH", - expected_y + 1, - expected_x + 1), + TIPARM_2("\033[%d;%dH", + expected_y + 1, + expected_x + 1), 1, NCURSES_SP_NAME(_nc_outch)); _tracef("position seen (%d, %d) doesn't match expected one (%d, %d) in %s", y - 1, x - 1, expected_y, expected_x, legend); @@ -210,7 +211,7 @@ GoTo(NCURSES_SP_DCLx int const row, int const col) } #if !NCURSES_WCWIDTH_GRAPHICS -#define is_wacs_value(ch) (_nc_wacs_width(ch) == 1 && (wcwidth)(ch) > 1) +#define is_wacs_value(ch) (_nc_wacs_width(ch) == 1 && wcwidth(ch) > 1) #endif /* !NCURSES_WCWIDTH_GRAPHICS */ static NCURSES_INLINE void @@ -428,11 +429,12 @@ PutCharLR(NCURSES_SP_DCLx const ARG_CH_T ch) /* we can put the char directly */ PutAttrChar(NCURSES_SP_ARGx ch); } else if (enter_am_mode && exit_am_mode) { + int oldcol = SP_PARM->_curscol; /* we can suppress automargin */ NCURSES_PUTP2("exit_am_mode", exit_am_mode); PutAttrChar(NCURSES_SP_ARGx ch); - SP_PARM->_curscol--; + SP_PARM->_curscol = oldcol; position_check(NCURSES_SP_ARGx SP_PARM->_cursrow, SP_PARM->_curscol, @@ -471,7 +473,7 @@ wrap_cursor(NCURSES_SP_DCL0) * An aggressive way to handle this would be to emit CR/LF after the * char and then assume the wrap is done, you're on the first position * of the next line, and the terminal out of its weird state. Here - * it's safe to just tell the code that the cursor is in hyperspace and + * it is safe to just tell the code that the cursor is in hyperspace and * let the next mvcur() call straighten things out. */ SP_PARM->_curscol = -1; @@ -487,7 +489,7 @@ wrap_cursor(NCURSES_SP_DCL0) 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--; @@ -566,7 +568,7 @@ can_clear_with(NCURSES_SP_DCLx ARG_CH_T ch) * This code is optimized using ech and rep. */ static int -EmitRange(NCURSES_SP_DCLx const NCURSES_CH_T * ntext, int num) +EmitRange(NCURSES_SP_DCLx const NCURSES_CH_T *ntext, int num) { int i; @@ -604,7 +606,7 @@ EmitRange(NCURSES_SP_DCLx const NCURSES_CH_T * ntext, int num) && runcount > SP_PARM->_ech_cost + SP_PARM->_cup_ch_cost && can_clear_with(NCURSES_SP_ARGx CHREF(ntext0))) { UpdateAttrs(SP_PARM, ntext0); - NCURSES_PUTP2("erase_chars", TPARM_1(erase_chars, runcount)); + NCURSES_PUTP2("erase_chars", TIPARM_1(erase_chars, runcount)); /* * If this is the last part of the given interval, @@ -619,6 +621,9 @@ EmitRange(NCURSES_SP_DCLx const NCURSES_CH_T * ntext, int num) return 1; /* cursor stays in the middle */ } } else if (repeat_char != 0 && +#if BSD_TPUTS + !isdigit(UChar(CharOf(ntext0))) && +#endif #if USE_WIDEC_SUPPORT (!SP_PARM->_screen_unicode && (CharOf(ntext0) < ((AttrOf(ntext0) & A_ALTCHARSET) @@ -644,9 +649,9 @@ EmitRange(NCURSES_SP_DCLx const NCURSES_CH_T * ntext, int num) AttrOf(ntext0) | A_ALTCHARSET); } NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx - TPARM_2(repeat_char, - CharOf(temp), - rep_count), + TIPARM_2(repeat_char, + CharOf(temp), + rep_count), 1, NCURSES_SP_NAME(_nc_outch)); SP_PARM->_curscol += rep_count; @@ -678,8 +683,8 @@ EmitRange(NCURSES_SP_DCLx const NCURSES_CH_T * ntext, int num) */ static int PutRange(NCURSES_SP_DCLx - const NCURSES_CH_T * otext, - const NCURSES_CH_T * ntext, + const NCURSES_CH_T *otext, + const NCURSES_CH_T *ntext, int row, int first, int last) { @@ -752,14 +757,20 @@ TINFO_DOUPDATE(NCURSES_SP_DCL0) * We do not allow applications to assign new values in the reentrant * model. */ +#if NCURSES_SP_FUNCS + if (SP_PARM == CURRENT_SCREEN) { +#endif #define SyncScreens(internal,exported) \ if (internal == 0) internal = exported; \ if (internal != exported) exported = internal - SyncScreens(CurScreen(SP_PARM), curscr); - SyncScreens(NewScreen(SP_PARM), newscr); - SyncScreens(StdScreen(SP_PARM), stdscr); + SyncScreens(CurScreen(SP_PARM), curscr); + SyncScreens(NewScreen(SP_PARM), newscr); + SyncScreens(StdScreen(SP_PARM), stdscr); +#if NCURSES_SP_FUNCS + } #endif +#endif /* !USE_REENTRANT */ if (CurScreen(SP_PARM) == 0 || NewScreen(SP_PARM) == 0 @@ -818,7 +829,7 @@ TINFO_DOUPDATE(NCURSES_SP_DCL0) /* * This is the support for magic-cookie terminals. The theory: we scan * the virtual screen looking for attribute turnons. Where we find one, - * check to make sure it's realizable by seeing if the required number of + * check to make sure it is realizable by seeing if the required number of * un-attributed blanks are present before and after the attributed range; * try to shift the range boundaries over blanks (not changing the screen * display) so this becomes true. If it is, shift the beginning attribute @@ -880,7 +891,7 @@ TINFO_DOUPDATE(NCURSES_SP_DCL0) bool end_onscreen = FALSE; int m, n = j; - /* find end of span, if it's onscreen */ + /* find end of span, if it is onscreen */ for (m = i; m < screen_lines(SP_PARM); m++) { for (; n < screen_columns(SP_PARM); n++) { attr_t testattr = @@ -1320,8 +1331,8 @@ TransformLine(NCURSES_SP_DCLx int const lineno) newPair = GetPair(newLine[n]); if (oldPair != newPair && unColor(oldLine[n]) == unColor(newLine[n])) { - if (oldPair < SP_PARM->_pair_limit - && newPair < SP_PARM->_pair_limit + if (oldPair < SP_PARM->_pair_alloc + && newPair < SP_PARM->_pair_alloc && (isSamePair(SP_PARM->_color_pairs[oldPair], SP_PARM->_color_pairs[newPair]))) { SetPair(oldLine[n], GetPair(newLine[n])); @@ -1700,7 +1711,7 @@ ClearScreen(NCURSES_SP_DCLx NCURSES_CH_T blank) */ static void -InsStr(NCURSES_SP_DCLx NCURSES_CH_T * line, int count) +InsStr(NCURSES_SP_DCLx NCURSES_CH_T *line, int count) { TR(TRACE_UPDATE, ("InsStr(%p, %p,%d) called", (void *) SP_PARM, @@ -1712,7 +1723,7 @@ InsStr(NCURSES_SP_DCLx NCURSES_CH_T * line, int count) if (parm_ich) { TPUTS_TRACE("parm_ich"); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx - TPARM_1(parm_ich, count), + TIPARM_1(parm_ich, count), 1, NCURSES_SP_NAME(_nc_outch)); while (count > 0) { @@ -1765,7 +1776,7 @@ DelChar(NCURSES_SP_DCLx int count) if (parm_dch) { TPUTS_TRACE("parm_dch"); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx - TPARM_1(parm_dch, count), + TIPARM_1(parm_dch, count), 1, NCURSES_SP_NAME(_nc_outch)); } else { @@ -1834,7 +1845,7 @@ scroll_csr_forward(NCURSES_SP_DCLx UpdateAttrs(SP_PARM, blank); TPUTS_TRACE("parm_index"); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx - TPARM_2(parm_index, n, 0), + TIPARM_1(parm_index, n), n, NCURSES_SP_NAME(_nc_outch)); } else if (parm_delete_line && bot == maxy) { @@ -1842,7 +1853,7 @@ scroll_csr_forward(NCURSES_SP_DCLx UpdateAttrs(SP_PARM, blank); TPUTS_TRACE("parm_delete_line"); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx - TPARM_2(parm_delete_line, n, 0), + TIPARM_1(parm_delete_line, n), n, NCURSES_SP_NAME(_nc_outch)); } else if (scroll_forward && top == miny && bot == maxy) { @@ -1899,7 +1910,7 @@ scroll_csr_backward(NCURSES_SP_DCLx UpdateAttrs(SP_PARM, blank); TPUTS_TRACE("parm_rindex"); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx - TPARM_2(parm_rindex, n, 0), + TIPARM_1(parm_rindex, n), n, NCURSES_SP_NAME(_nc_outch)); } else if (parm_insert_line && bot == maxy) { @@ -1907,7 +1918,7 @@ scroll_csr_backward(NCURSES_SP_DCLx UpdateAttrs(SP_PARM, blank); TPUTS_TRACE("parm_insert_line"); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx - TPARM_2(parm_insert_line, n, 0), + TIPARM_1(parm_insert_line, n), n, NCURSES_SP_NAME(_nc_outch)); } else if (scroll_reverse && top == miny && bot == maxy) { @@ -1955,7 +1966,7 @@ scroll_idl(NCURSES_SP_DCLx int n, int del, int ins, NCURSES_CH_T blank) } else if (parm_delete_line) { TPUTS_TRACE("parm_delete_line"); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx - TPARM_2(parm_delete_line, n, 0), + TIPARM_1(parm_delete_line, n), n, NCURSES_SP_NAME(_nc_outch)); } else { /* if (delete_line) */ @@ -1971,7 +1982,7 @@ scroll_idl(NCURSES_SP_DCLx int n, int del, int ins, NCURSES_CH_T blank) } else if (parm_insert_line) { TPUTS_TRACE("parm_insert_line"); NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx - TPARM_2(parm_insert_line, n, 0), + TIPARM_1(parm_insert_line, n), n, NCURSES_SP_NAME(_nc_outch)); } else { /* if (insert_line) */ @@ -2036,7 +2047,7 @@ NCURSES_SP_NAME(_nc_scrolln) (NCURSES_SP_DCLx NCURSES_PUTP2("save_cursor", save_cursor); } NCURSES_PUTP2("change_scroll_region", - TPARM_2(change_scroll_region, top, bot)); + TIPARM_2(change_scroll_region, top, bot)); if (cursor_saved) { NCURSES_PUTP2("restore_cursor", restore_cursor); } else { @@ -2046,7 +2057,7 @@ NCURSES_SP_NAME(_nc_scrolln) (NCURSES_SP_DCLx res = scroll_csr_forward(NCURSES_SP_ARGx n, top, bot, top, bot, blank); NCURSES_PUTP2("change_scroll_region", - TPARM_2(change_scroll_region, 0, maxy)); + TIPARM_2(change_scroll_region, 0, maxy)); SP_PARM->_cursrow = SP_PARM->_curscol = -1; } @@ -2082,7 +2093,7 @@ NCURSES_SP_NAME(_nc_scrolln) (NCURSES_SP_DCLx NCURSES_PUTP2("save_cursor", save_cursor); } NCURSES_PUTP2("change_scroll_region", - TPARM_2(change_scroll_region, top, bot)); + TIPARM_2(change_scroll_region, top, bot)); if (cursor_saved) { NCURSES_PUTP2("restore_cursor", restore_cursor); } else { @@ -2093,7 +2104,7 @@ NCURSES_SP_NAME(_nc_scrolln) (NCURSES_SP_DCLx -n, top, bot, top, bot, blank); NCURSES_PUTP2("change_scroll_region", - TPARM_2(change_scroll_region, 0, maxy)); + TIPARM_2(change_scroll_region, 0, maxy)); SP_PARM->_cursrow = SP_PARM->_curscol = -1; }