]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - ncurses/tty/tty_update.c
ncurses 6.1 - patch 20190302
[ncurses.git] / ncurses / tty / tty_update.c
index c8f8b2f8e0f1e037be07e59bcf1b94792501aa8e..b86dfe4eb9f8f414030177abee3ecad45723a60a 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 1998-2015,2016 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            *
@@ -43,6 +43,8 @@
  *
  *-----------------------------------------------------------------*/
 
+#define NEW_PAIR_INTERNAL 1
+
 #include <curses.priv.h>
 
 #ifndef CUR
@@ -82,7 +84,7 @@
 
 #include <ctype.h>
 
-MODULE_ID("$Id: tty_update.c,v 1.284 2016/10/15 23:00:29 tom Exp $")
+MODULE_ID("$Id: tty_update.c,v 1.300 2019/02/25 21:42:01 tom Exp $")
 
 /*
  * This define controls the line-breakout optimization.  Every once in a
@@ -342,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
@@ -366,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
@@ -578,14 +597,15 @@ can_clear_with(NCURSES_SP_DCLx ARG_CH_T ch)
 
        if (!SP_PARM->_default_color)
            return FALSE;
-       if (SP_PARM->_default_fg != C_MASK || SP_PARM->_default_bg != C_MASK)
+       if (!(isDefaultColor(SP_PARM->_default_fg) &&
+             isDefaultColor(SP_PARM->_default_bg)))
            return FALSE;
        if ((pair = GetPair(CHDEREF(ch))) != 0) {
            NCURSES_COLOR_T fg, bg;
            if (NCURSES_SP_NAME(pair_content) (NCURSES_SP_ARGx
                                               (short) pair,
                                               &fg, &bg) == ERR
-               || (fg != C_MASK || bg != C_MASK)) {
+               || !(isDefaultColor(fg) && isDefaultColor(bg))) {
                return FALSE;
            }
        }
@@ -663,7 +683,15 @@ 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 &&
+                       (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;
@@ -672,9 +700,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));
@@ -766,9 +802,12 @@ TINFO_DOUPDATE(NCURSES_SP_DCL0)
 
     T((T_CALLED("_nc_tinfo:doupdate(%p)"), (void *) SP_PARM));
 
-    if (SP_PARM == 0)
-       returnCode(ERR);
+    _nc_lock_global(update);
 
+    if (SP_PARM == 0) {
+       _nc_unlock_global(update);
+       returnCode(ERR);
+    }
 #if !USE_REENTRANT
     /*
      * It is "legal" but unlikely that an application could assign a new
@@ -789,9 +828,10 @@ TINFO_DOUPDATE(NCURSES_SP_DCL0)
 
     if (CurScreen(SP_PARM) == 0
        || NewScreen(SP_PARM) == 0
-       || StdScreen(SP_PARM) == 0)
+       || StdScreen(SP_PARM) == 0) {
+       _nc_unlock_global(update);
        returnCode(ERR);
-
+    }
 #ifdef TRACE
     if (USE_TRACEF(TRACE_UPDATE)) {
        if (CurScreen(SP_PARM)->_clear)
@@ -809,7 +849,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.
@@ -822,7 +863,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);
@@ -831,7 +872,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 */
@@ -1099,6 +1140,7 @@ TINFO_DOUPDATE(NCURSES_SP_DCL0)
 
     _nc_signal_handler(TRUE);
 
+    _nc_unlock_global(update);
     returnCode(OK);
 }
 
@@ -1345,8 +1387,8 @@ TransformLine(NCURSES_SP_DCLx int const lineno)
                    && unColor(oldLine[n]) == unColor(newLine[n])) {
                    if (oldPair < SP_PARM->_pair_limit
                        && newPair < SP_PARM->_pair_limit
-                       && (SP_PARM->_color_pairs[oldPair] ==
-                           SP_PARM->_color_pairs[newPair])) {
+                       && (isSamePair(SP_PARM->_color_pairs[oldPair],
+                                      SP_PARM->_color_pairs[newPair]))) {
                        SetPair(oldLine[n], GetPair(newLine[n]));
                    }
                }
@@ -1738,14 +1780,14 @@ InsStr(NCURSES_SP_DCLx NCURSES_CH_T * line, int count)
                                TPARM_1(parm_ich, count),
                                1,
                                NCURSES_SP_NAME(_nc_outch));
-       while (count) {
+       while (count > 0) {
            PutAttrChar(NCURSES_SP_ARGx CHREF(*line));
            line++;
            count--;
        }
     } else if (enter_insert_mode && exit_insert_mode) {
        NCURSES_PUTP2("enter_insert_mode", enter_insert_mode);
-       while (count) {
+       while (count > 0) {
            PutAttrChar(NCURSES_SP_ARGx CHREF(*line));
            if (insert_padding) {
                NCURSES_PUTP2("insert_padding", insert_padding);
@@ -1755,7 +1797,7 @@ InsStr(NCURSES_SP_DCLx NCURSES_CH_T * line, int count)
        }
        NCURSES_PUTP2("exit_insert_mode", exit_insert_mode);
     } else {
-       while (count) {
+       while (count > 0) {
            NCURSES_PUTP2("insert_character", insert_character);
            PutAttrChar(NCURSES_SP_ARGx CHREF(*line));
            if (insert_padding) {
@@ -2172,16 +2214,16 @@ 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) {
            if (SP_PARM->_color_table[n].init) {
-               NCURSES_SP_NAME(init_color) (NCURSES_SP_ARGx
-                                            (short) n,
-                                            SP_PARM->_color_table[n].r,
-                                            SP_PARM->_color_table[n].g,
-                                            SP_PARM->_color_table[n].b);
+               _nc_init_color(SP_PARM,
+                              n,
+                              SP_PARM->_color_table[n].r,
+                              SP_PARM->_color_table[n].g,
+                              SP_PARM->_color_table[n].b);
            }
        }
     }