MIT Sparc X server and keyboard indicators

Viktor Dukhovni viktor at shearson.com
Thu Apr 25 12:17:56 AEST 1991


	The patch below provides for X11R4 the following Sun features

	1)  The ability to run "overview -w xinit" on top of sunview
	and use Meta-L2 to iconise the X-server,  click on the icon
	to return to X

	2)  Arbitrary bell files (XSUNBELLFILE in the environ)
	you need to copy /usr/demo/SOUND/multimedia to /usr/include/multimedia

	3)  Support for NumLock

	4)  Support for NumLock and CapsLock LEDs under 4.1 or higher
	(does not work under 4.0)

	5)  Fixes a small memory leak in the validation routines.

	6)  reduces optinal features in server from:
! #define ExtensionDefines -DSHAPE -DMITSHM -DMULTIBUFFER -DMITMISC
	    to
! #define ExtensionDefines -DMULTIBUFFER
	You may not want this,  but my X server was big enough already.



	Works for me.  No other guarantees.  Not endorsed by my company.
	Enjoy!  No flames please if it breaks your server.

*** /tmp/,RCSt1a01932	Wed Apr 24 22:11:44 1991
--- ./server/ddx/mi/mivaltree.c	Tue Oct  2 20:30:54 1990
***************
*** 642,647 ****
--- 642,648 ----
  	    if (pWin->valdata) {
  		(* pScreen->RegionEmpty)(&pWin->clipList);
  		(* pScreen->RegionEmpty)(&pWin->borderClip);
+ 		xfree(pWin->valdata) ;
  		pWin->valdata = (ValidatePtr)NULL;
  	    }
  	}
*** /tmp/,RCSt1a01935	Wed Apr 24 22:11:45 1991
--- ./server/ddx/sun/sunKbd.c	Tue Oct 23 14:15:44 1990
***************
*** 48,53 ****
--- 48,57 ----
  
  
  #define NEED_EVENTS
+ #ifdef SUN_AUDIO_FILE
+ #include <multimedia/libaudio.h>
+ #include <multimedia/audio_device.h>
+ #endif
  #include "sun.h"
  #include <stdio.h>
  #include "Xproto.h"
***************
*** 55,61 ****
  #include "inputstr.h"
  
  typedef struct {
!     int	    	  trans;          	/* Original translation form */
  } SunKbPrivRec, *SunKbPrivPtr;
  
  extern CARD8 *sunModMap[];
--- 59,71 ----
  #include "inputstr.h"
  
  typedef struct {
!     int		trans;		/* Original translation form */
! #ifdef SUN_AUDIO_FILE
!     int		audio_fd;	/* /dev/audio fd */
!     int		sound_fd;	/* fd of sound file */
!     struct stat	sound_stat;	/* stat info of sound file */
!     Bool	using_audio;	/* true if using /dev/audio else normal bell */
! #endif
  } SunKbPrivRec, *SunKbPrivPtr;
  
  extern CARD8 *sunModMap[];
***************
*** 93,98 ****
--- 103,169 ----
      &sysKbCtrl,			/* Initial full duration = .25 sec. */
  };
  
