[comp.windows.x] V11 fix #30, server trio, make Lock keys toggle

RWS@ZERMATT.LCS.MIT.EDU (Robert Scheifler) (10/22/87)

VERSION:
	X11 release 1
SYNOPSIS:
	Lock keys on VAXen and Suns don't toggle, but just act like
	vanilla shift keys.

	Pressing or releasing a modifier key on a Sun disables
	autorepeat on any "real" key that is down.
FIX:
	3 files: server/dix/events.c, server/ddx/lk201/lk201.c, server/ddx/sun/sunKbd.c

	in server/dix/events.c:

*** /tmp/,RCSt1003374	Thu Oct 22 09:07:06 1987
--- events.c	Thu Oct 22 09:06:37 1987
***************
*** 23,29 ****
  ********************************************************/
  
  
! /* $Header: events.c,v 1.109 87/10/02 15:31:47 rws Exp $ */
  
  #include "X.h"
  #include "misc.h"
--- 23,29 ----
  ********************************************************/
  
  
! /* $Header: events.c,v 1.110 87/10/22 09:05:38 rws Exp $ */
  
  #include "X.h"
  #include "misc.h"
***************
*** 155,161 ****
   *	This is a CARD16 bitmap 'cos it includes the mouse buttons to
   *	make grab processing simpler.
   */
! static CARD16 keyModifiersList[MAP_LENGTH];
  static CARD16 maxKeysPerModifier;
  /*
   *	We also keep a copy of the modifier map in the format
--- 155,161 ----
   *	This is a CARD16 bitmap 'cos it includes the mouse buttons to
   *	make grab processing simpler.
   */
! CARD16 keyModifiersList[MAP_LENGTH];
  static CARD16 maxKeysPerModifier;
  /*
   *	We also keep a copy of the modifier map in the format




	in server/ddx/lk201/lk201.c:

*** /tmp/,RCSt1003408	Thu Oct 22 09:16:33 1987
--- lk201.c	Thu Oct 22 09:16:11 1987
***************
*** 21,27 ****
  SOFTWARE.
  
  ********************************************************/
! /* $Header: lk201.c,v 1.25 87/09/13 00:51:54 toddb Exp $ */
  
  #include "X.h"
  #define NEED_EVENTS
--- 21,27 ----
  SOFTWARE.
  
  ********************************************************/
! /* $Header: lk201.c,v 1.26 87/10/22 09:15:45 rws Exp $ */
  
  #include "X.h"
  #define NEED_EVENTS
***************
*** 32,39 ****
  /* This file is device dependent, but is common to several devices */
  
  #include <sys/types.h>
! #include "input.h"
  
  #define KEYDOWN_ERROR	0x3d
  #define POWERUP_ERROR 	0x3e
  #define BASEKEY		0x41
--- 32,41 ----
  /* This file is device dependent, but is common to several devices */
  
  #include <sys/types.h>
! #include "inputstr.h"
  
+ extern CARD16 keyModifiersList[];
+ 
  #define KEYDOWN_ERROR	0x3d
  #define POWERUP_ERROR 	0x3e
  #define BASEKEY		0x41
***************
*** 58,63 ****
--- 60,69 ----
  
  /* Handle keyboard input from LK201 */
  
+ /* Whatever key is associated with the Lock modifier is treated as a toggle key.
+  * The code assumes that such keys are always in up/down mode.
+  */
+ 
  void
  ProcessLK201Input (e, dev)
  	register xEvent *e;
***************
*** 79,84 ****
--- 85,97 ----
  		e->u.u.type = KeyPress;
  	    else
  		e->u.u.type = KeyRelease;
+ 	    if (keyModifiersList[lastkey] & LockMask)
+ 	    {
+ 		if (e->u.u.type == KeyRelease)
+ 		    return;
+ 		if (((DeviceIntPtr)dev)->down[lastkey >> 3] & (1 << (lastkey & 7)))
+ 		    e->u.u.type = KeyRelease;
+ 	    }
  	    (*dev->processInputProc)(e, dev);
  	}
  	else
