*** /tmp/,RCSt1659773	Mon Nov  4 17:41:22 1991
--- sunIo.c	Tue Jul 24 18:01:22 1990
***************
*** 49,68 ****
  
  #include    "sun.h"
  #include    "opaque.h"
  
  int	    	lastEventTime = 0;
! extern int	sunSigIO;
  extern int      screenIsSaved;
  extern void	SaveScreens();
  
! #ifdef SUN_WINDOWS
! int	windowFd = 0;
! int	sunIgnoreEvent = TRUE;
! #define	INPBUFSIZE	128
! #endif SUN_WINDOWS
  
  /*-
   *-----------------------------------------------------------------------
   * TimeSinceLastInputEvent --
   *	Function used for screensaver purposes by the os module.
   *
--- 49,85 ----
  
  #include    "sun.h"
  #include    "opaque.h"
+ #include    <sys/time.h>
  
  int	    	lastEventTime = 0;
! extern int	spriteCheckInput;
  extern int      screenIsSaved;
  extern void	SaveScreens();
  
! extern unsigned int	repeatLong, repeatShort;
  
  /*-
   *-----------------------------------------------------------------------
+  * sunInputAvail --
+  *	This function is called from the scheduler whenever one of
+  *	the devices we told it to look for has input waiting.
+  *
+  * Results:
+  *	None.
+  *
+  * Side Effects:
+  *	spriteCheckInput has its READ_INPUT flag set.
+  *
+  *-----------------------------------------------------------------------
+  */
+ void
+ sunInputAvail()
+ {
+     spriteCheckInput = 1;
+ }
+ 
+ /*-
+  *-----------------------------------------------------------------------
   * TimeSinceLastInputEvent --
   *	Function used for screensaver purposes by the os module.
   *
***************
*** 106,285 ****
  void
  ProcessInputEvents ()
  {
!     register Firm_event    *ptrEvents,    	/* Current pointer event */
! 			   *kbdEvents;	    	/* Current keyboard event */
!     register int	    numPtrEvents, 	/* Number of remaining pointer
! 						 * events */
! 			    numKbdEvents;   	/* Number of remaining
! 						 * keyboard events */
!     int	    	  	    nPE,    	    	/* Original number of pointer
! 						 * events */
! 			    nKE;    	    	/* Original number of
! 						 * keyboard events */
!     Bool		    PtrAgain,		/* need to (re)read */
! 			    KbdAgain;		/* need to (re)read */
!     DevicePtr		    pPointer;
!     DevicePtr		    pKeyboard;
!     register PtrPrivPtr     ptrPriv;
!     register KbPrivPtr	    kbdPriv;
!     Firm_event	  	    *lastEvent;	    	/* Last event processed */
      enum {
  	NoneYet, Ptr, Kbd
      }			    lastType = NoneYet;	/* Type of last event */
  
- #ifdef SUN_WINDOWS
-     struct inputevent sunevents[INPBUFSIZE];
-     register struct inputevent *se = sunevents, *seL;
-     int         n;
- #endif SUN_WINDOWS
- 
-     sunSigIO = 0;
      pPointer = LookupPointerDevice();
      pKeyboard = LookupKeyboardDevice();
  
