Patch 7.2.141
Problem:    When redrawing a character for bold spill this causes the next
            character to be redrawn as well.
Solution:   Only redraw one extra character. (Yukihiro Nakadaira)
Files:      src/screen.c


*** ../vim-7.2.140/src/screen.c Wed Mar 11 17:44:38 2009
--- src/screen.c        Wed Mar 11 13:59:24 2009
***************
*** 5132,5139 ****
  #endif
  
  #if defined(FEAT_GUI) || defined(UNIX)
!           /* The bold trick makes a single row of pixels appear in the next
!            * character.  When a bold character is removed, the next
             * character should be redrawn too.  This happens for our own GUI
             * and for some xterms. */
            if (
--- 5132,5139 ----
  #endif
  
  #if defined(FEAT_GUI) || defined(UNIX)
!           /* The bold trick makes a single column of pixels appear in the
!            * next character.  When a bold character is removed, the next
             * character should be redrawn too.  This happens for our own GUI
             * and for some xterms. */
            if (
***************
*** 6276,6284 ****
--- 6276,6290 ----
      int               pcc[MAX_MCO];
  # endif
  #endif
+ #if defined(FEAT_MBYTE) || defined(FEAT_GUI) || defined(UNIX)
+     int               force_redraw_this;
+     int               force_redraw_next = FALSE;
+ #endif
+     int               need_redraw;
  
      if (ScreenLines == NULL || row >= screen_Rows)    /* safety check */
        return;
+     off = LineOffset[row] + col;
  
  #ifdef FEAT_MBYTE
      /* When drawing over the right halve of a double-wide char clear out the
***************
*** 6288,6297 ****
            && !gui.in_use
  # endif
            && mb_fix_col(col, row) != col)
!       screen_puts_len((char_u *)" ", 1, row, col - 1, 0);
  #endif
  
-     off = LineOffset[row] + col;
  #ifdef FEAT_MBYTE
      max_off = LineOffset[row] + screen_Columns;
  #endif
--- 6294,6314 ----
            && !gui.in_use
  # endif
            && mb_fix_col(col, row) != col)
!     {
!       ScreenLines[off - 1] = ' ';
!       ScreenAttrs[off - 1] = 0;
!       if (enc_utf8)
!       {
!           ScreenLinesUC[off - 1] = 0;
!           ScreenLinesC[0][off - 1] = 0;
!       }
!       /* redraw the previous cell, make it empty */
!       screen_char(off - 1, row, col - 1);
!       /* force the cell at "col" to be redrawn */
!       force_redraw_next = TRUE;
!     }
  #endif
  
  #ifdef FEAT_MBYTE
      max_off = LineOffset[row] + screen_Columns;
  #endif
***************
*** 6355,6361 ****
        }
  #endif
  
!       if (ScreenLines[off] != c
  #ifdef FEAT_MBYTE
                || (mbyte_cells == 2
                    && ScreenLines[off + 1] != (enc_dbcs ? ptr[1] : 0))
--- 6372,6383 ----
        }
  #endif
  
! #if defined(FEAT_MBYTE) || defined(FEAT_GUI) || defined(UNIX)
!       force_redraw_this = force_redraw_next;
!       force_redraw_next = FALSE;
! #endif
! 
!       need_redraw = ScreenLines[off] != c
  #ifdef FEAT_MBYTE
                || (mbyte_cells == 2
                    && ScreenLines[off + 1] != (enc_dbcs ? ptr[1] : 0))
***************
*** 6367,6386 ****
                        || screen_comp_differs(off, u8cc)))
  #endif
                || ScreenAttrs[off] != attr