***************
*** 114,120 ****
  			    if (bits & 1)
  			    {
  				e->u.u.detail = (idx << 5) | key;
! 				(*dev->processInputProc)(e, dev);
  			    }
  			    key++;
  			} while (bits >>= 1);
--- 127,134 ----
  			    if (bits & 1)
  			    {
  				e->u.u.detail = (idx << 5) | key;
! 				if (!(keyModifiersList[e->u.u.detail] & LockMask))
! 				    (*dev->processInputProc)(e, dev);
  			    }
  			    key++;
  			} while (bits >>= 1);




	in server/ddx/sun/sunKbd.c:

*** /tmp/,RCSt1003433	Thu Oct 22 09:20:46 1987
--- sunKbd.c	Thu Oct 22 09:20:27 1987
***************
*** 51,57 ****
--- 51,60 ----
  #include <stdio.h>
  #include "Xproto.h"
  #include "keysym.h"
+ #include "inputstr.h"
  
+ extern CARD16 keyModifiersList[];
+ 
  typedef struct {
      int	    	  trans;          	/* Original translation form */
  } SunKbPrivRec, *SunKbPrivPtr;
***************
*** 365,370 ****
--- 368,374 ----
      PtrPrivPtr	  	ptrPriv;
      int			delta;
      static xEvent	autoRepeatEvent;
+     BYTE		key;
  
      ptrPriv = (PtrPrivPtr) LookupPointerDevice()->devicePrivate;
  
***************
*** 402,421 ****
  	return;
      }
  
!     /*
!      * Kill AutoRepeater on any real Kbd event.
!      */
!     autoRepeatKeyDown = 0;
!     if (autoRepeatDebug)
! 	ErrorF("sunKbdProcessEvent: autoRepeat off\n");
  
      xE.u.keyButtonPointer.time = TVTOMILLI(fe->time);
      xE.u.keyButtonPointer.rootX = ptrPriv->x;
      xE.u.keyButtonPointer.rootY = ptrPriv->y;
      xE.u.u.type = ((fe->value == VKEY_UP) ? KeyRelease : KeyPress);
!     xE.u.u.detail = (fe->id & 0x7F) + sysKbPriv.offset;
  
!     if (fe->value == VKEY_DOWN) {	/* turn on AutoRepeater */
  	if (autoRepeatDebug)
              ErrorF("sunKbdProcessEvent: VKEY_DOWN\n");
  	autoRepeatEvent = xE;
--- 406,438 ----
  	return;
      }
  
!     key = (fe->id & 0x7F) + sysKbPriv.offset;
!     if (!keyModifiersList[key])
!     {
! 	/*
! 	 * Kill AutoRepeater on any real non-modifier Kbd event.
! 	 */
! 	autoRepeatKeyDown = 0;
! 	if (autoRepeatDebug)
! 	    ErrorF("sunKbdProcessEvent: autoRepeat off\n");
!     }
  
      xE.u.keyButtonPointer.time = TVTOMILLI(fe->time);
      xE.u.keyButtonPointer.rootX = ptrPriv->x;
      xE.u.keyButtonPointer.rootY = ptrPriv->y;
      xE.u.u.type = ((fe->value == VKEY_UP) ? KeyRelease : KeyPress);
!     xE.u.u.detail = key;
  
!     if (keyModifiersList[key] & LockMask)
!     {
! 	if (xE.u.u.type == KeyRelease)
! 	    return; /* this assumes autorepeat is not desired */
! 	if (((DeviceIntPtr)pKeyboard)->down[key >> 3] & (1 << (key & 7)))
! 	    xE.u.u.type = KeyRelease;
!     }
! 
!     if ((fe->value == VKEY_DOWN) && !autoRepeatKeyDown)
!     {	/* turn on AutoRepeater */
  	if (autoRepeatDebug)
              ErrorF("sunKbdProcessEvent: VKEY_DOWN\n");
  	autoRepeatEvent = xE;