Reduce multi-line textarea a bit more. When redrawing only one line, don't redraw unchanged text at the start of the line.

This commit is contained in:
Michael Drake 2013-03-26 14:07:08 +00:00
parent 0bb9543293
commit 9a73da6347
1 changed files with 23 additions and 1 deletions

View File

@ -824,9 +824,11 @@ static bool textarea_reflow_singleline(struct textarea *ta, size_t b_off,
ta->password.utf8_len = ta->text.utf8_len;
}
/* Measure new width */
nsfont.font_width(&ta->fstyle, ta->show->data,
ta->show->len - 1, &x);
/* Get width of retained text */
if (b_off != ta->lines[0].b_length) {
nsfont.font_width(&ta->fstyle, ta->show->data,
b_off, &retained_width);
@ -859,6 +861,7 @@ static bool textarea_reflow_singleline(struct textarea *ta, size_t b_off,
*
* \param ta Textarea to reflow
* \param b_start 0-based byte offset in ta->text to start of modification
* \param b_length Byte length of change in textarea text
* \return true on success false otherwise
*/
static bool textarea_reflow_multiline(struct textarea *ta,
@ -1115,12 +1118,31 @@ static bool textarea_reflow_multiline(struct textarea *ta,
if ((skip_line || start == 0) &&
ta->lines[start].b_start + ta->lines[start].b_length >=
b_start + b_length) {
text = ta->text.data + ta->lines[start].b_start +
size_t b_line_end = ta->lines[start].b_start +
ta->lines[start].b_length;
text = ta->text.data + b_line_end;
if (*text == '\0' || *text == '\n') {
r->y1 = min(r->y1, (signed)
(ta->line_height * (start + 1) +
ta->text_y_offset - ta->scroll_y));
if (b_start > ta->lines[start].b_start &&
b_start <= b_line_end) {
/* Remove unchanged text at start of line
* from redraw region */
int retained_width = 0;
size_t retain_end = b_start -
ta->lines[start].b_start;
text = ta->text.data + ta->lines[start].b_start;
nsfont.font_width(&ta->fstyle, text,
retain_end, &retained_width);
r->x0 = max(r->x0,
retained_width +
ta->border_width +
ta->pad_left -
ta->scroll_x - 1);
}
}
}