mirror of
https://github.com/rkd77/elinks.git
synced 2025-02-02 15:09:23 -05:00
Use new macro UCS_ORPHAN_CELL for broken double-cell characters.
UCS_ORPHAN_CELL is currently defined as U+0020 SPACE, which was already used before this macro, so the behaviour does not change, but the code seems clearer now. I searched for ' ' and 32 and 0x20 and \x20, and replaced with UCS_ORPHAN_CELL wherever UCS_NO_CHAR was involved. However, some BFU widgets first draw spaces and then overwrite with text; those will require a more complex fix if UCS_ORPHAN_CELL is ever changed to some other character.
This commit is contained in:
parent
89fd7efa3a
commit
8b8cd57941
@ -483,7 +483,7 @@ utf8:
|
|||||||
UCS_NO_CHAR, 0, hk_color);
|
UCS_NO_CHAR, 0, hk_color);
|
||||||
} else {
|
} else {
|
||||||
draw_char(term, xbase + x - 1, y,
|
draw_char(term, xbase + x - 1, y,
|
||||||
' ', 0, hk_color);
|
UCS_ORPHAN_CELL, 0, hk_color);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
#ifdef CONFIG_DEBUG
|
#ifdef CONFIG_DEBUG
|
||||||
@ -508,7 +508,7 @@ utf8:
|
|||||||
y, UCS_NO_CHAR, 0, color);
|
y, UCS_NO_CHAR, 0, color);
|
||||||
} else {
|
} else {
|
||||||
draw_char(term, xbase + x - !!hk_state,
|
draw_char(term, xbase + x - !!hk_state,
|
||||||
y, ' ', 0, color);
|
y, UCS_ORPHAN_CELL, 0, color);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
draw_char(term, xbase + x - !!hk_state,
|
draw_char(term, xbase + x - !!hk_state,
|
||||||
@ -1171,10 +1171,10 @@ display_mainmenu(struct terminal *term, struct menu *menu)
|
|||||||
/* Is second cell of double-width char on the place where
|
/* Is second cell of double-width char on the place where
|
||||||
* first char of the R_MAINMENU_SPACE will be displayed? */
|
* first char of the R_MAINMENU_SPACE will be displayed? */
|
||||||
if (schar->data == UCS_NO_CHAR) {
|
if (schar->data == UCS_NO_CHAR) {
|
||||||
/* Replace double-width char with ' '. */
|
/* Replace double-width char with UCS_ORPHAN_CELL. */
|
||||||
schar++;
|
schar++;
|
||||||
draw_char_data(term, term->width - R_MAINMENU_SPACE - 1,
|
draw_char_data(term, term->width - R_MAINMENU_SPACE - 1,
|
||||||
0, ' ');
|
0, UCS_ORPHAN_CELL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -16,6 +16,17 @@ typedef uint32_t unicode_val_T;
|
|||||||
* for the second cell of a double-cell character. */
|
* for the second cell of a double-cell character. */
|
||||||
#define UCS_NO_CHAR ((unicode_val_T) 0xFFFFFFFD)
|
#define UCS_NO_CHAR ((unicode_val_T) 0xFFFFFFFD)
|
||||||
|
|
||||||
|
/* If ELinks should display a double-cell character but there is only
|
||||||
|
* one cell available, it displays this character instead. This must
|
||||||
|
* be a single-cell character but need not be unique. Possible values
|
||||||
|
* might be U+0020 SPACE or U+303F IDEOGRAPHIC HALF FILL SPACE.
|
||||||
|
*
|
||||||
|
* Some BFU widgets (at least input fields and list boxes) currently
|
||||||
|
* ignore this setting and use U+0020 instead. (They first draw spaces
|
||||||
|
* and then overwrite with text; look for utf8_cells2bytes calls.)
|
||||||
|
* We should fix that if we ever change the value. */
|
||||||
|
#define UCS_ORPHAN_CELL ((unicode_val_T) 0x20)
|
||||||
|
|
||||||
/* replacement character. See u2cp(). */
|
/* replacement character. See u2cp(). */
|
||||||
#define NBSP_CHAR ((unsigned char) 1)
|
#define NBSP_CHAR ((unsigned char) 1)
|
||||||
#define NBSP_CHAR_STRING "\001"
|
#define NBSP_CHAR_STRING "\001"
|
||||||
|
@ -160,7 +160,7 @@ draw_line(struct terminal *term, int x, int y, int l, struct screen_char *line)
|
|||||||
|
|
||||||
sc = line;
|
sc = line;
|
||||||
data_save = sc->data;
|
data_save = sc->data;
|
||||||
sc->data = ' ';
|
sc->data = UCS_ORPHAN_CELL;
|
||||||
copy_screen_chars(screen_char, line, 1);
|
copy_screen_chars(screen_char, line, 1);
|
||||||
sc->data = data_save;
|
sc->data = data_save;
|
||||||
size--;
|
size--;
|
||||||
@ -169,13 +169,13 @@ draw_line(struct terminal *term, int x, int y, int l, struct screen_char *line)
|
|||||||
|
|
||||||
}
|
}
|
||||||
/* Instead of displaying double-width character at last column
|
/* Instead of displaying double-width character at last column
|
||||||
* display only space. */
|
* display only UCS_ORPHAN_CELL. */
|
||||||
if (size - 1 > 0 && unicode_to_cell(line[size - 1].data) == 2) {
|
if (size - 1 > 0 && unicode_to_cell(line[size - 1].data) == 2) {
|
||||||
unicode_val_T data_save;
|
unicode_val_T data_save;
|
||||||
|
|
||||||
sc = &line[size - 1];
|
sc = &line[size - 1];
|
||||||
data_save = sc->data;
|
data_save = sc->data;
|
||||||
sc->data = ' ';
|
sc->data = UCS_ORPHAN_CELL;
|
||||||
copy_screen_chars(screen_char, line, size);
|
copy_screen_chars(screen_char, line, size);
|
||||||
sc->data = data_save;
|
sc->data = data_save;
|
||||||
} else {
|
} else {
|
||||||
@ -256,7 +256,7 @@ draw_border(struct terminal *term, struct box *box,
|
|||||||
|
|
||||||
#ifdef CONFIG_UTF8
|
#ifdef CONFIG_UTF8
|
||||||
/* Checks cells left and right to the box for broken double-width chars.
|
/* Checks cells left and right to the box for broken double-width chars.
|
||||||
* Replace it with ' '.
|
* Replace it with UCS_ORPHAN_CELL.
|
||||||
* 1+---+3
|
* 1+---+3
|
||||||
* 1|box|##4
|
* 1|box|##4
|
||||||
* 1| |##4
|
* 1| |##4
|
||||||
@ -284,7 +284,7 @@ fix_dwchar_around_box(struct terminal *term, struct box *box, int border,
|
|||||||
schar = get_char(term, x, y);
|
schar = get_char(term, x, y);
|
||||||
for (;height--; schar += term->width)
|
for (;height--; schar += term->width)
|
||||||
if (unicode_to_cell(schar->data) == 2)
|
if (unicode_to_cell(schar->data) == 2)
|
||||||
schar->data = ' ';
|
schar->data = UCS_ORPHAN_CELL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 2 */
|
/* 2 */
|
||||||
@ -296,7 +296,7 @@ fix_dwchar_around_box(struct terminal *term, struct box *box, int border,
|
|||||||
schar = get_char(term, x, y);
|
schar = get_char(term, x, y);
|
||||||
for (;height--; schar += term->width)
|
for (;height--; schar += term->width)
|
||||||
if (unicode_to_cell(schar->data) == 2)
|
if (unicode_to_cell(schar->data) == 2)
|
||||||
schar->data = ' ';
|
schar->data = UCS_ORPHAN_CELL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 3 */
|
/* 3 */
|
||||||
@ -308,7 +308,7 @@ fix_dwchar_around_box(struct terminal *term, struct box *box, int border,
|
|||||||
schar = get_char(term, x, y);
|
schar = get_char(term, x, y);
|
||||||
for (;height--; schar += term->width)
|
for (;height--; schar += term->width)
|
||||||
if (schar->data == UCS_NO_CHAR)
|
if (schar->data == UCS_NO_CHAR)
|
||||||
schar->data = ' ';
|
schar->data = UCS_ORPHAN_CELL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 4 */
|
/* 4 */
|
||||||
@ -320,7 +320,7 @@ fix_dwchar_around_box(struct terminal *term, struct box *box, int border,
|
|||||||
schar = get_char(term, x, y);
|
schar = get_char(term, x, y);
|
||||||
for (;height--; schar += term->width)
|
for (;height--; schar += term->width)
|
||||||
if (schar->data == UCS_NO_CHAR)
|
if (schar->data == UCS_NO_CHAR)
|
||||||
schar->data = ' ';
|
schar->data = UCS_ORPHAN_CELL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -437,7 +437,7 @@ draw_text_utf8(struct terminal *term, int x, int y,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (start->data == UCS_NO_CHAR && x - 1 > 0)
|
if (start->data == UCS_NO_CHAR && x - 1 > 0)
|
||||||
draw_char_data(term, x - 1, y, ' ');
|
draw_char_data(term, x - 1, y, UCS_ORPHAN_CELL);
|
||||||
|
|
||||||
pos = start;
|
pos = start;
|
||||||
|
|
||||||
@ -451,7 +451,7 @@ draw_text_utf8(struct terminal *term, int x, int y,
|
|||||||
pos->data = UCS_NO_CHAR;
|
pos->data = UCS_NO_CHAR;
|
||||||
pos->attr = 0;
|
pos->attr = 0;
|
||||||
} else {
|
} else {
|
||||||
pos->data = (unicode_val_T)' ';
|
pos->data = UCS_ORPHAN_CELL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
pos->data = data;
|
pos->data = data;
|
||||||
@ -474,7 +474,7 @@ draw_text_utf8(struct terminal *term, int x, int y,
|
|||||||
pos->data = UCS_NO_CHAR;
|
pos->data = UCS_NO_CHAR;
|
||||||
pos->attr = 0;
|
pos->attr = 0;
|
||||||
} else {
|
} else {
|
||||||
pos->data = (unicode_val_T)' ';
|
pos->data = UCS_ORPHAN_CELL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
pos->data = data;
|
pos->data = data;
|
||||||
|
@ -412,13 +412,14 @@ retry_after_scroll:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* The character does not fit completely.
|
/* The character does not fit completely.
|
||||||
* Write spaces to the cells that do fit. */
|
* Write UCS_ORPHAN_CELL to the cells that
|
||||||
|
* do fit. */
|
||||||
for (cell = 0; cell < cells; cell++) {
|
for (cell = 0; cell < cells; cell++) {
|
||||||
if (col_is_in_box(box, x + i + cell)
|
if (col_is_in_box(box, x + i + cell)
|
||||||
&& i + cell < fc->size)
|
&& i + cell < fc->size)
|
||||||
draw_char_data(term,
|
draw_char_data(term,
|
||||||
x + i + cell,
|
x + i + cell, y,
|
||||||
y, ' ');
|
UCS_ORPHAN_CELL);
|
||||||
}
|
}
|
||||||
|
|
||||||
drew_char:
|
drew_char:
|
||||||
@ -538,7 +539,7 @@ utf8_select:
|
|||||||
data = UCS_NO_CHAR;
|
data = UCS_NO_CHAR;
|
||||||
i++;
|
i++;
|
||||||
} else if (cell == 2) {
|
} else if (cell == 2) {
|
||||||
data = ' ';
|
data = UCS_ORPHAN_CELL;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
data = '_';
|
data = '_';
|
||||||
|
Loading…
x
Reference in New Issue
Block a user