# std: Better handling of line-wrapping in Progress · gitcafe/zig

[View on GitCafe](https://git.cafe/gitcafe/zig/commit/4fc2e92876d8aafd087a5f0bdb6ea7a54f195704)

Repository: [gitcafe/zig](https://git.cafe/gitcafe/zig)

Visibility: public

Requested revision: 4fc2e92876d8aafd087a5f0bdb6ea7a54f195704

Requested commit: 4fc2e92876d8aafd087a5f0bdb6ea7a54f195704

Commit: 4fc2e92876d8aafd087a5f0bdb6ea7a54f195704

Tree: 7eb601c9e37655605989f757d30291d0b8c58755

Author: LemonBoy

Committer: LemonBoy

## Message

```
std: Better handling of line-wrapping in Progress

In order to update the printed progress string the code tried to move
the cursor N cells to the left, where N is the number of written bytes,
and then clear the remaining part of the line.
This strategy has two main issues:
 - Is only valid if the number of characters is equal to the number of
   written bytes,
 - Is only valid if the line doesn't get too long.

The second point is the main motivation for this change, when the line
becomes too long the terminal wraps it to a new physical line. This
means that moving the cursor to the left won't be enough anymore as once
the left border is reached it cannot move anymore.

The wrapped line is still stored by the terminal as a single line,
despite now taking more than a single one when displayed. If you try to
resize the terminal you'll notice how the contents are reflowed and are
essentially illegible.

Querying the cursor position on non-Windows systems (plot twist,
Microsoft suggests using VT escape sequences on newer systems) is
extremely cumbersome so let's do something different.

Before printing anything let's save the cursor position and clear the
screen below the cursor, this way we ensure there's absolutely no trace
of stale data on screen, and after the message is printed we simply
restore it.

```

## Parents

- [0447a2c041a4be843251396e668e074186aa49a2](https://git.cafe/gitcafe/zig/commit/0447a2c041a4be843251396e668e074186aa49a2?format=markdown)

[Source at this commit](https://git.cafe/gitcafe/zig/tree/4fc2e92876d8aafd087a5f0bdb6ea7a54f195704?format=markdown)
