Merge #8829 from ZviRackover/fix-7401-step2

This commit is contained in:
Justin M. Keyes
2018-08-15 10:28:53 +02:00
committed by GitHub
3 changed files with 39 additions and 52 deletions

View File

@@ -1829,8 +1829,8 @@ const char *mb_unescape(const char **const pp)
*/ */
bool mb_lefthalve(int row, int col) bool mb_lefthalve(int row, int col)
{ {
return (*mb_off2cells)(LineOffset[row] + col, return utf_off2cells(LineOffset[row] + col,
LineOffset[row] + screen_Columns) > 1; LineOffset[row] + screen_Columns) > 1;
} }
/* /*

View File

@@ -53,7 +53,6 @@ enum { MAX_MCO = 6 };
#define mb_ptr2cells utf_ptr2cells #define mb_ptr2cells utf_ptr2cells
#define mb_ptr2cells_len utf_ptr2cells_len #define mb_ptr2cells_len utf_ptr2cells_len
#define mb_char2cells utf_char2cells #define mb_char2cells utf_char2cells
#define mb_off2cells utf_off2cells
#define mb_head_off utf_head_off #define mb_head_off utf_head_off
/// Flags for vimconv_T /// Flags for vimconv_T

View File

@@ -4232,26 +4232,19 @@ win_line (
/* Remember that the line wraps, used for modeless copy. */ /* Remember that the line wraps, used for modeless copy. */
LineWraps[screen_row - 1] = TRUE; LineWraps[screen_row - 1] = TRUE;
/* // Special trick to make copy/paste of wrapped lines work with
* Special trick to make copy/paste of wrapped lines work with // xterm/screen: write an extra character beyond the end of
* xterm/screen: write an extra character beyond the end of // the line. This will work with all terminal types
* the line. This will work with all terminal types // (regardless of the xn,am settings).
* (regardless of the xn,am settings). // Only do this if the cursor is on the current line
* Only do this if the cursor is on the current line // (something has been written in it).
* (something has been written in it). // Don't do this for double-width characters.
* Don't do this for double-width characters. // Don't do this for a window not at the right screen border.
* Don't do this for a window not at the right screen border. if (utf_off2cells(LineOffset[screen_row],
*/ LineOffset[screen_row] + screen_Columns) != 2
if (!(has_mbyte && utf_off2cells(LineOffset[screen_row - 1] + (int)Columns - 2,
&& ((*mb_off2cells)(LineOffset[screen_row], LineOffset[screen_row] + screen_Columns) != 2) {
LineOffset[screen_row] + screen_Columns) ui_add_linewrap(screen_row - 1);
== 2
|| (*mb_off2cells)(LineOffset[screen_row - 1]
+ (int)Columns - 2,
LineOffset[screen_row] + screen_Columns)
== 2))
) {
ui_add_linewrap(screen_row-1);
} }
} }
@@ -4304,7 +4297,7 @@ static int char_needs_redraw(int off_from, int off_to, int cols)
return (cols > 0 return (cols > 0
&& ((schar_cmp(ScreenLines[off_from], ScreenLines[off_to]) && ((schar_cmp(ScreenLines[off_from], ScreenLines[off_to])
|| ScreenAttrs[off_from] != ScreenAttrs[off_to] || ScreenAttrs[off_from] != ScreenAttrs[off_to]
|| ((*mb_off2cells)(off_from, off_from + cols) > 1 || (utf_off2cells(off_from, off_from + cols) > 1
&& schar_cmp(ScreenLines[off_from + 1], && schar_cmp(ScreenLines[off_from + 1],
ScreenLines[off_to + 1]))) ScreenLines[off_to + 1])))
|| p_wd < 0)); || p_wd < 0));
@@ -4330,15 +4323,11 @@ static void screen_line(int row, int coloff, int endcol,
unsigned max_off_to; unsigned max_off_to;
int col = 0; int col = 0;
int hl; int hl;
int force = FALSE; /* force update rest of the line */ bool redraw_this; // Does character need redraw?
int redraw_this /* bool: does character need redraw? */ bool redraw_next; // redraw_this for next character
; bool clear_next = false;
int redraw_next; /* redraw_this for next character */ int char_cells; // 1: normal char
int clear_next = FALSE; // 2: occupies two display cells
int char_cells; /* 1: normal char */
/* 2: occupies two display cells */
# define CHAR_CELLS char_cells
int start_dirty = -1, end_dirty = 0; int start_dirty = -1, end_dirty = 0;
/* Check for illegal row and col, just in case. */ /* Check for illegal row and col, just in case. */
@@ -4383,15 +4372,14 @@ static void screen_line(int row, int coloff, int endcol,
redraw_next = char_needs_redraw(off_from, off_to, endcol - col); redraw_next = char_needs_redraw(off_from, off_to, endcol - col);
while (col < endcol) { while (col < endcol) {
if (has_mbyte && (col + 1 < endcol)) char_cells = 1;
char_cells = (*mb_off2cells)(off_from, max_off_from); if (col + 1 < endcol) {
else char_cells = utf_off2cells(off_from, max_off_from);
char_cells = 1; }
redraw_this = redraw_next; redraw_this = redraw_next;
redraw_next = force || char_needs_redraw(off_from + CHAR_CELLS, redraw_next = char_needs_redraw(off_from + char_cells,
off_to + CHAR_CELLS, endcol - col - CHAR_CELLS); off_to + char_cells,
endcol - col - char_cells);
if (redraw_this) { if (redraw_this) {
if (start_dirty == -1) { if (start_dirty == -1) {
@@ -4403,12 +4391,12 @@ static void screen_line(int row, int coloff, int endcol,
// the right halve of the old character. // the right halve of the old character.
// Also required when writing the right halve of a double-width // Also required when writing the right halve of a double-width
// char over the left halve of an existing one // char over the left halve of an existing one
if (has_mbyte && col + char_cells == endcol if (col + char_cells == endcol
&& ((char_cells == 1 && ((char_cells == 1
&& (*mb_off2cells)(off_to, max_off_to) > 1) && utf_off2cells(off_to, max_off_to) > 1)
|| (char_cells == 2 || (char_cells == 2
&& (*mb_off2cells)(off_to, max_off_to) == 1 && utf_off2cells(off_to, max_off_to) == 1
&& (*mb_off2cells)(off_to + 1, max_off_to) > 1))) { && utf_off2cells(off_to + 1, max_off_to) > 1))) {
clear_next = true; clear_next = true;
} }
@@ -4425,9 +4413,9 @@ static void screen_line(int row, int coloff, int endcol,
} }
} }
off_to += CHAR_CELLS; off_to += char_cells;
off_from += CHAR_CELLS; off_from += char_cells;
col += CHAR_CELLS; col += char_cells;
} }
if (clear_next) { if (clear_next) {
@@ -5396,15 +5384,15 @@ void screen_puts_len(char_u *text, int textlen, int row, int col, int attr)
// character with a one-cell character, need to clear the next // character with a one-cell character, need to clear the next
// cell. Also when overwriting the left halve of a two-cell char // cell. Also when overwriting the left halve of a two-cell char
// with the right halve of a two-cell char. Do this only once // with the right halve of a two-cell char. Do this only once
// (mb_off2cells() may return 2 on the right halve). // (utf8_off2cells() may return 2 on the right halve).
if (clear_next_cell) { if (clear_next_cell) {
clear_next_cell = false; clear_next_cell = false;
} else if ((len < 0 ? ptr[mbyte_blen] == NUL } else if ((len < 0 ? ptr[mbyte_blen] == NUL
: ptr + mbyte_blen >= text + len) : ptr + mbyte_blen >= text + len)
&& ((mbyte_cells == 1 && (*mb_off2cells)(off, max_off) > 1) && ((mbyte_cells == 1 && utf_off2cells(off, max_off) > 1)
|| (mbyte_cells == 2 || (mbyte_cells == 2
&& (*mb_off2cells)(off, max_off) == 1 && utf_off2cells(off, max_off) == 1
&& (*mb_off2cells)(off + 1, max_off) > 1))) { && utf_off2cells(off + 1, max_off) > 1))) {
clear_next_cell = true; clear_next_cell = true;
} }