|
|
1.1 ! root 1: #ifndef lint ! 2: static char *rcsid = "$Header: initial.c,v 10.6 86/12/17 20:34:22 swick Exp $"; ! 3: #endif lint ! 4: #ifdef sun ! 5: /* ! 6: * The Sun X drivers are a product of Sun Microsystems, Inc. and are provided ! 7: * for unrestricted use provided that this legend is included on all tape ! 8: * media and as a part of the software program in whole or part. Users ! 9: * may copy or modify these drivers without charge, but are not authorized ! 10: * to license or distribute them to anyone else except as part of a product or ! 11: * program developed by the user. ! 12: * ! 13: * THE SUN X DRIVERS ARE PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND ! 14: * INCLUDING THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A ! 15: * PARTICULAR PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE ! 16: * PRACTICE. ! 17: * ! 18: * The Sun X Drivers are provided with no support and without any obligation ! 19: * on the part of Sun Microsystems, Inc. to assist in their use, correction, ! 20: * modification or enhancement. ! 21: * ! 22: * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE ! 23: * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THE SUN X ! 24: * DRIVERS OR ANY PART THEREOF. ! 25: * ! 26: * In no event will Sun Microsystems, Inc. be liable for any lost revenue ! 27: * or profits or other special, indirect and consequential damages, even if ! 28: * Sun has been advised of the possibility of such damages. ! 29: * ! 30: * Sun Microsystems, Inc. ! 31: * 2550 Garcia Avenue ! 32: * Mountain View, California 94043 ! 33: */ ! 34: ! 35: #ifndef lint ! 36: static char sccsid[] = "@(#)initial.c 1.2 86/08/26 Copyright 1986 Sun Micro"; ! 37: #endif ! 38: ! 39: /*- ! 40: * Copyright 1985, Massachusetts Institute of Technology ! 41: * Copyright (c) 1986 by Sun Microsystems, Inc. ! 42: */ ! 43: ! 44: /* initial.c Routines to open & close display ! 45: * ! 46: * OpenDisplay Open it ! 47: * InitDisplay Download it ! 48: * DisplayDead Check if dead ! 49: * Allocate_space Allocate some temporary storage ! 50: * ! 51: */ ! 52: ! 53: /* ! 54: * ToDo: ! 55: * Look in environment/defaults for programs to start ! 56: */ ! 57: ! 58: ! 59: #include <stdio.h> ! 60: #include <fcntl.h> ! 61: #include <errno.h> ! 62: #include <sys/time.h> ! 63: #include <sys/ioctl.h> ! 64: #include <sys/signal.h> ! 65: #include <sun/fbio.h> ! 66: #include "Xsun.h" ! 67: #include <pixrect/pixrect_hs.h> ! 68: #include <sunwindow/rect.h> ! 69: #include <sunwindow/rectlist.h> ! 70: #include <sunwindow/pixwin.h> ! 71: #include <sunwindow/win_screen.h> ! 72: #include <sunwindow/win_struct.h> ! 73: #include <sunwindow/win_input.h> ! 74: #include <sundev/kbd.h> ! 75: #include <sundev/kbio.h> ! 76: ! 77: extern int InputReader(); ! 78: ! 79: struct pixwin *Display; ! 80: struct pixrect *PixRect; ! 81: u_char InvPix[256]; ! 82: ! 83: short Sun_From_X_Op[] = { ! 84: PIX_CLR, /* GXclear */ ! 85: PIX_SRC&PIX_DST, /* GXand */ ! 86: PIX_SRC&PIX_NOT(PIX_DST), /* GXandReverse */ ! 87: PIX_SRC, /* GXcopy */ ! 88: PIX_NOT(PIX_SRC)&PIX_DST, /* GXandInverted */ ! 89: PIX_DST, /* GXnoop */ ! 90: PIX_SRC^PIX_DST, /* GXxor */ ! 91: PIX_SRC|PIX_DST, /* GXor */ ! 92: PIX_NOT(PIX_SRC)&PIX_NOT(PIX_DST), /* GXnor */ ! 93: PIX_NOT(PIX_SRC)^PIX_DST, /* GXequiv */ ! 94: PIX_NOT(PIX_DST), /* GXinvert */ ! 95: PIX_SRC|PIX_NOT(PIX_DST), /* GXorReverse */ ! 96: PIX_NOT(PIX_SRC), /* GXcopyInverted */ ! 97: PIX_NOT(PIX_SRC)|PIX_DST, /* GXorInverted */ ! 98: PIX_NOT(PIX_SRC)|PIX_NOT(PIX_DST), /* GXnand */ ! 99: PIX_SET, /* GXset */ ! 100: }; ! 101: ! 102: int vsdev = -1; ! 103: extern int errno; ! 104: DEVICE *CurrentDevice; ! 105: ! 106: #define PARENT "WINDOW_GFX" ! 107: /* Open the display */ ! 108: static char *parent; ! 109: ! 110: #ifdef RAW_KBD ! 111: struct kiockey sunkeymap[128*5]; ! 112: #endif ! 113: ! 114: /*ARGSUSED*/ ! 115: OpenDisplay (devname) ! 116: char *devname; ! 117: { ! 118: struct screen sc; ! 119: extern char *getenv(); ! 120: ! 121: signal (SIGWINCH, SIG_IGN); ! 122: parent = getenv(PARENT); ! 123: bzero((caddr_t) & sc, sizeof sc); ! 124: if (*devname != '/') ! 125: devname = "/dev/fb"; ! 126: strncpy(sc.scr_fbname, devname, SCR_NAMESIZE); ! 127: if (parent) { ! 128: /* Running under "overview" */ ! 129: int pfd; ! 130: ! 131: if ((pfd = open(parent, 2, 0)) < 0) { ! 132: fprintf(stderr, "Can't open parent %s\n", parent); ! 133: return (-1); ! 134: } ! 135: vsdev = win_getnewwindow(); ! 136: win_setlink(vsdev, WL_PARENT, win_fdtonumber(pfd)); ! 137: win_insert(vsdev); ! 138: close(pfd); ! 139: } ! 140: else { ! 141: /* Running alone */ ! 142: vsdev = win_screennew(&sc); ! 143: } ! 144: return (vsdev); ! 145: } ! 146: ! 147: /* Do sun specific initialization */ ! 148: #ifdef notdef ! 149: static int pid; ! 150: #define XTERM "xterm" ! 151: static char *args[] = { ! 152: XTERM, ! 153: "=80x24+30+30", ! 154: "-C", ! 155: "-n", ! 156: "console", ! 157: 0, ! 158: }; ! 159: ! 160: #include <sys/wait.h> ! 161: ! 162: static SigChildHandler() ! 163: { ! 164: register int dead; ! 165: union wait status; ! 166: ! 167: while ((dead = wait3(&status, WNOHANG, NULL)) > 0) { ! 168: if (dead == pid) { ! 169: exit(0); ! 170: } ! 171: } ! 172: } ! 173: ! 174: static StartShell() ! 175: { ! 176: signal(SIGCHLD, SigChildHandler); ! 177: if ((pid = fork()) == 0) { ! 178: { ! 179: register int i = getdtablesize(); ! 180: ! 181: while (--i >= 0) { ! 182: close(i); ! 183: } ! 184: } ! 185: open("/dev/null", 2, 0); ! 186: dup(0); ! 187: dup(0); ! 188: { ! 189: /* Copy the environment for Setenv */ ! 190: extern char **environ; ! 191: register int i = 0; ! 192: char **envnew; ! 193: ! 194: while (environ[i] != NULL) ! 195: i++; ! 196: ! 197: envnew = (char **) malloc(sizeof(char *) * (i + 1)); ! 198: for (; i >= 0; i--) ! 199: envnew[i] = environ[i]; ! 200: environ = envnew; ! 201: } ! 202: { ! 203: #define HOSTNAMESIZE 128 ! 204: char DisplayName[HOSTNAMESIZE]; ! 205: ! 206: gethostname(DisplayName, HOSTNAMESIZE); ! 207: strcat(DisplayName, ":0"); ! 208: Setenv("DISPLAY=", DisplayName); ! 209: #undef HOSTNAMESIZE ! 210: } ! 211: execvp(XTERM, args); ! 212: _exit(1); ! 213: } ! 214: } ! 215: #endif ! 216: ! 217: InitDisplay (info) ! 218: register DEVICE *info; ! 219: { ! 220: register int i; ! 221: static vsCursor vsc; ! 222: static vsBox vsm; ! 223: static vsEventQueue vsq = { ! 224: NULL, ! 225: 0, ! 226: 0, ! 227: 0, ! 228: }; ! 229: struct screen sc; ! 230: ! 231: win_screenget(vsdev, &sc); ! 232: info->height = sc.scr_rect.r_height; ! 233: info->width = sc.scr_rect.r_width; ! 234: if (parent) { ! 235: /* running under "overview" */ ! 236: win_setrect(vsdev, &sc.scr_rect); ! 237: } ! 238: { ! 239: struct fbtype fbt; ! 240: int fd = open(sc.scr_fbname, O_RDWR, 0); ! 241: ! 242: if (fd < 0 || ioctl(fd, FBIOGTYPE, &fbt) < 0) { ! 243: if (fd < 0) ! 244: fprintf(stderr, "Can't open fb %s\n", sc.scr_fbname); ! 245: else ! 246: fprintf(stderr, "Can't FBIOGTYPE on %s\n", sc.scr_fbname); ! 247: return (-1); ! 248: } ! 249: close(fd); ! 250: info->id = fbt.fb_type + SUN_BASE; ! 251: info->planes = fbt.fb_depth; ! 252: info->entries = fbt.fb_cmsize; ! 253: } ! 254: Display = pw_open(vsdev); ! 255: PixRect = Display->pw_pixrect; ! 256: pw_reversevideo(Display,0,1); ! 257: { ! 258: struct inputmask im; ! 259: struct kiockey kk; ! 260: int kbfd, i = 0; ! 261: ! 262: if ((kbfd = open("/dev/kbd", O_RDWR, 0)) >= 0) { ! 263: #ifdef RAW_KBD ! 264: struct kiockey ok; ! 265: ! 266: for (i = 0; i < 0200; ++i) { ! 267: ok.kio_station = ! 268: kk.kio_station = kk.kio_entry = i; ! 269: ! 270: ok.kio_tablemask = kk.kio_tablemask = 0; ! 271: ioctl(kbfd, KIOCGETKEY, &ok); ! 272: sunkeymap[i] = ok; ! 273: /* ! 274: * If I am a shift key then remap past what ! 275: * kbd.c knows about so no mapping is done ! 276: * Only shift keys can be used the with UPMASK ! 277: * due to assumptions in sun's kernel ! 278: */ ! 279: if ((ok.kio_entry & 0xf0) == SHIFTKEYS) { ! 280: switch (ok.kio_entry) { ! 281: default: ! 282: case SHIFTKEYS+CAPSLOCK: ! 283: kk.kio_entry = SHIFTKEYS+10; ! 284: break; ! 285: case SHIFTKEYS+SHIFTLOCK: ! 286: kk.kio_entry = SHIFTKEYS+13; ! 287: break; ! 288: case SHIFTKEYS+LEFTSHIFT: ! 289: kk.kio_entry = SHIFTKEYS+11; ! 290: break; ! 291: case SHIFTKEYS+RIGHTSHIFT: ! 292: kk.kio_entry = SHIFTKEYS+14; ! 293: break; ! 294: case SHIFTKEYS+LEFTCTRL: ! 295: kk.kio_entry = SHIFTKEYS+12; ! 296: break; ! 297: case SHIFTKEYS+RIGHTCTRL: ! 298: kk.kio_entry = SHIFTKEYS+15; ! 299: break; ! 300: } ! 301: } else if (ok.kio_entry == BUCKYBITS+METABIT) ! 302: kk.kio_entry = SHIFTKEYS+09; ! 303: else if (ok.kio_entry == BUCKYBITS+SYSTEMBIT) ! 304: kk.kio_entry = ok.kio_entry; ! 305: ioctl(kbfd, KIOCSETKEY, &kk); ! 306: ! 307: ok.kio_tablemask = kk.kio_tablemask = CTRLMASK; ! 308: ioctl(kbfd, KIOCGETKEY, &ok); ! 309: sunkeymap[i+00200] = ok; ! 310: ! 311: ok.kio_tablemask = kk.kio_tablemask = CAPSMASK; ! 312: ioctl(kbfd, KIOCGETKEY, &ok); ! 313: sunkeymap[i+00400] = ok; ! 314: ! 315: ok.kio_tablemask = kk.kio_tablemask = SHIFTMASK; ! 316: ioctl(kbfd, KIOCGETKEY, &ok); ! 317: sunkeymap[i+00600] = ok; ! 318: ! 319: ok.kio_tablemask = kk.kio_tablemask = UPMASK; ! 320: ioctl(kbfd, KIOCGETKEY, &ok); ! 321: sunkeymap[i+01000] = ok; ! 322: if ((kk.kio_entry & 0xf0) == SHIFTKEYS) ! 323: ioctl(kbfd, KIOCSETKEY, &kk); ! 324: } ! 325: #else ! 326: kk.kio_tablemask = 0; ! 327: kk.kio_entry = ~(SHIFTKEYS+CAPSLOCK); ! 328: do { ! 329: kk.kio_station = i++; ! 330: ioctl(kbfd, KIOCGETKEY, &kk); ! 331: } while ( i < 128 && kk.kio_entry != SHIFTKEYS+CAPSLOCK); ! 332: if (kk.kio_entry == SHIFTKEYS+CAPSLOCK) { ! 333: kk.kio_tablemask = UPMASK; ! 334: ioctl(kbfd, KIOCSETKEY, &kk); ! 335: kk.kio_tablemask = CTRLMASK; ! 336: ioctl(kbfd, KIOCSETKEY, &kk); ! 337: kk.kio_tablemask = CAPSMASK; ! 338: ioctl(kbfd, KIOCSETKEY, &kk); ! 339: kk.kio_tablemask = SHIFTMASK; ! 340: ioctl(kbfd, KIOCSETKEY, &kk); ! 341: } ! 342: #endif ! 343: close(kbfd); ! 344: } ! 345: input_imnull(&im); ! 346: im.im_flags = IM_ASCII | IM_META | IM_NEGEVENT; ! 347: win_setinputcodebit(&im, LOC_MOVE); ! 348: win_setinputcodebit(&im, MS_LEFT); ! 349: win_setinputcodebit(&im, MS_MIDDLE); ! 350: win_setinputcodebit(&im, MS_RIGHT); ! 351: #ifdef RAW_KBD ! 352: win_setinputcodebit(&im, VKEY_FIRSTSHIFT+9); ! 353: win_setinputcodebit(&im, VKEY_FIRSTSHIFT+10); ! 354: win_setinputcodebit(&im, VKEY_FIRSTSHIFT+11); ! 355: win_setinputcodebit(&im, VKEY_FIRSTSHIFT+12); ! 356: win_setinputcodebit(&im, VKEY_FIRSTSHIFT+13); ! 357: win_setinputcodebit(&im, VKEY_FIRSTSHIFT+14); ! 358: win_setinputcodebit(&im, VKEY_FIRSTSHIFT+15); ! 359: #else ! 360: win_setinputcodebit(&im, SHIFT_CAPSLOCK); ! 361: #endif ! 362: win_setinputmask(vsdev, &im, NULL, WIN_NULLLINK); ! 363: } ! 364: if (fcntl(vsdev, F_SETFL, O_NDELAY) < 0) ! 365: return (-1); ! 366: { ! 367: /* Following struct cannot be included from win_cursor.h */ ! 368: struct cursor { ! 369: short cur_xhot, cur_yhot; /* offset of mouse position from shape*/ ! 370: int cur_function; /* relationship of shape to screen */ ! 371: struct pixrect *cur_shape; /* memory image to use */ ! 372: int flags; /* various options */ ! 373: ! 374: short horiz_hair_thickness; /* horizontal crosshair height */ ! 375: int horiz_hair_op; /* drawing op */ ! 376: int horiz_hair_color; /* color */ ! 377: short horiz_hair_length; /* width */ ! 378: short horiz_hair_gap; /* gap */ ! 379: ! 380: short vert_hair_thickness; /* vertical crosshair width */ ! 381: int vert_hair_op; /* drawing op */ ! 382: int vert_hair_color; /* color */ ! 383: short vert_hair_length; /* height */ ! 384: short vert_hair_gap; /* gap */ ! 385: } cs; ! 386: static struct pixrect pr; ! 387: ! 388: cs.cur_xhot = cs.cur_yhot = cs.cur_function = 0; ! 389: cs.flags = 0; ! 390: cs.cur_shape = ≺ ! 391: pr.pr_size.x = pr.pr_size.y = 0; ! 392: win_setcursor(vsdev, &cs); ! 393: win_setmouseposition(vsdev, info->width >> 1, info->height >> 1); ! 394: } ! 395: info->mouse = &vsc; ! 396: info->mbox = &vsm; ! 397: info->queue = &vsq; ! 398: Define_input_handler(InputReader); ! 399: SetUpInvPix(); ! 400: CurrentDevice = info; ! 401: #ifdef notdef ! 402: StartShell(); ! 403: #endif ! 404: return (0); ! 405: } ! 406: ! 407: /* Check if display is dead */ ! 408: ! 409: DisplayDead () ! 410: { ! 411: #ifdef RAW_KBD ! 412: int i; ! 413: int kbfd = open("/dev/kbd", O_RDWR, 0); ! 414: for (i = 0; i < 0200; ++i) { ! 415: ioctl(kbfd, KIOCSETKEY, &sunkeymap[i]); ! 416: if ((sunkeymap[i].kio_entry & 0xf0) == SHIFTKEYS) ! 417: ioctl(kbfd, KIOCSETKEY, &sunkeymap[i+01000]); ! 418: else if (sunkeymap[i].kio_entry == BUCKYBITS+METABIT) ! 419: ioctl(kbfd, KIOCSETKEY, &sunkeymap[i+01000]); ! 420: } ! 421: close(kbfd); ! 422: #endif ! 423: return(0); ! 424: } ! 425: ! 426: /* the presumption here is that only one Allocate_space call is made/request */ ! 427: ! 428: #define ABUFSIZE 3072 ! 429: static char ABuffer[3072]; /* random size buffer for allocate space */ ! 430: caddr_t AllocateSpace (size) ! 431: register int size; ! 432: { ! 433: if (size < ABUFSIZE) return(ABuffer); ! 434: errno = ENOMEM; ! 435: return (NULL); ! 436: } ! 437: ! 438: /* XXX - should be static data */ ! 439: SetUpInvPix() ! 440: { ! 441: register int i; ! 442: ! 443: for (i = 255; i >= 0; i--) { ! 444: register int j = 1, k = 128, l = 8; ! 445: ! 446: while (l--) { ! 447: if ((i & j) != 0) ! 448: InvPix[i] |= k; ! 449: j <<= 1; ! 450: k >>= 1; ! 451: } ! 452: } ! 453: } ! 454: ! 455: #ifdef notdef ! 456: Setenv (var, value) ! 457: /* ! 458: sets the value of var to be arg in the Unix 4.2 BSD environment env. ! 459: Var should end with '='. ! 460: (bindings are of the form "var=value") ! 461: This procedure assumes the memory for the first level of environ ! 462: was allocated using malloc. ! 463: */ ! 464: register char *var, *value; ! 465: { ! 466: extern char **environ; ! 467: register int index = 0; ! 468: ! 469: while (environ[index] != NULL) { ! 470: if (strncmp(environ[index], var, strlen(var)) == 0) { ! 471: /* found it */ ! 472: environ[index] = (char *) malloc(strlen(var) + strlen(value)); ! 473: strcpy(environ[index], var); ! 474: strcat(environ[index], value); ! 475: return; ! 476: } ! 477: index++; ! 478: } ! 479: ! 480: if ((environ = (char **) realloc(environ, sizeof(char *) * ! 481: (index + 2))) == NULL) { ! 482: fprintf(stderr, "Setenv: malloc out of memory\n"); ! 483: exit(1); ! 484: } ! 485: ! 486: environ[index] = (char *) malloc(strlen(var) + strlen(value)); ! 487: strcpy(environ[index], var); ! 488: strcat(environ[index], value); ! 489: environ[++index] = NULL; ! 490: } ! 491: #endif ! 492: #endif sun
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.