vidcontrol.c revision 6230
1139825Simp/*- 2116964Sgrehan * Copyright (c) 1994-1995 S�ren Schmidt 3116964Sgrehan * All rights reserved. 4116964Sgrehan * 5116964Sgrehan * Redistribution and use in source and binary forms, with or without 6116964Sgrehan * modification, are permitted provided that the following conditions 7116964Sgrehan * are met: 8116964Sgrehan * 1. Redistributions of source code must retain the above copyright 9116964Sgrehan * notice, this list of conditions and the following disclaimer, 10116964Sgrehan * in this position and unchanged. 11116964Sgrehan * 2. Redistributions in binary form must reproduce the above copyright 12116964Sgrehan * notice, this list of conditions and the following disclaimer in the 13116964Sgrehan * documentation and/or other materials provided with the distribution. 14116964Sgrehan * 3. The name of the author may not be used to endorse or promote products 15116964Sgrehan * derived from this software withough specific prior written permission 16116964Sgrehan * 17116964Sgrehan * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18116964Sgrehan * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19116964Sgrehan * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20116964Sgrehan * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21116964Sgrehan * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22116964Sgrehan * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23116964Sgrehan * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24116964Sgrehan * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25116964Sgrehan * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26116964Sgrehan * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27116964Sgrehan * 28227843Smarius * $Id: vidcontrol.c,v 1.6 1995/01/30 21:44:07 sos Exp sos $ 29227843Smarius */ 30227843Smarius 31116964Sgrehan#include <ctype.h> 32116964Sgrehan#include <stdio.h> 33131102Sgrehan#include <machine/console.h> 34116964Sgrehan#include <sys/errno.h> 35116964Sgrehan#include "path.h" 36116964Sgrehan 37258696Snwhitehorn 38116964Sgrehanchar legal_colors[16][16] = { 39116964Sgrehan "black", "blue", "green", "cyan", 40295837Szbb "red", "magenta", "brown", "white", 41183882Snwhitehorn "grey", "lightblue", "lightgreen", "lightcyan", 42186128Snwhitehorn "lightred", "lightmagenta", "yellow", "lightwhite" 43116964Sgrehan }; 44116964Sgrehanint hex = 0; 45116964Sgrehanint number; 46116964Sgrehanchar letter; 47116964Sgrehanstruct vid_info info; 48209298Snwhitehorn 49116964Sgrehan 50174782Smarcelchar * 51116964Sgrehannextarg(int ac, char **av, int *indp, int oc) 52116964Sgrehan{ 53116964Sgrehan if (*indp < ac) 54116964Sgrehan return(av[(*indp)++]); 55295837Szbb fprintf(stderr, "%s: option requires two arguments -- %c\n", av[0], oc); 56116964Sgrehan usage(); 57116964Sgrehan exit(1); 58116964Sgrehan return(""); 59116964Sgrehan} 60116964Sgrehan 61116964Sgrehan 62116964Sgrehanchar * 63116964Sgrehanmkfullname(const char *s1, const char *s2, const char *s3) 64116964Sgrehan{ 65116964Sgrehanstatic char *buf = NULL; 66116964Sgrehanstatic int bufl = 0; 67116964Sgrehanint f; 68116964Sgrehan 69116964Sgrehan 70116964Sgrehan f = strlen(s1) + strlen(s2) + strlen(s3) + 1; 71116964Sgrehan if (f > bufl) 72116964Sgrehan if (buf) 73116964Sgrehan buf = (char *)realloc(buf, f); 74116964Sgrehan else 75116964Sgrehan buf = (char *)malloc(f); 76116964Sgrehan if (!buf) { 77116964Sgrehan bufl = 0; 78116964Sgrehan return(NULL); 79116964Sgrehan } 80116964Sgrehan 81116964Sgrehan bufl = f; 82116964Sgrehan strcpy(buf, s1); 83258696Snwhitehorn strcat(buf, s2); 84116964Sgrehan strcat(buf, s3); 85116964Sgrehan return(buf); 86116964Sgrehan} 87116964Sgrehan 88116964Sgrehan 89116964Sgrehanvoid 90116964Sgrehanload_scrnmap(char *filename) 91116964Sgrehan{ 92116964Sgrehan FILE *fd; 93116964Sgrehan int i, size; 94116964Sgrehan char *name; 95116964Sgrehan scrmap_t scrnmap; 96116964Sgrehan char *prefix[] = {"", "", SCRNMAP_PATH, SCRNMAP_PATH, NULL}; 97227843Smarius char *postfix[] = {"", ".scm", "", ".scm"}; 98116964Sgrehan 99116964Sgrehan for (i=0; prefix[i]; i++) { 100116964Sgrehan name = mkfullname(prefix[i], filename, postfix[i]); 101230994Snwhitehorn if (fd = fopen(name, "r")) 102230993Snwhitehorn break; 103261513Snwhitehorn } 104116964Sgrehan if (fd == NULL) { 105116964Sgrehan perror("screenmap file not found"); 106116964Sgrehan return; 107116964Sgrehan } 108183882Snwhitehorn size = sizeof(scrnmap); 109116964Sgrehan if (decode(fd, &scrnmap) != size) { 110183882Snwhitehorn rewind(fd); 111183882Snwhitehorn if (fread(&scrnmap, 1, size, fd) != size) { 112116964Sgrehan fprintf(stderr, "bad scrnmap file\n"); 113116964Sgrehan close(fd); 114116964Sgrehan return; 115116964Sgrehan } 116116964Sgrehan } 117116964Sgrehan if (ioctl(0, PIO_SCRNMAP, &scrnmap) < 0) 118116964Sgrehan perror("can't load screenmap"); 119116964Sgrehan close(fd); 120116964Sgrehan} 121116964Sgrehan 122116964Sgrehan 123116964Sgrehanvoid 124116964Sgrehanload_default_scrnmap() 125116964Sgrehan{ 126116964Sgrehan int i; 127116964Sgrehan scrmap_t scrnmap; 128116964Sgrehan 129116964Sgrehan for (i=0; i<256; i++) 130116964Sgrehan *((char*)&scrnmap + i) = i; 131116964Sgrehan if (ioctl(0, PIO_SCRNMAP, &scrnmap) < 0) 132116964Sgrehan perror("can't load default screenmap"); 133116964Sgrehan} 134116964Sgrehan 135116964Sgrehan 136116964Sgrehanvoid 137116964Sgrehanprint_scrnmap() 138116964Sgrehan{ 139230993Snwhitehorn unsigned char map[256]; 140116964Sgrehan int i; 141116964Sgrehan 142116964Sgrehan if (ioctl(0, GIO_SCRNMAP, &map) < 0) { 143116964Sgrehan perror("getting scrnmap"); 144116964Sgrehan return; 145116964Sgrehan } 146116964Sgrehan for (i=0; i<sizeof(map); i++) { 147116964Sgrehan if (i > 0 && i % 16 == 0) 148116964Sgrehan fprintf(stdout, "\n"); 149116964Sgrehan if (hex) 150116964Sgrehan fprintf(stdout, " %02x", map[i]); 151116964Sgrehan else 152116964Sgrehan fprintf(stdout, " %03d", map[i]); 153116964Sgrehan } 154116964Sgrehan fprintf(stdout, "\n"); 155116964Sgrehan 156116964Sgrehan} 157116964Sgrehan 158116964Sgrehan 159116964Sgrehanvoid 160116964Sgrehanload_font(char *type, char *filename) 161125688Sgrehan{ 162116964Sgrehan FILE *fd; 163116964Sgrehan int i, io, size; 164116964Sgrehan char *name, *fontmap; 165125688Sgrehan char *prefix[] = {"", "", FONT_PATH, FONT_PATH, NULL}; 166116964Sgrehan char *postfix[] = {"", ".fnt", "", ".fnt"}; 167116964Sgrehan 168116964Sgrehan for (i=0; prefix[i]; i++) { 169116964Sgrehan name = mkfullname(prefix[i], filename, postfix[i]); 170116964Sgrehan if (fd = fopen(name, "r")) 171116964Sgrehan break; 172116964Sgrehan } 173116964Sgrehan if (fd == NULL) { 174116964Sgrehan perror("font file not found"); 175116964Sgrehan return; 176116964Sgrehan } 177116964Sgrehan if (!strcmp(type, "8x8")) { 178116964Sgrehan size = 8*256; 179116964Sgrehan io = PIO_FONT8x8; 180116964Sgrehan } 181116964Sgrehan else if (!strcmp(type, "8x14")) { 182116964Sgrehan size = 14*256; 183116964Sgrehan io = PIO_FONT8x14; 184116964Sgrehan } 185116964Sgrehan else if (!strcmp(type, "8x16")) { 186116964Sgrehan size = 16*256; 187116964Sgrehan io = PIO_FONT8x16; 188116964Sgrehan } 189116964Sgrehan else { 190116964Sgrehan perror("bad font size specification"); 191116964Sgrehan close(fd); 192116964Sgrehan return; 193116964Sgrehan } 194116964Sgrehan fontmap = (char*) malloc(size); 195116964Sgrehan if (decode(fd, fontmap) != size) { 196116964Sgrehan rewind(fd); 197116964Sgrehan if (fread(fontmap, 1, size, fd) != size) { 198116964Sgrehan fprintf(stderr, "bad font file\n"); 199116964Sgrehan close(fd); 200116964Sgrehan free(fontmap); 201116964Sgrehan return; 202116964Sgrehan } 203116964Sgrehan } 204116964Sgrehan if (ioctl(0, io, fontmap) < 0) 205116964Sgrehan perror("can't load font"); 206116964Sgrehan close(fd); 207116964Sgrehan free(fontmap); 208116964Sgrehan} 209116964Sgrehan 210116964Sgrehan 211116964Sgrehanvoid 212116964Sgrehanset_screensaver_timeout(char *arg) 213116964Sgrehan{ 214116964Sgrehan int nsec; 215116964Sgrehan 216116964Sgrehan if (!strcmp(arg, "off")) 217116964Sgrehan nsec = 0; 218116964Sgrehan else { 219116964Sgrehan nsec = atoi(arg); 220116964Sgrehan if ((*arg == '\0') || (nsec < 1)) { 221116964Sgrehan fprintf(stderr, "argument must be a positive number\n"); 222116964Sgrehan return; 223116964Sgrehan } 224125688Sgrehan } 225116964Sgrehan if (ioctl(0, CONS_BLANKTIME, &nsec) == -1) 226116964Sgrehan perror("setting screensaver period"); 227116964Sgrehan} 228116964Sgrehan 229116964Sgrehan 230116964Sgrehanvoid 231116964Sgrehanset_screensaver_type(char *type) 232116964Sgrehan{ 233116964Sgrehan ssaver_t saver; 234116964Sgrehan int i, e; 235116964Sgrehan 236116964Sgrehan if (!strcmp(type, "help")) { 237116964Sgrehan i = 0; 238116964Sgrehan printf("available screen saver types:\n"); 239116964Sgrehan do { 240116964Sgrehan saver.num = i; 241258696Snwhitehorn e = ioctl(0, CONS_GSAVER, &saver); 242258696Snwhitehorn i ++; 243258696Snwhitehorn if (e == 0) 244258696Snwhitehorn printf("\t%s\n", saver.name); 245293636Snwhitehorn } while (e == 0); 246258696Snwhitehorn if (e == -1 && errno != EIO) 247258696Snwhitehorn perror("getting screensaver info"); 248258696Snwhitehorn } else { 249258696Snwhitehorn i = 0; 250258696Snwhitehorn do { 251258696Snwhitehorn saver.num = i; 252258696Snwhitehorn e = ioctl(0, CONS_GSAVER, &saver); 253258696Snwhitehorn i ++; 254293636Snwhitehorn if (e == 0 && !strcmp(type, saver.name)) { 255293636Snwhitehorn if (ioctl(0, CONS_SSAVER, &saver) == -1) 256258696Snwhitehorn perror("setting screensaver type"); 257258696Snwhitehorn return; 258258696Snwhitehorn } 259258696Snwhitehorn } while (e == 0); 260258696Snwhitehorn if (e == -1 && errno != EIO) 261258696Snwhitehorn perror("getting screensaver info"); 262258696Snwhitehorn else 263258696Snwhitehorn fprintf(stderr, "%s: No such screensaver\n", type); 264258696Snwhitehorn } 265258696Snwhitehorn} 266258696Snwhitehorn 267258696Snwhitehornvoid 268258696Snwhitehornset_cursor_type(char *appearence) 269258696Snwhitehorn{ 270258696Snwhitehorn int type; 271258696Snwhitehorn 272258696Snwhitehorn if (!strcmp(appearence, "normal")) 273258696Snwhitehorn type = 0; 274258696Snwhitehorn else if (!strcmp(appearence, "blink")) 275258696Snwhitehorn type = 1; 276258696Snwhitehorn else if (!strcmp(appearence, "destructive")) 277258696Snwhitehorn type = 3; 278258696Snwhitehorn else { 279258696Snwhitehorn fprintf(stderr, 280258696Snwhitehorn "argument to -c must be normal, blink or destructive\n"); 281258696Snwhitehorn return; 282258696Snwhitehorn } 283258696Snwhitehorn ioctl(0, CONS_CURSORTYPE, &type); 284258696Snwhitehorn} 285258696Snwhitehorn 286116964Sgrehan 287116964Sgrehanint 288116964Sgrehanvideo_mode(int argc, char **argv, int *index) 289116964Sgrehan{ 290116964Sgrehan int mode; 291116964Sgrehan 292116964Sgrehan if (*index < argc) { 293127703Sgrehan if (!strcmp(argv[*index], "VGA_40x25")) 294127703Sgrehan mode = SW_VGA_C40x25; 295116964Sgrehan else if (!strcmp(argv[*index], "VGA_80x25")) 296127703Sgrehan mode = SW_VGA_C80x25; 297116964Sgrehan else if (!strcmp(argv[*index], "VGA_80x30")) 298116964Sgrehan mode = SW_VGA_C80x30; 299116964Sgrehan else if (!strcmp(argv[*index], "VGA_80x50")) 300116964Sgrehan mode = SW_VGA_C80x50; 301116964Sgrehan else if (!strcmp(argv[*index], "VGA_80x60")) 302116964Sgrehan mode = SW_VGA_C80x60; 303116964Sgrehan else if (!strcmp(argv[*index], "VGA_320x200")) 304116964Sgrehan mode = SW_VGA_CG320; 305116964Sgrehan else if (!strcmp(argv[*index], "EGA_80x25")) 306116964Sgrehan mode = SW_ENH_C80x25; 307116964Sgrehan else if (!strcmp(argv[*index], "EGA_80x43")) 308116964Sgrehan mode = SW_ENH_C80x43; 309116964Sgrehan else 310116964Sgrehan return; 311116964Sgrehan if (ioctl(0, mode, NULL) < 0) 312116964Sgrehan perror("Cannot set videomode"); 313116964Sgrehan (*index)++; 314116964Sgrehan } 315116964Sgrehan return; 316116964Sgrehan} 317116964Sgrehan 318116964Sgrehan 319116964Sgrehanint 320116964Sgrehanget_color_number(char *color) 321116964Sgrehan{ 322116964Sgrehan int i; 323116964Sgrehan 324116964Sgrehan for (i=0; i<16; i++) 325 if (!strcmp(color, legal_colors[i])) 326 return i; 327 return -1; 328} 329 330 331int 332set_normal_colors(int argc, char **argv, int *index) 333{ 334 int color; 335 336 if (*index < argc && (color = get_color_number(argv[*index])) != -1) { 337 (*index)++; 338 fprintf(stderr, "[=%dF", color); 339 if (*index < argc 340 && (color = get_color_number(argv[*index])) != -1 341 && color < 8) { 342 (*index)++; 343 fprintf(stderr, "[=%dG", color); 344 } 345 } 346} 347 348 349set_reverse_colors(int argc, char **argv, int *index) 350{ 351 int color; 352 353 if ((color = get_color_number(argv[*(index)-1])) != -1) { 354 fprintf(stderr, "[=%dH", color); 355 if (*index < argc 356 && (color = get_color_number(argv[*index])) != -1 357 && color < 8) { 358 (*index)++; 359 fprintf(stderr, "[=%dI", color); 360 } 361 } 362} 363 364 365set_border_color(char *arg) 366{ 367 int color; 368 369 if ((color = get_color_number(arg)) != -1) { 370 fprintf(stderr, "[=%dA", color); 371 } 372 else 373 usage(); 374} 375 376 377test_frame() 378{ 379 int i; 380 381 fprintf(stdout, "[=0G\n\n"); 382 for (i=0; i<8; i++) { 383 fprintf(stdout, "[=15F[=0G %2d [=%dF%-16s" 384 "[=15F[=0G %2d [=%dF%-16s " 385 "[=15F %2d [=%dGBACKGROUND[=0G\n", 386 i, i, legal_colors[i], i+8, i+8, 387 legal_colors[i+8], i, i); 388 } 389 fprintf(stdout, "[=%dF[=%dG[=%dH[=%dI\n", 390 info.mv_norm.fore, info.mv_norm.back, 391 info.mv_rev.fore, info.mv_rev.back); 392} 393 394 395usage() 396{ 397 fprintf(stderr, 398"Usage: vidcontrol mode (available modes: VGA_40x25, VGA_80x25,\n" 399" VGA_80x50, VGA_320x200,\n" 400" EGA_80x25, EGA_80x43)\n" 401" (experimental) VGA_80x30, VGA_80x60)\n" 402"\n" 403" show (show available colors)\n" 404" fgcol bgcol (set fore- & background colors)\n" 405" -r fgcol bgcol (set reverse fore- & background colors)\n" 406" -b color (set border color)\n" 407" -c normal (set cursor to inverting block\n" 408" -c blink (set cursor to blinking inverted block\n" 409" -c destructive (set cursor to blinking destructive char\n" 410" -d (dump screenmap to stdout)\n" 411" -l filename (load srceenmap file filename)\n" 412" -L (load default screenmap)\n" 413" -f DxL filename (load font, D dots wide & L lines high)\n" 414" -s saver | help (set screensaver type or help for a list)\n" 415" -t N (set screensaver timeout in seconds)\n" 416" -x (use hex numbers for output)\n" 417 ); 418} 419 420 421void 422main(int argc, char **argv) 423{ 424 extern char *optarg; 425 extern int optind; 426 int opt; 427 428 429 info.size = sizeof(info); 430 if (ioctl(0, CONS_GETINFO, &info) < 0) { 431 perror("Must be on a vrtual console"); 432 exit(1); 433 } 434 while((opt = getopt(argc, argv, "b:c:df:l:Lr:s:t:x")) != -1) 435 switch(opt) { 436 case 'c': 437 set_cursor_type(optarg); 438 break; 439 case 'b': 440 set_border_color(optarg); 441 break; 442 case 'd': 443 print_scrnmap(); 444 break; 445 case 'f': 446 load_font(optarg, 447 nextarg(argc, argv, &optind, 'f')); 448 break; 449 case 'l': 450 load_scrnmap(optarg); 451 break; 452 case 'L': 453 load_default_scrnmap(); 454 break; 455 case 'r': 456 set_reverse_colors(argc, argv, &optind); 457 break; 458 case 's': 459 set_screensaver_type(optarg); 460 break; 461 case 't': 462 set_screensaver_timeout(optarg); 463 break; 464 case 'x': 465 hex = 1; 466 break; 467 default: 468 usage(); 469 exit(1); 470 } 471 if (video_mode(argc, argv, &optind)) ; 472 if (set_normal_colors(argc, argv, &optind)) ; 473 if (optind < argc && !strcmp(argv[optind], "show")) { 474 test_frame(); 475 optind++; 476 } 477 if ((optind != argc) || (argc == 1)) { 478 usage(); 479 exit(1); 480 } 481 exit(0); 482} 483 484