ivtv-viewer.c - vtv-tools - virtual terminal video tools Err bitreich.org 70 hgit clone git://bitreich.org/vtv-tools git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/vtv-tools URL:git://bitreich.org/vtv-tools git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/vtv-tools bitreich.org 70 1Log /scm/vtv-tools/log.gph bitreich.org 70 1Files /scm/vtv-tools/files.gph bitreich.org 70 1Refs /scm/vtv-tools/refs.gph bitreich.org 70 1Tags /scm/vtv-tools/tag bitreich.org 70 1README /scm/vtv-tools/file/README.md.gph bitreich.org 70 1LICENSE /scm/vtv-tools/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 ivtv-viewer.c (2513B) Err bitreich.org 70 i--- Err bitreich.org 70 i 1 // Copyright 2023 Troels Henriksen Err bitreich.org 70 i 2 // Err bitreich.org 70 i 3 // See LICENSE file for licensing information. Err bitreich.org 70 i 4 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 Err bitreich.org 70 i 9 #include Err bitreich.org 70 i 10 #include Err bitreich.org 70 i 11 #include Err bitreich.org 70 i 12 #include Err bitreich.org 70 i 13 #include Err bitreich.org 70 i 14 Err bitreich.org 70 i 15 #include "vtv.h" Err bitreich.org 70 i 16 Err bitreich.org 70 i 17 struct termios orig_termios; Err bitreich.org 70 i 18 Err bitreich.org 70 i 19 void cooked_mode() { Err bitreich.org 70 i 20 tcsetattr(STDIN_FILENO, TCSAFLUSH, &orig_termios); Err bitreich.org 70 i 21 printf("\033[?25h"); Err bitreich.org 70 i 22 } Err bitreich.org 70 i 23 Err bitreich.org 70 i 24 void raw_mode() { Err bitreich.org 70 i 25 printf("\033[?25l"); Err bitreich.org 70 i 26 Err bitreich.org 70 i 27 tcgetattr(STDIN_FILENO, &orig_termios); Err bitreich.org 70 i 28 atexit(cooked_mode); Err bitreich.org 70 i 29 Err bitreich.org 70 i 30 struct termios raw = orig_termios; Err bitreich.org 70 i 31 raw.c_iflag &= ~(IXON); Err bitreich.org 70 i 32 raw.c_lflag &= ~(ECHO | ICANON); Err bitreich.org 70 i 33 raw.c_cc[VMIN] = 1; Err bitreich.org 70 i 34 raw.c_cc[VTIME] = 0; Err bitreich.org 70 i 35 tcsetattr(STDIN_FILENO, TCSAFLUSH, &raw); Err bitreich.org 70 i 36 } Err bitreich.org 70 i 37 Err bitreich.org 70 i 38 void move(int x, int y) { printf("\033[%d;%dH", y, x); } Err bitreich.org 70 i 39 void home() { printf("\033[;H"); } Err bitreich.org 70 i 40 void clear_screen() { printf("\033[2J"); } Err bitreich.org 70 i 41 void clear_line() { printf("\033[2K"); } Err bitreich.org 70 i 42 void def() { printf("\033[0m"); } Err bitreich.org 70 i 43 Err bitreich.org 70 i 44 struct { Err bitreich.org 70 i 45 int frame; Err bitreich.org 70 i 46 int lines_per_frame; Err bitreich.org 70 i 47 struct vtv* vtv; Err bitreich.org 70 i 48 } state; Err bitreich.org 70 i 49 Err bitreich.org 70 i 50 void show_status() { Err bitreich.org 70 i 51 printf("Frame (h/l): %5d Framesize (j/k): %5d\n", Err bitreich.org 70 i 52 state.frame, state.lines_per_frame); Err bitreich.org 70 i 53 } Err bitreich.org 70 i 54 Err bitreich.org 70 i 55 void show_frame() { Err bitreich.org 70 i 56 vtv_show_frame(state.vtv, stdout, state.frame, state.lines_per_frame, Err bitreich.org 70 i 57 "\033[0m MISSING LINE"); Err bitreich.org 70 i 58 } Err bitreich.org 70 i 59 Err bitreich.org 70 i 60 int view(struct vtv* vtv) { Err bitreich.org 70 i 61 raw_mode(); Err bitreich.org 70 i 62 Err bitreich.org 70 i 63 state.frame = 0; Err bitreich.org 70 i 64 state.lines_per_frame = 25; Err bitreich.org 70 i 65 state.vtv = vtv; Err bitreich.org 70 i 66 Err bitreich.org 70 i 67 while (1) { Err bitreich.org 70 i 68 home(); Err bitreich.org 70 i 69 def(); Err bitreich.org 70 i 70 clear_screen(); Err bitreich.org 70 i 71 show_frame(); Err bitreich.org 70 i 72 move(0, state.lines_per_frame+1); Err bitreich.org 70 i 73 def(); Err bitreich.org 70 i 74 // It is intentional that the status is at the bottom, as VTV Err bitreich.org 70 i 75 // files may assume that they are drawn from line 0. Err bitreich.org 70 i 76 show_status(); Err bitreich.org 70 i 77 switch(getchar()) { Err bitreich.org 70 i 78 case 'q': Err bitreich.org 70 i 79 return 0; Err bitreich.org 70 i 80 case 'h': Err bitreich.org 70 i 81 if (state.frame != 0) { state.frame--; } Err bitreich.org 70 i 82 break; Err bitreich.org 70 i 83 case 'l': Err bitreich.org 70 i 84 state.frame = (state.frame+1); Err bitreich.org 70 i 85 break; Err bitreich.org 70 i 86 case 'j': Err bitreich.org 70 i 87 if (state.lines_per_frame != 0) {state.lines_per_frame--; } Err bitreich.org 70 i 88 break; Err bitreich.org 70 i 89 case 'k': Err bitreich.org 70 i 90 state.lines_per_frame++; Err bitreich.org 70 i 91 break; Err bitreich.org 70 i 92 } Err bitreich.org 70 i 93 } Err bitreich.org 70 i 94 } Err bitreich.org 70 i 95 Err bitreich.org 70 i 96 int main(int argc, char** argv) { Err bitreich.org 70 i 97 if (argc != 2) { Err bitreich.org 70 i 98 fprintf(stderr, "Usage: %s FILE\n", argv[0]); Err bitreich.org 70 i 99 return 1; Err bitreich.org 70 i 100 } Err bitreich.org 70 i 101 Err bitreich.org 70 i 102 FILE* f = fopen(argv[1], "r"); Err bitreich.org 70 i 103 if (f == NULL) { Err bitreich.org 70 i 104 fprintf(stderr, "%s: cannot open %s: %s\n", Err bitreich.org 70 i 105 argv[0], argv[1], strerror(errno)); Err bitreich.org 70 i 106 } Err bitreich.org 70 i 107 Err bitreich.org 70 i 108 struct vtv *vtv = vtv_read(f); Err bitreich.org 70 i 109 Err bitreich.org 70 i 110 if (vtv == NULL) { Err bitreich.org 70 i 111 fprintf(stderr, "%s: failed to read from %s: %s\n", Err bitreich.org 70 i 112 argv[0], argv[1], strerror(errno)); Err bitreich.org 70 i 113 } Err bitreich.org 70 i 114 Err bitreich.org 70 i 115 int ret = view(vtv); Err bitreich.org 70 i 116 vtv_free(vtv); Err bitreich.org 70 i 117 return ret; Err bitreich.org 70 i 118 } Err bitreich.org 70 i 119 Err bitreich.org 70 .