>># 
>># Copyright 1990, 1991 by the Massachusetts Institute of Technology and
>># UniSoft Group Limited.
>># 
>># Permission to use, copy, modify, distribute, and sell this software and
>># its documentation for any purpose is hereby granted without fee,
>># provided that the above copyright notice appear in all copies and that
>># both that copyright notice and this permission notice appear in
>># supporting documentation, and that the names of MIT and UniSoft not be
>># used in advertising or publicity pertaining to distribution of the
>># software without specific, written prior permission.  MIT and UniSoft
>># make no representations about the suitability of this software for any
>># purpose.  It is provided "as is" without express or implied warranty.
>># 
>># $XConsortium: gtmdfrmppn.m,v 1.8 92/06/11 17:14:08 rws Exp $
>># 
>>#
>>TITLE XGetModifierMapping CH07
>>ASSERTION A XGetModifierMapping-1
A call to XGetModifierMapping returns a pointer to a newly
created XModifierKeymap structure that contains the KeyCodes
being used as modifiers and the structure can be freed with
XFreeModifiermap.
>>STRATEGY
Call XGetModifierMapping to get the current map.
Free map with XFreeModifiermap.
>>ASSERTION B XGetModifierMapping-2
When only zero values appear in the set for any modifier,
then that modifier is disabled.
>>STRATEGY
If extension available and at least one button:
  Create a window.
  Get two copies of current modifier map using XGetModifierMapping, save one.
  Zero keycodes for Shift.
  Call XSetModiferMapping to set map to that with zeroed Shift row.
  Set passive pointer grab on AnyButton with Shift modifier for window.
  Warp pointer into window.
  For all keycodes
    Simulate key press.
    Simulate Button1 press.
    Check that pointer grab not active (i.e. key has not acted as Shift modifier).
    Release key and button.
  Restore map to saved version.
  Free maps.
else
  report untested.
