iterm.c - iomenu - interactive terminal-based selection menu Err bitreich.org 70 hgit clone git://bitreich.org/iomenu git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/iomenu URL:git://bitreich.org/iomenu git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/iomenu bitreich.org 70 1Log /scm/iomenu/log.gph bitreich.org 70 1Files /scm/iomenu/files.gph bitreich.org 70 1Refs /scm/iomenu/refs.gph bitreich.org 70 1Tags /scm/iomenu/tag bitreich.org 70 1README /scm/iomenu/file/README.gph bitreich.org 70 1LICENSE /scm/iomenu/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 iterm.c (1806B) Err bitreich.org 70 i--- Err bitreich.org 70 i 1 #include "term.h" Err bitreich.org 70 i 2 #include Err bitreich.org 70 i 3 #include Err bitreich.org 70 i 4 #include Err bitreich.org 70 i 5 #include Err bitreich.org 70 i 6 #include Err bitreich.org 70 i 7 #include Err bitreich.org 70 i 8 #include "compat.h" Err bitreich.org 70 i 9 #include "utf8.h" Err bitreich.org 70 i 10 Err bitreich.org 70 i 11 struct term term; Err bitreich.org 70 i 12 Err bitreich.org 70 i 13 static int Err bitreich.org 70 i 14 term_codepoint_width(uint32_t codepoint, int pos) Err bitreich.org 70 i 15 { Err bitreich.org 70 i 16 if (codepoint == '\t') Err bitreich.org 70 i 17 return 8 - pos % 8; Err bitreich.org 70 i 18 return wcwidth(codepoint); Err bitreich.org 70 i 19 } Err bitreich.org 70 i 20 Err bitreich.org 70 i 21 int Err bitreich.org 70 i 22 term_at_width(char const *s, int width, int pos) Err bitreich.org 70 i 23 { Err bitreich.org 70 i 24 char const *beg = s; Err bitreich.org 70 i 25 Err bitreich.org 70 i 26 for (uint32_t state = 0, codepoint; *s != '\0'; s++) { Err bitreich.org 70 i 27 if (utf8_decode(&state, &codepoint, *s) == UTF8_ACCEPT) { Err bitreich.org 70 i 28 pos += term_codepoint_width(codepoint, pos); Err bitreich.org 70 i 29 if (pos > width) Err bitreich.org 70 i 30 break; Err bitreich.org 70 i 31 } Err bitreich.org 70 i 32 } Err bitreich.org 70 i 33 return s - beg; Err bitreich.org 70 i 34 } Err bitreich.org 70 i 35 Err bitreich.org 70 i 36 int Err bitreich.org 70 i 37 term_raw_on(int fd) Err bitreich.org 70 i 38 { Err bitreich.org 70 i 39 static char *seq = "\x1b[s\x1b[?1049h\x1b[H"; Err bitreich.org 70 i 40 struct termios termios; Err bitreich.org 70 i 41 ssize_t len = strlen(seq); Err bitreich.org 70 i 42 Err bitreich.org 70 i 43 if (write(fd, seq, len) < len) Err bitreich.org 70 i 44 return -1; Err bitreich.org 70 i 45 Err bitreich.org 70 i 46 memset(&termios, 0, sizeof termios); Err bitreich.org 70 i 47 if (tcgetattr(fd, &term.termios) < 0) Err bitreich.org 70 i 48 return -1; Err bitreich.org 70 i 49 memcpy(&termios, &term.termios, sizeof termios); Err bitreich.org 70 i 50 Err bitreich.org 70 i 51 termios.c_lflag &= ~(ICANON | ECHO | IEXTEN | IGNBRK | ISIG); Err bitreich.org 70 i 52 if (tcsetattr(fd, TCSANOW, &termios) == -1) Err bitreich.org 70 i 53 return -1; Err bitreich.org 70 i 54 return 0; Err bitreich.org 70 i 55 } Err bitreich.org 70 i 56 Err bitreich.org 70 i 57 int Err bitreich.org 70 i 58 term_raw_off(int fd) Err bitreich.org 70 i 59 { Err bitreich.org 70 i 60 static char *seq = "\x1b[2J\x1b[u\033[?1049l"; Err bitreich.org 70 i 61 ssize_t len = strlen(seq); Err bitreich.org 70 i 62 Err bitreich.org 70 i 63 if (tcsetattr(fd, TCSANOW, &term.termios) < 0) Err bitreich.org 70 i 64 return -1; Err bitreich.org 70 i 65 if (write(fd, seq, len) < len) Err bitreich.org 70 i 66 return -1; Err bitreich.org 70 i 67 return 0; Err bitreich.org 70 i 68 } Err bitreich.org 70 i 69 Err bitreich.org 70 i 70 int Err bitreich.org 70 i 71 term_get_key(FILE *fp) Err bitreich.org 70 i 72 { Err bitreich.org 70 i 73 int key, num; Err bitreich.org 70 i 74 Err bitreich.org 70 i 75 key = fgetc(fp); Err bitreich.org 70 i 76 top: Err bitreich.org 70 i 77 switch (key) { Err bitreich.org 70 i 78 case EOF: Err bitreich.org 70 i 79 return -1; Err bitreich.org 70 i 80 case TERM_KEY_ALT('['): Err bitreich.org 70 i 81 key = getc(fp); Err bitreich.org 70 i 82 if (key == EOF) Err bitreich.org 70 i 83 return -1; Err bitreich.org 70 i 84 Err bitreich.org 70 i 85 for (num = 0; isdigit(key);) { Err bitreich.org 70 i 86 num *= 10; Err bitreich.org 70 i 87 num += key - '0'; Err bitreich.org 70 i 88 Err bitreich.org 70 i 89 key = fgetc(fp); Err bitreich.org 70 i 90 if (key == EOF) Err bitreich.org 70 i 91 return -1; Err bitreich.org 70 i 92 } Err bitreich.org 70 i 93 Err bitreich.org 70 i 94 key = TERM_KEY_CSI(key, num); Err bitreich.org 70 i 95 Err bitreich.org 70 i 96 goto top; Err bitreich.org 70 i 97 case TERM_KEY_ESC: Err bitreich.org 70 i 98 key = getc(fp); Err bitreich.org 70 i 99 if (key == EOF) Err bitreich.org 70 i 100 return -1; Err bitreich.org 70 i 101 key = TERM_KEY_ALT(key); Err bitreich.org 70 i 102 goto top; Err bitreich.org 70 i 103 default: Err bitreich.org 70 i 104 return key; Err bitreich.org 70 i 105 } Err bitreich.org 70 i 106 } Err bitreich.org 70 .