Annotation of 43BSD/contrib/X/libsun/initial.c, revision 1.1.1.1

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 = &pr;
                    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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.