|
|
349eff |
diff --git a/button.c b/button.c
|
|
|
349eff |
index ac1f742..4e8554d 100644
|
|
|
349eff |
--- a/button.c
|
|
|
349eff |
+++ b/button.c
|
|
|
349eff |
@@ -3802,6 +3802,7 @@ SaltTextAway(XtermWidget xw,
|
|
|
349eff |
TScreen *screen = TScreenOf(xw);
|
|
|
349eff |
int i, j = 0;
|
|
|
349eff |
int eol;
|
|
|
349eff |
+ size_t have = 0;
|
|
|
349eff |
Char *line;
|
|
|
349eff |
Char *lp;
|
|
|
349eff |
CELL first = *cellc;
|
|
|
349eff |
@@ -3827,7 +3828,11 @@ SaltTextAway(XtermWidget xw,
|
|
|
349eff |
|
|
|
349eff |
/* UTF-8 may require more space */
|
|
|
349eff |
if_OPT_WIDE_CHARS(screen, {
|
|
|
349eff |
- j *= 4;
|
|
|
349eff |
+ if (j > 0) {
|
|
|
349eff |
+ if (screen->max_combining > 0)
|
|
|
349eff |
+ j += screen->max_combining;
|
|
|
349eff |
+ j *= 6;
|
|
|
349eff |
+ }
|
|
|
349eff |
});
|
|
|
349eff |
|
|
|
349eff |
/* now get some memory to save it in */
|
|
|
349eff |
@@ -3864,10 +3869,27 @@ SaltTextAway(XtermWidget xw,
|
|
|
349eff |
}
|
|
|
349eff |
*lp = '\0'; /* make sure we have end marked */
|
|
|
349eff |
|
|
|
349eff |
- TRACE(("Salted TEXT:%d:%s\n", (int) (lp - line),
|
|
|
349eff |
- visibleChars(line, (unsigned) (lp - line))));
|
|
|
349eff |
+ have = (size_t) (lp - line);
|
|
|
349eff |
+ /*
|
|
|
349eff |
+ * Scanning the buffer twice is unnecessary. Discard unwanted memory if
|
|
|
349eff |
+ * the estimate is too-far off.
|
|
|
349eff |
+ */
|
|
|
349eff |
+ if ((have * 2) < (size_t) j) {
|
|
|
349eff |
+ Char *next;
|
|
|
349eff |
+ screen->selection_size = have + 1;
|
|
|
349eff |
+ next = realloc(line, screen->selection_size);
|
|
|
349eff |
+ if (next == NULL) {
|
|
|
349eff |
+ free(line);
|
|
|
349eff |
+ screen->selection_length = 0;
|
|
|
349eff |
+ screen->selection_size = 0;
|
|
|
349eff |
+ }
|
|
|
349eff |
+ screen->selection_data = next;
|
|
|
349eff |
+ }
|
|
|
349eff |
+
|
|
|
349eff |
+ screen->selection_length = have;
|
|
|
349eff |
|
|
|
349eff |
- screen->selection_length = (unsigned long) (lp - line);
|
|
|
349eff |
+ TRACE(("Salted TEXT:%u:%s\n", (unsigned) have,
|
|
|
349eff |
+ visibleChars(screen->selection_data, (unsigned) have)));
|
|
|
349eff |
}
|
|
|
349eff |
|
|
|
349eff |
#if OPT_PASTE64
|