Scope of SRFI 205 and a slightly more complex POSIX/ANSI terminal API Lassi Kortela (06 Aug 2020 12:03 UTC)
|
||
Re: Scope of SRFI 205 and a slightly more complex POSIX/ANSI terminal API
hga@xxxxxx
(06 Aug 2020 14:09 UTC)
|
||
Signal handling
Lassi Kortela
(06 Aug 2020 14:22 UTC)
|
||
Re: Signal handling
Marc Nieper-Wißkirchen
(06 Aug 2020 14:32 UTC)
|
||
Re: Signal handling
John Cowan
(06 Aug 2020 15:13 UTC)
|
||
Re: Signal handling
Arthur A. Gleckler
(06 Aug 2020 15:28 UTC)
|
||
Re: Signal handling
John Cowan
(06 Aug 2020 17:38 UTC)
|
||
Re: Signal handling
Arthur A. Gleckler
(06 Aug 2020 18:19 UTC)
|
||
Re: Signal handling
Lassi Kortela
(06 Aug 2020 18:35 UTC)
|
||
Re: Signal handling
Amirouche Boubekki
(06 Aug 2020 21:18 UTC)
|
||
Re: Signal handling
Amirouche Boubekki
(06 Aug 2020 21:23 UTC)
|
||
Re: Signal handling
John Cowan
(07 Aug 2020 02:56 UTC)
|
||
Re: Signal handling
Marc Nieper-Wißkirchen
(06 Aug 2020 15:32 UTC)
|
||
Re: Signal handling
John Cowan
(06 Aug 2020 16:38 UTC)
|
||
Re: Signal handling
hga@xxxxxx
(06 Aug 2020 14:33 UTC)
|
||
Signal handling with terminals
Lassi Kortela
(06 Aug 2020 14:54 UTC)
|
||
Re: Scope of SRFI 205 and a slightly more complex POSIX/ANSI terminal API
Lassi Kortela
(06 Aug 2020 14:44 UTC)
|
||
Re: Scope of SRFI 205 and a slightly more complex POSIX/ANSI terminal API
John Cowan
(06 Aug 2020 14:48 UTC)
|
||
Re: Scope of SRFI 205 and a slightly more complex POSIX/ANSI terminal API
Lassi Kortela
(06 Aug 2020 15:20 UTC)
|
||
(missing)
|
||
UI event datatypes
Lassi Kortela
(06 Aug 2020 16:08 UTC)
|
||
Re: UI event datatypes
John Cowan
(06 Aug 2020 16:34 UTC)
|
||
Re: UI event datatypes
Lassi Kortela
(06 Aug 2020 16:57 UTC)
|
||
Re: UI event datatypes
John Cowan
(07 Aug 2020 21:30 UTC)
|
||
Re: UI event datatypes
Lassi Kortela
(08 Aug 2020 18:36 UTC)
|
||
Re: UI event datatypes
John Cowan
(09 Aug 2020 00:31 UTC)
|
What's the scope of SRFI 205? The current first draft is nice and simple, and probably good as it is. I designed a minimal API for dealing with ANSI terminal on Unix-like systems a year or two ago. It's designed to read and write things from and to the terminal, respecting things like ANSI control code delimiters and timeouts, but leaves the composing of escape sequences and interpretation of key codes completely up to the caller. Below is roughly what it looks like. Let me know if you want something at this level of abstraction in this SRFI, or if you want to keep it simpler. (terminal-get-size) => (width . height) struct winsize ws; ioctl(fd, TIOCGWINSZ, &ws); return cons(ws.ws_col, ws.ws_row); (terminal-write-char char) (terminal-write-string string) (terminal-write-escape string) write-char and write-string are like those R7RS procedures, but make sure you don't accidentally write ASCII control characters (other than #\newline) as those may garble the terminal. write-escape writes the #x1B escape character followed by the escape string you gave. Since escape strings don't need to feature control characters either, we can use terminal-write-string internally to write them. terminal-read-event [esc-timeout] Read the next "event" from the terminal, blocking as long as needed to get one. Event types: 'control <char> where <char> is one of the graphic representations of an ASCII control char: @ A B C ... X Y Z [ \ ] ^ _ 'escape <string> where <string> is the stuff after #x1B. there are fairly clear rules for where to cut out the part after the #x1B so the library can return one and only one complete escape code to the caller. 'resize the terminal was resized (SIGWINCH occurred), call (terminal-get-size) to find out its size. 'char <char> where <char> is a Unicode codepoint. There is no standard way to handle the Esc key. In general, any keypress Meta+X (on PC keyboards, Alt+X) is indistinguishable from pressing Esc, releasing it, and then separately pressing X. Both normally send the ASCII escape character (#x1B IIRC) followed by the character X. (There used to be a hack where pressing Meta/Alt set the high bit or "meta bit" in an ASCII character so you could disginguish Meta+X from Esc X but the high bit messes with Unicode whose encodings also need to use the high bit.) Different ways to treat Esc: * Vi-like. Esc is always a standalone Esc, never Meta+something. * Emacs-like. Esc is always Meta+something, never standalone. When we get an Esc, wait as long as needed to get the something key. * Hybrid. When we get an Esc, wait N milliseconds for another key. If another key X comes, assume Meta+X was pressed. If not, assume a standalone Esc was pressed. These can be covered by giving an `esc-timeout` argument to read-event: 0 return immediately with a standalone esc, like vi >0 wait N milliseconds for another key #f wait forever for another key, like emacs SIGWINCH handler For a nice experience, terminal apps need to respond to resize. For that, we need a SIGWINCH Unix signal handler. As said many times on these lists, Signal handlers are notoriously unfun and liable to mess with anything they touch. It might be best to provide a (terminal-announce-resize) procedure that a user-installed signal handler can call to tell the terminal library to pass the `read-event` caller a resize event. Otherwise we need some kind of portable way to install a SIGWINCH handler, which may be difficult.