+ /* XXX:  Must be a clean way of not hardwiring these! */
+ #define KB_SUN4_CODE_MASK	0x7F
+ #define KB_SUN4_MAX_CODE	0x7F
+ #define KB_SUN4_NUM_LOCK_KCODE	(0x61+MIN_KEYCODE)
+ #define KB_SUN4_CAPS_LOCK_KCODE	(0x76+MIN_KEYCODE)
+ 
+ #ifdef SUN_NUMLOCK
+ /*
+  * The following table is the list of scancodes for keys affected by
+  * the numlock switch.  The order MUST match the order of simulated
+  * numlock keys defined at the end of the keymap in sunKeyMap.c
+  */
+ static char		numlock_keys[] = {
+     0x2d, 0x2e, 0x2f, 0x32, 0x44, 0x45, 0x46, 0x47, 0x5a,
+     0x5b, 0x5c, 0x5d, 0x5e, 0x70, 0x71, 0x72, 0x7d, 0x00
+ };
+ #endif
+ 
+ #ifdef SUN_LED_SUPPORT
+ /*
+  * set_kbd_led
+  */
+ static void
+ set_kbd_led (pKeyboard, flag, mask)
+ DevicePtr	pKeyboard;
+ Bool		flag;
+ long		mask;
+ {
+     KbPrivPtr		kbp = (KbPrivPtr) pKeyboard->devicePrivate;
+     int 		kbdOpenedHere;
+     char		led;
+     bool		old;
+ 
+ 
+     kbdOpenedHere = ( kbp->fd < 0 );
+     if ( kbdOpenedHere ) {
+ 	kbp->fd = open("/dev/kbd", O_RDWR, 0);
+ 	if (kbp->fd < 0) {
+ 	    ErrorF("set_numlock_flag: can't open keyboard");
+ 	    return;
+ 	}
+     }	
+  
+     (void) ioctl (kbp->fd, KIOCGLED, &led);
+     old = ((led & mask) == mask);
+ 
+     if (flag != old) {
+ 	if (flag)
+ 	    led |= mask;
+ 	else
+ 	    led &= ~mask;
+ 	(void) ioctl (kbp->fd, KIOCSLED, &led);
+     }
+ 
+     if ( kbdOpenedHere ) {
+ 	(void) close(kbp->fd);
+ 	kbp->fd = -1;
+     }
+ }
+ #endif
+ 
  /*-
   *-----------------------------------------------------------------------
   * sunKbdProc --
***************
*** 167,173 ****
                          perror( "ioctl KIOCGETKEY" );
  			FatalError("Can't KIOCGETKEY on fd %d\n", kbdFd);
                      }
!                     if (key.kio_entry != HOLE)
                          sysKbPriv.type = KB_SUN4;
                  }
  #endif
--- 238,244 ----
                          perror( "ioctl KIOCGETKEY" );
  			FatalError("Can't KIOCGETKEY on fd %d\n", kbdFd);
                      }
!                     if ( ((long)key.kio_entry) != HOLE)
                          sysKbPriv.type = KB_SUN4;
                  }
  #endif
***************
*** 208,213 ****
--- 279,292 ----
  		sunKeySyms[sysKbPriv.type].maxKeyCode += offset;
  		sysKbPriv.offset = offset;
  	    }
+ #ifdef SUN_LED_SUPPORT
+ 	    if (sysKbPriv.type == KB_SUN4)
+ 		set_kbd_led (pKeyboard, FALSE, ~0L);
+ #endif
+ #ifdef SUN_AUDIO_FILE
+ 	    sunKbPriv.audio_fd = sunKbPriv.sound_fd = -1;
+ 	    sunKbPriv.using_audio = FALSE;
+ #endif
  	    InitKeyboardDeviceStruct(
  		    pKeyboard,
  		    &(sunKeySyms[sysKbPriv.type]),
***************
*** 229,234 ****
--- 308,314 ----
  		 * when DEVICE_CLOSE was executed.
  		 * Translation is set/reset upon receipt of
  		 * KBD_USE/KBD_DONE input events (sunIo.c)
+ 		 * Or When Meta-L2 suspends the server.
  		 */
  		if (deviceOffKbdState != TR_UNDEFINED) {
  		    if (sunChangeKbdTranslation(pKeyboard,
***************
*** 235,240 ****
--- 315,333 ----
  				deviceOffKbdState == TR_UNTRANS_EVENT) < 0) {
  			FatalError("Can't set (SW) keyboard translation\n");
  		    }
+ 
+ #ifdef SUN_LED_SUPPORT
+ 		    if (sysKbPriv.type == KB_SUN4) {
+ 			set_kbd_led (pKeyboard, FALSE, ~0L) ;
+ 			/* Set LEDs to match Logical state */
+ 			if (BitIsOn(((DeviceIntPtr)pKeyboard)->key->down,
+ 				    KB_SUN4_NUM_LOCK_KCODE))
+ 			    set_kbd_led (pKeyboard, TRUE, LED_NUM_LOCK) ;
+ 			if (BitIsOn(((DeviceIntPtr)pKeyboard)->key->down, 
+ 				    KB_SUN4_CAPS_LOCK_KCODE))
+ 			    set_kbd_led (pKeyboard, TRUE, LED_CAPS_LOCK) ;
+ 		    }
+ #endif
  		}
  		AddEnabledDevice(windowFd);
  #endif SUN_WINDOWS
***************
*** 254,259 ****
--- 347,354 ----
  		AddEnabledDevice(kbdFd);
  	    }
  	    pKeyboard->on = TRUE;
+ 	    /* Enable Processing in sunWakeupHandler */
+ 	    autoRepeatReady = 1;
  	    break;
  
  	case DEVICE_CLOSE:
