|
|
1.1 ! root 1: #ifndef lint ! 2: static char *rcsid = "$Header: initial.c,v 10.4 86/02/01 16:21:01 tony Rel $"; ! 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[] = "%Z%%M% %I% %E% 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: ! 75: extern int InputReader(); ! 76: ! 77: struct pixwin *Display; ! 78: struct pixrect *PixRect; ! 79: u_char InvPix[256]; ! 80: ! 81: short Sun_From_X_Op[] = { ! 82: PIX_CLR, /* GXclear */ ! 83: PIX_SRC&PIX_DST, /* GXand */ ! 84: PIX_SRC&PIX_NOT(PIX_DST), /* GXandReverse */ ! 85: PIX_SRC, /* GXcopy */ ! 86: PIX_NOT(PIX_SRC)&PIX_DST, /* GXandInverted */ ! 87: PIX_DST, /* GXnoop */ ! 88: PIX_SRC^PIX_DST, /* GXxor */ ! 89: PIX_SRC|PIX_DST, /* GXor */ ! 90: PIX_NOT(PIX_SRC)&PIX_NOT(PIX_DST), /* GXnor */ ! 91: PIX_NOT(PIX_SRC)^PIX_DST, /* GXequiv */ ! 92: PIX_NOT(PIX_DST), /* GXinvert */ ! 93: PIX_SRC|PIX_NOT(PIX_DST), /* GXorReverse */ ! 94: PIX_NOT(PIX_SRC), /* GXcopyInverted */ ! 95: PIX_NOT(PIX_SRC)|PIX_DST, /* GXorInverted */ ! 96: PIX_NOT(PIX_SRC)|PIX_NOT(PIX_DST), /* GXnand */ ! 97: PIX_SET, /* GXset */ ! 98: }; ! 99: ! 100: int vsdev = -1; ! 101: extern int errno; ! 102: DEVICE *CurrentDevice; ! 103: ! 104: #define PARENT "WINDOW_GFX" ! 105: /* Open the display */ ! 106: static char *parent; ! 107: ! 108: /*ARGSUSED*/ ! 109: OpenDisplay (devname) ! 110: char *devname; ! 111: { ! 112: struct screen sc; ! 113: extern char *getenv(); ! 114: ! 115: signal (SIGWINCH, SIG_IGN); ! 116: parent = getenv(PARENT); ! 117: bzero((caddr_t) & sc, sizeof sc); ! 118: if (*devname != '/') ! 119: devname = "/dev/fb"; ! 120: strncpy(sc.scr_fbname, devname, SCR_NAMESIZE); ! 121: if (parent) { ! 122: /* Running under "overview" */ ! 123: int pfd; ! 124: ! 125: if ((pfd = open(parent, 2, 0)) < 0) { ! 126: fprintf(stderr, "Can't open parent %s\n", parent); ! 127: return (-1); ! 128: } ! 129: vsdev = win_getnewwindow(); ! 130: win_setlink(vsdev, WL_PARENT, win_fdtonumber(pfd)); ! 131: win_insert(vsdev); ! 132: close(pfd); ! 133: } ! 134: else { ! 135: /* Running alone */ ! 136: vsdev = win_screennew(&sc); ! 137: } ! 138: return (vsdev); ! 139: } ! 140: ! 141: /* Do sun specific initialization */ ! 142: #ifdef notdef ! 143: static int pid; ! 144: #define XTERM "xterm" ! 145: static char *args[] = { ! 146: XTERM, ! 147: "=80x24+30+30", ! 148: "-C", ! 149: "-n", ! 150: "console", ! 151: 0, ! 152: }; ! 153: ! 154: #include <sys/wait.h> ! 155: ! 156: static SigChildHandler() ! 157: { ! 158: register int dead; ! 159: union wait status; ! 160: ! 161: while ((dead = wait3(&status, WNOHANG, NULL)) > 0) { ! 162: if (dead == pid) { ! 163: exit(0); ! 164: } ! 165: } ! 166: } ! 167: ! 168: static StartShell() ! 169: { ! 170: signal(SIGCHLD, SigChildHandler); ! 171: if ((pid = fork()) == 0) { ! 172: { ! 173: register int i = getdtablesize(); ! 174: ! 175: while (--i >= 0) { ! 176: close(i); ! 177: } ! 178: } ! 179: open("/dev/null", 2, 0); ! 180: dup(0); ! 181: dup(0); ! 182: { ! 183: /* Copy the environment for Setenv */ ! 184: extern char **environ; ! 185: register int i = 0; ! 186: char **envnew; ! 187: ! 188: while (environ[i] != NULL) ! 189: i++; ! 190: ! 191: envnew = (char **) malloc(sizeof(char *) * (i + 1)); ! 192: for (; i >= 0; i--) ! 193: envnew[i] = environ[i]; ! 194: environ = envnew; ! 195: } ! 196: { ! 197: #define HOSTNAMESIZE 128 ! 198: char DisplayName[HOSTNAMESIZE]; ! 199: ! 200: gethostname(DisplayName, HOSTNAMESIZE); ! 201: strcat(DisplayName, ":0"); ! 202: Setenv("DISPLAY=", DisplayName); ! 203: #undef HOSTNAMESIZE ! 204: } ! 205: execvp(XTERM, args); ! 206: _exit(1); ! 207: } ! 208: } ! 209: #endif ! 210: ! 211: InitDisplay (info) ! 212: register DEVICE *info; ! 213: { ! 214: register int i; ! 215: static vsCursor vsc; ! 216: static vsBox vsm; ! 217: static vsEventQueue vsq = { ! 218: NULL, ! 219: 0, ! 220: 0, ! 221: 0, ! 222: }; ! 223: struct screen sc; ! 224: ! 225: win_screenget(vsdev, &sc); ! 226: info->height = sc.scr_rect.r_height; ! 227: info->width = sc.scr_rect.r_width; ! 228: if (parent) { ! 229: /* running under "overview" */ ! 230: win_setrect(vsdev, &sc.scr_rect); ! 231: } ! 232: { ! 233: struct fbtype fbt; ! 234: int fd = open(sc.scr_fbname, O_RDWR, 0); ! 235: ! 236: if (fd < 0 || ioctl(fd, FBIOGTYPE, &fbt) < 0) { ! 237: if (fd < 0) ! 238: fprintf(stderr, "Can't open fb %s\n", sc.scr_fbname); ! 239: else ! 240: fprintf(stderr, "Can't FBIOGTYPE on %s\n", sc.scr_fbname); ! 241: return (-1); ! 242: } ! 243: close(fd); ! 244: info->id = fbt.fb_type + SUN_BASE; ! 245: info->planes = fbt.fb_depth; ! 246: info->entries = fbt.fb_cmsize; ! 247: } ! 248: Display = pw_open(vsdev); ! 249: PixRect = Display->pw_pixrect; ! 250: pw_reversevideo(Display,0,1); ! 251: { ! 252: struct inputmask im; ! 253: ! 254: input_imnull(&im); ! 255: im.im_flags = IM_ASCII | IM_META | IM_NEGEVENT; ! 256: win_setinputcodebit(&im, LOC_MOVE); ! 257: win_setinputcodebit(&im, MS_LEFT); ! 258: win_setinputcodebit(&im, MS_MIDDLE); ! 259: win_setinputcodebit(&im, MS_RIGHT); ! 260: win_setinputmask(vsdev, &im, NULL, WIN_NULLLINK); ! 261: } ! 262: if (fcntl(vsdev, F_SETFL, O_NDELAY) < 0) ! 263: return (-1); ! 264: { ! 265: /* Following struct cannot be included from win_cursor.h */ ! 266: struct cursor { ! 267: short cur_xhot, cur_yhot; /* offset of mouse position from shape*/ ! 268: int cur_function; /* relationship of shape to screen */ ! 269: struct pixrect *cur_shape; /* memory image to use */ ! 270: int flags; /* various options */ ! 271: ! 272: short horiz_hair_thickness; /* horizontal crosshair height */ ! 273: int horiz_hair_op; /* drawing op */ ! 274: int horiz_hair_color; /* color */ ! 275: short horiz_hair_length; /* width */ ! 276: short horiz_hair_gap; /* gap */ ! 277: ! 278: short vert_hair_thickness; /* vertical crosshair width */ ! 279: int vert_hair_op; /* drawing op */ ! 280: int vert_hair_color; /* color */ ! 281: short vert_hair_length; /* height */ ! 282: short vert_hair_gap; /* gap */ ! 283: } cs; ! 284: static struct pixrect pr; ! 285: ! 286: cs.cur_xhot = cs.cur_yhot = cs.cur_function = 0; ! 287: cs.flags = 0; ! 288: cs.cur_shape = ≺ ! 289: pr.pr_size.x = pr.pr_size.y = 0; ! 290: win_setcursor(vsdev, &cs); ! 291: win_setmouseposition(vsdev, info->width >> 1, info->height >> 1); ! 292: } ! 293: info->mouse = &vsc; ! 294: info->mbox = &vsm; ! 295: info->queue = &vsq; ! 296: Define_input_handler(InputReader); ! 297: SetUpInvPix(); ! 298: CurrentDevice = info; ! 299: #ifdef notdef ! 300: StartShell(); ! 301: #endif ! 302: return (0); ! 303: } ! 304: ! 305: /* Check if display is dead */ ! 306: ! 307: DisplayDead () ! 308: { ! 309: return(0); ! 310: } ! 311: ! 312: /* the presumption here is that only one Allocate_space call is made/request */ ! 313: ! 314: #define ABUFSIZE 3072 ! 315: static char ABuffer[3072]; /* random size buffer for allocate space */ ! 316: caddr_t AllocateSpace (size) ! 317: register int size; ! 318: { ! 319: if (size < ABUFSIZE) return(ABuffer); ! 320: errno = ENOMEM; ! 321: return (NULL); ! 322: } ! 323: ! 324: /* XXX - should be static data */ ! 325: SetUpInvPix() ! 326: { ! 327: register int i; ! 328: ! 329: for (i = 255; i >= 0; i--) { ! 330: register int j = 1, k = 128, l = 8; ! 331: ! 332: while (l--) { ! 333: if ((i & j) != 0) ! 334: InvPix[i] |= k; ! 335: j <<= 1; ! 336: k >>= 1; ! 337: } ! 338: } ! 339: } ! 340: ! 341: #ifdef notdef ! 342: Setenv (var, value) ! 343: /* ! 344: sets the value of var to be arg in the Unix 4.2 BSD environment env. ! 345: Var should end with '='. ! 346: (bindings are of the form "var=value") ! 347: This procedure assumes the memory for the first level of environ ! 348: was allocated using malloc. ! 349: */ ! 350: register char *var, *value; ! 351: { ! 352: extern char **environ; ! 353: register int index = 0; ! 354: ! 355: while (environ[index] != NULL) { ! 356: if (strncmp(environ[index], var, strlen(var)) == 0) { ! 357: /* found it */ ! 358: environ[index] = (char *) malloc(strlen(var) + strlen(value)); ! 359: strcpy(environ[index], var); ! 360: strcat(environ[index], value); ! 361: return; ! 362: } ! 363: index++; ! 364: } ! 365: ! 366: if ((environ = (char **) realloc(environ, sizeof(char *) * ! 367: (index + 2))) == NULL) { ! 368: fprintf(stderr, "Setenv: malloc out of memory\n"); ! 369: exit(1); ! 370: } ! 371: ! 372: environ[index] = (char *) malloc(strlen(var) + strlen(value)); ! 373: strcpy(environ[index], var); ! 374: strcat(environ[index], value); ! 375: environ[++index] = NULL; ! 376: } ! 377: #endif ! 378: #endif sun
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.