icatpoint.c - catpoint - Catpoint simple presenting software. Err bitreich.org 70 hgit clone git://bitreich.org/catpoint/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/catpoint/ URL:git://bitreich.org/catpoint/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/catpoint/ bitreich.org 70 1Log /scm/catpoint/log.gph bitreich.org 70 1Files /scm/catpoint/files.gph bitreich.org 70 1Refs /scm/catpoint/refs.gph bitreich.org 70 1Tags /scm/catpoint/tag bitreich.org 70 1README /scm/catpoint/file/README.md.gph bitreich.org 70 1LICENSE /scm/catpoint/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 icatpoint.c (4824B) Err bitreich.org 70 i--- Err bitreich.org 70 i 1 /* See LICENSE file for license details. */ Err bitreich.org 70 i 2 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 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 #include Err bitreich.org 70 i 15 #include Err bitreich.org 70 i 16 #include Err bitreich.org 70 i 17 #include Err bitreich.org 70 i 18 Err bitreich.org 70 i 19 void die(const char *, ...); Err bitreich.org 70 i 20 Err bitreich.org 70 i 21 char *currentslidep, **slidefiles; /* the slides */ Err bitreich.org 70 i 22 int nslides, currentslide, currentslidelen; Err bitreich.org 70 i 23 Err bitreich.org 70 i 24 volatile sig_atomic_t slidechanged = 1; Err bitreich.org 70 i 25 Err bitreich.org 70 i 26 void Err bitreich.org 70 i 27 unloadcurrentslide(void) Err bitreich.org 70 i 28 { Err bitreich.org 70 i 29 if (currentslidep == NULL) Err bitreich.org 70 i 30 return; Err bitreich.org 70 i 31 Err bitreich.org 70 i 32 if (munmap(currentslidep, currentslidelen) < 0) Err bitreich.org 70 i 33 die("munmap: %s", slidefiles[currentslide]); Err bitreich.org 70 i 34 } Err bitreich.org 70 i 35 Err bitreich.org 70 i 36 void Err bitreich.org 70 i 37 setupwin(void) Err bitreich.org 70 i 38 { Err bitreich.org 70 i 39 initscr(); Err bitreich.org 70 i 40 cbreak(); Err bitreich.org 70 i 41 noecho(); Err bitreich.org 70 i 42 nonl(); Err bitreich.org 70 i 43 intrflush(stdscr, FALSE); Err bitreich.org 70 i 44 keypad(stdscr, TRUE); Err bitreich.org 70 i 45 curs_set(FALSE); /* hide cursor */ Err bitreich.org 70 i 46 } Err bitreich.org 70 i 47 Err bitreich.org 70 i 48 void Err bitreich.org 70 i 49 cleanup(void) Err bitreich.org 70 i 50 { Err bitreich.org 70 i 51 unloadcurrentslide(); Err bitreich.org 70 i 52 Err bitreich.org 70 i 53 endwin(); /* restore terminal */ Err bitreich.org 70 i 54 } Err bitreich.org 70 i 55 Err bitreich.org 70 i 56 /* print to stderr, call cleanup() and _exit(). */ Err bitreich.org 70 i 57 void Err bitreich.org 70 i 58 die(const char *fmt, ...) Err bitreich.org 70 i 59 { Err bitreich.org 70 i 60 va_list ap; Err bitreich.org 70 i 61 int saved_errno; Err bitreich.org 70 i 62 Err bitreich.org 70 i 63 saved_errno = errno; Err bitreich.org 70 i 64 cleanup(); Err bitreich.org 70 i 65 Err bitreich.org 70 i 66 va_start(ap, fmt); Err bitreich.org 70 i 67 vfprintf(stderr, fmt, ap); Err bitreich.org 70 i 68 va_end(ap); Err bitreich.org 70 i 69 Err bitreich.org 70 i 70 if (saved_errno) Err bitreich.org 70 i 71 fprintf(stderr, ": %s", strerror(saved_errno)); Err bitreich.org 70 i 72 fflush(stderr); Err bitreich.org 70 i 73 (void)!write(2, "\n", 1); Err bitreich.org 70 i 74 Err bitreich.org 70 i 75 _exit(1); Err bitreich.org 70 i 76 } Err bitreich.org 70 i 77 Err bitreich.org 70 i 78 void Err bitreich.org 70 i 79 quit(int sig) Err bitreich.org 70 i 80 { Err bitreich.org 70 i 81 cleanup(); Err bitreich.org 70 i 82 _exit(128 + sig); Err bitreich.org 70 i 83 } Err bitreich.org 70 i 84 Err bitreich.org 70 i 85 void Err bitreich.org 70 i 86 executeslide(char **argv) Err bitreich.org 70 i 87 { Err bitreich.org 70 i 88 pid_t pid; Err bitreich.org 70 i 89 Err bitreich.org 70 i 90 endwin(); Err bitreich.org 70 i 91 Err bitreich.org 70 i 92 fprintf(stderr, "\x1b[H\x1b[J"); Err bitreich.org 70 i 93 fflush(stderr); Err bitreich.org 70 i 94 Err bitreich.org 70 i 95 switch ((pid = fork())) { Err bitreich.org 70 i 96 case 0: Err bitreich.org 70 i 97 execvp(argv[0], argv); Err bitreich.org 70 i 98 case -1: Err bitreich.org 70 i 99 perror(argv[0]); Err bitreich.org 70 i 100 break; Err bitreich.org 70 i 101 default: Err bitreich.org 70 i 102 waitpid(pid, NULL, 0); Err bitreich.org 70 i 103 } Err bitreich.org 70 i 104 Err bitreich.org 70 i 105 setupwin(); Err bitreich.org 70 i 106 } Err bitreich.org 70 i 107 Err bitreich.org 70 i 108 void Err bitreich.org 70 i 109 loadcurrentslide(char **argv, int slide) Err bitreich.org 70 i 110 { Err bitreich.org 70 i 111 struct stat statbuf; Err bitreich.org 70 i 112 int fd; Err bitreich.org 70 i 113 Err bitreich.org 70 i 114 unloadcurrentslide(); Err bitreich.org 70 i 115 Err bitreich.org 70 i 116 fd = open(slidefiles[slide], O_RDONLY, 0); Err bitreich.org 70 i 117 if (fd < 0) Err bitreich.org 70 i 118 die("open: %s", slidefiles[slide]); Err bitreich.org 70 i 119 if (fstat(fd, &statbuf) < 0) Err bitreich.org 70 i 120 die("fstat: %s", slidefiles[slide]); Err bitreich.org 70 i 121 currentslidep = mmap(NULL, statbuf.st_size, PROT_READ, MAP_PRIVATE, fd, 0); Err bitreich.org 70 i 122 if (currentslidep == MAP_FAILED) { Err bitreich.org 70 i 123 currentslidep = NULL; Err bitreich.org 70 i 124 die("mmap: %s", slidefiles[slide]); Err bitreich.org 70 i 125 } Err bitreich.org 70 i 126 currentslidelen = statbuf.st_size; Err bitreich.org 70 i 127 close(fd); Err bitreich.org 70 i 128 } Err bitreich.org 70 i 129 Err bitreich.org 70 i 130 void Err bitreich.org 70 i 131 reloadcurrentslide(int sig) Err bitreich.org 70 i 132 { Err bitreich.org 70 i 133 /* Err bitreich.org 70 i 134 * Keep this out of SIGHUP, in case this is used somewhere else. Err bitreich.org 70 i 135 */ Err bitreich.org 70 i 136 slidechanged = 1; Err bitreich.org 70 i 137 Err bitreich.org 70 i 138 if (sig == SIGHUP) { Err bitreich.org 70 i 139 /* Make ncurses redisplay slide. */ Err bitreich.org 70 i 140 if (raise(SIGWINCH) < 0) Err bitreich.org 70 i 141 die("raise"); Err bitreich.org 70 i 142 } Err bitreich.org 70 i 143 } Err bitreich.org 70 i 144 Err bitreich.org 70 i 145 void Err bitreich.org 70 i 146 setsignal() Err bitreich.org 70 i 147 { Err bitreich.org 70 i 148 struct sigaction sa; Err bitreich.org 70 i 149 Err bitreich.org 70 i 150 memset(&sa, 0, sizeof(sa)); Err bitreich.org 70 i 151 sigemptyset(&sa.sa_mask); Err bitreich.org 70 i 152 sa.sa_flags = 0; Err bitreich.org 70 i 153 Err bitreich.org 70 i 154 sa.sa_handler = quit; Err bitreich.org 70 i 155 sigaction(SIGINT, &sa, NULL); Err bitreich.org 70 i 156 sigaction(SIGQUIT, &sa, NULL); Err bitreich.org 70 i 157 sigaction(SIGTERM, &sa, NULL); Err bitreich.org 70 i 158 Err bitreich.org 70 i 159 sa.sa_handler = reloadcurrentslide; Err bitreich.org 70 i 160 sigaction(SIGHUP, &sa, NULL); Err bitreich.org 70 i 161 } Err bitreich.org 70 i 162 Err bitreich.org 70 i 163 int Err bitreich.org 70 i 164 main(int argc, char *argv[]) Err bitreich.org 70 i 165 { Err bitreich.org 70 i 166 int c; Err bitreich.org 70 i 167 Err bitreich.org 70 i 168 if (argc == 1) { Err bitreich.org 70 i 169 errno = 0; Err bitreich.org 70 i 170 die("usage: %s file ...", argv[0]); Err bitreich.org 70 i 171 } Err bitreich.org 70 i 172 Err bitreich.org 70 i 173 slidefiles = ++argv; Err bitreich.org 70 i 174 nslides = --argc; Err bitreich.org 70 i 175 Err bitreich.org 70 i 176 setsignal(); Err bitreich.org 70 i 177 setlocale(LC_ALL, ""); Err bitreich.org 70 i 178 Err bitreich.org 70 i 179 /* start */ Err bitreich.org 70 i 180 currentslide = 0; Err bitreich.org 70 i 181 currentslidep = NULL; Err bitreich.org 70 i 182 currentslidelen = 0; Err bitreich.org 70 i 183 Err bitreich.org 70 i 184 /* init curses */ Err bitreich.org 70 i 185 setupwin(); Err bitreich.org 70 i 186 Err bitreich.org 70 i 187 show: Err bitreich.org 70 i 188 /* display slide if changed */ Err bitreich.org 70 i 189 if (slidechanged) { Err bitreich.org 70 i 190 slidechanged = 0; Err bitreich.org 70 i 191 loadcurrentslide(slidefiles, currentslide); Err bitreich.org 70 i 192 } Err bitreich.org 70 i 193 clear(); Err bitreich.org 70 i 194 refresh(); Err bitreich.org 70 i 195 Err bitreich.org 70 i 196 if (access(slidefiles[currentslide], X_OK) == 0) { Err bitreich.org 70 i 197 executeslide(slidefiles + currentslide); Err bitreich.org 70 i 198 } else { Err bitreich.org 70 i 199 printw("%.*s", currentslidelen, currentslidep); Err bitreich.org 70 i 200 } Err bitreich.org 70 i 201 Err bitreich.org 70 i 202 again: Err bitreich.org 70 i 203 c = getch(); Err bitreich.org 70 i 204 switch (c) { Err bitreich.org 70 i 205 /* powerpoint remote presenter shortcuts */ Err bitreich.org 70 i 206 case 4: /* ^D, EOT */ Err bitreich.org 70 i 207 case 27: Err bitreich.org 70 i 208 case KEY_F(5): Err bitreich.org 70 i 209 /* end presentation */ Err bitreich.org 70 i 210 case 'q': Err bitreich.org 70 i 211 break; Err bitreich.org 70 i 212 /* next without transition */ Err bitreich.org 70 i 213 case 'J': Err bitreich.org 70 i 214 case 'L': Err bitreich.org 70 i 215 for (int i = currentslide + 1; i < nslides; i++) { Err bitreich.org 70 i 216 if (access(slidefiles[i], X_OK) && i != currentslide) { Err bitreich.org 70 i 217 currentslide = i; Err bitreich.org 70 i 218 slidechanged = 1; Err bitreich.org 70 i 219 goto show; Err bitreich.org 70 i 220 } Err bitreich.org 70 i 221 } Err bitreich.org 70 i 222 goto again; Err bitreich.org 70 i 223 /* next */ Err bitreich.org 70 i 224 case ' ': Err bitreich.org 70 i 225 case 'l': Err bitreich.org 70 i 226 case 'j': Err bitreich.org 70 i 227 case KEY_RIGHT: Err bitreich.org 70 i 228 case KEY_DOWN: Err bitreich.org 70 i 229 case KEY_NPAGE: Err bitreich.org 70 i 230 if (currentslide < nslides - 1) { Err bitreich.org 70 i 231 slidechanged = 1; Err bitreich.org 70 i 232 currentslide++; Err bitreich.org 70 i 233 goto show; Err bitreich.org 70 i 234 } Err bitreich.org 70 i 235 goto again; Err bitreich.org 70 i 236 /* prev without transition */ Err bitreich.org 70 i 237 case 'H': Err bitreich.org 70 i 238 case 'K': Err bitreich.org 70 i 239 for (int i = currentslide - 1; i >= 0; i--) { Err bitreich.org 70 i 240 if (access(slidefiles[i], X_OK) && i != currentslide) { Err bitreich.org 70 i 241 currentslide = i; Err bitreich.org 70 i 242 slidechanged = 1; Err bitreich.org 70 i 243 goto show; Err bitreich.org 70 i 244 } Err bitreich.org 70 i 245 } Err bitreich.org 70 i 246 goto again; Err bitreich.org 70 i 247 /* prev */ Err bitreich.org 70 i 248 case 'h': Err bitreich.org 70 i 249 case 'k': Err bitreich.org 70 i 250 case KEY_LEFT: Err bitreich.org 70 i 251 case KEY_UP: Err bitreich.org 70 i 252 case KEY_PPAGE: Err bitreich.org 70 i 253 if (currentslide > 0) { Err bitreich.org 70 i 254 slidechanged = 1; Err bitreich.org 70 i 255 currentslide--; Err bitreich.org 70 i 256 goto show; Err bitreich.org 70 i 257 } Err bitreich.org 70 i 258 goto again; Err bitreich.org 70 i 259 /* shortcut from powerpoint. Needed for remote presenters. */ Err bitreich.org 70 i 260 case '.': Err bitreich.org 70 i 261 /* first */ Err bitreich.org 70 i 262 case 'u': Err bitreich.org 70 i 263 case KEY_BEG: Err bitreich.org 70 i 264 case KEY_HOME: Err bitreich.org 70 i 265 if (currentslide != 0) Err bitreich.org 70 i 266 slidechanged = 1; Err bitreich.org 70 i 267 currentslide = 0; Err bitreich.org 70 i 268 goto show; Err bitreich.org 70 i 269 /* last */ Err bitreich.org 70 i 270 case 'i': Err bitreich.org 70 i 271 case KEY_END: Err bitreich.org 70 i 272 if (currentslide != (nslides - 1)) Err bitreich.org 70 i 273 slidechanged = 1; Err bitreich.org 70 i 274 currentslide = nslides - 1; Err bitreich.org 70 i 275 goto show; Err bitreich.org 70 i 276 /* reload */ Err bitreich.org 70 i 277 case 'r': Err bitreich.org 70 i 278 case 12: /* ^L, redraw */ Err bitreich.org 70 i 279 case KEY_RESIZE: /* resize / SIGWINCH */ Err bitreich.org 70 i 280 goto show; Err bitreich.org 70 i 281 default: Err bitreich.org 70 i 282 /* printf("key pressed = '%d'\n", c); */ Err bitreich.org 70 i 283 goto again; Err bitreich.org 70 i 284 } Err bitreich.org 70 i 285 Err bitreich.org 70 i 286 cleanup(); Err bitreich.org 70 i 287 Err bitreich.org 70 i 288 return 0; Err bitreich.org 70 i 289 } Err bitreich.org 70 .