iteconfig.c revision 1.1
1/* 2 * Copyright (c) 1994 Christian E. Hopps 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. All advertising materials mentioning features or use of this software 14 * must display the following acknowledgement: 15 * This product includes software developed by Christian E. Hopps 16 * 4. The name of the author may not be used to endorse or promote products 17 * derived from this software without specific prior written permission 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 21 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 22 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 24 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 * 30 * $Id: iteconfig.c,v 1.1 1994/04/05 01:56:46 chopps Exp $ 31 */ 32 33#include <sys/types.h> 34#include <sys/stat.h> 35#include <sys/ioctl.h> 36#include <sys/queue.h> 37#include <unistd.h> 38#include <termios.h> 39#include <fcntl.h> 40#include <stdio.h> 41#include <stdlib.h> 42#include <limits.h> 43#include <errno.h> 44 45#include <amiga/dev/grfabs_reg.h> 46#include <amiga/dev/viewioctl.h> 47#include <amiga/dev/iteioctl.h> 48 49colormap_t *xgetcmap __P((int, int)); 50void printcmap __P((colormap_t *, int)); 51void xioctl __P((int, int, void *)); 52long xstrtol __P((char *)); 53void xusage __P((void)); 54 55char *pname; 56char *optstr = "W:w:H:h:D:d:V:v:T:t:P:p:X:x:Y:y:i"; 57 58int 59main(argc, argv) 60 int argc; 61 char **argv; 62{ 63 extern int optind; 64 extern char *optarg; 65 struct ite_window_size is, newis; 66 struct ite_bell_values ib, newib; 67 struct winsize ws; 68 colormap_t *cm; 69 int opt, fd, f_info, i, max_colors, rv; 70 long val; 71 72 f_info = 0; 73 pname = argv[0]; 74 75 fd = open("/dev/ite0", O_NONBLOCK | O_RDONLY); 76 if (fd == -1) { 77 perror("open console"); 78 exit(1); 79 } 80 81 xioctl(fd, ITE_GET_WINDOW_SIZE, &is); 82 xioctl(fd, ITE_GET_BELL_VALUES, &ib); 83 84 bcopy(&is, &newis, sizeof(is)); 85 bcopy(&ib, &newib, sizeof(ib)); 86 87 while ((opt = getopt(argc, argv, optstr)) != EOF) { 88 switch (opt) { 89 case 'i': 90 f_info = 1; 91 break; 92 case 'X': 93 case 'x': 94 newis.x = xstrtol(optarg); 95 break; 96 case 'Y': 97 case 'y': 98 newis.y = xstrtol(optarg); 99 break; 100 case 'W': 101 case 'w': 102 newis.width = xstrtol(optarg); 103 break; 104 case 'H': 105 case 'h': 106 newis.height = xstrtol(optarg); 107 break; 108 case 'D': 109 case 'd': 110 newis.depth = xstrtol(optarg); 111 break; 112 case 'V': 113 case 'v': 114 newib.volume = xstrtol(optarg); 115 break; 116 case 'P': 117 case 'p': 118 newib.period = xstrtol(optarg); 119 break; 120 case 'T': 121 case 't': 122 newib.time = xstrtol(optarg); 123 break; 124 default: 125 case '?': 126 xusage(); 127 /* NOTREACHED */ 128 } 129 } 130 argc -= optind; 131 argv += optind; 132 133 if (bcmp(&newis, &is, sizeof(is))) { 134 xioctl(fd, ITE_SET_WINDOW_SIZE, &newis); 135 xioctl(fd, ITE_GET_WINDOW_SIZE, &is); 136 } 137 if (bcmp(&newib, &ib, sizeof(ib))) { 138 xioctl(fd, ITE_SET_BELL_VALUES, &newib); 139 xioctl(fd, ITE_GET_BELL_VALUES, &ib); 140 } 141 142 /* 143 * get, set and get colors again 144 */ 145 i = 0; 146 max_colors = 1 << is.depth; 147 cm = xgetcmap(fd, max_colors); 148 while (argc--) { 149 val = xstrtol(*argv++); 150 if (i >= max_colors) { 151 fprintf(stderr, "%s: warn: to many colors\n", pname); 152 break; 153 } 154 cm->entry[i] = val; 155 i++; 156 } 157 xioctl(fd, VIEW_USECOLORMAP, cm); 158 free(cm); 159 cm = xgetcmap(fd, max_colors); 160 161 /* do tty stuff to get it to register the changes. */ 162 xioctl(fd, TIOCGWINSZ, &ws); 163 164 if (f_info) { 165 printf("tty size: rows %d cols %d\n", ws.ws_row, ws.ws_col); 166 printf("ite size: w: %d h: %d d: %d [x: %d y: %d]\n", 167 is.width, is.height, is.depth, is.x, is.y); 168 printf("ite bell: vol: %d count: %d period: %d\n", 169 ib.volume, ib.time, ib.period); 170 printcmap(cm, ws.ws_col); 171 172 } 173 close(fd); 174 exit(0); 175} 176 177void 178xioctl(fd, cmd, addr) 179 int fd, cmd; 180 void *addr; 181{ 182 if (ioctl(fd, cmd, addr) != -1) 183 return; 184 185 perror("ioctl"); 186 exit(1); 187} 188 189long 190xstrtol(s) 191 char *s; 192{ 193 long rv; 194 195 rv = strtol(s, NULL, 0); 196 if (errno != ERANGE || (rv != LONG_MAX && rv != LONG_MIN)) 197 return(rv); 198 199 fprintf(stderr, "%s: bad format \"%s\"\n", pname, s); 200 exit(1); 201} 202 203colormap_t * 204xgetcmap(fd, ncolors) 205 int fd; 206 int ncolors; 207{ 208 colormap_t *cm; 209 210 cm = malloc(sizeof(colormap_t) + ncolors * sizeof(u_long)); 211 if (cm == NULL) { 212 perror("malloc"); 213 exit(1); 214 } 215 cm->first = 0; 216 cm->size = ncolors; 217 cm->entry = (u_long *) & cm[1]; 218 xioctl(fd, VIEW_GETCOLORMAP, cm); 219 return(cm); 220} 221 222void 223printcmap(cm, ncols) 224 colormap_t *cm; 225 int ncols; 226{ 227 int i, nel; 228 229 switch (cm->type) { 230 case CM_MONO: 231 printf("monochrome\n"); 232 return; 233 case CM_COLOR: 234 printf("color levels: red: %d green: %d blue: %d\n", 235 cm->red_mask + 1, cm->green_mask + 1, cm->blue_mask + 1); 236 break; 237 case CM_GREYSCALE: 238 printf("greyscale levels: %d\n", cm->grey_mask + 1); 239 break; 240 } 241 242 nel = ncols / 11 - 1; 243 for (i = 0; i < cm->size; i++) { 244 printf("0x%08lx ", cm->entry[i]); 245 if ((i + 1) % nel == 0) 246 printf("\n"); 247 } 248 if ((i + 1) % nel) 249 printf("\n"); 250} 251 252void 253xusage() 254{ 255 fprintf(stderr, "usage: %s [-i] [-w width] [-h height] [-d depth]" 256 " [-x off] [-y off] [-v volume] [-p period] [-t count]" 257 " [color ...]\n", pname); 258 exit(1); 259} 260