!               || exmode_active
                )
        {
  #if defined(FEAT_GUI) || defined(UNIX)
            /* The bold trick makes a single row of pixels appear in the next
             * character.  When a bold character is removed, the next
             * character should be redrawn too.  This happens for our own GUI
!            * and for some xterms.
!            * Force the redraw by setting the attribute to a different value
!            * than "attr", the contents of ScreenLines[] may be needed by
!            * mb_off2cells() further on.
!            * Don't do this for the last drawn character, because the next
!            * character may not be redrawn. */
!           if (
  # ifdef FEAT_GUI
                    gui.in_use
  # endif
--- 6389,6408 ----
                        || screen_comp_differs(off, u8cc)))
  #endif
                || ScreenAttrs[off] != attr
!               || exmode_active;
! 
!       if (need_redraw
! #if defined(FEAT_MBYTE) || defined(FEAT_GUI) || defined(UNIX)
!               || force_redraw_this
! #endif
                )
        {
  #if defined(FEAT_GUI) || defined(UNIX)
            /* The bold trick makes a single row of pixels appear in the next
             * character.  When a bold character is removed, the next
             * character should be redrawn too.  This happens for our own GUI
!            * and for some xterms. */
!           if (need_redraw && ScreenLines[off] != ' ' && (
  # ifdef FEAT_GUI
                    gui.in_use
  # endif
***************
*** 6390,6412 ****
  # ifdef UNIX
                    term_is_xterm
  # endif
!              )
            {
!               int             n;
  
!               n = ScreenAttrs[off];
! # ifdef FEAT_MBYTE
!               if (col + mbyte_cells < screen_Columns
!                       && (n > HL_ALL || (n & HL_BOLD))
!                       && (len < 0 ? ptr[mbyte_blen] != NUL
!                                            : ptr + mbyte_blen < text + len))
!                   ScreenAttrs[off + mbyte_cells] = attr + 1;
! # else
!               if (col + 1 < screen_Columns
!                       && (n > HL_ALL || (n & HL_BOLD))
!                       && (len < 0 ? ptr[1] != NUL : ptr + 1 < text + len))
!                   ScreenLines[off + 1] = 0;
! # endif
            }
  #endif
  #ifdef FEAT_MBYTE
--- 6412,6425 ----
  # ifdef UNIX
                    term_is_xterm
  # endif
!                   ))
            {
!               int     n = ScreenAttrs[off];
  
!               if (n > HL_ALL)
!                   n = syn_attr2attr(n);
!               if (n & HL_BOLD)
!                   force_redraw_next = TRUE;
            }
  #endif
  #ifdef FEAT_MBYTE
***************
*** 6493,6498 ****
--- 6506,6525 ----
            ++ptr;
        }
      }
+ 
+ #if defined(FEAT_MBYTE) || defined(FEAT_GUI) || defined(UNIX)
+     /* If we detected the next character needs to be redrawn, but the text
+      * doesn't extend up to there, update the character here. */
+     if (force_redraw_next && col < screen_Columns)
+     {
+ # ifdef FEAT_MBYTE
+       if (enc_dbcs != 0 && dbcs_off2cells(off, max_off) > 1)
+           screen_char_2(off, row, col);
+       else
+ # endif
+           screen_char(off, row, col);
+     }
+ #endif
  }
  
  #ifdef FEAT_SEARCH_EXTRA
*** ../vim-7.2.140/src/version.c        Wed Mar 11 17:44:38 2009
--- src/version.c       Wed Mar 11 17:55:22 2009
***************
*** 678,679 ****
--- 678,681 ----
  {   /* Add new patch number below this line */
+ /**/
+     141,
  /**/

-- 
Some of the well know MS-Windows errors:
        ETIME           Wrong time, wait a little while
        ECRASH          Try again...
        EDETECT         Unable to detect errors
        EOVER           You lost!  Play another game?
        ENOCLUE         Eh, what did you want?

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\        download, build and distribute -- http://www.A-A-P.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

--~--~---------~--~----~------------~-------~--~----~
You received this message from the "vim_dev" maillist.
For more information, visit http://www.vim.org/maillist.php
-~----------~----~----~----~------~----~------~--~---

Raspunde prin e-mail lui