diff options
| author | Federico Igne <undyamon@disroot.org> | 2024-01-11 19:31:31 +0100 |
|---|---|---|
| committer | Federico Igne <undyamon@disroot.org> | 2024-01-11 19:31:31 +0100 |
| commit | 055c743c55bde27f4475d3434c26d8383c0c3ea1 (patch) | |
| tree | aabf2173a9995f5795da86d5676181b62fee0e9e /lib/terminal.mli | |
| parent | 416c56656af65d656f637dc8c8fdb62d0ba03e29 (diff) | |
| download | sandy-055c743c55bde27f4475d3434c26d8383c0c3ea1.tar.gz sandy-055c743c55bde27f4475d3434c26d8383c0c3ea1.zip | |
bulk: add PoC of vim-like modular editor
Diffstat (limited to 'lib/terminal.mli')
| -rw-r--r-- | lib/terminal.mli | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/lib/terminal.mli b/lib/terminal.mli new file mode 100644 index 0000000..0fd11ed --- /dev/null +++ b/lib/terminal.mli | |||
| @@ -0,0 +1,67 @@ | |||
| 1 | (** A module to simplify communication with the underlying terminal | ||
| 2 | emulator. *) | ||
| 3 | |||
| 4 | open Base | ||
| 5 | open Unix | ||
| 6 | |||
| 7 | type terminal_size = int * int | ||
| 8 | (** Size of the terminal window. *) | ||
| 9 | |||
| 10 | type state = { | ||
| 11 | tio : terminal_io; (** Status flags for the terminal window *) | ||
| 12 | size : terminal_size; (** Size of the terminal window *) | ||
| 13 | } | ||
| 14 | (** Global state of the terminal window. *) | ||
| 15 | |||
| 16 | val get_char : unit -> char option | ||
| 17 | (** Non-blocking request for a keypress. | ||
| 18 | Use {!val:Terminal.char_stream} for an infinite sequence of input | ||
| 19 | bytes. | ||
| 20 | |||
| 21 | @return A [char] if a key was pressed, nothing otherwise. *) | ||
| 22 | |||
| 23 | val char_stream : char option Sequence.t | ||
| 24 | (** The infinite stream of input bytes from stdin. | ||
| 25 | Returns [None] if no key was pressed; this is to be able to | ||
| 26 | interpret the absense of a keypress as an action. *) | ||
| 27 | |||
| 28 | val write_seq : char Sequence.t -> unit | ||
| 29 | (** Write a sequence of strings to standard output. | ||
| 30 | |||
| 31 | @param seq The sequence of strings to output. *) | ||
| 32 | |||
| 33 | val restore_screen : unit -> unit | ||
| 34 | (** Clear screen and show cursor. Meant to be called on exit. *) | ||
| 35 | |||
| 36 | val redraw : char Sequence.t Sequence.t -> int * int -> unit | ||
| 37 | (** Redraw the screen, using the provided sequence of lines. | ||
| 38 | |||
| 39 | @param seq A sequence of lines. | ||
| 40 | @param cur Cursor position. *) | ||
| 41 | |||
| 42 | val get_state : unit -> state | ||
| 43 | (** Get current state for the terminal window *) | ||
| 44 | |||
| 45 | val size : unit -> int * int | ||
| 46 | (** Compute the current size of the terminal. | ||
| 47 | |||
| 48 | This is done by moving the cursor to the far bottom right position | ||
| 49 | and querying for the cursor position using the appropriate escape | ||
| 50 | sequences. | ||
| 51 | |||
| 52 | @return size of the terminal window in terms of character rows and columns. *) | ||
| 53 | |||
| 54 | val enable_raw_mode : terminal_io -> unit -> unit | ||
| 55 | (** Turn on raw mode by overriding the correct terminal flags. | ||
| 56 | This is done according to [man 3 termios]. | ||
| 57 | |||
| 58 | @param tio The current status of the terminal for [stdin]. *) | ||
| 59 | |||
| 60 | val restore_status : terminal_io -> unit -> unit | ||
| 61 | (** Override the terminal status. | ||
| 62 | |||
| 63 | @param tio The new terminal status for [stdin]. *) | ||
| 64 | |||
| 65 | val init : unit -> state | ||
| 66 | (** Turns on raw mode and makes sure to restore the previous terminal | ||
| 67 | status on exit. *) | ||
