|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ T i ┃
Length: 12489 (0x30c9) Types: TextFile Names: »initial.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─ ⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z« └─⟦2109abc41⟧ └─ ⟦this⟧ »./X.V10R4/libsun/initial.c«
#ifndef lint static char *rcsid = "$Header: initial.c,v 10.6 86/12/17 20:34:22 swick Exp $"; #endif lint #ifdef sun /* * The Sun X drivers are a product of Sun Microsystems, Inc. and are provided * for unrestricted use provided that this legend is included on all tape * media and as a part of the software program in whole or part. Users * may copy or modify these drivers without charge, but are not authorized * to license or distribute them to anyone else except as part of a product or * program developed by the user. * * THE SUN X DRIVERS ARE PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND * INCLUDING THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A * PARTICULAR PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE * PRACTICE. * * The Sun X Drivers are provided with no support and without any obligation * on the part of Sun Microsystems, Inc. to assist in their use, correction, * modification or enhancement. * * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THE SUN X * DRIVERS OR ANY PART THEREOF. * * In no event will Sun Microsystems, Inc. be liable for any lost revenue * or profits or other special, indirect and consequential damages, even if * Sun has been advised of the possibility of such damages. * * Sun Microsystems, Inc. * 2550 Garcia Avenue * Mountain View, California 94043 */ #ifndef lint static char sccsid[] = "@(#)initial.c 1.2 86/08/26 Copyright 1986 Sun Micro"; #endif /*- * Copyright 1985, Massachusetts Institute of Technology * Copyright (c) 1986 by Sun Microsystems, Inc. */ /* initial.c Routines to open & close display * * OpenDisplay Open it * InitDisplay Download it * DisplayDead Check if dead * Allocate_space Allocate some temporary storage * */ /* * ToDo: * Look in environment/defaults for programs to start */ #include <stdio.h> #include <fcntl.h> #include <errno.h> #include <sys/time.h> #include <sys/ioctl.h> #include <sys/signal.h> #include <sun/fbio.h> #include "Xsun.h" #include <pixrect/pixrect_hs.h> #include <sunwindow/rect.h> #include <sunwindow/rectlist.h> #include <sunwindow/pixwin.h> #include <sunwindow/win_screen.h> #include <sunwindow/win_struct.h> #include <sunwindow/win_input.h> #include <sundev/kbd.h> #include <sundev/kbio.h> extern int InputReader(); struct pixwin *Display; struct pixrect *PixRect; u_char InvPix[256]; short Sun_From_X_Op[] = { PIX_CLR, /* GXclear */ PIX_SRC&PIX_DST, /* GXand */ PIX_SRC&PIX_NOT(PIX_DST), /* GXandReverse */ PIX_SRC, /* GXcopy */ PIX_NOT(PIX_SRC)&PIX_DST, /* GXandInverted */ PIX_DST, /* GXnoop */ PIX_SRC^PIX_DST, /* GXxor */ PIX_SRC|PIX_DST, /* GXor */ PIX_NOT(PIX_SRC)&PIX_NOT(PIX_DST), /* GXnor */ PIX_NOT(PIX_SRC)^PIX_DST, /* GXequiv */ PIX_NOT(PIX_DST), /* GXinvert */ PIX_SRC|PIX_NOT(PIX_DST), /* GXorReverse */ PIX_NOT(PIX_SRC), /* GXcopyInverted */ PIX_NOT(PIX_SRC)|PIX_DST, /* GXorInverted */ PIX_NOT(PIX_SRC)|PIX_NOT(PIX_DST), /* GXnand */ PIX_SET, /* GXset */ }; int vsdev = -1; extern int errno; DEVICE *CurrentDevice; #define PARENT "WINDOW_GFX" /* Open the display */ static char *parent; #ifdef RAW_KBD struct kiockey sunkeymap[128*5]; #endif /*ARGSUSED*/ OpenDisplay (devname) char *devname; { struct screen sc; extern char *getenv(); signal (SIGWINCH, SIG_IGN); parent = getenv(PARENT); bzero((caddr_t) & sc, sizeof sc); if (*devname != '/') devname = "/dev/fb"; strncpy(sc.scr_fbname, devname, SCR_NAMESIZE); if (parent) { /* Running under "overview" */ int pfd; if ((pfd = open(parent, 2, 0)) < 0) { fprintf(stderr, "Can't open parent %s\n", parent); return (-1); } vsdev = win_getnewwindow(); win_setlink(vsdev, WL_PARENT, win_fdtonumber(pfd)); win_insert(vsdev); close(pfd); } else { /* Running alone */ vsdev = win_screennew(&sc); } return (vsdev); } /* Do sun specific initialization */ #ifdef notdef static int pid; #define XTERM "xterm" static char *args[] = { XTERM, "=80x24+30+30", "-C", "-n", "console", 0, }; #include <sys/wait.h> static SigChildHandler() { register int dead; union wait status; while ((dead = wait3(&status, WNOHANG, NULL)) > 0) { if (dead == pid) { exit(0); } } } static StartShell() { signal(SIGCHLD, SigChildHandler); if ((pid = fork()) == 0) { { register int i = getdtablesize(); while (--i >= 0) { close(i); } } open("/dev/null", 2, 0); dup(0); dup(0); { /* Copy the environment for Setenv */ extern char **environ; register int i = 0; char **envnew; while (environ[i] != NULL) i++; envnew = (char **) malloc(sizeof(char *) * (i + 1)); for (; i >= 0; i--) envnew[i] = environ[i]; environ = envnew; } { #define HOSTNAMESIZE 128 char DisplayName[HOSTNAMESIZE]; gethostname(DisplayName, HOSTNAMESIZE); strcat(DisplayName, ":0"); Setenv("DISPLAY=", DisplayName); #undef HOSTNAMESIZE } execvp(XTERM, args); _exit(1); } } #endif InitDisplay (info) register DEVICE *info; { register int i; static vsCursor vsc; static vsBox vsm; static vsEventQueue vsq = { NULL, 0, 0, 0, }; struct screen sc; win_screenget(vsdev, &sc); info->height = sc.scr_rect.r_height; info->width = sc.scr_rect.r_width; if (parent) { /* running under "overview" */ win_setrect(vsdev, &sc.scr_rect); } { struct fbtype fbt; int fd = open(sc.scr_fbname, O_RDWR, 0); if (fd < 0 || ioctl(fd, FBIOGTYPE, &fbt) < 0) { if (fd < 0) fprintf(stderr, "Can't open fb %s\n", sc.scr_fbname); else fprintf(stderr, "Can't FBIOGTYPE on %s\n", sc.scr_fbname); return (-1); } close(fd); info->id = fbt.fb_type + SUN_BASE; info->planes = fbt.fb_depth; info->entries = fbt.fb_cmsize; } Display = pw_open(vsdev); PixRect = Display->pw_pixrect; pw_reversevideo(Display,0,1); { struct inputmask im; struct kiockey kk; int kbfd, i = 0; if ((kbfd = open("/dev/kbd", O_RDWR, 0)) >= 0) { #ifdef RAW_KBD struct kiockey ok; for (i = 0; i < 0200; ++i) { ok.kio_station = kk.kio_station = kk.kio_entry = i; ok.kio_tablemask = kk.kio_tablemask = 0; ioctl(kbfd, KIOCGETKEY, &ok); sunkeymap[i] = ok; /* * If I am a shift key then remap past what * kbd.c knows about so no mapping is done * Only shift keys can be used the with UPMASK * due to assumptions in sun's kernel */ if ((ok.kio_entry & 0xf0) == SHIFTKEYS) { switch (ok.kio_entry) { default: case SHIFTKEYS+CAPSLOCK: kk.kio_entry = SHIFTKEYS+10; break; case SHIFTKEYS+SHIFTLOCK: kk.kio_entry = SHIFTKEYS+13; break; case SHIFTKEYS+LEFTSHIFT: kk.kio_entry = SHIFTKEYS+11; break; case SHIFTKEYS+RIGHTSHIFT: kk.kio_entry = SHIFTKEYS+14; break; case SHIFTKEYS+LEFTCTRL: kk.kio_entry = SHIFTKEYS+12; break; case SHIFTKEYS+RIGHTCTRL: kk.kio_entry = SHIFTKEYS+15; break; } } else if (ok.kio_entry == BUCKYBITS+METABIT) kk.kio_entry = SHIFTKEYS+09; else if (ok.kio_entry == BUCKYBITS+SYSTEMBIT) kk.kio_entry = ok.kio_entry; ioctl(kbfd, KIOCSETKEY, &kk); ok.kio_tablemask = kk.kio_tablemask = CTRLMASK; ioctl(kbfd, KIOCGETKEY, &ok); sunkeymap[i+00200] = ok; ok.kio_tablemask = kk.kio_tablemask = CAPSMASK; ioctl(kbfd, KIOCGETKEY, &ok); sunkeymap[i+00400] = ok; ok.kio_tablemask = kk.kio_tablemask = SHIFTMASK; ioctl(kbfd, KIOCGETKEY, &ok); sunkeymap[i+00600] = ok; ok.kio_tablemask = kk.kio_tablemask = UPMASK; ioctl(kbfd, KIOCGETKEY, &ok); sunkeymap[i+01000] = ok; if ((kk.kio_entry & 0xf0) == SHIFTKEYS) ioctl(kbfd, KIOCSETKEY, &kk); } #else kk.kio_tablemask = 0; kk.kio_entry = ~(SHIFTKEYS+CAPSLOCK); do { kk.kio_station = i++; ioctl(kbfd, KIOCGETKEY, &kk); } while ( i < 128 && kk.kio_entry != SHIFTKEYS+CAPSLOCK); if (kk.kio_entry == SHIFTKEYS+CAPSLOCK) { kk.kio_tablemask = UPMASK; ioctl(kbfd, KIOCSETKEY, &kk); kk.kio_tablemask = CTRLMASK; ioctl(kbfd, KIOCSETKEY, &kk); kk.kio_tablemask = CAPSMASK; ioctl(kbfd, KIOCSETKEY, &kk); kk.kio_tablemask = SHIFTMASK; ioctl(kbfd, KIOCSETKEY, &kk); } #endif close(kbfd); } input_imnull(&im); im.im_flags = IM_ASCII | IM_META | IM_NEGEVENT; win_setinputcodebit(&im, LOC_MOVE); win_setinputcodebit(&im, MS_LEFT); win_setinputcodebit(&im, MS_MIDDLE); win_setinputcodebit(&im, MS_RIGHT); #ifdef RAW_KBD win_setinputcodebit(&im, VKEY_FIRSTSHIFT+9); win_setinputcodebit(&im, VKEY_FIRSTSHIFT+10); win_setinputcodebit(&im, VKEY_FIRSTSHIFT+11); win_setinputcodebit(&im, VKEY_FIRSTSHIFT+12); win_setinputcodebit(&im, VKEY_FIRSTSHIFT+13); win_setinputcodebit(&im, VKEY_FIRSTSHIFT+14); win_setinputcodebit(&im, VKEY_FIRSTSHIFT+15); #else win_setinputcodebit(&im, SHIFT_CAPSLOCK); #endif win_setinputmask(vsdev, &im, NULL, WIN_NULLLINK); } if (fcntl(vsdev, F_SETFL, O_NDELAY) < 0) return (-1); { /* Following struct cannot be included from win_cursor.h */ struct cursor { short cur_xhot, cur_yhot; /* offset of mouse position from shape*/ int cur_function; /* relationship of shape to screen */ struct pixrect *cur_shape; /* memory image to use */ int flags; /* various options */ short horiz_hair_thickness; /* horizontal crosshair height */ int horiz_hair_op; /* drawing op */ int horiz_hair_color; /* color */ short horiz_hair_length; /* width */ short horiz_hair_gap; /* gap */ short vert_hair_thickness; /* vertical crosshair width */ int vert_hair_op; /* drawing op */ int vert_hair_color; /* color */ short vert_hair_length; /* height */ short vert_hair_gap; /* gap */ } cs; static struct pixrect pr; cs.cur_xhot = cs.cur_yhot = cs.cur_function = 0; cs.flags = 0; cs.cur_shape = ≺ pr.pr_size.x = pr.pr_size.y = 0; win_setcursor(vsdev, &cs); win_setmouseposition(vsdev, info->width >> 1, info->height >> 1); } info->mouse = &vsc; info->mbox = &vsm; info->queue = &vsq; Define_input_handler(InputReader); SetUpInvPix(); CurrentDevice = info; #ifdef notdef StartShell(); #endif return (0); } /* Check if display is dead */ DisplayDead () { #ifdef RAW_KBD int i; int kbfd = open("/dev/kbd", O_RDWR, 0); for (i = 0; i < 0200; ++i) { ioctl(kbfd, KIOCSETKEY, &sunkeymap[i]); if ((sunkeymap[i].kio_entry & 0xf0) == SHIFTKEYS) ioctl(kbfd, KIOCSETKEY, &sunkeymap[i+01000]); else if (sunkeymap[i].kio_entry == BUCKYBITS+METABIT) ioctl(kbfd, KIOCSETKEY, &sunkeymap[i+01000]); } close(kbfd); #endif return(0); } /* the presumption here is that only one Allocate_space call is made/request */ #define ABUFSIZE 3072 static char ABuffer[3072]; /* random size buffer for allocate space */ caddr_t AllocateSpace (size) register int size; { if (size < ABUFSIZE) return(ABuffer); errno = ENOMEM; return (NULL); } /* XXX - should be static data */ SetUpInvPix() { register int i; for (i = 255; i >= 0; i--) { register int j = 1, k = 128, l = 8; while (l--) { if ((i & j) != 0) InvPix[i] |= k; j <<= 1; k >>= 1; } } } #ifdef notdef Setenv (var, value) /* sets the value of var to be arg in the Unix 4.2 BSD environment env. Var should end with '='. (bindings are of the form "var=value") This procedure assumes the memory for the first level of environ was allocated using malloc. */ register char *var, *value; { extern char **environ; register int index = 0; while (environ[index] != NULL) { if (strncmp(environ[index], var, strlen(var)) == 0) { /* found it */ environ[index] = (char *) malloc(strlen(var) + strlen(value)); strcpy(environ[index], var); strcat(environ[index], value); return; } index++; } if ((environ = (char **) realloc(environ, sizeof(char *) * (index + 2))) == NULL) { fprintf(stderr, "Setenv: malloc out of memory\n"); exit(1); } environ[index] = (char *) malloc(strlen(var) + strlen(value)); strcpy(environ[index], var); strcat(environ[index], value); environ[++index] = NULL; } #endif #endif sun