-     if ( sunUseSunWindows() ) {
- #ifdef SUN_WINDOWS
- 	if ((n=read(windowFd,sunevents,INPBUFSIZE*sizeof sunevents[0])) < 0 
- 			    && errno != EWOULDBLOCK) {
- 	    /*
- 	     * Error reading events; should do something. XXX
- 	     */
- /*debug*/
- 	ErrorF("ProcessInputEvents: read(windowFd)  n=%d\n",n);
- 	    return;
- 	}
- 
- 	if (autoRepeatKeyDown && autoRepeatReady && n <= 0) {
- 		/* fake a sunwindows kbd event */
- 		n = sizeof(struct inputevent);
- 		se->ie_code = AUTOREPEAT_EVENTID;
- 		tvplus(event_time(se), autoRepeatLastKeyDownTv,
- 							autoRepeatDeltaTv);
- 		if (autoRepeatDebug)
- 		    ErrorF("ProcessInputEvents: sw auto event\n");
- 	}
- 
- 	for (seL = sunevents + (n/(sizeof sunevents[0]));  se < seL; se++) {
- 	    if (screenIsSaved == SCREEN_SAVER_ON)
- 		SaveScreens(SCREEN_SAVER_OFF, ScreenSaverReset);
- 	    lastEventTime = TVTOMILLI(event_time(se));
- 
- 	    /*
- 	     * Decide whether or not to pay attention to events.
- 	     * Ignore the events if the locator has exited X Display.
- 	     */
- 	    switch (event_id(se)) {
- 		case KBD_DONE:
- 		    sunChangeKbdTranslation( pKeyboard, FALSE );
- 		    break;
- 		case KBD_USE:
- 		    sunChangeKbdTranslation( pKeyboard, TRUE );
- 		    break;
- 		case LOC_WINENTER:
- 		    sunIgnoreEvent = FALSE;
- 		    break;
- 		case LOC_WINEXIT:
- 		    sunIgnoreEvent = TRUE;
- 		    break;
- 	    }
- 
- 	    if (sunIgnoreEvent) {
- 		continue;
- 	    }
- 
- 	    /*
- 	     * Figure out the X device this event should be reported on.
- 	     */
- 	    switch (event_id(se)) {
- 		case LOC_MOVE:
- 		case MS_LEFT:
- 		case MS_MIDDLE:
- 		case MS_RIGHT:
- 		    sunMouseProcessEventSunWin(pPointer,se);
- 		    break;
- 		case LOC_WINEXIT:
- 		case LOC_WINENTER:
- 		case KBD_DONE:
- 		case KBD_USE:
- 		    break;
- 		default:
- 		    sunKbdProcessEventSunWin(pKeyboard,se);
- 		    break;
- 	    }
- 	}
- #endif SUN_WINDOWS
-     } 
-     else {
  	ptrPriv = (PtrPrivPtr)pPointer->devicePrivate;
  	kbdPriv = (KbPrivPtr)pKeyboard->devicePrivate;
  	
- 	numPtrEvents = 0;
- 	PtrAgain = TRUE;
- 	numKbdEvents = 0;
- 	KbdAgain = TRUE;
- 	lastEvent = (Firm_event *)0;
- 
  	/*
! 	 * So long as one event from either device remains unprocess, we loop:
! 	 * Take the oldest remaining event and pass it to the proper module
! 	 * for processing. The DDXEvent will be sent to ProcessInput by the
! 	 * function called.
  	 */
! 	while (1) {
! 	    /*
! 	     * Get events from both the pointer and the keyboard, storing the number
! 	     * of events gotten in nPE and nKE and keeping the start of both arrays
! 	     * in pE and kE
! 	     */
! 	    if ((numPtrEvents == 0) && PtrAgain) {
! 		ptrEvents = (* ptrPriv->GetEvents) (pPointer, &nPE, &PtrAgain);
! 		numPtrEvents = nPE;
! 	    }
! 	    if ((numKbdEvents == 0) && KbdAgain) {
! 		kbdEvents = (* kbdPriv->GetEvents) (pKeyboard, &nKE, &KbdAgain);
! 		numKbdEvents = nKE;
! 	    }
! 	    if ((numPtrEvents == 0) && (numKbdEvents == 0))
! 		break;
! 	    if (numPtrEvents && numKbdEvents) {
! 		if (timercmp (&kbdEvents->time, &ptrEvents->time, <)) {
  		    if (lastType == Ptr) {
  			(* ptrPriv->DoneEvents) (pPointer, FALSE);
- 		    }
- 		    (* kbdPriv->ProcessEvent) (pKeyboard, kbdEvents);
- 		    numKbdEvents--;
- 		    lastEvent = kbdEvents++;
  		    lastType = Kbd;
! 		} else {
  		    if (lastType == Kbd) {
  			(* kbdPriv->DoneEvents) (pKeyboard, FALSE);
- 		    }
- 		    (* ptrPriv->ProcessEvent) (pPointer, ptrEvents);
- 		    numPtrEvents--;
- 		    lastEvent = ptrEvents++;
  		    lastType = Ptr;
  		}
! 	    } else if (numKbdEvents) {
! 		if (lastType == Ptr) {
! 		    (* ptrPriv->DoneEvents) (pPointer, FALSE);
! 		}
! 		(* kbdPriv->ProcessEvent) (pKeyboard, kbdEvents);
! 		numKbdEvents--;
! 		lastEvent = kbdEvents++;
! 		lastType = Kbd;
  	    } else {
! 		if (lastType == Kbd) {
! 		    (* kbdPriv->DoneEvents) (pKeyboard, FALSE);
! 		}
! 		(* ptrPriv->ProcessEvent) (pPointer, ptrEvents);
! 		numPtrEvents--;
! 		lastEvent = ptrEvents++;
! 		lastType = Ptr;
  	    }
  	}
  
  	if (lastEvent) {
- 	    lastEventTime = TVTOMILLI(lastEvent->time);
  	    if (screenIsSaved == SCREEN_SAVER_ON) {
  		SaveScreens(SCREEN_SAVER_OFF, ScreenSaverReset);
  	    }
--- 123,177 ----
  void
  ProcessInputEvents ()
  {
!     register Mouse_Event    *events; 	    /* Array of events */
!     register int  	    numEvents;	    /* Number of events left */
!     int	    	  	    nE;	    	    /* Total number of events */
!     DevicePtr		    pPointer;	    /* System pointer */
!     DevicePtr		    pKeyboard;	    /* System keyboard */
!     register PtrPrivPtr     ptrPriv;	    /* Private data for pointer */
!     register KbPrivPtr	    kbdPriv;	    /* Private data for keyboard */
!     Mouse_Event  	    *lastEvent;	    /* Last event processed */
      enum {
  	NoneYet, Ptr, Kbd
      }			    lastType = NoneYet;	/* Type of last event */
  
      pPointer = LookupPointerDevice();
      pKeyboard = LookupKeyboardDevice();
      
      ptrPriv = (PtrPrivPtr)pPointer->devicePrivate;
      kbdPriv = (KbPrivPtr)pKeyboard->devicePrivate;
      
      /*
!      * Get events from both the pointer and the keyboard via the keyboard's
!      * GetEvents vector. The number of events read is stored in numEvents.
       */
!     events = (* kbdPriv->GetEvents) (pKeyboard, &nE);
!     numEvents = nE;
!     
!     while (numEvents) {
! 	if (events->flags & KEYBOARD_EVENT) {
  	    if (lastType == Ptr) {
  	        (* ptrPriv->DoneEvents) (pPointer, FALSE);
  	        lastType = Kbd;
! 	    }
! 	    (* kbdPriv->ProcessEvent) (pKeyboard, events);
! 	} else if (events->flags & MOUSE_EVENT) {
  	    if (lastType == Kbd) {
  	        (* kbdPriv->DoneEvents) (pKeyboard, FALSE);
  	        lastType = Ptr;
  	    }
! 	    (* ptrPriv->ProcessEvent) (pPointer, events);
  	} else {
! 	    /* ??? */
  	}
+ 	lastEvent = events;
+ 	lastEventTime = events->time;
+ 	numEvents -= 1;
+ 	events += 1;
      }
      
+     SetTimeSinceLastInputEvent();
      if (lastEvent) {
  	if (screenIsSaved == SCREEN_SAVER_ON) {
  	    SaveScreens(SCREEN_SAVER_OFF, ScreenSaverReset);
  	}
***************
*** 288,295 ****
  	(* kbdPriv->DoneEvents) (pKeyboard, TRUE);
  	(* ptrPriv->DoneEvents) (pPointer, TRUE);
  
!     }
! 
  }
  
  
--- 180,186 ----
      (* kbdPriv->DoneEvents) (pKeyboard, TRUE);
      (* ptrPriv->DoneEvents) (pPointer, TRUE);
  
!     spriteCheckInput = 0;
  }
  
  
***************
*** 341,357 ****
  
      if (strcmp (argv[i], "-ar1") == 0) {	/* -ar1 int */
  	if (++i >= argc) UseMsg ();
! 	autoRepeatInitiate = 1000 * (long)atoi(argv[i]);
  	return 2;
      }
      if (strcmp (argv[i], "-ar2") == 0) {	/* -ar2 int */
  	if (++i >= argc) UseMsg ();
! 	autoRepeatDelay = 1000 * (long)atoi(argv[i]);
  	return 2;
      }
      if (strcmp (argv[i], "-debug") == 0) {	/* -debug */
  	return 1;
      }
      if (strcmp (argv[i], "-dev") == 0) {	/* -dev /dev/mumble */
  	if (++i >= argc) UseMsg ();
  	return 2;
--- 232,250 ----
  
      if (strcmp (argv[i], "-ar1") == 0) {	/* -ar1 int */
  	if (++i >= argc) UseMsg ();
! 	repeatLong = 1000 * (long)atoi(argv[i]);
  	return 2;
      }
      if (strcmp (argv[i], "-ar2") == 0) {	/* -ar2 int */
  	if (++i >= argc) UseMsg ();
! 	repeatShort = 1000 * (long)atoi(argv[i]);
  	return 2;
      }
+ #ifndef	sprite
      if (strcmp (argv[i], "-debug") == 0) {	/* -debug */
  	return 1;
      }
+ #endif	sprite
      if (strcmp (argv[i], "-dev") == 0) {	/* -dev /dev/mumble */
  	if (++i >= argc) UseMsg ();
  	return 2;
***************
*** 371,378 ****
--- 264,273 ----
  {
      ErrorF("-ar1 int               set autorepeat initiate time\n");
      ErrorF("-ar2 int               set autorepeat interval time\n");
+ #ifndef	sprite
      ErrorF("-debug                 disable non-blocking console mode\n");
      ErrorF("-dev filename          name of device to open\n");
+ #endif	sprite
      ErrorF("-mono                  force monochrome-only screen\n");
      ErrorF("-zaphod                disable active Zaphod mode\n");
  }
