1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-07-01 03:22:48 -05:00

lineedit: make both ^M and ^J terminate a line.

In protocols other than PROT_RAW, the new line editing system differed
from the old one in not considering ^M or ^J (typed using the actual
Ctrl key, so distinct from pressing Return) to mean "I've finished
editing this line, please send it". This commit reinstates that
behaviour.

It turned out that a third-party tool (namely PuTTY Connection Manager),
which automatically answers prompts for the user, was terminating them
by sending ^J in place of the Return key. We don't know why (and it's
now unmaintained), but it was. So this change should make that tool
start working again.

I exclude PROT_RAW above because in that protocol the line editing has
much weirder handling for ^M and ^J, which lineedit replicated
faithfully from the old code: either control character by itself is
treated literally (displaying as "^M" or "^J" in the terminal), but if
you type the two in sequence in that order, then the ^J deletes the ^M
from the edit buffer and enters the line, so that the sequence CR LF
acts as a newline overall. I haven't changed that behaviour here, but
I have added a regression test of it to test_lineedit.
This commit is contained in:
Simon Tatham
2024-12-15 19:09:34 +00:00
parent 1fc5f4afd1
commit 363debc7f0
2 changed files with 77 additions and 0 deletions

View File

@ -454,6 +454,24 @@ void lineedit_input(TermLineEditor *le, char ch, bool dedicated)
lineedit_complete_line(le);
return;
}
} else {
/* If we're not in LE_CRLF_NEWLINE mode, then ^J by
* itself acts as a full newline character */
lineedit_complete_line(le);
return;
}
case CTRL('M'):
if (le->flags & LE_CRLF_NEWLINE) {
/* In this mode, ^M is literal, and can combine with
* ^J (see case above). So do nothing, and fall
* through into the 'treat it literally' code, */
} else {
/* If we're not in LE_CRLF_NEWLINE mode, then ^M by
* itself acts as a full newline character */
lineedit_complete_line(le);
return;
}
}
}