diff --git a/CHANGELOG.md b/CHANGELOG.md index c0ccf31b..198c8624 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,8 @@ * Trailing comments in `foot.ini` must now be preceded by a space or tab (https://codeberg.org/dnkl/foot/issues/270) * The scrollback search box no longer accepts non-printable characters. +* Non-formatting C0 control characters, `BS`, `HT` and `DEL` are now + stripped from pasted text. ### Deprecated diff --git a/selection.c b/selection.c index fa8ef7a5..110b24d3 100644 --- a/selection.c +++ b/selection.c @@ -1307,6 +1307,7 @@ fdm_receive(struct fdm *fdm, int fd, int events, void *data) * Call cb while at same time replace: * - \r\n -> \r * - \n -> \r + * - C0 -> (stript non-formatting C0 characters) * - \e -> (i.e. strip ESC) */ char *p = text; @@ -1322,6 +1323,7 @@ fdm_receive(struct fdm *fdm, int fd, int events, void *data) break; case '\r': + /* Convert \r\n -> \r */ if (i + 1 < left && p[i + 1] == '\n') { ctx->decoder(ctx, p, i + 1); @@ -1332,6 +1334,21 @@ fdm_receive(struct fdm *fdm, int fd, int events, void *data) } break; + /* C0 non-formatting control characters (\b \t \n \r excluded) */ + case '\x01': case '\x02': case '\x03': case '\x04': case '\x05': + case '\x06': case '\x07': case '\x0b': case '\x0c': case '\x0e': + case '\x0f': case '\x10': case '\x11': case '\x12': case '\x13': + case '\x14': case '\x15': case '\x16': case '\x17': case '\x18': + case '\x19': case '\x1a': case '\x1b': case '\x1c': case '\x1d': + case '\x1e': case '\x1f': + /* FALLTHROUGH */ + + /* Additional control characters stripped by default (but + * configurable) in XTerm: BS, HT, DEL */ + case '\b': case '\t': case '\x1f': + /* FALLTHROUGH */ + + /* ESC */ case '\x1b': ctx->decoder(ctx, p, i);