[comp.windows.x] XGrabKey with CapsLock key

sundar@WHEATIES.AI.MIT.EDU (Sundar Narasimhan) (02/20/89)

Ok, I give up! I am trying to use XGrabKey to determine when the Caps
Lock key goes down (This started out as a simple program to display
something when the caps lock key is down)...

1. I first tried something like (to see if I can figure out when the
   caps lock key goes down at all):
     XtAddEventHandler(tty, KeyPress, 0, key_press, 0);
   to get my client widget to notice KeyPress events. This failed to work,
   since it never gets to see the first time the CapsLock key going
   down (i.e. key_press is never entered the first time capslock goes
   down). However as soon as I did 
     XtAddEventHandler(tty, KeyPress|KeyRelease, 0, key_press, 0);
   I started to see the first CapsLock keypress transition. Running
   xev I noticed that the my capslock (on a Sun 3/60) generates a KeyPress
   the first time I press it, and a KeyRelease the second time (which
   is entirely logical). Why does the toolkit not see the first
   keypress if I just have a eventhandler for KeyPress events?

2. Obviously, this will work only if I press the CapsLock key while
   within my client window. Since I wanted it to work anywhere from within
   my display. I thought I would do something like:
  
	XGrabKey(XtDisplay(tty), 
		 XKeysymToKeycode(XtDisplay(tty),XK_Caps_Lock),
		 AnyModifier,
		 DefaultRootWindow(XtDisplay(tty)), FALSE, 
	         GrabModeAsync, GrabModeAsync);
        [Minor nit: what is this routine supposed to return? The documentation
	 (even the newly released C Library and Protocol Reference) mentions
	 what error values can be returned but I seem to get some bizarre
	 number like 1401158 when the grab succeeds!]

   I thought by doing this, when the caps lock key is pressed, an
   active grab would ensue, and a keypress event would be sent to the
   client. The active grab does seem to happen, but my client never gets
   to see the keypress event (this may be related to the same problem
   as in 1). (If it had, it would have altered a state bit, ungrabbed
   the key and re-issued a passive grab, to get to see when the next time
   the capslock key goes down -- Is this the right way to do this? Seems
   awful to have to go through all these convolutions!)
	
I've re-read the documentation and it is VERY confusing, to say the least.
(BTW does anyone have a simple program that uses GrabKey along with
the toolkit? Do any of the distributed clients do anything like this?) 

-Sundar