Annotation of researchv9/X11/src/X.V11R1/server/ddx/sun/sunInit.c, revision 1.1.1.1

1.1       root        1: /*-
                      2:  * sunInit.c --
                      3:  *     Initialization functions for screen/keyboard/mouse, etc.
                      4:  *
                      5:  * Copyright (c) 1987 by the Regents of the University of California
                      6:  *
                      7:  * Permission to use, copy, modify, and distribute this
                      8:  * software and its documentation for any purpose and without
                      9:  * fee is hereby granted, provided that the above copyright
                     10:  * notice appear in all copies.  The University of California
                     11:  * makes no representations about the suitability of this
                     12:  * software for any purpose.  It is provided "as is" without
                     13:  * express or implied warranty.
                     14:  *
                     15:  *
                     16:  */
                     17: 
                     18: /************************************************************
                     19: Copyright 1987 by Sun Microsystems, Inc. Mountain View, CA.
                     20: 
                     21:                     All Rights Reserved
                     22: 
                     23: Permission  to  use,  copy,  modify,  and  distribute   this
                     24: software  and  its documentation for any purpose and without
                     25: fee is hereby granted, provided that the above copyright no-
                     26: tice  appear  in all copies and that both that copyright no-
                     27: tice and this permission notice appear in  supporting  docu-
                     28: mentation,  and  that the names of Sun or MIT not be used in
                     29: advertising or publicity pertaining to distribution  of  the
                     30: software  without specific prior written permission. Sun and
                     31: M.I.T. make no representations about the suitability of this
                     32: software for any purpose. It is provided "as is" without any
                     33: express or implied warranty.
                     34: 
                     35: SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
                     36: INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
                     37: NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
                     38: ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
                     39: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
                     40: PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
                     41: OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
                     42: THE USE OR PERFORMANCE OF THIS SOFTWARE.
                     43: 
                     44: ********************************************************/
                     45: 
                     46: #ifndef        lint
                     47: static char sccsid[] = "%W %G Copyright 1987 Sun Micro";
                     48: #endif
                     49: 
                     50: #include    "sun.h"
                     51: #include    <servermd.h>
                     52: #include    "dixstruct.h"
                     53: #include    "dix.h"
                     54: #include    "opaque.h"
                     55: 
                     56: extern int sunMouseProc();
                     57: extern void sunKbdProc();
                     58: extern Bool sunBW2Probe();
                     59: extern Bool sunCG2CProbe();
                     60: extern Bool sunCG4CProbe();
                     61: extern void ProcessInputEvents();
                     62: 
                     63: extern void SetInputCheck();
                     64: extern char *strncpy();
                     65: extern GCPtr CreateScratchGC();
                     66: 
                     67: #define        XDEVICE "XDEVICE"
                     68: #define        PARENT  "WINDOW_GFX"
                     69: 
                     70: int sunSigIO = 0;       /* For use with SetInputCheck */
                     71: 
                     72:        /* What should this *really* be? */
                     73: #define MOTION_BUFFER_SIZE 0
                     74: 
                     75: /*-
                     76:  *-----------------------------------------------------------------------
                     77:  * SigIOHandler --
                     78:  *     Signal handler for SIGIO - input is available.
                     79:  *
                     80:  * Results:
                     81:  *     isItTimeToYield is set - ProcessInputEvents() will be called soon.
                     82:  *
                     83:  * Side Effects:
                     84:  *     None
                     85:  *
                     86:  *-----------------------------------------------------------------------
                     87:  */
                     88: /*ARGSUSED*/
                     89: static void
                     90: SigIOHandler(sig, code, scp)
                     91:     int                code;
                     92:     int                sig;
                     93:     struct sigcontext *scp;
                     94: {
                     95:     sunSigIO++;
                     96:     isItTimeToYield++;
                     97: }
                     98: 
                     99: /*
                    100:  * ZOIDS should only ever be defined if SUN_WINDOWS is also defined.
                    101:  */
                    102: #ifdef ZOIDS
                    103: sunFbDataRec sunFbData[] = {
                    104:     sunBW2Probe,       "/dev/bwtwo0",      neverProbed,        0, 0,
                    105:     sunCG2CProbe,      "/dev/cgtwo0",      neverProbed,        0, 0,
                    106:     sunCG4CProbe,      "/dev/cgfour0",     neverProbed,        0, 0,
                    107: };
                    108: #else  ZOIDS
                    109: sunFbDataRec sunFbData[] = {
                    110:     sunBW2Probe,       "/dev/bwtwo0",      neverProbed,
                    111:     sunCG2CProbe,      "/dev/cgtwo0",      neverProbed,
                    112:     sunCG4CProbe,      "/dev/cgfour0",     neverProbed,
                    113: };
                    114: #endif ZOIDS
                    115: 
                    116: /*
                    117:  * NUMSCREENS is the number of supported frame buffers (i.e. the number of
                    118:  * structures in sunFbData which have an actual probeProc).
                    119:  */
                    120: #define NUMSCREENS (sizeof(sunFbData)/sizeof(sunFbData[0]))
                    121: #define NUMDEVICES 2
                    122: 
                    123: fbFd   sunFbs[NUMSCREENS];  /* Space for descriptors of open frame buffers */
                    124: 
                    125: static PixmapFormatRec formats[] = {
                    126:     1, 1, BITMAP_SCANLINE_PAD, /* 1-bit deep */
                    127:     8, 8, BITMAP_SCANLINE_PAD, /* 8-bit deep */
                    128: };
                    129: #define NUMFORMATS     (sizeof formats)/(sizeof formats[0])
                    130: 
                    131: /*-
                    132:  *-----------------------------------------------------------------------
                    133:  * InitOutput --
                    134:  *     Initialize screenInfo for all actually accessible framebuffers.
                    135:  *     The
                    136:  *
                    137:  * Results:
                    138:  *     screenInfo init proc field set
                    139:  *
                    140:  * Side Effects:
                    141:  *     None
                    142:  *
                    143:  *-----------------------------------------------------------------------
                    144:  */
                    145: 
                    146: InitOutput(pScreenInfo, argc, argv)
                    147:     ScreenInfo           *pScreenInfo;
                    148:     int          argc;
                    149:     char         **argv;
                    150: {
                    151:     int          i, index, ac = argc;
                    152:     char         **av = argv;
                    153:     int                  nonBlockConsole = 1;
                    154: 
                    155:     while (ac--) {
                    156:        if (!strcmp(*av,"-debug")) {
                    157:            nonBlockConsole = 0;
                    158:            break;
                    159:        }
                    160:        av++;
                    161:     }
                    162:     /*
                    163:      * Writes to /dev/console can block - causing an
                    164:      * excess of error messages to hang the server in
                    165:      * deadlock.  So.......
                    166:      */
                    167:     if (nonBlockConsole && (fcntl(2, F_SETFL, O_NDELAY) < 0)) {
                    168:        perror("fcntl");
                    169:        ErrorF("InitOutput: can't put stderr in non-block mode\n");
                    170:     }
                    171:     pScreenInfo->imageByteOrder = IMAGE_BYTE_ORDER;
                    172:     pScreenInfo->bitmapScanlineUnit = BITMAP_SCANLINE_UNIT;
                    173:     pScreenInfo->bitmapScanlinePad = BITMAP_SCANLINE_PAD;
                    174:     pScreenInfo->bitmapBitOrder = BITMAP_BIT_ORDER;
                    175: 
                    176:     pScreenInfo->numPixmapFormats = NUMFORMATS;
                    177:     for (i=0; i< NUMFORMATS; i++)
                    178:     {
                    179:         pScreenInfo->formats[i] = formats[i];
                    180:     }
                    181: 
                    182:     for (i = 0, index = 0; i < NUMSCREENS; i++) {
                    183:        if ((* sunFbData[i].probeProc) (pScreenInfo, index, i, argc, argv)) {
                    184:            /* This display exists OK */
                    185:            index++;
                    186:        } else {
                    187:            /* This display can't be opened */
                    188:            ;
                    189:        }
                    190:     }
                    191:     if (index == 0)
                    192:        FatalError("Can't find any displays\n");
                    193: 
                    194:     pScreenInfo->numScreens = index;
                    195: 
                    196:     sunInitCursor();
                    197:     signal(SIGWINCH, SIG_IGN);
                    198: }
                    199: 
                    200: /*-
                    201:  *-----------------------------------------------------------------------
                    202:  * InitInput --
                    203:  *     Initialize all supported input devices...what else is there
                    204:  *     besides pointer and keyboard?
                    205:  *
                    206:  * Results:
                    207:  *     None.
                    208:  *
                    209:  * Side Effects:
                    210:  *     Two DeviceRec's are allocated and registered as the system pointer
                    211:  *     and keyboard devices.
                    212:  *
                    213:  *-----------------------------------------------------------------------
                    214:  */
                    215: /*ARGSUSED*/
                    216: InitInput(argc, argv)
                    217:     int          argc;
                    218:     char         **argv;
                    219: {
                    220:     DevicePtr p, k;
                    221:     static int  zero = 0;
                    222:     
                    223:     p = AddInputDevice(sunMouseProc, TRUE);
                    224:     k = AddInputDevice(sunKbdProc, TRUE);
                    225: 
                    226:     RegisterPointerDevice(p, MOTION_BUFFER_SIZE);
                    227:     RegisterKeyboardDevice(k);
                    228:     signal(SIGIO, SigIOHandler);
                    229: 
                    230:     SetInputCheck (&zero, &isItTimeToYield);
                    231: }
                    232: 
                    233: /*-
                    234:  *-----------------------------------------------------------------------
                    235:  * sunQueryBestSize --
                    236:  *     Supposed to hint about good sizes for things.
                    237:  *
                    238:  * Results:
                    239:  *     Perhaps change *pwidth (Height irrelevant)
                    240:  *
                    241:  * Side Effects:
                    242:  *     None.
                    243:  *
                    244:  *-----------------------------------------------------------------------
                    245:  */
                    246: /*ARGSUSED*/
                    247: void
                    248: sunQueryBestSize(class, pwidth, pheight)
                    249: int class;
                    250: short *pwidth;
                    251: short *pheight;
                    252: {
                    253:     unsigned width, test;
                    254: 
                    255:     switch(class)
                    256:     {
                    257:       case CursorShape:
                    258:       case TileShape:
                    259:       case StippleShape:
                    260:          width = *pwidth;
                    261:          if (width > 0) {
                    262:              /* Return the closes power of two not less than what they gave me */
                    263:              test = 0x80000000;
                    264:              /* Find the highest 1 bit in the width given */
                    265:              while(!(test & width))
                    266:                 test >>= 1;
                    267:              /* If their number is greater than that, bump up to the next
                    268:               *  power of two */
                    269:              if((test - 1) & width)
                    270:                 test <<= 1;
                    271:              *pwidth = test;
                    272:          }
                    273:          /* We don't care what height they use */
                    274:          break;
                    275:     }
                    276: }
                    277: 
                    278: /*-
                    279:  *-----------------------------------------------------------------------
                    280:  * sunScreenInit --
                    281:  *     Things which must be done for all types of frame buffers...
                    282:  *     Should be called last of all.
                    283:  *
                    284:  * Results:
                    285:  *     None.
                    286:  *
                    287:  * Side Effects:
                    288:  *     The graphics context for the screen is created. The CreateGC,
                    289:  *     CreateWindow and ChangeWindowAttributes vectors are changed in
                    290:  *     the screen structure.
                    291:  *
                    292:  *     Both a BlockHandler and a WakeupHandler are installed for the
                    293:  *     first screen.  Together, these handlers implement autorepeat
                    294:  *     keystrokes on the Sun.
                    295:  *
                    296:  *-----------------------------------------------------------------------
                    297:  */
                    298: void
                    299: sunScreenInit (pScreen)
                    300:     ScreenPtr    pScreen;
                    301: {
                    302:     fbFd         *fb;
                    303:     DrawablePtr          pDrawable;
                    304:     extern void   sunBlockHandler();
                    305:     extern void   sunWakeupHandler();
                    306:     static       autoRepeatHandlersInstalled = FALSE;
                    307:     static ScreenPtr autoRepeatScreen;
                    308: 
                    309:     fb = &sunFbs[pScreen->myNum];
                    310: 
                    311:     /*
                    312:      * Prepare the GC for cursor functions on this screen.
                    313:      * Do this before setting interceptions to avoid looping when
                    314:      * putting down the cursor...
                    315:      */
                    316:     pDrawable = (DrawablePtr)(pScreen->devPrivate);
                    317: 
                    318:     fb->pGC = CreateScratchGC (pDrawable->pScreen, pDrawable->depth);
                    319: 
                    320:     /*
                    321:      * By setting graphicsExposures false, we prevent any expose events
                    322:      * from being generated in the CopyArea requests used by the cursor
                    323:      * routines.
                    324:      */
                    325:     fb->pGC->graphicsExposures = FALSE;
                    326: 
                    327:     /*
                    328:      * Preserve the "regular" functions
                    329:      */
                    330:     fb->CreateGC =                     pScreen->CreateGC;
                    331:     fb->CreateWindow =                         pScreen->CreateWindow;
                    332:     fb->ChangeWindowAttributes =       pScreen->ChangeWindowAttributes;
                    333:     fb->GetImage =                     pScreen->GetImage;
                    334:     fb->GetSpans =                     pScreen->GetSpans;
                    335: 
                    336:     /*
                    337:      * Interceptions
                    338:      */
                    339:     pScreen->CreateGC =                        sunCreateGC;
                    340:     pScreen->CreateWindow =            sunCreateWindow;
                    341:     pScreen->ChangeWindowAttributes =  sunChangeWindowAttributes;
                    342:     pScreen->QueryBestSize =           sunQueryBestSize;
                    343:     pScreen->GetImage =                        sunGetImage;
                    344:     pScreen->GetSpans =                        sunGetSpans;
                    345: 
                    346:     /*
                    347:      * Cursor functions
                    348:      */
                    349:     pScreen->RealizeCursor =           sunRealizeCursor;
                    350:     pScreen->UnrealizeCursor =         sunUnrealizeCursor;
                    351:     pScreen->DisplayCursor =           sunDisplayCursor;
                    352:     pScreen->SetCursorPosition =       sunSetCursorPosition;
                    353:     pScreen->CursorLimits =            sunCursorLimits;
                    354:     pScreen->PointerNonInterestBox =   sunPointerNonInterestBox;
                    355:     pScreen->ConstrainCursor =                 sunConstrainCursor;
                    356:     pScreen->RecolorCursor =           sunRecolorCursor;
                    357: 
                    358:     /*
                    359:      * Block/Unblock handlers
                    360:      */
                    361:     if (autoRepeatHandlersInstalled == FALSE) {
                    362:        autoRepeatScreen = pScreen;
                    363:        autoRepeatHandlersInstalled = TRUE;
                    364:     }
                    365: 
                    366:     if (pScreen == autoRepeatScreen) {
                    367:         pScreen->BlockHandler = sunBlockHandler;
                    368:         pScreen->WakeupHandler = sunWakeupHandler;
                    369:     }
                    370: 
                    371: }
                    372: 
                    373: extern char *getenv();
                    374: 
                    375: /*-
                    376:  *-----------------------------------------------------------------------
                    377:  * nthdev --
                    378:  *     Return the nth device in a colon-separated list of devices.
                    379:  *     n is 0-origin.
                    380:  *
                    381:  * Results:
                    382:  *     A pointer to a STATIC string which is the device name.
                    383:  *
                    384:  * Side Effects:
                    385:  *     None.
                    386:  *
                    387:  *-----------------------------------------------------------------------
                    388:  */
                    389: static char *
                    390: nthdev (dList, n)
                    391:     register char    *dList;       /* Colon-separated device names */
                    392:     int            n;              /* Device number wanted */
                    393: {
                    394:     char *result;
                    395:     static char returnstring[100];
                    396: 
                    397:     while (n--) {
                    398:        while (*dList && *dList != ':') {
                    399:            dList++;
                    400:        }
                    401:     }
                    402:     if (*dList) {
                    403:        register char *cp = dList;
                    404: 
                    405:        while (*cp && *cp != ':') {
                    406:            cp++;
                    407:        }
                    408:        result = returnstring;
                    409:        strncpy (result, dList, cp - dList);
                    410:        result[cp - dList] = '\0';
                    411:     } else {
                    412:        result = (char *)0;
                    413:     }
                    414:     return (result);
                    415: }
                    416: 
                    417: /*-
                    418:  *-----------------------------------------------------------------------
                    419:  * sunOpenFrameBuffer --
                    420:  *     Open a frame buffer according to several rules. If running under
                    421:  *     overview and we're set up for it, use the device given in the
                    422:  *     PARENT envariable and note that the screen is under overview.
                    423:  *     Else find the device to use by looking in the sunFbData table,
                    424:  *     an XDEVICE envariable, a -dev switch or using /dev/fb if trying
                    425:  *     to open screen 0 and all else has failed.
                    426:  *
                    427:  * Results:
                    428:  *     The fd of the framebuffer.
                    429:  *
                    430:  * Side Effects:
                    431:  *
                    432:  *-----------------------------------------------------------------------
                    433:  */
                    434: int
                    435: sunOpenFrameBuffer(expect, pfbType, index, fbNum, argc, argv)
                    436:     int                  expect;       /* The expected type of framebuffer */
                    437:     struct fbtype *pfbType;    /* Place to store the fb info */
                    438:     int                  fbNum;        /* Index into the sunFbData array */
                    439:     int                  index;        /* Screen index */
                    440:     int                  argc;         /* Command-line arguments... */
                    441:     char         **argv;       /* ... */
                    442: {
                    443:     char                 *name=(char *)0;
                    444:     int           i;           /* Index into argument list */
                    445:     int           fd = -1;             /* Descriptor to device */
                    446:     static int   devFbUsed=FALSE;  /* true if /dev/fb has been used for a */
                    447:                                    /* screen already */
                    448:     static Bool          inited = FALSE;
                    449:     static char          *xdevice;     /* string of devices to use from environ */
                    450:     static char          *devsw;       /* string of devices from args */
                    451: 
                    452:     sunFbs[index].parent = FALSE;
                    453: 
                    454:     if (!inited) {
                    455:        xdevice = devsw = (char *)NULL;
                    456: 
                    457:        xdevice = getenv (XDEVICE);
                    458:        /*
                    459:         * Look for an argument of the form -dev <device-string>
                    460:         * If such a one is found place the <device-string> in devsw.
                    461:         */
                    462:        for (i = 1; i < argc; i++) {
                    463:            if ((strcmp(argv[i], "-dev") == 0) && (i + 1 < argc)) {
                    464:                devsw = argv[i+1];
                    465:                break;
                    466:            }
                    467:        }
                    468:        inited = TRUE;
                    469:     }
                    470: 
                    471:     /*
                    472:      * Attempt to find a file name for the frame buffer 
                    473:      */
                    474: 
                    475:     /*
                    476:      * First see if any device was given on the command line.
                    477:      * If one was and the device is both readable and writeable,
                    478:      * set 'name' to it, else set it to NULL.
                    479:      */
                    480:     if (devsw == (char *)NULL ||
                    481:        (name = nthdev (devsw, index)) == (char *)NULL ||
                    482:        (access (name, R_OK | W_OK) != 0) ||
                    483:        (strcmp(name, sunFbData[fbNum].devName) != 0)) {
                    484:            name = (char *)NULL;
                    485:     }
                    486:            
                    487:     /*
                    488:      * If we still don't have a device for this screen, check the
                    489:      * environment variable for one. If one was given, stick its
                    490:      * path in name and check its accessibility. If it's not
                    491:      * properly accessible, then reset the name to NULL to force the
                    492:      * checking of the sunFbData array.
                    493:      */
                    494:     if (devsw == (char *)NULL && name == (char *)NULL &&
                    495:        xdevice != (char *)NULL &&
                    496:        (name = nthdev(xdevice, index)) != (char *)NULL &&
                    497:        (access (name, R_OK | W_OK) != 0)) {
                    498:            name = (char *)NULL;
                    499:     }
                    500: 
                    501:     /*
                    502:      * Take the device given in the frame buffer description
                    503:      * and see if it exists and is accessible. If it does/is,
                    504:      * we will use it, as long as no other device was given.
                    505:      */
                    506:     if (devsw == (char *)NULL && name == (char *)NULL &&
                    507:        access(sunFbData[fbNum].devName, (R_OK | W_OK)) == 0) {
                    508:            name = sunFbData[fbNum].devName;
                    509:     }
                    510: 
                    511:     /*
                    512:      * If we still have nothing and have yet to use "/dev/fb" for
                    513:      * a screen, default the name to be "/dev/fb"
                    514:      */
                    515:     if (devsw == (char *)NULL && name == (char *)NULL && !devFbUsed) {
                    516:        name = "/dev/fb";
                    517:     }
                    518: 
                    519: 
                    520:     if (name != (char *) NULL && sunUseSunWindows()) {
                    521: #ifdef SUN_WINDOWS
                    522: 
                    523:        /*
                    524:         * Running X in coexistence with SunWindows.
                    525:         *
                    526:         * This section of code enables X to run with SunWindows.  This is 
                    527:         * accomplished by opening up screens and windows in the SunWindows 
                    528:         * style and accepting input events from them.  However, since the X 
                    529:         * graphics libraries want a raw framebuffer, we open the 
                    530:         * framebuffer of the current screen and return that.  So we get 
                    531:         * input from SunWindows but send output to the raw framebuffer.
                    532:         */
                    533: 
                    534:        char       *parent = getenv("WINDOW_PARENT");
                    535:        struct screen sc;
                    536:        int         winFd;
                    537:        int         parentFd;
                    538:        int         framebufferFd;
                    539:        Rect        r;
                    540:        static struct screen newScreen;
                    541:        struct inputmask inputMask;
                    542:        Bool        keepParent = FALSE;
                    543: 
                    544:        /*
                    545:         * If no device was specified on the command line, open the window 
                    546:         * specified in WINDOW_PARENT.  If a device was specified, open a 
                    547:         * new screen on that device and use it as a parent window.
                    548:         */
                    549: 
                    550:        if ( devsw ) {
                    551:            bzero( (caddr_t)&newScreen, sizeof(newScreen) );
                    552:            strcpy( newScreen.scr_fbname, name );
                    553:            newScreen.scr_flags |= SCR_TOGGLEENABLE;
                    554:            if ( (parentFd = win_screennew( &newScreen )) < 0 ) {
                    555:                ErrorF( "sunOpenFrameBuffer: Can't open new screen on %s.\n",
                    556:                    name );
                    557:                return( -1 );
                    558:            }
                    559:            keepParent = TRUE;
                    560:        } else {
                    561:            if ((parentFd = open(parent, 2, 0)) < 0) {
                    562:                ErrorF("sunOpenFrameBuffer: Can't open parent %s.\n", parent);
                    563:                return (-1);
                    564:            }
                    565:        }
                    566: 
                    567:        if ((winFd = win_getnewwindow()) < 0) {
                    568:            ErrorF("sunOpenFrameBuffer: Can't open a new window.\n");
                    569:            close( parentFd );
                    570:            return (-1);
                    571:        }
                    572: 
                    573:        /* link the new window into the window hierarchy */
                    574:        bzero((caddr_t) & r, sizeof r);
                    575:        win_getrect(parentFd, &r);
                    576:        win_setrect(winFd, &r);
                    577:        win_setlink(winFd, WL_PARENT, win_fdtonumber(parentFd));
                    578:        win_setlink(winFd, WL_OLDERSIB, win_getlink(parentFd, WL_TOPCHILD));
                    579:        sunFbs[index].parent = TRUE;
                    580: 
                    581:        /*
                    582:         * We would like to close the parent window here, since it's no 
                    583:         * longer needed.  However, in the case where the parent is really a 
                    584:         * screen, we have to keep it open, because closing a screen closes 
                    585:         * all the windows on that screen.
                    586:         */
                    587: 
                    588:        if ( ! keepParent )
                    589:            close(parentFd);
                    590:        
                    591:        /*
                    592:         * Express interest in SunView mouse events.  Note: the win_insert 
                    593:         * must be AFTER setting the input mask in order to receive the 
                    594:         * initial LOC_WINENTER event.
                    595:         */
                    596: 
                    597:        input_imnull(&inputMask);
                    598:        inputMask.im_flags = IM_ASCII | IM_META | IM_NEGEVENT | IM_INTRANSIT;
                    599: 
                    600: #ifdef notdef
                    601:        win_setinputcodebit(&inputMask, KBD_USE);
                    602:        win_setinputcodebit(&inputMask, KBD_DONE);
                    603: #endif notdef
                    604:        win_setinputcodebit(&inputMask, LOC_MOVE);
                    605:        win_setinputcodebit(&inputMask, LOC_WINEXIT);
                    606:        win_setinputcodebit(&inputMask, LOC_WINENTER);
                    607:        win_setinputcodebit(&inputMask, MS_LEFT);
                    608:        win_setinputcodebit(&inputMask, MS_MIDDLE);
                    609:        win_setinputcodebit(&inputMask, MS_RIGHT);
                    610:        win_set_pick_mask(winFd, &inputMask);
                    611: 
                    612:        win_insert(winFd);
                    613: 
                    614:        /*
                    615:         * Determine the framebuffer name from the window's screen, then 
                    616:         * open it.  Then do an FBIOGTYPE ioctl to determine its type.
                    617:         */
                    618: 
                    619:        win_screenget( winFd, &sc );
                    620:        if ((framebufferFd = open(sc.scr_fbname, O_RDWR, 0)) < 0) {
                    621:            ErrorF("sunOpenFrameBuffer: can't open %s\n",sc.scr_fbname);
                    622:            (void) close(winFd);
                    623:            (void) close(parentFd);
                    624:            return (-1);
                    625:        }
                    626: 
                    627:        if (ioctl(framebufferFd, FBIOGTYPE, pfbType) < 0) {
                    628:            perror("sunOpenFrameBuffer");
                    629:            (void) close(framebufferFd);
                    630:            (void) close(winFd);
                    631:            (void) close(parentFd);
                    632:            return (-1);
                    633:        }
                    634: 
                    635:        if (pfbType->fb_type != expect) {
                    636:            (void) close(framebufferFd);
                    637:            (void) close(winFd);
                    638:            (void) close(parentFd);
                    639:            return (-1);
                    640:        }
                    641: 
                    642:         /*
                    643:         * NDELAY only applies to "input" fds, or fds that can be
                    644:         * read.  sunwindows fds are read, while frame buffer fds aren't.
                    645:         * That's why this fcntl is in the conditional compilation section.
                    646:         */
                    647: 
                    648:        if (fcntl(winFd, F_SETFL, O_NDELAY) < 0) {
                    649:            ErrorF("Can't set O_NDELAY on %s\n",name);
                    650:            perror("sunOpenFrameBuffer");
                    651:            (void) close(winFd);
                    652:            return (-1);
                    653:        }
                    654:        
                    655:        fd = framebufferFd;
                    656:        windowFd = winFd;
                    657: #else
                    658:        ErrorF("Not configured to run inside SunWindows\n");
                    659:        fd = -1;
                    660: #endif SUN_WINDOWS
                    661:     } else if (name) {
                    662:        fd = open(name, O_RDWR, 0);
                    663:         if (fd < 0) {
                    664:            return (-1);
                    665:        } 
                    666:        if (ioctl(fd, FBIOGTYPE, pfbType) < 0) {
                    667:            perror("sunOpenFrameBuffer");
                    668:            (void) close(fd);
                    669:            return (-1);
                    670:        }
                    671:        /* XXX - this is temporary 'cos the CG4 pretends its a BW2 */
                    672:        if (strcmp(name, sunFbData[fbNum].devName) != 0 && pfbType->fb_type != expect) {
                    673:            (void) close(fd);
                    674:            return (-1);
                    675:        }
                    676:     }
                    677: 
                    678:     if (name && strcmp (name, "/dev/fb") == 0) {
                    679:        devFbUsed = TRUE;
                    680:     }
                    681: 
                    682:     return (fd);
                    683: }

unix.superglobalmegacorp.com

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