Revert "src/screen: Stop falling back to wchar_t"

This was, under some circumstances, apparently off by one.

If a suggestion was really long, like

```fish
infocmp | string split , | string trim | string match -re . | while read -d = -l key val; test -z "$val"; and continue; string match -q '*%*' -- $val; and continue; test (string replace -ra '\e([\[\]]|\(B).*[\comJKsu]' '' -- a(tput $key)b) = ab; or echo $key $val; end > xterm
```

(I'm assuming longer than $COLUMNS), it would staircase like with a wrong wcwidth.

This reverts commit 15a5c0ed5f.
This commit is contained in:
Fabian Homborg 2019-05-21 23:34:05 +02:00
parent 11209b7553
commit 6d20b3984a

View file

@ -823,15 +823,19 @@ static size_t truncation_offset_for_width(const std::vector<size_t> &width_by_of
} }
static screen_layout_t compute_layout(screen_t *s, size_t screen_width, static screen_layout_t compute_layout(screen_t *s, size_t screen_width,
wcstring left_prompt, const wcstring &left_prompt_str,
wcstring right_prompt, const wcstring &commandline, const wcstring &right_prompt_str, const wcstring &commandline,
wcstring autosuggestion) { const wcstring &autosuggestion_str) {
UNUSED(s); UNUSED(s);
screen_layout_t result = {}; screen_layout_t result = {};
// Start by ensuring that the prompts themselves can fit. // Start by ensuring that the prompts themselves can fit.
prompt_layout_t left_prompt_layout = calc_prompt_layout(left_prompt, cached_layouts); const wchar_t *left_prompt = left_prompt_str.c_str();
prompt_layout_t right_prompt_layout = calc_prompt_layout(right_prompt, cached_layouts); const wchar_t *right_prompt = right_prompt_str.c_str();
const wchar_t *autosuggestion = autosuggestion_str.c_str();
prompt_layout_t left_prompt_layout = calc_prompt_layout(left_prompt_str, cached_layouts);
prompt_layout_t right_prompt_layout = calc_prompt_layout(right_prompt_str, cached_layouts);
size_t left_prompt_width = left_prompt_layout.last_line_width; size_t left_prompt_width = left_prompt_layout.last_line_width;
size_t right_prompt_width = right_prompt_layout.last_line_width; size_t right_prompt_width = right_prompt_layout.last_line_width;
@ -878,7 +882,7 @@ static screen_layout_t compute_layout(screen_t *s, size_t screen_width,
if (multiline) { if (multiline) {
autosuggestion = L""; autosuggestion = L"";
} else { } else {
autosuggest_truncated_widths.reserve(1 + autosuggestion.size()); autosuggest_truncated_widths.reserve(1 + autosuggestion_str.size());
for (size_t i = 0; autosuggestion[i] != L'\0'; i++) { for (size_t i = 0; autosuggestion[i] != L'\0'; i++) {
autosuggest_truncated_widths.push_back(autosuggest_total_width); autosuggest_truncated_widths.push_back(autosuggest_total_width);
autosuggest_total_width += fish_wcwidth_min_0(autosuggestion[i]); autosuggest_total_width += fish_wcwidth_min_0(autosuggestion[i]);
@ -909,10 +913,10 @@ static screen_layout_t compute_layout(screen_t *s, size_t screen_width,
calculated_width = left_prompt_width + right_prompt_width + first_command_line_width + calculated_width = left_prompt_width + right_prompt_width + first_command_line_width +
autosuggest_total_width; autosuggest_total_width;
if (calculated_width < screen_width) { if (calculated_width < screen_width) {
result.left_prompt = std::move(left_prompt); result.left_prompt = left_prompt;
result.left_prompt_space = left_prompt_width; result.left_prompt_space = left_prompt_width;
result.right_prompt = std::move(right_prompt); result.right_prompt = right_prompt;
result.autosuggestion = std::move(autosuggestion); result.autosuggestion = autosuggestion;
done = true; done = true;
} }
} }
@ -922,9 +926,9 @@ static screen_layout_t compute_layout(screen_t *s, size_t screen_width,
if (!done) { if (!done) {
calculated_width = left_prompt_width + right_prompt_width + first_command_line_width; calculated_width = left_prompt_width + right_prompt_width + first_command_line_width;
if (calculated_width < screen_width) { if (calculated_width < screen_width) {
result.left_prompt = std::move(left_prompt); result.left_prompt = left_prompt;
result.left_prompt_space = left_prompt_width; result.left_prompt_space = left_prompt_width;
result.right_prompt = std::move(right_prompt); result.right_prompt = right_prompt;
// Need at least two characters to show an autosuggestion. // Need at least two characters to show an autosuggestion.
size_t available_autosuggest_space = size_t available_autosuggest_space =
@ -943,7 +947,7 @@ static screen_layout_t compute_layout(screen_t *s, size_t screen_width,
if (!done) { if (!done) {
calculated_width = left_prompt_width + first_command_line_width; calculated_width = left_prompt_width + first_command_line_width;
if (calculated_width < screen_width) { if (calculated_width < screen_width) {
result.left_prompt = std::move(left_prompt); result.left_prompt = left_prompt;
result.left_prompt_space = left_prompt_width; result.left_prompt_space = left_prompt_width;
done = true; done = true;
} }
@ -951,7 +955,7 @@ static screen_layout_t compute_layout(screen_t *s, size_t screen_width,
// Case 4 // Case 4
if (!done) { if (!done) {
result.left_prompt = std::move(left_prompt); result.left_prompt = left_prompt;
result.left_prompt_space = left_prompt_width; result.left_prompt_space = left_prompt_width;
// See remark about for why we can't use the right prompt here result.right_prompt = // See remark about for why we can't use the right prompt here result.right_prompt =
// right_prompt. If the command wraps, and the prompt is not short, place the command on its // right_prompt. If the command wraps, and the prompt is not short, place the command on its