***************
*** 326,335 ****
      int	    	  loudness;	    /* Percentage of full volume */
      DevicePtr	  pKeyboard;	    /* Keyboard to ring */
  {
!     KbPrivPtr	  pPriv = (KbPrivPtr) pKeyboard->devicePrivate;
!     int	  	  kbdCmd;   	    /* Command to give keyboard */
!     int	 	  kbdOpenedHere; 
!  
      if (loudness == 0) {
   	return;
      }
--- 421,516 ----
      int	    	  loudness;	    /* Percentage of full volume */
      DevicePtr	  pKeyboard;	    /* Keyboard to ring */
  {
!     KbPrivPtr		pPriv = (KbPrivPtr) pKeyboard->devicePrivate;
!     SunKbPrivPtr	psPriv = (SunKbPrivPtr) pPriv->devPrivate;
!     int			kbdCmd;   	    /* Command to give keyboard */
!     int			kbdOpenedHere; 
! 
! 
! #ifdef SUN_AUDIO_FILE
! #define savecopy(dst,src) \
! 	((dst=(src)), dst = (dst ? strcpy(malloc(strlen(dst)+1),dst) : NULL))
! 
!     extern char *	getenv() ;
! 
!     static Audio_hdr	dev_hdr, sound_hdr;
!     double		gain;
!     struct stat		st;
!     char		buf[1024];
!     int			nr;
!     static char *	audio_file = NULL;
! 
!     if (psPriv->using_audio) {
! 
! 	/* open the /dev/audio device */
! 	if (psPriv->audio_fd < 0) {
! 	    if ((psPriv->audio_fd = open ("/dev/audio",
! 					  O_WRONLY | O_NDELAY)) < 0) {
! 		if (errno != EBUSY)	/* hard error, don't retry later */
! 		    psPriv->using_audio = FALSE;	
! 		goto use_kybd_bell;
! 	    }
! 	}
! 
! 	if (audio_get_play_config(psPriv->audio_fd,&dev_hdr) != AUDIO_SUCCESS) {
! 	    /* not an audio device */
! 	    (void) close (psPriv->audio_fd);
! 	    psPriv->audio_fd = -1;
! 	    psPriv->using_audio = FALSE;
! 	    goto use_kybd_bell;
! 	}
! 
! 	/* open the sound file */
! 	if (psPriv->sound_fd < 0) {
! reopen_sound:
! 	    if ( !audio_file && !savecopy(audio_file,getenv(SUN_AUDIO_FILE)) ||
! 	         (psPriv->sound_fd = open (audio_file, O_RDONLY, 0)) < 0 ) {
! 		/* can't open, try again later (maybe too expensive?) */
! 		psPriv->sound_fd = -1;
! 		goto use_kybd_bell;
! 	    }
! 	    (void) fstat(psPriv->sound_fd, &(psPriv->sound_stat));
! 	}
! 	else {	/* stat the file to see if it may have changed */
! 	    if (stat (audio_file, &st) == -1) {
! 		(void) close (psPriv->sound_fd);
! 		psPriv->sound_fd = -1;
! 		goto use_kybd_bell;
! 	    }
! 	    if (st.st_mtime != psPriv->sound_stat.st_mtime) {
! 		(void) close (psPriv->sound_fd);	/* changed, go reopen */
! 		goto reopen_sound;
! 	    }
! 	}
! 	
! 	/* set the volume */
! 	gain = ((double) loudness) / 100.0;
! 	(void) audio_set_play_gain (psPriv->audio_fd, &gain);	/* ignore errors */
! 	
! 	/* process the audio file header */
! 	(void) lseek (psPriv->sound_fd, 0L, 0);
! 	if (audio_read_filehdr (psPriv->sound_fd, &sound_hdr, (char *) 0, 0) != AUDIO_SUCCESS)
! 	    goto use_kybd_bell;
! 	if (audio_cmp_hdr (&dev_hdr, &sound_hdr) != 0) {
! 	    if (audio_drain (psPriv->audio_fd, FALSE) != AUDIO_SUCCESS)
! 		goto use_kybd_bell;
! 	    if (audio_set_play_config (psPriv->audio_fd, &sound_hdr) != AUDIO_SUCCESS)
! 		goto use_kybd_bell;
! 	}
! 
! 	/* write the sound */
! 	while ((nr = read (psPriv->sound_fd, buf, sizeof (buf))) >= 0) {
! 	    if (nr == 0)
! 		break;
! 	    (void) write (psPriv->audio_fd, buf, nr);
! 	}
! 
! 	return;
!     }
! 
! use_kybd_bell:
! #endif
! 
      if (loudness == 0) {
   	return;
      }
***************
*** 386,394 ****
      DevicePtr	  pKeyboard;	    /* Keyboard to alter */
      KeybdCtrl     *ctrl;
  {
!     KbPrivPtr	  pPriv = (KbPrivPtr) pKeyboard->devicePrivate;
!     int     	  kbdClickCmd = ctrl->click ? KBD_CMD_CLICK : KBD_CMD_NOCLICK;
!     int	 	  kbdOpenedHere; 
  
      kbdOpenedHere = ( pPriv->fd < 0 );
      if ( kbdOpenedHere ) {
--- 567,579 ----
      DevicePtr	  pKeyboard;	    /* Keyboard to alter */
      KeybdCtrl     *ctrl;
  {
!     KbPrivPtr		pPriv = (KbPrivPtr) pKeyboard->devicePrivate;
!     SunKbPrivPtr	psPriv = (SunKbPrivPtr) ((KbPrivPtr)pKeyboard->devicePrivate)->devPrivate;
!     int			kbdClickCmd = ctrl->click ? KBD_CMD_CLICK : KBD_CMD_NOCLICK;
!     int			kbdOpenedHere;
! #ifdef SUN_AUDIO_FILE
!     int			kbdBellPitch = ctrl->bell_pitch;
! #endif
  
      kbdOpenedHere = ( pPriv->fd < 0 );
      if ( kbdOpenedHere ) {
***************
*** 403,408 ****
--- 588,606 ----
   	ErrorF("Failed to set keyclick");
  	goto bad;
      }
+ 
+ #ifdef SUN_AUDIO_FILE
+     if (!kbdOpenedHere && kbdBellPitch == 0) {	/* 0 pitch means release /dev/audio, use bell */
+ 	if (psPriv->audio_fd >= 0) {
+ 	    (void) audio_drain (psPriv->audio_fd, FALSE);
+ 	    (void) close (psPriv->audio_fd);
+ 	    psPriv->audio_fd = -1;
+ 	}
+ 	psPriv->using_audio = FALSE;
+     }
+     else
+ 	psPriv->using_audio = TRUE;
+ #endif
   
      *pPriv->ctrl = *ctrl;
  
***************
*** 443,449 ****
      static Firm_event	evBuf[MAXEVENTS];   /* Buffer for Firm_events */
  
      pPriv = (KbPrivPtr) pKeyboard->devicePrivate;
!     nBytes = read (pPriv->fd, evBuf, sizeof(evBuf));
  
      if (nBytes < 0) {
  	if (errno == EWOULDBLOCK) {
--- 641,650 ----
      static Firm_event	evBuf[MAXEVENTS];   /* Buffer for Firm_events */
  
      pPriv = (KbPrivPtr) pKeyboard->devicePrivate;
!     if (pKeyboard->on)
! 	nBytes = read (pPriv->fd, evBuf, sizeof(evBuf));
!     else
! 	nBytes = 0;
  
      if (nBytes < 0) {
  	if (errno == EWOULDBLOCK) {
***************
*** 501,508 ****
      BYTE		key;
      CARD8		keyModifiers;
  
      if (autoRepeatKeyDown && fe->id == AUTOREPEAT_EVENTID) {
- 	pPriv = (KbPrivPtr) pKeyboard->devicePrivate;
  	if (pPriv->ctrl->autoRepeat != AutoRepeatModeOn) {
  		autoRepeatKeyDown = 0;
  		return;
--- 702,709 ----
      BYTE		key;
      CARD8		keyModifiers;
  
+     pPriv = (KbPrivPtr) pKeyboard->devicePrivate;
      if (autoRepeatKeyDown && fe->id == AUTOREPEAT_EVENTID) {
  	if (pPriv->ctrl->autoRepeat != AutoRepeatModeOn) {
  		autoRepeatKeyDown = 0;
  		return;
***************
*** 539,545 ****
  	return;
      }
  
!     key = (fe->id & 0x7F) + sysKbPriv.offset;
      keyModifiers = ((DeviceIntPtr)pKeyboard)->key->modifierMap[key];
      if (autoRepeatKeyDown && (keyModifiers == 0) &&
  	((fe->value == VKEY_DOWN) || (key == autoRepeatEvent.u.u.detail))) {
--- 740,765 ----
  	return;
      }
  
! 
! #ifdef SUN_NUMLOCK
!     if (pPriv->type == KB_SUN4) {
! 	char	*cp, *index ();
! 
! 	key = fe->id & KB_SUN4_CODE_MASK;
! 	if (BitIsOn(((DeviceIntPtr)pKeyboard)->key->down, 
! 	    KB_SUN4_NUM_LOCK_KCODE) &&
! 	    (cp = index (numlock_keys, key)) != NULL)
! 	    fe->id = KB_SUN4_MAX_CODE + 1 + (cp - numlock_keys);
! 	else
! 	    fe->id &= KB_SUN4_CODE_MASK;
!     }
!     else
! 	fe->id &= KB_SUN4_CODE_MASK;
!     key = fe->id + sysKbPriv.offset;
! #else
!     key = (fe->id & KB_SUN4_CODE_MASK) + sysKbPriv.offset;
! #endif
! 
      keyModifiers = ((DeviceIntPtr)pKeyboard)->key->modifierMap[key];
      if (autoRepeatKeyDown && (keyModifiers == 0) &&
  	((fe->value == VKEY_DOWN) || (key == autoRepeatEvent.u.u.detail))) {
***************
*** 558,568 ****
      xE.u.u.type = ((fe->value == VKEY_UP) ? KeyRelease : KeyPress);
      xE.u.u.detail = key;
  
!     if (keyModifiers & LockMask) {
! 	if (xE.u.u.type == KeyRelease)
! 	    return; /* this assumes autorepeat is not desired */
! 	if (BitIsOn(((DeviceIntPtr)pKeyboard)->key->down, key))
! 	    xE.u.u.type = KeyRelease;
      }
  
      if ((xE.u.u.type == KeyPress) && (keyModifiers == 0)) {
--- 778,807 ----
      xE.u.u.type = ((fe->value == VKEY_UP) ? KeyRelease : KeyPress);
      xE.u.u.detail = key;
  
! #ifndef SUN_NUMLOCK
!     if (keyModifiers & LockMask)
! #else
!     if (keyModifiers & LockMask ||
! 	pPriv->type == KB_SUN4 && key == KB_SUN4_NUM_LOCK_KCODE)
! #endif
!     {
! #ifdef SUN_LED_SUPPORT
! 	int ledmask = (keyModifiers & LockMask) ? LED_CAPS_LOCK : LED_NUM_LOCK;
! #endif
! 	if (xE.u.u.type == KeyRelease ||
! 	    BitIsOn(((DeviceIntPtr)pKeyboard)->key->down, key)) {
! 	    if ( xE.u.u.type == KeyRelease )
! 		return;
! 	    else
! 		xE.u.u.type = KeyRelease;
! #ifdef SUN_LED_SUPPORT
! 	    if ( pPriv->type == KB_SUN4 )
! 		    set_kbd_led(pKeyboard, FALSE, ledmask) ;
! 	} else {
! 	    if ( pPriv->type == KB_SUN4 )
! 		set_kbd_led (pKeyboard, TRUE, ledmask);
! #endif
! 	}
      }
  
      if ((xE.u.u.type == KeyPress) && (keyModifiers == 0)) {
***************
*** 621,626 ****
--- 860,866 ----
      int		kbdOpenedHere;
  
      static struct timeval lastChngKbdTransTv;
+     static int firsttime = 1;
      struct timeval tv;
      struct timeval lastChngKbdDeltaTv;
      int lastChngKbdDelta;
***************
*** 629,639 ****
       * Workaround for SS1 serial driver kernel bug when KIOCTRANS ioctl()s
       * occur too closely together in time.
       */
      gettimeofday(&tv, (struct timezone *) NULL);
!     tvminus(lastChngKbdDeltaTv, tv, lastChngKbdTransTv);
!     lastChngKbdDelta = TVTOMILLI(lastChngKbdDeltaTv);
      if (lastChngKbdDelta < 750) {
  	struct timeval wait;
  
  	/*
           * We need to guarantee at least 750 milliseconds between
--- 869,890 ----
       * Workaround for SS1 serial driver kernel bug when KIOCTRANS ioctl()s
       * occur too closely together in time.
       */
+     /*
+      * Is this still needed ???  What OS Versions???
+      */
+ #ifdef KIOCTRANS_HACK
      gettimeofday(&tv, (struct timezone *) NULL);
!     if (firsttime) {
! 	lastChngKbdTransTv = tv;
! 	lastChngKbdDelta   = 0;
! 	firsttime = 0;
!     } else {
! 	tvminus(lastChngKbdDeltaTv, tv, lastChngKbdTransTv);
! 	lastChngKbdDelta = TVTOMILLI(lastChngKbdDeltaTv);
!     }
      if (lastChngKbdDelta < 750) {
  	struct timeval wait;
+ 	int    mask = sigmask(SIGIO);       
  
  	/*
           * We need to guarantee at least 750 milliseconds between
***************
*** 641,650 ****
  	 */
  	wait.tv_sec = 0;
  	wait.tv_usec = (750L - lastChngKbdDelta) * 1000L;
!         (void) select(0, (int *)0, (int *)0, (int *)0, &wait);
          gettimeofday(&tv, (struct timezone *) NULL);
      }
      lastChngKbdTransTv = tv;
      
  
      pPriv = (KbPrivPtr)pKeyboard->devicePrivate;
--- 892,905 ----
  	 */
  	wait.tv_sec = 0;
  	wait.tv_usec = (750L - lastChngKbdDelta) * 1000L;
! 
! 	mask = sigblock(mask) ;
!         (void) select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &wait);
! 	(void) sigsetmask(mask) ;
          gettimeofday(&tv, (struct timezone *) NULL);
      }
      lastChngKbdTransTv = tv;
+ #endif
      
  
      pPriv = (KbPrivPtr)pKeyboard->devicePrivate;
***************
*** 792,802 ****
--- 1047,1078 ----
      register struct inputevent *se;
  {   
      Firm_event	fe;
+     int		loc;
+     static	Meta_On, Meta_hold;
  
      fe.time = event_time(se);
      fe.id = event_id(se);
      fe.value = (event_is_up(se) ? VKEY_UP : VKEY_DOWN);
  
+     if (fe.id > 0) {
+ 	loc = (fe.id - 1) * sunKeySyms[sysKbPriv.type].mapWidth;
+ 
+ 	if( sunKeySyms[sysKbPriv.type].map[loc] == XK_Meta_L ||
+ 	   sunKeySyms[sysKbPriv.type].map[loc] == XK_Meta_R ) /* Meta */
+ 	{
+ 		Meta_hold = fe.id;
+ 		Meta_On = (fe.value == VKEY_DOWN);
+ 	}
+ 	if( sunKeySyms[sysKbPriv.type].map[loc] == XK_L2 ) /* L2 */
+ 	{
+ 		if( fe.value == VKEY_DOWN && Meta_On )
+ 		{
+ 			stopme();
+ 			fe.id = Meta_hold;
+ 			fe.value = VKEY_UP;
+ 		}
+ 	}
+     }
      sunKbdProcessEvent (pKeyboard, &fe);
  }
  #endif SUN_WINDOWS
*** /tmp/,RCSt1a01938	Wed Apr 24 22:11:46 1991
--- ./server/ddx/sun/sun.h	Tue Oct 23 14:14:59 1990
***************
*** 248,259 ****
  extern struct timeval autoRepeatDeltaTv;
  
  #define tvminus(tv, tv1, tv2)	/* tv = tv1 - tv2 */ \
- 		if ((tv1).tv_usec < (tv2).tv_usec) { \
- 			(tv1).tv_usec += 1000000; \
- 			(tv1).tv_sec -= 1; \
- 		} \
  		(tv).tv_usec = (tv1).tv_usec - (tv2).tv_usec; \
! 		(tv).tv_sec = (tv1).tv_sec - (tv2).tv_sec;
  
  #define tvplus(tv, tv1, tv2)	/* tv = tv1 + tv2 */ \
  		(tv).tv_sec = (tv1).tv_sec + (tv2).tv_sec; \
--- 248,259 ----
  extern struct timeval autoRepeatDeltaTv;
  
  #define tvminus(tv, tv1, tv2)	/* tv = tv1 - tv2 */ \
  		(tv).tv_usec = (tv1).tv_usec - (tv2).tv_usec; \
! 		(tv).tv_sec = (tv1).tv_sec - (tv2).tv_sec; \
! 		if ((tv).tv_usec < 0) { \
! 			(tv).tv_usec += 1000000; \
! 			(tv).tv_sec -= 1; \
! 		}
  
  #define tvplus(tv, tv1, tv2)	/* tv = tv1 + tv2 */ \
  		(tv).tv_sec = (tv1).tv_sec + (tv2).tv_sec; \
*** /tmp/,RCSt1a01941	Wed Apr 24 22:11:47 1991
--- ./server/ddx/sun/sunKeyMap.c	Tue Oct 23 14:16:28 1990
***************
*** 350,356 ****
          XK_F7,          NoSymbol,               /* 0x10 */
          XK_F8,          NoSymbol,               /* 0x11 */
          XK_F9,          NoSymbol,               /* 0x12 */
! 	XK_Alt_L,	NoSymbol,		/* 0x13 */
          NoSymbol,       NoSymbol,               /* 0x14 */
          XK_R1,          XK_Pause,               /* 0x15 */
          XK_R2,          NoSymbol,               /* 0x16 */
--- 350,356 ----
          XK_F7,          NoSymbol,               /* 0x10 */
          XK_F8,          NoSymbol,               /* 0x11 */
          XK_F9,          NoSymbol,               /* 0x12 */
!         XK_Alt_L,       NoSymbol,               /* 0x13 */
          NoSymbol,       NoSymbol,               /* 0x14 */
          XK_R1,          XK_Pause,               /* 0x15 */
          XK_R2,          NoSymbol,               /* 0x16 */
***************
*** 376,384 ****
          XK_quoteleft,   XK_asciitilde,          /* 0x2a */
          XK_BackSpace,   NoSymbol,               /* 0x2b */
          NoSymbol,       NoSymbol,               /* 0x2c */
!         XK_R4,          XK_KP_Equal,		/* 0x2d */
!         XK_R5,          XK_KP_Divide,		/* 0x2e */
!         XK_R6,          XK_KP_Multiply,		/* 0x2f */
          NoSymbol,       NoSymbol,               /* 0x30 */
          XK_L5,          NoSymbol,               /* 0x31 */
          XK_Delete,      XK_KP_Decimal,          /* 0x32 */
--- 376,384 ----
          XK_quoteleft,   XK_asciitilde,          /* 0x2a */
          XK_BackSpace,   NoSymbol,               /* 0x2b */
          NoSymbol,       NoSymbol,               /* 0x2c */
!         XK_R4,          XK_KP_Equal,            /* 0x2d */
!         XK_R5,          XK_KP_Divide,           /* 0x2e */
!         XK_R6,          XK_KP_Multiply,         /* 0x2f */
          NoSymbol,       NoSymbol,               /* 0x30 */
          XK_L5,          NoSymbol,               /* 0x31 */
          XK_Delete,      XK_KP_Decimal,          /* 0x32 */
***************
*** 425,431 ****
          XK_Left,        XK_KP_4,                /* 0x5b */
          XK_R11,         XK_KP_5,                /* 0x5c */
          XK_Right,       XK_KP_6,                /* 0x5d */
!         XK_Insert,       XK_KP_0,                /* 0x5e */
          XK_L9,          NoSymbol,               /* 0x5f */
          NoSymbol,       NoSymbol,               /* 0x60 */
          XK_L10,         NoSymbol,               /* 0x61 */
--- 425,431 ----
          XK_Left,        XK_KP_4,                /* 0x5b */
          XK_R11,         XK_KP_5,                /* 0x5c */
          XK_Right,       XK_KP_6,                /* 0x5d */
!         XK_Insert,      XK_KP_0,                /* 0x5e */
          XK_L9,          NoSymbol,               /* 0x5f */
          NoSymbol,       NoSymbol,               /* 0x60 */
          XK_L10,         NoSymbol,               /* 0x61 */
***************
*** 459,464 ****
--- 459,486 ----
          XK_KP_Add,      XK_KP_Add,              /* 0x7d */
          NoSymbol,       NoSymbol,               /* 0x7e */
          NoSymbol,       NoSymbol,               /* 0x7f */
+ #ifdef SUN_NUMLOCK
+         /* these entries are faked scan codes for keys that are affected
+          * by the numlock key.  The order must match the table in sunKbd.c
+          */
+         XK_KP_Equal,    XK_R4,                  /* 0x2d => 0x80 */
+         XK_KP_Divide,   XK_R5,                  /* 0x2e => 0x81 */
+         XK_KP_Multiply, XK_R6,                  /* 0x2f => 0x82 */
+         XK_KP_Decimal,  NoSymbol,               /* 0x32 => 0x83 */
+         XK_KP_7,        XK_R7,                  /* 0x44 => 0x84 */
+         XK_KP_8,        XK_R8,                  /* 0x45 => 0x85 */
+         XK_KP_9,        XK_R9,                  /* 0x46 => 0x86 */
+         XK_KP_Subtract, NoSymbol,               /* 0x47 => 0x87 */
+         XK_KP_Enter,    NoSymbol,               /* 0x5a => 0x88 */
+         XK_KP_4,        XK_R10,                 /* 0x5b => 0x89 */
+         XK_KP_5,        XK_R11,                 /* 0x5c => 0x8a */
+         XK_KP_6,        XK_R12,                 /* 0x5d => 0x8b */
+         XK_KP_0,        NoSymbol,               /* 0x5e => 0x8c */
+         XK_KP_1,        XK_R13,                 /* 0x70 => 0x8d */
+         XK_KP_2,        XK_R14,                 /* 0x71 => 0x8e */
+         XK_KP_3,        XK_R15,                 /* 0x72 => 0x8f */
+         XK_KP_Add,      NoSymbol,               /* 0x7d => 0x90 */
+ #endif
  };
  
  
***************
*** 473,479 ****
--- 495,505 ----
  #endif
      Sun2Map,		1,	0x7a,	2,
      Sun3Map,		1,	0x7a,	2,
+ #ifdef SUN_NUMLOCK
+     Sun4Map,		1,	0x90,	2,
+ #else
      Sun4Map,		1,	0x7d,	2,
+ #endif
  };
  
  #define	cT	(ControlMask)
*** /tmp/,RCSt1a01944	Wed Apr 24 22:11:48 1991
--- ./server/ddx/sun/sunInit.c	Tue Oct 23 14:15:36 1990
***************
*** 689,691 ****
--- 689,786 ----
  
      return (fd);
  }
+ 
+ /*
+  * stopme - stop window for suntools
+  */
+ #ifdef	SUN_WINDOWS
+ #include    "validate.h"
+ #include    "windowstr.h"
+ #include    "dix.h"
+ extern WindowPtr *WindowTable;
+ 
+ stopme()
+ {
+     DevicePtr	pKbd;
+     int		i;
+     void	ExposeEveryone();
+ 
+     if( !sunUseSunWindows())
+ 	return;
+ 
+     /*
+      * on our way out -- shut down keyboard and mouse
+      * and remove the window
+      */
+     pKbd = LookupKeyboardDevice();
+     sunKbdProc(pKbd,  DEVICE_OFF);
+     sunMouseProc(pKbd, DEVICE_OFF);
+     win_remove(windowFd);
+ 
+     sunNonBlockConsoleOff((char *)0) ;
+     kill(0, SIGSTOP);
+ 
+     /*
+      * we're back, restore the window, and turn on the
+      * keyboard and mouse
+      * reset nonblocking mode on stderr.
+      */
+     i = fcntl(2, F_GETFL, 0);
+     if (i >= 0)
+         i = fcntl(2, F_SETFL, i | FNDELAY);
+     if (i < 0) {
+         perror("fcntl");
+         ErrorF("InitOutput: can't put stderr in non-block mode\n");
+     }
+     win_insert(windowFd);
+     sunMouseProc(pKbd, DEVICE_ON);
+     sunKbdProc(pKbd, DEVICE_ON);
+ 
+ 
+     /*
+      * refresh all screens
+      */
+     for( i = 0; i < screenInfo.numScreens; )
+         ExposeEveryone(WindowTable[i++]);
+ }
+ 
+ /*
+  * Cause a repaint of area slightly larger than window 
+  * by covering with temp window, and destroying the latter.  
+  * Shamelessly copied from the TileScreenSaver() code in dix/window.c
+  */
+ static void
+ ExposeEveryone(pWin)
+     WindowPtr pWin;
+ {
+     int       result;
+     XID       attributes[2];
+     Mask      mask = CWBackPixmap|CWOverrideRedirect;
+     WindowPtr tempWin;		
+     ScreenPtr pScreen = pWin->drawable.pScreen ;
+     Window    wid     = pWin->drawable.id;
+     
+ 
+ #define FUDGE 32
+ 
+     attributes[0] = None;
+     attributes[1] = xTrue;
+     tempWin = 
+ 	 CreateWindow(FakeClientID(0), pWin,
+ 	      (short)-FUDGE, (short)-FUDGE,
+ 	      (unsigned short)(pScreen->width + FUDGE),
+ 	      (unsigned short)(pScreen->height + FUDGE),
+ 	      0, InputOutput, mask, attributes, 0, serverClient,
+ 	      wVisual(pWin), &result);
+ 
+     if (!tempWin)
+ 	return;
+ 
+     if (!AddResource(tempWin->drawable.id, RT_WINDOW, (pointer)tempWin))
+ 	return;
+ 
+     MapWindow(tempWin, serverClient);
+     FreeResource(tempWin->drawable.id,RT_NONE) ;
+     DeleteWindow(tempWin,serverClient) ;
+ }
+ #endif	SUN_WINDOWS
*** /tmp/,RCSt1a01947	Wed Apr 24 22:11:48 1991
--- ./server/Imakefile	Mon Sep 24 15:15:44 1990
***************
*** 230,235 ****
--- 230,238 ----
  #if defined(UseSunWindowsInServer) && UseSunWindowsInServer
  SUNWINDOWSLIBS = -lsunwindow -lpixrect
  #endif
+ #if defined(UseSunAudioInServer) && UseSunAudioInServer
+ SUNAUDIOLIBS = -laudio
+ #endif
  #define need_dix
  #define need_ddx_snf
  #define need_ddx_mi
***************
*** 240,246 ****
  SUNDIRS = dix ddx/snf ddx/mi ddx/mfb ddx/cfb ddx/sun os/4.2bsd
  SUNOBJS = ddx/sun/sunInit.o $(FONTUTIL)
  SUNLIBS = $(SUN) $(CFB) $(DIX) $(BSD) $(SNF) $(MFB) $(MI) $(EXTENSIONS)
! SUNSYSLIBS = $(SYSLIBS) $(SUNWINDOWSLIBS)
  XsunDIRS = $(SUNDIRS)
  
  ServerTarget(Xsun,$(EXTDIR) $(FONTUTILDIR) $(SUNDIRS),$(SUNOBJS),$(SUNLIBS),$(SUNSYSLIBS))
--- 243,249 ----
  SUNDIRS = dix ddx/snf ddx/mi ddx/mfb ddx/cfb ddx/sun os/4.2bsd
  SUNOBJS = ddx/sun/sunInit.o $(FONTUTIL)
  SUNLIBS = $(SUN) $(CFB) $(DIX) $(BSD) $(SNF) $(MFB) $(MI) $(EXTENSIONS)
! SUNSYSLIBS = $(SUNAUDIOLIBS) $(SYSLIBS) $(SUNWINDOWSLIBS)
  XsunDIRS = $(SUNDIRS)
  
  ServerTarget(Xsun,$(EXTDIR) $(FONTUTILDIR) $(SUNDIRS),$(SUNOBJS),$(SUNLIBS),$(SUNSYSLIBS))
*** /tmp/,RCSt1a01950	Wed Apr 24 22:11:49 1991
--- ./clients/xinit/Imakefile	Mon Oct  1 17:18:13 1990
***************
*** 1,4 ****
--- 1,8 ----
+ #ifdef SunArchitecture
+         DEFINES = SunWindowsDefines ConnectionFlags -DBINDIR=\"$(BINDIR)\"
+ #else
          DEFINES = ConnectionFlags -DBINDIR=\"$(BINDIR)\"
+ #endif
          DEPLIBS = $(DEPXMULIB) $(DEPXLIB)
  LOCAL_LIBRARIES = $(XMULIB) $(XLIB)
            SRCS1 = xinit.c 
*** /tmp/,RCSt1a01953	Wed Apr 24 22:11:49 1991
--- ./clients/xinit/xinit.c	Sun Oct  7 03:31:52 1990
***************
*** 141,146 ****
--- 141,150 ----
      return;
  }
  
+ #ifdef sun
+ static char	*under_sunview;
+ #endif
+ 
  main(argc, argv)
  int argc;
  register char **argv;
***************
*** 175,181 ****
  		 * that means SunWindows isn't running, so we should pass 
  		 * the -C flag to xterm so that it sets up a console.
  		 */
! 		if ( getenv("WINDOW_PARENT") == NULL )
  		    *cptr++ = "-C";
  #endif /* sun */
  	} else {
--- 179,185 ----
  		 * that means SunWindows isn't running, so we should pass 
  		 * the -C flag to xterm so that it sets up a console.
  		 */
! 		if ( (under_sunview=getenv("WINDOW_PARENT")) == NULL )
  		    *cptr++ = "-C";
  #endif /* sun */
  	} else {
***************
*** 290,298 ****
  	signal(SIGUSR1, sigUsr1);
  	if ((serverpid = startServer(server)) > 0
  	 && (clientpid = startClient(client)) > 0) {
! 		pid = -1;
! 		while (pid != clientpid && pid != serverpid)
  			pid = wait(NULL);
  	}
  	signal(SIGQUIT, SIG_IGN);
  	signal(SIGINT, SIG_IGN);
--- 294,315 ----
  	signal(SIGUSR1, sigUsr1);
  	if ((serverpid = startServer(server)) > 0
  	 && (clientpid = startClient(client)) > 0) {
! #ifndef SUN_WINDOWS
! 		for (pid = -1;  pid != clientpid && pid != serverpid;)
  			pid = wait(NULL);
+ #else
+ 		for(pid=-1; pid != clientpid && pid != serverpid;) 
+ 		{
+ 			pid = wait3(&status, WUNTRACED, NULL) ;
+ 			if ( under_sunview && pid == serverpid )
+ 				if (WIFSTOPPED(status)) {
+ 					(void)sigblock(SIGCHLD) ;
+ 					(void)kill(0,SIGSTOP) ;
+ 					(void)kill(serverpid,SIGCONT) ;
+ 					pid = -1;
+ 				}
+ 		}
+ #endif
  	}
  	signal(SIGQUIT, SIG_IGN);
  	signal(SIGINT, SIG_IGN);
*** /tmp/,RCSt1a01956	Wed Apr 24 22:11:50 1991
--- ./config/sun.cf	Mon Oct 15 21:42:41 1990
***************
*** 10,18 ****
  #define OSMinorVersion    1
  #define HasSaberC	  NO		/* for machines that have it */
  #define HasNdbm		  YES
! #define XsunServer 	  Xsun
  
! #define HasGcc 		  NO  	/* VERY USEFUL for server on Sun3 */
  
  #define SystemV           NO
  #define HasPutenv YES
--- 10,24 ----
  #define OSMinorVersion    1
  #define HasSaberC	  NO		/* for machines that have it */
  #define HasNdbm		  YES
! #define XsunServer	  Xsun
! #define ManPath		  /usr/local/man
! #define ManSuffix	  1
  
! #ifdef sparc
! #define HasGcc NO
! #else
! #define HasGcc YES 	/* VERY USEFUL for server on Sun3 */
! #endif
  
  #define SystemV           NO
  #define HasPutenv YES
***************
*** 42,47 ****
--- 48,54 ----
  
  /* you may find one or both of these options useful on your system */
  /* #define DefaultCCOptions -f68881 -pipe */
+ #define DefaultCCOptions -pipe
  
  #define LibraryCCOptions /* don't want special floating point */
  #define LibraryDefines  /**/
***************
*** 53,59 ****
--- 60,70 ----
  
  #if OSMajorVersion == 3 && OSMinorVersion <= 2
  #define OptimizedCDebugFlags /* as nothing */
+ #else
+ #ifdef SparcArchitecture
+ #define OptimizedCDebugFlags	-O4
  #endif
+ #endif
  
  #define UseSunWindowsInServer	YES	/* link in SunWindows support? */
  
***************
*** 63,68 ****
--- 74,106 ----
  #define SunWindowsDefines /* as nothing */
  #endif
  
+ #define UseSunAudioInServer	YES
+ #define UseSunNumlock		YES	/* enable numlock support on type4 kbds? */
+ 
+ #if UseSunNumlock
+ #if OSMajorVersion >= 4 && OSMinorVersion >= 1
+ #define SunNumlockDefines	-DSUN_NUMLOCK -DSUN_LED_SUPPORT
+ #else
+ #define SunNumlockDefines	-DSUN_NUMLOCK
+ #endif
+ #else
+ #define SunNumlockDefines	/* as nothing */
+ #endif
+ 
+ #if UseSunAudioInServer
+ #if OSMajorVersion >= 4 && OSMinorVersion >= 1
+ #define UseSunAudioInServer	YES	/* use /dev/audio for bell? */
+ #else
+ #define UseSunAudioInServer	NO
+ #endif
+ #endif
+ 
+ #if UseSunAudioInServer
+ #define SunAudioDefines -DSUN_AUDIO_FILE=\"XSUNBELLFILE\"
+ #else
+ #define SunAudioDefines	/* as nothing */
+ #endif
+ 
  /* define this as you like for server compilation */
  #if OSMajorVersion >= 4 || defined(SparcArchitecture)
  #define AllocateLocalDefines -DINCLUDE_ALLOCA_H
***************
*** 70,78 ****
  #define AllocateLocalDefines /**/
  #endif
  
! #define ExtensionDefines -DSHAPE -DMITSHM -DMULTIBUFFER -DMITMISC
  
! #define ServerDefines -DXDMCP SunWindowsDefines ExtensionDefines AllocateLocalDefines
  
  #if OSMajorVersion >= 4 && OSMinorVersion >= 0
  #define SetTtyGroup YES
--- 108,116 ----
  #define AllocateLocalDefines /**/
  #endif
  
! #define ExtensionDefines -DMULTIBUFFER
  
! #define ServerDefines -DXDMCP SunNumlockDefines SunWindowsDefines SunAudioDefines ExtensionDefines AllocateLocalDefines
  
  #if OSMajorVersion >= 4 && OSMinorVersion >= 0
  #define SetTtyGroup YES

--
        Viktor Dukhovni <viktor at shearson.com>       : ARPA
                <...!uunet!shearson.com!viktor>     : UUCP
        388 Greenwich St., 11th floor, NY, NY 10013 : US-Post
                +1-(212)-464-3793                   : VOICE



More information about the Comp.unix.internals mailing list