]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - ncurses/tty/tty_update.c
ncurses 6.0 - patch 20151212
[ncurses.git] / ncurses / tty / tty_update.c
index 4e314308fd0f40dc1220946521d82a5b956ce7e1..0c9b3c02a1a8e75f5c2731daa3a71491851e41d3 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * 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            *
@@ -82,7 +82,7 @@
 
 #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.281 2015/12/13 00:39:28 tom Exp $")
 
 /*
  * This define controls the line-breakout optimization.  Every once in a
@@ -277,15 +277,17 @@ PutAttrChar(NCURSES_SP_DCLx CARG_CH_T ch)
         * 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)];
+           }
        }
 #endif
        /*
@@ -628,6 +630,7 @@ PutRange(NCURSES_SP_DCLx
         int first, int last)
 {
     int i, j, same;
+    int rc;
 
     TR(TRACE_CHARPUT, ("PutRange(%p, %p, %p, %d, %d, %d)",
                       (void *) SP_PARM,
@@ -655,9 +658,11 @@ PutRange(NCURSES_SP_DCLx
         * 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 */
@@ -1492,9 +1497,17 @@ TransformLine(NCURSES_SP_DCLx int const lineno)
            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);
@@ -1514,8 +1527,9 @@ TransformLine(NCURSES_SP_DCLx int const lineno)
                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 {
                    /*