Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
621 views
in Technique[技术] by (71.8m points)

language agnostic - How do I determine size of ANSI terminal?

Standard input and output are connected to a terminal that implements ANSI escape sequences, but is of unknown dimensions.

I need to know how big the terminal so to facilitate drawing a full-screen text UI on it. How can I get the size?

The correct size is not loaded into environment variables. I cannot use TIOCGETS; the the call would return success but the values are not correct -- the kernel doesn't know the size either.

There are lots and lots of answers searching stackoverflow, but they all depend on the OS providing the answer one way or anther; but this time that is not true.

The best clue I can find is the DSR command which returns the current cursor position; but there's no move to bottom/right command.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

The resize program does this by moving the cursor to a very large column and row; the terminal moves as far as it can, e.g.,

CUP 999 999

Then resize asks where the cursor is:

DSR 6

The terminal replies with the actual cursor position (i.e., the cursor position report CPR), from which resize knows the terminal's size: the cursor is on the lower-right corner.

That's all done using standard (ECMA-48 / VT100) escape sequences. In XTerm Control Sequences (which should apply to your "ANSI" terminal)

CSI Ps n  Device Status Report (DSR).
            Ps = 6  -> Report Cursor Position (CPR) [row;column].
          Result is CSI r ; c R

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...