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

1.1       root        1: /*-
                      2:  * sunIo.c --
                      3:  *     Functions to handle input from the keyboard and mouse.
                      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    "opaque.h"
                     52: 
                     53: Bool           screenSaved = FALSE;
                     54: int            lastEventTime = 0;
                     55: extern int     sunSigIO;
                     56: extern void    SaveScreens();
                     57: 
                     58: #ifdef SUN_WINDOWS
                     59: int            windowFd = 0;
                     60: #define        INPBUFSIZE      128
                     61: #endif SUN_WINDOWS
                     62: 
                     63: /*-
                     64:  *-----------------------------------------------------------------------
                     65:  * TimeSinceLastInputEvent --
                     66:  *     Function used for screensaver purposes by the os module.
                     67:  *
                     68:  * Results:
                     69:  *     The time in milliseconds since there last was any
                     70:  *     input.
                     71:  *
                     72:  * Side Effects:
                     73:  *     None.
                     74:  *
                     75:  *-----------------------------------------------------------------------
                     76:  */
                     77: int
                     78: TimeSinceLastInputEvent()
                     79: {
                     80:     struct timeval     now;
                     81: 
                     82:     gettimeofday (&now, (struct timezone *)0);
                     83: 
                     84:     if (lastEventTime == 0) {
                     85:        lastEventTime = TVTOMILLI(now);
                     86:     }
                     87:     return TVTOMILLI(now) - lastEventTime;
                     88: }
                     89: 
                     90: /*-
                     91:  *-----------------------------------------------------------------------
                     92:  * ProcessInputEvents --
                     93:  *     Retrieve all waiting input events and pass them to DIX in their
                     94:  *     correct chronological order. Only reads from the system pointer
                     95:  *     and keyboard.
                     96:  *
                     97:  * Results:
                     98:  *     None.
                     99:  *
                    100:  * Side Effects:
                    101:  *     Events are passed to the DIX layer.
                    102:  *
                    103:  *-----------------------------------------------------------------------
                    104:  */
                    105: void
                    106: ProcessInputEvents ()
                    107: {
                    108:     register Firm_event    *ptrEvents,         /* Current pointer event */
                    109:                           *kbdEvents;          /* Current keyboard event */
                    110:     register int           numPtrEvents,       /* Number of remaining pointer
                    111:                                                 * events */
                    112:                            numKbdEvents;       /* Number of remaining
                    113:                                                 * keyboard events */
                    114:     int                            nPE,                /* Original number of pointer
                    115:                                                 * events */
                    116:                            nKE;                /* Original number of
                    117:                                                 * keyboard events */
                    118:     DevicePtr              pPointer;
                    119:     DevicePtr              pKeyboard;
                    120:     register PtrPrivPtr     ptrPriv;
                    121:     register KbPrivPtr     kbdPriv;
                    122:     Firm_event             *lastEvent;         /* Last event processed */
                    123:     enum {
                    124:        NoneYet, Ptr, Kbd
                    125:     }                      lastType = NoneYet; /* Type of last event */
                    126: 
                    127: #ifdef SUN_WINDOWS
                    128:     struct inputevent sunevents[INPBUFSIZE];
                    129:     register struct inputevent *se = sunevents, *seL;
                    130:     int         n;
                    131:     static int event_ignore = TRUE;
                    132: #endif SUN_WINDOWS
                    133: 
                    134:     /*
                    135:      *  Defensive programming - only reset sunIOPending (preventing
                    136:      *  further calls to ProcessInputEvents() until a future SIGIO)
                    137:      *  if we have actually received a SIGIO,  so we know it works.
                    138:      */
                    139:     if (sunSigIO) {
                    140:        isItTimeToYield = 0;
                    141:     }
                    142:     pPointer = LookupPointerDevice();
                    143:     pKeyboard = LookupKeyboardDevice();
                    144: 
                    145:     if ( sunUseSunWindows() ) {
                    146: #ifdef SUN_WINDOWS
                    147:        if ((n=read(windowFd,sunevents,INPBUFSIZE*sizeof sunevents[0])) < 0 
                    148:                            && errno != EWOULDBLOCK) {
                    149:            /*
                    150:             * Error reading events; should do something. XXX
                    151:             */
                    152:            return;
                    153:        }
                    154: 
                    155:        if (autoRepeatKeyDown && autoRepeatReady && n <= 0) {
                    156:                /* fake a sunwindows kbd event */
                    157:                n = sizeof(struct inputevent);
                    158:                se->ie_code = AUTOREPEAT_EVENTID;
                    159:                if (autoRepeatDebug)
                    160:                    ErrorF("ProcessInputEvents: sw auto event\n");
                    161:        }
                    162: 
                    163:        for (seL = sunevents + (n/(sizeof sunevents[0]));  se < seL; se++) {
                    164:            if (screenSaved)
                    165:                SaveScreens(SCREEN_SAVER_FORCER, ScreenSaverReset);
                    166:            lastEventTime = TVTOMILLI(event_time(se));
                    167: 
                    168:            /*
                    169:             * Decide whether or not to pay attention to events.
                    170:             * Ignore the events if the locator has exited X Display.
                    171:             */
                    172:            switch (event_id(se)) {
                    173:                case KBD_DONE:
                    174:                    sunChangeKbdTranslation( pKeyboard, FALSE );
                    175:                    break;
                    176:                case KBD_USE:
                    177:                    sunChangeKbdTranslation( pKeyboard, TRUE );
                    178:                    break;
                    179:                case LOC_WINENTER:
                    180:                    event_ignore = FALSE;
                    181:                    break;
                    182:                case LOC_WINEXIT:
                    183:                    event_ignore = TRUE;
                    184:                    break;
                    185:            }
                    186: 
                    187:            if (event_ignore) {
                    188:                continue;
                    189:            }
                    190: 
                    191:            /*
                    192:             * Figure out the X device this event should be reported on.
                    193:             */
                    194:            switch (event_id(se)) {
                    195:                case LOC_MOVE:
                    196:                case MS_LEFT:
                    197:                case MS_MIDDLE:
                    198:                case MS_RIGHT:
                    199:                    sunMouseProcessEventSunWin(pPointer,se);
                    200:                    break;
                    201:                case LOC_WINEXIT:
                    202:                case LOC_WINENTER:
                    203:                case KBD_DONE:
                    204:                case KBD_USE:
                    205:                    break;
                    206:                default:
                    207:                    sunKbdProcessEventSunWin(pKeyboard,se);
                    208:                    break;
                    209:            }
                    210:        }
                    211: #endif SUN_WINDOWS
                    212:     } 
                    213:     else {
                    214:        ptrPriv = (PtrPrivPtr)pPointer->devicePrivate;
                    215:        kbdPriv = (KbPrivPtr)pKeyboard->devicePrivate;
                    216:        
                    217:        /*
                    218:         * Get events from both the pointer and the keyboard, storing the number
                    219:         * of events gotten in nPE and nKE and keeping the start of both arrays
                    220:         * in pE and kE
                    221:         */
                    222:        ptrEvents = (* ptrPriv->GetEvents) (pPointer, &nPE);
                    223:        kbdEvents = (* kbdPriv->GetEvents) (pKeyboard, &nKE);
                    224:        
                    225:        numPtrEvents = nPE;
                    226:        numKbdEvents = nKE;
                    227:        lastEvent = (Firm_event *)0;
                    228: 
                    229:        /*
                    230:         * So long as one event from either device remains unprocess, we loop:
                    231:         * Take the oldest remaining event and pass it to the proper module
                    232:         * for processing. The DDXEvent will be sent to ProcessInput by the
                    233:         * function called.
                    234:         */
                    235:        while (numPtrEvents || numKbdEvents) {
                    236:            if (numPtrEvents && numKbdEvents) {
                    237:                if (timercmp (&kbdEvents->time, &ptrEvents->time, <)) {
                    238:                    if (lastType == Ptr) {
                    239:                        (* ptrPriv->DoneEvents) (pPointer, FALSE);
                    240:                    }
                    241:                    (* kbdPriv->ProcessEvent) (pKeyboard, kbdEvents);
                    242:                    numKbdEvents--;
                    243:                    lastEvent = kbdEvents++;
                    244:                    lastType = Kbd;
                    245:                } else {
                    246:                    if (lastType == Kbd) {
                    247:                        (* kbdPriv->DoneEvents) (pKeyboard, FALSE);
                    248:                    }
                    249:                    (* ptrPriv->ProcessEvent) (pPointer, ptrEvents);
                    250:                    numPtrEvents--;
                    251:                    lastEvent = ptrEvents++;
                    252:                    lastType = Ptr;
                    253:                }
                    254:            } else if (numKbdEvents) {
                    255:                if (lastType == Ptr) {
                    256:                    (* ptrPriv->DoneEvents) (pPointer, FALSE);
                    257:                }
                    258:                (* kbdPriv->ProcessEvent) (pKeyboard, kbdEvents);
                    259:                numKbdEvents--;
                    260:                lastEvent = kbdEvents++;
                    261:                lastType = Kbd;
                    262:            } else {
                    263:                if (lastType == Kbd) {
                    264:                    (* kbdPriv->DoneEvents) (pKeyboard, FALSE);
                    265:                }
                    266:                (* ptrPriv->ProcessEvent) (pPointer, ptrEvents);
                    267:                numPtrEvents--;
                    268:                lastEvent = ptrEvents++;
                    269:                lastType = Ptr;
                    270:            }
                    271:        }
                    272: 
                    273:        if (lastEvent) {
                    274:            lastEventTime = TVTOMILLI(lastEvent->time);
                    275:            if (screenSaved) {
                    276:                SaveScreens(SCREEN_SAVER_FORCER, ScreenSaverReset);
                    277:            }
                    278:        }
                    279:        
                    280:        (* kbdPriv->DoneEvents) (pKeyboard);
                    281:        (* ptrPriv->DoneEvents) (pPointer);
                    282: 
                    283:     }
                    284: 
                    285:     sunRestoreCursor();
                    286: 
                    287: }
                    288: 
                    289: 
                    290: /*-
                    291:  *-----------------------------------------------------------------------
                    292:  * SetTimeSinceLastInputEvent --
                    293:  *     Set the lastEventTime to now.
                    294:  *
                    295:  * Results:
                    296:  *     None.
                    297:  *
                    298:  * Side Effects:
                    299:  *     lastEventTime is altered.
                    300:  *
                    301:  *-----------------------------------------------------------------------
                    302:  */
                    303: void
                    304: SetTimeSinceLastInputEvent()
                    305: {
                    306:     struct timeval now;
                    307: 
                    308:     gettimeofday (&now, (struct timezone *)0);
                    309:     lastEventTime = TVTOMILLI(now);
                    310: }

unix.superglobalmegacorp.com

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