mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-02-07 06:53:33 +00:00
109 lines
3.4 KiB
C
109 lines
3.4 KiB
C
|
#if 0
|
|||
|
/*─────────────────────────────────────────────────────────────────╗
|
|||
|
│ To the extent possible under law, Justine Tunney has waived │
|
|||
|
│ all copyright and related or neighboring rights to this file, │
|
|||
|
│ as it is written in the following disclaimers: │
|
|||
|
│ • http://unlicense.org/ │
|
|||
|
│ • http://creativecommons.org/publicdomain/zero/1.0/ │
|
|||
|
╚─────────────────────────────────────────────────────────────────*/
|
|||
|
#endif
|
|||
|
#include "dsp/tty/tty.h"
|
|||
|
#include "libc/calls/calls.h"
|
|||
|
#include "libc/calls/ioctl.h"
|
|||
|
#include "libc/calls/struct/sigaction.h"
|
|||
|
#include "libc/calls/termios.h"
|
|||
|
#include "libc/errno.h"
|
|||
|
#include "libc/fmt/fmt.h"
|
|||
|
#include "libc/log/check.h"
|
|||
|
#include "libc/log/log.h"
|
|||
|
#include "libc/runtime/gc.h"
|
|||
|
#include "libc/runtime/runtime.h"
|
|||
|
#include "libc/stdio/stdio.h"
|
|||
|
#include "libc/str/str.h"
|
|||
|
#include "libc/sysv/consts/exit.h"
|
|||
|
#include "libc/sysv/consts/fileno.h"
|
|||
|
#include "libc/sysv/consts/o.h"
|
|||
|
#include "libc/sysv/consts/sig.h"
|
|||
|
#include "libc/sysv/consts/termios.h"
|
|||
|
#include "libc/x/x.h"
|
|||
|
|
|||
|
/*
|
|||
|
"\e[c" → "\e[?1;2c"
|
|||
|
"\e[x" → "\e[2;1;1;112;112;1;0x"
|
|||
|
"\e[>c" → "\e[>83;40500;0c"
|
|||
|
"\e[6n" → "\e[52;1R"
|
|||
|
*/
|
|||
|
|
|||
|
#define CTRL(C) ((C) ^ 0b01000000)
|
|||
|
#define PROBE_VT100 "\e[c" /* e.g. "\e[?1;2c", "\e[>0c" */
|
|||
|
#define PROBE_SECONDARY "\e[>c" /* "\e[>83;40500;0c" (Screen v4.05.00) */
|
|||
|
#define PROBE_PARAMETERS "\e[x" /* e.g. "\e[2;1;1;112;112;1;0x" */
|
|||
|
#define PROBE_CURSOR_POSITION "\e[6n" /* e.g. "\e[𝑦;𝑥R" */
|
|||
|
#define PROBE_SUN_DTTERM_SIZE "\e[14t" /* e.g. "\e[𝑦;𝑥R" */
|
|||
|
|
|||
|
int fd_;
|
|||
|
jmp_buf jb_;
|
|||
|
ssize_t got_;
|
|||
|
uint8_t buf_[128];
|
|||
|
struct TtyIdent ti_;
|
|||
|
struct winsize wsize_;
|
|||
|
volatile bool resized_;
|
|||
|
|
|||
|
void OnResize(void) {
|
|||
|
resized_ = true;
|
|||
|
}
|
|||
|
void OnKilled(int sig) {
|
|||
|
longjmp(jb_, 128 + sig + 1);
|
|||
|
}
|
|||
|
|
|||
|
void getsome(void) {
|
|||
|
if ((got_ = read(fd_, buf_, sizeof(buf_))) == -1 && errno != EINTR) {
|
|||
|
printf("%s%s\r\n", "error: ", strerror(errno));
|
|||
|
longjmp(jb_, EXIT_FAILURE + 1);
|
|||
|
}
|
|||
|
if (got_ >= 0) {
|
|||
|
printf("%`'.*s\r\n", got_, buf_);
|
|||
|
if (got_ > 0 && buf_[0] == CTRL('C')) {
|
|||
|
longjmp(jb_, EXIT_SUCCESS + 1);
|
|||
|
}
|
|||
|
}
|
|||
|
if (resized_) {
|
|||
|
CHECK_NE(-1, getttysize(fd_, &wsize_));
|
|||
|
printf("SIGWINCH → %hu×%hu\r\n", wsize_.ws_row, wsize_.ws_col);
|
|||
|
resized_ = false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void probe(const char *s) {
|
|||
|
printf("%`'s → ", s);
|
|||
|
write(fd_, s, strlen(s));
|
|||
|
getsome();
|
|||
|
}
|
|||
|
|
|||
|
int main(int argc, char *argv[]) {
|
|||
|
int rc;
|
|||
|
char ttyname[64];
|
|||
|
struct termios old;
|
|||
|
CHECK_NE(-1, (fd_ = open("/dev/tty", O_RDWR)));
|
|||
|
CHECK_NE(-1, ttyconfig(fd_, ttysetrawmode, 0, &old));
|
|||
|
if (!(rc = setjmp(jb_))) {
|
|||
|
xsigaction(SIGTERM, OnKilled, 0, 0, NULL);
|
|||
|
xsigaction(SIGWINCH, OnResize, 0, 0, NULL);
|
|||
|
if (ttyident(&ti_, STDIN_FILENO, STDOUT_FILENO) != -1) {
|
|||
|
ttysendtitle(fd_, "justine was here", &ti_);
|
|||
|
fputs(ttydescribe(ttyname, sizeof(ttyname), &ti_), stdout);
|
|||
|
}
|
|||
|
fputs("\r\n", stdout);
|
|||
|
probe(PROBE_VT100);
|
|||
|
probe(PROBE_SECONDARY);
|
|||
|
probe(PROBE_PARAMETERS);
|
|||
|
probe(PROBE_CURSOR_POSITION);
|
|||
|
/* probe(PROBE_SUN_DTTERM_SIZE); */
|
|||
|
getsome();
|
|||
|
for (;;) getsome();
|
|||
|
}
|
|||
|
ttyrestore(fd_, &old);
|
|||
|
ttyidentclear(&ti_);
|
|||
|
return rc - 1;
|
|||
|
}
|