Thu Aug 27 08:53:19 2020 UTC ()
Pull up following revision(s) (requested by tsutsui in ticket #1061):

	external/mit/xorg-server/dist/hw/sun/sunCfb.c: revision 1.6
	external/mit/xorg-server/dist/hw/sun/sunCursor.c: revision 1.1
	external/mit/xorg-server/dist/hw/sun/sunInit.c: revision 1.1
	external/mit/xorg-server/dist/hw/sun/sunInit.c: revision 1.2
	external/mit/xorg-server/dist/hw/sun/sunInit.c: revision 1.3
	external/mit/xorg-server/dist/hw/sun/sunInit.c: revision 1.4
	external/mit/xorg-server/dist/hw/sun/sunFbs.c: revision 1.1
	external/mit/xorg-server/dist/hw/sun/sunCfb24.c: revision 1.1
	external/mit/xorg-server/dist/hw/sun/sunInit.c: revision 1.5
	external/mit/xorg-server/dist/hw/sun/sunFbs.c: revision 1.2
	external/mit/xorg-server/dist/hw/sun/sunMouse.c: revision 1.1
	external/mit/xorg-server/dist/hw/sun/sunInit.c: revision 1.6
	external/mit/xorg-server/dist/hw/sun/sunGX.c: revision 1.1
	external/mit/xorg-server/dist/hw/sun/sunFbs.c: revision 1.3
	external/mit/xorg-server/dist/hw/sun/kbd_mode.c: revision 1.1
	external/mit/xorg-server/dist/hw/sun/sunMouse.c: revision 1.2
	external/mit/xorg-server/dist/hw/sun/sunInit.c: revision 1.7
	external/mit/xorg-server/dist/hw/sun/sunInit.c: revision 1.8
	external/mit/xorg-server/dist/hw/sun/sunIo.c: revision 1.1
	external/mit/xorg-server/dist/hw/sun/sunInit.c: revision 1.9
	external/mit/xorg-server/dist/hw/sun/sunGX.h: revision 1.1
	external/mit/xorg-server/dist/hw/sun/sunIo.c: revision 1.2
	external/mit/xorg-server/dist/hw/sun/sun.h: revision 1.1
	external/mit/xorg-server/dist/hw/sun/Xsun.man: revision 1.1
	external/mit/xorg-server/dist/hw/sun/sunIo.c: revision 1.3
	external/mit/xorg-server/dist/hw/sun/sun.h: revision 1.2
	external/mit/xorg-server/dist/hw/sun/sunKeyMap.c: revision 1.1
	external/mit/xorg-server/dist/hw/sun/sunIo.c: revision 1.4
	external/mit/xorg-server/dist/hw/sun/sun.h: revision 1.3
	external/mit/xorg-server/dist/hw/sun/constype.c: revision 1.1
	external/mit/xorg-server/dist/hw/sun/sunMultiDepth.c: revision 1.1
	external/mit/xorg-server/dist/hw/sun/sunKeyMap.c: revision 1.2
	external/mit/xorg-server/dist/hw/sun/sunIo.c: revision 1.5
	external/mit/xorg-server/dist/hw/sun/sun.h: revision 1.4
	external/mit/xorg-server/dist/hw/sun/sunMfb.c: revision 1.1
	external/mit/xorg-server/dist/hw/sun/sunKeyMap.c: revision 1.3
	external/mit/xorg-server/dist/hw/sun/sun.h: revision 1.5
	external/mit/xorg-server/dist/hw/sun/README: revision 1.1
	external/mit/xorg-server/dist/hw/sun/sun.h: revision 1.6
	external/mit/xorg-server/dist/hw/sun/sun.h: revision 1.7
	external/mit/xorg-server/dist/hw/sun/kbd_mode.man: revision 1.1
	external/mit/xorg-server/dist/hw/sun/circleset.h: revision 1.1
	external/mit/xorg-server/dist/hw/sun/sunKbd.c: revision 1.1
	external/mit/xorg-server/dist/hw/sun/sunKbd.c: revision 1.2
	external/mit/xorg-server/dist/hw/sun/sunKbd.c: revision 1.3
	external/mit/xorg-server/dist/hw/sun/sunKbd.c: revision 1.4
	external/mit/xorg-server/dist/hw/sun/sunKbd.c: revision 1.5
	external/mit/xorg-server/dist/hw/sun/sunKbd.c: revision 1.6
	external/mit/xorg-server/dist/hw/sun/sunKbd.c: revision 1.7
	external/mit/xorg-server/dist/hw/sun/constype.man: revision 1.1
	external/mit/xorg-server/dist/hw/sun/sunCfb.c: revision 1.1
	external/mit/xorg-server/dist/hw/sun/sunCfb.c: revision 1.2
	external/mit/xorg-server/dist/hw/sun/sunCfb.c: revision 1.3
	external/mit/xorg-server/dist/hw/sun/sunCfb.c: revision 1.4
	external/mit/xorg-server/dist/hw/sun/sunCfb.c: revision 1.5

Import WIP Xorg-Server-1.20'fied monolithic Xsun servers.
This is based on 1.10 version imported into xorg-server.old and
all upstream API changes between xorg-server 1.10 and 1.20 are
applied almost mechanically.
 https://github.com/tsutsui/xorg-server-Xsun/commits/xorg-server-1.20

Xsun and XsunMono servers are also confirmed working with bwtwo on
3/60 and tme, and cgtwo on tme. XKB stuff is still to be resolved.

Use proper ANSI offsetof(3) to specify framebuffer offset in struct.
Fixes build error on sparc64.  No binary change on sun3.

Apply upstream "free the EQ allocated memory on shutdown" fixes.

This should be updated before 1.20 import:
 https://cgit.freedesktop.org/xorg/xserver/commit/?id=87d4f90bfcb509471ac9e7886e14a92b33223fd7

Use proper args for dixLookupResourceByType() to get defcolormap.
Botched in mechanical 1.20 updates.

Add prototype declarations for CG2 functions.

Implement functions to restore palette settings on exiting Xserver.

Explicitly initialize origColormapValid for readability.

Fix LED defintions to match xkb/xkbInit.c.

Now CapsLock and NumLock LEDs work correctly.
XXX: No ScrollLock LED

Remove unused functions required to handle non-XKB autorepeat.

Initialize ModMap dynamically using keymap data per each keyboard.
Now ScrollLock LED works properly.

Remove now unused ModMap data for each keyboard.

Use "empty" for rmlvo model and layout to avoid lingering default settings.
Now all modifier keys (CTRL, SHIFT, and NumLock) work as expected.

It seems XkbApplyMappingChange() doesn't update some XKB modifier
settings even if new modmap data is specified.

Trailing whitespace.

Call LogInit() for logging to /var/log/Xsun.%s.log as Xorg server.

Inform detected keyboard type and layout via LogMessage().

Remove a leftover variable for non-XKB autorepeat.

Remove redundant command option arg checks.

Put probed framebuffer info to a log file by default.

Remove more redundant command option arg checks.

Avoid dumb DevicePtr casts.


(martin)
diff -r0 -r1.1.2.2 xsrc/external/mit/xorg-server/dist/hw/sun/README
diff -r0 -r1.1.2.2 xsrc/external/mit/xorg-server/dist/hw/sun/Xsun.man
diff -r0 -r1.1.2.2 xsrc/external/mit/xorg-server/dist/hw/sun/circleset.h
diff -r0 -r1.1.2.2 xsrc/external/mit/xorg-server/dist/hw/sun/constype.c
diff -r0 -r1.1.2.2 xsrc/external/mit/xorg-server/dist/hw/sun/constype.man
diff -r0 -r1.1.2.2 xsrc/external/mit/xorg-server/dist/hw/sun/kbd_mode.c
diff -r0 -r1.1.2.2 xsrc/external/mit/xorg-server/dist/hw/sun/kbd_mode.man
diff -r0 -r1.1.2.2 xsrc/external/mit/xorg-server/dist/hw/sun/sunCfb24.c
diff -r0 -r1.1.2.2 xsrc/external/mit/xorg-server/dist/hw/sun/sunCursor.c
diff -r0 -r1.1.2.2 xsrc/external/mit/xorg-server/dist/hw/sun/sunGX.c
diff -r0 -r1.1.2.2 xsrc/external/mit/xorg-server/dist/hw/sun/sunGX.h
diff -r0 -r1.1.2.2 xsrc/external/mit/xorg-server/dist/hw/sun/sunMfb.c
diff -r0 -r1.1.2.2 xsrc/external/mit/xorg-server/dist/hw/sun/sunMultiDepth.c
diff -r0 -r1.7.2.2 xsrc/external/mit/xorg-server/dist/hw/sun/sun.h
diff -r0 -r1.7.2.2 xsrc/external/mit/xorg-server/dist/hw/sun/sunKbd.c
diff -r0 -r1.6.2.2 xsrc/external/mit/xorg-server/dist/hw/sun/sunCfb.c
diff -r0 -r1.3.2.2 xsrc/external/mit/xorg-server/dist/hw/sun/sunFbs.c
diff -r0 -r1.3.2.2 xsrc/external/mit/xorg-server/dist/hw/sun/sunKeyMap.c
diff -r0 -r1.9.2.2 xsrc/external/mit/xorg-server/dist/hw/sun/sunInit.c
diff -r0 -r1.5.2.2 xsrc/external/mit/xorg-server/dist/hw/sun/sunIo.c
diff -r0 -r1.2.2.2 xsrc/external/mit/xorg-server/dist/hw/sun/sunMouse.c

File Added: xsrc/external/mit/xorg-server/dist/hw/sun/README
A joint production of:

	Adam de Boor		University of California,  Berkeley

	David Rosenthal
	Stuart Marks
	Robin Schaufler
	Mike Schwartz
	Frances Ho
	Geoff Lee
	Mark Opperman		Sun Microsystems

	Bob Scheifler		MIT Laboratory for Computer Science
	Keith Packard

This version of the Sun X11 drivers uses ../mi,  ../mfb and ../cfb to support
the following configurations:

	Sun/2		bw2	cg2/3/5
	Sun/3		bw2	cg2/3/4/5
	Sun/4		bw2	cg2/4
	SPARCstation		cg3/6
	Sun/386i	mono	color

The following configurations are NOT supported:

	Sun/1		bw1	cg1	(requires separate port)
	Sun/2			gp	(use /dev/cgtwo0)
	Sun/3			gp	(use /dev/cgtwo0)
	Sun/4			gp	(use /dev/cgtwo0)

The mfb and cfb code has been substantially tuned for 1- and 8-bit framebuffers
(with code for both fast and slow cpu-to-memory ratios).  It installs and runs
on these configurations under SunOS 3.2, 3.4, and 4.0.  However, we must stress
that it is completely unsupported, and if you have problems installing or using
it you are on your own.


Things to check before building:

1)	config/sun.cf - set the SunOSMajorVersion and SunOSMinorVersion 
	parameters to the right values.

2)	config/Project.tmpl - check LIBDIR, FONTDIR, etc.; set 
	define LibDir, FontDir, etc. in site.def as required.



Then build the system by:

1)	Go for it.  In the top-level directory, type

	make World

	This takes about forty minutes on a 4/260, and somewhat longer
	on other Suns.


2)	Go for it.  In the top-level directory, type

	make install

	Otherwise, you'll want to create a bunch of symbolic links to
	the various executables and data files scattered throughout
	the hierarchy.



3)	On the console, or from an rlogin connection, put whatever you
	chose for BINDIR (in Imake.tmpl) in your search path, and then
	start the server:

	    xinit
	or
	    xinit -- -dev /dev/??? [see below]

	If it's from the console,  you probably want to redirect the
	output thus:

	    xinit >& /tmp/x11.out

4)	xinit should start up an xterm window that acts as a console.  When
	this xterm terminates, the xinit will kill the server.  You can also
	start up client programs from a terminal or rlogin, but you must
	first set the DISPLAY environment variable:

	    setenv DISPLAY unix:0
	    xterm &


5)	Make sure that you have special devices in /dev for the appropriate 
	framebuffer.  See the manual page for Xsun for details or run the
	constype program. VME systems require special .o files when more
        than one of a particular frame buffer type is installed.


6)	In general,  Xsun auto-configures to use all the available framebuffers
	(see the Xsun manual page).  In some circumstances, you may need to 
	use the -dev switch on the command line to specify a specific device
	to use.  In particular, on the GP, GP+, and GP2, you'll need to
	specify -dev /dev/cgtwo0 your xdm Xservers file or your xinit script.


7)	To shut the server down,  send it a Hangup or Terminate signal.


8)	If X crashes, it will leave the keyboard in a funny state.  There is a
	program called "kbd_mode" that will reset the mode of the keyboard.
	"kbd_mode -a" is the appropriate setting for the bare console, and
	"kbd_mode -e" is the appropriate setting for running with SunWindows.
	You may have to issue this command from a terminal or from an rlogin
	connection.  If you run from the bare console, you can give the
	command

	xinit ; kbd_mode -a

	so that the keyboard mode will ALWAYS be set properly when the server
	terminates.

File Added: xsrc/external/mit/xorg-server/dist/hw/sun/Xsun.man
.\" $Xorg: Xsun.man,v 1.4 2001/02/09 02:04:43 xorgcvs Exp $
.\" Copyright 1988 Sun Microsystems, Inc.
.\" Copyright 1993, 1994, 1998  The Open Group
.\" 
.\" 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.
.\" 
.\" The above copyright notice and this permission notice shall be included
.\" in all copies or substantial portions of the Software.
.\" 
.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
.\" IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
.\" OTHER DEALINGS IN THE SOFTWARE.
.\" 
.\" Except as contained in this notice, the name of The Open Group shall
.\" not be used in advertising or otherwise to promote the sale, use or
.\" other dealings in this Software without prior written authorization
.\" from The Open Group.
.\"
.\" $XFree86: xc/programs/Xserver/hw/sun/Xsun.man,v 1.9 2005/02/11 03:03:10 dawes Exp $
.\"
.TH XSUN 1 __vendorversion__
.SH NAME
Xsun, XsunMono, Xsun24 \- Sun server for X Version 11
.SH SYNOPSIS
.B Xsun
[ option ] ...
.SH DESCRIPTION
.I Xsun
is the server for Version 11 of the X window system on Sun hardware.
It will normally be started by the \fIxdm(1)\fP daemon or by a script
that runs the program \fIxinit(1)\fP.
.SH CONFIGURATIONS
.PP
.I XsunMono
supports the BW2 monochrome frame buffer.
.I Xsun
supports the CG2, CG3, CG4, and CG6 8-bit color frame buffers in
addition to the BW2 monochrome frame buffer. On Solaris 2.5 it also
supports the TCX as an 8-bit color frame buffer.
.I Xsun24
supports the cgeight 24-bit color frame buffer in addition to the
8-bit color and monochrome frame buffers that
.I Xsun
supports.
.PP
If specific framebuffer device files aren't specified on the command 
line with the \fI\-dev\fP switch or in the \fIXDEVICE\fP environment
variable, the server will search for all installed frame buffers and 
will use all those that it finds.
.PP
Finally, if no specific framebuffers are found, the generic framebuffer 
interface \fI/dev/fb\fP is used.
.PP
.SH KEYBOARDS
.PP
Xsun, Xsun24, and XsunMono support the Type-2, Type-3, and many variations 
of the Type-4 and Type-5 keyboards.
.PP
Type-4 and Type-5 keyboards feature a key labeled \fIAltGraph\fP which 
is a mode-shift key. The mode-shift key is used to generate the symbols 
painted on the fronts of the keys. The mode-shift key works exactly like 
the \fIShift\fP, \fIControl\fP, \fIAlt\fP, and \fI<Meta>\fP keys.
.PP
The ten function keys on the left side of the Type-5 keyboard may be 
considered as having L1..L10 painted on their fronts.  Shift-AltGraph 
will cause different keysyms to be generated for some keys, e.g. the 
Type-5 \fISysRq\fP key.
.PP
For compatibility with Sun's X11/NeWS server, the F11 and F12 keys may 
be made to generate the equivalent X11/NeWS keysyms by using mode-switch.
.PP
For backwards compatibility, the normal and mode-shifted keysyms for 
the ten function keys on the left side of Type-4 and Type-5 keyboards 
may be swapped via command line option. See \fI-swapLkeys\fP.
.PP
The X LEDs 1..4 correspond to the NumLock, ScrollLock, Compose, and
CapsLock LEDs respectively. Pressing the key once turns the corresponding
LED on. Pressing the key again turns the LED off. Turning an LED on or 
off with e.g. 'xset [-]led [1234]' is equivalent to pressing the 
corresponding key.
.SH OPTIONS
.PP
In addition to the normal server options described in the \fIXserver(1)\fP
manual page, \fIXsun\fP accepts the following command line switches:
.TP 8
.B "\-ar1 \fImilliseconds\fP"
This option specifies amount of time in milliseconds before which a 
pressed key should begin to autorepeat.
.TP 8
.B "\-ar2 \fImilliseconds\fP"
This option specifies the interval in milliseconds between autorepeats 
of pressed keys.
.TP 8
.B \-swapLkeys
Swaps the normal keysyms for the function keys on the left side of 
Type-4 and Type-5 keyboards with the alternate keysyms, i.e. the keysyms 
painted on the front of the keys.
.TP 8
.B \-flipPixels
The normal pixel values for white and black are 0 and 1 respectively. 
When -flipPixels is specified these values are reversed.
.TP 8
.B \-mono
When used with the \fBcgtwo\fP, this option indicates that the server 
should emulate a monochrome framebuffer instead of the normal color 
framebuffer.  When used with the \fBcgfour\fP, this option indicates 
that the monochrome screen should be numbered 0 and the color screen 
numbered 1 (instead of the other way around).
.TP 8
.B \-zaphod
This option disables switching between screens by sliding the mouse off 
the left or right edges.  With this disabled, a window manager function 
must be used to switch between screens.
.TP 8
.B \-debug
This option indicates that the server is being run from a debugger, and 
that it should \fBnot\fP put its standard input, output and error files 
into non-blocking mode.
.TP 8
.B "\-dev \fIfilename[:filename]...\fP"
This option specifies the colon separated names of the framebuffer device 
files to be used.
.TP 8
.B "\-fbinfo
This option indicates that the server should enumerate the available
frame buffers that it will use.
.SH ENVIRONMENT
.TP 8
\fBXDEVICE\fP
If present,  and if no explicit \fB-dev\fP options are given, specifies 
the (colon separated) list of display devices to use.
.SH "SEE ALSO"
.PP
X(__miscmansuffix__), Xserver(1), xdm(1), xinit(1)
.SH BUGS
The auto-configuration depends on there being appropriate special files 
in the
.I /dev
directory for the framebuffers which are to be used.  Extra entries can 
confuse the server.  For example,  the X/160C in fact has the hardware 
for a monochrome
.B bwtwo0
on the CPU board.  So if 
.I /dev
has a special file for
.IR /dev/bwtwo0 ,
the server will use it,  even though there is no monitor attached to the
monochrome framebuffer.
The server will appear to start,  but not to paint a cursor,  because the
cursor is on the monochrome frame buffer. The solution is to remove the
.I /dev
entries for any device you don't have a monitor for.
.PP
There is a bug in pre-FCS operating systems for the Sun-4 which causes 
the server to crash driving a \fBcgtwo\fP.
.PP
.SH AUTHORS
.TP 8
U. C. Berkeley
Adam de Boor.
.TP 8
Sun Microsystems
David Rosenthal,  Stuart Marks,  Robin Schaufler,  Mike Schwartz,
Frances Ho,  Geoff Lee,  and Mark Opperman.
.TP 8
MIT Laboratory for Computer Science
.br
Bob Scheifler, Keith Packard, Kaleb Keithley

File Added: xsrc/external/mit/xorg-server/dist/hw/sun/circleset.h
#ifdef DO_FILLED_ARCS
static unsigned short filled_arcs[16][16] = {
{	/* 1 */
B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),
B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),
},
{	/* 2 */
B(0x4000),B(0xc000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),
B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),
},
{	/* 3 */
B(0x0000),B(0x6000),B(0x6000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),
B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),
},
{	/* 4 */
B(0x2000),B(0x7000),B(0xf000),B(0x7000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),
B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),
},
{	/* 5 */
B(0x0000),B(0x7800),B(0x7800),B(0x7800),B(0x7800),B(0x0000),B(0x0000),B(0x0000),
B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),
},
{	/* 6 */
B(0x1000),B(0x7c00),B(0x7c00),B(0xfc00),B(0x7c00),B(0x7c00),B(0x0000),B(0x0000),
B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),
},
{	/* 7 */
B(0x0000),B(0x3c00),B(0x7e00),B(0x7e00),B(0x7e00),B(0x7e00),B(0x3c00),B(0x0000),
B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),
},
{	/* 8 */
B(0x0800),B(0x3e00),B(0x7f00),B(0x7f00),B(0xff00),B(0x7f00),B(0x7f00),B(0x3e00),
B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),
},
{	/* 9 */
B(0x0000),B(0x3f00),B(0x7f80),B(0x7f80),B(0x7f80),B(0x7f80),B(0x7f80),B(0x7f80),
B(0x3f00),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),
},
{	/* 10 */
B(0x0400),B(0x3f00),B(0x7f80),B(0x7fc0),B(0x7fc0),B(0xffc0),B(0x7fc0),B(0x7fc0),
B(0x7f80),B(0x3f00),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),
},
{	/* 11 */
B(0x0000),B(0x1f80),B(0x3fc0),B(0x7fe0),B(0x7fe0),B(0x7fe0),B(0x7fe0),B(0x7fe0),
B(0x7fe0),B(0x3fc0),B(0x1f80),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),
},
{	/* 12 */
B(0x0200),B(0x1fc0),B(0x3fe0),B(0x7ff0),B(0x7ff0),B(0x7ff0),B(0xfff0),B(0x7ff0),
B(0x7ff0),B(0x7ff0),B(0x3fe0),B(0x1fc0),B(0x0000),B(0x0000),B(0x0000),B(0x0000),
},
{	/* 13 */
B(0x0000),B(0x0fc0),B(0x3ff0),B(0x3ff0),B(0x7ff8),B(0x7ff8),B(0x7ff8),B(0x7ff8),
B(0x7ff8),B(0x7ff8),B(0x3ff0),B(0x3ff0),B(0x0fc0),B(0x0000),B(0x0000),B(0x0000),
},
{	/* 14 */
B(0x0100),B(0x0fe0),B(0x1ff0),B(0x3ff8),B(0x7ffc),B(0x7ffc),B(0x7ffc),B(0xfffc),
B(0x7ffc),B(0x7ffc),B(0x7ffc),B(0x3ff8),B(0x1ff0),B(0x0fe0),B(0x0000),B(0x0000),
},
{	/* 15 */
B(0x0000),B(0x0ff0),B(0x1ff8),B(0x3ffc),B(0x7ffe),B(0x7ffe),B(0x7ffe),B(0x7ffe),
B(0x7ffe),B(0x7ffe),B(0x7ffe),B(0x7ffe),B(0x3ffc),B(0x1ff8),B(0x0ff0),B(0x0000),
},
{	/* 16 */
B(0x0080),B(0x07f0),B(0x1ffc),B(0x3ffe),B(0x3ffe),B(0x7fff),B(0x7fff),B(0x7fff),
B(0xffff),B(0x7fff),B(0x7fff),B(0x7fff),B(0x3ffe),B(0x3ffe),B(0x1ffc),B(0x07f0),
},
};
#endif /* DO_FILLED_ARCS */
#ifdef DO_OUTLINE_ARCS
static unsigned short outline0_arcs[16][16] = {
{	/* 1 */
B(0xc000),B(0xc000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),
B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),
},
{	/* 2 */
B(0xe000),B(0xa000),B(0xe000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),
B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),
},
{	/* 3 */
B(0x6000),B(0x9000),B(0x9000),B(0x6000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),
B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),
},
{	/* 4 */
B(0x7000),B(0x8800),B(0x8800),B(0x8800),B(0x7000),B(0x0000),B(0x0000),B(0x0000),
B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),
},
{	/* 5 */
B(0x3000),B(0x4800),B(0x8400),B(0x8400),B(0x4800),B(0x3000),B(0x0000),B(0x0000),
B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),
},
{	/* 6 */
B(0x3800),B(0x4400),B(0x8200),B(0x8200),B(0x8200),B(0x4400),B(0x3800),B(0x0000),
B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),
},
{	/* 7 */
B(0x3c00),B(0x4200),B(0x8100),B(0x8100),B(0x8100),B(0x8100),B(0x4200),B(0x3c00),
B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),
},
{	/* 8 */
B(0x1c00),B(0x6300),B(0x4100),B(0x8080),B(0x8080),B(0x8080),B(0x4100),B(0x6300),
B(0x1c00),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),
},
{	/* 9 */
B(0x1e00),B(0x2100),B(0x4080),B(0x8040),B(0x8040),B(0x8040),B(0x8040),B(0x4080),
B(0x2100),B(0x1e00),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),
},
{	/* 10 */
B(0x1f00),B(0x2080),B(0x4040),B(0x8020),B(0x8020),B(0x8020),B(0x8020),B(0x8020),
B(0x4040),B(0x2080),B(0x1f00),B(0x0000),B(0x0000),B(0x0000),B(0x0000),B(0x0000),
},
{	/* 11 */
B(0x0f00),B(0x30c0),B(0x4020),B(0x4020),B(0x8010),B(0x8010),B(0x8010),B(0x8010),
B(0x4020),B(0x4020),B(0x30c0),B(0x0f00),B(0x0000),B(0x0000),B(0x0000),B(0x0000),
},
{	/* 12 */
B(0x0f80),B(0x1040),B(0x2020),B(0x4010),B(0x8008),B(0x8008),B(0x8008),B(0x8008),
B(0x8008),B(0x4010),B(0x2020),B(0x1040),B(0x0f80),B(0x0000),B(0x0000),B(0x0000),
},
{	/* 13 */
B(0x0780),B(0x1860),B(0x2010),B(0x4008),B(0x8004),B(0x8004),B(0x8004),B(0x8004),
B(0x8004),B(0x8004),B(0x4008),B(0x2010),B(0x1860),B(0x0780),B(0x0000),B(0x0000),
},
{	/* 14 */
B(0x07c0),B(0x1830),B(0x2008),B(0x4004),B(0x4004),B(0x8002),B(0x8002),B(0x8002),
B(0x8002),B(0x8002),B(0x4004),B(0x4004),B(0x2008),B(0x1830),B(0x07c0),B(0x0000),
},
{	/* 15 */
B(0x07e0),B(0x0810),B(0x300c),B(0x4002),B(0x4002),B(0x8001),B(0x8001),B(0x8001),
B(0x8001),B(0x8001),B(0x8001),B(0x4002),B(0x4002),B(0x300c),B(0x0810),B(0x07e0),
},
{	/* 16 */
B(0x03e0),B(0x0c18),B(0x1004),B(0x2002),B(0x4001),B(0x4001),B(0x8000),B(0x8000),
B(0x8000),B(0x8000),B(0x8000),B(0x4001),B(0x4001),B(0x2002),B(0x1004),B(0x0c18),
},
};
#endif /* DO_OUTLINE_ARCS */

File Added: xsrc/external/mit/xorg-server/dist/hw/sun/constype.c
/*
 * $Xorg: constype.c,v 1.3 2000/08/17 19:48:29 cpqbld Exp $
 *
 * consoletype - utility to print out string identifying Sun console type
 *
 * Copyright 1988 SRI
 *
 * Permission to use, copy, modify, and distribute this software and its
 * documentation for any purpose and without fee is hereby granted, 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 name of SRI not be used in advertising or
 * publicity pertaining to distribution of the software without specific,
 * written prior permission.  SRI makes no representations about the
 * suitability of this software for any purpose.  It is provided "as is"
 * without express or implied warranty.
 *
 * Author:  Doug Moran, SRI
 */
/* $XFree86: xc/programs/Xserver/hw/sun/constype.c,v 3.10 2004/03/08 15:37:04 tsi Exp $ */

/*
SUN-SPOTS DIGEST         Thursday, 17 March 1988       Volume 6 : Issue 31

Date:    Wed, 2 Mar 88 14:50:26 PST
From:    Doug Moran <moran@ai.sri.com>
Subject: Program to determine console type

There have been several requests in this digest for programs to determine
the type of the console.  Below is a program that I wrote to produce an
identifying string (I start suntools in my .login file and use this pgm to
determine which arguments to use).

Caveat:  my cluster has only a few of these monitor types, so the pgm has
not been fully tested.

Note on coding style: the function wu_fbid is actually located in a local
library, accounting for what otherwise might appear to be a strange coding
style.
*/
#include <stdio.h>
#if defined(SVR4) || defined(CSRG_BASED)
#include <string.h>
#else
/*  SunOS  */
#include <strings.h>
#endif
#include <unistd.h>
#include <errno.h>

#include <sys/ioctl.h>
#include <sys/file.h>
#if defined(SVR4) || defined(__bsdi__)
# include <fcntl.h>
# include <sys/fbio.h>
# ifdef sun
/* VIS_GETIDENTIFIER ioctl added in Solaris 2.3 */
/* Don't actually #include the header, so this can be built on older SunOS's */
/* #include <sys/visual_io.h> */
#  define VIS_GETIDENTIFIER	(('V' << 8) | 0)
#  define VIS_MAXNAMELEN	128
struct vis_identifier {
	char name[VIS_MAXNAMELEN];
};
# endif
#else
# ifndef __NetBSD__
#  ifdef CSRG_BASED
#   include <sun/fbio.h>
#  else
#   include <machine/fbio.h>
#  endif
# endif
#endif

static int wu_fbid(char *devname, char **fbname, int *fbtype);

int
main(int argc, char **argv)
{
    int fbtype = -1;
    char *fbname, *dev;
    int print_num = 0;
    int error;

    if (argc > 1 && argv[1][0] == '/') {
	dev = argv[1];
	argc--; argv++;
    } else {
	dev = "/dev/fb";
    }
    error = wu_fbid(dev, &fbname, &fbtype );
    if (argc > 1 && strncmp(argv[1], "-num", strlen(argv[1])) == 0)
	print_num = 1;

    printf ("%s", fbname ? fbname : "tty");
    if (print_num && (fbtype >= 0)) {
	printf (" %d", fbtype);
    }
    putchar ('\n');
    return error;
}
#include <sys/ioctl.h>
#include <sys/file.h>
#if defined(SVR4) || defined(__bsdi__)
#include <fcntl.h>
#include <sys/fbio.h>
#if defined(SVR4) && defined(sun)
/* VIS_GETIDENTIFIER ioctl added in Solaris 2.3 */
#include <sys/visual_io.h>
#endif
#else
#ifndef CSRG_BASED
#include <sun/fbio.h>
#else
#  ifdef __NetBSD__
#   include <dev/sun/fbio.h>	/* -wsr */
#  else
#   include <machine/fbio.h>
#  endif
#endif
#endif

static char *decode_fb[] = {
    "bw1",	/* FBTYPE_SUN1BW */
    "cg1",	/* FBTYPE_SUN1COLOR */
    "bw2",	/* FBTYPE_SUN2BW */
    "cg2",	/* FBTYPE_SUN2COLOR */
    "gp2",	/* FBTYPE_SUN2GP */
    "bw3",	/* FBTYPE_SUN5COLOR */
    "cg3",	/* FBTYPE_SUN3COLOR */
    "cg8",	/* FBTYPE_MEMCOLOR */
    "cg4",	/* FBTYPE_SUN4COLOR */
    "nsA",	/* FBTYPE_NOTSUN1 */
    "nsB",	/* FBTYPE_NOTSUN2 */
    "nsC",	/* FBTYPE_NOTSUN3 */
    "cg6",	/* FBTYPE_SUNFAST_COLOR */
    "rop",	/* FBTYPE_SUNROP_COLOR */
    "vid",	/* FBTYPE_SUNFB_VIDEO */
    "gifb",	/* FBTYPE_SUNGIFB */
    "plas",	/* FBTYPE_SUNGPLAS */
    "cg12",	/* FBTYPE_SUNGP3 */
    "gt",	/* FBTYPE_SUNGT */
    "leo",	/* FBTYPE_SUNLEO */
    "cg14",	/* FBTYPE_MDICOLOR */
    "tcx",	/* FBTYPE_TCXCOLOR */		/* not in fbio.h */
    "creator",	/* FBTYPE_CREATOR */		/* not in fbio.h */
    "iga",	/* FBTYPE_PCI_IGA1682 */	/* not in fbio.h */
    "p9",	/* FBTYPE_P9100COLOR */		/* not in fbio.h */
    NULL
};

#define NUM_FBS ((int)(sizeof(decode_fb) / sizeof(decode_fb[0])))

static int wu_fbid(char* devname, char** fbname, int* fbtype)
{
    struct fbgattr fbattr;
    int fd;
#ifdef sun
    struct vis_identifier fbid;
#endif

    if ( (fd = open(devname, O_RDWR, 0)) == -1 ) {
	*fbname = "unable to open fb";
	*fbtype = -1;
	return 2;
    }

#ifdef sun
    if (ioctl(fd, VIS_GETIDENTIFIER, &fbid) >= 0) {
	*fbname = fbid.name;
	*fbtype = -1;
	close(fd);
	return 0;
    }
#endif

    /* FBIOGATTR fails for early frame buffer types */
    if ((*fbtype = ioctl(fd, FBIOGATTR, &fbattr)) < 0)
	*fbtype = ioctl(fd, FBIOGTYPE, &fbattr.fbtype);

    close(fd);

    if (*fbtype < 0) {
	*fbname = "ioctl on fb failed";
	*fbtype = errno;
	return 2;
    }

    *fbtype = fbattr.fbtype.fb_type;
    if ((*fbtype >= 0) && (*fbtype < NUM_FBS)) {
	*fbname = decode_fb[*fbtype];
	return 0;
    }

    *fbname = "unknown";
    return 1;
}

File Added: xsrc/external/mit/xorg-server/dist/hw/sun/constype.man
.\" $Xorg: constype.man,v 1.3 2000/08/17 19:48:29 cpqbld Exp $
.\"
.\" $XFree86: xc/programs/Xserver/hw/sun/constype.man,v 1.7 2005/02/11 03:03:10 dawes Exp $
.\"
.TH CONSTYPE 1 __vendorversion__
.SH NAME
constype \- print type of Sun console
.SH SYNOPSIS
.B "constype"
[
.I device_name
] [
.B \-num
]
.SH DESCRIPTION
The 
.I constype
program
writes on the standard output the Sun code for the type of display
that the console is.
The types output include these:
.sp 2
.in +0.5i
.nf
bw?	Black and White, where ? is 1-4. (eg) 3-50s are bw2
cg?	Colour Graphics display, where ? is 1-4
gp?	Optional Graphics Processor board, where ? is 1-2
ns?	Not Sun display \(em where ? is A-J
.fi
.in -0.5i
.sp 2
This is useful in determining startup values and defaults for window
systems.
.LP
The
.I device_name
argument, if given, is the device to examine.
If not given,
.I /dev/fb
is used.
.LP
The
.B \-num
option causes
.I constype
to follow the type keyword with the numeric value of that type,
as returned by the FBIOGATTR or FBIOGTYPE ioctl and defined in fbio.h.
This is useful if the type is not recognized by the program.
.SH "EXIT STATUS"
The program exits with status 0 if it identified a known console type,
1 if the type was unknown, and 2 if the device could not be opened or
another error occurred.
.SH BUGS
Not tested on all monitor types
.SH COPYRIGHT 
Copyright 1988, SRI
.SH AUTHOR
Doug Moran <moran@ai.sri.com>

File Added: xsrc/external/mit/xorg-server/dist/hw/sun/kbd_mode.c
/* $Xorg: kbd_mode.c,v 1.3 2000/08/17 19:48:29 cpqbld Exp $ */
/************************************************************
Copyright 1987 by Sun Microsystems, Inc. Mountain View, CA.

                    All Rights Reserved

Permission  to  use,  copy,  modify,  and  distribute   this
software  and  its documentation for any purpose and without
fee is hereby granted, provided that the above copyright no-
tice  appear  in all copies and that both that copyright no-
tice and this permission notice appear in  supporting  docu-
mentation,  and  that the names of Sun or The Open Group
not be used in advertising or publicity pertaining to
distribution  of  the software  without specific prior
written permission. Sun and The Open Group make no
representations about the suitability of this software for
any purpose. It is provided "as is" without any express or
implied warranty.

SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
THE USE OR PERFORMANCE OF THIS SOFTWARE.

********************************************************/
/* $XFree86: xc/programs/Xserver/hw/sun/kbd_mode.c,v 3.12 2003/10/07 21:39:43 herrb Exp $ */

/*
static  char sccsid[] = "@(#)kbd_mode.c 7.1 87/04/13";
 */

/*
 * Copyright 1986 by Sun Microsystems, Inc.
 *
 *      kbd_mode:       set keyboard encoding mode
 */

#include <sys/types.h>
#include <sys/file.h>
#include <sys/ioctl.h>
#if defined(SVR4) || defined(__bsdi__)
#include <fcntl.h>
#ifndef __bsdi__
#include <sys/kbio.h>
#include <sys/kbd.h>
#else
#include <unistd.h>
#include </sys/sparc/dev/kbio.h>
#include </sys/sparc/dev/kbd.h>
#endif
#else
#ifndef CSRG_BASED
#include <sundev/kbio.h>
#include <sundev/kbd.h>
#else
#include <machine/kbio.h>
#include <machine/kbd.h>
#endif
#endif
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

static void         die(char*);
static void	    usage(void);
static int          kbd_fd;

int
main(argc, argv)
    int    argc;
    char** argv;
{
    int    code = 0, translate, direct = -1;
    char   led;
    int    click;

    if ((kbd_fd = open("/dev/kbd", O_RDONLY, 0)) < 0) {
	die("Couldn't open /dev/kbd");
    }
    argc--; argv++;
    if (argc-- && **argv == '-') {
	code = *(++*argv);
    } else {
	usage();
    }
    switch (code) {
      case 'a':
      case 'A':
	translate = TR_ASCII;
	direct = 0;
	break;
      case 'e':
      case 'E':
	translate = TR_EVENT;
	break;
      case 'n':
      case 'N':
	translate = TR_NONE;
	break;
      case 'u':
      case 'U':
	translate = TR_UNTRANS_EVENT;
	break;
      default:
	usage();
    }
#ifdef KIOCSLED
    led = 0;
    if (ioctl(kbd_fd, KIOCSLED, &led))
	die("Couldn't set LEDs");
#endif
#ifdef KIOCCMD
    click = KBD_CMD_NOCLICK;
    if (ioctl(kbd_fd, KIOCCMD, &click))
	die("Couldn't set click");
#endif
    if (ioctl(kbd_fd, KIOCTRANS, (caddr_t) &translate))
	die("Couldn't set translation");
    if (direct != -1 && ioctl(kbd_fd, KIOCSDIRECT, (caddr_t) &direct))
	die("Couldn't set redirect");
    return 0;
}

static void
die(char *msg)
{
    fprintf(stderr, "%s\n", msg);
    exit(1);
}

static void
usage(void)
{
    int             translate;

    if (ioctl(kbd_fd, KIOCGTRANS, (caddr_t) &translate)) {
	die("Couldn't inquire current translation");
     }
    fprintf(stderr, "kbd_mode {-a | -e | -n | -u }\n");
    fprintf(stderr, "\tfor ascii, encoded (normal) SunView events,\n");
    fprintf(stderr, " \tnon-encoded, or unencoded SunView events, resp.\n");
    fprintf(stderr, "Current mode is %s.\n",
		(   translate == 0 ?    "n (non-translated bytes)"      :
		 (  translate == 1 ?    "a (ascii bytes)"               :
		  ( translate == 2 ?    "e (encoded events)"            :
		  /* translate == 3 */  "u (unencoded events)"))));
    exit(1);
}



File Added: xsrc/external/mit/xorg-server/dist/hw/sun/kbd_mode.man
.\" $Xorg: kbd_mode.man,v 1.4 2001/02/09 02:04:43 xorgcvs Exp $
.\" Copyright 1987 Sun Microsystems, Inc.
.\" Copyright 1993, 1998  The Open Group
.\" 
.\" 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.
.\" 
.\" The above copyright notice and this permission notice shall be included
.\" in all copies or substantial portions of the Software.
.\" 
.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
.\" IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
.\" OTHER DEALINGS IN THE SOFTWARE.
.\" 
.\" Except as contained in this notice, the name of The Open Group shall
.\" not be used in advertising or otherwise to promote the sale, use or
.\" other dealings in this Software without prior written authorization
.\" from The Open Group.
.\"
.\" $XFree86: xc/programs/Xserver/hw/sun/kbd_mode.man,v 1.8 2005/02/11 03:03:10 dawes Exp $
.\"
.TH KBD_MODE 1 __vendorversion__
.SH NAME
kbd_mode \- recover the Sun console keyboard
.SH SYNOPSIS
.B kbd_mode
[ -a -e -n -u ]
.SH DESCRIPTION
.I Kbd_mode
resets the Sun console keyboard to a rational state.
.SH OPTIONS
The following options are supported, see \fIkb(4S)\fP for details:
.TP 8
.B \-a
Causes ASCII to be reported.
.TP 8
.B \-e
Causes \fIFirm_events\fP to be reported.
.TP 8
.B \-n
Causes up/down key codes to be reported.
.TP 8
.B \-u
Causes undecoded keyboard values to be reported.
.SH SEE ALSO
kb(4S)

File Added: xsrc/external/mit/xorg-server/dist/hw/sun/sunCfb24.c
/* $Xorg: sunCfb24.c,v 1.4 2001/02/09 02:04:43 xorgcvs Exp $ */

/*

Copyright 1994, 1998  The Open Group

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.

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE X
CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Except as contained in this notice, the name of The Open Group shall not be
used in advertising or otherwise to promote the sale, use or other dealings in
this Software without prior written authorization from The Open Group.

*/
/* $XFree86: xc/programs/Xserver/hw/sun/sunCfb24.c,v 1.3 2001/12/14 19:59:42 dawes Exp $ */

/*
 * The CG8 is similar to the CG4 in that it has a mono plane, an enable
 * plane, and a color plane. While the CG4 only has an 8-bit color
 * plane the CG8 has a 24-bit color plane.
 *
 * If you have a CG4 you know that you can switch between the mono and
 * the color screens merely by dragging the pointer off the edge of the
 * screen, causing the other screen to be switched in. However this is
 * the cause of some consternation on the part of those people who have
 * both a CG4 and another frame buffer.
 *
 * Because of this problem, and some other considerations, I have chosen
 * to ignore the mono plane of the CG8 in this code.
 */

#define PSZ 32
#include "sun.h"
#include "fb.h"

#define PIXPG_24BIT_COLOR 5
#define PIXPG_24BIT_COLOR_INDEX (PIXPG_24BIT_COLOR << 25)
#define PR_FORCE_UPDATE (1 << 24)

static void CG24UpdateColormap(ScreenPtr, int, int, u_char *, u_char *, u_char *);
static void CG24StoreColors(ColormapPtr, int, xColorItem *);
static void CG24ScreenInit(ScreenPtr);

static void
CG24UpdateColormap(ScreenPtr pScreen, int index, int count, u_char *rmap, u_char *gmap, u_char *bmap)
{
    struct fbcmap sunCmap;

    sunCmap.index = index | PIXPG_24BIT_COLOR_INDEX | PR_FORCE_UPDATE;
    sunCmap.count = count;
    sunCmap.red = &rmap[index];
    sunCmap.green = &gmap[index];
    sunCmap.blue = &bmap[index];

    if (ioctl(sunFbs[pScreen->myNum].fd, FBIOPUTCMAP, &sunCmap) == -1)
	FatalError( "CG24UpdateColormap: FBIOPUTCMAP failed\n");
}

static void
CG24StoreColors(ColormapPtr pmap, int ndef, xColorItem *pdefs)
{
  u_char rmap[256], gmap[256], bmap[256];
  sunScreenPtr pPrivate = sunGetScreenPrivate(pmap->pScreen);
  VisualPtr pVisual = pmap->pVisual;
  int i;

  if (pPrivate->installedMap != NULL && pPrivate->installedMap != pmap)
    return;
  for (i = 0; i < 256; i++) {
    rmap[i] = pmap->red[i].co.local.red >> 8;
    gmap[i] = pmap->green[i].co.local.green >> 8;
    bmap[i] = pmap->blue[i].co.local.blue >> 8;
  }
  while (ndef--) {
    i = pdefs->pixel;
    if (pdefs->flags & DoRed)
      rmap[(i & pVisual->redMask) >> pVisual->offsetRed] = (pdefs->red >> 8);
    if (pdefs->flags & DoGreen)
      gmap[(i & pVisual->greenMask) >> pVisual->offsetGreen] = (pdefs->green >> 8);
    if (pdefs->flags & DoBlue)
      bmap[(i & pVisual->blueMask) >> pVisual->offsetBlue] = (pdefs->blue >> 8);
    pdefs++;
  }
  CG24UpdateColormap (pmap->pScreen, 0, 256, rmap, gmap, bmap);
}

#define CG8_COLOR_OFFSET 0x40000

static void
CG24ScreenInit(ScreenPtr pScreen)
{
#ifndef STATIC_COLOR
    sunScreenPtr pPrivate = sunGetScreenPrivate(pScreen);
#endif
    int i;

    /* Make sure the overlay plane is disabled */
    for (i = 0; i < CG8_COLOR_OFFSET; i++)
	sunFbs[pScreen->myNum].fb[i] = 0;

#ifndef STATIC_COLOR
    pScreen->InstallColormap = sunInstallColormap;
    pScreen->UninstallColormap = sunUninstallColormap;
    pScreen->ListInstalledColormaps = sunListInstalledColormaps;
    pScreen->StoreColors = CG24StoreColors;
    pPrivate->UpdateColormap = CG24UpdateColormap;
    if (sunFlipPixels) {
	Pixel pixel = pScreen->whitePixel;
	pScreen->whitePixel = pScreen->blackPixel;
	pScreen->blackPixel = pixel;
    }
#endif
}

Bool
sunCG8Init(
    ScreenPtr	    pScreen,  	/* The Screen to initialize */
    int		    argc,    	/* The number of the Server's arguments. */
    char	    **argv   	/* The arguments themselves. Don't change! */
)
{
    int	screen = pScreen->myNum;

    sunFbs[screen].EnterLeave = (void (*)(ScreenPtr, int))NoopDDA;
    return sunInitCommon (screen, pScreen, (off_t) 0,
	fbScreenInit, CG24ScreenInit,
	fbCreateDefColormap, sunSaveScreen, CG8_COLOR_OFFSET);
}


File Added: xsrc/external/mit/xorg-server/dist/hw/sun/sunCursor.c
/* $Xorg: sunCursor.c,v 1.4 2001/02/09 02:04:43 xorgcvs Exp $ */
/*

Copyright 1988  Sun Microsystems, Inc.
Copyright 1993, 1998  The Open Group

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.

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

Except as contained in this notice, the name of The Open Group shall
not be used in advertising or otherwise to promote the sale, use or
other dealings in this Software without prior written authorization
from The Open Group.

*/
/* $XFree86: xc/programs/Xserver/hw/sun/sunCursor.c,v 3.6 2003/11/17 22:20:36 dawes Exp $ */

/*-
 * sunCursor.c --
 *	Functions for maintaining the Sun software cursor...
 *
 */

#define NEED_EVENTS
#include    "sun.h"
#include    "fb.h"

#ifdef FBIOGCURMAX  /* has hardware cursor kernel support */

#define sunGetCursorPrivate(pScreen) \
    (&(sunGetScreenPrivate(pScreen)->hardwareCursor))

static Bool sunRealizeCursor(DeviceIntPtr, ScreenPtr, CursorPtr);
static Bool sunUnrealizeCursor(DeviceIntPtr, ScreenPtr, CursorPtr);
static void sunCursorRepad (ScreenPtr, CursorBitsPtr, unsigned char *, unsigned char *, DDXPointPtr, int, int);
static void sunLoadCursor(ScreenPtr, CursorPtr, int, int);
static void sunSetCursor(DeviceIntPtr, ScreenPtr, CursorPtr, int, int);
static void sunMoveCursor(DeviceIntPtr, ScreenPtr, int, int);
static void sunQueryBestSize(int, unsigned short *, unsigned short *, ScreenPtr);

static Bool
sunRealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
{
    sunCursorPtr pCurPriv = sunGetCursorPrivate(pScreen);
    int	    x, y;

    /* miRecolorCursor does this */
    if (pCurPriv->pCursor == pCursor)
    {
	miPointerGetPosition (pDev, &x, &y);
	sunLoadCursor (pScreen, pCursor, x, y);
    }
    return TRUE;
}

static Bool
sunUnrealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
{
    return TRUE;
}

static void
sunCursorRepad(ScreenPtr pScreen, CursorBitsPtr bits, unsigned char *src_bits, unsigned char *dst_bits, DDXPointPtr ptSrc, int w, int h)
{
    PixmapPtr	src, dst;
    BoxRec	box;
    RegionRec	rgnDst;

    if (!(src = GetScratchPixmapHeader(pScreen, bits->width, bits->height,
				       /*bpp*/ 1, /*depth*/ 1,
				      PixmapBytePad(bits->width,1), src_bits)))
	return;
    if (!(dst = GetScratchPixmapHeader(pScreen, w, h, /*bpp*/ 1, /*depth*/ 1,
				       PixmapBytePad(w,1), dst_bits)))
    {
	FreeScratchPixmapHeader(src);
	return;
    }
    box.x1 = 0;
    box.y1 = 0;
    box.x2 = w;
    box.y2 = h;
    REGION_INIT(pScreen, &rgnDst, &box, 1);
#ifndef LOWMEMFTPT
    mfbDoBitblt(&src->drawable, &dst->drawable, GXcopy, &rgnDst, ptSrc);
#else
    cfbDoBitblt(&src->drawable, &dst->drawable, GXcopy, &rgnDst, ptSrc,
	0xFFFFFFFF);
#endif /* ifndef LOWMEMFTPT */
    REGION_UNINIT(pScreen, &rgnDst);
    FreeScratchPixmapHeader(src);
    FreeScratchPixmapHeader(dst);
}

static void
sunLoadCursor(ScreenPtr pScreen, CursorPtr pCursor, int x, int y)
{
    sunCursorPtr pCurPriv = sunGetCursorPrivate(pScreen);
    struct fbcursor fbcursor;
    int	w, h;
    unsigned char   r[2], g[2], b[2];
    DDXPointRec	ptSrc;
    unsigned char   source_temp[1024], mask_temp[1024];
#ifdef INTERNAL_VS_EXTERNAL_PADDING
    long                widthBytesLine, length;
    long                widthBytesLineProto, lengthProto;
    int			linesDone;
#endif


    fbcursor.set = FB_CUR_SETALL;
    fbcursor.enable = 1;
    fbcursor.pos.x = x;
    fbcursor.pos.y = y;
    fbcursor.hot.x = pCursor->bits->xhot;
    fbcursor.hot.y = pCursor->bits->yhot;
    r[0] = pCursor->backRed >> 8;
    g[0] = pCursor->backGreen >> 8;
    b[0] = pCursor->backBlue >> 8;
    r[1] = pCursor->foreRed >> 8;
    g[1] = pCursor->foreGreen >> 8;
    b[1] = pCursor->foreBlue >> 8;
    fbcursor.cmap.index = 0;
    fbcursor.cmap.count = 2;
    fbcursor.cmap.red = r;
    fbcursor.cmap.green = g;
    fbcursor.cmap.blue = b;
    fbcursor.image = (char *) pCursor->bits->source;
    fbcursor.mask = (char *) pCursor->bits->mask;
    w = pCursor->bits->width;
    h = pCursor->bits->height;
    if (w > pCurPriv->width || h > pCurPriv->height) {
	ptSrc.x = 0;
	ptSrc.y = 0;
	if (w > pCurPriv->width)
	    w = pCurPriv->width;
	if (h > pCurPriv->height)
	    h = pCurPriv->height;
	sunCursorRepad (pScreen, pCursor->bits, pCursor->bits->source,
			source_temp, &ptSrc, w, h);
	sunCursorRepad (pScreen, pCursor->bits, pCursor->bits->mask,
			mask_temp, &ptSrc, w, h);
	fbcursor.image = (char *) source_temp;
	fbcursor.mask = (char *) mask_temp;
    }
#ifdef INTERNAL_VS_EXTERNAL_PADDING
    widthBytesLine = BitmapBytePad(w);
    length = widthBytesLine * h;
    widthBytesLineProto = BitmapBytePadProto(w);
    lengthProto = widthBytesLineProto * h;

    /* for 64-bit server, convert image to pad to 32 bits */
    if ( widthBytesLine != widthBytesLineProto ) {
	if (widthBytesLine - widthBytesLineProto  == 4) {
		register int * sprotoPtr, * mprotoPtr;
		register int * sbufPtr, * mbufPtr;
		register int i, j;

		sbufPtr = (int *)fbcursor.image;
		mbufPtr = (int *)fbcursor.mask;
		sprotoPtr = (int *)source_temp;
		mprotoPtr = (int *)mask_temp;
		for (i=0; i<h; i++) {
			for (j=0; j<widthBytesLineProto; j+=4) {
				*sprotoPtr++ = *sbufPtr++;
				*mprotoPtr++ = *mbufPtr++;
			}
			sbufPtr++;
			mbufPtr++;
		}
	} else {
        register char * sbufPtr, * sprotoPtr;
        register char * mbufPtr, * mprotoPtr;
        register int i;

        for (i = 0,
             sbufPtr = fbcursor.image,
             sprotoPtr = source_temp,
             mbufPtr = fbcursor.mask,
             mprotoPtr = mask_temp;
             i < h;
             sbufPtr += widthBytesLine,
             sprotoPtr += widthBytesLineProto,
             mbufPtr += widthBytesLine,
             mprotoPtr += widthBytesLineProto,
             i++) {
	    if (sprotoPtr != sbufPtr)
            	memmove(sprotoPtr, sbufPtr, widthBytesLineProto);
	    if (mprotoPtr != mbufPtr)
            	memmove(mprotoPtr, mbufPtr, widthBytesLineProto);
	}
} /* else */
	fbcursor.image = (char *) source_temp;
	fbcursor.mask = (char *) mask_temp;
    }
#endif
    fbcursor.size.x = w;
    fbcursor.size.y = h;
#ifndef Lynx
    (void) ioctl (sunFbs[pScreen->myNum].fd, FBIOSCURSOR, &fbcursor);
#else
    (void) sunIoctl (&sunFbs[pScreen->myNum], FBIOSCURSOR, &fbcursor);
#endif
}

static void
sunSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor, int x, int y)
{
    sunCursorPtr pCurPriv = sunGetCursorPrivate(pScreen);

    if (pCursor)
    	sunLoadCursor (pScreen, pCursor, x, y);
    else
	sunDisableCursor (pScreen);
    pCurPriv->pCursor = pCursor;
}

static void
sunMoveCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
{
    struct fbcurpos pos;

    pos.x = x;
    pos.y = y;
#ifndef Lynx
    ioctl (sunFbs[pScreen->myNum].fd, FBIOSCURPOS, &pos);
#else
    sunIoctl (&sunFbs[pScreen->myNum], FBIOSCURPOS, &pos);
#endif
}

miPointerSpriteFuncRec sunPointerSpriteFuncs = {
    sunRealizeCursor,
    sunUnrealizeCursor,
    sunSetCursor,
    sunMoveCursor,
};

static void
sunQueryBestSize(int class, unsigned short *pwidth, unsigned short *pheight, ScreenPtr pScreen)
{
    sunCursorPtr pCurPriv = sunGetCursorPrivate(pScreen);

    switch (class)
    {
    case CursorShape:
	if (*pwidth > pCurPriv->width)
	    *pwidth = pCurPriv->width;
	if (*pheight > pCurPriv->height)
	    *pheight = pCurPriv->height;
	if (*pwidth > pScreen->width)
	    *pwidth = pScreen->width;
	if (*pheight > pScreen->height)
	    *pheight = pScreen->height;
	break;
    default:
	fbQueryBestSize (class, pwidth, pheight, pScreen);
	break;
    }
}

#endif

Bool
sunCursorInitialize(ScreenPtr pScreen)
{
#ifdef FBIOGCURMAX
    sunCursorPtr pCurPriv = sunGetCursorPrivate(pScreen);
    struct fbcurpos maxsize;

    pCurPriv->has_cursor = FALSE;
#ifndef Lynx
    if (ioctl (sunFbs[pScreen->myNum].fd, FBIOGCURMAX, &maxsize) == -1)
#else
    if (sunIoctl (&sunFbs[pScreen->myNum], FBIOGCURMAX, &maxsize) == -1)
#endif
	return FALSE;
    pCurPriv->width = maxsize.x;
    pCurPriv->height= maxsize.y;
    pScreen->QueryBestSize = sunQueryBestSize;
    miPointerInitialize (pScreen,
			 &sunPointerSpriteFuncs,
			 &sunPointerScreenFuncs,
			 FALSE);
    pCurPriv->has_cursor = TRUE;
    pCurPriv->pCursor = NULL;
    return TRUE;
#else
    return FALSE;
#endif
}

void
sunDisableCursor (ScreenPtr pScreen)
{
#ifdef FBIOGCURMAX
    sunCursorPtr pCurPriv = sunGetCursorPrivate(pScreen);
    struct fbcursor fbcursor;

    if (pCurPriv->has_cursor)
    {
    	fbcursor.set = FB_CUR_SETCUR;
    	fbcursor.enable = 0;
#ifndef Lynx
    	(void) ioctl (sunFbs[pScreen->myNum].fd, FBIOSCURSOR, &fbcursor);
#else
    	(void) sunIoctl (&sunFbs[pScreen->myNum], FBIOSCURSOR, &fbcursor);
#endif
	pCurPriv->pCursor = NULL;
    }
#endif
}

File Added: xsrc/external/mit/xorg-server/dist/hw/sun/sunGX.c
/*
static char *rid="$Xorg: sunGX.c,v 1.5 2001/02/09 02:04:44 xorgcvs Exp $";
 */
/*
Copyright 1991, 1998  The Open Group

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.

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Except as contained in this notice, the name of The Open Group shall not be
used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from The Open Group.
 *
 * Author:  Keith Packard, MIT X Consortium
 */

/* $XFree86: xc/programs/Xserver/hw/sun/sunGX.c,v 1.9 2003/11/17 22:20:36 dawes Exp $ */

#include	"sun.h"

#include	<X11/Xmd.h>
#include	"gcstruct.h"
#include	"pixmapstr.h"
#include	"regionstr.h"
#include	"mistruct.h"
#include	<X11/fonts/fontstruct.h>
#include	"dixfontstr.h"
#include	"fb.h"
#include	"sunGX.h"
#include	"migc.h"
#include	"mispans.h"

#define sunGXFillSpan(gx,y,x1,x2,r) {\
    (gx)->apointy = (y); \
    (gx)->apointx = (x1); \
    (gx)->arectx = (x2); \
    GXDrawDone(gx,r); \
}

#define GXSetClip(gx,pbox) {\
    (gx)->clipminx = (pbox)->x1; \
    (gx)->clipminy = (pbox)->y1; \
    (gx)->clipmaxx = (pbox)->x2 - 1; \
    (gx)->clipmaxy = (pbox)->y2 - 1; \
}

#define GXSetOff(gx,x,y) {\
    (gx)->offx = (x); \
    (gx)->offy = (y); \
}

#define GXResetClip(gx,pScreen) { \
    (gx)->clipminx = 0; \
    (gx)->clipminy = 0; \
    (gx)->clipmaxx = (pScreen)->width - 1; \
    (gx)->clipmaxy = (pScreen)->height - 1; \
}

#define GXResetOff(gx) {\
    (gx)->offx = 0; \
    (gx)->offy = 0; \
}

#define sunGXGetAddrRange(pDrawable,extents,base,lo,hi) {\
    int	__x__; \
    cfbGetWindowByteWidthAndPointer((WindowPtr)pDrawable,__x__,base); \
    lo = (base) + WIDTH_MUL((extents)->y1) + (extents)->x1; \
    hi = (base) + WIDTH_MUL((extents)->y2 - 1) + (extents)->x2 - 1; \
    (base) = (base) + WIDTH_MUL(pDrawable->y) + pDrawable->x; \
}

/*
   rop_tables
   ==========
   lookup tables for GX raster ops, with the plane_mask,pixel_mask,pattern_mask
   ,attrib_sel, polygon_draw,raster_mode encoded into the top half.
   There is a lookup table for each commonly used combination.
*/

/* rops for bit blit / copy area
   with:
       Plane Mask - use plane mask reg.
       Pixel Mask - use all ones.
       Patt  Mask - use all ones.
*/

#define POLY_O		GX_POLYG_OVERLAP
#define POLY_N		GX_POLYG_NONOVERLAP

#define ROP_STANDARD	(GX_PLANE_MASK |\
			GX_PIXEL_ONES |\
			GX_ATTR_SUPP |\
			GX_RAST_BOOL |\
			GX_PLOT_PLOT)

/* fg = don't care  bg = don't care */

#define ROP_BLIT(O,I)	(ROP_STANDARD | \
			GX_PATTERN_ONES |\
			GX_ROP_11_1(I) |\
			GX_ROP_11_0(O) |\
			GX_ROP_10_1(I) |\
			GX_ROP_10_0(O) |\
			GX_ROP_01_1(I) |\
			GX_ROP_01_0(O) |\
			GX_ROP_00_1(I) |\
			GX_ROP_00_0(O))

/* fg = fgPixel	    bg = don't care */

#define ROP_FILL(O,I)	(ROP_STANDARD | \
			GX_PATTERN_ONES |\
			GX_ROP_11_1(I) |\
			GX_ROP_11_0(I) |\
			GX_ROP_10_1(I) |\
			GX_ROP_10_0(I) | \
			GX_ROP_01_1(O) |\
			GX_ROP_01_0(O) |\
			GX_ROP_00_1(O) |\
			GX_ROP_00_0(O))

/* fg = fgPixel	    bg = don't care */

#define ROP_STIP(O,I)   (ROP_STANDARD |\
			GX_ROP_11_1(I) |\
			GX_ROP_11_0(GX_ROP_NOOP) |\
			GX_ROP_10_1(I) |\
			GX_ROP_10_0(GX_ROP_NOOP) | \
			GX_ROP_01_1(O) |\
			GX_ROP_01_0(GX_ROP_NOOP) |\
			GX_ROP_00_1(O) |\
			GX_ROP_00_0(GX_ROP_NOOP))

/* fg = fgPixel	    bg = bgPixel */

#define ROP_OSTP(O,I)   (ROP_STANDARD |\
			GX_ROP_11_1(I) |\
			GX_ROP_11_0(I) |\
			GX_ROP_10_1(I) |\
			GX_ROP_10_0(O) |\
			GX_ROP_01_1(O) |\
			GX_ROP_01_0(I) |\
			GX_ROP_00_1(O) |\
			GX_ROP_00_0(O))

#define ROP_ITXT(O,I)   (ROP_STANDARD |\
			GX_PATTERN_ONES |\
			GX_ROP_11_1(I) |\
			GX_ROP_11_0(I) |\
			GX_ROP_10_1(I) |\
			GX_ROP_10_0(O) |\
			GX_ROP_01_1(O) |\
			GX_ROP_01_0(I) |\
			GX_ROP_00_1(O) |\
			GX_ROP_00_0(O))

#define ROP_PTXT(O,I)   (ROP_STANDARD |\
			GX_PATTERN_ONES |\
			GX_ROP_11_1(I) |\
			GX_ROP_11_0(GX_ROP_NOOP) |\
			GX_ROP_10_1(I) |\
			GX_ROP_10_0(GX_ROP_NOOP) | \
			GX_ROP_01_1(O) |\
			GX_ROP_01_0(GX_ROP_NOOP) |\
			GX_ROP_00_1(O) |\
			GX_ROP_00_0(GX_ROP_NOOP))

static void sunGXDoBitblt(DrawablePtr, DrawablePtr, int, RegionPtr, DDXPointPtr, unsigned long);
static RegionPtr sunGXCopyArea(DrawablePtr, DrawablePtr, GC *, int, int, int, int, int, int);
static void sunGXCopyPlane1to8(DrawablePtr, DrawablePtr, int, RegionPtr, DDXPointPtr, unsigned long, unsigned long);
static RegionPtr sunGXCopyPlane(DrawablePtr, DrawablePtr, GCPtr, int, int, int, int, int, int, unsigned long);
static void sunGXFillRectAll(DrawablePtr, GCPtr, int, BoxPtr);
static void sunGXPolyFillRect(DrawablePtr, GCPtr, int, xRectangle *);
static void sunGXFillSpans(DrawablePtr, GCPtr, int, DDXPointPtr, int *, int);
static void sunGXFillEllipse(DrawablePtr, sunGXPtr, xArc *);
static void sunGXFillArcSlice(DrawablePtr, GCPtr, sunGXPtr, xArc *);
static void sunGXPolyFillArc(DrawablePtr, GCPtr, int, xArc *);
static void sunGXFillPoly1Rect(DrawablePtr, GCPtr, int, int, int, DDXPointPtr);

static Uint gx_blit_rop_table[16]={
    ROP_BLIT(GX_ROP_CLEAR,  GX_ROP_CLEAR),	/* GXclear */
    ROP_BLIT(GX_ROP_CLEAR,  GX_ROP_NOOP),	/* GXand */
    ROP_BLIT(GX_ROP_CLEAR,  GX_ROP_INVERT),	/* GXandReverse */
    ROP_BLIT(GX_ROP_CLEAR,  GX_ROP_SET),	/* GXcopy */
    ROP_BLIT(GX_ROP_NOOP,   GX_ROP_CLEAR),	/* GXandInverted */
    ROP_BLIT(GX_ROP_NOOP,   GX_ROP_NOOP),	/* GXnoop */
    ROP_BLIT(GX_ROP_NOOP,   GX_ROP_INVERT),	/* GXxor */
    ROP_BLIT(GX_ROP_NOOP,   GX_ROP_SET),	/* GXor */
    ROP_BLIT(GX_ROP_INVERT, GX_ROP_CLEAR),	/* GXnor */
    ROP_BLIT(GX_ROP_INVERT, GX_ROP_NOOP),	/* GXequiv */
    ROP_BLIT(GX_ROP_INVERT, GX_ROP_INVERT),	/* GXinvert */
    ROP_BLIT(GX_ROP_INVERT, GX_ROP_SET),	/* GXorReverse */
    ROP_BLIT(GX_ROP_SET,    GX_ROP_CLEAR),	/* GXcopyInverted */
    ROP_BLIT(GX_ROP_SET,    GX_ROP_NOOP),	/* GXorInverted */
    ROP_BLIT(GX_ROP_SET,    GX_ROP_INVERT),	/* GXnand */
    ROP_BLIT(GX_ROP_SET,    GX_ROP_SET),	/* GXset */
};

/* rops for solid drawing
   with:
       Plane Mask - use plane mask reg.
       Pixel Mask - use all ones.
       Patt  Mask - use all ones.
*/

static Uint gx_solid_rop_table[16]={
    ROP_FILL(GX_ROP_CLEAR,  GX_ROP_CLEAR),	/* GXclear */
    ROP_FILL(GX_ROP_CLEAR,  GX_ROP_NOOP),	/* GXand */
    ROP_FILL(GX_ROP_CLEAR,  GX_ROP_INVERT),	/* GXandReverse */
    ROP_FILL(GX_ROP_CLEAR,  GX_ROP_SET),	/* GXcopy */
    ROP_FILL(GX_ROP_NOOP,   GX_ROP_CLEAR),	/* GXandInverted */
    ROP_FILL(GX_ROP_NOOP,   GX_ROP_NOOP),	/* GXnoop */
    ROP_FILL(GX_ROP_NOOP,   GX_ROP_INVERT),	/* GXxor */
    ROP_FILL(GX_ROP_NOOP,   GX_ROP_SET),	/* GXor */
    ROP_FILL(GX_ROP_INVERT, GX_ROP_CLEAR),	/* GXnor */
    ROP_FILL(GX_ROP_INVERT, GX_ROP_NOOP),	/* GXequiv */
    ROP_FILL(GX_ROP_INVERT, GX_ROP_INVERT),	/* GXinvert */
    ROP_FILL(GX_ROP_INVERT, GX_ROP_SET),	/* GXorReverse */
    ROP_FILL(GX_ROP_SET,    GX_ROP_CLEAR),	/* GXcopyInverted */
    ROP_FILL(GX_ROP_SET,    GX_ROP_NOOP),	/* GXorInverted */
    ROP_FILL(GX_ROP_SET,    GX_ROP_INVERT),	/* GXnand */
    ROP_FILL(GX_ROP_SET,    GX_ROP_SET),	/* GXset */
};

static Uint gx_stipple_rop_table[16]={
    ROP_STIP(GX_ROP_CLEAR,  GX_ROP_CLEAR),	/* GXclear */
    ROP_STIP(GX_ROP_CLEAR,  GX_ROP_NOOP),	/* GXand */
    ROP_STIP(GX_ROP_CLEAR,  GX_ROP_INVERT),	/* GXandReverse */
    ROP_STIP(GX_ROP_CLEAR,  GX_ROP_SET),	/* GXcopy */
    ROP_STIP(GX_ROP_NOOP,   GX_ROP_CLEAR),	/* GXandInverted */
    ROP_STIP(GX_ROP_NOOP,   GX_ROP_NOOP),	/* GXnoop */
    ROP_STIP(GX_ROP_NOOP,   GX_ROP_INVERT),	/* GXxor */
    ROP_STIP(GX_ROP_NOOP,   GX_ROP_SET),	/* GXor */
    ROP_STIP(GX_ROP_INVERT, GX_ROP_CLEAR),	/* GXnor */
    ROP_STIP(GX_ROP_INVERT, GX_ROP_NOOP),	/* GXequiv */
    ROP_STIP(GX_ROP_INVERT, GX_ROP_INVERT),	/* GXinvert */
    ROP_STIP(GX_ROP_INVERT, GX_ROP_SET),	/* GXorReverse */
    ROP_STIP(GX_ROP_SET,    GX_ROP_CLEAR),	/* GXcopyInverted */
    ROP_STIP(GX_ROP_SET,    GX_ROP_NOOP),	/* GXorInverted */
    ROP_STIP(GX_ROP_SET,    GX_ROP_INVERT),	/* GXnand */
    ROP_STIP(GX_ROP_SET,    GX_ROP_SET),	/* GXset */
};

static Uint gx_opaque_stipple_rop_table[16]={
    ROP_OSTP(GX_ROP_CLEAR,  GX_ROP_CLEAR),	/* GXclear */
    ROP_OSTP(GX_ROP_CLEAR,  GX_ROP_NOOP),	/* GXand */
    ROP_OSTP(GX_ROP_CLEAR,  GX_ROP_INVERT),	/* GXandReverse */
    ROP_OSTP(GX_ROP_CLEAR,  GX_ROP_SET),	/* GXcopy */
    ROP_OSTP(GX_ROP_NOOP,   GX_ROP_CLEAR),	/* GXandInverted */
    ROP_OSTP(GX_ROP_NOOP,   GX_ROP_NOOP),	/* GXnoop */
    ROP_OSTP(GX_ROP_NOOP,   GX_ROP_INVERT),	/* GXxor */
    ROP_OSTP(GX_ROP_NOOP,   GX_ROP_SET),	/* GXor */
    ROP_OSTP(GX_ROP_INVERT, GX_ROP_CLEAR),	/* GXnor */
    ROP_OSTP(GX_ROP_INVERT, GX_ROP_NOOP),	/* GXequiv */
    ROP_OSTP(GX_ROP_INVERT, GX_ROP_INVERT),	/* GXinvert */
    ROP_OSTP(GX_ROP_INVERT, GX_ROP_SET),	/* GXorReverse */
    ROP_OSTP(GX_ROP_SET,    GX_ROP_CLEAR),	/* GXcopyInverted */
    ROP_OSTP(GX_ROP_SET,    GX_ROP_NOOP),	/* GXorInverted */
    ROP_OSTP(GX_ROP_SET,    GX_ROP_INVERT),	/* GXnand */
    ROP_OSTP(GX_ROP_SET,    GX_ROP_SET),	/* GXset */
};

int	sunGXScreenPrivateIndex;
int	sunGXGCPrivateIndex;
int	sunGXWindowPrivateIndex;
int	sunGXGeneration;

/*
  sunGXDoBitBlt
  =============
  Bit Blit for all window to window blits.
*/
static void
sunGXDoBitblt(DrawablePtr pSrc, DrawablePtr pDst, int alu, RegionPtr prgnDst, DDXPointPtr pptSrc, unsigned long planemask)
{
    register sunGXPtr	gx = sunGXGetScreenPrivate (pSrc->pScreen);
    register long r;
    register BoxPtr pboxTmp;
    register DDXPointPtr pptTmp;
    register int nbox;
    BoxPtr pboxNext,pboxBase,pbox;

    /* setup GX ( need fg of 0xff for blits ) */
    GXBlitInit(gx,gx_blit_rop_table[alu]|POLY_O,planemask);

    pbox = REGION_RECTS(prgnDst);
    nbox = REGION_NUM_RECTS(prgnDst);

    /* need to blit rectangles in different orders, depending on the direction of copy
       so that an area isnt overwritten before it is blitted */
    if( (pptSrc->y < pbox->y1) && (nbox > 1) ){

	if( (pptSrc->x < pbox->x1) && (nbox > 1) ){

	    /* reverse order of bands and rects in each band */
	    pboxTmp=pbox+nbox;
	    pptTmp=pptSrc+nbox;

	    while (nbox--){
		pboxTmp--;
		pptTmp--;
		gx->x0=pptTmp->x;
		gx->y0=pptTmp->y;
		gx->x1=pptTmp->x+(pboxTmp->x2-pboxTmp->x1)-1;
		gx->y1=pptTmp->y+(pboxTmp->y2-pboxTmp->y1)-1;
		gx->x2=pboxTmp->x1;
		gx->y2=pboxTmp->y1;
		gx->x3=pboxTmp->x2-1;
		gx->y3=pboxTmp->y2-1;
		GXBlitDone(gx,r);
	    }
	}
	else{

	    /* keep ordering in each band, reverse order of bands */
	    pboxBase = pboxNext = pbox+nbox-1;

	    while (pboxBase >= pbox){ /* for each band */

		/* find first box in band */
		while ((pboxNext >= pbox) &&
		       (pboxBase->y1 == pboxNext->y1))
		    pboxNext--;

		pboxTmp = pboxNext+1;			/* first box in band */
		pptTmp = pptSrc + (pboxTmp - pbox);	/* first point in band */

		while (pboxTmp <= pboxBase){ /* for each box in band */
		    gx->x0=pptTmp->x;
		    gx->y0=pptTmp->y;
		    gx->x1=pptTmp->x+(pboxTmp->x2-pboxTmp->x1)-1;
		    gx->y1=pptTmp->y+(pboxTmp->y2-pboxTmp->y1)-1;
		    gx->x2=pboxTmp->x1;
		    gx->y2=pboxTmp->y1;
		    gx->x3=pboxTmp->x2-1;
		    gx->y3=pboxTmp->y2-1;
		    ++pboxTmp;
		    ++pptTmp;
		    GXBlitDone(gx,r);
		}
		pboxBase = pboxNext;
	    }
	}
    }
    else{

	if( (pptSrc->x < pbox->x1) && (nbox > 1) ){

	    /* reverse order of rects in each band */
	    pboxBase = pboxNext = pbox;

	    while (pboxBase < pbox+nbox){ /* for each band */

		/* find last box in band */
		while ((pboxNext < pbox+nbox) &&
		       (pboxNext->y1 == pboxBase->y1))
		    pboxNext++;

		pboxTmp = pboxNext;			/* last box in band */
		pptTmp = pptSrc + (pboxTmp - pbox);	/* last point in band */

		while (pboxTmp != pboxBase){ /* for each box in band */
		    --pboxTmp;
		    --pptTmp;
		    gx->x0=pptTmp->x;
		    gx->y0=pptTmp->y;
		    gx->x1=pptTmp->x+(pboxTmp->x2-pboxTmp->x1)-1;
		    gx->y1=pptTmp->y+(pboxTmp->y2-pboxTmp->y1)-1;
		    gx->x2=pboxTmp->x1;
		    gx->y2=pboxTmp->y1;
		    gx->x3=pboxTmp->x2-1;
		    gx->y3=pboxTmp->y2-1;
		    GXBlitDone(gx,r);
		}
		pboxBase = pboxNext;
	    }
	}
	else{

	    /* dont need to change order of anything */
	    pptTmp=pptSrc;
	    pboxTmp=pbox;

	    while(nbox--){
		gx->x0=pptTmp->x;
		gx->y0=pptTmp->y;
		gx->x1=pptTmp->x+(pboxTmp->x2-pboxTmp->x1)-1;
		gx->y1=pptTmp->y+(pboxTmp->y2-pboxTmp->y1)-1;
		gx->x2=pboxTmp->x1;
		gx->y2=pboxTmp->y1;
		gx->x3=pboxTmp->x2-1;
		gx->y3=pboxTmp->y2-1;
		pboxTmp++;
		pptTmp++;
		GXBlitDone(gx,r);
	    }
	}
    }
    GXWait(gx,r);
}

static RegionPtr
sunGXCopyArea(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GC *pGC, int srcx, int srcy, int width, int height, int dstx, int dsty)
{
    if (pSrcDrawable->type != DRAWABLE_WINDOW)
	return cfbCopyArea (pSrcDrawable, pDstDrawable,
            pGC, srcx, srcy, width, height, dstx, dsty);
    return cfbBitBlt (pSrcDrawable, pDstDrawable,
            pGC, srcx, srcy, width, height, dstx, dsty, sunGXDoBitblt, 0);
}

static unsigned long	copyPlaneFG, copyPlaneBG;

static void
sunGXCopyPlane1to8(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, int rop, RegionPtr prgnDst, DDXPointPtr pptSrc, unsigned long planemask, unsigned long bitPlane)
{
    register sunGXPtr	gx = sunGXGetScreenPrivate (pDstDrawable->pScreen);
    int			srcx, srcy, dstx, dsty, width, height;
    int			dstLastx, dstRightx;
    int			xoffSrc, widthSrc, widthRest;
    int			widthLast;
    unsigned long	*psrcBase, *psrc;
    unsigned long	bits, tmp;
    register int	leftShift, rightShift;
    register int	nl, nlMiddle;
    int			nbox;
    BoxPtr		pbox;
    register long	r;

    GXDrawInit (gx, copyPlaneFG,
		gx_opaque_stipple_rop_table[rop]|GX_PATTERN_ONES,
 		planemask);
    gx->bg = copyPlaneBG;
    gx->mode = GX_BLIT_NOSRC | GX_MODE_COLOR1;

    cfbGetLongWidthAndPointer (pSrcDrawable, widthSrc, psrcBase)

    nbox = REGION_NUM_RECTS(prgnDst);
    pbox = REGION_RECTS(prgnDst);
    gx->incx = BITMAP_SCANLINE_UNIT;
    gx->incy = 0;
    while (nbox--)
    {
	dstx = pbox->x1;
	dsty = pbox->y1;
	srcx = pptSrc->x;
	srcy = pptSrc->y;
	dstLastx = pbox->x2;
	width = dstLastx - dstx;
	height = pbox->y2 - dsty;
	pbox++;
	pptSrc++;
	if (!width)
	    continue;
	psrc = psrcBase + srcy * widthSrc + (srcx >> LOG2_BITMAP_PAD);
	dstLastx--;
	dstRightx = dstx + BITMAP_SCANLINE_UNIT - 1;
	nlMiddle = (width + BITMAP_SCANLINE_UNIT - 1) >> LOG2_BITMAP_PAD;
	widthLast = width & (BITMAP_SCANLINE_UNIT - 1);
	xoffSrc = srcx & ((1 << LOG2_BITMAP_PAD) - 1);
	leftShift = xoffSrc;
	rightShift = BITMAP_SCANLINE_UNIT - leftShift;
	widthRest = widthSrc - nlMiddle;
	if (widthLast)
	    nlMiddle--;
	if (leftShift == 0)
	{
	    while (height--)
	    {
	    	gx->x0 = dstx;
	    	gx->x1 = dstRightx;
	    	gx->y0 = dsty++;
	    	nl = nlMiddle;
	    	while (nl--)
		    gx->font = *psrc++;
	    	if (widthLast)
	    	{
		    gx->x1 = dstLastx;
#if BITMAP_SCANLINE_UNIT == 64
		    gx->font = (int)((*psrc++)>>32);
#else
		    gx->font = *psrc++;
#endif
	    	}
		psrc += widthRest;
	    }
	}
	else
	{
	    widthRest--;
	    while (height--)
	    {
	    	gx->x0 = dstx;
	    	gx->x1 = dstRightx;
	    	gx->y0 = dsty++;
	    	bits = *psrc++;
	    	nl = nlMiddle;
	    	while (nl--)
	    	{
		    tmp = BitLeft(bits, leftShift);
		    bits = *psrc++;
		    tmp |= BitRight(bits, rightShift);
		    gx->font = tmp;
	    	}
	    	if (widthLast)
	    	{
		    tmp = BitLeft(bits, leftShift);
		    bits = *psrc++;
		    tmp |= BitRight(bits, rightShift);
		    gx->x1 = dstLastx;
		    gx->font = tmp;
	    	}
		psrc += widthRest;
	    }
	}
    }
    GXWait (gx, r);
    gx->incx = 0;
    gx->incy = 0;
    gx->mode = GX_BLIT_SRC | GX_MODE_COLOR8;
}

static RegionPtr
sunGXCopyPlane(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC, int srcx, int srcy, int width, int height, int dstx, int dsty, unsigned long bitPlane)
{
    RegionPtr		ret;

    if (pSrcDrawable->bitsPerPixel == 1 && pDstDrawable->bitsPerPixel == 8)
    {
    	if (bitPlane == 1)
	{
	    copyPlaneFG = pGC->fgPixel;
	    copyPlaneBG = pGC->bgPixel;
    	    ret = cfbBitBlt (pSrcDrawable, pDstDrawable,
	    	    pGC, srcx, srcy, width, height, dstx, dsty, sunGXCopyPlane1to8, bitPlane);
	}
	else
	    ret = miHandleExposures (pSrcDrawable, pDstDrawable,
	    	pGC, srcx, srcy, width, height, dstx, dsty, bitPlane);
    }
    else if (pSrcDrawable->bitsPerPixel == 8 && pDstDrawable->bitsPerPixel == 1)
    {
	extern	int InverseAlu[16];
	int oldalu;

	oldalu = pGC->alu;
    	if ((pGC->fgPixel & 1) == 0 && (pGC->bgPixel&1) == 1)
	    pGC->alu = InverseAlu[pGC->alu];
    	else if ((pGC->fgPixel & 1) == (pGC->bgPixel & 1))
	    pGC->alu = mfbReduceRop(pGC->alu, pGC->fgPixel);
	ret = cfbCopyPlaneReduce (pSrcDrawable, pDstDrawable,
		    pGC, srcx, srcy, width, height, dstx, dsty, cfbCopyPlane8to1, bitPlane);
	pGC->alu = oldalu;
    }
    else
    {
	PixmapPtr	pBitmap;
	ScreenPtr	pScreen = pSrcDrawable->pScreen;
	GCPtr		pGC1;

	pBitmap = (*pScreen->CreatePixmap) (pScreen, width, height, 1);
	if (!pBitmap)
	    return NULL;
	pGC1 = GetScratchGC (1, pScreen);
	if (!pGC1)
	{
	    (*pScreen->DestroyPixmap) (pBitmap);
	    return NULL;
	}
	/*
	 * don't need to set pGC->fgPixel,bgPixel as copyPlane8to1
	 * ignores pixel values, expecting the rop to "do the
	 * right thing", which GXcopy will.
	 */
	ValidateGC ((DrawablePtr) pBitmap, pGC1);
	/* no exposures here, scratch GC's don't get graphics expose */
	(void) cfbCopyPlaneReduce (pSrcDrawable, (DrawablePtr) pBitmap,
			    pGC1, srcx, srcy, width, height, 0, 0, cfbCopyPlane8to1, bitPlane);
	copyPlaneFG = pGC->fgPixel;
	copyPlaneBG = pGC->bgPixel;
	(void) cfbBitBlt ((DrawablePtr) pBitmap, pDstDrawable, pGC,
			    0, 0, width, height, dstx, dsty, sunGXCopyPlane1to8, 1);
	FreeScratchGC (pGC1);
	(*pScreen->DestroyPixmap) (pBitmap);
	/* compute resultant exposures */
	ret = miHandleExposures (pSrcDrawable, pDstDrawable, pGC,
				 srcx, srcy, width, height,
				 dstx, dsty, bitPlane);
    }
    return ret;
}

static void
sunGXFillRectAll(DrawablePtr pDrawable, GCPtr pGC, int nBox, BoxPtr pBox)
{
    register sunGXPtr	gx = sunGXGetScreenPrivate (pDrawable->pScreen);
    register sunGXPrivGCPtr gxPriv = sunGXGetGCPrivate (pGC);
    register int	r;

    GXDrawInit(gx,pGC->fgPixel,gx_solid_rop_table[pGC->alu]|POLY_N,pGC->planemask);
    if (gxPriv->stipple)
	GXStippleInit(gx,gxPriv->stipple);
    while (nBox--) {
	gx->arecty = pBox->y1;
	gx->arectx = pBox->x1;
	gx->arecty = pBox->y2;
	gx->arectx = pBox->x2;
	pBox++;
	GXDrawDone(gx,r);
    }
    GXWait(gx,r);
}

#define NUM_STACK_RECTS	1024

static void
sunGXPolyFillRect(
    DrawablePtr	pDrawable,
    GCPtr	pGC,
    int		nrectFill, 	/* number of rectangles to fill */
    xRectangle	*prectInit  	/* Pointer to first rectangle to fill */
)
{
    xRectangle	    *prect;
    RegionPtr	    prgnClip;
    register BoxPtr pbox;
    register BoxPtr pboxClipped;
    BoxPtr	    pboxClippedBase;
    BoxPtr	    pextent;
    BoxRec	    stackRects[NUM_STACK_RECTS];
    int		    numRects;
    int		    n;
    int		    xorg, yorg;

    prgnClip = pGC->pCompositeClip;
    prect = prectInit;
    xorg = pDrawable->x;
    yorg = pDrawable->y;
    if (xorg || yorg)
    {
	prect = prectInit;
	n = nrectFill;
	while(n--)
	{
	    prect->x += xorg;
	    prect->y += yorg;
	    prect++;
	}
    }

    prect = prectInit;

    numRects = REGION_NUM_RECTS(prgnClip) * nrectFill;
    if (numRects > NUM_STACK_RECTS)
    {
	pboxClippedBase = (BoxPtr)ALLOCATE_LOCAL(numRects * sizeof(BoxRec));
	if (!pboxClippedBase)
	    return;
    }
    else
	pboxClippedBase = stackRects;

    pboxClipped = pboxClippedBase;

    if (REGION_NUM_RECTS(prgnClip) == 1)
    {
	int x1, y1, x2, y2, bx2, by2;

	pextent = REGION_RECTS(prgnClip);
	x1 = pextent->x1;
	y1 = pextent->y1;
	x2 = pextent->x2;
	y2 = pextent->y2;
    	while (nrectFill--)
    	{
	    if ((pboxClipped->x1 = prect->x) < x1)
		pboxClipped->x1 = x1;

	    if ((pboxClipped->y1 = prect->y) < y1)
		pboxClipped->y1 = y1;

	    bx2 = (int) prect->x + (int) prect->width;
	    if (bx2 > x2)
		bx2 = x2;
	    pboxClipped->x2 = bx2;

	    by2 = (int) prect->y + (int) prect->height;
	    if (by2 > y2)
		by2 = y2;
	    pboxClipped->y2 = by2;

	    prect++;
	    if ((pboxClipped->x1 < pboxClipped->x2) &&
		(pboxClipped->y1 < pboxClipped->y2))
	    {
		pboxClipped++;
	    }
    	}
    }
    else
    {
	int x1, y1, x2, y2, bx2, by2;

	pextent = REGION_EXTENTS(pGC->pScreen, prgnClip);
	x1 = pextent->x1;
	y1 = pextent->y1;
	x2 = pextent->x2;
	y2 = pextent->y2;
    	while (nrectFill--)
    	{
	    BoxRec box;

	    if ((box.x1 = prect->x) < x1)
		box.x1 = x1;

	    if ((box.y1 = prect->y) < y1)
		box.y1 = y1;

	    bx2 = (int) prect->x + (int) prect->width;
	    if (bx2 > x2)
		bx2 = x2;
	    box.x2 = bx2;

	    by2 = (int) prect->y + (int) prect->height;
	    if (by2 > y2)
		by2 = y2;
	    box.y2 = by2;

	    prect++;

	    if ((box.x1 >= box.x2) || (box.y1 >= box.y2))
	    	continue;

	    n = REGION_NUM_RECTS (prgnClip);
	    pbox = REGION_RECTS(prgnClip);

	    /* clip the rectangle to each box in the clip region
	       this is logically equivalent to calling Intersect()
	    */
	    while(n--)
	    {
		pboxClipped->x1 = max(box.x1, pbox->x1);
		pboxClipped->y1 = max(box.y1, pbox->y1);
		pboxClipped->x2 = min(box.x2, pbox->x2);
		pboxClipped->y2 = min(box.y2, pbox->y2);
		pbox++;

		/* see if clipping left anything */
		if(pboxClipped->x1 < pboxClipped->x2 &&
		   pboxClipped->y1 < pboxClipped->y2)
		{
		    pboxClipped++;
		}
	    }
    	}
    }
    if (pboxClipped != pboxClippedBase)
	sunGXFillRectAll(pDrawable, pGC,
		    pboxClipped-pboxClippedBase, pboxClippedBase);
    if (pboxClippedBase != stackRects)
    	DEALLOCATE_LOCAL(pboxClippedBase);
}

static void
sunGXFillSpans(
    DrawablePtr pDrawable,
    GCPtr	pGC,
    int		n,			/* number of spans to fill */
    DDXPointPtr ppt,			/* pointer to list of start points */
    int		*pwidth,		/* pointer to list of n widths */
    int 	fSorted
)
{
    int		    x, y;
    int		    width;
				/* next three parameters are post-clip */
    int		    nTmp;
    int		    *pwidthFree;/* copies of the pointers to free */
    DDXPointPtr	    pptFree;
    register sunGXPtr	gx = sunGXGetScreenPrivate (pDrawable->pScreen);
    cfbPrivGCPtr    devPriv = cfbGetGCPrivate(pGC);
    register sunGXPrivGCPtr gxPriv = sunGXGetGCPrivate (pGC);
    register int    r;
    BoxPtr	    extents;

    GXDrawInit(gx,pGC->fgPixel,gx_solid_rop_table[pGC->alu]|POLY_O,pGC->planemask)
    if (gxPriv->stipple)
	GXStippleInit(gx,gxPriv->stipple);
    if (devPriv->oneRect)
    {
	extents = &pGC->pCompositeClip->extents;
	GXSetClip (gx, extents);
    }
    else
    {
    	nTmp = n * miFindMaxBand(pGC->pCompositeClip);
    	pwidthFree = (int *)ALLOCATE_LOCAL(nTmp * sizeof(int));
    	pptFree = (DDXPointRec *)ALLOCATE_LOCAL(nTmp * sizeof(DDXPointRec));
    	if(!pptFree || !pwidthFree)
    	{
	    if (pptFree) DEALLOCATE_LOCAL(pptFree);
	    if (pwidthFree) DEALLOCATE_LOCAL(pwidthFree);
	    return;
    	}
    	n = miClipSpans(pGC->pCompositeClip, ppt, pwidth, n,
		     	 pptFree, pwidthFree, fSorted);
    	pwidth = pwidthFree;
    	ppt = pptFree;
    }
    while (n--)
    {
	x = ppt->x;
	y = ppt->y;
	ppt++;
	width = *pwidth++;
	if (width)
	{
	    sunGXFillSpan(gx,y,x,x + width - 1,r);
	}
    }
    GXWait(gx,r);
    if (devPriv->oneRect)
    {
	GXResetClip (gx, pDrawable->pScreen);
    }
    else
    {
	DEALLOCATE_LOCAL(pptFree);
	DEALLOCATE_LOCAL(pwidthFree);
    }
}

#ifdef NOTDEF
/* cfb is faster for dots */
void
sunGXPolyPoint(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt, xPoint *pptInit)
{
    register sunGXPtr	gx = sunGXGetScreenPrivate (pDrawable->pScreen);
    RegionPtr	    cclip;
    int		    nbox;
    register int    i;
    register BoxPtr pbox;
    cfbPrivGCPtr    devPriv;
    xPoint	    *ppt;
    int		    x, y;
    int		    r;
    int		    off;

    devPriv = (cfbPrivGC *)(pGC->devPrivates[cfbGCPrivateIndex].ptr);
    if (devPriv->rop == GXnoop)
	return;
    cclip = pGC->pCompositeClip;
    GXDrawInit(gx,pGC->fgPixel,gx_solid_rop_table[pGC->alu],pGC->planemask);
    gx->offx = pDrawable->x;
    gx->offy = pDrawable->y;
    for (nbox = REGION_NUM_RECTS(cclip), pbox = REGION_RECTS(cclip);
	 --nbox >= 0;
	 pbox++)
    {
	sunGXSetClip(gx,pbox);
	if (mode != CoordModeOrigin)
	{
	    x = 0;
	    y = 0;
	    for (ppt = pptInit, i = npt; --i >= 0;)
	    {
	    	gx->apointy = y += ppt->y;
	    	gx->apointx = x += ppt->x;
	    	++ppt;
	    	GXDrawDone(gx,r);
	    }
	}
	else
	{
	    for (ppt = pptInit, i = npt; --i >= 0;)
	    {
	    	gx->apointy = ppt->y;
	    	gx->apointx = ppt->x;
	    	++ppt;
	    	GXDrawDone(gx,r);
	    }
	}
    }
    GXWait(gx,r);
    GXResetOff (gx);
    GXResetClip(gx,pDrawable->pScreen);
}
#endif

#include "mifillarc.h"

#define FILLSPAN(gx,y,x1,x2,r) {\
    if (x2 >= x1) {\
	sunGXFillSpan(gx,y,x1,x2,r) \
    } \
}

#define FILLSLICESPANS(flip,y) \
    if (!flip) \
    { \
	FILLSPAN(gx,y,xl,xr,r) \
    } \
    else \
    { \
	xc = xorg - x; \
	FILLSPAN(gx, y, xc, xr, r) \
	xc += slw - 1; \
	FILLSPAN(gx, y, xl, xc, r) \
    }

static void
sunGXFillEllipse(DrawablePtr pDraw, sunGXPtr gx, xArc *arc)
{
    int x, y, e;
    int yk, xk, ym, xm, dx, dy, xorg, yorg;
    int	y_top, y_bot;
    miFillArcRec info;
    register int xpos;
    int	r;
    int	slw;

    miFillArcSetup(arc, &info);
    MIFILLARCSETUP();
    y_top = yorg - y;
    y_bot = yorg + y + dy;
    while (y)
    {
	y_top++;
	y_bot--;
	MIFILLARCSTEP(slw);
	if (!slw)
	    continue;
	xpos = xorg - x;
	sunGXFillSpan (gx,y_top,xpos,xpos+slw - 1,r);
	if (miFillArcLower(slw))
	    sunGXFillSpan (gx,y_bot,xpos,xpos+slw - 1,r);
    }
}


static void
sunGXFillArcSlice(DrawablePtr pDraw, GCPtr pGC, sunGXPtr gx, xArc *arc)
{
    int yk, xk, ym, xm, dx, dy, xorg, yorg, slw;
    register int x, y, e;
    miFillArcRec info;
    miArcSliceRec slice;
    int xl, xr, xc;
    int	y_top, y_bot;
    int	r;

    miFillArcSetup(arc, &info);
    miFillArcSliceSetup(arc, &slice, pGC);
    MIFILLARCSETUP();
    y_top = yorg - y;
    y_bot = yorg + y + dy;
    while (y > 0)
    {
	y_top++;
	y_bot--;
	MIFILLARCSTEP(slw);
	MIARCSLICESTEP(slice.edge1);
	MIARCSLICESTEP(slice.edge2);
	if (miFillSliceUpper(slice))
	{
	    MIARCSLICEUPPER(xl, xr, slice, slw);
	    FILLSLICESPANS(slice.flip_top, y_top);
	}
	if (miFillSliceLower(slice))
	{
	    MIARCSLICELOWER(xl, xr, slice, slw);
	    FILLSLICESPANS(slice.flip_bot, y_bot);
	}
    }
}

#define FAST_CIRCLES
#ifdef FAST_CIRCLES
#if     (BITMAP_BIT_ORDER == MSBFirst)
#define Bits32(v)   (v)
#define Bits16(v)   (v)
#define Bits8(v)    (v)
#else
#define FlipBits2(a)     ((((a) & 0x1) << 1) | (((a) & 0x2) >> 1))
#define FlipBits4(a)     ((FlipBits2(a) << 2) | FlipBits2(a >> 2))
#define FlipBits8(a)     ((FlipBits4(a) << 4) | FlipBits4(a >> 4))
#define FlipBits16(a)    ((FlipBits8(a) << 8) | FlipBits8(a >> 8))
#define FlipBits32(a)    ((FlipBits16(a) << 16) | FlipBits16(a >> 16))
#define Bits32(v)   FlipBits32(v)
#define Bits16(v)   FlipBits16(v)
#define Bits8(v)    FlipBits8(v)
#endif

#define B(x)	Bits16(x)
#define DO_FILLED_ARCS
#include    "circleset.h"
#undef B
#undef Bits8
#undef Bits16
#undef Bits32
#define UNSET_CIRCLE	if (old_width) \
			{ \
			    gx->alu = gx_solid_rop_table[pGC->alu]; \
			    old_width = -old_width; \
			}

#else
#define UNSET_CIRCLE
#endif

static void
sunGXPolyFillArc(DrawablePtr pDraw, GCPtr pGC, int narcs, xArc *parcs)
{
    register xArc *arc;
    register int i;
    int		x, y;
    BoxRec box;
    BoxPtr	extents = NULL;
    RegionPtr cclip;
    register sunGXPtr	gx = sunGXGetScreenPrivate (pDraw->pScreen);
    sunGXPrivGCPtr	gxPriv = sunGXGetGCPrivate (pGC);
    cfbPrivGCPtr    devPriv;
    register int	r;
#ifdef FAST_CIRCLES
    int			old_width = 0;
#endif

    GXDrawInit(gx,pGC->fgPixel,gx_solid_rop_table[pGC->alu]|POLY_O,pGC->planemask);
    if (gxPriv->stipple)
	GXStippleInit(gx,gxPriv->stipple);
    devPriv = (cfbPrivGC *)(pGC->devPrivates[cfbGCPrivateIndex].ptr);
    cclip = pGC->pCompositeClip;
    GXSetOff(gx,pDraw->x,pDraw->y)
    if (devPriv->oneRect) {
	extents = &cclip->extents;
	GXSetClip(gx,extents);
    }
    for (arc = parcs, i = narcs; --i >= 0; arc++)
    {
	if (miFillArcEmpty(arc))
	    continue;
	if (miCanFillArc(arc))
	{
	    x = arc->x;
	    y = arc->y;
	    if (!devPriv->oneRect)
	    {
	    	box.x1 = x + pDraw->x;
	    	box.y1 = y + pDraw->y;
	    	box.x2 = box.x1 + (int)arc->width + 1;
	    	box.y2 = box.y1 + (int)arc->height + 1;
	    }
	    if (devPriv->oneRect ||
		RECT_IN_REGION(pDraw->pScreen, cclip, &box) == rgnIN)
	    {
		if ((arc->angle2 >= FULLCIRCLE) ||
		    (arc->angle2 <= -FULLCIRCLE))
		{
#ifdef FAST_CIRCLES
/* who really needs fast filled circles? */
		    if (arc->width == arc->height && arc->width <= 16 &&
			!gxPriv->stipple)
		    {
			int offx, offy;
			if (arc->width != old_width)
			{
			    int	    i;
			    Uint    *sp;
			    VUint   *dp;

			    if (old_width != -arc->width)
			    {
			    	sp = (Uint *) filled_arcs[arc->width-1];
			    	dp = gx->pattern;
			    	i = 8;
			    	while (i--)
				    dp[i] = sp[i];
			    }
			    gx->alu = gx_stipple_rop_table[pGC->alu]|GX_PATTERN_MASK;
			    old_width = arc->width;
			}
			offx = 16 - ((x + pDraw->x) & 0x0f);
			offy = 16 - ((y + pDraw->y) & 0x0f);
			gx->patalign = (offx << 16) | offy;
			gx->arecty = y;
			gx->arectx = x;
			gx->arecty = y + old_width-1;
			gx->arectx = x + old_width-1;
			GXDrawDone (gx, r);
		    }
		    else
#endif
		    {
			UNSET_CIRCLE
			sunGXFillEllipse (pDraw, gx, arc);
		    }
		}
		else
		{
		    UNSET_CIRCLE
		    sunGXFillArcSlice (pDraw, pGC, gx, arc);
		}
		continue;
	    }
	}
	UNSET_CIRCLE
	GXWait (gx,r);
	GXResetOff (gx);
	if (devPriv->oneRect)
	    GXResetClip (gx, pDraw->pScreen);
	miPolyFillArc(pDraw, pGC, 1, arc);
	GXSetOff (gx, pDraw->x, pDraw->y);
	if (devPriv->oneRect)
	    GXSetClip (gx, extents);
    }
    GXWait (gx, r);
    GXResetOff (gx);
    if (devPriv->oneRect)
	GXResetClip (gx, pDraw->pScreen);
}

static void
sunGXFillPoly1Rect(DrawablePtr pDrawable, GCPtr pGC, int shape, int mode, int count, DDXPointPtr ptsIn)
{
    BoxPtr	    extents;
    int		    x1, x2, x3, x4;
    int		    y1, y2, y3, y4;
    sunGXPtr	    gx = sunGXGetScreenPrivate (pDrawable->pScreen);
    sunGXPrivGCPtr  gxPriv = sunGXGetGCPrivate (pGC);
    int		    r;
    typedef struct {
	Uint	    x;
	Uint	    y;
	Uint	    z;
    } GXPointRec, *GXPointPtr;
    GXPointPtr	    tri, qua;

    if (count < 3)
	return;
    if (shape != Convex && count > 4)
    {
	miFillPolygon (pDrawable, pGC, shape, mode, count, ptsIn);
	return;
    }
    GXDrawInit(gx,pGC->fgPixel,gx_solid_rop_table[pGC->alu]|POLY_N,pGC->planemask);
    if (gxPriv->stipple)
	GXStippleInit(gx,gxPriv->stipple);
    extents = &pGC->pCompositeClip->extents;
    GXSetOff(gx,pDrawable->x, pDrawable->y);
    GXSetClip(gx,extents);
    if (mode == CoordModeOrigin)
    {
	tri = (GXPointPtr) &gx->atrix;
	qua = (GXPointPtr) &gx->aquadx;
    }
    else
    {
	tri = (GXPointPtr) &gx->rtrix;
	qua = (GXPointPtr) &gx->rquadx;
    }
    if (count == 3) {
	gx->apointy = ptsIn[0].y;
	gx->apointx = ptsIn[0].x;
	tri->y = ptsIn[1].y;
	tri->x = ptsIn[1].x;
	tri->y = ptsIn[2].y;
	tri->x = ptsIn[2].x;
	GXDrawDone (gx, r);
    }
    else if (count == 4)
    {
	gx->apointy = ptsIn[0].y;
	gx->apointx = ptsIn[0].x;
	qua->y = ptsIn[1].y;
	qua->x = ptsIn[1].x;
	qua->y = ptsIn[2].y;
	qua->x = ptsIn[2].x;
	qua->y = ptsIn[3].y;
	qua->x = ptsIn[3].x;
	GXDrawDone (gx, r);
	if (r < 0 && shape != Convex)
	{
	    GXWait(gx,r);
	    GXResetOff(gx);
	    GXResetClip(gx,pDrawable->pScreen);
	    miFillPolygon (pDrawable, pGC, shape, mode, count, ptsIn);
	    return;
	}
    }
    else
    {
	y1 = ptsIn[0].y;
	x1 = ptsIn[0].x;
	y2 = ptsIn[1].y;
	x2 = ptsIn[1].x;
	count -= 2;
	ptsIn += 2;
    	while (count) {
	    x3 = ptsIn->x;
	    y3 = ptsIn->y;
	    ptsIn++;
	    count--;
	    gx->apointy = y1;
	    gx->apointx = x1;
	    if (count == 0) {
		tri->y = y2;
		tri->x = x2;
		tri->y = y3;
		tri->x = x3;
	    }
	    else
	    {
		y4 = ptsIn->y;
		x4 = ptsIn->x;
		ptsIn++;
		count--;
		qua->y = y2;
		qua->x = x2;
		qua->y = y3;
		qua->x = x3;
		qua->y = y4;
		qua->x = x4;
		if (mode == CoordModeOrigin)
		{
		    x2 = x4;
		    y2 = y4;
		}
		else
		{
		    x2 = x2 + x3 + x4;
		    y2 = y2 + y3 + y4;
		}
	    }
	    GXDrawDone (gx, r);
    	}
    }
    GXWait(gx,r);
    GXResetOff(gx);
    GXResetClip(gx,pDrawable->pScreen);
}

/*
 * Note that the GX does not allow CapNotLast, so the code fakes it.  This is
 * expensive to do as the GX is asynchronous and must be synced with GXWait
 * before fetching and storing the final line point.  If only the hardware was
 * designed for X.
 */

/* hard code the screen width; otherwise we'd have to check or mul */

#define WIDTH_MUL(y)	(((y) << 10) + ((y) << 7))
#define GX_WIDTH	1152
#define WID_OK(s)	((s)->width == GX_WIDTH)

void
sunGXPolySeg1Rect(DrawablePtr pDrawable, GCPtr pGC, int nseg, xSegment *pSeg)
{
    sunGXPtr	    gx = sunGXGetScreenPrivate (pDrawable->pScreen);
    sunGXPrivGCPtr  gxPriv = sunGXGetGCPrivate (pGC);
    BoxPtr	    extents;
    int		    x, y;
    int		    r;
    unsigned char   *baseAddr, *loAddr, *hiAddr, *saveAddr = 0, save = 0;

    GXDrawInit(gx,pGC->fgPixel,gx_solid_rop_table[pGC->alu]|POLY_O,pGC->planemask);
    if (gxPriv->stipple)
	GXStippleInit(gx,gxPriv->stipple);
    GXSetOff (gx, pDrawable->x, pDrawable->y);

    extents = &pGC->pCompositeClip->extents;
    GXSetClip (gx, extents);
    if (pGC->capStyle == CapNotLast)
    {
	sunGXGetAddrRange(pDrawable,extents,baseAddr,loAddr,hiAddr);
    	while (nseg--)
    	{
	    gx->aliney = pSeg->y1;
	    gx->alinex = pSeg->x1;
	    y = pSeg->y2;
	    x = pSeg->x2;
	    saveAddr = baseAddr + WIDTH_MUL(y) + x;
	    if (saveAddr < loAddr || hiAddr < saveAddr)
		saveAddr = 0;
	    else
		save = *saveAddr;
	    gx->aliney = y;
	    gx->alinex = x;
	    GXDrawDone (gx, r);
	    if (saveAddr)
	    {
		GXWait(gx,r);
		*saveAddr = save;
	    }
	    pSeg++;
    	}
    }
    else
    {
    	while (nseg--)
    	{
	    gx->aliney = pSeg->y1;
	    gx->alinex = pSeg->x1;
	    gx->aliney = pSeg->y2;
	    gx->alinex = pSeg->x2;
	    pSeg++;
	    GXDrawDone (gx, r);
    	}
    }
    GXWait (gx, r);
    GXResetOff (gx);
    GXResetClip (gx, pDrawable->pScreen);
}

void
sunGXPolylines1Rect(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt, DDXPointPtr ppt)
{
    sunGXPtr	    gx = sunGXGetScreenPrivate (pDrawable->pScreen);
    sunGXPrivGCPtr  gxPriv = sunGXGetGCPrivate (pGC);
    BoxPtr	    extents;
    unsigned char   *baseAddr, *loAddr, *hiAddr, *saveAddr, save = 0;
    int		    r;
    Bool	    careful;
    Bool	    capNotLast;

    if (!--npt)
	return;
    GXDrawInit(gx,pGC->fgPixel,gx_solid_rop_table[pGC->alu]|POLY_O,pGC->planemask);
    if (gxPriv->stipple)
	GXStippleInit(gx,gxPriv->stipple);
    careful = ((pGC->alu & 0xc) == 0x8 || (pGC->alu & 0x3) == 0x2);
    capNotLast = pGC->capStyle == CapNotLast;

    extents = &pGC->pCompositeClip->extents;
    GXSetOff (gx, pDrawable->x, pDrawable->y);
    GXSetClip (gx, extents);
    if (careful)
    {
	int	x, y;
	sunGXGetAddrRange (pDrawable, extents, baseAddr, loAddr, hiAddr);
	gx->apointy = y = ppt->y;
	gx->apointx = x = ppt->x;
	ppt++;
    	while (npt--)
    	{
	    if (mode == CoordModeOrigin)
	    {
		y = ppt->y;
		x = ppt->x;
	    }
	    else
	    {
	    	y += ppt->y;
	    	x += ppt->x;
	    }
	    ppt++;
	    saveAddr = baseAddr + WIDTH_MUL(y) + x;
	    if (saveAddr < loAddr || hiAddr < saveAddr)
		saveAddr = 0;
	    else
		save = *saveAddr;
	    gx->aliney = y;
	    gx->alinex = x;
	    GXDrawDone (gx, r);
	    if (saveAddr)
	    {
		GXWait(gx,r);
	    	*saveAddr = save;
	    }
    	}
	GXWait(gx,r);
    }
    else
    {
	int	x, y;
	if (capNotLast)
	    npt--;
	if (mode == CoordModeOrigin)
	{
	    x = y = 0;
	    gx->apointy = ppt->y;
	    gx->apointx = ppt->x;
	    ppt++;
	    while (npt--)
	    {
		gx->aliney = ppt->y;
		gx->alinex = ppt->x;
		++ppt;
		GXDrawDone(gx,r);
	    }
	}
	else
	{
	    y = gx->apointy = ppt->y;
	    x = gx->apointx = ppt->x;
	    ppt++;
	    while (npt--)
	    {
		y += gx->rliney = ppt->y;
		x += gx->rlinex = ppt->x;
		++ppt;
		GXDrawDone(gx,r);
	    }
	}
	if (capNotLast)
	{
	    sunGXGetAddrRange (pDrawable, extents, baseAddr, loAddr, hiAddr);
	    x += ppt->x;
	    y += ppt->y;
	    saveAddr = baseAddr + WIDTH_MUL(y) + x;
	    if (saveAddr < loAddr || hiAddr < saveAddr)
		saveAddr = 0;
	    else
		save = *saveAddr;
	    gx->aliney = y;
	    gx->alinex = x;
	    GXDrawDone(gx,r);
	    GXWait(gx,r);
	    if (saveAddr)
		*saveAddr = save;
	}
	else
	{
	    GXWait(gx,r);
	}
    }
    GXResetOff (gx);
    GXResetClip (gx, pDrawable->pScreen);
}

void
sunGXPolyFillRect1Rect(DrawablePtr pDrawable, GCPtr pGC, int nrect, xRectangle *prect)
{
    sunGXPtr	    gx = sunGXGetScreenPrivate (pDrawable->pScreen);
    sunGXPrivGCPtr  gxPriv = sunGXGetGCPrivate (pGC);
    BoxPtr	    extents = &pGC->pCompositeClip->extents;
    int		    r;
    int		    x, y;

    GXDrawInit(gx,pGC->fgPixel,gx_solid_rop_table[pGC->alu]|POLY_N,pGC->planemask);
    if (gxPriv->stipple)
	GXStippleInit(gx,gxPriv->stipple);
    GXSetOff (gx, pDrawable->x, pDrawable->y);
    GXSetClip (gx, extents);
    while (nrect--)
    {
	gx->arecty = y = prect->y;
	gx->arectx = x = prect->x;
	gx->arecty = y + (int) prect->height;
	gx->arectx = x + (int) prect->width;
	prect++;
	GXDrawDone (gx, r);
    }
    GXWait (gx, r);
    GXResetOff (gx);
    GXResetClip (gx, pDrawable->pScreen);
}

static void
sunGXPolyGlyphBlt(
    DrawablePtr	    pDrawable,
    GCPtr	    pGC,
    int		    x,
    int		    y,
    unsigned int    nglyph,
    CharInfoPtr	    *ppci,		/* array of character info */
    void            *pglyphBase
)
{
    sunGXPtr	    gx = sunGXGetScreenPrivate (pDrawable->pScreen);
    int		    h;
    int		    w;
    CharInfoPtr	    pci;
    unsigned int    *bits;
    register int    r;
    RegionPtr	    clip;
    BoxPtr	    extents;
    BoxRec	    box;

    clip = pGC->pCompositeClip;
    extents = &clip->extents;

    if (REGION_NUM_RECTS(clip) == 1)
    {
	GXSetClip (gx, extents);
    }
    else
    {
    	/* compute an approximate (but covering) bounding box */
    	box.x1 = 0;
    	if ((ppci[0]->metrics.leftSideBearing < 0))
	    box.x1 = ppci[0]->metrics.leftSideBearing;
    	h = nglyph - 1;
    	w = ppci[h]->metrics.rightSideBearing;
    	while (--h >= 0)
	    w += ppci[h]->metrics.characterWidth;
    	box.x2 = w;
    	box.y1 = -FONTMAXBOUNDS(pGC->font,ascent);
    	box.y2 = FONTMAXBOUNDS(pGC->font,descent);

    	box.x1 += pDrawable->x + x;
    	box.x2 += pDrawable->x + x;
    	box.y1 += pDrawable->y + y;
    	box.y2 += pDrawable->y + y;

    	switch (RECT_IN_REGION(pGC->pScreen, clip, &box))
	{
	case rgnPART:
	    cfbPolyGlyphBlt8 (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
	case rgnOUT:
	    return;
	}
    }

    GXDrawInit (gx, pGC->fgPixel,
		gx_stipple_rop_table[pGC->alu]|GX_PATTERN_ONES|POLY_N,
 		pGC->planemask);
    gx->mode = GX_BLIT_NOSRC | GX_MODE_COLOR1;
    x += pDrawable->x;
    y += pDrawable->y;

    while (nglyph--)
    {
	pci = *ppci++;
	gx->incx = 0;
	gx->incy = 1;
	gx->x0 = x + pci->metrics.leftSideBearing;
	gx->x1 = (x + pci->metrics.rightSideBearing) - 1;
	gx->y0 = y - pci->metrics.ascent;
	h = pci->metrics.ascent + pci->metrics.descent;
	bits = (unsigned int *) pci->bits;
	while (h--) {
	    gx->font = *bits++;
	}
	x += pci->metrics.characterWidth;
    }
    GXWait (gx, r);
    gx->mode = GX_BLIT_SRC | GX_MODE_COLOR8;
    GXResetClip (gx, pDrawable->pScreen);
}

static void
sunGXTEGlyphBlt(
    DrawablePtr	pDrawable,
    GCPtr	pGC,
    int 	x,
    int 	y,
    unsigned int nglyph,
    CharInfoPtr *ppci,		/* array of character info */
    void	*pglyphBase	/* start of array of glyphs */
)
{
    sunGXPtr	    gx = sunGXGetScreenPrivate (pDrawable->pScreen);
    int		    h, hTmp;
    FontPtr	    pfont = pGC->font;
    register int    r;
    unsigned int   *char1, *char2, *char3, *char4;
    int		    widthGlyphs, widthGlyph;
    BoxRec	    bbox;
    BoxPtr	    extents;
    RegionPtr	    clip;
    unsigned long   rop;

    widthGlyph = FONTMAXBOUNDS(pfont,characterWidth);
    h = FONTASCENT(pfont) + FONTDESCENT(pfont);
    clip = pGC->pCompositeClip;
    extents = &clip->extents;

    if (REGION_NUM_RECTS(clip) == 1)
    {
	GXSetClip (gx, extents);
    }
    else
    {
    	bbox.x1 = x + pDrawable->x;
    	bbox.x2 = bbox.x1 + (widthGlyph * nglyph);
    	bbox.y1 = y + pDrawable->y - FONTASCENT(pfont);
    	bbox.y2 = bbox.y1 + h;

    	switch (RECT_IN_REGION(pGC->pScreen, clip, &bbox))
    	{
	case rgnPART:
	    if (pglyphBase)
		cfbPolyGlyphBlt8(pDrawable, pGC, x, y, nglyph, ppci, NULL);
	    else
		miImageGlyphBlt(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
	case rgnOUT:
	    return;
    	}
    }

    rop = gx_opaque_stipple_rop_table[GXcopy] | GX_PATTERN_ONES;
    if (pglyphBase)
	rop = gx_stipple_rop_table[pGC->alu] | GX_PATTERN_ONES;
    GXDrawInit (gx, pGC->fgPixel, rop, pGC->planemask);
    gx->bg = pGC->bgPixel;
    gx->mode = GX_BLIT_NOSRC | GX_MODE_COLOR1;

    y = y + pDrawable->y - FONTASCENT(pfont);
    x += pDrawable->x;

#define LoopIt(count, w, loadup, fetch) \
    	while (nglyph >= count) \
    	{ \
	    nglyph -= count; \
	    gx->incx = 0; \
	    gx->incy = 1; \
	    gx->x0 = x; \
	    gx->x1 = (x += w) - 1; \
	    gx->y0 = y; \
	    loadup \
	    hTmp = h; \
	    while (hTmp--) \
	    	gx->font = fetch; \
    	}

    if (widthGlyph <= 8)
    {
	widthGlyphs = widthGlyph << 2;
	LoopIt(4, widthGlyphs,
	    char1 = (unsigned int *) (*ppci++)->bits;
	    char2 = (unsigned int *) (*ppci++)->bits;
	    char3 = (unsigned int *) (*ppci++)->bits;
	    char4 = (unsigned int *) (*ppci++)->bits;,
	    (*char1++ | ((*char2++ | ((*char3++ | (*char4++
		    >> widthGlyph))
		    >> widthGlyph))
		    >> widthGlyph)))
    }
    else if (widthGlyph <= 10)
    {
	widthGlyphs = (widthGlyph << 1) + widthGlyph;
	LoopIt(3, widthGlyphs,
	    char1 = (unsigned int *) (*ppci++)->bits;
	    char2 = (unsigned int *) (*ppci++)->bits;
	    char3 = (unsigned int *) (*ppci++)->bits;,
	    (*char1++ | ((*char2++ | (*char3++ >> widthGlyph)) >> widthGlyph)))
    }
    else if (widthGlyph <= 16)
    {
	widthGlyphs = widthGlyph << 1;
	LoopIt(2, widthGlyphs,
	    char1 = (unsigned int *) (*ppci++)->bits;
	    char2 = (unsigned int *) (*ppci++)->bits;,
	    (*char1++ | (*char2++ >> widthGlyph)))
    }
    while (nglyph--) {
	gx->incx = 0;
	gx->incy = 1;
	gx->x0 = x;
	gx->x1 = (x += widthGlyph) - 1;
	gx->y0 = y;
	char1 = (unsigned int *) (*ppci++)->bits;
	hTmp = h;
	while (hTmp--)
	    gx->font = *char1++;
    }
    gx->incx = 0;
    gx->incy = 0;
    GXWait (gx, r);
    gx->mode = GX_BLIT_SRC | GX_MODE_COLOR8;
    GXResetClip (gx, pDrawable->pScreen);
}

static void
sunGXPolyTEGlyphBlt(
    DrawablePtr	pDrawable,
    GCPtr	pGC,
    int 	x,
    int 	y,
    unsigned int nglyph,
    CharInfoPtr *ppci,		/* array of character info */
    void	*pglyphBase	/* start of array of glyphs */
)
{
    sunGXTEGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, (char *) 1);
}

static void
sunGXFillBoxSolid(DrawablePtr pDrawable, int nBox, BoxPtr pBox, unsigned long pixel)
{
    register sunGXPtr	gx = sunGXGetScreenPrivate (pDrawable->pScreen);
    register int	r;

    GXDrawInit(gx,pixel,gx_solid_rop_table[GXcopy]|POLY_N,~0);
    while (nBox--) {
	gx->arecty = pBox->y1;
	gx->arectx = pBox->x1;
	gx->arecty = pBox->y2;
	gx->arectx = pBox->x2;
	pBox++;
	GXDrawDone(gx,r);
    }
    GXWait(gx,r);
}

void
sunGXFillBoxStipple(DrawablePtr pDrawable, int nBox, BoxPtr pBox, sunGXStipplePtr stipple)
{
    register sunGXPtr	gx = sunGXGetScreenPrivate (pDrawable->pScreen);
    register int	r;
    int			patx, paty;

    patx = 16 - (pDrawable->x & 0xf);
    paty = 16 - (pDrawable->y & 0xf);
    stipple->patalign = (patx <<  16) | paty;
    GXDrawInit(gx,0,gx_solid_rop_table[GXcopy]|POLY_N,~0);
    GXStippleInit(gx, stipple);
    while (nBox--) {
	gx->arecty = pBox->y1;
	gx->arectx = pBox->x1;
	gx->arecty = pBox->y2;
	gx->arectx = pBox->x2;
	pBox++;
	GXDrawDone(gx,r);
    }
    GXWait(gx,r);
}

Bool
sunGXCheckTile(PixmapPtr pPixmap, sunGXStipplePtr stipple)
{
    unsigned short  *sbits;
    unsigned int    fg = (unsigned int)~0, bg = (unsigned int)~0;
    unsigned char   *tilebitsLine, *tilebits, tilebit;
    unsigned short  sbit, mask;
    int		    nbwidth;
    int		    h, w;
    int		    x, y;
    int		    s_y, s_x;

    h = pPixmap->drawable.height;
    if (h > 16 || (h & (h - 1)))
	return FALSE;
    w = pPixmap->drawable.width;
    if (w > 16 || (w & (w - 1)))
	return FALSE;
    sbits = (unsigned short *) stipple->bits;
    tilebitsLine = (unsigned char *) pPixmap->devPrivate.ptr;
    nbwidth = pPixmap->devKind;
    for (y = 0; y < h; y++) {
	tilebits = tilebitsLine;
	tilebitsLine += nbwidth;
	sbit = 0;
	mask = 1 << 15;
	for (x = 0; x < w; x++)
	{
	    tilebit = *tilebits++;
	    if (tilebit == fg)
		sbit |=  mask;
	    else if (tilebit != bg)
	    {
		if (fg == ~0)
		{
		    fg = tilebit;
		    sbit |= mask;
		}
		else if (bg == ~0)
		{
		    bg = tilebit;
		}
		else
		{
		    return FALSE;
		}
	    }
	    mask >>= 1;
	}
	for (s_x = w; s_x < 16; s_x <<= 1)
	    sbit = sbit | (sbit >> s_x);
	for (s_y = y; s_y < 16; s_y += h)
	    sbits[s_y] = sbit;
    }
    stipple->fore = fg;
    stipple->back = bg;
    return TRUE;
}

Bool
sunGXCheckStipple(PixmapPtr pPixmap, sunGXStipplePtr stipple)
{
    unsigned short  *sbits;
    unsigned int   *stippleBits;
    unsigned long   sbit, mask;
    int		    h, w;
    int		    y;
    int		    s_y, s_x;

    h = pPixmap->drawable.height;
    if (h > 16 || (h & (h - 1)))
	return FALSE;
    w = pPixmap->drawable.width;
    if (w > 16 || (w & (w - 1)))
	return FALSE;
    sbits = (unsigned short *) stipple->bits;
    stippleBits = (unsigned int *) pPixmap->devPrivate.ptr;
    mask = ((1 << w) - 1) << (16 - w);
    for (y = 0; y < h; y++) {
	sbit = (*stippleBits++ >> 16) & mask;
	for (s_x = w; s_x < 16; s_x <<= 1)
	    sbit = sbit | (sbit >> s_x);
	for (s_y = y; s_y < 16; s_y += h)
	    sbits[s_y] = sbit;
    }
    return TRUE;
}

/* cache one stipple; figuring out if we can use the stipple is as hard as
 * computing it, so we just use this one and leave it here if it
 * can't be used this time
 */

static  sunGXStipplePtr tmpStipple;

Bool
sunGXCheckFill(GCPtr pGC, DrawablePtr pDrawable)
{
    sunGXPrivGCPtr	    gxPriv = sunGXGetGCPrivate (pGC);
    sunGXStipplePtr	    stipple;
    Uint		    alu;
    int			    xrot, yrot;

    if (pGC->fillStyle == FillSolid)
    {
	if (gxPriv->stipple)
	{
	    free (gxPriv->stipple);
	    gxPriv->stipple = 0;
	}
	return TRUE;
    }
    if (!(stipple = gxPriv->stipple))
    {
	if (!tmpStipple)
	{
	    tmpStipple = malloc (sizeof *tmpStipple);
	    if (!tmpStipple)
		return FALSE;
	}
	stipple = tmpStipple;
    }
    alu =  gx_opaque_stipple_rop_table[pGC->alu]|GX_PATTERN_MASK;
    switch (pGC->fillStyle) {
    case FillTiled:
	if (!sunGXCheckTile (pGC->tile.pixmap, stipple))
	{
	    if (gxPriv->stipple)
	    {
		xfree (gxPriv->stipple);
		gxPriv->stipple = 0;
	    }
	    return FALSE;
	}
	break;
    case FillStippled:
	alu = gx_stipple_rop_table[pGC->alu]|GX_PATTERN_MASK;
    case FillOpaqueStippled:
	if (!sunGXCheckStipple (pGC->stipple, stipple))
	{
	    if (gxPriv->stipple)
	    {
	    	xfree (gxPriv->stipple);
	    	gxPriv->stipple = 0;
	    }
	    return FALSE;
	}
	stipple->fore = pGC->fgPixel;
	stipple->back = pGC->bgPixel;
	break;
    }
    xrot = (pGC->patOrg.x + pDrawable->x) & 0xf;
    yrot = (pGC->patOrg.y + pDrawable->y) & 0xf;
/*
    stipple->patalign = ((16 - (xrot & 0xf)) << 16) | (16 - (yrot & 0xf));
*/
    xrot = 16 - xrot;
    yrot = 16 - yrot;
    stipple->patalign = (xrot << 16) | yrot;
    stipple->alu = alu;
    gxPriv->stipple = stipple;
    if (stipple == tmpStipple)
	tmpStipple = 0;
    return TRUE;
}

void sunGXValidateGC(GCPtr, Mask, DrawablePtr);
void sunGXDestroyGC(GCPtr);

GCFuncs	sunGXGCFuncs = {
    sunGXValidateGC,
    miChangeGC,
    miCopyGC,
    sunGXDestroyGC,
    miChangeClip,
    miDestroyClip,
    miCopyClip
};

GCOps	sunGXTEOps1Rect = {
    sunGXFillSpans,
    cfbSetSpans,
    cfbPutImage,
    sunGXCopyArea,
    sunGXCopyPlane,
    cfbPolyPoint,
    sunGXPolylines1Rect,
    sunGXPolySeg1Rect,
    miPolyRectangle,
    cfbZeroPolyArcSS8Copy,
    sunGXFillPoly1Rect,
    sunGXPolyFillRect1Rect,
    sunGXPolyFillArc,
    miPolyText8,
    miPolyText16,
    miImageText8,
    miImageText16,
    sunGXTEGlyphBlt,
    sunGXPolyTEGlyphBlt,
    cfbPushPixels8
#ifdef NEED_LINEHELPER
    ,NULL
#endif
};

GCOps	sunGXTEOps = {
    sunGXFillSpans,
    cfbSetSpans,
    cfbPutImage,
    sunGXCopyArea,
    sunGXCopyPlane,
    cfbPolyPoint,
    cfbLineSS,
    cfbSegmentSS,
    miPolyRectangle,
    cfbZeroPolyArcSS8Copy,
    miFillPolygon,
    sunGXPolyFillRect,
    sunGXPolyFillArc,
    miPolyText8,
    miPolyText16,
    miImageText8,
    miImageText16,
    sunGXTEGlyphBlt,
    sunGXPolyTEGlyphBlt,
    cfbPushPixels8
#ifdef NEED_LINEHELPER
    ,NULL
#endif
};

GCOps	sunGXNonTEOps1Rect = {
    sunGXFillSpans,
    cfbSetSpans,
    cfbPutImage,
    sunGXCopyArea,
    sunGXCopyPlane,
    cfbPolyPoint,
    sunGXPolylines1Rect,
    sunGXPolySeg1Rect,
    miPolyRectangle,
    cfbZeroPolyArcSS8Copy,
    sunGXFillPoly1Rect,
    sunGXPolyFillRect1Rect,
    sunGXPolyFillArc,
    miPolyText8,
    miPolyText16,
    miImageText8,
    miImageText16,
    miImageGlyphBlt,
    sunGXPolyGlyphBlt,
    cfbPushPixels8
#ifdef NEED_LINEHELPER
    ,NULL
#endif
};

GCOps	sunGXNonTEOps = {
    sunGXFillSpans,
    cfbSetSpans,
    cfbPutImage,
    sunGXCopyArea,
    sunGXCopyPlane,
    cfbPolyPoint,
    cfbLineSS,
    cfbSegmentSS,
    miPolyRectangle,
    cfbZeroPolyArcSS8Copy,
    miFillPolygon,
    sunGXPolyFillRect,
    sunGXPolyFillArc,
    miPolyText8,
    miPolyText16,
    miImageText8,
    miImageText16,
    miImageGlyphBlt,
    sunGXPolyGlyphBlt,
    cfbPushPixels8
#ifdef NEED_LINEHELPER
    ,NULL
#endif
};

#define FONTWIDTH(font)	(FONTMAXBOUNDS(font,rightSideBearing) - \
			 FONTMINBOUNDS(font,leftSideBearing))

GCOps *
sunGXMatchCommon(GCPtr pGC, cfbPrivGCPtr devPriv)
{
    if (pGC->lineWidth != 0)
	return 0;
    if (pGC->lineStyle != LineSolid)
	return 0;
    if (pGC->fillStyle != FillSolid)
	return 0;
    if (devPriv->rop != GXcopy)
	return 0;
    if (!WID_OK(pGC->pScreen))
	return 0;
    if (pGC->font &&
        FONTWIDTH (pGC->font) <= 32 &&
	FONTMINBOUNDS(pGC->font,characterWidth) >= 0)
    {
	if (TERMINALFONT(pGC->font))
	    if (devPriv->oneRect)
		return &sunGXTEOps1Rect;
	    else
		return &sunGXTEOps;
	else
	    if (devPriv->oneRect)
		return &sunGXNonTEOps1Rect;
	    else
		return &sunGXNonTEOps;
    }
    return 0;
}

void
sunGXValidateGC(GCPtr pGC, Mask changes, DrawablePtr pDrawable)
{
    int         mask;		/* stateChanges */
    int         index;		/* used for stepping through bitfields */
    int		new_rrop;
    int         new_line, new_text, new_fillspans, new_fillarea;
    int		new_rotate;
    int		xrot, yrot;
    /* flags for changing the proc vector */
    cfbPrivGCPtr devPriv;
    sunGXPrivGCPtr  gxPriv;
    int		oneRect;
    int		canGX;
    int		widOK;

    gxPriv = sunGXGetGCPrivate (pGC);
    widOK = WID_OK(pGC->pScreen);
    if (pDrawable->type != DRAWABLE_WINDOW)
    {
	if (gxPriv->type == DRAWABLE_WINDOW)
	{
	    extern GCOps    cfbNonTEOps;

	    miDestroyGCOps (pGC->ops);
	    pGC->ops = &cfbNonTEOps;
	    changes = (1 << (GCLastBit + 1)) - 1;
	    pGC->stateChanges = changes;
	    gxPriv->type = pDrawable->type;
	}
	cfbValidateGC (pGC, changes, pDrawable);
	return;
    }
    if (gxPriv->type != DRAWABLE_WINDOW)
    {
	changes = (1 << (GCLastBit + 1)) - 1;
	gxPriv->type = DRAWABLE_WINDOW;
    }

    new_rotate = pGC->lastWinOrg.x != pDrawable->x ||
		 pGC->lastWinOrg.y != pDrawable->y;

    pGC->lastWinOrg.x = pDrawable->x;
    pGC->lastWinOrg.y = pDrawable->y;

    devPriv = ((cfbPrivGCPtr) (pGC->devPrivates[cfbGCPrivateIndex].ptr));

    new_rrop = FALSE;
    new_line = FALSE;
    new_text = FALSE;
    new_fillspans = FALSE;
    new_fillarea = FALSE;

    /*
     * if the client clip is different or moved OR the subwindowMode has
     * changed OR the window's clip has changed since the last validation
     * we need to recompute the composite clip
     */

    if ((changes & (GCClipXOrigin|GCClipYOrigin|GCClipMask|GCSubwindowMode)) ||
	(pDrawable->serialNumber != (pGC->serialNumber & DRAWABLE_SERIAL_BITS))
	)
    {
	miComputeCompositeClip(pGC, pDrawable);
	oneRect = REGION_NUM_RECTS(pGC->pCompositeClip) == 1;
	if (oneRect != devPriv->oneRect)
	{
	    new_line = TRUE;
	    new_fillarea = TRUE;
	    devPriv->oneRect = oneRect;
	}
    }

    mask = changes;
    while (mask) {
	index = lowbit (mask);
	mask &= ~index;

	/*
	 * this switch acculmulates a list of which procedures might have
	 * to change due to changes in the GC.  in some cases (e.g.
	 * changing one 16 bit tile for another) we might not really need
	 * a change, but the code is being paranoid. this sort of batching
	 * wins if, for example, the alu and the font have been changed,
	 * or any other pair of items that both change the same thing.
	 */
	switch (index) {
	case GCFunction:
	case GCForeground:
	    new_rrop = TRUE;
	    break;
	case GCPlaneMask:
	    new_rrop = TRUE;
	    new_text = TRUE;
	    break;
	case GCBackground:
	    break;
	case GCLineStyle:
	case GCLineWidth:
	    new_line = TRUE;
	    break;
	case GCCapStyle:
	    break;
	case GCJoinStyle:
	    break;
	case GCFillStyle:
	    new_text = TRUE;
	    new_fillspans = TRUE;
	    new_line = TRUE;
	    new_fillarea = TRUE;
	    break;
	case GCFillRule:
	    break;
	case GCTile:
	    new_fillspans = TRUE;
	    new_fillarea = TRUE;
	    break;

	case GCStipple:
	    new_fillspans = TRUE;
	    new_fillarea = TRUE;
	    break;

	case GCTileStipXOrigin:
	    new_rotate = TRUE;
	    break;

	case GCTileStipYOrigin:
	    new_rotate = TRUE;
	    break;

	case GCFont:
	    new_text = TRUE;
	    break;
	case GCSubwindowMode:
	    break;
	case GCGraphicsExposures:
	    break;
	case GCClipXOrigin:
	    break;
	case GCClipYOrigin:
	    break;
	case GCClipMask:
	    break;
	case GCDashOffset:
	    break;
	case GCDashList:
	    break;
	case GCArcMode:
	    break;
	default:
	    break;
	}
    }

    /*
     * If the drawable has changed,  check its depth & ensure suitable
     * entries are in the proc vector.
     */
    if (pDrawable->serialNumber != (pGC->serialNumber & (DRAWABLE_SERIAL_BITS))) {
	new_fillspans = TRUE;	/* deal with FillSpans later */
    }

    if ((new_rotate || new_fillspans))
    {
	Bool new_pix = FALSE;
	xrot = pGC->patOrg.x + pDrawable->x;
	yrot = pGC->patOrg.y + pDrawable->y;

	if (!sunGXCheckFill (pGC, pDrawable))
	{
	    switch (pGC->fillStyle)
	    {
	    case FillTiled:
	    	if (!pGC->tileIsPixel)
	    	{
		    int width = pGC->tile.pixmap->drawable.width * PSZ;

		    if ((width <= 32) && !(width & (width - 1)))
		    {
		    	cfbCopyRotatePixmap(pGC->tile.pixmap,
					    &pGC->pRotatedPixmap,
					    xrot, yrot);
		    	new_pix = TRUE;
		    }
	    	}
	    	break;
	    case FillStippled:
	    case FillOpaqueStippled:
	    	{
		    int width = pGC->stipple->drawable.width;

		    if ((width <= 32) && !(width & (width - 1)))
		    {
		    	mfbCopyRotatePixmap(pGC->stipple,
					    &pGC->pRotatedPixmap, xrot, yrot);
		    	new_pix = TRUE;
		    }
	    	}
	    	break;
	    }
	}
	if (!new_pix && pGC->pRotatedPixmap)
	{
	    cfbDestroyPixmap(pGC->pRotatedPixmap);
	    pGC->pRotatedPixmap = NULL;
	}
    }

    if (new_rrop)
    {
	int old_rrop;

	if (gxPriv->stipple)
	{
	    if (pGC->fillStyle == FillStippled)
		gxPriv->stipple->alu = gx_stipple_rop_table[pGC->alu]|GX_PATTERN_MASK;
	    else
		gxPriv->stipple->alu = gx_opaque_stipple_rop_table[pGC->alu]|GX_PATTERN_MASK;
	    if (pGC->fillStyle != FillTiled)
	    {
		gxPriv->stipple->fore = pGC->fgPixel;
		gxPriv->stipple->back = pGC->bgPixel;
	    }
	}
	old_rrop = devPriv->rop;
	devPriv->rop = cfbReduceRasterOp (pGC->alu, pGC->fgPixel,
					   pGC->planemask,
					   &devPriv->and, &devPriv->xor);
	if (old_rrop == devPriv->rop)
	    new_rrop = FALSE;
	else
	{
	    new_line = TRUE;
	    new_text = TRUE;
	    new_fillspans = TRUE;
	    new_fillarea = TRUE;
	}
    }

    if (new_rrop || new_fillspans || new_text || new_fillarea || new_line)
    {
	GCOps	*newops;

	if ((newops = sunGXMatchCommon (pGC, devPriv)))
 	{
	    if (pGC->ops->devPrivate.val)
		miDestroyGCOps (pGC->ops);
	    pGC->ops = newops;
	    new_rrop = new_line = new_fillspans = new_text = new_fillarea = 0;
	}
 	else
 	{
	    if (!pGC->ops->devPrivate.val)
	    {
		pGC->ops = miCreateGCOps (pGC->ops);
		pGC->ops->devPrivate.val = 1;
	    }
	}
    }

    canGX = pGC->fillStyle == FillSolid || gxPriv->stipple;

    /* deal with the changes we've collected */
    if (new_line)
    {
	pGC->ops->FillPolygon = miFillPolygon;
	if (devPriv->oneRect && canGX)
	    pGC->ops->FillPolygon = sunGXFillPoly1Rect;
	if (pGC->lineWidth == 0)
	{
	    if ((pGC->lineStyle == LineSolid) && (pGC->fillStyle == FillSolid))
	    {
		switch (devPriv->rop)
		{
		case GXxor:
		    pGC->ops->PolyArc = cfbZeroPolyArcSS8Xor;
		    break;
		case GXcopy:
		    pGC->ops->PolyArc = cfbZeroPolyArcSS8Copy;
		    break;
		default:
		    pGC->ops->PolyArc = cfbZeroPolyArcSS8General;
		    break;
		}
	    }
	    else
		pGC->ops->PolyArc = miZeroPolyArc;
	}
	else
	    pGC->ops->PolyArc = miPolyArc;
	pGC->ops->PolySegment = miPolySegment;
	switch (pGC->lineStyle)
	{
	case LineSolid:
	    if(pGC->lineWidth == 0)
	    {
		if (devPriv->oneRect && canGX && widOK)
		{
		    pGC->ops->PolySegment = sunGXPolySeg1Rect;
		    pGC->ops->Polylines = sunGXPolylines1Rect;
		}
		else if (pGC->fillStyle == FillSolid)
		{
		    if (devPriv->oneRect)
		    {
			pGC->ops->Polylines = cfb8LineSS1Rect;
			pGC->ops->PolySegment = cfb8SegmentSS1Rect;
		    }
		    else
		    {
		    	pGC->ops->Polylines = cfbLineSS;
		    	pGC->ops->PolySegment = cfbSegmentSS;
		    }
		}
		else
		    pGC->ops->Polylines = miZeroLine;
	    }
	    else
		pGC->ops->Polylines = miWideLine;
	    break;
	case LineOnOffDash:
	case LineDoubleDash:
	    if (pGC->lineWidth == 0 && pGC->fillStyle == FillSolid)
	    {
		pGC->ops->Polylines = cfbLineSD;
		pGC->ops->PolySegment = cfbSegmentSD;
	    } else
		pGC->ops->Polylines = miWideDash;
	    break;
	}
    }

    if (new_text && (pGC->font))
    {
        if (FONTWIDTH(pGC->font) > 32 ||
	    FONTMINBOUNDS(pGC->font,characterWidth) < 0)
        {
            pGC->ops->PolyGlyphBlt = miPolyGlyphBlt;
            pGC->ops->ImageGlyphBlt = miImageGlyphBlt;
        }
        else
        {
	    if (pGC->fillStyle == FillSolid)
	    {
		if (TERMINALFONT (pGC->font))
		    pGC->ops->PolyGlyphBlt = sunGXPolyTEGlyphBlt;
		else
		    pGC->ops->PolyGlyphBlt = sunGXPolyGlyphBlt;
	    }
	    else
		pGC->ops->PolyGlyphBlt = miPolyGlyphBlt;
            /* special case ImageGlyphBlt for terminal emulator fonts */
            if (TERMINALFONT(pGC->font))
		pGC->ops->ImageGlyphBlt = sunGXTEGlyphBlt;
            else
                pGC->ops->ImageGlyphBlt = miImageGlyphBlt;
        }
    }


    if (new_fillspans) {
	if (canGX)
	    pGC->ops->FillSpans = sunGXFillSpans;
	else switch (pGC->fillStyle) {
	case FillTiled:
	    if (pGC->pRotatedPixmap)
	    {
		if (pGC->alu == GXcopy && (pGC->planemask & PMSK) == PMSK)
		    pGC->ops->FillSpans = cfbTile32FSCopy;
		else
		    pGC->ops->FillSpans = cfbTile32FSGeneral;
	    }
	    else
		pGC->ops->FillSpans = cfbUnnaturalTileFS;
	    break;
	case FillStippled:
	    if (pGC->pRotatedPixmap)
		pGC->ops->FillSpans = cfb8Stipple32FS;
	    else
		pGC->ops->FillSpans = cfbUnnaturalStippleFS;
	    break;
	case FillOpaqueStippled:
	    if (pGC->pRotatedPixmap)
		pGC->ops->FillSpans = cfb8OpaqueStipple32FS;
	    else
		pGC->ops->FillSpans = cfbUnnaturalStippleFS;
	    break;
	default:
	    FatalError("cfbValidateGC: illegal fillStyle\n");
	}
    } /* end of new_fillspans */

    if (new_fillarea) {
	pGC->ops->PolyFillRect = cfbPolyFillRect;
	pGC->ops->PolyFillArc = miPolyFillArc;
	if (canGX)
	{
	    pGC->ops->PolyFillArc = sunGXPolyFillArc;
	    pGC->ops->PolyFillRect = sunGXPolyFillRect;
	    if (devPriv->oneRect)
		pGC->ops->PolyFillRect = sunGXPolyFillRect1Rect;
	}
	pGC->ops->PushPixels = mfbPushPixels;
	if (pGC->fillStyle == FillSolid && devPriv->rop == GXcopy)
	    pGC->ops->PushPixels = cfbPushPixels8;
    }
}

void
sunGXDestroyGC(GCPtr pGC)
{
    sunGXPrivGCPtr	    gxPriv = sunGXGetGCPrivate (pGC);

    if (gxPriv->stipple)
	xfree (gxPriv->stipple);
    miDestroyGC (pGC);
}

Bool
sunGXCreateGC(GCPtr pGC)
{
    sunGXPrivGCPtr  gxPriv;
    if (pGC->depth == 1)
	return mfbCreateGC (pGC);
    if (!cfbCreateGC (pGC))
	return FALSE;
    pGC->ops = &sunGXNonTEOps;
    pGC->funcs = &sunGXGCFuncs;
    gxPriv = sunGXGetGCPrivate(pGC);
    gxPriv->type = DRAWABLE_WINDOW;
    gxPriv->stipple = 0;
    return TRUE;
}

Bool
sunGXCreateWindow(WindowPtr pWin)
{
    if (!cfbCreateWindow (pWin))
	return FALSE;
    pWin->devPrivates[sunGXWindowPrivateIndex].ptr = 0;
    return TRUE;
}

Bool
sunGXDestroyWindow(WindowPtr pWin)
{
    sunGXStipplePtr stipple = sunGXGetWindowPrivate(pWin);
    xfree (stipple);
    return cfbDestroyWindow (pWin);
}

Bool
sunGXChangeWindowAttributes(WindowPtr pWin, Mask mask)
{
    sunGXStipplePtr stipple;
    Mask	    index;
    WindowPtr	pBgWin;
    register cfbPrivWin *pPrivWin;
    int		    width;

    pPrivWin = (cfbPrivWin *)(pWin->devPrivates[cfbWindowPrivateIndex].ptr);
    /*
     * When background state changes from ParentRelative and
     * we had previously rotated the fast border pixmap to match
     * the parent relative origin, rerotate to match window
     */
    if (mask & (CWBackPixmap | CWBackPixel) &&
	pWin->backgroundState != ParentRelative &&
	pPrivWin->fastBorder &&
	(pPrivWin->oldRotate.x != pWin->drawable.x ||
	 pPrivWin->oldRotate.y != pWin->drawable.y))
    {
	cfbXRotatePixmap(pPrivWin->pRotatedBorder,
		      pWin->drawable.x - pPrivWin->oldRotate.x);
	cfbYRotatePixmap(pPrivWin->pRotatedBorder,
		      pWin->drawable.y - pPrivWin->oldRotate.y);
	pPrivWin->oldRotate.x = pWin->drawable.x;
	pPrivWin->oldRotate.y = pWin->drawable.y;
    }
    while (mask)
    {
	index = lowbit(mask);
	mask &= ~index;
	switch (index)
	{
	case CWBackPixmap:
	    stipple = sunGXGetWindowPrivate(pWin);
	    if (pWin->backgroundState == None ||
		pWin->backgroundState == ParentRelative)
	    {
		pPrivWin->fastBackground = FALSE;
		if (stipple)
		{
		    xfree (stipple);
		    sunGXSetWindowPrivate(pWin,0);
		}
		/* Rotate border to match parent origin */
		if (pWin->backgroundState == ParentRelative &&
		    pPrivWin->pRotatedBorder)
		{
		    for (pBgWin = pWin->parent;
			 pBgWin->backgroundState == ParentRelative;
			 pBgWin = pBgWin->parent);
		    cfbXRotatePixmap(pPrivWin->pRotatedBorder,
				  pBgWin->drawable.x - pPrivWin->oldRotate.x);
		    cfbYRotatePixmap(pPrivWin->pRotatedBorder,
				  pBgWin->drawable.y - pPrivWin->oldRotate.y);
		}

		break;
	    }
	    if (!stipple)
	    {
		if (!tmpStipple)
		    tmpStipple = malloc (sizeof *tmpStipple);
		stipple = tmpStipple;
	    }
 	    if (stipple && sunGXCheckTile (pWin->background.pixmap, stipple))
	    {
		stipple->alu = gx_opaque_stipple_rop_table[GXcopy]|GX_PATTERN_MASK;
		pPrivWin->fastBackground = FALSE;
		if (stipple == tmpStipple)
		{
		    sunGXSetWindowPrivate(pWin, stipple);
		    tmpStipple = 0;
		}
		break;
	    }
	    if ((stipple = sunGXGetWindowPrivate(pWin)))
	    {
		xfree (stipple);
		sunGXSetWindowPrivate(pWin,0);
	    }
 	    if (((width = (pWin->background.pixmap->drawable.width * PSZ)) <= BITMAP_SCANLINE_UNIT) &&
		       !(width & (width - 1)))
	    {
		cfbCopyRotatePixmap(pWin->background.pixmap,
				  &pPrivWin->pRotatedBackground,
				  pWin->drawable.x,
				  pWin->drawable.y);
		if (pPrivWin->pRotatedBackground)
		{
    	    	    pPrivWin->fastBackground = TRUE;
    	    	    pPrivWin->oldRotate.x = pWin->drawable.x;
    	    	    pPrivWin->oldRotate.y = pWin->drawable.y;
		}
		else
		{
		    pPrivWin->fastBackground = FALSE;
		}
		break;
	    }
	    pPrivWin->fastBackground = FALSE;
	    break;

	case CWBackPixel:
	    pPrivWin->fastBackground = FALSE;
	    break;

	case CWBorderPixmap:
	    /* don't bother with accelerator for border tiles (just lazy) */
	    if (((width = (pWin->border.pixmap->drawable.width * PSZ)) <= BITMAP_SCANLINE_UNIT) &&
		!(width & (width - 1)))
	    {
		for (pBgWin = pWin;
		     pBgWin->backgroundState == ParentRelative;
		     pBgWin = pBgWin->parent);
		cfbCopyRotatePixmap(pWin->border.pixmap,
				    &pPrivWin->pRotatedBorder,
				    pBgWin->drawable.x,
				    pBgWin->drawable.y);
		if (pPrivWin->pRotatedBorder)
		{
		    pPrivWin->fastBorder = TRUE;
		    pPrivWin->oldRotate.x = pBgWin->drawable.x;
		    pPrivWin->oldRotate.y = pBgWin->drawable.y;
		}
		else
		{
		    pPrivWin->fastBorder = TRUE;
		}
	    }
	    else
	    {
		pPrivWin->fastBorder = FALSE;
	    }
	    break;
	case CWBorderPixel:
	    pPrivWin->fastBorder = FALSE;
	    break;
	}
    }
    return (TRUE);
}

void
sunGXPaintWindow(WindowPtr pWin, RegionPtr pRegion, int what)
{
    register cfbPrivWin	*pPrivWin;
    sunGXStipplePtr stipple;
    WindowPtr	pBgWin;
    pPrivWin = (cfbPrivWin *)(pWin->devPrivates[cfbWindowPrivateIndex].ptr);

    switch (what) {
    case PW_BACKGROUND:
	stipple = sunGXGetWindowPrivate(pWin);
	switch (pWin->backgroundState) {
	case None:
	    return;
	case ParentRelative:
	    do {
		pWin = pWin->parent;
	    } while (pWin->backgroundState == ParentRelative);
	    (*pWin->drawable.pScreen->PaintWindowBackground)(pWin, pRegion,
							     what);
	    return;
	case BackgroundPixmap:
	    if (stipple)
	    {
		sunGXFillBoxStipple ((DrawablePtr)pWin,
				  (int)REGION_NUM_RECTS(pRegion),
				  REGION_RECTS(pRegion),
				  stipple);
	    }
	    else if (pPrivWin->fastBackground)
	    {
		cfbFillBoxTile32 ((DrawablePtr)pWin,
				  (int)REGION_NUM_RECTS(pRegion),
				  REGION_RECTS(pRegion),
				  pPrivWin->pRotatedBackground);
	    }
	    else
	    {
		cfbFillBoxTileOdd ((DrawablePtr)pWin,
				   (int)REGION_NUM_RECTS(pRegion),
				   REGION_RECTS(pRegion),
				   pWin->background.pixmap,
				   (int) pWin->drawable.x, (int) pWin->drawable.y);
	    }
	    return;
	case BackgroundPixel:
	    sunGXFillBoxSolid((DrawablePtr)pWin,
			     (int)REGION_NUM_RECTS(pRegion),
			     REGION_RECTS(pRegion),
			     pWin->background.pixel);
	    return;
    	}
    	break;
    case PW_BORDER:
	if (pWin->borderIsPixel)
	{
	    sunGXFillBoxSolid((DrawablePtr)pWin,
			     (int)REGION_NUM_RECTS(pRegion),
			     REGION_RECTS(pRegion),
			     pWin->border.pixel);
	    return;
	}
	else if (pPrivWin->fastBorder)
	{
	    cfbFillBoxTile32 ((DrawablePtr)pWin,
			      (int)REGION_NUM_RECTS(pRegion),
			      REGION_RECTS(pRegion),
			      pPrivWin->pRotatedBorder);
	    return;
	}
	else
	{
	    for (pBgWin = pWin;
		 pBgWin->backgroundState == ParentRelative;
		 pBgWin = pBgWin->parent);

	    cfbFillBoxTileOdd ((DrawablePtr)pWin,
			       (int)REGION_NUM_RECTS(pRegion),
			       REGION_RECTS(pRegion),
			       pWin->border.pixmap,
			       (int) pBgWin->drawable.x,
 			       (int) pBgWin->drawable.y);
	    return;
	}
	break;
    }
}

void
sunGXCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
{
    DDXPointPtr pptSrc;
    register DDXPointPtr ppt;
    RegionPtr prgnDst;
    register BoxPtr pbox;
    register int dx, dy;
    register int i, nbox;
    WindowPtr pwinRoot;
    extern WindowPtr *WindowTable;

    pwinRoot = WindowTable[pWin->drawable.pScreen->myNum];

    prgnDst = REGION_CREATE(pWin->drawable.pScreen, NULL, 1);

    dx = ptOldOrg.x - pWin->drawable.x;
    dy = ptOldOrg.y - pWin->drawable.y;
    REGION_TRANSLATE(pWin->drawable.pScreen, prgnSrc, -dx, -dy);
    REGION_INTERSECT(pWin->drawable.pScreen, prgnDst, &pWin->borderClip, prgnSrc);

    pbox = REGION_RECTS(prgnDst);
    nbox = REGION_NUM_RECTS(prgnDst);
    if(!(pptSrc = (DDXPointPtr )ALLOCATE_LOCAL(nbox * sizeof(DDXPointRec))))
	return;
    ppt = pptSrc;

    for (i = nbox; --i >= 0; ppt++, pbox++)
    {
	ppt->x = pbox->x1 + dx;
	ppt->y = pbox->y1 + dy;
    }

    sunGXDoBitblt ((DrawablePtr)pwinRoot, (DrawablePtr)pwinRoot,
		    GXcopy, prgnDst, pptSrc, ~0L);
    DEALLOCATE_LOCAL(pptSrc);
    REGION_DESTROY(pWin->drawable.pScreen, prgnDst);
}

Bool
sunGXInit(ScreenPtr pScreen, fbFd *fb)
{
    sunGXPtr	    gx;
    Uint	    mode;
    register long   r;

    if (serverGeneration != sunGXGeneration)
    {
	sunGXScreenPrivateIndex = AllocateScreenPrivateIndex();
	if (sunGXScreenPrivateIndex == -1)
	    return FALSE;
	sunGXGCPrivateIndex = AllocateGCPrivateIndex ();
	sunGXWindowPrivateIndex = AllocateWindowPrivateIndex ();
	sunGXGeneration = serverGeneration;
    }
    if (!AllocateGCPrivate(pScreen, sunGXGCPrivateIndex, sizeof (sunGXPrivGCRec)))
	return FALSE;
    if (!AllocateWindowPrivate(pScreen, sunGXWindowPrivateIndex, 0))
	return FALSE;
    gx = (sunGXPtr) fb->fb;
    mode = gx->mode;
    GXWait(gx,r);
    mode &= ~(	GX_BLIT_ALL |
		GX_MODE_ALL |
		GX_DRAW_ALL |
 		GX_BWRITE0_ALL |
		GX_BWRITE1_ALL |
 		GX_BREAD_ALL |
 		GX_BDISP_ALL);
    mode |=	GX_BLIT_SRC |
		GX_MODE_COLOR8 |
		GX_DRAW_RENDER |
		GX_BWRITE0_ENABLE |
		GX_BWRITE1_DISABLE |
		GX_BREAD_0 |
		GX_BDISP_0;
    gx->mode = mode;
    gx->clip = 0;
    gx->offx = 0;
    gx->offy = 0;
    gx->clipminx = 0;
    gx->clipminy = 0;
    gx->clipmaxx = fb->info.fb_width - 1;
    gx->clipmaxy = fb->info.fb_height - 1;
    pScreen->devPrivates[sunGXScreenPrivateIndex].ptr = (void *) gx;
    /*
     * Replace various screen functions
     */
    pScreen->CreateGC = sunGXCreateGC;
    pScreen->CreateWindow = sunGXCreateWindow;
    pScreen->ChangeWindowAttributes = sunGXChangeWindowAttributes;
    pScreen->DestroyWindow = sunGXDestroyWindow;
    pScreen->PaintWindowBackground = sunGXPaintWindow;
    pScreen->PaintWindowBorder = sunGXPaintWindow;
    pScreen->CopyWindow = sunGXCopyWindow;
    return TRUE;
}

File Added: xsrc/external/mit/xorg-server/dist/hw/sun/sunGX.h
/*
 * $Xorg: sunGX.h,v 1.4 2001/02/09 02:04:44 xorgcvs Exp $
 *
Copyright 1991, 1998  The Open Group

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.

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Except as contained in this notice, the name of The Open Group shall not be
used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from The Open Group.
 *
 * Author:  Keith Packard, MIT X Consortium
 */
/* $XFree86: xc/programs/Xserver/hw/sun/sunGX.h,v 1.4 2001/12/14 19:59:43 dawes Exp $ */

typedef unsigned int	Uint;
typedef volatile Uint VUint;

/* modes */
#define GX_INDEX(n)	    ((n) << 4)
#define GX_INDEX_ALL	    0x00000030
#define GX_INDEX_MOD	    0x00000040
#define GX_BDISP_0	    0x00000080
#define GX_BDISP_1	    0x00000100
#define GX_BDISP_ALL	    0x00000180
#define GX_BREAD_0	    0x00000200
#define GX_BREAD_1	    0x00000400
#define GX_BREAD_ALL	    0x00000600
#define GX_BWRITE1_ENABLE   0x00000800
#define GX_BWRITE1_DISABLE  0x00001000
#define GX_BWRITE1_ALL	    0x00001800
#define GX_BWRITE0_ENABLE   0x00002000
#define GX_BWRITE0_DISABLE  0x00004000
#define GX_BWRITE0_ALL	    0x00006000
#define GX_DRAW_RENDER	    0x00008000
#define GX_DRAW_PICK	    0x00010000
#define GX_DRAW_ALL	    0x00018000
#define GX_MODE_COLOR8	    0x00020000
#define GX_MODE_COLOR1	    0x00040000
#define GX_MODE_HRMONO	    0x00060000
#define GX_MODE_ALL	    0x00060000
#define GX_VBLANK	    0x00080000
#define GX_BLIT_NOSRC	    0x00100000
#define GX_BLIT_SRC	    0x00200000
#define GX_BLIT_ALL	    0x00300000

/* rasterops */
#define GX_ROP_CLEAR	    0x0
#define GX_ROP_INVERT	    0x1
#define GX_ROP_NOOP	    0x2
#define GX_ROP_SET	    0x3

#define GX_ROP_00_0(rop)    ((rop) << 0)
#define GX_ROP_00_1(rop)    ((rop) << 2)
#define GX_ROP_01_0(rop)    ((rop) << 4)
#define GX_ROP_01_1(rop)    ((rop) << 6)
#define GX_ROP_10_0(rop)    ((rop) << 8)
#define GX_ROP_10_1(rop)    ((rop) << 10)
#define GX_ROP_11_0(rop)    ((rop) << 12)
#define GX_ROP_11_1(rop)    ((rop) << 14)
#define GX_PLOT_PLOT	    0x00000000
#define GX_PLOT_UNPLOT	    0x00020000
#define GX_RAST_BOOL	    0x00000000
#define GX_RAST_LINEAR	    0x00040000
#define GX_ATTR_UNSUPP	    0x00400000
#define GX_ATTR_SUPP	    0x00800000
#define GX_POLYG_OVERLAP    0x01000000
#define GX_POLYG_NONOVERLAP 0x02000000
#define GX_PATTERN_ZEROS    0x04000000
#define GX_PATTERN_ONES	    0x08000000
#define GX_PATTERN_MASK	    0x0c000000
#define GX_PIXEL_ZEROS	    0x10000000
#define GX_PIXEL_ONES	    0x20000000
#define GX_PIXEL_MASK	    0x30000000
#define GX_PLANE_ZEROS	    0x40000000
#define GX_PLANE_ONES	    0x80000000
#define GX_PLANE_MASK	    0xc0000000

typedef struct _sunGX {
	Uint	junk0[1];
	VUint	mode;
	VUint	clip;
	Uint	junk1[1];
	VUint	s;
	VUint	draw;
	VUint	blit;
	VUint	font;
	Uint	junk2[24];
	VUint	x0, y0, z0, color0;
	VUint	x1, y1, z1, color1;
	VUint	x2, y2, z2, color2;
	VUint	x3, y3, z3, color3;
	VUint	offx, offy;
	Uint	junk3[2];
	VUint	incx, incy;
	Uint	junk4[2];
	VUint	clipminx, clipminy;
	Uint	junk5[2];
	VUint	clipmaxx, clipmaxy;
	Uint	junk6[2];
	VUint	fg;
	VUint	bg;
	VUint	alu;
	VUint	pm;
	VUint	pixelm;
	Uint	junk7[2];
	VUint	patalign;
	VUint	pattern[8];
	Uint	junk8[432];
	VUint	apointx, apointy, apointz;
	Uint	junk9[1];
	VUint	rpointx, rpointy, rpointz;
	Uint	junk10[5];
	VUint	pointr, pointg, pointb, pointa;
	VUint	alinex, aliney, alinez;
	Uint	junk11[1];
	VUint	rlinex, rliney, rlinez;
	Uint	junk12[5];
	VUint	liner, lineg, lineb, linea;
	VUint	atrix, atriy, atriz;
	Uint	junk13[1];
	VUint	rtrix, rtriy, rtriz;
	Uint	junk14[5];
	VUint	trir, trig, trib, tria;
	VUint	aquadx, aquady, aquadz;
	Uint	junk15[1];
	VUint	rquadx, rquady, rquadz;
	Uint	junk16[5];
	VUint	quadr, quadg, quadb, quada;
	VUint	arectx, arecty, arectz;
	Uint	junk17[1];
	VUint	rrectx, rrecty, rrectz;
	Uint	junk18[5];
	VUint	rectr, rectg, rectb, recta;
} sunGX, *sunGXPtr;

/* Macros */

#define GX_ROP_USE_PIXELMASK	0x30000000

#define GX_BLT_INPROGRESS	0x20000000

#define GX_INPROGRESS		0x10000000
#define GX_FULL			0x20000000

#define GXWait(gx,r)\
    do\
	(r) = (int) (gx)->s; \
    while ((r) & GX_INPROGRESS)

#define GXDrawDone(gx,r) \
    do \
	(r) = (int) (gx)->draw; \
    while ((r) < 0 && ((r) & GX_FULL))

#define GXBlitDone(gx,r)\
    do\
	(r)= (int) (gx)->blit; \
    while ((r) < 0 && ((r) & GX_BLT_INPROGRESS))

#define GXBlitInit(gx,rop,pmsk) {\
    gx->fg = 0xff;\
    gx->bg = 0x00;\
    gx->pixelm = ~0;\
    gx->s = 0;\
    gx->alu = rop;\
    gx->pm = pmsk;\
    gx->clip = 0;\
}

#define GXDrawInit(gx,fore,rop,pmsk) {\
    gx->fg = fore;\
    gx->bg = 0x00; \
    gx->pixelm = ~0; \
    gx->s = 0; \
    gx->alu = rop; \
    gx->pm = pmsk; \
    gx->clip = 0;\
}

#define GXStippleInit(gx,stipple) {\
    int		_i; \
    Uint	*sp; \
    VUint	*dp; \
    _i = 8;  \
    sp = stipple->bits; \
    dp = gx->pattern; \
    while (_i--) {  \
	dp[_i] =  sp[_i]; \
    } \
    gx->fg = stipple->fore; \
    gx->bg = stipple->back; \
    gx->patalign = stipple->patalign; \
    gx->alu = stipple->alu; \
}

extern int  sunGXScreenPrivateIndex;
extern int  sunGXGCPrivateIndex;
extern int  sunGXWindowPrivateIndex;

#define sunGXGetScreenPrivate(s)    ((sunGXPtr) \
			    (s)->devPrivates[sunGXScreenPrivateIndex].ptr)

typedef struct _sunGXStipple {
    Uint	fore, back;
    Uint	patalign;
    Uint	alu;
    Uint	bits[8];	/* actually 16 shorts */
} sunGXStippleRec, *sunGXStipplePtr;

typedef struct _sunGXPrivGC {
    int		    type;
    sunGXStipplePtr stipple;
} sunGXPrivGCRec, *sunGXPrivGCPtr;

#define sunGXGetGCPrivate(g)	    ((sunGXPrivGCPtr) \
			    (g)->devPrivates[sunGXGCPrivateIndex].ptr)

#define sunGXGetWindowPrivate(w)    ((sunGXStipplePtr) \
			    (w)->devPrivates[sunGXWindowPrivateIndex].ptr)

#define sunGXSetWindowPrivate(w,p) (\
	    (w)->devPrivates[sunGXWindowPrivateIndex].ptr = (pointer) p)


File Added: xsrc/external/mit/xorg-server/dist/hw/sun/sunMfb.c

/* $Xorg: sunMfb.c,v 1.4 2001/02/09 02:04:44 xorgcvs Exp $ */

/*
Copyright 1990, 1993, 1998  The Open Group

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.

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Except as contained in this notice, the name of The Open Group shall not be
used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from The Open Group.
 */
/* $XFree86: xc/programs/Xserver/hw/sun/sunMfb.c,v 3.4 2001/12/14 19:59:43 dawes Exp $ */

/************************************************************
Copyright 1987 by Sun Microsystems, Inc. Mountain View, CA.

                    All Rights Reserved

Permission  to  use,  copy,  modify,  and  distribute   this
software  and  its documentation for any purpose and without
fee is hereby granted, provided that the above copyright no-
tice  appear  in all copies and that both that copyright no-
tice and this permission notice appear in  supporting  docu-
mentation,  and  that the names of Sun or The Open Group
not be used in advertising or publicity pertaining to
distribution  of  the software  without specific prior
written permission. Sun and The Open Group make no
representations about the suitability of this software for
any purpose. It is provided "as is" without any express or
implied warranty.

SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
THE USE OR PERFORMANCE OF THIS SOFTWARE.

********************************************************/

/*
 * Copyright 1987 by the Regents of the University of California
 * Copyright 1987 by Adam de Boor, UC Berkeley
 *
 * Permission to use, copy, modify, and distribute this
 * software and its documentation for any purpose and without
 * fee is hereby granted, provided that the above copyright
 * notice appear in all copies.  The University of California
 * makes no representations about the suitability of this
 * software for any purpose.  It is provided "as is" without
 * express or implied warranty.
 */

/****************************************************************/
/* Modified from  sunCG4C.c for X11R3 by Tom Jarmolowski	*/
/****************************************************************/

/*
 * Copyright 1991, 1992, 1993 Kaleb S. Keithley
 *
 * Permission to use, copy, modify, and distribute this
 * software and its documentation for any purpose and without
 * fee is hereby granted, provided that the above copyright
 * notice appear in all copies.  Kaleb S. Keithley makes no
 * representations about the suitability of this software for
 * any purpose.  It is provided "as is" without express or
 * implied warranty.
 */

#include "sun.h"
#include "fb.h"

Bool
sunBW2Init
(
    ScreenPtr	    pScreen,  	/* The Screen to initialize */
    int		    argc,    	/* The number of the Server's arguments. */
    char	    **argv   	/* The arguments themselves. Don't change! */
)
{
    int	screen = pScreen->myNum;

    sunFbs[screen].EnterLeave = (void (*)(ScreenPtr, int))NoopDDA;
    if (sunFlipPixels) {
	pScreen->whitePixel = 1;
	pScreen->blackPixel = 0;
    } else {
	pScreen->whitePixel = 0;
	pScreen->blackPixel = 1;
    }
    return sunInitCommon (screen, pScreen, (off_t) 0,
	fbScreenInit, NULL,
	fbCreateDefColormap, sunSaveScreen, 0);
}


File Added: xsrc/external/mit/xorg-server/dist/hw/sun/sunMultiDepth.c
/* $Xorg: sunMultiDepth.c,v 1.4 2001/02/09 02:04:44 xorgcvs Exp $ */
/*

Copyright 1992, 1998  The Open Group

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.

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

Except as contained in this notice, the name of The Open Group shall
not be used in advertising or otherwise to promote the sale, use or
other dealings in this Software without prior written authorization
from The Open Group.

*/

/* $XFree86: xc/programs/Xserver/hw/sun/sunMultiDepth.c,v 1.6 2001/12/14 19:59:43 dawes Exp $ */

#include "sun.h"
#include <X11/Xmd.h>
#include "pixmapstr.h"
#include "mi.h"
#include "mistruct.h"
#include "gcstruct.h"
#include "fb.h"

#ifndef SINGLEDEPTH

static Bool
sunCfbCreateGC(GCPtr pGC)
{
    if (pGC->depth == 1)
    {
	return mfbCreateGC (pGC);
    }
    else if (pGC->depth <= 8)
    {
	return cfbCreateGC (pGC);
    }
    else if (pGC->depth <= 16)
    {
	return cfb16CreateGC (pGC);
    }
    else if (pGC->depth <= 32)
    {
	return cfb32CreateGC (pGC);
    }
    return FALSE;
}

static void
sunCfbGetSpans(
    DrawablePtr		pDrawable,	/* drawable from which to get bits */
    int			wMax,		/* largest value of all *pwidths */
    DDXPointPtr 	ppt,		/* points to start copying from */
    int			*pwidth,	/* list of number of bits to copy */
    int			nspans,		/* number of scanlines to copy */
    char		*pdstStart	/* where to put the bits */
)
{
    switch (pDrawable->bitsPerPixel) {
    case 1:
	mfbGetSpans(pDrawable, wMax, ppt, pwidth, nspans, pdstStart);
	break;
    case 8:
	cfbGetSpans(pDrawable, wMax, ppt, pwidth, nspans, pdstStart);
	break;
    case 16:
	cfb16GetSpans(pDrawable, wMax, ppt, pwidth, nspans, pdstStart);
	break;
    case 32:
	cfb32GetSpans(pDrawable, wMax, ppt, pwidth, nspans, pdstStart);
	break;
    }
    return;
}

static void
sunCfbGetImage(DrawablePtr pDrawable, int sx, int sy, int w, int h, unsigned int format, unsigned long planeMask, char *pdstLine)
{
    switch (pDrawable->bitsPerPixel)
    {
    case 1:
	mfbGetImage(pDrawable, sx, sy, w, h, format, planeMask, pdstLine);
	break;
    case 8:
	cfbGetImage(pDrawable, sx, sy, w, h, format, planeMask, pdstLine);
	break;
    case 16:
	cfb16GetImage(pDrawable, sx, sy, w, h, format, planeMask, pdstLine);
	break;
    case 32:
	cfb32GetImage(pDrawable, sx, sy, w, h, format, planeMask, pdstLine);
	break;
    }
}

Bool
sunCfbSetupScreen(
    ScreenPtr pScreen,
    void *pbits,		/* pointer to screen bitmap */
    int xsize,			/* in pixels */
    int ysize,			/* in pixels */
    int dpix,			/* dots per inch */
    int dpiy,			/* dots per inch */
    int width,			/* pixel width of frame buffer */
    int	bpp			/* bits per pixel of root */
)
{
    int ret;

    sunRegisterPixmapFormat( /* depth */ 1,  /* bits per pixel */ 1);
    sunRegisterPixmapFormat( /* depth */ 8,  /* bits per pixel */ 8);
    sunRegisterPixmapFormat( /* depth */ 12,  /* bits per pixel */ 16);
    sunRegisterPixmapFormat( /* depth */ 24,  /* bits per pixel */ 32);

    ret = fbSetupScreen(pScreen, pbits, xsize, ysize, dpix, dpiy, width, bpp);
    pScreen->CreateGC = sunCfbCreateGC;
    pScreen->GetImage = sunCfbGetImage;
    pScreen->GetSpans = sunCfbGetSpans;
    return ret;
}

Bool
sunCfbFinishScreenInit(
    ScreenPtr pScreen,
    void *pbits,		/* pointer to screen bitmap */
    int xsize,			/* in pixels */
    int ysize,			/* in pixels */
    int dpix,			/* dots per inch */
    int dpiy,			/* dots per inch */
    int width,			/* pixel width of frame buffer */
    int bpp
)
{
    int		i;
    VisualPtr	visuals;
    int		nvisuals;
    DepthPtr	depths;
    int		ndepths;
    VisualID	defaultVisual;
    int		rootdepth;

    if (!fbInitVisuals(&visuals, &depths, &nvisuals, &ndepths,
			&rootdepth, &defaultVisual, 1 << (bpp - 1), 8))
	return FALSE;
    if (! miScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width,
			rootdepth, ndepths, depths,
			defaultVisual, nvisuals, visuals))
	return FALSE;
    pScreen->CloseScreen = fbCloseScreen;
    return TRUE;
}


Bool
sunCfbScreenInit(
    ScreenPtr pScreen,
    void *pbits,		/* pointer to screen bitmap */
    int xsize,			/* in pixels */
    int ysize,			/* in pixels */
    int dpix,			/* dots per inch */
    int dpiy,			/* dots per inch */
    int width,			/* pixel width of frame buffer */
    int bpp
)
{
    if (!sunCfbSetupScreen(pScreen, pbits, xsize, ysize, dpix, dpiy,
			   width, bpp))
	return FALSE;
    return sunCfbFinishScreenInit(pScreen, pbits, xsize, ysize, dpix,
				  dpiy, width, bpp);
}


#else /* SINGLEDEPTH */

/* stuff for 8-bit only server */

Bool
sunCfbSetupScreen(
    ScreenPtr pScreen,
    void *pbits,		/* pointer to screen bitmap */
    int xsize,			/* in pixels */
    int ysize,			/* in pixels */
    int dpix,			/* dots per inch */
    int dpiy,			/* dots per inch */
    int width,			/* pixel width of frame buffer */
    int	bpp			/* bits per pixel of root */
)
{
    sunRegisterPixmapFormat( /* depth */ 1, /* bits per pixel */ 1);
    sunRegisterPixmapFormat( /* depth */ 8,  /* bits per pixel */ 8);
    return fbSetupScreen(pScreen, pbits, xsize, ysize, dpix, dpiy, width, bpp);
}

Bool
sunCfbFinishScreenInit(
    ScreenPtr pScreen,
    void *pbits,		/* pointer to screen bitmap */
    int xsize,			/* in pixels */
    int ysize,			/* in pixels */
    int dpix,			/* dots per inch */
    int dpiy,			/* dots per inch */
    int width,			/* pixel width of frame buffer */
    int bpp
)
{
    return fbFinishScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy,
			      width, bpp);
}

Bool
sunCfbScreenInit(
    ScreenPtr pScreen,
    void *pbits,		/* pointer to screen bitmap */
    int xsize,			/* in pixels */
    int ysize,			/* in pixels */
    int dpix,			/* dots per inch */
    int dpiy,			/* dots per inch */
    int width,			/* pixel width of frame buffer */
    int bpp
)
{
    sunRegisterPixmapFormat( /* depth */ 1, /* bits per pixel */ 1);
    sunRegisterPixmapFormat( /* depth */ 8,  /* bits per pixel */ 8);
    return fbScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width, bpp);
}

#endif /* SINGLEDEPTH */

File Added: xsrc/external/mit/xorg-server/dist/hw/sun/sun.h

/* $Xorg: sun.h,v 1.3 2000/08/17 19:48:29 cpqbld Exp $ */

/*-
 * Copyright (c) 1987 by the Regents of the University of California
 *
 * Permission to use, copy, modify, and distribute this
 * software and its documentation for any purpose and without
 * fee is hereby granted, provided that the above copyright
 * notice appear in all copies.  The University of California
 * makes no representations about the suitability of this
 * software for any purpose.  It is provided "as is" without
 * express or implied warranty.
 */

/* $XFree86: xc/programs/Xserver/hw/sun/sun.h,v 3.13 2003/11/17 22:20:36 dawes Exp $ */

#ifndef _SUN_H_
#define _SUN_H_

/* X headers */
#include <X11/Xos.h>
#undef index /* don't mangle silly Sun structure member names */
#include <X11/X.h>
#include <X11/Xproto.h>

/* general system headers */
#ifndef NOSTDHDRS
# include <stdlib.h>
#else
# include <malloc.h>
extern char *getenv();
#endif

/* system headers common to both SunOS and Solaris */
#include <sys/param.h>
#include <sys/file.h>
#include <sys/filio.h>
#include <sys/ioctl.h>
#include <sys/resource.h>

#ifdef SVR4
# ifdef X_POSIX_C_SOURCE
#  define _POSIX_C_SOURCE X_POSIX_C_SOURCE
#  include <signal.h>
#  undef _POSIX_C_SOURCE
# else
#  define _POSIX_SOURCE
#  include <signal.h>
#  undef _POSIX_SOURCE
# endif
#endif

#include <fcntl.h>

#ifndef __bsdi__
# ifndef CSRG_BASED
#  ifndef i386
#   include <poll.h>
#  else
#   include <sys/poll.h>
#  endif
# endif
#else
# include <unistd.h>
#endif

#include <errno.h>
#include <memory.h>
#include <signal.h>


/*
 * Sun specific headers Sun moved in Solaris, and are different for NetBSD.
 *
 * Even if only needed by one source file, I have put them here
 * to simplify finding them...
 */
#ifdef SVR4
# include <sys/fbio.h>
# include <sys/kbd.h>
# include <sys/kbio.h>
# include <sys/msio.h>
# include <sys/vuid_event.h>
# include <sys/memreg.h>
# include <stropts.h>
# define usleep(usec) poll((struct pollfd *) 0, (size_t) 0, usec / 1000)
#else
# ifndef CSRG_BASED
#  include <sun/fbio.h>
#  include <sundev/kbd.h>
#  include <sundev/kbio.h>
#  include <sundev/msio.h>
#  include <sundev/vuid_event.h>
#  include <pixrect/pixrect.h>
#  include <pixrect/memreg.h>
extern int ioctl();
extern int getrlimit();
extern int setrlimit();
extern int getpagesize();
# else
#  if defined(CSRG_BASED) && !defined(__bsdi__) && !defined(__NetBSD__)
#   include <machine/fbio.h>
#   include <machine/kbd.h>
#   include <machine/kbio.h>
#   include <machine/vuid_event.h>
#  endif
#  ifdef __bsdi__
#   include <sys/fbio.h>
#   include </sys/sparc/dev/kbd.h>
#   include </sys/sparc/dev/kbio.h>
#   include </sys/sparc/dev/vuid_event.h>
#  endif
#  ifdef __NetBSD__
#   include <dev/sun/fbio.h>
#   include <machine/kbd.h>
#   include <dev/sun/kbio.h>	   /* also <sparc/kbio.h> -wsr */
#   include <dev/sun/vuid_event.h> /* also <sparc/vud_event.h> -wsr */
#  endif
# endif
#endif

/*
 * Sun doesn't see fit to add the TCX to <sys/fbio.h>
 */
#ifndef SVR4
/* On SunOS 4.1.x the TCX pretends to be a CG3 */
#define XFBTYPE_LASTPLUSONE	FBTYPE_LASTPLUSONE
#else
#define XFBTYPE_TCX		21
#define XFBTYPE_LASTPLUSONE	22
#endif

#include <sys/time.h>

/*
 * Server specific headers
 */
#include "misc.h"
#undef abs /* don't munge function prototypes in headers, sigh */
#include "scrnintstr.h"
#ifdef NEED_EVENTS
# include "inputstr.h"
#endif
#include "input.h"
#include "colormapst.h"
#include "colormap.h"
#include "cursorstr.h"
#include "cursor.h"
#include "dixstruct.h"
#include "dix.h"
#include "opaque.h"
#include "resource.h"
#include "servermd.h"
#include "windowstr.h"
#include "mipointer.h"

/*
 * ddx specific headers
 */
#ifndef PSZ
#define PSZ 8
#endif

extern int monitorResolution;


/* Frame buffer devices */
#ifdef SVR4
# define CGTWO0DEV	"/dev/fbs/cgtwo0"
# define CGTWO1DEV	"/dev/fbs/cgtwo1"
# define CGTWO2DEV	"/dev/fbs/cgtwo2"
# define CGTWO3DEV	"/dev/fbs/cgtwo3"
# define CGTHREE0DEV	"/dev/fbs/cgthree0"
# define CGTHREE1DEV	"/dev/fbs/cgthree1"
# define CGTHREE2DEV	"/dev/fbs/cgthree2"
# define CGTHREE3DEV	"/dev/fbs/cgthree3"
# define CGFOUR0DEV	"/dev/fbs/cgfour0"
# define CGSIX0DEV	"/dev/fbs/cgsix0"
# define CGSIX1DEV	"/dev/fbs/cgsix1"
# define CGSIX2DEV	"/dev/fbs/cgsix2"
# define CGSIX3DEV	"/dev/fbs/cgsix3"
# define BWTWO0DEV	"/dev/fbs/bwtwo0"
# define BWTWO1DEV	"/dev/fbs/bwtwo1"
# define BWTWO2DEV	"/dev/fbs/bwtwo2"
# define BWTWO3DEV	"/dev/fbs/bwtwo3"
# define CGEIGHT0DEV	"/dev/fbs/cgeight0"
# define TCX0DEV	"/dev/fbs/tcx0"
#else
# define CGTWO0DEV	"/dev/cgtwo0"
# define CGTWO1DEV	"/dev/cgtwo1"
# define CGTWO2DEV	"/dev/cgtwo2"
# define CGTWO3DEV	"/dev/cgtwo3"
# define CGTHREE0DEV	"/dev/cgthree0"
# define CGTHREE1DEV	"/dev/cgthree1"
# define CGTHREE2DEV	"/dev/cgthree2"
# define CGTHREE3DEV	"/dev/cgthree3"
# define CGFOUR0DEV	"/dev/cgfour0"
# define CGSIX0DEV	"/dev/cgsix0"
# define CGSIX1DEV	"/dev/cgsix1"
# define CGSIX2DEV	"/dev/cgsix2"
# define CGSIX3DEV	"/dev/cgsix3"
# define BWTWO0DEV	"/dev/bwtwo0"
# define BWTWO1DEV	"/dev/bwtwo1"
# define BWTWO2DEV	"/dev/bwtwo2"
# define BWTWO3DEV	"/dev/bwtwo3"
# define CGEIGHT0DEV	"/dev/cgeight0"
#endif

/*
 * SUN_MAXEVENTS is the maximum number of events the mouse and keyboard
 * functions will read on a given call to their GetEvents vectors.
 */
#define SUN_MAXEVENTS 	32

/*
 * Data private to any sun keyboard.
 */
typedef struct {
    int		fd;
    int		type;		/* Type of keyboard */
    int		layout;		/* The layout of the keyboard */
    int		click;		/* kbd click save state */
    Leds	leds;		/* last known LED state */
} sunKbdPrivRec, *sunKbdPrivPtr;

extern sunKbdPrivRec sunKbdPriv;

/*
 * Data private to any sun pointer device.
 */
typedef struct {
    int		fd;
    int		bmask;		/* last known button state */
} sunPtrPrivRec, *sunPtrPrivPtr;

extern sunPtrPrivRec sunPtrPriv;

typedef struct {
    BYTE	key;
    CARD8	modifiers;
} SunModmapRec;

typedef struct {
    int		    width, height;
    Bool	    has_cursor;
    CursorPtr	    pCursor;		/* current cursor */
} sunCursorRec, *sunCursorPtr;

#define NCMAP	256
typedef struct {
    u_char	    origRed[NCMAP];
    u_char	    origGreen[NCMAP];
    u_char	    origBlue[NCMAP];
} sunCmapRec, *sunCmapPtr;

typedef struct {
    ColormapPtr	    installedMap;
    CloseScreenProcPtr CloseScreen;
    void	    (*UpdateColormap)(ScreenPtr, int, int, u_char *, u_char *, u_char *);
    void	    (*GetColormap)(ScreenPtr, int, int, u_char *, u_char *, u_char *);
    Bool	    origColormapValid;
    sunCmapRec	    origColormap;
    void	    (*RestoreColormap)(ScreenPtr);
    sunCursorRec    hardwareCursor;
    Bool	    hasHardwareCursor;
} sunScreenRec, *sunScreenPtr;

extern DevPrivateKeyRec sunScreenPrivateKeyRec;
#define sunScreenPrivateKey (&sunScreenPrivateKeyRec)
#define sunSetScreenPrivate(pScreen, v) \
    dixSetPrivate(&(pScreen)->devPrivates, sunScreenPrivateKey, (v))
#define sunGetScreenPrivate(pScreen) ((sunScreenRec *) \
    dixLookupPrivate(&(pScreen)->devPrivates, sunScreenPrivateKey))

typedef struct {
    unsigned char*  fb;		/* Frame buffer itself */
    int		    fd;		/* frame buffer for ioctl()s, */
    struct fbtype   info;	/* Frame buffer characteristics */
    void	    (*EnterLeave)(ScreenPtr, int);/* screen switch */
    unsigned char*  fbPriv;	/* fbattr stuff, for the real type */
} fbFd;

typedef Bool (*sunFbInitProc)(
    ScreenPtr /* pScreen */,
    int /* argc */,
    char** /* argv */
);

typedef struct {
    sunFbInitProc	init;	/* init procedure for this fb */
    const char		*name;	/* /usr/include/fbio names */
} sunFbDataRec;

/* sunInit.c */
extern sunFbDataRec	sunFbData[];
extern fbFd		sunFbs[];
extern Bool		sunSwapLkeys;
extern Bool		sunForceMono;
extern Bool		sunDebug;
extern char		*sunDeviceList;
extern Bool		sunFlipPixels;
extern Bool		sunFbInfo;
extern Bool		sunCG4Frob;
extern Bool		sunNoGX;

/* sunKeyMap.c */
extern KeySymsRec	sunKeySyms[];
extern const int	sunMaxLayout;
extern KeySym		*sunType4KeyMaps[];

/* sunKbd.c */
extern long		sunAutoRepeatInitiate;
extern long		sunAutoRepeatDelay;
extern DeviceIntPtr	sunKeyboardDevice;

/* sunMouse.c */
extern Bool		sunActiveZaphod;
extern DeviceIntPtr	sunPointerDevice;
extern miPointerScreenFuncRec sunPointerScreenFuncs;

/* sunFbs.c */
extern int		sunScreenIndex;

/* sunCursor.c */
extern Bool sunCursorInitialize(ScreenPtr);
extern void sunDisableCursor(ScreenPtr);

/* sunInit.c */
extern void sunNonBlockConsoleOff(
#if defined(SVR4) || defined(CSRG_BASED)
    void
#else
    char* /* arg */
#endif
);

/* sunIo.c */
extern void sunEnqueueEvents(void);

/* sunGX.c */
extern int sunGXInit(ScreenPtr, fbFd *);

/* sunFbs.c */
extern Bool sunSaveScreen(ScreenPtr, int);
extern Bool sunScreenInit(ScreenPtr);
extern void *sunMemoryMap(size_t, off_t, int);
extern Bool sunScreenAllocate(ScreenPtr);
extern Bool sunInitCommon(int, ScreenPtr, off_t,
    Bool (* /* init1 */)(ScreenPtr, void *, int, int, int, int, int, int),
    void (* /* init2 */)(ScreenPtr),
    Bool (* /* cr_cm */)(ScreenPtr),
    Bool (* /* save */)(ScreenPtr, int),
    int);

/* sunKbd.c */
extern int sunChangeKbdTranslation(int, Bool);
extern Firm_event* sunKbdGetEvents(int, Bool, int *, Bool *);
extern void sunKbdEnqueueEvent(DeviceIntPtr, Firm_event *);
extern int sunKbdProc(DeviceIntPtr, int);
extern void sunKbdWait(void);

/* sunMouse.c */
extern Firm_event* sunMouseGetEvents(int, Bool, int *, Bool *);
extern void sunMouseEnqueueEvent(DeviceIntPtr, Firm_event *);
extern int sunMouseProc(DeviceIntPtr, int);

/* sunCfb.c */
Bool sunCG3Init(ScreenPtr, int, char **);
Bool sunTCXInit(ScreenPtr, int, char **);
Bool sunCG2Init(ScreenPtr, int, char **);
Bool sunCG4Init(ScreenPtr, int, char **);
Bool sunCG6Init(ScreenPtr, int, char **);

/* sunCfb24.c */
Bool sunCG8Init(ScreenPtr, int, char **);

/* sunMfb.c */
Bool sunBW2Init(ScreenPtr, int, char **);

/* XXX */
extern void mfbDoBitblt(DrawablePtr, DrawablePtr, int, RegionPtr, DDXPointPtr);

/*-
 * TVTOMILLI(tv)
 *	Given a struct timeval, convert its time into milliseconds...
 */
#define TVTOMILLI(tv)	(((tv).tv_usec/1000)+((tv).tv_sec*1000))

extern Bool sunCfbSetupScreen(
    ScreenPtr /* pScreen */,
    void * /* pbits */,		/* pointer to screen bitmap */
    int /* xsize */,		/* in pixels */
    int /* ysize */,
    int /* dpix */,		/* dots per inch */
    int /* dpiy */,		/* dots per inch */
    int /* width */,		/* pixel width of frame buffer */
    int	/* bpp */		/* bits per pixel of root */
);

extern Bool sunCfbFinishScreenInit(
    ScreenPtr /* pScreen */,
    void * /* pbits */,		/* pointer to screen bitmap */
    int /* xsize */,		/* in pixels */
    int /* ysize */,
    int /* dpix */,		/* dots per inch */
    int /* dpiy */,		/* dots per inch */
    int /* width */,		/* pixel width of frame buffer */
    int	/* bpp */		/* bits per pixel of root */
);

extern Bool sunCfbScreenInit(
    ScreenPtr /* pScreen */,
    void * /* pbits */,		/* pointer to screen bitmap */
    int /* xsize */,		/* in pixels */
    int /* ysize */,
    int /* dpix */,		/* dots per inch */
    int /* dpiy */,		/* dots per inch */
    int /* width */,		/* pixel width of frame buffer */
    int	/* bpp */		/* bits per pixel of root */
);

extern void sunInstallColormap(
    ColormapPtr /* cmap */
);

extern void sunUninstallColormap(
    ColormapPtr /* cmap */
);

extern int sunListInstalledColormaps(
    ScreenPtr /* pScreen */,
    Colormap* /* pCmapList */
);

#endif

File Added: xsrc/external/mit/xorg-server/dist/hw/sun/sunKbd.c
/* $Xorg: sunKbd.c,v 1.3 2000/08/17 19:48:30 cpqbld Exp $ */
/*-
 * Copyright 1987 by the Regents of the University of California
 *
 * Permission to use, copy, modify, and distribute this
 * software and its documentation for any purpose and without
 * fee is hereby granted, provided that the above copyright
 * notice appear in all copies.  The University of California
 * makes no representations about the suitability of this
 * software for any purpose.  It is provided "as is" without
 * express or implied warranty.
 */

/************************************************************
Copyright 1987 by Sun Microsystems, Inc. Mountain View, CA.

                    All Rights Reserved

Permission  to  use,  copy,  modify,  and  distribute   this
software  and  its documentation for any purpose and without
fee is hereby granted, provided that the above copyright no-
tice  appear  in all copies and that both that copyright no-
tice and this permission notice appear in  supporting  docu-
mentation,  and  that the names of Sun or The Open Group
not be used in advertising or publicity pertaining to
distribution  of  the software  without specific prior
written permission. Sun and The Open Group make no
representations about the suitability of this software for
any purpose. It is provided "as is" without any express or
implied warranty.

SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
THE USE OR PERFORMANCE OF THIS SOFTWARE.

********************************************************/
/* $XFree86: xc/programs/Xserver/hw/sun/sunKbd.c,v 1.9 2003/11/17 22:20:36 dawes Exp $ */

#define NEED_EVENTS
#include "sun.h"
#include <X11/keysym.h>
#include <X11/Sunkeysym.h>
#include "mi.h"

#include <X11/extensions/XKB.h>
#include "xkbsrv.h"
#include "xkbstr.h"

#ifdef __sun
#define SUN_LED_MASK	0x0f
#else
#define SUN_LED_MASK	0x07
#endif
#define MIN_KEYCODE	7	/* necessary to avoid the mouse buttons */
#define MAX_KEYCODE	255	/* limited by the protocol */
#define NUM_KEYCODES	(MAX_KEYCODE - MIN_KEYCODE + 1)
#ifndef KB_SUN4
#define KB_SUN4		4
#endif

#define Meta_Mask	Mod1Mask
#define Mode_switch_Mask Mod2Mask
#define Alt_Mask	Mod3Mask
#define Num_Lock_Mask	Mod4Mask
#define ScrollLockMask	Mod5Mask

#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; \
		(tv).tv_usec = (tv1).tv_usec + (tv2).tv_usec; \
		if ((tv).tv_usec > 1000000) { \
		    (tv).tv_usec -= 1000000; \
		    (tv).tv_sec += 1; \
		}

static void sunKbdHandlerNotify(int, int, void *);
static void sunInitModMap(const KeySymsRec *, CARD8 *);
static void SwapLKeys(KeySymsRec *);
static void SetLights(KeybdCtrl *, int);
static KeyCode LookupKeyCode(KeySym, XkbDescPtr, KeySymsPtr);
static void pseudoKey(DeviceIntPtr, Bool, KeyCode);
static void DoLEDs(DeviceIntPtr, KeybdCtrl *, sunKbdPrivPtr);

DeviceIntPtr	sunKeyboardDevice = NULL;

static void
sunKbdHandlerNotify(int fd __unused, int ready __unused, void *data __unused)
{
}

void
sunKbdWait(void)
{
    static struct timeval lastChngKbdTransTv;
    struct timeval tv;
    struct timeval lastChngKbdDeltaTv;
    unsigned int lastChngKbdDelta;

    X_GETTIMEOFDAY(&tv);
    if (!lastChngKbdTransTv.tv_sec)
	lastChngKbdTransTv = tv;
    tvminus(lastChngKbdDeltaTv, tv, lastChngKbdTransTv);
    lastChngKbdDelta = TVTOMILLI(lastChngKbdDeltaTv);
    if (lastChngKbdDelta < 750) {
	unsigned wait;
	/*
         * We need to guarantee at least 750 milliseconds between
	 * calls to KIOCTRANS. YUCK!
	 */
	wait = (750L - lastChngKbdDelta) * 1000L;
        usleep (wait);
        X_GETTIMEOFDAY(&tv);
    }
    lastChngKbdTransTv = tv;
}

static
void SwapLKeys(KeySymsRec* keysyms)
{
    unsigned int i;
    KeySym k;

    for (i = 2; i < keysyms->maxKeyCode * keysyms->mapWidth; i++)
	if (keysyms->map[i] == XK_L1 ||
	    keysyms->map[i] == XK_L2 ||
	    keysyms->map[i] == XK_L3 ||
	    keysyms->map[i] == XK_L4 ||
	    keysyms->map[i] == XK_L5 ||
	    keysyms->map[i] == XK_L6 ||
	    keysyms->map[i] == XK_L7 ||
	    keysyms->map[i] == XK_L8 ||
	    keysyms->map[i] == XK_L9 ||
	    keysyms->map[i] == XK_L10) {
	    /* yes, I could have done a clever two line swap! */
	    k = keysyms->map[i - 2];
	    keysyms->map[i - 2] = keysyms->map[i];
	    keysyms->map[i] = k;
	}
}

static void
SetLights(KeybdCtrl* ctrl, int fd)
{
#ifdef KIOCSLED
    static unsigned char led_tab[16] = {
	0,
#ifdef __sun
	LED_NUM_LOCK,
	LED_SCROLL_LOCK,
	LED_SCROLL_LOCK | LED_NUM_LOCK,
	LED_COMPOSE,
	LED_COMPOSE | LED_NUM_LOCK,
	LED_COMPOSE | LED_SCROLL_LOCK,
	LED_COMPOSE | LED_SCROLL_LOCK | LED_NUM_LOCK,
	LED_CAPS_LOCK,
	LED_CAPS_LOCK | LED_NUM_LOCK,
	LED_CAPS_LOCK | LED_SCROLL_LOCK,
	LED_CAPS_LOCK | LED_SCROLL_LOCK | LED_NUM_LOCK,
	LED_CAPS_LOCK | LED_COMPOSE,
	LED_CAPS_LOCK | LED_COMPOSE | LED_NUM_LOCK,
	LED_CAPS_LOCK | LED_COMPOSE | LED_SCROLL_LOCK,
	LED_CAPS_LOCK | LED_COMPOSE | LED_SCROLL_LOCK | LED_NUM_LOCK
#else
	LED_CAPS_LOCK,
	LED_NUM_LOCK,
	LED_NUM_LOCK | LED_CAPS_LOCK,
	LED_SCROLL_LOCK,
	LED_SCROLL_LOCK | LED_CAPS_LOCK,
	LED_SCROLL_LOCK | LED_NUM_LOCK,
	LED_SCROLL_LOCK | LED_NUM_LOCK | LED_CAPS_LOCK,
	LED_COMPOSE,
	LED_COMPOSE | LED_CAPS_LOCK,
	LED_COMPOSE | LED_NUM_LOCK,
	LED_COMPOSE | LED_NUM_LOCK | LED_CAPS_LOCK,
	LED_COMPOSE | LED_SCROLL_LOCK,
	LED_COMPOSE | LED_SCROLL_LOCK | LED_CAPS_LOCK,
	LED_COMPOSE | LED_SCROLL_LOCK | LED_NUM_LOCK,
	LED_COMPOSE | LED_SCROLL_LOCK | LED_NUM_LOCK | LED_CAPS_LOCK,
#endif
    };
    if (ioctl (fd, KIOCSLED, (caddr_t)&led_tab[ctrl->leds & SUN_LED_MASK]) == -1)
	ErrorF("Failed to set keyboard lights");
#endif
}


/*-
 *-----------------------------------------------------------------------
 * sunBell --
 *	Ring the terminal/keyboard bell
 *
 * Results:
 *	Ring the keyboard bell for an amount of time proportional to
 *	"loudness."
 *
 * Side Effects:
 *	None, really...
 *
 *-----------------------------------------------------------------------
 */

static void
bell(int fd, int duration)
{
    int		    kbdCmd;   	    /* Command to give keyboard */

    kbdCmd = KBD_CMD_BELL;
    if (ioctl (fd, KIOCCMD, &kbdCmd) == -1) {
 	ErrorF("Failed to activate bell");
	return;
    }
    if (duration) usleep (duration);
    kbdCmd = KBD_CMD_NOBELL;
    if (ioctl (fd, KIOCCMD, &kbdCmd) == -1)
	ErrorF("Failed to deactivate bell");
}

static void
sunBell(int percent, DeviceIntPtr device, void *ctrl, int unused)
{
    KeybdCtrl*      kctrl = (KeybdCtrl*) ctrl;
    sunKbdPrivPtr   pPriv = (sunKbdPrivPtr) device->public.devicePrivate;

    if (percent == 0 || kctrl->bell == 0)
 	return;

    bell (pPriv->fd, kctrl->bell_duration * 1000);
}

void
DDXRingBell(int volume, int pitch, int duration)
{
    DeviceIntPtr pKeyboard;
    sunKbdPrivPtr pPriv;

    pKeyboard = sunKeyboardDevice;
    if (pKeyboard != NULL) {
	pPriv = (sunKbdPrivPtr)pKeyboard->public.devicePrivate;
	bell(pPriv->fd, duration * 1000);
    }
}


#ifdef __sun
#define XLED_NUM_LOCK    0x1
#define XLED_COMPOSE     0x4
#define XLED_SCROLL_LOCK 0x2
#define XLED_CAPS_LOCK   0x8
#else
#define XLED_NUM_LOCK    0x2
#define XLED_COMPOSE     0x8
#define XLED_SCROLL_LOCK 0x4
#define XLED_CAPS_LOCK   0x1
#endif

static KeyCode
LookupKeyCode(KeySym keysym, XkbDescPtr xkb, KeySymsPtr syms)
{
    KeyCode i;
    int ii, index = 0;

    for (i = xkb->min_key_code; i < xkb->max_key_code; i++)
	for (ii = 0; ii < syms->mapWidth; ii++)
	    if (syms->map[index++] == keysym)
		return i;
    return 0;
}

static void
pseudoKey(DeviceIntPtr device, Bool down, KeyCode keycode)
{
    int bit;
    CARD8 modifiers;
    CARD16 mask;
    BYTE* kptr;

    kptr = &device->key->down[keycode >> 3];
    bit = 1 << (keycode & 7);
    modifiers = device->key->xkbInfo->desc->map->modmap[keycode];
    if (down) {
	/* fool dix into thinking this key is now "down" */
	int i;
	*kptr |= bit;
	for (i = 0, mask = 1; modifiers; i++, mask <<= 1)
	    if (mask & modifiers) {
		device->key->modifierKeyCount[i]++;
		modifiers &= ~mask;
	    }
    } else {
	/* fool dix into thinking this key is now "up" */
	if (*kptr & bit) {
	    int i;
	    *kptr &= ~bit;
	    for (i = 0, mask = 1; modifiers; i++, mask <<= 1)
		if (mask & modifiers) {
		    if (--device->key->modifierKeyCount[i] <= 0) {
			device->key->modifierKeyCount[i] = 0;
		    }
		    modifiers &= ~mask;
		}
	}
    }
}

static void
DoLEDs(
    DeviceIntPtr    device,	    /* Keyboard to alter */
    KeybdCtrl* ctrl,
    sunKbdPrivPtr pPriv
)
{
    XkbDescPtr xkb;
    KeySymsPtr syms;

    xkb = device->key->xkbInfo->desc;
    syms = XkbGetCoreMap(device);
    if (!syms)
	return;	/* XXX */

    if ((ctrl->leds & XLED_CAPS_LOCK) && !(pPriv->leds & XLED_CAPS_LOCK))
	    pseudoKey(device, TRUE,
		LookupKeyCode(XK_Caps_Lock, xkb, syms));

    if (!(ctrl->leds & XLED_CAPS_LOCK) && (pPriv->leds & XLED_CAPS_LOCK))
	    pseudoKey(device, FALSE,
		LookupKeyCode(XK_Caps_Lock, xkb, syms));

    if ((ctrl->leds & XLED_NUM_LOCK) && !(pPriv->leds & XLED_NUM_LOCK))
	    pseudoKey(device, TRUE,
		LookupKeyCode(XK_Num_Lock, xkb, syms));

    if (!(ctrl->leds & XLED_NUM_LOCK) && (pPriv->leds & XLED_NUM_LOCK))
	    pseudoKey(device, FALSE,
		LookupKeyCode(XK_Num_Lock, xkb, syms));

    if ((ctrl->leds & XLED_SCROLL_LOCK) && !(pPriv->leds & XLED_SCROLL_LOCK))
	    pseudoKey(device, TRUE,
		LookupKeyCode(XK_Scroll_Lock, xkb, syms));

    if (!(ctrl->leds & XLED_SCROLL_LOCK) && (pPriv->leds & XLED_SCROLL_LOCK))
	    pseudoKey(device, FALSE,
		LookupKeyCode(XK_Scroll_Lock, xkb, syms));

    if ((ctrl->leds & XLED_COMPOSE) && !(pPriv->leds & XLED_COMPOSE))
	    pseudoKey(device, TRUE,
		LookupKeyCode(SunXK_Compose, xkb, syms));

    if (!(ctrl->leds & XLED_COMPOSE) && (pPriv->leds & XLED_COMPOSE))
	    pseudoKey(device, FALSE,
		LookupKeyCode(SunXK_Compose, xkb, syms));

    pPriv->leds = ctrl->leds & SUN_LED_MASK;
    SetLights (ctrl, pPriv->fd);
    free(syms->map);
    free(syms);
}

/*-
 *-----------------------------------------------------------------------
 * sunKbdCtrl --
 *	Alter some of the keyboard control parameters
 *
 * Results:
 *	None.
 *
 * Side Effects:
 *	Some...
 *
 *-----------------------------------------------------------------------
 */

static void
sunKbdCtrl(DeviceIntPtr device, KeybdCtrl* ctrl)
{
    sunKbdPrivPtr pPriv = (sunKbdPrivPtr) device->public.devicePrivate;

    if (pPriv->fd < 0) return;

    if (ctrl->click != pPriv->click) {
    	int kbdClickCmd;

	pPriv->click = ctrl->click;
	kbdClickCmd = pPriv->click ? KBD_CMD_CLICK : KBD_CMD_NOCLICK;
    	if (ioctl (pPriv->fd, KIOCCMD, &kbdClickCmd) == -1)
 	    ErrorF("Failed to set keyclick");
    }
    if ((pPriv->type == KB_SUN4) && (pPriv->leds != (ctrl->leds & SUN_LED_MASK)))
	DoLEDs(device, ctrl, pPriv);
}

/*-
 *-----------------------------------------------------------------------
 * sunInitKbdNames --
 *	Handle the XKB initialization
 *
 * Results:
 *	None.
 *
 * Comments:
 *     This function needs considerable work, in conjunctions with
 *     the need to add geometry descriptions of Sun Keyboards.
 *     It would also be nice to have #defines for all the keyboard
 *     layouts so that we don't have to have these hard-coded
 *     numbers.
 *
 *-----------------------------------------------------------------------
 */
static void
sunInitKbdNames(XkbRMLVOSet *rmlvo, sunKbdPrivPtr pKbd)
{
#if 0 /* XXX to be revisited later */
#ifndef XKBBUFSIZE
#define XKBBUFSIZE 64
#endif
    static char keycodesbuf[XKBBUFSIZE];
    static char geometrybuf[XKBBUFSIZE];
    static char  symbolsbuf[XKBBUFSIZE];

    names->keymap = NULL;
    names->compat = "compat/complete";
    names->types  = "types/complete";
    names->keycodes = keycodesbuf;
    names->geometry = geometrybuf;
    names->symbols = symbolsbuf;
    (void) strcpy (keycodesbuf, "keycodes/");
    (void) strcpy (geometrybuf, "geometry/");
    (void) strcpy (symbolsbuf, "symbols/");

    /* keycodes & geometry */
    switch (pKbd->type) {
    case KB_SUN2:
	(void) strcat (names->keycodes, "sun(type2)");
	(void) strcat (names->geometry, "sun(type2)");
	(void) strcat (names->symbols, "us(sun2)");
	break;
    case KB_SUN3:
	(void) strcat (names->keycodes, "sun(type3)");
	(void) strcat (names->geometry, "sun(type3)");
	(void) strcat (names->symbols, "us(sun3)");
	break;
    case KB_SUN4:
	/* First, catch "fully known" models */
	switch (pKbd->layout) {
	case 11:		/* type4, Sweden */
	    (void) strcat (names->geometry, "sun(type4_se)");
	    (void) strcat (names->keycodes,
			   "sun(type4_se_swapctl)");
	    (void) strcat (names->symbols,
			   "sun/se(sun4)+se(fixdollar)");
	    return;
	    break;
	case 43:		/* type5/5c, Sweden */
	    (void) strcat (names->geometry, "sun(type5c_se)");
	    (void) strcat (names->keycodes, "sun(type5_se)");
	    (void) strcat (names->symbols,
			   "sun/se(sun5)+se(fixdollar)");
	    return;
	    break;
	case 90:		/* "Compact 1", Sweden (???) */
	    break;		/* No specific mapping, yet */
	default:
	    break;
	}

	if (pKbd->layout == 19) {
	    (void) strcat (names->keycodes, "sun(US101A)");
	    (void) strcat (names->geometry, "pc101-NG"); /* XXX */
	    (void) strcat (names->symbols, "us(pc101)");
	} else if (pKbd->layout < 33) {
	    (void) strcat (names->keycodes, "sun(type4)");
	    (void) strcat (names->geometry, "sun(type4)");
	    if (sunSwapLkeys)
		(void) strcat (names->symbols, "sun/us(sun4ol)");
	    else
		(void) strcat (names->symbols, "sun/us(sun4)");
	} else {
	    switch (pKbd->layout) {
	    case 33: case 80: /* U.S. */
	    case 47: case 94: /* Korea */
	    case 48: case 95: /* Taiwan */
	    case 49: case 96: /* Japan */
		(void) strcat (names->keycodes, "sun(type5)");
		(void) strcat (names->geometry, "sun(type5)");
		break;
	    case 34: case 81: /* U.S. Unix */
		(void) strcat (names->keycodes, "sun(type5)");
		(void) strcat (names->geometry, "sun(type5unix)");
		break;
	    default:
		(void) strcat (names->keycodes, "sun(type5_euro)");
		(void) strcat (names->geometry, "sun(type5euro)");
	    }

	    if (sunSwapLkeys)
		(void) strcat (names->symbols, "sun/us(sun5ol)");
	    else
		(void) strcat (names->symbols, "sun/us(sun5)");
	}
	break;
    default:
	names->keycodes = names->geometry = NULL;
	break;
    }

    /* extra symbols */

    if (pKbd->type == KB_SUN4) {
	switch (pKbd->layout) {
	case  4: case 36: case 83:
	case  5: case 37: case 84:
	case  6: case 38: case 85:
	case  8: case 40: case 87:
	case  9: case 41: case 88:
	case 10: case 42: case 89:
/*	case 11: case 43: case 90: */ /* handled earlier */
	case 12: case 44: case 91:
	case 13: case 45: case 92:
	case 14: case 46: case 93:
	    (void) strcat (names->symbols, "+iso9995-3(basic)"); break;
	}
    }

    if (pKbd->type == KB_SUN4) {
	switch (pKbd->layout) {
	case  0: case  1: case 33: case 34: case 80: case 81:
	    break;
	case  3:
	    (void) strcat (names->symbols, "+ca"); break;
	case  4: case 36: case 83:
	    (void) strcat (names->symbols, "+dk"); break;
	case  5: case 37: case 84:
	    (void) strcat (names->symbols, "+de"); break;
	case  6: case 38: case 85:
	    (void) strcat (names->symbols, "+it"); break;
	case  8: case 40: case 87:
	    (void) strcat (names->symbols, "+no"); break;
	case  9: case 41: case 88:
	    (void) strcat (names->symbols, "+pt"); break;
	case 10: case 42: case 89:
	    (void) strcat (names->symbols, "+es"); break;
	    /* case 11: case 43: */ /* handled earlier */
	case 90:
	    (void) strcat (names->symbols, "+se"); break;
	case 12: case 44: case 91:
	    (void) strcat (names->symbols, "+fr_CH"); break;
	case 13: case 45: case 92:
	    (void) strcat (names->symbols, "+de_CH"); break;
	case 14: case 46: case 93:
	    (void) strcat (names->symbols, "+gb"); break; /* s/b en_UK */
	case 52:
	    (void) strcat (names->symbols, "+pl"); break;
	case 53:
	    (void) strcat (names->symbols, "+cs"); break;
	case 54:
	    (void) strcat (names->symbols, "+ru"); break;
#if 0
	/* don't have symbols defined for these yet, let them default */
	case  2:
	    (void) strcat (names->symbols, "+fr_BE"); break;
	case  7: case 39: case 86:
	    (void) strcat (names->symbols, "+nl"); break;
	case 50: case 97:
	    (void) strcat (names->symbols, "+fr_CA"); break;
	case 16: case 47: case 94:
	    (void) strcat (names->symbols, "+ko"); break;
	case 17: case 48: case 95:
	    (void) strcat (names->symbols, "+tw"); break;
	case 32: case 49: case 96:
	    (void) strcat (names->symbols, "+jp"); break;
	case 51:
	    (void) strcat (names->symbols, "+hu"); break;
#endif
	/*
	 * by setting the symbols to NULL XKB will use the symbols in
	 * the "default" keymap.
	 */
	default:
	    names->symbols = NULL; return; break;
	}
    }
#else
    rmlvo->rules = "base";
    rmlvo->model = "empty";
    rmlvo->layout = "empty";
    rmlvo->variant = NULL;
    rmlvo->options = NULL;
#endif
}

/*-
 *-----------------------------------------------------------------------
 * sunKbdProc --
 *	Handle the initialization, etc. of a keyboard.
 *
 * Results:
 *	None.
 *
 *-----------------------------------------------------------------------
 */

int
sunKbdProc(DeviceIntPtr device, int what)
{
    DevicePtr pKeyboard = &device->public;
    sunKbdPrivPtr pPriv;
    KeybdCtrl*	ctrl = &device->kbdfeed->ctrl;
    XkbRMLVOSet rmlvo;
    CARD8 workingModMap[MAP_LENGTH];

    static KeySymsRec *workingKeySyms;

    switch (what) {
    case DEVICE_INIT:
	if (pKeyboard != &sunKeyboardDevice->public) {
	    ErrorF ("Cannot open non-system keyboard\n");
	    return (!Success);
	}

	if (!workingKeySyms) {
	    workingKeySyms = &sunKeySyms[sunKbdPriv.type];

	    if (sunKbdPriv.type == KB_SUN4 && sunSwapLkeys)
		SwapLKeys(workingKeySyms);

	    if (workingKeySyms->minKeyCode < MIN_KEYCODE) {
		workingKeySyms->minKeyCode += MIN_KEYCODE;
		workingKeySyms->maxKeyCode += MIN_KEYCODE;
	    }
	    if (workingKeySyms->maxKeyCode > MAX_KEYCODE)
		workingKeySyms->maxKeyCode = MAX_KEYCODE;

	    sunInitModMap(workingKeySyms, workingModMap);
	}

	pKeyboard->devicePrivate = (void *)&sunKbdPriv;
	pKeyboard->on = FALSE;

	sunInitKbdNames(&rmlvo, pKeyboard->devicePrivate);
#if 0 /* XXX needs more work for Xorg xkb */
	InitKeyboardDeviceStruct(device, &rmlvo,
				 sunBell, sunKbdCtrl);
#else
	XkbSetRulesDflts(&rmlvo);
	InitKeyboardDeviceStruct(device, NULL,
				 sunBell, sunKbdCtrl);
	XkbApplyMappingChange(device, workingKeySyms,
			      workingKeySyms->minKeyCode,
			      workingKeySyms->maxKeyCode -
			      workingKeySyms->minKeyCode + 1,
			      workingModMap, serverClient);
#endif
	break;

    case DEVICE_ON:
	pPriv = (sunKbdPrivPtr)pKeyboard->devicePrivate;
	/*
	 * Set the keyboard into "direct" mode and turn on
	 * event translation.
	 */
	if (sunChangeKbdTranslation(pPriv->fd,TRUE) == -1)
	    FatalError("Can't set keyboard translation\n");
	SetNotifyFd(pPriv->fd, sunKbdHandlerNotify, X_NOTIFY_READ, NULL);
	pKeyboard->on = TRUE;
	break;

    case DEVICE_CLOSE:
    case DEVICE_OFF:
	pPriv = (sunKbdPrivPtr)pKeyboard->devicePrivate;
	if (pPriv->type == KB_SUN4) {
	    /* dumb bug in Sun's keyboard! Turn off LEDS before resetting */
	    pPriv->leds = 0;
	    ctrl->leds = 0;
	    SetLights(ctrl, pPriv->fd);
	}
	/*
	 * Restore original keyboard directness and translation.
	 */
	if (sunChangeKbdTranslation(pPriv->fd,FALSE) == -1)
	    FatalError("Can't reset keyboard translation\n");
	RemoveNotifyFd(pPriv->fd);
	pKeyboard->on = FALSE;
	break;
    default:
	FatalError("Unknown keyboard operation\n");
    }
    return Success;
}

/*-------------------------------------------------------------------------
 * sunInitModMap --
 *	Initialize ModMap per specified KeyMap table.
 *
 * Results:
 * 	None.
 *
 * Side Effects:
 *	None.
 *-----------------------------------------------------------------------*/
static void
sunInitModMap(
    const KeySymsRec *KeySyms,	/* KeyMap data to set ModMap */
    CARD8 *ModMap		/* ModMap to be initialized */
)
{
    KeySym *k;
    int i, min, max, width;

    for (i = 0; i < MAP_LENGTH; i++)
        ModMap[i] = NoSymbol;

    min   = KeySyms->minKeyCode;
    max   = KeySyms->maxKeyCode;
    width = KeySyms->mapWidth;
    for (i = min, k = KeySyms->map; i < max; i++, k += width) {
	switch (*k) {

	case XK_Shift_L:
	case XK_Shift_R:
	    ModMap[i] = ShiftMask;
	    break;

	case XK_Control_L:
	case XK_Control_R:
	    ModMap[i] = ControlMask;
	    break;

	case XK_Caps_Lock:
	    ModMap[i] = LockMask;
	    break;

	case XK_Alt_L:
	case XK_Alt_R:
	    ModMap[i] = Alt_Mask;
	    break;

	case XK_Num_Lock:
	    ModMap[i] = Num_Lock_Mask;
	    break;

	case XK_Scroll_Lock:
	    ModMap[i] = ScrollLockMask;
	    break;

	case XK_Meta_L:
	case XK_Meta_R:
	    ModMap[i] = Meta_Mask;
	    break;

	case SunXK_AltGraph:
	    ModMap[i] = Mode_switch_Mask;
	    break;
        }
    }
}

/*-
 *-----------------------------------------------------------------------
 * sunKbdGetEvents --
 *	Return the events waiting in the wings for the given keyboard.
 *
 * Results:
 *	A pointer to an array of Firm_events or (Firm_event *)0 if no events
 *	The number of events contained in the array.
 *	A boolean as to whether more events might be available.
 *
 * Side Effects:
 *	None.
 *-----------------------------------------------------------------------
 */

Firm_event *
sunKbdGetEvents(int fd, Bool on, int *pNumEvents, Bool *pAgain)
{
    int	    	  nBytes;	    /* number of bytes of events available. */
    static Firm_event	evBuf[SUN_MAXEVENTS];   /* Buffer for Firm_events */

    if ((nBytes = read (fd, evBuf, sizeof(evBuf))) == -1) {
	if (errno == EWOULDBLOCK) {
	    *pNumEvents = 0;
	    *pAgain = FALSE;
	} else {
	    ErrorF("Reading keyboard");
	    FatalError ("Could not read the keyboard");
	}
    } else {
	if (on) {
	    *pNumEvents = nBytes / sizeof (Firm_event);
	    *pAgain = (nBytes == sizeof (evBuf));
	} else {
	    *pNumEvents = 0;
	    *pAgain = FALSE;
	}
    }
    return evBuf;
}

/*-
 *-----------------------------------------------------------------------
 * sunKbdEnqueueEvent --
 *
 *-----------------------------------------------------------------------
 */

void
sunKbdEnqueueEvent(DeviceIntPtr device, Firm_event *fe)
{
    BYTE		keycode;
    int			type;

    keycode = (fe->id & 0x7f) + MIN_KEYCODE;
    type = ((fe->value == VKEY_UP) ? KeyRelease : KeyPress);
    QueueKeyboardEvents(device, type, keycode);
}


/*-
 *-----------------------------------------------------------------------
 * sunChangeKbdTranslation
 *	Makes operating system calls to set keyboard translation
 *	and direction on or off.
 *
 * Results:
 *	-1 if failure, else 0.
 *
 * Side Effects:
 * 	Changes kernel management of keyboard.
 *
 *-----------------------------------------------------------------------
 */
int
sunChangeKbdTranslation(int fd, Bool makeTranslated)
{
    int 	tmp;
#ifndef i386 /* { */
    sigset_t	hold_mask, old_mask;
#else /* }{ */
    int		old_mask;
#endif /* } */
    int		toread;
    char	junk[8192];

#ifndef i386 /* { */
    (void) sigfillset(&hold_mask);
    (void) sigprocmask(SIG_BLOCK, &hold_mask, &old_mask);
#else /* }{ */
    old_mask = sigblock (~0);
#endif /* } */
    sunKbdWait();
    if (makeTranslated) {
        /*
         * Next set the keyboard into "direct" mode and turn on
         * event translation. If either of these fails, we can't go
         * on.
         */
	tmp = 1;
	if (ioctl (fd, KIOCSDIRECT, &tmp) == -1) {
	    ErrorF("Setting keyboard direct mode");
	    return -1;
	}
	tmp = TR_UNTRANS_EVENT;
	if (ioctl (fd, KIOCTRANS, &tmp) == -1) {
	    ErrorF("Setting keyboard translation");
	    ErrorF ("sunChangeKbdTranslation: kbdFd=%d\n", fd);
	    return -1;
	}
    } else {
        /*
         * Next set the keyboard into "indirect" mode and turn off
         * event translation.
         */
	tmp = 0;
	(void)ioctl (fd, KIOCSDIRECT, &tmp);
	tmp = TR_ASCII;
	(void)ioctl (fd, KIOCTRANS, &tmp);
    }
    if (ioctl (fd, FIONREAD, &toread) != -1 && toread > 0) {
	while (toread) {
	    tmp = toread;
	    if (toread > sizeof (junk))
		tmp = sizeof (junk);
	    (void) read (fd, junk, tmp);
	    toread -= tmp;
	}
    }
#ifndef i386 /* { */
    (void) sigprocmask(SIG_SETMASK, &old_mask, NULL);
#else /* }{ */
    sigsetmask (old_mask);
#endif /* } */
    return 0;
}

/*ARGSUSED*/
Bool
LegalModifier(unsigned int key, DeviceIntPtr pDev)
{
    return TRUE;
}

File Added: xsrc/external/mit/xorg-server/dist/hw/sun/sunCfb.c

/* $Xorg: sunCfb.c,v 1.5 2001/02/09 02:04:43 xorgcvs Exp $ */

/*
Copyright 1990, 1998  The Open Group

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.

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Except as contained in this notice, the name of The Open Group shall not be
used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from The Open Group.
 */

/************************************************************
Copyright 1987 by Sun Microsystems, Inc. Mountain View, CA.

                    All Rights Reserved

Permission  to  use,  copy,  modify,  and  distribute   this
software  and  its documentation for any purpose and without
fee is hereby granted, provided that the above copyright no-
tice  appear  in all copies and that both that copyright no-
tice and this permission notice appear in  supporting  docu-
mentation,  and  that the names of Sun or The Open Group
not be used in advertising or publicity pertaining to
distribution  of  the software  without specific prior
written permission. Sun and The Open Group make no
representations about the suitability of this software for
any purpose. It is provided "as is" without any express or
implied warranty.

SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
THE USE OR PERFORMANCE OF THIS SOFTWARE.

********************************************************/

/* $XFree86: xc/programs/Xserver/hw/sun/sunCfb.c,v 3.15 2003/10/07 21:43:09 herrb Exp $ */

/*
 * Copyright 1987 by the Regents of the University of California
 * Copyright 1987 by Adam de Boor, UC Berkeley
 *
 * Permission to use, copy, modify, and distribute this
 * software and its documentation for any purpose and without
 * fee is hereby granted, provided that the above copyright
 * notice appear in all copies.  The University of California
 * makes no representations about the suitability of this
 * software for any purpose.  It is provided "as is" without
 * express or implied warranty.
 */

/****************************************************************/
/* Modified from  sunCG4C.c for X11R3 by Tom Jarmolowski	*/
/****************************************************************/

/*
 * Copyright 1991, 1992, 1993 Kaleb S. Keithley
 *
 * Permission to use, copy, modify, and distribute this
 * software and its documentation for any purpose and without
 * fee is hereby granted, provided that the above copyright
 * notice appear in all copies.  Kaleb S. Keithley makes no
 * representations about the suitability of this software for
 * any purpose.  It is provided "as is" without express or
 * implied warranty.
 */

#include "sun.h"
#include "fb.h"
#include "miline.h"

#define GXZEROLINEBIAS	(OCTANT1 | OCTANT3 | OCTANT4 | OCTANT6)

static void CGUpdateColormap(ScreenPtr, int, int, u_char *, u_char *, u_char *);
static void CGGetColormap(ScreenPtr, int, int, u_char *, u_char *, u_char *);
static void CGStoreColors(ColormapPtr, int, xColorItem *);
static void CGSaveColormap(ScreenPtr);
static void CGRestoreColormap(ScreenPtr);
static void CGScreenInitCommon(ScreenPtr);
static void CGScreenInit(ScreenPtr);
static void checkMono(void);
#ifdef INCLUDE_CG2_HEADER
static void CG2UpdateColormap(ScreenPtr, int, int, u_char *, u_char *, u_char *);
static void CG2GetColormap(ScreenPtr, int, int, u_char *, u_char *, u_char *);
static void CG2RestoreColormap(ScreenPtr);
static Bool CG2SaveScreen(ScreenPtr, int);
static void CG2ScreenInit(ScreenPtr pScreen);
#endif
static void CG4Switch(ScreenPtr, int);

static void
CGUpdateColormap(ScreenPtr pScreen, int dex, int count, u_char *rmap, u_char *gmap, u_char *bmap)
{
    struct fbcmap sunCmap;

    sunCmap.index = dex;
    sunCmap.count = count;
    sunCmap.red = &rmap[dex];
    sunCmap.green = &gmap[dex];
    sunCmap.blue = &bmap[dex];

    if (ioctl(sunFbs[pScreen->myNum].fd, FBIOPUTCMAP, &sunCmap) < 0) {
	ErrorF("CGUpdateColormap");
	FatalError( "CGUpdateColormap: FBIOPUTCMAP failed\n" );
    }
}

static void
CGGetColormap(ScreenPtr pScreen, int dex, int count, u_char *rmap, u_char *gmap, u_char *bmap)
{
    struct fbcmap sunCmap;

    sunCmap.index = dex;
    sunCmap.count = count;
    sunCmap.red = &rmap[dex];
    sunCmap.green = &gmap[dex];
    sunCmap.blue = &bmap[dex];

    if (ioctl(sunFbs[pScreen->myNum].fd, FBIOGETCMAP, &sunCmap) < 0) {
	ErrorF("CGGetColormap");
	FatalError( "CGGetColormap: FBIOGETCMAP failed\n" );
    }
}

void
sunInstallColormap(ColormapPtr cmap)
{
    sunScreenPtr pPrivate = sunGetScreenPrivate(cmap->pScreen);
    register int i;
    register Entry *pent;
    register VisualPtr pVisual = cmap->pVisual;
    u_char	  rmap[256], gmap[256], bmap[256];
    unsigned long rMask, gMask, bMask;
    int	oRed, oGreen, oBlue;

    if (cmap == pPrivate->installedMap)
	return;
    if (pPrivate->installedMap)
	WalkTree(pPrivate->installedMap->pScreen, TellLostMap,
		 (void *) &(pPrivate->installedMap->mid));
    if ((pVisual->class | DynamicClass) == DirectColor) {
	if (pVisual->ColormapEntries < 256) {
	    rMask = pVisual->redMask;
	    gMask = pVisual->greenMask;
	    bMask = pVisual->blueMask;
	    oRed = pVisual->offsetRed;
	    oGreen = pVisual->offsetGreen;
	    oBlue = pVisual->offsetBlue;
	} else {
	    rMask = gMask = bMask = 255;
	    oRed = oGreen = oBlue = 0;
	}
	for (i = 0; i < 256; i++) {
	    rmap[i] = cmap->red[(i & rMask) >> oRed].co.local.red >> 8;
	    gmap[i] = cmap->green[(i & gMask) >> oGreen].co.local.green >> 8;
	    bmap[i] = cmap->blue[(i & bMask) >> oBlue].co.local.blue >> 8;
	}
    } else {
	(*pPrivate->GetColormap) (cmap->pScreen, 0, 256, rmap, gmap, bmap);
	for (i = 0, pent = cmap->red;
	     i < pVisual->ColormapEntries;
	     i++, pent++) {
	    if (pent->fShared) {
		rmap[i] = pent->co.shco.red->color >> 8;
		gmap[i] = pent->co.shco.green->color >> 8;
		bmap[i] = pent->co.shco.blue->color >> 8;
	    }
	    else if (pent->refcnt != 0) {
		rmap[i] = pent->co.local.red >> 8;
		gmap[i] = pent->co.local.green >> 8;
		bmap[i] = pent->co.local.blue >> 8;
	    }
	}
    }
    pPrivate->installedMap = cmap;
    (*pPrivate->UpdateColormap) (cmap->pScreen, 0, 256, rmap, gmap, bmap);
    WalkTree(cmap->pScreen, TellGainedMap, (void *) &(cmap->mid));
}

void
sunUninstallColormap(ColormapPtr cmap)
{
    sunScreenPtr pPrivate = sunGetScreenPrivate(cmap->pScreen);
    if (cmap == pPrivate->installedMap) {
	Colormap defMapID = cmap->pScreen->defColormap;

	if (cmap->mid != defMapID) {
	    ColormapPtr defMap;
	    dixLookupResourceByType((void **)&defMap, defMapID, RT_COLORMAP,
				    serverClient, DixUseAccess);

	    if (defMap)
		(*cmap->pScreen->InstallColormap)(defMap);
	    else
	        ErrorF("sunFbs: Can't find default colormap\n");
	}
    }
}

int
sunListInstalledColormaps(ScreenPtr pScreen, Colormap *pCmapList)
{
    sunScreenPtr pPrivate = sunGetScreenPrivate(pScreen);
    *pCmapList = pPrivate->installedMap->mid;
    return (1);
}

static void
CGStoreColors(ColormapPtr pmap, int ndef, xColorItem *pdefs)
{
    sunScreenPtr pPrivate = sunGetScreenPrivate(pmap->pScreen);
    u_char	rmap[256], gmap[256], bmap[256];
    xColorItem	expanddefs[256];
    register int i;

    if (pPrivate->installedMap != NULL && pPrivate->installedMap != pmap)
	return;
    if ((pmap->pVisual->class | DynamicClass) == DirectColor) {
	ndef = fbExpandDirectColors(pmap, ndef, pdefs, expanddefs);
	pdefs = expanddefs;
    }
    while (ndef--) {
	i = pdefs->pixel;
	rmap[i] = pdefs->red >> 8;
	gmap[i] = pdefs->green >> 8;
	bmap[i] = pdefs->blue >> 8;
	(*pPrivate->UpdateColormap) (pmap->pScreen, i, 1, rmap, gmap, bmap);
	pdefs++;
    }
}

static void
CGSaveColormap(ScreenPtr pScreen)
{
    sunScreenPtr pPrivate = sunGetScreenPrivate(pScreen);
    sunCmapPtr origColormap;
    u_char *rmap, *gmap, *bmap;

    origColormap = &pPrivate->origColormap;
    rmap = origColormap->origRed;
    gmap = origColormap->origGreen;
    bmap = origColormap->origBlue;
    (*pPrivate->GetColormap)(pScreen, 0, NCMAP, rmap, gmap, bmap);
}

static void
CGRestoreColormap(ScreenPtr pScreen)
{
    sunScreenPtr pPrivate = sunGetScreenPrivate(pScreen);
    sunCmapPtr origColormap;
    u_char *rmap, *gmap, *bmap;

    if (pPrivate->origColormapValid) {
	origColormap = &pPrivate->origColormap;
	rmap = origColormap->origRed;
	gmap = origColormap->origGreen;
	bmap = origColormap->origBlue;
	(*pPrivate->UpdateColormap)(pScreen, 0, NCMAP, rmap, gmap, bmap);
    }
}

static void
CGScreenInitCommon(ScreenPtr pScreen)
{
    pScreen->InstallColormap = sunInstallColormap;
    pScreen->UninstallColormap = sunUninstallColormap;
    pScreen->ListInstalledColormaps = sunListInstalledColormaps;
    pScreen->StoreColors = CGStoreColors;
    if (sunFlipPixels) {
	Pixel pixel = pScreen->whitePixel;
	pScreen->whitePixel = pScreen->blackPixel;
	pScreen->blackPixel = pixel;
    }
}

static void
CGScreenInit(ScreenPtr pScreen)
{
    sunScreenPtr pPrivate = sunGetScreenPrivate(pScreen);

    CGScreenInitCommon(pScreen);
    pPrivate->UpdateColormap = CGUpdateColormap;
    pPrivate->GetColormap = CGGetColormap;
    pPrivate->RestoreColormap = CGRestoreColormap;

    CGSaveColormap(pScreen);
    pPrivate->origColormapValid = TRUE;
}

static void
checkMono(void)
{

    if (sunForceMono)
	ErrorF("-mono not appropriate for CG3/CG4/CG6\n");
}

/*
 * CG3_MMAP_OFFSET is #defined in <pixrect/cg3var.h> or <sys/cg3var.h>
 * on  SunOS and Solaris respectively.  Under Solaris, cg3var.h
 * #includes a non-existent file, and causes the make to abort.  Other
 * systems may not have cg3var.h at all.  Since all cg3var.h is needed
 * for is this one #define, we'll just #define it here and let it go at that.
 */

#define CG3_MMAP_OFFSET 0x04000000

Bool
sunCG3Init(
    ScreenPtr	  pScreen,  	/* The Screen to initialize */
    int	    	  argc,	    	/* The number of the Server's arguments. */
    char    	  **argv   	/* The arguments themselves. Don't change! */
)
{
    int	screen = pScreen->myNum;

    checkMono();
    sunFbs[screen].EnterLeave = (void (*)(ScreenPtr, int))NoopDDA;
    return sunInitCommon (screen, pScreen, (off_t) CG3_MMAP_OFFSET,
	sunCfbScreenInit, CGScreenInit,
	fbCreateDefColormap, sunSaveScreen, 0);
}

Bool
sunTCXInit(
    ScreenPtr	  pScreen,  	/* The Screen to initialize */
    int	    	  argc,	    	/* The number of the Server's arguments. */
    char    	  **argv   	/* The arguments themselves. Don't change! */
)
{
    int	screen = pScreen->myNum;

    checkMono();
    sunFbs[screen].EnterLeave = (void (*)(ScreenPtr, int))NoopDDA;
    return sunInitCommon (screen, pScreen, (off_t) 0,
	sunCfbScreenInit, CGScreenInit,
	fbCreateDefColormap, sunSaveScreen, 0);
}

#if !defined(i386) /* { */

#ifdef SVR4 /* { */
#ifdef INCLUDE_CG2_HEADER /* { */
#include <sys/cg2reg.h>
#endif /* } INCLUDE_CG2_HEADER */
#else
#ifndef CSRG_BASED /* { */
#include <pixrect/cg2reg.h>
#else
#if defined(__sparc__) || defined(__sparc) /* { */
#if !defined(__bsdi__)
#include <machine/cgtworeg.h>
#endif
#else
#include <machine/cg2reg.h>
#endif /* } */
#endif /* } */
#endif /* } */

#ifdef INCLUDE_CG2_HEADER
typedef struct {
    struct cg2memfb	mem;
    struct cg2fb 	regs;
} *CG2Ptr;

static void
CG2UpdateColormap(ScreenPtr pScreen, int index, int count, u_char *rmap, u_char *gmap, u_char *bmap)
{
    CG2Ptr	fb = (CG2Ptr) sunFbs[pScreen->myNum].fb;
    volatile struct cg2statusreg *regp = &fb->regs.status.reg;

    regp->update_cmap = 0;
    while (count--) {
	fb->regs.redmap[index] = rmap[index];
	fb->regs.greenmap[index] = gmap[index];
	fb->regs.bluemap[index] = bmap[index];
	index++;
    }
    regp->update_cmap = 1;
}

static void
CG2GetColormap(ScreenPtr pScreen, int index, int count, u_char *rmap, u_char *gmap, u_char *bmap)
{
    CG2Ptr	fb = (CG2Ptr) sunFbs[pScreen->myNum].fb;

    /* I don't even know if this works */
    while (count--) {
	rmap[index] = fb->regs.redmap[index];
	gmap[index] = fb->regs.greenmap[index];
	bmap[index] = fb->regs.bluemap[index];
	index++;
    }
}

static void
CG2RestoreColormap(ScreenPtr pScreen)
{
    int screen = pScreen->myNum;

    CGRestoreColormap(pScreen);
    ((CG2Ptr)sunFbs[screen].fb)->regs.ppmask.reg = 1;
}

static Bool
CG2SaveScreen(ScreenPtr pScreen, int on)
{
    CG2Ptr	fb = (CG2Ptr) sunFbs[pScreen->myNum].fb;
    volatile struct cg2statusreg *regp = &fb->regs.status.reg;

    if (on != SCREEN_SAVER_FORCER)
	regp->video_enab = (on == SCREEN_SAVER_ON) ? 0 : 1;
    return TRUE;
}

static void
CG2ScreenInit(ScreenPtr pScreen)
{
    sunScreenPtr pPrivate = sunGetScreenPrivate(pScreen);

    CGScreenInitCommon(pScreen);
    pPrivate->UpdateColormap = CG2UpdateColormap;
    pPrivate->GetColormap = CG2GetColormap;
    pPrivate->RestoreColormap = CG2RestoreColormap;

    CGSaveColormap(pScreen);
    pPrivate->origColormapValid = TRUE;
}

Bool
sunCG2Init(
    ScreenPtr	pScreen,  	/* The Screen to initialize */
    int		argc,	    	/* The number of the Server's arguments. */
    char**	argv	   	/* The arguments themselves. Don't change! */
)
{
    int 	screen = pScreen->myNum;
    Bool	ret;

    sunFbs[screen].EnterLeave = (void (*)(ScreenPtr, int))NoopDDA;
    pScreen->SaveScreen = CG2SaveScreen;
#ifndef LOWMEMFTPT
    if (sunForceMono) {
	pScreen->whitePixel = 0;
	pScreen->blackPixel = 1;
	sunFbs[screen].info.fb_depth = 1;
	ret = sunInitCommon (screen, pScreen, (off_t) 0,
			fbScreenInit, NULL,
			fbCreateDefColormap, CG2SaveScreen, 0);
	((CG2Ptr) sunFbs[screen].fb)->regs.ppmask.reg = 1;
    } else {
#endif /* ifndef LOWMEMFTPT */
	ret = sunInitCommon (screen, pScreen, (off_t) 0,
			sunCfbScreenInit, CG2ScreenInit,
			fbCreateDefColormap, CG2SaveScreen,
			offsetof(struct cg2memfb, pixplane));
	((CG2Ptr) sunFbs[screen].fb)->regs.ppmask.reg = 0xFF;
#ifndef LOWMEMFTPT
    }
#endif /* ifndef LOWMEMFTPT */
    return ret;
}
#endif /* INCLUDE_CG2_HEADER */

#define	CG4_HEIGHT	900
#define	CG4_WIDTH	1152

#define	CG4_MELEN	    (128*1024)

typedef struct {
    u_char mpixel[CG4_MELEN];		/* bit-per-pixel memory */
    u_char epixel[CG4_MELEN];		/* enable plane */
    u_char cpixel[CG4_HEIGHT][CG4_WIDTH];	/* byte-per-pixel memory */
} *CG4Ptr, CG4Rec;

static void
CG4Switch(ScreenPtr pScreen, int select)
{
    CG4Ptr	fb = (CG4Ptr) sunFbs[pScreen->myNum].fb;

    (void) memset ((char *)fb->epixel, select ? ~0 : 0, CG4_MELEN);
}

Bool
sunCG4Init(
    ScreenPtr	pScreen,  	/* The Screen to initialize */
    int		argc,	    	/* The number of the Server's arguments. */
    char**	argv    	/* The arguments themselves. Don't change! */
)
{
    int screen = pScreen->myNum;

    checkMono();
    if (sunCG4Frob)
	sunFbs[screen].EnterLeave = (void (*)(ScreenPtr, int))NoopDDA;
    else
	sunFbs[screen].EnterLeave = CG4Switch;
    return sunInitCommon (screen, pScreen, (off_t) 0,
	sunCfbScreenInit, CGScreenInit,
	fbCreateDefColormap, sunSaveScreen, offsetof(CG4Rec, cpixel));
}

#ifdef FBTYPE_SUNFAST_COLOR /* { */

#define CG6_MMAP_OFFSET 0x70000000
#define CG6_IMAGE_OFFSET 0x16000

Bool
sunCG6Init(
    ScreenPtr	pScreen,  	/* The Screen to initialize */
    int		argc,	    	/* The number of the Server's arguments. */
    char**	argv	   	/* The arguments themselves. Don't change! */
)
{
    void *fb;
    int screen = pScreen->myNum;

    checkMono();
    if (!sunScreenAllocate (pScreen))
	return FALSE;
    if (!sunFbs[screen].fb) {
/* Sun's VME, Sbus, and SVR4 drivers all return different values */
#define FBSIZE (size_t) sunFbs[screen].info.fb_width * \
			sunFbs[screen].info.fb_height + CG6_IMAGE_OFFSET
	if ((fb = sunMemoryMap (FBSIZE,
			     (off_t) CG6_MMAP_OFFSET,
			     sunFbs[screen].fd)) == NULL)
	    return FALSE;
	sunFbs[screen].fb = fb;
#undef FBSIZE
    }
    sunFbs[screen].EnterLeave = (void (*)(ScreenPtr, int))NoopDDA;
    if (!sunCfbSetupScreen (pScreen,
	    sunFbs[screen].fb + CG6_IMAGE_OFFSET,
	    sunFbs[screen].info.fb_width,
	    sunFbs[screen].info.fb_height,
	    monitorResolution, monitorResolution,
	    sunFbs[screen].info.fb_width,
	    sunFbs[screen].info.fb_depth))
	return FALSE;
#ifndef LOWMEMFTPT
#if 0 /* XXX no GX support for now */
    if (sunNoGX == FALSE) {
	if (!sunGXInit (pScreen, &sunFbs[screen]))
	    return FALSE;
    }
#endif
#endif /* ifndef LOWMEMFTPT */
    if (!sunCfbFinishScreenInit(pScreen,
	    sunFbs[screen].fb + CG6_IMAGE_OFFSET,
	    sunFbs[screen].info.fb_width,
	    sunFbs[screen].info.fb_height,
	    monitorResolution, monitorResolution,
	    sunFbs[screen].info.fb_width,
	    sunFbs[screen].info.fb_depth))
	return FALSE;
    if (sunNoGX == FALSE) {
	miSetZeroLineBias(pScreen, GXZEROLINEBIAS);
    }
    CGScreenInit (pScreen);
    if (!sunScreenInit (pScreen))
	return FALSE;
    sunSaveScreen (pScreen, SCREEN_SAVER_OFF);
    return fbCreateDefColormap(pScreen);
}
#endif /* } */
#endif /* } */

File Added: xsrc/external/mit/xorg-server/dist/hw/sun/sunFbs.c

/* $Xorg: sunFbs.c,v 1.4 2001/02/09 02:04:43 xorgcvs Exp $ */

/*
Copyright 1990, 1993, 1998  The Open Group

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.

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Except as contained in this notice, the name of The Open Group shall not be
used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from The Open Group.
 */

/************************************************************
Copyright 1987 by Sun Microsystems, Inc. Mountain View, CA.

                    All Rights Reserved

Permission  to  use,  copy,  modify,  and  distribute   this
software  and  its documentation for any purpose and without
fee is hereby granted, provided that the above copyright no-
tice  appear  in all copies and that both that copyright no-
tice and this permission notice appear in  supporting  docu-
mentation,  and  that the names of Sun or The Open Group
not be used in advertising or publicity pertaining to
distribution  of  the software  without specific prior
written permission. Sun and The Open Group make no
representations about the suitability of this software for
any purpose. It is provided "as is" without any express or
implied warranty.

SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
THE USE OR PERFORMANCE OF THIS SOFTWARE.

********************************************************/

/*
 * Copyright 1987 by the Regents of the University of California
 * Copyright 1987 by Adam de Boor, UC Berkeley
 *
 * Permission to use, copy, modify, and distribute this
 * software and its documentation for any purpose and without
 * fee is hereby granted, provided that the above copyright
 * notice appear in all copies.  The University of California
 * makes no representations about the suitability of this
 * software for any purpose.  It is provided "as is" without
 * express or implied warranty.
 */

/* $XFree86: xc/programs/Xserver/hw/sun/sunFbs.c,v 1.8 2003/11/17 22:20:36 dawes Exp $ */

/****************************************************************/
/* Modified from  sunCG4C.c for X11R3 by Tom Jarmolowski	*/
/****************************************************************/

#include "sun.h"
#include <sys/mman.h>

static Bool closeScreen(ScreenPtr pScreen);

int sunScreenIndex;

DevPrivateKeyRec sunScreenPrivateKeyRec;

void *
sunMemoryMap(size_t len, off_t off, int fd)
{
    int		pagemask, mapsize;
    caddr_t	addr;
    void	*mapaddr;

#ifdef SVR4
    pagemask = sysconf(_SC_PAGESIZE) - 1;
#else
    pagemask = getpagesize() - 1;
#endif
    mapsize = ((int) len + pagemask) & ~pagemask;
    addr = 0;

#if !defined(__bsdi__) && !defined(_MAP_NEW) && !defined(__NetBSD__) && !defined(__OpenBSD__)
    if ((addr = (caddr_t) valloc (mapsize)) == NULL) {
	ErrorF("Couldn't allocate frame buffer memory");
	(void) close (fd);
	return NULL;
    }
#endif

#if !defined(__NetBSD__) && !defined(__OpenBSD__)
    /*
     * try and make it private first, that way once we get it, an
     * interloper, e.g. another server, can't get this frame buffer,
     * and if another server already has it, this one won't.
     */
    if ((int)(mapaddr = (void *) mmap (addr,
		mapsize,
		PROT_READ | PROT_WRITE, MAP_PRIVATE,
		fd, off)) == -1)
#endif
	mapaddr = mmap (addr,
		    mapsize,
		    PROT_READ | PROT_WRITE, MAP_SHARED,
		    fd, off);
    if (mapaddr == (void *) -1) {
	ErrorF("mapping frame buffer memory");
	(void) close (fd);
	mapaddr = NULL;
    }
    return mapaddr;
}

Bool
sunScreenAllocate(ScreenPtr pScreen)
{
    sunScreenPtr    pPrivate;

    if (!dixRegisterPrivateKey(&sunScreenPrivateKeyRec, PRIVATE_SCREEN, 0)) {
	ErrorF("dixRegisterPrivateKey failed");
	return FALSE;
    }
    pPrivate = calloc(1, sizeof (sunScreenRec));
    if (!pPrivate)
	return FALSE;

    pPrivate->origColormapValid = FALSE;
    sunSetScreenPrivate(pScreen, pPrivate);
    return TRUE;
}

Bool
sunSaveScreen(ScreenPtr pScreen, int on)
{
    int		state;

    if (on != SCREEN_SAVER_FORCER)
    {
	if (on == SCREEN_SAVER_ON)
	    state = 0;
	else
	    state = 1;
	(void) ioctl(sunFbs[pScreen->myNum].fd, FBIOSVIDEO, &state);
    }
    return( TRUE );
}

static Bool
closeScreen(ScreenPtr pScreen)
{
    sunScreenPtr pPrivate = sunGetScreenPrivate(pScreen);
    Bool    ret;

    (void) OsSignal (SIGIO, SIG_IGN);
#if 0	/* XXX GX is disabled for now */
    sunDisableCursor (pScreen);
#endif
    if (pPrivate->origColormapValid)
	(*pPrivate->RestoreColormap)(pScreen);
    pScreen->CloseScreen = pPrivate->CloseScreen;
    ret = (*pScreen->CloseScreen) (pScreen);
    (void) (*pScreen->SaveScreen) (pScreen, SCREEN_SAVER_OFF);
    free (pPrivate);
    return ret;
}

Bool
sunScreenInit(ScreenPtr pScreen)
{
    sunScreenPtr pPrivate = sunGetScreenPrivate(pScreen);

    pPrivate->installedMap = 0;
    pPrivate->CloseScreen = pScreen->CloseScreen;
    pScreen->CloseScreen = closeScreen;
    pScreen->SaveScreen = sunSaveScreen;
#if 0	/* XXX GX is disabled for now */
    if (!sunCursorInitialize (pScreen))
#endif
	miDCInitialize (pScreen, &sunPointerScreenFuncs);
    return TRUE;
}

Bool
sunInitCommon(
    int		scrn,
    ScreenPtr	pScrn,
    off_t	offset,
    Bool	(*init1)(ScreenPtr, void *, int, int, int, int, int, int),
    void	(*init2)(ScreenPtr),
    Bool	(*cr_cm)(ScreenPtr),
    Bool	(*save)(ScreenPtr, int),
    int		fb_off
)
{
    unsigned char*	fb = sunFbs[scrn].fb;

    if (!sunScreenAllocate (pScrn))
	return FALSE;
    if (!fb) {
	if ((fb = sunMemoryMap ((size_t) sunFbs[scrn].info.fb_size,
			     offset,
			     sunFbs[scrn].fd)) == NULL)
	    return FALSE;
	sunFbs[scrn].fb = fb;
    }
    /* mfbScreenInit() or cfbScreenInit() */
    if (!(*init1)(pScrn, fb + fb_off,
	    sunFbs[scrn].info.fb_width,
	    sunFbs[scrn].info.fb_height,
	    monitorResolution, monitorResolution,
	    sunFbs[scrn].info.fb_width,
	    sunFbs[scrn].info.fb_depth))
	    return FALSE;
    /* sunCGScreenInit() if cfb... */
    if (init2)
	(*init2)(pScrn);
    if (!sunScreenInit(pScrn))
	return FALSE;
    (void) (*save) (pScrn, SCREEN_SAVER_OFF);
    return (*cr_cm)(pScrn);
}


File Added: xsrc/external/mit/xorg-server/dist/hw/sun/sunKeyMap.c
/* $Xorg: sunKeyMap.c,v 1.3 2000/08/17 19:48:30 cpqbld Exp $ */
/************************************************************
Copyright 1987 by Sun Microsystems, Inc. Mountain View, CA.

                    All Rights Reserved

Permission  to  use,  copy,  modify,  and  distribute   this
software  and  its documentation for any purpose and without
fee is hereby granted, provided that the above copyright no-
tice  appear  in all copies and that both that copyright no-
tice and this permission notice appear in  supporting  docu-
mentation,  and  that the names of Sun or The Open Group
not be used in advertising or publicity pertaining to
distribution  of  the software  without specific prior
written permission. Sun and The Open Group make no
representations about the suitability of this software for
any purpose. It is provided "as is" without any express or
implied warranty.

SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
THE USE OR PERFORMANCE OF THIS SOFTWARE.

********************************************************/
/* $XFree86: xc/programs/Xserver/hw/sun/sunKeyMap.c,v 1.4 2001/10/28 03:33:12 tsi Exp $ */

#include	"sun.h"
#define		XK_KATAKANA
#include	<X11/keysym.h>
#include	<X11/Sunkeysym.h>

/*
  By default all keyboards are hardcoded on the theory that people
  might remove /usr/openwin making it impossible to parse the files
 in /usr/openwin/share/etc/keytables.
*/
#define CAN4
#define CANFR5
#define DEN4
#define DEN5
#define FR5
#define FRBE4
#define GER4
#define GER5
#define ITALY4
#define ITALY5
#define JAPAN4
#define JAPAN5
#define KOREA4
#define KOREA5
#define NETH4
#define NETH5
#define NORW4
#define NORW5
#define PORT4
#define PORT5
#define SPAIN5
#define SPAINLATAM4
#define SWED5
#define SWEDFIN4
#define SWFR4
#define SWFR5
#define SWGE4
#define SWGE5
#define TAI4
#define TAI5
#define UK4
#define UK5
#define US101A
#define US2
#define US3
#define US4
#define US5
#define US_UNIX5

/*
 *	XXX - Its not clear what to map these to for now.
 *	keysyms.h doesn't define enough function key names.
 */

#ifndef	XK_L1
#define	XK_L1	XK_Cancel
#define	XK_L2	XK_Redo
#define	XK_R1	NoSymbol
#define	XK_R2	NoSymbol
#define	XK_R3	NoSymbol
#define	XK_L3	XK_Menu
#define	XK_L4	XK_Undo
#define	XK_R4	NoSymbol
#define	XK_R5	NoSymbol
#define	XK_R6	NoSymbol
#define	XK_L5	XK_Insert
#define	XK_L6	XK_Select
#define	XK_R7	NoSymbol
#define	XK_R8	XK_Up
#define	XK_R9	NoSymbol
#define	XK_L7	XK_Execute
#define	XK_L8	XK_Print
#define	XK_R10	XK_Left
#define	XK_R11	XK_Home
#define	XK_R12	XK_Right
#define	XK_L9	XK_Find
#define	XK_L10	XK_Help
#define	XK_R13	NoSymbol
#define	XK_R14	XK_Down
#define	XK_R15	NoSymbol
#endif

#ifdef US2

static KeySym US2Keymap[] = {
	XK_L1,		NoSymbol,		/* 0x1 */
	NoSymbol,	NoSymbol,		/* 0x2 */
	XK_L2,		NoSymbol,		/* 0x3 */
	NoSymbol,	NoSymbol,		/* 0x4 */
	XK_F1,		NoSymbol,		/* 0x5 */
	XK_F2,		NoSymbol,		/* 0x6 */
	NoSymbol,	NoSymbol,		/* 0x7 */
	XK_F3,		NoSymbol,		/* 0x8 */
	NoSymbol,	NoSymbol,		/* 0x9 */
	XK_F4,		NoSymbol,		/* 0xa */
	NoSymbol,	NoSymbol,		/* 0xb */
	XK_F5,		NoSymbol,		/* 0xc */
	NoSymbol,	NoSymbol,		/* 0xd */
	XK_F6,		NoSymbol,		/* 0xe */
	NoSymbol,	NoSymbol,		/* 0xf */
	XK_F7,		NoSymbol,		/* 0x10 */
	XK_F8,		NoSymbol,		/* 0x11 */
	XK_F9,		NoSymbol,		/* 0x12 */
	XK_Break,	NoSymbol,		/* 0x13 */
	NoSymbol,	NoSymbol,		/* 0x14 */
	XK_R1,		NoSymbol,		/* 0x15 */
	XK_R2,		NoSymbol,		/* 0x16 */
	XK_R3,		NoSymbol,		/* 0x17 */
	NoSymbol,	NoSymbol,		/* 0x18 */
	XK_L3,		NoSymbol,		/* 0x19 */
	XK_L4,		NoSymbol,		/* 0x1a */
	NoSymbol,	NoSymbol,		/* 0x1b */
	NoSymbol,	NoSymbol,		/* 0x1c */
	XK_Escape,	NoSymbol,		/* 0x1d */
	XK_1,		XK_exclam,		/* 0x1e */
	XK_2,		XK_at,			/* 0x1f */
	XK_3,		XK_numbersign,		/* 0x20 */
	XK_4,		XK_dollar,		/* 0x21 */
	XK_5,		XK_percent,		/* 0x22 */
	XK_6,		XK_asciicircum,		/* 0x23 */
	XK_7,		XK_ampersand,		/* 0x24 */
	XK_8,		XK_asterisk,		/* 0x25 */
	XK_9,		XK_parenleft,		/* 0x26 */
	XK_0,		XK_parenright,		/* 0x27 */
	XK_minus,	XK_underscore,		/* 0x28 */
	XK_equal,	XK_plus,		/* 0x29 */
	XK_grave,	XK_asciitilde,		/* 0x2a */
	XK_BackSpace,	NoSymbol,		/* 0x2b */
	NoSymbol,	NoSymbol,		/* 0x2c */
	XK_R4,		NoSymbol,		/* 0x2d */
	XK_R5,		NoSymbol,		/* 0x2e */
	XK_R6,		NoSymbol,		/* 0x2f */
	NoSymbol,	NoSymbol,		/* 0x30 */
	XK_L5,		NoSymbol,		/* 0x31 */
	NoSymbol,	NoSymbol,		/* 0x32 */
	XK_L6,		NoSymbol,		/* 0x33 */
	NoSymbol,	NoSymbol,		/* 0x34 */
	XK_Tab,		NoSymbol,		/* 0x35 */
	XK_Q,		NoSymbol,		/* 0x36 */
	XK_W,		NoSymbol,		/* 0x37 */
	XK_E,		NoSymbol,		/* 0x38 */
	XK_R,		NoSymbol,		/* 0x39 */
	XK_T,		NoSymbol,		/* 0x3a */
	XK_Y,		NoSymbol,		/* 0x3b */
	XK_U,		NoSymbol,		/* 0x3c */
	XK_I,		NoSymbol,		/* 0x3d */
	XK_O,		NoSymbol,		/* 0x3e */
	XK_P,		NoSymbol,		/* 0x3f */
	XK_bracketleft,	XK_braceleft,		/* 0x40 */
	XK_bracketright,	XK_braceright,	/* 0x41 */
	XK_Delete,	NoSymbol,		/* 0x42 */
	NoSymbol,	NoSymbol,		/* 0x43 */
	XK_R7,		NoSymbol,		/* 0x44 */
	XK_Up,		XK_R8,			/* 0x45 */
	XK_R9,		NoSymbol,		/* 0x46 */
	NoSymbol,	NoSymbol,		/* 0x47 */
	XK_L7,		NoSymbol,		/* 0x48 */
	XK_L8,		NoSymbol,		/* 0x49 */
	NoSymbol,	NoSymbol,		/* 0x4a */
	NoSymbol,	NoSymbol,		/* 0x4b */
	XK_Control_L,	NoSymbol,		/* 0x4c */
	XK_A,		NoSymbol,		/* 0x4d */
	XK_S,		NoSymbol,		/* 0x4e */
	XK_D,		NoSymbol,		/* 0x4f */
	XK_F,		NoSymbol,		/* 0x50 */
	XK_G,		NoSymbol,		/* 0x51 */
	XK_H,		NoSymbol,		/* 0x52 */
	XK_J,		NoSymbol,		/* 0x53 */
	XK_K,		NoSymbol,		/* 0x54 */
	XK_L,		NoSymbol,		/* 0x55 */
	XK_semicolon,	XK_colon,		/* 0x56 */
	XK_apostrophe,	XK_quotedbl,		/* 0x57 */
	XK_backslash,	XK_bar,			/* 0x58 */
	XK_Return,	NoSymbol,		/* 0x59 */
	NoSymbol,	NoSymbol,		/* 0x5a */
	XK_Left,	XK_R10,			/* 0x5b */
	XK_R11,		NoSymbol,		/* 0x5c */
	XK_Right,	XK_R12,			/* 0x5d */
	NoSymbol,	NoSymbol,		/* 0x5e */
	XK_L9,		NoSymbol,		/* 0x5f */
	NoSymbol,	NoSymbol,		/* 0x60 */
	XK_L10,		NoSymbol,		/* 0x61 */
	NoSymbol,	NoSymbol,		/* 0x62 */
	XK_Shift_L,	NoSymbol,		/* 0x63 */
	XK_Z,		NoSymbol,		/* 0x64 */
	XK_X,		NoSymbol,		/* 0x65 */
	XK_C,		NoSymbol,		/* 0x66 */
	XK_V,		NoSymbol,		/* 0x67 */
	XK_B,		NoSymbol,		/* 0x68 */
	XK_N,		NoSymbol,		/* 0x69 */
	XK_M,		NoSymbol,		/* 0x6a */
	XK_comma,	XK_less,		/* 0x6b */
	XK_period,	XK_greater,		/* 0x6c */
	XK_slash,	XK_question,		/* 0x6d */
	XK_Shift_R,	NoSymbol,		/* 0x6e */
	XK_Linefeed,	NoSymbol,		/* 0x6f */
	XK_R13,		NoSymbol,		/* 0x70 */
	XK_Down,	XK_R14,			/* 0x71 */
	XK_R15,		NoSymbol,		/* 0x72 */
	NoSymbol,	NoSymbol,		/* 0x73 */
	NoSymbol,	NoSymbol,		/* 0x74 */
	NoSymbol,	NoSymbol,		/* 0x75 */
	NoSymbol,	NoSymbol,		/* 0x76 */
	NoSymbol,	NoSymbol,		/* 0x77 */
	XK_Meta_L,	NoSymbol,		/* 0x78 */
	XK_space,	NoSymbol,		/* 0x79 */
	XK_Meta_R,	NoSymbol,		/* 0x7a */
	NoSymbol,	NoSymbol,		/* 0x7b */
	NoSymbol,	NoSymbol,		/* 0x7c */
	NoSymbol,	NoSymbol,		/* 0x7d */
	NoSymbol,	NoSymbol,		/* 0x7e */
	NoSymbol,	NoSymbol,		/* 0x7f */
};

#else

#define US2Keymap NULL

#endif /* US2 */

#ifdef US3

static KeySym US3Keymap[] = {
	XK_L1,		NoSymbol,		/* 0x1 */
	NoSymbol,	NoSymbol,		/* 0x2 */
	XK_L2,		NoSymbol,		/* 0x3 */
	NoSymbol,	NoSymbol,		/* 0x4 */
	XK_F1,		NoSymbol,		/* 0x5 */
	XK_F2,		NoSymbol,		/* 0x6 */
	NoSymbol,	NoSymbol,		/* 0x7 */
	XK_F3,		NoSymbol,		/* 0x8 */
	NoSymbol,	NoSymbol,		/* 0x9 */
	XK_F4,		NoSymbol,		/* 0xa */
	NoSymbol,	NoSymbol,		/* 0xb */
	XK_F5,		NoSymbol,		/* 0xc */
	NoSymbol,	NoSymbol,		/* 0xd */
	XK_F6,		NoSymbol,		/* 0xe */
	NoSymbol,	NoSymbol,		/* 0xf */
	XK_F7,		NoSymbol,		/* 0x10 */
	XK_F8,		NoSymbol,		/* 0x11 */
	XK_F9,		NoSymbol,		/* 0x12 */
	XK_Alt_R,	NoSymbol,		/* 0x13 */
	NoSymbol,	NoSymbol,		/* 0x14 */
	XK_R1,		NoSymbol,		/* 0x15 */
	XK_R2,		NoSymbol,		/* 0x16 */
	XK_R3,		NoSymbol,		/* 0x17 */
	NoSymbol,	NoSymbol,		/* 0x18 */
	XK_L3,		NoSymbol,		/* 0x19 */
	XK_L4,		NoSymbol,		/* 0x1a */
	NoSymbol,	NoSymbol,		/* 0x1b */
	NoSymbol,	NoSymbol,		/* 0x1c */
	XK_Escape,	NoSymbol,		/* 0x1d */
	XK_1,		XK_exclam,		/* 0x1e */
	XK_2,		XK_at,			/* 0x1f */
	XK_3,		XK_numbersign,		/* 0x20 */
	XK_4,		XK_dollar,		/* 0x21 */
	XK_5,		XK_percent,		/* 0x22 */
	XK_6,		XK_asciicircum,		/* 0x23 */
	XK_7,		XK_ampersand,		/* 0x24 */
	XK_8,		XK_asterisk,		/* 0x25 */
	XK_9,		XK_parenleft,		/* 0x26 */
	XK_0,		XK_parenright,		/* 0x27 */
	XK_minus,	XK_underscore,		/* 0x28 */
	XK_equal,	XK_plus,		/* 0x29 */
	XK_grave,	XK_asciitilde,		/* 0x2a */
	XK_BackSpace,	NoSymbol,		/* 0x2b */
	NoSymbol,	NoSymbol,		/* 0x2c */
	XK_R4,		NoSymbol,		/* 0x2d */
	XK_R5,		NoSymbol,		/* 0x2e */
	XK_R6,		NoSymbol,		/* 0x2f */
	NoSymbol,	NoSymbol,		/* 0x30 */
	XK_L5,		NoSymbol,		/* 0x31 */
	NoSymbol,	NoSymbol,		/* 0x32 */
	XK_L6,		NoSymbol,		/* 0x33 */
	NoSymbol,	NoSymbol,		/* 0x34 */
	XK_Tab,		NoSymbol,		/* 0x35 */
	XK_Q,		NoSymbol,		/* 0x36 */
	XK_W,		NoSymbol,		/* 0x37 */
	XK_E,		NoSymbol,		/* 0x38 */
	XK_R,		NoSymbol,		/* 0x39 */
	XK_T,		NoSymbol,		/* 0x3a */
	XK_Y,		NoSymbol,		/* 0x3b */
	XK_U,		NoSymbol,		/* 0x3c */
	XK_I,		NoSymbol,		/* 0x3d */
	XK_O,		NoSymbol,		/* 0x3e */
	XK_P,		NoSymbol,		/* 0x3f */
	XK_bracketleft,	XK_braceleft,		/* 0x40 */
	XK_bracketright,	XK_braceright,	/* 0x41 */
	XK_Delete,	NoSymbol,		/* 0x42 */
	NoSymbol,	NoSymbol,		/* 0x43 */
	XK_R7,		NoSymbol,		/* 0x44 */
	XK_Up,		XK_R8,			/* 0x45 */
	XK_R9,		NoSymbol,		/* 0x46 */
	NoSymbol,	NoSymbol,		/* 0x47 */
	XK_L7,		NoSymbol,		/* 0x48 */
	XK_L8,		NoSymbol,		/* 0x49 */
	NoSymbol,	NoSymbol,		/* 0x4a */
	NoSymbol,	NoSymbol,		/* 0x4b */
	XK_Control_L,	NoSymbol,		/* 0x4c */
	XK_A,		NoSymbol,		/* 0x4d */
	XK_S,		NoSymbol,		/* 0x4e */
	XK_D,		NoSymbol,		/* 0x4f */
	XK_F,		NoSymbol,		/* 0x50 */
	XK_G,		NoSymbol,		/* 0x51 */
	XK_H,		NoSymbol,		/* 0x52 */
	XK_J,		NoSymbol,		/* 0x53 */
	XK_K,		NoSymbol,		/* 0x54 */
	XK_L,		NoSymbol,		/* 0x55 */
	XK_semicolon,	XK_colon,		/* 0x56 */
	XK_apostrophe,	XK_quotedbl,		/* 0x57 */
	XK_backslash,	XK_bar,			/* 0x58 */
	XK_Return,	NoSymbol,		/* 0x59 */
	NoSymbol,	NoSymbol,		/* 0x5a */
	XK_Left,	XK_R10,			/* 0x5b */
	XK_R11,		NoSymbol,		/* 0x5c */
	XK_Right,	XK_R12,			/* 0x5d */
	NoSymbol,	NoSymbol,		/* 0x5e */
	XK_L9,		NoSymbol,		/* 0x5f */
	NoSymbol,	NoSymbol,		/* 0x60 */
	XK_L10,		NoSymbol,		/* 0x61 */
	NoSymbol,	NoSymbol,		/* 0x62 */
	XK_Shift_L,	NoSymbol,		/* 0x63 */
	XK_Z,		NoSymbol,		/* 0x64 */
	XK_X,		NoSymbol,		/* 0x65 */
	XK_C,		NoSymbol,		/* 0x66 */
	XK_V,		NoSymbol,		/* 0x67 */
	XK_B,		NoSymbol,		/* 0x68 */
	XK_N,		NoSymbol,		/* 0x69 */
	XK_M,		NoSymbol,		/* 0x6a */
	XK_comma,	XK_less,		/* 0x6b */
	XK_period,	XK_greater,		/* 0x6c */
	XK_slash,	XK_question,		/* 0x6d */
	XK_Shift_R,	NoSymbol,		/* 0x6e */
	XK_Linefeed,	NoSymbol,		/* 0x6f */
	XK_R13,		NoSymbol,		/* 0x70 */
	XK_Down,	XK_R14,			/* 0x71 */
	XK_R15,		NoSymbol,		/* 0x72 */
	NoSymbol,	NoSymbol,		/* 0x73 */
	NoSymbol,	NoSymbol,		/* 0x74 */
	NoSymbol,	NoSymbol,		/* 0x75 */
	NoSymbol,	NoSymbol,		/* 0x76 */
	XK_Caps_Lock,	NoSymbol,		/* 0x77 */
	XK_Meta_L,	NoSymbol,		/* 0x78 */
	XK_space,	NoSymbol,		/* 0x79 */
	XK_Meta_R,	NoSymbol,		/* 0x7a */
	NoSymbol,	NoSymbol,		/* 0x7b */
	NoSymbol,	NoSymbol,		/* 0x7c */
	NoSymbol,	NoSymbol,		/* 0x7d */
	NoSymbol,	NoSymbol,		/* 0x7e */
	NoSymbol,	NoSymbol,		/* 0x7f */
};

#else

#define US3Keymap NULL

#endif /* US3 */

KeySymsRec sunKeySyms[] = {
    /*	map	    minKeyCode	maxKC	width */
    { NULL,		0,	0,	0 },
    { NULL,		0,	0,	0 },
    { US2Keymap,	1,	0x7a,	2 },
    { US3Keymap,	1,	0x7a,	2 },
    { NULL,		1,	0x7d,	4 }
};

#ifdef CAN4

static KeySym Canada4Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  4*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  9*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/* 11*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	XK_Control_R,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 15*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_R1,		NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_R2,		NoSymbol,	/* 22*/
	XK_Break,  	XK_Scroll_Lock,	XK_R3,		NoSymbol,	/* 23*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_degree,	NoSymbol,	XK_notsign,	NoSymbol,	/* 29*/
	XK_1,   	XK_exclam,	NoSymbol,	NoSymbol,	/* 30*/
	XK_2,   	XK_quotedbl,	XK_at,  	NoSymbol,	/* 31*/
	XK_3,   	XK_numbersign,	NoSymbol,	NoSymbol,	/* 32*/
	XK_4,   	XK_dollar,	NoSymbol,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	NoSymbol,	NoSymbol,	/* 34*/
	XK_6,   	XK_question,	NoSymbol,	NoSymbol,	/* 35*/
	XK_7,   	XK_ampersand,	XK_braceleft,	NoSymbol,	/* 36*/
	XK_8,   	XK_asterisk,	XK_bracketleft,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenleft,	XK_bracketright,NoSymbol,	/* 38*/
	XK_0,   	XK_parenright,	XK_braceright,	NoSymbol,	/* 39*/
	XK_minus,	XK_underscore,	XK_bar, 	NoSymbol,	/* 40*/
	XK_equal,	XK_plus,	NoSymbol,	NoSymbol,	/* 41*/
	XK_Agrave,	NoSymbol,	XK_grave,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	XK_KP_Equal,  	XK_KP_Equal,  	XK_R4,		NoSymbol,	/* 45*/
	XK_KP_Divide,  	XK_KP_Divide,  	XK_R5,		NoSymbol,	/* 46*/
	XK_KP_Multiply,	XK_KP_Multiply,	XK_R6,		NoSymbol,	/* 47*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	SunXK_FA_Circum,SunXK_FA_Diaeresis,XK_asciicircum,NoSymbol,	/* 64*/
	XK_Ccedilla,	NoSymbol,	XK_asciitilde,	NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	XK_R7,		NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	XK_R8,		NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	XK_R9,		XK_Prior,	/* 70*/
	XK_KP_Subtract,	NoSymbol,	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_semicolon,	XK_colon,	NoSymbol,	NoSymbol,	/* 86*/
	XK_Egrave,	NoSymbol,	NoSymbol,	NoSymbol,	/* 87*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	XK_R10,		NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	XK_R11,		NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	XK_R12,		NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Z,   	NoSymbol,	XK_guillemotleft,NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	XK_guillemotright,NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_M,   	NoSymbol,	NoSymbol,	NoSymbol,	/*106*/
	XK_comma,	XK_apostrophe,	XK_less,	NoSymbol,	/*107*/
	XK_period,	NoSymbol,	XK_greater,	NoSymbol,	/*108*/
	XK_Eacute,	NoSymbol,	XK_slash,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	XK_Linefeed,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	XK_R13,		NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	XK_R14,		NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	XK_R15,		NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	XK_Ugrave,	NoSymbol,	XK_backslash,	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define Canada4Keymap NULL

#endif /* CANADA4 */

#ifdef CANFR5

static KeySym CanadaFr5Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	SunXK_AudioLowerVolume,SunXK_VideoLowerBrightness,NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	SunXK_AudioRaiseVolume,SunXK_VideoRaiseBrightness,NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	XK_Up,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,	XK_Break,	XK_R1,		XK_R1,		/* 21*/
	XK_Print,	NoSymbol,	XK_Sys_Req,	SunXK_Sys_Req,	/* 22*/
	XK_Scroll_Lock,	NoSymbol,	XK_R3,		XK_R3,		/* 23*/
	XK_Left,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	XK_Down,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	XK_Right,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_exclam,	XK_plusminus, 	NoSymbol,	/* 30*/
	XK_2,   	XK_at,		NoSymbol,  	NoSymbol,	/* 31*/
	XK_3,   	XK_numbersign,	XK_sterling,	NoSymbol,	/* 32*/
	XK_4,   	XK_dollar,	XK_cent,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	XK_currency,	NoSymbol,	/* 34*/
	XK_6,   	XK_question,	NoSymbol,	NoSymbol,	/* 35*/
	XK_7,   	XK_ampersand,	NoSymbol,	NoSymbol,	/* 36*/
	XK_8,   	XK_asterisk,	NoSymbol,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenleft,	XK_bracketleft,	NoSymbol,	/* 38*/
	XK_0,   	XK_parenright,	XK_bracketright,NoSymbol,	/* 39*/
	XK_minus,	XK_underscore,	NoSymbol,	NoSymbol,	/* 40*/
	XK_equal,	XK_plus,	XK_notsign,	NoSymbol,	/* 41*/
	XK_slash,	XK_backslash,	XK_bar,		NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	XK_Insert,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	SunXK_AudioMute,SunXK_VideoDegauss,NoSymbol,	NoSymbol,	/* 45*/
	XK_KP_Divide,	NoSymbol,	XK_R5,		XK_R5,		/* 46*/
	XK_KP_Multiply,	NoSymbol,	XK_R6,		XK_R6,		/* 47*/
	SunXK_PowerSwitch,SunXK_PowerSwitchShift,NoSymbol,NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	XK_Home,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	XK_paragraph,	NoSymbol,	/* 63*/
	SunXK_FA_Circum,SunXK_FA_Diaeresis,SunXK_FA_Grave,NoSymbol,	/* 64*/
	XK_Ccedilla,	NoSymbol,	XK_asciitilde,	NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	NoSymbol,	NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	NoSymbol,	NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	NoSymbol,	NoSymbol,	/* 70*/
	XK_KP_Subtract,	NoSymbol,	XK_R4,		XK_R4,		/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	XK_End, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_semicolon,	XK_colon,	XK_degree,	NoSymbol,	/* 86*/
	XK_Egrave,	NoSymbol,	NoSymbol,	NoSymbol,	/* 87*/
	XK_Agrave,	NoSymbol,	NoSymbol,	NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	NoSymbol,	NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	NoSymbol,	NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	NoSymbol,	NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	XK_Prior,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Z,   	NoSymbol,	XK_guillemotleft,NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	XK_guillemotright,NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_M,   	NoSymbol,	XK_mu,		NoSymbol,	/*106*/
	XK_comma,	XK_quoteright,	XK_less,	NoSymbol,	/*107*/
	XK_period,	XK_quotedbl,	XK_greater,	NoSymbol,	/*108*/
	XK_Eacute,	NoSymbol,	XK_quoteleft,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	NoSymbol,	NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	NoSymbol,	NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	NoSymbol,	NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	XK_Next,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	XK_Uacute,	NoSymbol,	NoSymbol,	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define CanadaFr5Keymap NULL

#endif /* CANFR5 */


#ifdef DEN4

static KeySym Denmark4Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	XK_asciitilde,	XK_asciicircum,	NoSymbol,	NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	XK_R1,  	XK_Pause,	NoSymbol,	/* 21*/
	XK_Print,  	XK_R2,  	XK_Print,	NoSymbol,	/* 22*/
	XK_Break,  	XK_Scroll_Lock,	XK_R3,		NoSymbol,	/* 23*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_exclam,	NoSymbol,	NoSymbol,	/* 30*/
	XK_2,   	XK_quotedbl,	XK_at,  	NoSymbol,	/* 31*/
	XK_3,   	XK_numbersign,	XK_sterling,	NoSymbol,	/* 32*/
	XK_4,   	XK_currency,	XK_dollar,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	NoSymbol,	NoSymbol,	/* 34*/
	XK_6,   	XK_ampersand,	NoSymbol,	NoSymbol,	/* 35*/
	XK_7,   	XK_slash,	XK_braceleft,	NoSymbol,	/* 36*/
	XK_8,   	XK_parenleft,	XK_bracketleft,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenright,	XK_bracketright,NoSymbol,	/* 38*/
	XK_0,   	XK_equal,	XK_braceright,	NoSymbol,	/* 39*/
	XK_plus,	XK_question,	NoSymbol,	NoSymbol,	/* 40*/
	SunXK_FA_Acute,	SunXK_FA_Grave,	XK_bar, 	NoSymbol,	/* 41*/
	XK_apostrophe,	XK_asterisk,	XK_grave,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	XK_KP_Equal,  	NoSymbol,  	XK_R4,		NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	XK_R5,		NoSymbol,	/* 46*/
	XK_KP_Multiply, NoSymbol,  	XK_R6,		NoSymbol,	/* 47*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	XK_Aring,	NoSymbol,	NoSymbol,	NoSymbol,	/* 64*/
	SunXK_FA_Diaeresis,SunXK_FA_Circum,SunXK_FA_Tilde,NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	XK_R7,		NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	XK_R8,		NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	XK_R9,		NoSymbol,	/* 70*/
	XK_KP_Subtract,	NoSymbol,	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_AE,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 86*/
	XK_Ooblique,	NoSymbol,	NoSymbol,	NoSymbol,	/* 87*/
	XK_onehalf,	XK_section,	NoSymbol,	NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	XK_R10,		NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	XK_R11,		NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	XK_R12,		NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Z,   	NoSymbol,	NoSymbol,	NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	NoSymbol,	NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_M,   	NoSymbol,	NoSymbol,	NoSymbol,	/*106*/
	XK_comma,	XK_semicolon,	NoSymbol,	NoSymbol,	/*107*/
	XK_period,	XK_colon,	NoSymbol,	NoSymbol,	/*108*/
	XK_minus,	XK_underscore,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	XK_Linefeed,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	XK_R13,		NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	XK_R14,		NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	XK_R15,		NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	XK_less,	XK_greater,	XK_backslash,	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define Denmark4Keymap NULL

#endif /* DENMARK4 */


#ifdef DEN5

static KeySym Denmark5Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	SunXK_AudioLowerVolume,SunXK_VideoLowerBrightness,NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	SunXK_AudioRaiseVolume,SunXK_VideoRaiseBrightness,NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	XK_Up,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_Break,	NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_Sys_Req,	SunXK_Sys_Req,	/* 22*/
	XK_Scroll_Lock, NoSymbol,  	NoSymbol,	NoSymbol,	/* 23*/
	XK_Left,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	XK_Down,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	XK_Right,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_exclam,	NoSymbol,	NoSymbol,	/* 30*/
	XK_2,   	XK_quotedbl,	XK_at,  	NoSymbol,	/* 31*/
	XK_3,   	XK_numbersign,	XK_sterling,	NoSymbol,	/* 32*/
	XK_4,   	XK_currency,	XK_dollar,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	XK_asciitilde,	NoSymbol,	/* 34*/
	XK_6,   	XK_ampersand,	XK_asciicircum,	NoSymbol,	/* 35*/
	XK_7,   	XK_slash,	XK_braceleft,	NoSymbol,	/* 36*/
	XK_8,   	XK_parenleft,	XK_bracketleft,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenright,	XK_bracketright,NoSymbol,	/* 38*/
	XK_0,   	XK_equal,	XK_braceright,	NoSymbol,	/* 39*/
	XK_plus,	XK_question,	NoSymbol,	NoSymbol,	/* 40*/
	SunXK_FA_Acute,	SunXK_FA_Grave,	XK_bar, 	NoSymbol,	/* 41*/
	XK_onehalf,	XK_section,	NoSymbol,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	XK_Insert,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	SunXK_AudioMute,SunXK_VideoDegauss,NoSymbol,	NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	NoSymbol,	NoSymbol,	/* 46*/
	XK_KP_Multiply, NoSymbol,  	NoSymbol,	NoSymbol,	/* 47*/
	SunXK_PowerSwitch,SunXK_PowerSwitchShift,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	XK_Home,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	XK_Aring,	NoSymbol,	NoSymbol,	NoSymbol,	/* 64*/
	SunXK_FA_Diaeresis,SunXK_FA_Circum,SunXK_FA_Tilde,NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	NoSymbol,	NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	NoSymbol,	NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	NoSymbol,	NoSymbol,	/* 70*/
	XK_KP_Subtract,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	XK_End, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_AE,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 86*/
	XK_Ooblique,	NoSymbol,	NoSymbol,	NoSymbol,	/* 87*/
	XK_apostrophe,	XK_asterisk,	XK_grave,	NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	NoSymbol,	NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	NoSymbol,	NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	NoSymbol,	NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	XK_Prior,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Z,   	NoSymbol,	NoSymbol,	NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	NoSymbol,	NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_M,   	NoSymbol,	NoSymbol,	NoSymbol,	/*106*/
	XK_comma,	XK_semicolon,	NoSymbol,	NoSymbol,	/*107*/
	XK_period,	XK_colon,	NoSymbol,	NoSymbol,	/*108*/
	XK_minus,	XK_underscore,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	NoSymbol,	NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	NoSymbol,	NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	NoSymbol,	NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	XK_Next,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	XK_less,	XK_greater,	XK_backslash,	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define Denmark5Keymap NULL

#endif /* DEN5 */


#ifdef FR5

static KeySym France5Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	SunXK_AudioLowerVolume,SunXK_VideoLowerBrightness,NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	SunXK_AudioRaiseVolume,SunXK_VideoRaiseBrightness,NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	XK_Up,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_Break,	NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_Sys_Req,	SunXK_Sys_Req,	/* 22*/
	XK_Scroll_Lock,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 23*/
	XK_Left,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	XK_Down,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	XK_Right,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_ampersand,	XK_1,   	NoSymbol,	NoSymbol,	/* 30*/
	XK_eacute,	XK_2,   	XK_asciitilde,	NoSymbol,	/* 31*/
	XK_quotedbl,	XK_3,   	XK_numbersign,	NoSymbol,	/* 32*/
	XK_apostrophe,	XK_4,   	XK_braceleft,	NoSymbol,	/* 33*/
	XK_parenleft,	XK_5,   	XK_bracketleft,	NoSymbol,	/* 34*/
	XK_minus,	XK_6,   	XK_bar, 	NoSymbol,	/* 35*/
	XK_egrave,	XK_7,   	XK_grave,	NoSymbol,	/* 36*/
	XK_underscore,	XK_8,   	XK_backslash,	NoSymbol,	/* 37*/
	XK_ccedilla,	XK_9,   	XK_asciicircum,	NoSymbol,	/* 38*/
	XK_agrave,	XK_0,   	XK_at,  	NoSymbol,	/* 39*/
	XK_parenright,	XK_degree,	XK_bracketright,NoSymbol,	/* 40*/
	XK_equal,	XK_plus,	XK_braceright,	NoSymbol,	/* 41*/
	XK_twosuperior,	NoSymbol,	NoSymbol,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	XK_Insert,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	SunXK_AudioMute,SunXK_VideoDegauss,NoSymbol,	NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	NoSymbol,	NoSymbol,	/* 46*/
	XK_KP_Multiply,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 47*/
	SunXK_PowerSwitch,SunXK_PowerSwitchShift,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	XK_Home,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_Z,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	SunXK_FA_Circum,SunXK_FA_Diaeresis,NoSymbol,	NoSymbol,	/* 64*/
	XK_dollar,	XK_sterling,	XK_currency,	NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	NoSymbol,	NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	NoSymbol,	NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	NoSymbol,	NoSymbol,	/* 70*/
	XK_KP_Subtract,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	XK_End, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_M,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 86*/
	XK_ugrave,	XK_percent,	NoSymbol,	NoSymbol,	/* 87*/
	XK_asterisk,	XK_mu,  	NoSymbol,	NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	NoSymbol,	NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	NoSymbol,	NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	NoSymbol,	NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	XK_Prior,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	NoSymbol,	NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_comma,	XK_question,	NoSymbol,	NoSymbol,	/*106*/
	XK_semicolon,	XK_period,	NoSymbol,	NoSymbol,	/*107*/
	XK_colon,	XK_slash,	NoSymbol,	NoSymbol,	/*108*/
	XK_exclam,	XK_section,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	NoSymbol,	NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	NoSymbol,	NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	NoSymbol,	XK_Next,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	XK_Next,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	XK_less,	XK_greater,	NoSymbol,	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define France5Keymap NULL

#endif /* FRANCE5 */


#ifdef FRBE4

static KeySym FranceBelg4Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	XK_bracketright,XK_braceright,	XK_guillemotright,NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_R1,		NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_R2,		NoSymbol,	/* 22*/
	XK_Break,  	XK_Scroll_Lock,	XK_R3,		NoSymbol,	/* 23*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_ampersand,	XK_1,   	NoSymbol,	NoSymbol,	/* 30*/
	XK_eacute,	XK_2,   	XK_twosuperior,	NoSymbol,	/* 31*/
	XK_quotedbl,	XK_3,   	XK_threesuperior,NoSymbol,	/* 32*/
	XK_apostrophe,	XK_4,   	XK_acute,	NoSymbol,	/* 33*/
	XK_parenleft,	XK_5,   	NoSymbol,	NoSymbol,	/* 34*/
	XK_section,	XK_6,   	XK_asciicircum,	NoSymbol,	/* 35*/
	XK_egrave,	XK_7,   	NoSymbol,	NoSymbol,	/* 36*/
	XK_exclam,	XK_8,   	XK_sterling,	NoSymbol,	/* 37*/
	XK_ccedilla,	XK_9,   	XK_backslash,	NoSymbol,	/* 38*/
	XK_agrave,	XK_0,   	NoSymbol,	NoSymbol,	/* 39*/
	XK_parenright,	XK_degree,	XK_asciitilde,	NoSymbol,	/* 40*/
	XK_minus,	XK_underscore,	XK_numbersign,	NoSymbol,	/* 41*/
	XK_asterisk,	XK_bar, 	XK_currency,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	XK_KP_Equal,  	XK_KP_Equal,  	XK_R4,		NoSymbol,	/* 45*/
	XK_KP_Divide,  	XK_KP_Divide,  	XK_R5,		NoSymbol,	/* 46*/
	XK_KP_Multiply,	XK_KP_Multiply,	XK_R6,		NoSymbol,	/* 47*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_Z,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	SunXK_FA_Circum,SunXK_FA_Diaeresis,NoSymbol,	NoSymbol,	/* 64*/
	XK_grave,	XK_dollar,	XK_at,  	NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	XK_R7,		NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	XK_R8,		NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	XK_R9,		NoSymbol,	/* 70*/
	XK_KP_Subtract,	XK_KP_Subtract,	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_M,   	NoSymbol,	XK_mu,  	NoSymbol,	/* 86*/
	XK_ugrave,	XK_percent,	NoSymbol,	NoSymbol,	/* 87*/
	XK_bracketleft,	XK_braceleft,	XK_guillemotleft,NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	XK_KP_Enter,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	XK_R10,		NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	XK_R11,		NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	XK_R12,		NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	NoSymbol,	NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_comma,	XK_question,	NoSymbol,	NoSymbol,	/*106*/
	XK_semicolon,	XK_period,	NoSymbol,	NoSymbol,	/*107*/
	XK_colon,	XK_slash,	NoSymbol,	NoSymbol,	/*108*/
	XK_equal,	XK_plus,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	XK_Linefeed,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	XK_R13,		NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	XK_R14,		NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	XK_R15,		NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	XK_less,	XK_greater,	NoSymbol,	NoSymbol,	/*124*/
	XK_KP_Add,	XK_KP_Add,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define FranceBelg4Keymap NULL

#endif /* FRANCEBELG4 */


#ifdef GER4

static KeySym Germany4Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	XK_Alt_R,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	XK_bracketright,XK_braceright,XK_guillemotright,NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_R1,		NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_R2,		NoSymbol,	/* 22*/
	XK_Scroll_Lock,	NoSymbol,  	XK_R3,		NoSymbol,	/* 23*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_exclam,	NoSymbol,	NoSymbol,	/* 30*/
	XK_2,   	XK_quotedbl,	XK_twosuperior,	NoSymbol,	/* 31*/
	XK_3,   	XK_section,	XK_threesuperior,NoSymbol,	/* 32*/
	XK_4,   	XK_dollar,	NoSymbol,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	NoSymbol,	NoSymbol,	/* 34*/
	XK_6,   	XK_ampersand,	NoSymbol,	NoSymbol,	/* 35*/
	XK_7,   	XK_slash,	XK_degree,	NoSymbol,	/* 36*/
	XK_8,   	XK_parenleft,	XK_grave,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenright,	XK_apostrophe,	NoSymbol,	/* 38*/
	XK_0,   	XK_equal,	XK_bar, 	NoSymbol,	/* 39*/
	XK_ssharp,	XK_question,	XK_backslash,	NoSymbol,	/* 40*/
	SunXK_FA_Acute,	SunXK_FA_Grave,	NoSymbol,	NoSymbol,	/* 41*/
	XK_numbersign,	XK_asciicircum,	XK_at,  	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	XK_KP_Equal,  	NoSymbol,  	XK_R4,		NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	XK_R5,		NoSymbol,	/* 46*/
	XK_KP_Multiply,	NoSymbol,	XK_R6,		NoSymbol,	/* 47*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Z,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	XK_Udiaeresis,	NoSymbol,	NoSymbol,	NoSymbol,	/* 64*/
	XK_plus,	XK_asterisk,	XK_asciitilde,	NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	XK_R7,		NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	XK_R8,		NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	XK_R9,		NoSymbol,	/* 70*/
	XK_KP_Subtract,	XK_KP_Subtract,	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_Odiaeresis,	NoSymbol,	NoSymbol,	NoSymbol,	/* 86*/
	XK_Adiaeresis,	NoSymbol,	NoSymbol,	NoSymbol,	/* 87*/
	XK_bracketleft,	XK_braceleft,	XK_guillemotleft,NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	XK_R10,		NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	XK_R11,		NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	XK_R12,		NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	NoSymbol,	NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_M,   	NoSymbol,	XK_mu,  	NoSymbol,	/*106*/
	XK_comma,	XK_semicolon,	NoSymbol,	NoSymbol,	/*107*/
	XK_period,	XK_colon,	NoSymbol,	NoSymbol,	/*108*/
	XK_minus,	XK_underscore,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	XK_Linefeed,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	XK_R13,		NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	XK_R14,		NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	XK_R15,		NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	XK_less,	XK_greater,	NoSymbol,	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define Germany4Keymap NULL

#endif /* GERMANY4 */


#ifdef GER5

static KeySym Germany5Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	SunXK_AudioLowerVolume,SunXK_VideoLowerBrightness,NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	SunXK_AudioRaiseVolume,SunXK_VideoRaiseBrightness,NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	XK_Up,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_Break,	NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_Sys_Req,	SunXK_Sys_Req,	/* 22*/
	XK_Scroll_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 23*/
	XK_Left,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	XK_Down,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	XK_Right,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_exclam,	NoSymbol,	NoSymbol,	/* 30*/
	XK_2,   	XK_quotedbl,	XK_twosuperior,	NoSymbol,	/* 31*/
	XK_3,   	XK_section,	XK_threesuperior,NoSymbol,	/* 32*/
	XK_4,   	XK_dollar,	NoSymbol,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	NoSymbol,	NoSymbol,	/* 34*/
	XK_6,   	XK_ampersand,	NoSymbol,	NoSymbol,	/* 35*/
	XK_7,   	XK_slash,	XK_braceleft,	NoSymbol,	/* 36*/
	XK_8,   	XK_parenleft,	XK_bracketleft,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenright,	XK_bracketright,NoSymbol,	/* 38*/
	XK_0,   	XK_equal,	XK_braceright,	NoSymbol,	/* 39*/
	XK_ssharp,	XK_question,	XK_backslash,	NoSymbol,	/* 40*/
	SunXK_FA_Acute,	SunXK_FA_Grave,	NoSymbol,	NoSymbol,	/* 41*/
	XK_asciicircum,	XK_degree,	NoSymbol,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	XK_Insert,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	SunXK_AudioMute,SunXK_VideoDegauss,NoSymbol,	NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	NoSymbol,	NoSymbol,	/* 46*/
	XK_KP_Multiply,	NoSymbol,	NoSymbol,	NoSymbol,	/* 47*/
	SunXK_PowerSwitch,SunXK_PowerSwitchShift,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Separator,NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	XK_Home,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_q,   	XK_Q,   	XK_at,  	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Z,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	XK_Udiaeresis,	NoSymbol,	NoSymbol,	NoSymbol,	/* 64*/
	XK_plus,	XK_asterisk,	XK_asciitilde,	NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	NoSymbol,	NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	NoSymbol,	NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	NoSymbol,	NoSymbol,	/* 70*/
	XK_KP_Subtract,	NoSymbol,	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	XK_End, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_Odiaeresis,	NoSymbol,	NoSymbol,	NoSymbol,	/* 86*/
	XK_Adiaeresis,	NoSymbol,	NoSymbol,	NoSymbol,	/* 87*/
	XK_numbersign,	XK_apostrophe,	XK_grave,	NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	NoSymbol,	NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	NoSymbol,	NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	NoSymbol,	NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	XK_Prior,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	NoSymbol,	NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_m,   	XK_M,   	XK_mu,  	NoSymbol,	/*106*/
	XK_comma,	XK_semicolon,	NoSymbol,	NoSymbol,	/*107*/
	XK_period,	XK_colon,	NoSymbol,	NoSymbol,	/*108*/
	XK_minus,	XK_underscore,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	NoSymbol,	NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	NoSymbol,	NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	NoSymbol,	NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	XK_Next,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	XK_less,	XK_greater,	XK_bar, 	NoSymbol,	/*124*/
	XK_KP_Add,	XK_KP_Add,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define Germany5Keymap NULL

#endif /* GERMANY5 */


#ifdef ITALY4

static KeySym Italy4Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	XK_bracketright,XK_braceright,	XK_guillemotright,NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_R1,		NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_R2,		NoSymbol,	/* 22*/
	XK_Break, 	XK_Scroll_Lock,	XK_R3,		NoSymbol,	/* 23*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_exclam,	NoSymbol,	NoSymbol,	/* 30*/
	XK_2,   	XK_quotedbl,	XK_twosuperior,	NoSymbol,	/* 31*/
	XK_3,   	XK_sterling,	XK_threesuperior,NoSymbol,	/* 32*/
	XK_4,   	XK_dollar,	NoSymbol,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	NoSymbol,	NoSymbol,	/* 34*/
	XK_6,   	XK_ampersand,	XK_notsign,	NoSymbol,	/* 35*/
	XK_7,   	XK_slash,	NoSymbol,	NoSymbol,	/* 36*/
	XK_8,   	XK_parenleft,	NoSymbol,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenright,	XK_backslash,	NoSymbol,	/* 38*/
	XK_0,   	XK_equal,	XK_bar, 	NoSymbol,	/* 39*/
	XK_apostrophe,	XK_question,	XK_grave,	NoSymbol,	/* 40*/
	XK_igrave,	XK_asciicircum,	NoSymbol,	NoSymbol,	/* 41*/
	XK_ugrave,	XK_section,	NoSymbol,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	XK_KP_Equal,  	NoSymbol,  	XK_R4,		NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	XK_R5,		NoSymbol,	/* 46*/
	XK_KP_Multiply,	NoSymbol,	XK_R6,		NoSymbol,	/* 47*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	XK_egrave,	XK_eacute,	NoSymbol,	NoSymbol,	/* 64*/
	XK_plus,	XK_asterisk,	XK_asciitilde,	NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	XK_R7,		NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	XK_R8,		NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	XK_R9,		NoSymbol,	/* 70*/
	XK_KP_Subtract,	NoSymbol,	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_ograve,	XK_ccedilla,	XK_at,  	NoSymbol,	/* 86*/
	XK_agrave,	XK_degree,	XK_numbersign,	NoSymbol,	/* 87*/
	XK_bracketleft,	XK_braceleft,	XK_guillemotleft,NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	XK_R4,		NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	XK_R5,		NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	XK_R6,		NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Z,   	NoSymbol,	NoSymbol,	NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	NoSymbol,	NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_M,   	NoSymbol,	NoSymbol,	NoSymbol,	/*106*/
	XK_comma,	XK_semicolon,	NoSymbol,	NoSymbol,	/*107*/
	XK_period,	XK_colon,	NoSymbol,	NoSymbol,	/*108*/
	XK_minus,	XK_underscore,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	XK_Linefeed,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	XK_R13,		NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	XK_R14,		NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	XK_R15,		NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	XK_less,	XK_greater,	NoSymbol,	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define Italy4Keymap NULL

#endif /* ITALY4 */


#ifdef ITALY5

static KeySym Italy5Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	SunXK_AudioLowerVolume,SunXK_VideoLowerBrightness,NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	SunXK_AudioRaiseVolume,SunXK_VideoRaiseBrightness,NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	XK_Up,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	XK_Break,  	NoSymbol,	NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_Sys_Req,	SunXK_Sys_Req,	/* 22*/
	XK_Scroll_Lock,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 23*/
	XK_Left,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	XK_Down,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	XK_Right,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_exclam,	NoSymbol,	NoSymbol,	/* 30*/
	XK_2,   	XK_quotedbl,	NoSymbol,	NoSymbol,	/* 31*/
	XK_3,   	XK_sterling,	NoSymbol,	NoSymbol,	/* 32*/
	XK_4,   	XK_dollar,	NoSymbol,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	NoSymbol,	NoSymbol,	/* 34*/
	XK_6,   	XK_ampersand,	NoSymbol,	NoSymbol,	/* 35*/
	XK_7,   	XK_slash,	NoSymbol,	NoSymbol,	/* 36*/
	XK_8,   	XK_parenleft,	XK_braceleft,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenright,	XK_braceright,	NoSymbol,	/* 38*/
	XK_0,   	XK_equal,	NoSymbol,	NoSymbol,	/* 39*/
	XK_apostrophe,	XK_question,	XK_grave,	NoSymbol,	/* 40*/
	XK_igrave,	XK_asciicircum,	NoSymbol,	NoSymbol,	/* 41*/
	XK_backslash,	XK_bar, 	NoSymbol,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	XK_Insert,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	SunXK_AudioMute,SunXK_VideoDegauss,NoSymbol,	NoSymbol,	/* 45*/
	XK_KP_Divide,  	XK_KP_Divide,  	NoSymbol,	NoSymbol,	/* 46*/
	XK_KP_Multiply,	XK_KP_Multiply,	NoSymbol,	NoSymbol,	/* 47*/
	SunXK_PowerSwitch,SunXK_PowerSwitchShift,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	XK_Home,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	XK_egrave,	XK_eacute,	XK_bracketleft,	NoSymbol,	/* 64*/
	XK_plus,	XK_asterisk,	XK_bracketright,NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	NoSymbol,	NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	NoSymbol,	NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	NoSymbol,	NoSymbol,	/* 70*/
	XK_KP_Subtract,	NoSymbol,	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	XK_End, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_ograve,	XK_ccedilla,	XK_at,  	NoSymbol,	/* 86*/
	XK_agrave,	XK_degree,	XK_numbersign,	NoSymbol,	/* 87*/
	XK_ugrave,	XK_section,	XK_asciitilde,	NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	XK_KP_Enter,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	NoSymbol,	NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	NoSymbol,	NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	NoSymbol,	NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	XK_Prior,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Z,   	NoSymbol,	NoSymbol,	NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	NoSymbol,	NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_M,   	NoSymbol,	NoSymbol,	NoSymbol,	/*106*/
	XK_comma,	XK_semicolon,	NoSymbol,	NoSymbol,	/*107*/
	XK_period,	XK_colon,	NoSymbol,	NoSymbol,	/*108*/
	XK_minus,	XK_underscore,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	NoSymbol,	NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	NoSymbol,	NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	NoSymbol,	NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	XK_Next,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	XK_less,	XK_greater,	NoSymbol,	NoSymbol,	/*124*/
	XK_KP_Add,	XK_KP_Add,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define Italy5Keymap NULL

#endif /* ITALY5 */


#ifdef JAPAN4

static KeySym Japan4Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	XK_Linefeed,	NoSymbol,	NoSymbol,	NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_R1,		NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_R2,		NoSymbol,	/* 22*/
	XK_Break,  	XK_Scroll_Lock,	XK_R3,		NoSymbol,	/* 23*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_exclam,	XK_kana_NU,	NoSymbol,	/* 30*/
	XK_2,   	XK_quotedbl,	XK_kana_FU,	NoSymbol,	/* 31*/
	XK_3,   	XK_numbersign,	XK_kana_A,	XK_kana_a,	/* 32*/
	XK_4,   	XK_dollar,	XK_kana_U,	XK_kana_u,	/* 33*/
	XK_5,   	XK_percent,	XK_kana_E,	XK_kana_e,	/* 34*/
	XK_6,   	XK_ampersand,	XK_kana_O,	XK_kana_o,	/* 35*/
	XK_7,   	XK_apostrophe,	XK_kana_YA,	XK_kana_ya,	/* 36*/
	XK_8,   	XK_parenleft,	XK_kana_YU,	XK_kana_yu,	/* 37*/
	XK_9,   	XK_parenright,	XK_kana_YO,	XK_kana_yo,	/* 38*/
	XK_0,   	XK_0,   	XK_kana_WA,	XK_kana_WO,	/* 39*/
	XK_minus,	XK_equal,	XK_kana_HO,	NoSymbol,	/* 40*/
	XK_asciicircum,	XK_asciitilde,	XK_kana_HE,	NoSymbol,	/* 41*/
	XK_bracketright,XK_braceright,	XK_kana_MU,	XK_kana_closingbracket,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	XK_KP_Equal,  	NoSymbol,  	XK_R4,		NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	XK_R5,		NoSymbol,	/* 46*/
	XK_KP_Multiply,	NoSymbol,	XK_R6,		NoSymbol,	/* 47*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_q,   	XK_Q,   	XK_kana_TA,	NoSymbol,	/* 54*/
	XK_w,   	XK_W,   	XK_kana_TE,	NoSymbol,	/* 55*/
	XK_e,   	XK_E,   	XK_kana_I,	XK_kana_i,	/* 56*/
	XK_r,   	XK_R,   	XK_kana_SU,	NoSymbol,	/* 57*/
	XK_t,   	XK_T,   	XK_kana_KA,	NoSymbol,	/* 58*/
	XK_y,   	XK_Y,   	XK_kana_N,	NoSymbol,	/* 59*/
	XK_u,   	XK_U,   	XK_kana_NA,	NoSymbol,	/* 60*/
	XK_i,   	XK_I,   	XK_kana_NI,	NoSymbol,	/* 61*/
	XK_o,   	XK_O,   	XK_kana_RA,	NoSymbol,	/* 62*/
	XK_p,   	XK_P,   	XK_kana_SE,	NoSymbol,	/* 63*/
	XK_at,  	XK_grave,	XK_voicedsound,	NoSymbol,	/* 64*/
	XK_bracketleft,	XK_braceleft,	XK_semivoicedsound,XK_kana_openingbracket,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	XK_R7,		NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	XK_R8,		NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	XK_R9,		NoSymbol,	/* 70*/
	XK_KP_Subtract,	XK_KP_Subtract,	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_a,   	XK_A,   	XK_kana_CHI,	NoSymbol,	/* 77*/
	XK_s,   	XK_S,   	XK_kana_TO,	NoSymbol,	/* 78*/
	XK_d,   	XK_D,   	XK_kana_SHI,	NoSymbol,	/* 79*/
	XK_f,   	XK_F,   	XK_kana_HA,	NoSymbol,	/* 80*/
	XK_g,   	XK_G,   	XK_kana_KI,	NoSymbol,	/* 81*/
	XK_h,   	XK_H,   	XK_kana_KU,	NoSymbol,	/* 82*/
	XK_j,   	XK_J,   	XK_kana_MA,	NoSymbol,	/* 83*/
	XK_k,   	XK_K,   	XK_kana_NO,	NoSymbol,	/* 84*/
	XK_l,   	XK_L,   	XK_kana_RI,	NoSymbol,	/* 85*/
	XK_semicolon,	XK_plus,	XK_kana_RE,	NoSymbol,	/* 86*/
	XK_colon,	XK_asterisk,	XK_kana_KE,	NoSymbol,	/* 87*/
	XK_backslash,	XK_bar, 	XK_prolongedsound,NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	XK_R10,		NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	XK_R11,		NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	XK_R12,		NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_z,   	XK_Z,   	XK_kana_TSU,	XK_kana_tsu,	/*100*/
	XK_x,   	XK_X,   	XK_kana_SA,	NoSymbol,	/*101*/
	XK_c,   	XK_C,   	XK_kana_SO,	NoSymbol,	/*102*/
	XK_v,   	XK_V,   	XK_kana_HI,	NoSymbol,	/*103*/
	XK_b,   	XK_B,   	XK_kana_KO,	NoSymbol,	/*104*/
	XK_n,   	XK_N,   	XK_kana_MI,	NoSymbol,	/*105*/
	XK_m,   	XK_M,   	XK_kana_MO,	NoSymbol,	/*106*/
	XK_comma,	XK_less,	XK_kana_NE,	XK_kana_comma,	/*107*/
	XK_period,	XK_greater,	XK_kana_RU,	XK_kana_fullstop,	/*108*/
	XK_slash,	XK_question,	XK_kana_ME,	XK_kana_conjunctive,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	XK_backslash,	XK_underscore,	XK_kana_RO,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	XK_R13,		NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	XK_R14,		NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	XK_R15,		NoSymbol,	/*114*/
	XK_Execute,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	XK_Kanji,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	XK_Henkan_Mode,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*124*/
	XK_KP_Add,	XK_KP_Add,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define Japan4Keymap NULL

#endif /* JAPAN4 */


#ifdef JAPAN5

static KeySym Japan5Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	SunXK_AudioLowerVolume,SunXK_VideoLowerBrightness,NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	SunXK_AudioRaiseVolume,SunXK_VideoRaiseBrightness,NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	XK_Up,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_Break,	NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_Sys_Req,	SunXK_Sys_Req,	/* 22*/
	XK_Scroll_Lock,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 23*/
	XK_Left,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	XK_Down,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	XK_Right,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_exclam,	XK_kana_NU,	NoSymbol,	/* 30*/
	XK_2,   	XK_quotedbl,	XK_kana_FU,	NoSymbol,	/* 31*/
	XK_3,   	XK_numbersign,	XK_kana_A,	XK_kana_a,	/* 32*/
	XK_4,   	XK_dollar,	XK_kana_U,	XK_kana_u,	/* 33*/
	XK_5,   	XK_percent,	XK_kana_E,	XK_kana_e,	/* 34*/
	XK_6,   	XK_ampersand,	XK_kana_O,	XK_kana_o,	/* 35*/
	XK_7,   	XK_apostrophe,	XK_kana_YA,	XK_kana_ya,	/* 36*/
	XK_8,   	XK_parenleft,	XK_kana_YU,	XK_kana_yu,	/* 37*/
	XK_9,   	XK_parenright,	XK_kana_YO,	XK_kana_yo,	/* 38*/
	XK_0,   	XK_0,   	XK_kana_WA,	XK_kana_WO,	/* 39*/
	XK_minus,	XK_equal,	XK_kana_HO,	NoSymbol,	/* 40*/
	XK_asciicircum,	XK_asciitilde,	XK_kana_HE,	NoSymbol,	/* 41*/
	XK_backslash,	XK_bar, 	XK_prolongedsound,NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	XK_Insert,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	SunXK_AudioMute,SunXK_VideoDegauss,NoSymbol,	NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	NoSymbol,	NoSymbol,	/* 46*/
	XK_KP_Multiply,	NoSymbol,	NoSymbol,	NoSymbol,	/* 47*/
	SunXK_PowerSwitch,SunXK_PowerSwitchShift,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	XK_Home,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_q,   	XK_Q,   	XK_kana_TA,	NoSymbol,	/* 54*/
	XK_w,   	XK_W,   	XK_kana_TE,	NoSymbol,	/* 55*/
	XK_e,   	XK_E,   	XK_kana_I,	XK_kana_i,	/* 56*/
	XK_r,   	XK_R,   	XK_kana_SU,	NoSymbol,	/* 57*/
	XK_t,   	XK_T,   	XK_kana_KA,	NoSymbol,	/* 58*/
	XK_y,   	XK_Y,   	XK_kana_N,	NoSymbol,	/* 59*/
	XK_u,   	XK_U,   	XK_kana_NA,	NoSymbol,	/* 60*/
	XK_i,   	XK_I,   	XK_kana_NI,	NoSymbol,	/* 61*/
	XK_o,   	XK_O,   	XK_kana_RA,	NoSymbol,	/* 62*/
	XK_p,   	XK_P,   	XK_kana_SE,	NoSymbol,	/* 63*/
	XK_at,  	XK_grave,	XK_voicedsound,	NoSymbol,	/* 64*/
	XK_bracketleft,	XK_braceleft,	XK_semivoicedsound,XK_kana_openingbracket,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	NoSymbol,	NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	NoSymbol,	NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	NoSymbol,	NoSymbol,	/* 70*/
	XK_KP_Subtract,	NoSymbol,	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	XK_End, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_a,   	XK_A,   	XK_kana_CHI,	NoSymbol,	/* 77*/
	XK_s,   	XK_S,   	XK_kana_TO,	NoSymbol,	/* 78*/
	XK_d,   	XK_D,   	XK_kana_SHI,	NoSymbol,	/* 79*/
	XK_f,   	XK_F,   	XK_kana_HA,	NoSymbol,	/* 80*/
	XK_g,   	XK_G,   	XK_kana_KI,	NoSymbol,	/* 81*/
	XK_h,   	XK_H,   	XK_kana_KU,	NoSymbol,	/* 82*/
	XK_j,   	XK_J,   	XK_kana_MA,	NoSymbol,	/* 83*/
	XK_k,   	XK_K,   	XK_kana_NO,	NoSymbol,	/* 84*/
	XK_l,   	XK_L,   	XK_kana_RI,	NoSymbol,	/* 85*/
	XK_semicolon,	XK_plus,	XK_kana_RE,	NoSymbol,	/* 86*/
	XK_colon,	XK_asterisk,	XK_kana_KE,	NoSymbol,	/* 87*/
	XK_bracketright,XK_braceright,	XK_kana_MU,	XK_kana_closingbracket,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	NoSymbol,	NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	NoSymbol,	NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	NoSymbol,	NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	XK_Prior,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_z,   	XK_Z,   	XK_kana_TSU,	XK_kana_tsu,	/*100*/
	XK_x,   	XK_X,   	XK_kana_SA,	NoSymbol,	/*101*/
	XK_c,   	XK_C,   	XK_kana_SO,	NoSymbol,	/*102*/
	XK_v,   	XK_V,   	XK_kana_HI,	NoSymbol,	/*103*/
	XK_b,   	XK_B,   	XK_kana_KO,	NoSymbol,	/*104*/
	XK_n,   	XK_N,   	XK_kana_MI,	NoSymbol,	/*105*/
	XK_m,   	XK_M,   	XK_kana_MO,	NoSymbol,	/*106*/
	XK_comma,	XK_less,	XK_kana_NE,	XK_kana_comma,	/*107*/
	XK_period,	XK_greater,	XK_kana_RU,	XK_kana_fullstop,	/*108*/
	XK_slash,	XK_question,	XK_kana_ME,	XK_kana_conjunctive,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	XK_backslash,	XK_underscore,	XK_kana_RO,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	NoSymbol,	NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	NoSymbol,	NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	NoSymbol,	NoSymbol,	/*114*/
	XK_Execute,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	XK_Kanji,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	XK_Henkan_Mode,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	XK_Next,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*124*/
	XK_KP_Add,	XK_KP_Add,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define Japan5Keymap NULL

#endif /* JAPAN5 */


#ifdef KOREA4

static KeySym Korea4Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	XK_Linefeed,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_R1,		NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_R2,		NoSymbol,	/* 22*/
	XK_Break,	XK_Scroll_Lock,	XK_R3,		NoSymbol,	/* 23*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_exclam,	NoSymbol,	NoSymbol,	/* 30*/
	XK_2,   	XK_at,  	NoSymbol,	NoSymbol,	/* 31*/
	XK_3,   	XK_numbersign,	NoSymbol,	NoSymbol,	/* 32*/
	XK_4,   	XK_dollar,	NoSymbol,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	NoSymbol,	NoSymbol,	/* 34*/
	XK_6,   	XK_asciicircum,	NoSymbol,	NoSymbol,	/* 35*/
	XK_7,   	XK_ampersand,	NoSymbol,	NoSymbol,	/* 36*/
	XK_8,   	XK_asterisk,	NoSymbol,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenleft,	NoSymbol,	NoSymbol,	/* 38*/
	XK_0,   	XK_parenright,	NoSymbol,	NoSymbol,	/* 39*/
	XK_minus,	XK_underscore,	NoSymbol,	NoSymbol,	/* 40*/
	XK_equal,	XK_plus,	NoSymbol,	NoSymbol,	/* 41*/
	XK_grave,	XK_asciitilde,	XK_acute,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	XK_KP_Equal,  	NoSymbol,  	XK_R4,		NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	XK_R5,		NoSymbol,	/* 46*/
	XK_KP_Multiply,	NoSymbol,	XK_R6,		NoSymbol,	/* 47*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	XK_bracketleft,	XK_braceleft,	NoSymbol,	NoSymbol,	/* 64*/
	XK_bracketright,XK_braceright,	NoSymbol,	NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	XK_R7,		NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	XK_R8,		NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	XK_R9,		NoSymbol,	/* 70*/
	XK_KP_Subtract,	NoSymbol,	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_semicolon,	XK_colon,	NoSymbol,	NoSymbol,	/* 86*/
	XK_apostrophe,	XK_quotedbl,	NoSymbol,	NoSymbol,	/* 87*/
	XK_backslash,	XK_bar, 	XK_brokenbar,	NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	XK_R10,		NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	XK_R11,		NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	XK_R12,		NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Z,   	NoSymbol,	NoSymbol,	NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	NoSymbol,	NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_M,   	NoSymbol,	NoSymbol,	NoSymbol,	/*106*/
	XK_comma,	XK_less,	NoSymbol,	NoSymbol,	/*107*/
	XK_period,	XK_greater,	NoSymbol,	NoSymbol,	/*108*/
	XK_slash,	XK_question,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	XK_R13,		NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	XK_R14,		NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	XK_R15,		NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define Korea4Keymap NULL

#endif /* KOREA4 */


#ifdef KOREA5

static KeySym Korea5Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	SunXK_AudioLowerVolume,SunXK_VideoLowerBrightness,NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	SunXK_AudioRaiseVolume,SunXK_VideoRaiseBrightness,NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	XK_Up,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_Break,	NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_Sys_Req,	SunXK_Sys_Req,	/* 22*/
	XK_Scroll_Lock,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 23*/
	XK_Left,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	XK_Down,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	XK_Right,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_exclam,	NoSymbol,	NoSymbol,	/* 30*/
	XK_2,   	XK_at,  	NoSymbol,	NoSymbol,	/* 31*/
	XK_3,   	XK_numbersign,	NoSymbol,	NoSymbol,	/* 32*/
	XK_4,   	XK_dollar,	NoSymbol,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	NoSymbol,	NoSymbol,	/* 34*/
	XK_6,   	XK_asciicircum,	NoSymbol,	NoSymbol,	/* 35*/
	XK_7,   	XK_ampersand,	NoSymbol,	NoSymbol,	/* 36*/
	XK_8,   	XK_asterisk,	NoSymbol,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenleft,	NoSymbol,	NoSymbol,	/* 38*/
	XK_0,   	XK_parenright,	NoSymbol,	NoSymbol,	/* 39*/
	XK_minus,	XK_underscore,	NoSymbol,	NoSymbol,	/* 40*/
	XK_equal,	XK_plus,	NoSymbol,	NoSymbol,	/* 41*/
	XK_grave,	XK_asciitilde,	XK_acute,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	XK_Insert,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	SunXK_AudioMute,SunXK_VideoDegauss,NoSymbol,	NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	NoSymbol,	NoSymbol,	/* 46*/
	XK_KP_Multiply, NoSymbol,  	NoSymbol,	NoSymbol,	/* 47*/
	SunXK_PowerSwitch,SunXK_PowerSwitchShift,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	XK_Home,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	XK_bracketleft,	XK_braceleft,	NoSymbol,	NoSymbol,	/* 64*/
	XK_bracketright,XK_braceright,	NoSymbol,	NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	NoSymbol,	NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	NoSymbol,	NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	NoSymbol,	NoSymbol,	/* 70*/
	XK_KP_Subtract, NoSymbol,  	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	XK_End, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_semicolon,	XK_colon,	NoSymbol,	NoSymbol,	/* 86*/
	XK_apostrophe,	XK_quotedbl,	NoSymbol,	NoSymbol,	/* 87*/
	XK_backslash,	XK_bar, 	XK_brokenbar,	NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	NoSymbol,	NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	NoSymbol,	NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	NoSymbol,	NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	XK_Prior,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Z,   	NoSymbol,	NoSymbol,	NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	NoSymbol,	NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_M,   	NoSymbol,	NoSymbol,	NoSymbol,	/*106*/
	XK_comma,	XK_less,	NoSymbol,	NoSymbol,	/*107*/
	XK_period,	XK_greater,	NoSymbol,	NoSymbol,	/*108*/
	XK_slash,	XK_question,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	NoSymbol,	NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	NoSymbol,	NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	NoSymbol,	NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	XK_Next,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define Korea5Keymap NULL

#endif /* KOREA5 */


#ifdef NETH4

static KeySym Netherland4Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	XK_backslash,	XK_bar, 	NoSymbol,	NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_R1,		NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_R2,		NoSymbol,	/* 22*/
	XK_Break,  	XK_Scroll_Lock,	XK_R3,		NoSymbol,	/* 23*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_exclam,	XK_onesuperior,	NoSymbol,	/* 30*/
	XK_2,   	XK_quotedbl,	XK_twosuperior,	NoSymbol,	/* 31*/
	XK_3,   	XK_numbersign,	XK_threesuperior,NoSymbol,	/* 32*/
	XK_4,   	XK_dollar,	XK_onequarter,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	XK_onehalf,	NoSymbol,	/* 34*/
	XK_6,   	XK_ampersand,	XK_threequarters,NoSymbol,	/* 35*/
	XK_7,   	XK_underscore,	XK_sterling,	NoSymbol,	/* 36*/
	XK_8,   	XK_parenleft,	XK_braceleft,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenright,	XK_braceright,	NoSymbol,	/* 38*/
	XK_0,   	XK_apostrophe,	XK_grave,	NoSymbol,	/* 39*/
	XK_slash,	XK_question,	NoSymbol,	NoSymbol,	/* 40*/
	XK_degree,	SunXK_FA_Tilde,	SunXK_FA_Cedilla,NoSymbol,	/* 41*/
	XK_less,	XK_greater,	NoSymbol,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	XK_KP_Equal,  	NoSymbol,  	XK_R4,		NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	XK_R5,		NoSymbol,	/* 46*/
	XK_KP_Multiply, NoSymbol,  	XK_R6,		NoSymbol,	/* 47*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	SunXK_FA_Diaeresis,XK_asciicircum,SunXK_FA_Circum,NoSymbol,	/* 64*/
	XK_asterisk,	XK_brokenbar,	XK_asciitilde,	NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	XK_R7,		NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	XK_R8,		NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	XK_R9,		NoSymbol,	/* 70*/
	XK_KP_Subtract,	NoSymbol,	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	XK_ssharp,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_plus,	XK_plusminus,	NoSymbol,	NoSymbol,	/* 86*/
	SunXK_FA_Acute,	SunXK_FA_Grave,	NoSymbol,	NoSymbol,	/* 87*/
	XK_at,  	XK_section,	XK_notsign,	NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	XK_R10,		NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	XK_R11,		NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	XK_R12,		NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Z,   	NoSymbol,	XK_guillemotleft,NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	XK_guillemotright,NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	XK_cent,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_M,   	NoSymbol,	XK_mu,  	NoSymbol,	/*106*/
	XK_comma,	XK_semicolon,	NoSymbol,	NoSymbol,	/*107*/
	XK_period,	XK_colon,	NoSymbol,	NoSymbol,	/*108*/
	XK_minus,	XK_equal,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	XK_Linefeed,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	XK_R13,		NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	XK_R14,		NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	XK_R15,		NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	XK_bracketright,XK_bracketleft,	NoSymbol,	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define Netherland4Keymap NULL

#endif /* NETHERLAND4 */


#ifdef NETH5

static KeySym Netherland5Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	SunXK_AudioLowerVolume,SunXK_VideoLowerBrightness,NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	SunXK_AudioRaiseVolume,SunXK_VideoRaiseBrightness,NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	XK_Up,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_Break,	NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_Sys_Req,	SunXK_Sys_Req,	/* 22*/
	XK_Scroll_Lock,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 23*/
	XK_Left,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	XK_Down,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	XK_Right,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_exclam,	XK_onesuperior,	NoSymbol,	/* 30*/
	XK_2,   	XK_quotedbl,	XK_twosuperior,	NoSymbol,	/* 31*/
	XK_3,   	XK_numbersign,	XK_threesuperior,NoSymbol,	/* 32*/
	XK_4,   	XK_dollar,	XK_onequarter,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	XK_onehalf,	NoSymbol,	/* 34*/
	XK_6,   	XK_ampersand,	XK_threequarters,NoSymbol,	/* 35*/
	XK_7,   	XK_underscore,	XK_sterling,	NoSymbol,	/* 36*/
	XK_8,   	XK_parenleft,	XK_braceleft,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenright,	XK_braceright,	NoSymbol,	/* 38*/
	XK_0,   	XK_apostrophe,	XK_grave,	NoSymbol,	/* 39*/
	XK_slash,	XK_question,	XK_backslash,	NoSymbol,	/* 40*/
	XK_degree,	SunXK_FA_Tilde,	SunXK_FA_Cedilla,NoSymbol,	/* 41*/
	XK_at,  	XK_section,	XK_notsign,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	XK_Insert,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	SunXK_AudioMute,SunXK_VideoDegauss,NoSymbol,	NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	NoSymbol,	NoSymbol,	/* 46*/
	XK_KP_Multiply,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 47*/
	SunXK_PowerSwitch,SunXK_PowerSwitchShift,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Separator,NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	XK_Home,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	SunXK_FA_Diaeresis,SunXK_FA_Circum,NoSymbol,	NoSymbol,	/* 64*/
	XK_asterisk,	XK_bar, 	XK_asciitilde,	NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	NoSymbol,	NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	NoSymbol,	NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	NoSymbol,	NoSymbol,	/* 70*/
	XK_KP_Subtract,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	XK_End, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,   	XK_ssharp,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_plus,	XK_plusminus,	NoSymbol,	NoSymbol,	/* 86*/
	SunXK_FA_Acute,	SunXK_FA_Grave,	NoSymbol,	NoSymbol,	/* 87*/
	XK_less,	XK_greater,	XK_asciicircum,	NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	NoSymbol,	NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	NoSymbol,	NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	NoSymbol,	NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	XK_Prior,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_z,   	XK_Z,   	XK_guillemotleft,NoSymbol,	/*100*/
	XK_x,   	XK_X,   	XK_guillemotright,NoSymbol,	/*101*/
	XK_c,   	XK_C,   	XK_cent,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_m,   	XK_M,   	XK_mu,  	NoSymbol,	/*106*/
	XK_comma,	XK_semicolon,	NoSymbol,	NoSymbol,	/*107*/
	XK_period,	XK_colon,	XK_periodcentered,NoSymbol,	/*108*/
	XK_minus,	XK_equal,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	NoSymbol,	NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	NoSymbol,	NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	NoSymbol,	NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	XK_Next,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	XK_bracketright,XK_bracketleft,	XK_brokenbar,	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define Netherland5Keymap NULL

#endif /* NETHERLAND5 */


#ifdef NORW4

static KeySym Norway4Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	XK_asciitilde,	XK_asciicircum,	NoSymbol,	NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_R1,		NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_R2,		NoSymbol,	/* 22*/
	XK_Break,  	XK_Scroll_Lock,	XK_R3,		NoSymbol,	/* 23*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_exclam,	NoSymbol,	NoSymbol,	/* 30*/
	XK_2,   	XK_quotedbl,	XK_at,  	NoSymbol,	/* 31*/
	XK_3,   	XK_numbersign,	XK_sterling,	NoSymbol,	/* 32*/
	XK_4,   	XK_currency,	XK_dollar,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	NoSymbol,	NoSymbol,	/* 34*/
	XK_6,   	XK_ampersand,	NoSymbol,	NoSymbol,	/* 35*/
	XK_7,   	XK_slash,	XK_braceleft,	NoSymbol,	/* 36*/
	XK_8,   	XK_parenleft,	XK_bracketleft,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenright,	XK_bracketright,NoSymbol,	/* 38*/
	XK_0,   	XK_equal,	XK_braceright,	NoSymbol,	/* 39*/
	XK_plus,	XK_question,	NoSymbol,	NoSymbol,	/* 40*/
	XK_backslash,	SunXK_FA_Grave,	SunXK_FA_Acute,	NoSymbol,	/* 41*/
	XK_apostrophe,	XK_asterisk,	XK_grave,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	XK_KP_Equal,  	NoSymbol,  	XK_R4,		NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	XK_R5,		NoSymbol,	/* 46*/
	XK_KP_Multiply,	NoSymbol,  	XK_R6,		NoSymbol,	/* 47*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	XK_Aring,	NoSymbol,	NoSymbol,	NoSymbol,	/* 64*/
	SunXK_FA_Diaeresis,SunXK_FA_Circum,SunXK_FA_Tilde,NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	XK_R7,		NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	XK_R8,		NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	XK_R9,		NoSymbol,	/* 70*/
	XK_KP_Subtract,	NoSymbol,	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_Ooblique,	NoSymbol,	NoSymbol,	NoSymbol,	/* 86*/
	XK_AE,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 87*/
	XK_bar, 	XK_section,	NoSymbol,	NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	XK_R10,		NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	XK_R11,		NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	XK_R12,		NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Z,   	NoSymbol,	NoSymbol,	NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	NoSymbol,	NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_M,   	NoSymbol,	NoSymbol,	NoSymbol,	/*106*/
	XK_comma,	XK_semicolon,	NoSymbol,	NoSymbol,	/*107*/
	XK_period,	XK_colon,	NoSymbol,	NoSymbol,	/*108*/
	XK_minus,	XK_underscore,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	XK_Linefeed,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	XK_R13,		NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	XK_R14,		NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	XK_R15,		NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	XK_less,	XK_greater,	NoSymbol,	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define Norway4Keymap NULL

#endif /* NORWAY4 */


#ifdef NORW5

static KeySym Norway5Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	SunXK_AudioLowerVolume,SunXK_VideoLowerBrightness,NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	SunXK_AudioRaiseVolume,SunXK_VideoRaiseBrightness,NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	XK_Up,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_Break,	NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_Sys_Req,	SunXK_Sys_Req,	/* 22*/
	XK_Scroll_Lock,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 23*/
	XK_Left,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	XK_Down,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	XK_Right,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_exclam,	NoSymbol,	NoSymbol,	/* 30*/
	XK_2,   	XK_quotedbl,	XK_at,  	NoSymbol,	/* 31*/
	XK_3,   	XK_numbersign,	XK_sterling,	NoSymbol,	/* 32*/
	XK_4,   	XK_currency,	XK_dollar,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	XK_asciitilde,	NoSymbol,	/* 34*/
	XK_6,   	XK_ampersand,	XK_asciicircum,	NoSymbol,	/* 35*/
	XK_7,   	XK_slash,	XK_braceleft,	NoSymbol,	/* 36*/
	XK_8,   	XK_parenleft,	XK_bracketleft,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenright,	XK_bracketright,NoSymbol,	/* 38*/
	XK_0,   	XK_equal,	XK_braceright,	NoSymbol,	/* 39*/
	XK_plus,	XK_question,	NoSymbol,	NoSymbol,	/* 40*/
	XK_backslash,	SunXK_FA_Grave,	SunXK_FA_Acute,	NoSymbol,	/* 41*/
	XK_bar, 	XK_section,	NoSymbol,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	XK_Insert,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	SunXK_AudioMute,SunXK_VideoDegauss,NoSymbol,	NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	NoSymbol,	NoSymbol,	/* 46*/
	XK_KP_Multiply, NoSymbol,  	NoSymbol,	NoSymbol,	/* 47*/
	SunXK_PowerSwitch,SunXK_PowerSwitchShift,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Separator,NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	XK_Home,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	XK_Aring,	NoSymbol,	NoSymbol,	NoSymbol,	/* 64*/
	SunXK_FA_Diaeresis,SunXK_FA_Circum,SunXK_FA_Tilde,NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	NoSymbol,	NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	NoSymbol,	NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	NoSymbol,	NoSymbol,	/* 70*/
	XK_KP_Subtract,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	XK_End, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_Ooblique,	NoSymbol,	NoSymbol,	NoSymbol,	/* 86*/
	XK_AE,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 87*/
	XK_apostrophe,	XK_asterisk,	XK_grave,	NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	NoSymbol,	NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	NoSymbol,	NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	NoSymbol,	NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	XK_Prior,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Z,   	NoSymbol,	NoSymbol,	NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	NoSymbol,	NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_M,   	NoSymbol,	NoSymbol,	NoSymbol,	/*106*/
	XK_comma,	XK_semicolon,	NoSymbol,	NoSymbol,	/*107*/
	XK_period,	XK_colon,	NoSymbol,	NoSymbol,	/*108*/
	XK_minus,	XK_underscore,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	NoSymbol,	NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	NoSymbol,	NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	NoSymbol,	NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	XK_Next,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	XK_less,	XK_greater,	NoSymbol,	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define Norway5Keymap NULL

#endif /* NORWAY5 */


#ifdef PORT4

static KeySym Portugal4Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	XK_bracketright,XK_braceright,	XK_guillemotright,NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_R1,		NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_R2,		NoSymbol,	/* 22*/
	XK_Break,  	XK_Scroll_Lock,	XK_R3,		XK_Break,	/* 23*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_exclam,	NoSymbol,	NoSymbol,	/* 30*/
	XK_2,   	XK_quotedbl,	XK_at,  	NoSymbol,	/* 31*/
	XK_3,   	XK_numbersign,	XK_sterling,	NoSymbol,	/* 32*/
	XK_4,   	XK_dollar,	XK_section,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	NoSymbol,	NoSymbol,	/* 34*/
	XK_6,   	XK_ampersand,	XK_notsign,	NoSymbol,	/* 35*/
	XK_7,   	XK_slash,	NoSymbol,	NoSymbol,	/* 36*/
	XK_8,   	XK_parenleft,	NoSymbol,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenright,	XK_backslash,	NoSymbol,	/* 38*/
	XK_0,   	XK_equal,	XK_bar, 	NoSymbol,	/* 39*/
	XK_apostrophe,	XK_question,	XK_grave,	NoSymbol,	/* 40*/
	XK_exclamdown,	XK_questiondown,NoSymbol,	NoSymbol,	/* 41*/
	SunXK_FA_Tilde,	SunXK_FA_Circum,XK_asciicircum,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	XK_KP_Equal,  	NoSymbol,  	XK_R4,		NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	XK_R5,		NoSymbol,	/* 46*/
	XK_KP_Multiply,	NoSymbol,  	XK_R6,		NoSymbol,	/* 47*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	SunXK_FA_Diaeresis,XK_asterisk,	XK_plus,	NoSymbol,	/* 64*/
	SunXK_FA_Acute,	SunXK_FA_Grave,	XK_asciitilde,	NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	XK_R7,		NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	XK_R8,		NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	XK_R9,		NoSymbol,	/* 70*/
	XK_KP_Subtract,	NoSymbol,	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_Ccedilla,	NoSymbol,	NoSymbol,	NoSymbol,	/* 86*/
	XK_masculine,	XK_ordfeminine,	NoSymbol,	NoSymbol,	/* 87*/
	XK_bracketleft,	XK_braceleft,	XK_guillemotleft,NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	XK_R10,		NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	XK_R11,		NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	XK_R12,		NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Z,   	NoSymbol,	NoSymbol,	NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	NoSymbol,	NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_M,   	NoSymbol,	NoSymbol,	NoSymbol,	/*106*/
	XK_comma,	XK_semicolon,	NoSymbol,	NoSymbol,	/*107*/
	XK_period,	XK_colon,	NoSymbol,	NoSymbol,	/*108*/
	XK_minus,	XK_underscore,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	XK_Linefeed,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	XK_R13,		NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	XK_R14,		NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	XK_R15,		NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	XK_less,	XK_greater,	NoSymbol,	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define Portugal4Keymap NULL

#endif /* PORTUGAL4 */


#ifdef PORT5

static KeySym Portugal5Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	SunXK_AudioLowerVolume,SunXK_VideoLowerBrightness,NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	SunXK_AudioRaiseVolume,SunXK_VideoRaiseBrightness,NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	XK_Up,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_Break,	NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_Sys_Req,	SunXK_Sys_Req,	/* 22*/
	XK_Scroll_Lock,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 23*/
	XK_Left,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	XK_Down,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	XK_Right,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_exclam,	NoSymbol,	NoSymbol,	/* 30*/
	XK_2,   	XK_quotedbl,	XK_at,  	NoSymbol,	/* 31*/
	XK_3,   	XK_numbersign,	XK_sterling,	NoSymbol,	/* 32*/
	XK_4,   	XK_dollar,	XK_section,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	XK_asciitilde,	NoSymbol,	/* 34*/
	XK_6,   	XK_ampersand,	XK_asciicircum,	NoSymbol,	/* 35*/
	XK_7,   	XK_slash,	XK_braceleft,	NoSymbol,	/* 36*/
	XK_8,   	XK_parenleft,	XK_bracketleft,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenright,	XK_bracketright,NoSymbol,	/* 38*/
	XK_0,   	XK_equal,	XK_braceright,	NoSymbol,	/* 39*/
	XK_apostrophe,	XK_question,	XK_grave,	NoSymbol,	/* 40*/
	XK_guillemotleft,XK_guillemotright,NoSymbol,	NoSymbol,	/* 41*/
	XK_backslash,	XK_bar, 	NoSymbol,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	XK_Insert,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	SunXK_AudioMute,SunXK_VideoDegauss,NoSymbol,	NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	NoSymbol,	NoSymbol,	/* 46*/
	XK_KP_Multiply,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 47*/
	SunXK_PowerSwitch,SunXK_PowerSwitchShift,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	XK_Home,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	XK_plus,	XK_asterisk,	SunXK_FA_Diaeresis,NoSymbol,	/* 64*/
	SunXK_FA_Acute,	SunXK_FA_Grave,	NoSymbol,	NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	NoSymbol,	NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	NoSymbol,	NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	NoSymbol,	NoSymbol,	/* 70*/
	XK_KP_Subtract,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	XK_End, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_Ccedilla,	NoSymbol,	NoSymbol,	NoSymbol,	/* 86*/
	XK_masculine,	XK_ordfeminine,	NoSymbol,	NoSymbol,	/* 87*/
	SunXK_FA_Tilde,	SunXK_FA_Circum,NoSymbol,	NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	NoSymbol,	NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	NoSymbol,	NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	NoSymbol,	NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	XK_Prior,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Z,   	NoSymbol,	NoSymbol,	NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	NoSymbol,	NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_M,   	NoSymbol,	NoSymbol,	NoSymbol,	/*106*/
	XK_comma,	XK_semicolon,	NoSymbol,	NoSymbol,	/*107*/
	XK_period,	XK_colon,	NoSymbol,	NoSymbol,	/*108*/
	XK_minus,	XK_underscore,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	NoSymbol,	NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	NoSymbol,	NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	NoSymbol,	NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	XK_Next,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	XK_less,	XK_greater,	NoSymbol,	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define Portugal5Keymap NULL

#endif /* PORTUGAL5 */


#ifdef SPAIN5

static KeySym Spain5Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	SunXK_AudioLowerVolume,SunXK_VideoLowerBrightness,NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	SunXK_AudioRaiseVolume,SunXK_VideoRaiseBrightness,NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	XK_Up,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_Break,	NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_Sys_Req,	SunXK_Sys_Req,	/* 22*/
	XK_Scroll_Lock,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 23*/
	XK_Left,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	XK_Down,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	XK_Right,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_exclam,	XK_bar, 	NoSymbol,	/* 30*/
	XK_2,   	XK_quotedbl,	XK_at,  	NoSymbol,	/* 31*/
	XK_3,   	XK_periodcentered,XK_numbersign,NoSymbol,	/* 32*/
	XK_4,   	XK_dollar,	XK_asciicircum,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	XK_asciitilde,	NoSymbol,	/* 34*/
	XK_6,   	XK_ampersand,	XK_notsign,	NoSymbol,	/* 35*/
	XK_7,   	XK_slash,	NoSymbol,	NoSymbol,	/* 36*/
	XK_8,   	XK_parenleft,	NoSymbol,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenright,	NoSymbol,	NoSymbol,	/* 38*/
	XK_0,   	XK_equal,	NoSymbol,	NoSymbol,	/* 39*/
	XK_apostrophe,	XK_question,	XK_grave,	NoSymbol,	/* 40*/
	XK_exclamdown,	XK_questiondown,NoSymbol,	NoSymbol,	/* 41*/
	XK_masculine,	XK_ordfeminine,	XK_backslash,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	XK_Insert,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	SunXK_AudioMute,SunXK_VideoDegauss,NoSymbol,	NoSymbol,	/* 45*/
	XK_KP_Divide,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 46*/
	XK_KP_Multiply,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 47*/
	SunXK_PowerSwitch,SunXK_PowerSwitchShift,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	XK_Home,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	SunXK_FA_Grave,	SunXK_FA_Circum,XK_bracketleft,	NoSymbol,	/* 64*/
	XK_plus,	XK_asterisk,	XK_bracketright,NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	NoSymbol,	NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	NoSymbol,	NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	NoSymbol,	NoSymbol,	/* 70*/
	XK_KP_Subtract,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	XK_End, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_Ntilde,	NoSymbol,	NoSymbol,	NoSymbol,	/* 86*/
	SunXK_FA_Acute,	SunXK_FA_Diaeresis,XK_braceleft,NoSymbol,	/* 87*/
	XK_ccedilla,	XK_Ccedilla,	XK_braceright,	NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	NoSymbol,	NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	NoSymbol,	NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	NoSymbol,	NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	XK_Prior,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Z,   	NoSymbol,	NoSymbol,	NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	NoSymbol,	NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_M,   	NoSymbol,	NoSymbol,	NoSymbol,	/*106*/
	XK_comma,	XK_semicolon,	NoSymbol,	NoSymbol,	/*107*/
	XK_period,	XK_colon,	NoSymbol,	NoSymbol,	/*108*/
	XK_minus,	XK_underscore,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	NoSymbol,	NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	NoSymbol,	NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	NoSymbol,	NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	XK_Next,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	XK_less,	XK_greater,	NoSymbol,	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define Spain5Keymap NULL

#endif /* SPAIN5 */


#ifdef SPAINLATAM4

static KeySym SpainLatAm4Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	XK_bracketright,XK_braceright,	XK_guillemotright,NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_R1,		NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_R2,		NoSymbol,	/* 22*/
	XK_Scroll_Lock,	NoSymbol,  	XK_R3,		XK_Break,	/* 23*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_exclam,	NoSymbol,	NoSymbol,	/* 30*/
	XK_2,   	XK_quotedbl,	XK_at,  	NoSymbol,	/* 31*/
	XK_3,   	XK_periodcentered,XK_numbersign,NoSymbol,	/* 32*/
	XK_4,   	XK_dollar,	NoSymbol,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	XK_degree,	NoSymbol,	/* 34*/
	XK_6,   	XK_ampersand,	XK_notsign,	NoSymbol,	/* 35*/
	XK_7,   	XK_slash,	NoSymbol,	NoSymbol,	/* 36*/
	XK_8,   	XK_parenleft,	NoSymbol,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenright,	XK_backslash,	NoSymbol,	/* 38*/
	XK_0,   	XK_equal,	XK_bar, 	NoSymbol,	/* 39*/
	XK_apostrophe,	XK_question,	XK_grave,	NoSymbol,	/* 40*/
	XK_exclamdown,	XK_questiondown,NoSymbol,	NoSymbol,	/* 41*/
	XK_Ccedilla,	NoSymbol,	NoSymbol,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	XK_KP_Equal,  	NoSymbol,  	XK_R4,		NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	XK_R5,		NoSymbol,	/* 46*/
	XK_KP_Multiply,	NoSymbol,  	XK_R6,		NoSymbol,	/* 47*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	XK_masculine,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	SunXK_FA_Grave,	SunXK_FA_Circum,XK_asciicircum,	NoSymbol,	/* 64*/
	XK_plus,	XK_asterisk,	XK_asciitilde,	NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	XK_R7,		NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	XK_R8,		NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	XK_R9,		NoSymbol,	/* 70*/
	XK_KP_Subtract,	NoSymbol,	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	XK_ordfeminine,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_Ntilde,	NoSymbol,	NoSymbol,	NoSymbol,	/* 86*/
	SunXK_FA_Acute,	SunXK_FA_Diaeresis,NoSymbol,	NoSymbol,	/* 87*/
	XK_bracketleft,	XK_braceleft,	XK_guillemotleft,NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	XK_R10,		NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	XK_R11,		NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	XK_R12,		NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Z,   	NoSymbol,	NoSymbol,	NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	NoSymbol,	NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_M,   	NoSymbol,	NoSymbol,	NoSymbol,	/*106*/
	XK_comma,	XK_semicolon,	NoSymbol,	NoSymbol,	/*107*/
	XK_period,	XK_colon,	NoSymbol,	NoSymbol,	/*108*/
	XK_minus,	XK_underscore,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	XK_Linefeed,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	XK_R13,		NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	XK_R14,		NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	XK_R15,		NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	XK_less,	XK_greater,	NoSymbol,	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define SpainLatAm4Keymap NULL

#endif /* SPAINLATAM4 */


#ifdef SWED5

static KeySym Sweden5Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	SunXK_AudioLowerVolume,SunXK_VideoLowerBrightness,NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	SunXK_AudioRaiseVolume,SunXK_VideoRaiseBrightness,NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	XK_Up,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_Break,	NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_Sys_Req,	SunXK_Sys_Req,	/* 22*/
	XK_Scroll_Lock,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 23*/
	XK_Left,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	XK_Down,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	XK_Right,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_exclam,	NoSymbol,	NoSymbol,	/* 30*/
	XK_2,   	XK_quotedbl,	XK_at,  	NoSymbol,	/* 31*/
	XK_3,   	XK_numbersign,	XK_sterling,	NoSymbol,	/* 32*/
	XK_4,   	XK_currency,	XK_dollar,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	NoSymbol,	NoSymbol,	/* 34*/
	XK_6,   	XK_ampersand,	NoSymbol,	NoSymbol,	/* 35*/
	XK_7,   	XK_slash,	XK_braceleft,	NoSymbol,	/* 36*/
	XK_8,   	XK_parenleft,	XK_bracketleft,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenright,	XK_bracketright,NoSymbol,	/* 38*/
	XK_0,   	XK_equal,	XK_braceright,	NoSymbol,	/* 39*/
	XK_plus,	XK_question,	XK_backslash,	NoSymbol,	/* 40*/
	SunXK_FA_Acute,	SunXK_FA_Grave,	NoSymbol,	NoSymbol,	/* 41*/
	XK_section,	XK_onehalf,	NoSymbol,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	XK_Insert,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	SunXK_AudioMute,SunXK_VideoDegauss,NoSymbol,	NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	NoSymbol,	NoSymbol,	/* 46*/
	XK_KP_Multiply,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 47*/
	SunXK_PowerSwitch,SunXK_PowerSwitchShift,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Separator,NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	XK_Home,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	XK_Aring,	NoSymbol,	NoSymbol,	NoSymbol,	/* 64*/
	SunXK_FA_Diaeresis,XK_asciicircum,XK_asciitilde,NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	NoSymbol,	NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	NoSymbol,	NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	NoSymbol,	NoSymbol,	/* 70*/
	XK_KP_Subtract,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	XK_End, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_Odiaeresis,	NoSymbol,	NoSymbol,	NoSymbol,	/* 86*/
	XK_Adiaeresis,	NoSymbol,	NoSymbol,	NoSymbol,	/* 87*/
	XK_apostrophe,	XK_asterisk,	XK_grave,	NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	NoSymbol,	NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	NoSymbol,	NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	NoSymbol,	NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	XK_Prior,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Z,   	NoSymbol,	NoSymbol,	NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	NoSymbol,	NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_M,   	NoSymbol,	NoSymbol,	NoSymbol,	/*106*/
	XK_comma,	XK_semicolon,	NoSymbol,	NoSymbol,	/*107*/
	XK_period,	XK_colon,	NoSymbol,	NoSymbol,	/*108*/
	XK_minus,	XK_underscore,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	NoSymbol,	NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	NoSymbol,	NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	NoSymbol,	NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	XK_Next,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	XK_less,	XK_greater,	XK_bar, 	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define Sweden5Keymap NULL

#endif /* SWEDEN5 */


#ifdef SWEDFIN4

static KeySym SwedenFin4Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	XK_asciitilde,	XK_asciicircum,	NoSymbol,	NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_R1,		NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_R2,		NoSymbol,	/* 22*/
	XK_Break,  	XK_Scroll_Lock,	XK_R3,		NoSymbol,	/* 23*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_exclam,	NoSymbol,	NoSymbol,	/* 30*/
	XK_2,   	XK_quotedbl,	XK_at,  	NoSymbol,	/* 31*/
	XK_3,   	XK_numbersign,	XK_sterling,	NoSymbol,	/* 32*/
	XK_4,   	XK_currency,	XK_dollar,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	NoSymbol,	NoSymbol,	/* 34*/
	XK_6,   	XK_ampersand,	NoSymbol,	NoSymbol,	/* 35*/
	XK_7,   	XK_slash,	XK_braceleft,	NoSymbol,	/* 36*/
	XK_8,   	XK_parenleft,	XK_bracketleft,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenright,	XK_bracketright,NoSymbol,	/* 38*/
	XK_0,   	XK_equal,	XK_braceright,	NoSymbol,	/* 39*/
	XK_plus,	XK_question,	XK_backslash,	NoSymbol,	/* 40*/
	SunXK_FA_Acute,	SunXK_FA_Grave,	NoSymbol,	NoSymbol,	/* 41*/
	XK_apostrophe,	XK_asterisk,	XK_grave,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	XK_KP_Equal,  	NoSymbol,  	XK_R4,		NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	XK_R5,		NoSymbol,	/* 46*/
	XK_KP_Multiply,	NoSymbol,  	XK_R6,		NoSymbol,	/* 47*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	XK_Aring,	NoSymbol,	NoSymbol,	NoSymbol,	/* 64*/
	SunXK_FA_Diaeresis,SunXK_FA_Circum,SunXK_FA_Tilde,NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	XK_R7,		NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	XK_R8,		NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	XK_R8,		NoSymbol,	/* 70*/
	XK_KP_Subtract,	NoSymbol,	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_Odiaeresis,	NoSymbol,	NoSymbol,	NoSymbol,	/* 86*/
	XK_Adiaeresis,	NoSymbol,	NoSymbol,	NoSymbol,	/* 87*/
	XK_section,	XK_onehalf,	NoSymbol,	NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	XK_R10,		NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	XK_R11,		NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	XK_R12,		NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Z,   	NoSymbol,	NoSymbol,	NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	NoSymbol,	NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_M,   	NoSymbol,	NoSymbol,	NoSymbol,	/*106*/
	XK_comma,	XK_semicolon,	NoSymbol,	NoSymbol,	/*107*/
	XK_period,	XK_colon,	NoSymbol,	NoSymbol,	/*108*/
	XK_minus,	XK_underscore,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	XK_Linefeed,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	XK_R13,		NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	XK_R14,		NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	XK_R15,		NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	XK_less,	XK_greater,	XK_bar, 	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define SwedenFin4Keymap NULL

#endif /* SWEDENFIN4 */


#ifdef SWFR4

static KeySym SwissFr4Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	XK_greater,	XK_braceright,	NoSymbol,	NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_R1,		NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_R2,		NoSymbol,	/* 22*/
	XK_Break,  	XK_Scroll_Lock,	XK_R3,		NoSymbol,	/* 23*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_plus,	XK_exclam,	NoSymbol,	/* 30*/
	XK_2,   	XK_quotedbl,	XK_at,  	NoSymbol,	/* 31*/
	XK_3,   	XK_asterisk,	XK_numbersign,	NoSymbol,	/* 32*/
	XK_4,   	XK_ccedilla,	XK_cent,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	XK_asciitilde,	NoSymbol,	/* 34*/
	XK_6,   	XK_ampersand,	XK_section,	NoSymbol,	/* 35*/
	XK_7,   	XK_slash,	XK_bar, 	NoSymbol,	/* 36*/
	XK_8,   	XK_parenleft,	XK_degree,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenright,	XK_backslash,	NoSymbol,	/* 38*/
	XK_0,   	XK_equal,	XK_asciicircum,	NoSymbol,	/* 39*/
	XK_apostrophe,	XK_question,	XK_grave,	NoSymbol,	/* 40*/
	SunXK_FA_Circum,SunXK_FA_Grave,	NoSymbol,	NoSymbol,	/* 41*/
	XK_dollar,	SunXK_FA_Tilde,	XK_sterling,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	XK_KP_Equal,  	NoSymbol,  	XK_R4,		NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	XK_R5,		NoSymbol,	/* 46*/
	XK_KP_Multiply,	NoSymbol,  	XK_R6,		NoSymbol,	/* 47*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Z,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	XK_egrave,	XK_udiaeresis,	NoSymbol,	NoSymbol,	/* 64*/
	SunXK_FA_Diaeresis,SunXK_FA_Acute,NoSymbol,	NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	XK_R7,		NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	XK_R8,		NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	XK_R9,		NoSymbol,	/* 70*/
	XK_KP_Subtract,	NoSymbol,	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_eacute,	XK_odiaeresis,	NoSymbol,	NoSymbol,	/* 86*/
	XK_agrave,	XK_adiaeresis,	NoSymbol,	NoSymbol,	/* 87*/
	XK_less,	XK_braceleft,	NoSymbol,	NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	XK_R10,		NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	XK_R11,		NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	XK_R12,		NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	NoSymbol,	NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_M,   	NoSymbol,	XK_mu,  	NoSymbol,	/*106*/
	XK_comma,	XK_semicolon,	NoSymbol,	NoSymbol,	/*107*/
	XK_period,	XK_colon,	NoSymbol,	NoSymbol,	/*108*/
	XK_minus,	XK_underscore,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	XK_Linefeed,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	XK_R13,		NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	XK_R14,		NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	XK_R15,		NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	XK_bracketright,XK_bracketleft,	NoSymbol,	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define SwissFr4Keymap NULL

#endif /* SWFR4 */


#ifdef SWFR5

static KeySym SwissFr5Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	SunXK_AudioLowerVolume,SunXK_VideoLowerBrightness,NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	SunXK_AudioRaiseVolume,SunXK_VideoRaiseBrightness,NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	XK_Up,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_Break,	NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_Sys_Req,	SunXK_Sys_Req,	/* 22*/
	XK_Scroll_Lock,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 23*/
	XK_Left,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	XK_Down,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	XK_Right,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_plus,	XK_bar, 	NoSymbol,	/* 30*/
	XK_2,   	XK_quotedbl,	XK_at,  	NoSymbol,	/* 31*/
	XK_3,   	XK_asterisk,	XK_numbersign,	NoSymbol,	/* 32*/
	XK_4,   	XK_ccedilla,	XK_asciicircum,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	XK_asciitilde,	NoSymbol,	/* 34*/
	XK_6,   	XK_ampersand,	NoSymbol,	NoSymbol,	/* 35*/
	XK_7,   	XK_slash,	NoSymbol,	NoSymbol,	/* 36*/
	XK_8,   	XK_parenleft,	NoSymbol,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenright,	NoSymbol,	NoSymbol,	/* 38*/
	XK_0,   	XK_equal,	XK_grave,	NoSymbol,	/* 39*/
	XK_apostrophe,	XK_question,	SunXK_FA_Acute,	NoSymbol,	/* 40*/
	SunXK_FA_Circum,SunXK_FA_Grave,	SunXK_FA_Tilde,	NoSymbol,	/* 41*/
	XK_section,	XK_degree,	NoSymbol,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	XK_Insert,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	SunXK_AudioMute,SunXK_VideoDegauss,NoSymbol,	NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	NoSymbol,	NoSymbol,	/* 46*/
	XK_KP_Multiply,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 47*/
	SunXK_PowerSwitch,SunXK_PowerSwitchShift,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	XK_Home,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Z,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	XK_egrave,	XK_udiaeresis,	XK_bracketleft,	NoSymbol,	/* 64*/
	SunXK_FA_Diaeresis,XK_exclam,	XK_bracketright,NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	NoSymbol,	NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	NoSymbol,	NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	NoSymbol,	NoSymbol,	/* 70*/
	XK_KP_Subtract,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	XK_End, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_eacute,	XK_odiaeresis,	NoSymbol,	NoSymbol,	/* 86*/
	XK_agrave,	XK_adiaeresis,	XK_braceleft,	NoSymbol,	/* 87*/
	XK_dollar,	XK_sterling,	XK_braceright,	NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	NoSymbol,	NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	NoSymbol,	NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	NoSymbol,	NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	XK_Prior,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	NoSymbol,	NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_M,   	NoSymbol,	NoSymbol,	NoSymbol,	/*106*/
	XK_comma,	XK_semicolon,	NoSymbol,	NoSymbol,	/*107*/
	XK_period,	XK_colon,	NoSymbol,	NoSymbol,	/*108*/
	XK_minus,	XK_underscore,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	NoSymbol,	NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	NoSymbol,	NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	NoSymbol,	NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	XK_Next,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	XK_less,	XK_greater,	XK_backslash,	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define SwissFr5Keymap NULL

#endif /* SWFR5 */


#ifdef SWGE4

static KeySym SwissGe4Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	XK_greater,	XK_braceright,	NoSymbol,	NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_R1,		NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_R2,		NoSymbol,	/* 22*/
	XK_Break,  	XK_Scroll_Lock,	XK_R3,		NoSymbol,	/* 23*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_plus,	XK_exclam,	NoSymbol,	/* 30*/
	XK_2,   	XK_quotedbl,	XK_at,  	NoSymbol,	/* 31*/
	XK_3,   	XK_asterisk,	XK_numbersign,	NoSymbol,	/* 32*/
	XK_4,   	XK_ccedilla,	XK_cent,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	XK_asciitilde,	NoSymbol,	/* 34*/
	XK_6,   	XK_ampersand,	XK_section,	NoSymbol,	/* 35*/
	XK_7,   	XK_slash,	XK_bar, 	NoSymbol,	/* 36*/
	XK_8,   	XK_parenleft,	XK_degree,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenright,	XK_backslash,	NoSymbol,	/* 38*/
	XK_0,   	XK_equal,	XK_asciicircum,	NoSymbol,	/* 39*/
	XK_apostrophe,	XK_question,	XK_grave,	NoSymbol,	/* 40*/
	SunXK_FA_Circum,SunXK_FA_Grave,	NoSymbol,	NoSymbol,	/* 41*/
	XK_dollar,	SunXK_FA_Tilde,	XK_sterling,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	XK_KP_Equal,  	NoSymbol,  	XK_R4,		NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	XK_R5,		NoSymbol,	/* 46*/
	XK_KP_Multiply,	NoSymbol,  	XK_R6,		NoSymbol,	/* 47*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Z,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	XK_udiaeresis,	XK_egrave,	NoSymbol,	NoSymbol,	/* 64*/
	SunXK_FA_Diaeresis,SunXK_FA_Acute,NoSymbol,	NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	XK_R7,		NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	XK_R8,		NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	XK_R9,		NoSymbol,	/* 70*/
	XK_KP_Subtract,	NoSymbol,	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_odiaeresis,	XK_eacute,	NoSymbol,	NoSymbol,	/* 86*/
	XK_adiaeresis,	XK_agrave,	NoSymbol,	NoSymbol,	/* 87*/
	XK_less,	XK_braceleft,	NoSymbol,	NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	XK_R10,		NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	XK_R11,		NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	XK_R12,		NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	NoSymbol,	NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_M,   	NoSymbol,	XK_mu,  	NoSymbol,	/*106*/
	XK_comma,	XK_semicolon,	NoSymbol,	NoSymbol,	/*107*/
	XK_period,	XK_colon,	NoSymbol,	NoSymbol,	/*108*/
	XK_minus,	XK_underscore,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	XK_Linefeed,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	XK_R13,		NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	XK_R14,		NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	XK_R15,		NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	XK_bracketright,XK_bracketleft,	NoSymbol,	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define SwissGe4Keymap NULL

#endif /* SWISSGE4 */


#ifdef SWGE5

static KeySym SwissGe5Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	SunXK_AudioLowerVolume,SunXK_VideoLowerBrightness,NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	SunXK_AudioRaiseVolume,SunXK_VideoRaiseBrightness,NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	XK_Up,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_Break,	NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_Sys_Req,	SunXK_Sys_Req,	/* 22*/
	XK_Scroll_Lock,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 23*/
	XK_Left,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	XK_Down,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	XK_Right,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_plus,	XK_bar, 	NoSymbol,	/* 30*/
	XK_2,   	XK_quotedbl,	XK_at,  	NoSymbol,	/* 31*/
	XK_3,   	XK_asterisk,	XK_numbersign,	NoSymbol,	/* 32*/
	XK_4,   	XK_ccedilla,	XK_asciicircum,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	XK_asciitilde,	NoSymbol,	/* 34*/
	XK_6,   	XK_ampersand,	NoSymbol,	NoSymbol,	/* 35*/
	XK_7,   	XK_slash,	NoSymbol,	NoSymbol,	/* 36*/
	XK_8,   	XK_parenleft,	NoSymbol,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenright,	NoSymbol,	NoSymbol,	/* 38*/
	XK_0,   	XK_equal,	XK_grave,	NoSymbol,	/* 39*/
	XK_apostrophe,	XK_question,	SunXK_FA_Acute,	NoSymbol,	/* 40*/
	SunXK_FA_Circum,SunXK_FA_Grave,	SunXK_FA_Tilde,	NoSymbol,	/* 41*/
	XK_section,	XK_degree,	NoSymbol,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	XK_Insert,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	SunXK_AudioMute,SunXK_VideoDegauss,NoSymbol,	NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	NoSymbol,	NoSymbol,	/* 46*/
	XK_KP_Multiply, NoSymbol,  	NoSymbol,	NoSymbol,	/* 47*/
	SunXK_PowerSwitch,SunXK_PowerSwitchShift,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	XK_Home,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Z,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	XK_udiaeresis,	XK_egrave,	XK_bracketleft,	NoSymbol,	/* 64*/
	SunXK_FA_Diaeresis,XK_exclam,	XK_bracketright,NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	NoSymbol,	NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	NoSymbol,	NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	NoSymbol,	NoSymbol,	/* 70*/
	XK_KP_Subtract,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	XK_End, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_odiaeresis,	XK_eacute,	NoSymbol,	NoSymbol,	/* 86*/
	XK_adiaeresis,	XK_agrave,	XK_braceleft,	NoSymbol,	/* 87*/
	XK_dollar,	XK_sterling,	XK_braceright,	NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	NoSymbol,	NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	NoSymbol,	NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	NoSymbol,	NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	XK_Prior,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	NoSymbol,	NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_M,   	NoSymbol,	NoSymbol,	NoSymbol,	/*106*/
	XK_comma,	XK_semicolon,	NoSymbol,	NoSymbol,	/*107*/
	XK_period,	XK_colon,	NoSymbol,	NoSymbol,	/*108*/
	XK_minus,	XK_underscore,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	NoSymbol,	NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	NoSymbol,	NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	NoSymbol,	NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	XK_Next,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	XK_less,	XK_greater,	XK_backslash,	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define SwissGe5Keymap NULL

#endif /* SWITZER_GE5 */


#ifdef TAI4

static KeySym Taiwan4Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_R1,		NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_R2,		NoSymbol,	/* 22*/
	XK_Break,  	XK_Scroll_Lock,	XK_R3,		NoSymbol,	/* 23*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_exclam,	NoSymbol,	NoSymbol,	/* 30*/
	XK_2,   	XK_at,  	NoSymbol,	NoSymbol,	/* 31*/
	XK_3,   	XK_numbersign,	NoSymbol,	NoSymbol,	/* 32*/
	XK_4,   	XK_dollar,	NoSymbol,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	NoSymbol,	NoSymbol,	/* 34*/
	XK_6,   	XK_asciicircum,	NoSymbol,	NoSymbol,	/* 35*/
	XK_7,   	XK_ampersand,	NoSymbol,	NoSymbol,	/* 36*/
	XK_8,   	XK_asterisk,	NoSymbol,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenleft,	NoSymbol,	NoSymbol,	/* 38*/
	XK_0,   	XK_parenright,	NoSymbol,	NoSymbol,	/* 39*/
	XK_minus,	XK_underscore,	NoSymbol,	NoSymbol,	/* 40*/
	XK_equal,	XK_plus,	NoSymbol,	NoSymbol,	/* 41*/
	XK_grave,	XK_asciitilde,	XK_acute,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	XK_KP_Equal,  	NoSymbol,  	XK_R4,		NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	XK_R5,		NoSymbol,	/* 46*/
	XK_KP_Multiply, NoSymbol,  	XK_R6,		NoSymbol,	/* 47*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	XK_bracketleft,	XK_braceleft,	NoSymbol,	NoSymbol,	/* 64*/
	XK_bracketright,XK_braceright,	NoSymbol,	NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	XK_R7,		NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	XK_R8,		NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	XK_R9,		NoSymbol,	/* 70*/
	XK_KP_Subtract,	NoSymbol,	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_semicolon,	XK_colon,	NoSymbol,	NoSymbol,	/* 86*/
	XK_apostrophe,	XK_quotedbl,	NoSymbol,	NoSymbol,	/* 87*/
	XK_backslash,	XK_bar, 	XK_brokenbar,	NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	XK_R10,		NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	XK_R11,		NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	XK_R12,		NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Z,   	NoSymbol,	NoSymbol,	NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	NoSymbol,	NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_M,   	NoSymbol,	NoSymbol,	NoSymbol,	/*106*/
	XK_comma,	XK_less,	NoSymbol,	NoSymbol,	/*107*/
	XK_period,	XK_greater,	NoSymbol,	NoSymbol,	/*108*/
	XK_slash,	XK_question,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	XK_Linefeed,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	XK_R13,		NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	XK_R14,		NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	XK_R15,		NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define Taiwan4Keymap NULL

#endif /* TAIWAN4 */


#ifdef TAI5

static KeySym Taiwan5Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	SunXK_AudioLowerVolume,SunXK_VideoLowerBrightness,NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	SunXK_AudioRaiseVolume,SunXK_VideoRaiseBrightness,NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	XK_Up,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_Break,	NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_Sys_Req,	SunXK_Sys_Req,	/* 22*/
	XK_Scroll_Lock,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 23*/
	XK_Left,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	XK_Down,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	XK_Right,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_exclam,	NoSymbol,	NoSymbol,	/* 30*/
	XK_2,   	XK_at,  	NoSymbol,	NoSymbol,	/* 31*/
	XK_3,   	XK_numbersign,	NoSymbol,	NoSymbol,	/* 32*/
	XK_4,   	XK_dollar,	NoSymbol,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	NoSymbol,	NoSymbol,	/* 34*/
	XK_6,   	XK_asciicircum,	NoSymbol,	NoSymbol,	/* 35*/
	XK_7,   	XK_ampersand,	NoSymbol,	NoSymbol,	/* 36*/
	XK_8,   	XK_asterisk,	NoSymbol,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenleft,	NoSymbol,	NoSymbol,	/* 38*/
	XK_0,   	XK_parenright,	NoSymbol,	NoSymbol,	/* 39*/
	XK_minus,	XK_underscore,	NoSymbol,	NoSymbol,	/* 40*/
	XK_equal,	XK_plus,	NoSymbol,	NoSymbol,	/* 41*/
	XK_grave,	XK_asciitilde,	XK_acute,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	XK_Insert,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	SunXK_AudioMute,SunXK_VideoDegauss,NoSymbol,	NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	NoSymbol,	NoSymbol,	/* 46*/
	XK_KP_Multiply,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 47*/
	SunXK_PowerSwitch,SunXK_PowerSwitchShift,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	XK_Home,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	XK_bracketleft,	XK_braceleft,	NoSymbol,	NoSymbol,	/* 64*/
	XK_bracketright,XK_braceright,	NoSymbol,	NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	NoSymbol,	NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	NoSymbol,	NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	NoSymbol,	NoSymbol,	/* 70*/
	XK_KP_Subtract,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	XK_End, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_semicolon,	XK_colon,	NoSymbol,	NoSymbol,	/* 86*/
	XK_apostrophe,	XK_quotedbl,	NoSymbol,	NoSymbol,	/* 87*/
	XK_backslash,	XK_bar, 	XK_brokenbar,	NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	NoSymbol,	NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	NoSymbol,	NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	NoSymbol,	NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	XK_Prior,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Z,   	NoSymbol,	NoSymbol,	NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	NoSymbol,	NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_M,   	NoSymbol,	NoSymbol,	NoSymbol,	/*106*/
	XK_comma,	XK_less,	NoSymbol,	NoSymbol,	/*107*/
	XK_period,	XK_greater,	NoSymbol,	NoSymbol,	/*108*/
	XK_slash,	XK_question,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	NoSymbol,	NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	NoSymbol,	NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	NoSymbol,	NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	XK_Next,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define Taiwan5Keymap NULL

#endif /* TAIWAN5 */


#ifdef UK4

static KeySym UK4Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_R1,		NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_R2,		NoSymbol,	/* 22*/
	XK_Break,  	XK_Scroll_Lock,	XK_R3,		NoSymbol,	/* 23*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_exclam,	XK_brokenbar,	NoSymbol,	/* 30*/
	XK_2,   	XK_at,  	NoSymbol,	NoSymbol,	/* 31*/
	XK_3,   	XK_sterling,	XK_numbersign,	NoSymbol,	/* 32*/
	XK_4,   	XK_dollar,	NoSymbol,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	NoSymbol,	NoSymbol,	/* 34*/
	XK_6,   	XK_asciicircum,	NoSymbol,	NoSymbol,	/* 35*/
	XK_7,   	XK_ampersand,	NoSymbol,	NoSymbol,	/* 36*/
	XK_8,   	XK_asterisk,	NoSymbol,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenleft,	NoSymbol,	NoSymbol,	/* 38*/
	XK_0,   	XK_parenright,	NoSymbol,	NoSymbol,	/* 39*/
	XK_minus,	XK_underscore,	XK_notsign,	NoSymbol,	/* 40*/
	XK_equal,	XK_plus,	NoSymbol,	NoSymbol,	/* 41*/
	XK_grave,	XK_asciitilde,	XK_acute,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	XK_KP_Equal,  	NoSymbol,  	XK_R4,		NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	XK_R5,		NoSymbol,	/* 46*/
	XK_KP_Multiply,	NoSymbol,  	XK_R6,		NoSymbol,	/* 47*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	XK_bracketleft,	XK_braceleft,	NoSymbol,	NoSymbol,	/* 64*/
	XK_bracketright,XK_braceright,	NoSymbol,	NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	XK_R7,		NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	XK_R8,		NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	XK_R9,		NoSymbol,	/* 70*/
	XK_KP_Subtract,	NoSymbol,	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_semicolon,	XK_colon,	NoSymbol,	NoSymbol,	/* 86*/
	XK_apostrophe,	XK_quotedbl,	XK_acute,	NoSymbol,	/* 87*/
	XK_backslash,	XK_bar, 	NoSymbol,	NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	XK_R10,		NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	XK_R11,		NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	XK_R12,		NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Z,   	NoSymbol,	NoSymbol,	NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	NoSymbol,	NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_M,   	NoSymbol,	NoSymbol,	NoSymbol,	/*106*/
	XK_comma,	XK_less,	NoSymbol,	NoSymbol,	/*107*/
	XK_period,	XK_greater,	NoSymbol,	NoSymbol,	/*108*/
	XK_slash,	XK_question,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	XK_Linefeed,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	XK_R13,		NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	XK_R14,		NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	XK_R15,		NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define UK4Keymap NULL

#endif /* UK4 */


#ifdef UK5

static KeySym UK5Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	SunXK_AudioLowerVolume,SunXK_VideoLowerBrightness,NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	SunXK_AudioRaiseVolume,SunXK_VideoRaiseBrightness,NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	XK_Up,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_Break,	NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_Sys_Req,	SunXK_Sys_Req,	/* 22*/
	XK_Scroll_Lock, NoSymbol,  	NoSymbol,	NoSymbol,	/* 23*/
	XK_Left,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	XK_Down,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	XK_Right,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_exclam,	NoSymbol,	NoSymbol,	/* 30*/
	XK_2,   	XK_quotedbl,	NoSymbol,	NoSymbol,	/* 31*/
	XK_3,   	XK_sterling,	NoSymbol,	NoSymbol,	/* 32*/
	XK_4,   	XK_dollar,	NoSymbol,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	NoSymbol,	NoSymbol,	/* 34*/
	XK_6,   	XK_asciicircum,	NoSymbol,	NoSymbol,	/* 35*/
	XK_7,   	XK_ampersand,	NoSymbol,	NoSymbol,	/* 36*/
	XK_8,   	XK_asterisk,	NoSymbol,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenleft,	NoSymbol,	NoSymbol,	/* 38*/
	XK_0,   	XK_parenright,	NoSymbol,	NoSymbol,	/* 39*/
	XK_minus,	XK_underscore,	NoSymbol,	NoSymbol,	/* 40*/
	XK_equal,	XK_plus,	NoSymbol,	NoSymbol,	/* 41*/
	XK_grave,	XK_notsign,	XK_brokenbar,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	XK_Insert,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	SunXK_AudioMute,SunXK_VideoDegauss,NoSymbol,	NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	NoSymbol,	NoSymbol,	/* 46*/
	XK_KP_Multiply,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 47*/
	SunXK_PowerSwitch,SunXK_PowerSwitchShift,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	XK_Home,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	XK_bracketleft,	XK_braceleft,	NoSymbol,	NoSymbol,	/* 64*/
	XK_bracketright,XK_braceright,	NoSymbol,	NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	NoSymbol,	NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	NoSymbol,	NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	NoSymbol,	NoSymbol,	/* 70*/
	XK_KP_Subtract,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	XK_End, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_semicolon,	XK_colon,	NoSymbol,	NoSymbol,	/* 86*/
	XK_apostrophe,	XK_at,  	XK_acute,	NoSymbol,	/* 87*/
	XK_numbersign,	XK_asciitilde,	NoSymbol,	NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	NoSymbol,	NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	NoSymbol,	NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	NoSymbol,	NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	XK_Prior,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Z,   	NoSymbol,	NoSymbol,	NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	NoSymbol,	NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_M,   	NoSymbol,	NoSymbol,	NoSymbol,	/*106*/
	XK_comma,	XK_less,	NoSymbol,	NoSymbol,	/*107*/
	XK_period,	XK_greater,	NoSymbol,	NoSymbol,	/*108*/
	XK_slash,	XK_question,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	NoSymbol,	NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	NoSymbol,	NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	NoSymbol,	NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	XK_Next,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	XK_backslash,	XK_bar, 	NoSymbol,	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define UK5Keymap NULL

#endif /* UK5 */


#ifdef US101A

static KeySym US101AKeymap[] = {
	XK_Pause,  	NoSymbol,  	XK_Break,	NoSymbol,	/*  1*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  2*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  3*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	XK_Up,  	NoSymbol,  	NoSymbol,	NoSymbol,	/* 20*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_Sys_Req,	SunXK_Sys_Req,	/* 22*/
	XK_Scroll_Lock, NoSymbol,  	NoSymbol,	NoSymbol,	/* 23*/
	XK_Left,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 24*/
	XK_Insert,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 25*/
	XK_End, 	NoSymbol,  	NoSymbol,	NoSymbol,	/* 26*/
	XK_Down,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 27*/
	XK_Right,	NoSymbol, 	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_exclam,	NoSymbol,	NoSymbol,	/* 30*/
	XK_2,   	XK_at,  	NoSymbol,	NoSymbol,	/* 31*/
	XK_3,   	XK_numbersign,	NoSymbol,	NoSymbol,	/* 32*/
	XK_4,   	XK_dollar,	NoSymbol,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	NoSymbol,	NoSymbol,	/* 34*/
	XK_6,   	XK_asciicircum,	NoSymbol,	NoSymbol,	/* 35*/
	XK_7,   	XK_ampersand,	NoSymbol,	NoSymbol,	/* 36*/
	XK_8,   	XK_asterisk,	NoSymbol,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenleft,	NoSymbol,	NoSymbol,	/* 38*/
	XK_0,   	XK_parenright,	NoSymbol,	NoSymbol,	/* 39*/
	XK_minus,	XK_underscore,	NoSymbol,	NoSymbol,	/* 40*/
	XK_equal,	XK_plus,	NoSymbol,	NoSymbol,	/* 41*/
	XK_grave,	XK_asciitilde,	XK_acute,	NoSymbol,	/* 42*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	NoSymbol,	NoSymbol,	/* 46*/
	XK_KP_Multiply,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 47*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 48*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,	/* 50*/
	XK_Prior,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 51*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	XK_bracketleft,	XK_braceleft,	NoSymbol,	NoSymbol,	/* 64*/
	XK_bracketright,XK_braceright,	NoSymbol,	NoSymbol,	/* 65*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	NoSymbol,	NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	NoSymbol,	NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	NoSymbol,	NoSymbol,	/* 70*/
	XK_KP_Subtract,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 71*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 72*/
	XK_Next,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 73*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_semicolon,	XK_colon,	NoSymbol,	NoSymbol,	/* 86*/
	XK_apostrophe,	XK_quotedbl,	XK_acute,	NoSymbol,	/* 87*/
	XK_backslash,	XK_bar, 	NoSymbol,	NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	NoSymbol,	NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	NoSymbol,	NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	NoSymbol,	NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 95*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	XK_Home,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Z,   	NoSymbol,	NoSymbol,	NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	NoSymbol,	NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_M,   	NoSymbol,	NoSymbol,	NoSymbol,	/*106*/
	XK_comma,	XK_less,	NoSymbol,	NoSymbol,	/*107*/
	XK_period,	XK_greater,	NoSymbol,	NoSymbol,	/*108*/
	XK_slash,	XK_question,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	NoSymbol,	NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	NoSymbol,	NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	NoSymbol,	NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Delete,	NoSymbol,  	NoSymbol,	NoSymbol,	/*118*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define US101AKeymap NULL

#endif /* US101A */


#ifdef US4

static KeySym US4Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_R1,		NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_R2,		NoSymbol,	/* 22*/
	XK_Break,  	XK_Scroll_Lock,	XK_R3,		NoSymbol,	/* 23*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_exclam,	NoSymbol,	NoSymbol,	/* 30*/
	XK_2,   	XK_at,  	NoSymbol,	NoSymbol,	/* 31*/
	XK_3,   	XK_numbersign,	NoSymbol,	NoSymbol,	/* 32*/
	XK_4,   	XK_dollar,	NoSymbol,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	NoSymbol,	NoSymbol,	/* 34*/
	XK_6,   	XK_asciicircum,	NoSymbol,	NoSymbol,	/* 35*/
	XK_7,   	XK_ampersand,	NoSymbol,	NoSymbol,	/* 36*/
	XK_8,   	XK_asterisk,	NoSymbol,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenleft,	NoSymbol,	NoSymbol,	/* 38*/
	XK_0,   	XK_parenright,	NoSymbol,	NoSymbol,	/* 39*/
	XK_minus,	XK_underscore,	NoSymbol,	NoSymbol,	/* 40*/
	XK_equal,	XK_plus,	NoSymbol,	NoSymbol,	/* 41*/
	XK_grave,	XK_asciitilde,	XK_acute,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	XK_KP_Equal,  	NoSymbol,  	XK_R4,		NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	XK_R5,		NoSymbol,	/* 46*/
	XK_KP_Multiply,	NoSymbol,	XK_R6,		NoSymbol,	/* 47*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	XK_bracketleft,	XK_braceleft,	NoSymbol,	NoSymbol,	/* 64*/
	XK_bracketright,XK_braceright,	NoSymbol,	NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	XK_R7,		NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	XK_R8,		NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	XK_R9,		NoSymbol,	/* 70*/
	XK_KP_Subtract,	NoSymbol,	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_semicolon,	XK_colon,	NoSymbol,	NoSymbol,	/* 86*/
	XK_apostrophe,	XK_quotedbl,	XK_acute,	NoSymbol,	/* 87*/
	XK_backslash,	XK_bar, 	NoSymbol,	NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	XK_R10,		NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	XK_R11,		NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	XK_R12,		NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Z,   	NoSymbol,	NoSymbol,	NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	NoSymbol,	NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_M,   	NoSymbol,	NoSymbol,	NoSymbol,	/*106*/
	XK_comma,	XK_less,	NoSymbol,	NoSymbol,	/*107*/
	XK_period,	XK_greater,	NoSymbol,	NoSymbol,	/*108*/
	XK_slash,	XK_question,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	XK_Linefeed,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	XK_R13,		NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	XK_R14,		NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	XK_R15,		NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	XK_Help,	NoSymbol,	NoSymbol,	/*118*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define US4Keymap NULL

#endif /* US4 */


#ifdef US5

static KeySym US5Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	SunXK_AudioLowerVolume,SunXK_VideoLowerBrightness,NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	SunXK_AudioRaiseVolume,SunXK_VideoRaiseBrightness,NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	XK_Up,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_Break,	NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_Sys_Req,	SunXK_Sys_Req,	/* 22*/
	XK_Scroll_Lock,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 23*/
	XK_Left,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	XK_Down,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	XK_Right,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_exclam,	NoSymbol,	NoSymbol,	/* 30*/
	XK_2,   	XK_at,  	NoSymbol,	NoSymbol,	/* 31*/
	XK_3,   	XK_numbersign,	NoSymbol,	NoSymbol,	/* 32*/
	XK_4,   	XK_dollar,	NoSymbol,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	NoSymbol,	NoSymbol,	/* 34*/
	XK_6,   	XK_asciicircum,	NoSymbol,	NoSymbol,	/* 35*/
	XK_7,   	XK_ampersand,	NoSymbol,	NoSymbol,	/* 36*/
	XK_8,   	XK_asterisk,	NoSymbol,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenleft,	NoSymbol,	NoSymbol,	/* 38*/
	XK_0,   	XK_parenright,	NoSymbol,	NoSymbol,	/* 39*/
	XK_minus,	XK_underscore,	NoSymbol,	NoSymbol,	/* 40*/
	XK_equal,	XK_plus,	NoSymbol,	NoSymbol,	/* 41*/
	XK_grave,	XK_asciitilde,	XK_acute,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	XK_Insert,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	SunXK_AudioMute,SunXK_VideoDegauss,NoSymbol,	NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	NoSymbol,	NoSymbol,	/* 46*/
	XK_KP_Multiply,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 47*/
	SunXK_PowerSwitch,SunXK_PowerSwitchShift,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	XK_Home,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	XK_bracketleft,	XK_braceleft,	NoSymbol,	NoSymbol,	/* 64*/
	XK_bracketright,XK_braceright,	NoSymbol,	NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,	XK_KP_7,  	NoSymbol,	NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	NoSymbol,	NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	NoSymbol,	NoSymbol,	/* 70*/
	XK_KP_Subtract,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	XK_End, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_semicolon,	XK_colon,	NoSymbol,	NoSymbol,	/* 86*/
	XK_apostrophe,	XK_quotedbl,	XK_acute,	NoSymbol,	/* 87*/
	XK_backslash,	XK_bar, 	NoSymbol,	NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	NoSymbol,	NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	NoSymbol,	NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	NoSymbol,	NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	XK_Prior,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Z,   	NoSymbol,	NoSymbol,	NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	NoSymbol,	NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_M,   	NoSymbol,	NoSymbol,	NoSymbol,	/*106*/
	XK_comma,	XK_less,	NoSymbol,	NoSymbol,	/*107*/
	XK_period,	XK_greater,	NoSymbol,	NoSymbol,	/*108*/
	XK_slash,	XK_question,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	NoSymbol,	NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	NoSymbol,	NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	NoSymbol,	NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	XK_Next,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define US5Keymap NULL

#endif /* US5 */

#ifdef US_UNIX5

static KeySym US_UNIX5Keymap[] = {
	SunXK_Stop,  	NoSymbol,  	XK_L1,		NoSymbol,	/*  1*/
	SunXK_AudioLowerVolume,SunXK_VideoLowerBrightness,NoSymbol,	NoSymbol,	/*  2*/
	SunXK_Again,  	NoSymbol,  	XK_L2,		NoSymbol,	/*  3*/
	SunXK_AudioRaiseVolume,SunXK_VideoRaiseBrightness,NoSymbol,	NoSymbol,	/*  4*/
	XK_F1,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  5*/
	XK_F2,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  6*/
	XK_F10, 	NoSymbol,	NoSymbol,	NoSymbol,	/*  7*/
	XK_F3,  	NoSymbol,	NoSymbol,	NoSymbol,	/*  8*/
	XK_F11,		NoSymbol,	SunXK_F36,	NoSymbol,	/*  9*/
	XK_F4,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 10*/
	XK_F12,		NoSymbol,	SunXK_F37,	NoSymbol,	/* 11*/
	XK_F5,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 12*/
	SunXK_AltGraph,	NoSymbol,	NoSymbol,	NoSymbol,	/* 13*/
	XK_F6,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 14*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 15*/
	XK_F7,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 16*/
	XK_F8,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 17*/
	XK_F9,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 18*/
	XK_Alt_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 19*/
	XK_Up,  	NoSymbol,	NoSymbol,	NoSymbol,	/* 20*/
	XK_Pause,  	NoSymbol,  	XK_Break,	NoSymbol,	/* 21*/
	XK_Print,  	NoSymbol,  	XK_Sys_Req,	SunXK_Sys_Req,	/* 22*/
	XK_Scroll_Lock,	NoSymbol,  	NoSymbol,	NoSymbol,	/* 23*/
	XK_Left,	NoSymbol,	NoSymbol,	NoSymbol,	/* 24*/
	SunXK_Props,  	NoSymbol,  	XK_L3,		NoSymbol,	/* 25*/
	SunXK_Undo,  	NoSymbol,  	XK_L4,		NoSymbol,	/* 26*/
	XK_Down,	NoSymbol,	NoSymbol,	NoSymbol,	/* 27*/
	XK_Right,	NoSymbol,	NoSymbol,	NoSymbol,	/* 28*/
	XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,	/* 29*/
	XK_1,   	XK_exclam,	NoSymbol,	NoSymbol,	/* 30*/
	XK_2,   	XK_at,  	NoSymbol,	NoSymbol,	/* 31*/
	XK_3,   	XK_numbersign,	NoSymbol,	NoSymbol,	/* 32*/
	XK_4,   	XK_dollar,	NoSymbol,	NoSymbol,	/* 33*/
	XK_5,   	XK_percent,	NoSymbol,	NoSymbol,	/* 34*/
	XK_6,   	XK_asciicircum,	NoSymbol,	NoSymbol,	/* 35*/
	XK_7,   	XK_ampersand,	NoSymbol,	NoSymbol,	/* 36*/
	XK_8,   	XK_asterisk,	NoSymbol,	NoSymbol,	/* 37*/
	XK_9,   	XK_parenleft,	NoSymbol,	NoSymbol,	/* 38*/
	XK_0,   	XK_parenright,	NoSymbol,	NoSymbol,	/* 39*/
	XK_minus,	XK_underscore,	NoSymbol,	NoSymbol,	/* 40*/
	XK_equal,	XK_plus,	NoSymbol,	NoSymbol,	/* 41*/
	XK_grave,	XK_asciitilde,	XK_acute,	NoSymbol,	/* 42*/
	XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,	/* 43*/
	XK_Insert,	NoSymbol,	NoSymbol,	NoSymbol,	/* 44*/
	SunXK_AudioMute,SunXK_VideoDegauss,NoSymbol,	NoSymbol,	/* 45*/
	XK_KP_Divide,  	NoSymbol,  	NoSymbol,	NoSymbol,	/* 46*/
	XK_KP_Multiply, NoSymbol,  	NoSymbol,	NoSymbol,	/* 47*/
	SunXK_PowerSwitch,SunXK_PowerSwitchShift,	NoSymbol,	NoSymbol,	/* 48*/
	SunXK_Front,  	NoSymbol,  	XK_L5,		NoSymbol,	/* 49*/
	XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,	/* 50*/
	SunXK_Copy,  	NoSymbol,  	XK_L6,		NoSymbol,	/* 51*/
	XK_Home,	NoSymbol,	NoSymbol,	NoSymbol,	/* 52*/
	XK_Tab, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 53*/
	XK_Q,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 54*/
	XK_W,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 55*/
	XK_E,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 56*/
	XK_R,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 57*/
	XK_T,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 58*/
	XK_Y,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 59*/
	XK_U,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 60*/
	XK_I,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 61*/
	XK_O,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 62*/
	XK_P,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 63*/
	XK_bracketleft,	XK_braceleft,	NoSymbol,	NoSymbol,	/* 64*/
	XK_bracketright,XK_braceright,	NoSymbol,	NoSymbol,	/* 65*/
	XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,	/* 66*/
	SunXK_Compose,	NoSymbol,	NoSymbol,	NoSymbol,	/* 67*/
	XK_KP_Home,  	XK_KP_7,  	NoSymbol,	NoSymbol,	/* 68*/
	XK_KP_Up,  	XK_KP_8,  	NoSymbol,	NoSymbol,	/* 69*/
	XK_KP_Prior,  	XK_KP_9,  	NoSymbol,	NoSymbol,	/* 70*/
	XK_KP_Subtract, NoSymbol,  	NoSymbol,	NoSymbol,	/* 71*/
	SunXK_Open,  	NoSymbol,  	XK_L7,		NoSymbol,	/* 72*/
	SunXK_Paste,  	NoSymbol,  	XK_L8,		NoSymbol,	/* 73*/
	XK_End, 	NoSymbol,	NoSymbol,	NoSymbol,	/* 74*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/* 75*/
	XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 76*/
	XK_A,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 77*/
	XK_S,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 78*/
	XK_D,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 79*/
	XK_F,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 80*/
	XK_G,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 81*/
	XK_H,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 82*/
	XK_J,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 83*/
	XK_K,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 84*/
	XK_L,   	NoSymbol,	NoSymbol,	NoSymbol,	/* 85*/
	XK_semicolon,	XK_colon,	NoSymbol,	NoSymbol,	/* 86*/
	XK_apostrophe,	XK_quotedbl,	XK_acute,	NoSymbol,	/* 87*/
	XK_backslash,	XK_bar, 	NoSymbol,	NoSymbol,	/* 88*/
	XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,	/* 89*/
	XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,	/* 90*/
	XK_KP_Left,	XK_KP_4, 	NoSymbol,	NoSymbol,	/* 91*/
	NoSymbol, 	XK_KP_5, 	NoSymbol,	NoSymbol,	/* 92*/
	XK_KP_Right,	XK_KP_6, 	NoSymbol,	NoSymbol,	/* 93*/
	XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,	/* 94*/
	SunXK_Find,  	NoSymbol,  	XK_L9,		NoSymbol,	/* 95*/
	XK_Prior,	NoSymbol,	NoSymbol,	NoSymbol,	/* 96*/
	SunXK_Cut, 	NoSymbol, 	XK_L10,		NoSymbol,	/* 97*/
	XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/* 98*/
	XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,	/* 99*/
	XK_Z,   	NoSymbol,	NoSymbol,	NoSymbol,	/*100*/
	XK_X,   	NoSymbol,	NoSymbol,	NoSymbol,	/*101*/
	XK_C,   	NoSymbol,	NoSymbol,	NoSymbol,	/*102*/
	XK_V,   	NoSymbol,	NoSymbol,	NoSymbol,	/*103*/
	XK_B,   	NoSymbol,	NoSymbol,	NoSymbol,	/*104*/
	XK_N,   	NoSymbol,	NoSymbol,	NoSymbol,	/*105*/
	XK_M,   	NoSymbol,	NoSymbol,	NoSymbol,	/*106*/
	XK_comma,	XK_less,	NoSymbol,	NoSymbol,	/*107*/
	XK_period,	XK_greater,	NoSymbol,	NoSymbol,	/*108*/
	XK_slash,	XK_question,	NoSymbol,	NoSymbol,	/*109*/
	XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*110*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*111*/
	XK_KP_End, 	XK_KP_1, 	NoSymbol,	NoSymbol, 	/*112*/
	XK_KP_Down,	XK_KP_2, 	NoSymbol,	NoSymbol,	/*113*/
	XK_KP_Next, 	XK_KP_3, 	NoSymbol,	NoSymbol,	/*114*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*115*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*116*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*117*/
	XK_Help,	NoSymbol,	NoSymbol,	NoSymbol,	/*118*/
	XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,	/*119*/
	XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,	/*120*/
	XK_space,	NoSymbol,	NoSymbol,	NoSymbol,	/*121*/
	XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,	/*122*/
	XK_Next,	NoSymbol,	NoSymbol,	NoSymbol,	/*123*/
	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,	/*124*/
	XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,	/*125*/
};

#else

#define US_UNIX5Keymap NULL

#endif /* US_UNIX5 */

KeySym *sunType4KeyMaps[] = {
	US4Keymap,		/* 0 */
	US4Keymap,		/* 1 */
	FranceBelg4Keymap,	/* 2 */
	Canada4Keymap,		/* 3 */
	Denmark4Keymap,		/* 4 */
	Germany4Keymap,		/* 5 */
	Italy4Keymap,		/* 6 */
	Netherland4Keymap,	/* 7 */
	Norway4Keymap,		/* 8 */
	Portugal4Keymap,	/* 9 */
	SpainLatAm4Keymap,	/* 10 */
	SwedenFin4Keymap,	/* 11 */
	SwissFr4Keymap,		/* 12 */
	SwissGe4Keymap,		/* 13 */
	UK4Keymap,		/* 14 */
	NULL,			/* 15 */
	Korea4Keymap,		/* 16 */
	Taiwan4Keymap,		/* 17 */
	NULL,			/* 18 */
	US101AKeymap,		/* 19 */
	NULL,			/* 20 */
	NULL,			/* 21 */
	NULL,			/* 22 */
	NULL,			/* 23 */
	NULL,			/* 24 */
	NULL,			/* 25 */
	NULL,			/* 26 */
	NULL,			/* 27 */
	NULL,			/* 28 */
	NULL,			/* 29 */
	NULL,			/* 30 */
	NULL,			/* 31 */
	Japan4Keymap,		/* 32 */
	US5Keymap,		/* 33 */
	US_UNIX5Keymap,		/* 34 */
	France5Keymap,		/* 35 */
	Denmark5Keymap,		/* 36 */
	Germany5Keymap,		/* 37 */
	Italy5Keymap,		/* 38 */
	Netherland5Keymap,	/* 39 */
	Norway5Keymap,		/* 40 */
	Portugal5Keymap,	/* 41 */
	Spain5Keymap,		/* 42 */
	Sweden5Keymap,		/* 43 */
	SwissFr5Keymap,		/* 44 */
	SwissGe5Keymap,		/* 45 */
	UK5Keymap,		/* 46 */
	Korea5Keymap,		/* 47 */
	Taiwan5Keymap,		/* 48 */
	Japan5Keymap,		/* 49 */
	CanadaFr5Keymap,	/* 50 */
	NULL, /* Hungary5 */	/* 51 */
	NULL, /* Poland5 */	/* 52 */
	NULL, /* Czech5 */	/* 53 */
	NULL, /* Russia5 */	/* 54 */
	NULL, 			/* 55 */
	NULL,			/* 56 */
	NULL,			/* 57 */
	NULL,			/* 58 */
	NULL,			/* 59 */
	NULL,			/* 60 */
	NULL,			/* 61 */
	NULL,			/* 62 */
	NULL, /* CanadaFr5+ */	/* 63 */
	NULL,			/* 64 */
	NULL,			/* 65 */
	NULL,			/* 66 */
	NULL,			/* 67 */
	NULL,			/* 68 */
	NULL,			/* 69 */
	NULL,			/* 70 */
	NULL,			/* 71 */
	NULL,			/* 72 */
	NULL,			/* 73 */
	NULL,			/* 74 */
	NULL,			/* 75 */
	NULL,			/* 76 */
	NULL,			/* 77 */
	NULL,			/* 78 */
	NULL,			/* 79 */
/*
 * We're punting on SPARC Voyager support for now. The OpenLook server
 * apparently adds special semantics to Num_Lock, which requires indexing
 * into column 5 of the keymap, which isn't handled by the core protocol
 * at all, (it is in XKB.) We could do some tricky remapping, sort of
 * like what the PC ddxen need to do to deal with funky PC keyboards; but
 * for now we'll just pretend that Voyager (Hobo) keyboards are the same
 * as the equivalent Sun5 keyboard.
 */
	US5Keymap, 		/* 80 */
	US_UNIX5Keymap,		/* 81 */
	France5Keymap,		/* 82 */
	Denmark5Keymap,		/* 83 */
	Germany5Keymap,		/* 84 */
	Italy5Keymap,		/* 85 */
	Netherland5Keymap,	/* 86 */
	Norway5Keymap,		/* 87 */
	Portugal5Keymap,	/* 88 */
	Spain5Keymap,		/* 89 */
	Sweden5Keymap,		/* 90 */
	SwissFr5Keymap,		/* 91 */
	SwissGe5Keymap,		/* 92 */
	UK5Keymap,		/* 93 */
	Korea5Keymap,		/* 94 */
	Taiwan5Keymap,		/* 95 */
	Japan5Keymap,		/* 96 */
	CanadaFr5Keymap,	/* 97 */
};

const int sunMaxLayout = sizeof(sunType4KeyMaps) / sizeof(sunType4KeyMaps[0]);

File Added: xsrc/external/mit/xorg-server/dist/hw/sun/sunInit.c
/* $Xorg: sunInit.c,v 1.4 2000/08/17 19:48:29 cpqbld Exp $ */
/*
 * sunInit.c --
 *	Initialization functions for screen/keyboard/mouse, etc.
 *
 * Copyright 1987 by the Regents of the University of California
 *
 * Permission to use, copy, modify, and distribute this
 * software and its documentation for any purpose and without
 * fee is hereby granted, provided that the above copyright
 * notice appear in all copies.  The University of California
 * makes no representations about the suitability of this
 * software for any purpose.  It is provided "as is" without
 * express or implied warranty.
 *
 *
 */
/* $XFree86: xc/programs/Xserver/hw/sun/sunInit.c,v 3.14 2004/06/02 22:43:00 dawes Exp $ */

/************************************************************
Copyright 1987 by Sun Microsystems, Inc. Mountain View, CA.

                    All Rights Reserved

Permission  to  use,  copy,  modify,  and  distribute   this
software  and  its documentation for any purpose and without
fee is hereby granted, provided that the above copyright no-
tice  appear  in all copies and that both that copyright no-
tice and this permission notice appear in  supporting  docu-
mentation,  and  that the names of Sun or The Open Group
not be used in advertising or publicity pertaining to
distribution  of  the software  without specific prior
written permission. Sun and The Open Group make no
representations about the suitability of this software for
any purpose. It is provided "as is" without any express or
implied warranty.

SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
THE USE OR PERFORMANCE OF THIS SOFTWARE.

*******************************************************/

#include    "sun.h"
#include    "gcstruct.h"
#include    "mi.h"
#include    "fb.h"
#include    "extinit.h"

/* default log file paths */
#ifndef DEFAULT_LOGDIR
#define DEFAULT_LOGDIR "/var/log"
#endif
#ifndef DEFAULT_LOGPREFIX
#define DEFAULT_LOGPREFIX "Xsun."
#endif

/* maximum pixmap depth */
#ifndef SUNMAXDEPTH
#define SUNMAXDEPTH 8
#endif

#ifdef i386 /* { */
#define BW2I NULL
#else /* }{ */
#define BW2I sunBW2Init
#endif /* } */

#ifdef LOWMEMFTPT
#undef  BW2I
#define BW2I NULL
#endif /* ifdef LOWMEMFTPT */

#if SUNMAXDEPTH == 1 /* { */
#define CG2I NULL
#define CG3I NULL
#define CG4I NULL
#define CG6I NULL
#define CG8I NULL
#define TCXI NULL
#else /* }{ */
#define CG3I sunCG3Init
#if defined(i386) || defined(__bsdi__) /* { */
#define CG2I NULL
#define CG4I NULL
#else /* }{ */
#ifdef INCLUDE_CG2_HEADER
#define CG2I sunCG2Init
#endif /* INCLUDE_CG2_HEADER */
#define CG4I sunCG4Init
#endif /* } */
#ifdef FBTYPE_SUNFAST_COLOR /* { */
#define CG6I sunCG6Init
#else /* }{ */
#define CG6I NULL
#endif /* } */
#ifdef XFBTYPE_TCX  /* { */
#define TCXI sunTCXInit
#else /* }{ */
#define TCXI NULL
#endif /* } */
#if SUNMAXDEPTH > 8 /* { */
#ifdef FBTYPE_MEMCOLOR /* { */
#define CG8I sunCG8Init
#else /* }{ */
#define CG8I NULL
#endif /* } */
#else /* }{ */
#define CG8I NULL
#endif /* } */

#endif /* } */

static int OpenFrameBuffer(char *, int);
static void SigIOHandler(int);
static char** GetDeviceList(int, char **);
static void getKbdType(void);

#if SUNMAXDEPTH == 32
static Bool sunCfbCreateGC(GCPtr);
static void sunCfbGetSpans(DrawablePtr, int, DDXPointPtr, int *, int, char *);
static void sunCfbGetImage(DrawablePtr, int,int, int, int, unsigned int, unsigned long, char *);
#endif /* SUNMAXDEPTH == 32 */

static Bool	sunDevsInited = FALSE;

Bool sunSwapLkeys = FALSE;
Bool sunDebug = FALSE;
char *sunDeviceList = NULL;
Bool sunForceMono = FALSE;
Bool sunFlipPixels = FALSE;
Bool sunFbInfo = FALSE;
Bool sunCG4Frob = FALSE;
Bool sunNoGX = FALSE;

sunKbdPrivRec sunKbdPriv = {
    -1,		/* fd */
    -1,		/* type */
    -1,		/* layout */
    0,		/* click */
    (Leds)0,	/* leds */
};

sunPtrPrivRec sunPtrPriv = {
    -1,		/* fd */
    0		/* Current button state */
};

/*
 * The name member in the following table corresponds to the
 * FBTYPE_* macros defined in /usr/include/sun/fbio.h file
 */
sunFbDataRec sunFbData[XFBTYPE_LASTPLUSONE] = {
  { NULL, "SUN1BW        (bw1)" },
  { NULL, "SUN1COLOR     (cg1)" },
  { BW2I, "SUN2BW        (bw2)" },
#ifdef INCLUDE_CG2_HEADER
  { CG2I, "SUN2COLOR     (cg2)" },
#else
  { NULL, "SUN2COLOR     (cg2)" },
#endif /* INCLUDE_CG2_HEADER */
  { NULL, "SUN2GP        (gp1/gp2)" },
  { NULL, "SUN5COLOR     (cg5/386i accel)" },
  { CG3I, "SUN3COLOR     (cg3)" },
  { CG8I, "MEMCOLOR      (cg8)" },
  { CG4I, "SUN4COLOR     (cg4)" },
  { NULL, "NOTSUN1" },
  { NULL, "NOTSUN2" },
  { NULL, "NOTSUN3" }
#ifndef i386 /* { */
 ,{ CG6I, "SUNFAST_COLOR (cg6/gx)" },
  { NULL, "SUNROP_COLOR  (cg9)" },
  { NULL, "SUNFB_VIDEO" },
  { NULL, "SUNGIFB" },
  { NULL, "SUNPLAS" },
#ifdef FBTYPE_SUNGP3
  { NULL, "SUNGP3        (cg12/gs)" },
#endif
#ifdef FBTYPE_SUNGT
  { NULL, "SUNGT         (gt)" },
#endif
#ifdef FBTYPE_SUNLEO
  { NULL, "SUNLEO        (zx)" },
#endif
#ifdef FBTYPE_MDICOLOR
  { NULL, "MDICOLOR      (cgfourteen)" },
#endif
#ifdef XFBTYPE_TCX
  { TCXI, "TCX           (tcx)" },
#endif
#endif /* } */
};

/*
 * a list of devices to try if there is no environment or command
 * line list of devices
 */
#if SUNMAXDEPTH == 1 /* { */
static char *fallbackList[] = {
    BWTWO0DEV, BWTWO1DEV, BWTWO2DEV
};
#else /* }{ */
static char *fallbackList[] = {
#ifndef i386 /* { */
    CGTWO0DEV, CGTWO1DEV, CGTWO2DEV,
#if (MAXSCREENS == 4)
    CGTWO3DEV,
#endif
#endif /* } */
    CGTHREE0DEV,
#ifndef i386 /* { */
    CGTHREE1DEV, CGTHREE2DEV,
#if (MAXSCREENS == 4)
    CGTHREE3DEV,
#endif
#endif /* } */
#ifdef FBTYPE_SUNFAST_COLOR /* { */
    CGSIX0DEV, CGSIX1DEV, CGSIX2DEV,
#if (MAXSCREENS == 4)
    CGSIX3DEV,
#endif
#endif /* } */
#ifndef i386 /* { */
    CGFOUR0DEV, BWTWO0DEV, BWTWO1DEV, BWTWO2DEV,
#if (MAXSCREENS == 4)
    BWTWO3DEV,
#endif
#endif /* } */
#if SUNMAXDEPTH > 8 /* { */
    CGEIGHT0DEV,
#if 0
#ifdef XFBTYPE_TCX
    TCX0DEV,
#endif
#endif
#endif /* } */
    "/dev/fb"
};
#endif /* } */

#define FALLBACK_LIST_LEN sizeof fallbackList / sizeof fallbackList[0]

fbFd sunFbs[MAXSCREENS];

static PixmapFormatRec	formats[] = {
    { 1, 1, BITMAP_SCANLINE_PAD	} /* 1-bit deep */
#if SUNMAXDEPTH > 1
    ,{ 8, 8, BITMAP_SCANLINE_PAD} /* 8-bit deep */
#if SUNMAXDEPTH > 8
    ,{ 12, 24, BITMAP_SCANLINE_PAD } /* 12-bit deep */
    ,{ 24, 32, BITMAP_SCANLINE_PAD } /* 24-bit deep */
#endif
#endif
};
#define NUMFORMATS	(sizeof formats)/(sizeof formats[0])

/*
 * OpenFrameBuffer --
 *	Open a frame buffer according to several rules.
 *	Find the device to use by looking in the sunFbData table,
 *	an XDEVICE envariable, a -dev switch or using /dev/fb if trying
 *	to open screen 0 and all else has failed.
 *
 * Results:
 *	The fd of the framebuffer.
 */
static int
OpenFrameBuffer(
    char		*device,	/* e.g. "/dev/cgtwo0" */
    int			screen    	/* what screen am I going to be */
)
{
    int			ret = TRUE;
    struct fbgattr	*fbattr;
    static int		devFbUsed;

    sunFbs[screen].fd = -1;
    if (strcmp (device, "/dev/fb") == 0 && devFbUsed)
	return FALSE;
    if (access (device, R_OK | W_OK) == -1)
	return FALSE;
    if ((sunFbs[screen].fd = open(device, O_RDWR, 0)) == -1)
	ret = FALSE;
    else {
	fbattr = malloc (sizeof (struct fbgattr));
	if (ioctl(sunFbs[screen].fd, FBIOGATTR, fbattr) == -1) {
	    /*
		This is probably a bwtwo; the $64,000 question is:
		is it the mono plane of a cgfour, or is it really a
		real bwtwo?  If there is only a cgfour in the box or
		only a bwtwo in the box, then it isn't a problem.  If
		it's a 3/60, which has a bwtwo on the mother board *and*
		a cgfour, then things get tricky because there's no way
		to tell if the bwtwo is really being emulated by the cgfour.
	    */
	    free (fbattr);
	    fbattr = NULL;
	    if (ioctl(sunFbs[screen].fd, FBIOGTYPE, &sunFbs[screen].info) == -1) {
		ErrorF("unable to get frame buffer attributes");
		(void) close(sunFbs[screen].fd);
		sunFbs[screen].fd = -1;
		return FALSE;
	    }
	}
	if (ret) {
	    int verb = 1;

	    if (sunFbInfo)
		verb = -1;

	    devFbUsed = TRUE;
	    if (fbattr) {
		if (fbattr->fbtype.fb_type >= XFBTYPE_LASTPLUSONE) {
		    ErrorF ("%s is an unknown framebuffer type\n", device);
		    (void) close(sunFbs[screen].fd);
		    sunFbs[screen].fd = -1;
		    return FALSE;
		}
		sunFbs[screen].info = fbattr->fbtype;
	    }
	    sunFbs[screen].fbPriv = (void *) fbattr;
	    if (fbattr && !sunFbData[fbattr->fbtype.fb_type].init) {
		int _i;
		ret = FALSE;
		for (_i = 0; _i < FB_ATTR_NEMUTYPES; _i++) {
		    if (sunFbData[fbattr->emu_types[_i]].init) {
			sunFbs[screen].info.fb_type = fbattr->emu_types[_i];
			ret = TRUE;
			LogMessageVerb(X_INFO, verb, "%s is emulating a %s\n",
			    device, sunFbData[fbattr->fbtype.fb_type].name);
			break;
		    }
		}
	    }
	    LogMessageVerb(X_INFO, verb, "%s is really a %s\n", device,
		sunFbData[fbattr ? fbattr->fbtype.fb_type : sunFbs[screen].info.fb_type].name);
	}
    }
    if (!ret)
	sunFbs[screen].fd = -1;
    return ret;
}

/*-
 *-----------------------------------------------------------------------
 * SigIOHandler --
 *	Signal handler for SIGIO - input is available.
 *
 * Results:
 *	sunSigIO is set - ProcessInputEvents() will be called soon.
 *
 * Side Effects:
 *	None
 *
 *-----------------------------------------------------------------------
 */
/*ARGSUSED*/
static void
SigIOHandler(int sig)
{
    int olderrno = errno;
    sunEnqueueEvents ();
    errno = olderrno;
}

/*-
 *-----------------------------------------------------------------------
 * sunNonBlockConsoleOff --
 *	Turn non-blocking mode on the console off, so you don't get logged
 *	out when the server exits.
 *
 * Results:
 *	None.
 *
 * Side Effects:
 *	None.
 *
 *-----------------------------------------------------------------------
 */
void
sunNonBlockConsoleOff(
#if defined(SVR4) || defined(CSRG_BASED)
    void
#else
    char* arg
#endif
)
{
    register int i;

    i = fcntl(2, F_GETFL, 0);
    if (i >= 0)
	(void) fcntl(2, F_SETFL, i & ~FNDELAY);
}

static char**
GetDeviceList(int argc, char **argv)
{
    int		i;
    char	*envList = NULL;
    char	*cmdList = sunDeviceList;
    char	**deviceList = NULL;

    if (!cmdList)
	envList = getenv ("XDEVICE");

    if (cmdList || envList) {
	char	*_tmpa;
	char	*_tmpb;
	int	_i1;
	deviceList = malloc ((MAXSCREENS + 1) * sizeof (char *));
	_tmpa = (cmdList) ? cmdList : envList;
	for (_i1 = 0; _i1 < MAXSCREENS; _i1++) {
	    _tmpb = strtok (_tmpa, ":");
	    if (_tmpb)
		deviceList[_i1] = _tmpb;
	    else
		deviceList[_i1] = NULL;
	    _tmpa = NULL;
	}
	deviceList[MAXSCREENS] = NULL;
    }
    if (!deviceList) {
	/* no environment and no cmdline, so default */
	deviceList =
	    malloc ((FALLBACK_LIST_LEN + 1) * sizeof (char *));
	for (i = 0; i < FALLBACK_LIST_LEN; i++)
	    deviceList[i] = fallbackList[i];
	deviceList[FALLBACK_LIST_LEN] = NULL;
    }
    return deviceList;
}

static void
getKbdType(void)
{
/*
 * The Sun 386i has system include files that preclude this pre SunOS 4.1
 * test for the presence of a type 4 keyboard however it really doesn't
 * matter since no 386i has ever been shipped with a type 3 keyboard.
 * SunOS 4.1 no longer needs this kludge.
 */
#if !defined(i386) && !defined(KIOCGKEY)
#define TYPE4KEYBOARDOVERRIDE
#endif

    int ii;

    for (ii = 0; ii < 3; ii++) {
	sunKbdWait();
	(void) ioctl (sunKbdPriv.fd, KIOCTYPE, &sunKbdPriv.type);
#ifdef TYPE4KEYBOARDOVERRIDE
	/*
	 * Magic. Look for a key which is non-existent on a real type
	 * 3 keyboard but does exist on a type 4 keyboard.
	 */
	if (sunKbdPriv.type == KB_SUN3) {
	    struct kiockeymap key;

	    key.kio_tablemask = 0;
	    key.kio_station = 118;
	    if (ioctl(sunKbdPriv.fd, KIOCGKEY, &key) == -1) {
		ErrorF( "ioctl KIOCGKEY" );
		FatalError("Can't KIOCGKEY on fd %d\n", sunKbdPriv.fd);
	    }
	    if (key.kio_entry != HOLE)
		sunKbdPriv.type = KB_SUN4;
	}
#endif
	switch (sunKbdPriv.type) {
	case KB_SUN2:
	case KB_SUN3:
	case KB_SUN4: return;
	default:
	    sunChangeKbdTranslation(sunKbdPriv.fd, FALSE);
	    continue;
	}
    }
    FatalError ("Unsupported keyboard type %d\n", sunKbdPriv.type);
}

void
OsVendorInit(void)
{
    static int inited;
    if (!inited) {
	const char *logfile;
	char *lf;
#ifndef i386
	struct rlimit rl;

	/*
	 * one per client, one per screen, one per listen endpoint,
	 * keyboard, mouse, and stderr
	 */
	int maxfds = MAXCLIENTS + MAXSCREENS + 5;

	if (getrlimit (RLIMIT_NOFILE, &rl) == 0) {
	    rl.rlim_cur = maxfds < rl.rlim_max ? maxfds : rl.rlim_max;
	    (void) setrlimit (RLIMIT_NOFILE, &rl);
	}
#endif

#define LOGSUFFIX ".log"
#define LOGOLDSUFFIX ".old"

	logfile = DEFAULT_LOGDIR "/" DEFAULT_LOGPREFIX;
	if (asprintf(&lf, "%s%%s" LOGSUFFIX, logfile) == -1)
	    FatalError("Cannot allocate space for the log file name\n");
	LogInit(lf, LOGOLDSUFFIX);

#undef LOGSUFFIX
#undef LOGOLDSUFFIX

	free(lf);

	sunKbdPriv.fd = open ("/dev/kbd", O_RDWR, 0);
	if (sunKbdPriv.fd < 0)
	    FatalError ("Cannot open /dev/kbd, error %d\n", errno);
	sunPtrPriv.fd = open ("/dev/mouse", O_RDWR, 0);
	if (sunPtrPriv.fd < 0)
	    FatalError ("Cannot open /dev/mouse, error %d\n", errno);
	getKbdType ();
	switch (sunKbdPriv.type) {
	case KB_SUN2:
	case KB_SUN3:
	    LogMessage(X_INFO, "Sun type %d Keyboard\n", sunKbdPriv.type);
	    break;
	case KB_SUN4:
#define LAYOUT_US5	33
	    (void) ioctl (sunKbdPriv.fd, KIOCLAYOUT, &sunKbdPriv.layout);
	    if (sunKbdPriv.layout < 0 ||
		sunKbdPriv.layout > sunMaxLayout ||
		sunType4KeyMaps[sunKbdPriv.layout] == NULL)
		FatalError ("Unsupported keyboard type 4 layout %d\n",
			    sunKbdPriv.layout);
	    sunKeySyms[KB_SUN4].map = sunType4KeyMaps[sunKbdPriv.layout];
	    LogMessage(X_INFO, "Sun type %d Keyboard, layout %d\n",
		sunKbdPriv.layout >= LAYOUT_US5 ? 5 : 4, sunKbdPriv.layout);
	    break;
	default:
	    LogMessage(X_INFO, "Unknown keyboard type\n");
	    break;
        }
	inited = 1;
    }
}

void
OsVendorFatalError(const char *f, va_list arg)
{
}

#ifdef GLXEXT
void
GlxExtensionInit(void)
{
}
#endif

/*-
 *-----------------------------------------------------------------------
 * InitOutput --
 *	Initialize screenInfo for all actually accessible framebuffers.
 *	The
 *
 * Results:
 *	screenInfo init proc field set
 *
 * Side Effects:
 *	None
 *
 *-----------------------------------------------------------------------
 */

void
InitOutput(ScreenInfo *pScreenInfo, int argc, char **argv)
{
    int     	i, scr;
    int		nonBlockConsole = 0;
    char	**devList;
    static int	setup_on_exit = 0;

    if (!monitorResolution)
	monitorResolution = 90;
    if (RunFromSigStopParent)
	nonBlockConsole = 1;
    if (sunDebug)
	nonBlockConsole = 0;

    /*
     *	Writes to /dev/console can block - causing an
     *	excess of error messages to hang the server in
     *	deadlock.  So.......
     */
    if (nonBlockConsole) {
	if (!setup_on_exit) {
#if defined(SVR4) || defined(CSRG_BASED)
	    if (atexit(sunNonBlockConsoleOff))
#else
	    if (on_exit(sunNonBlockConsoleOff, (char *)0))
#endif
		ErrorF("InitOutput: can't register NBIO exit handler\n");

	    setup_on_exit = 1;
	}
	i = fcntl(2, F_GETFL, 0);
	if (i >= 0)
	    i = fcntl(2, F_SETFL, i | FNDELAY);
	if (i < 0) {
	    ErrorF("fcntl");
	    ErrorF("InitOutput: can't put stderr in non-block mode\n");
	}
    }
    pScreenInfo->imageByteOrder = IMAGE_BYTE_ORDER;
    pScreenInfo->bitmapScanlineUnit = BITMAP_SCANLINE_UNIT;
    pScreenInfo->bitmapScanlinePad = BITMAP_SCANLINE_PAD;
    pScreenInfo->bitmapBitOrder = BITMAP_BIT_ORDER;

    pScreenInfo->numPixmapFormats = NUMFORMATS;
    for (i=0; i< NUMFORMATS; i++)
        pScreenInfo->formats[i] = formats[i];
    if (!sunDevsInited) {
	/* first time ever */
	for (scr = 0; scr < MAXSCREENS; scr++)
	    sunFbs[scr].fd = -1;
	devList = GetDeviceList (argc, argv);
	for (i = 0, scr = 0; devList[i] != NULL && scr < MAXSCREENS; i++)
	    if (OpenFrameBuffer (devList[i], scr))
		scr++;
	sunDevsInited = TRUE;
	free (devList);
    }
    for (scr = 0; scr < MAXSCREENS; scr++)
	if (sunFbs[scr].fd != -1)
	    (void) AddScreen (sunFbData[sunFbs[scr].info.fb_type].init,
			      argc, argv);
    (void) OsSignal(SIGWINCH, SIG_IGN);
}

/*-
 *-----------------------------------------------------------------------
 * InitInput --
 *	Initialize all supported input devices...what else is there
 *	besides pointer and keyboard?
 *
 * Results:
 *	None.
 *
 * Side Effects:
 *	Two DeviceRec's are allocated and registered as the system pointer
 *	and keyboard devices.
 *
 *-----------------------------------------------------------------------
 */
void
InitInput(int argc, char **argv)
{
    int rc;

    rc = AllocDevicePair(serverClient, "sun",
			 &sunPointerDevice, &sunKeyboardDevice,
			 sunMouseProc, sunKbdProc, FALSE);
    if (rc != Success)
	FatalError("Failed to init sun default input devices.\n");

    (void)mieqInit();
#define SET_FLOW(fd) fcntl(fd, F_SETFL, FNDELAY | FASYNC)
#ifdef SVR4
    (void) OsSignal(SIGPOLL, SigIOHandler);
#define WANT_SIGNALS(fd) ioctl(fd, I_SETSIG, S_INPUT | S_HIPRI)
#else
    (void) OsSignal(SIGIO, SigIOHandler);
#define WANT_SIGNALS(fd) fcntl(fd, F_SETOWN, getpid())
#endif
    if (sunKbdPriv.fd >= 0) {
	if (SET_FLOW(sunKbdPriv.fd) == -1 || WANT_SIGNALS(sunKbdPriv.fd) == -1) {
	    (void) close (sunKbdPriv.fd);
	    sunKbdPriv.fd = -1;
	    FatalError("Async kbd I/O failed in InitInput");
	}
    }
    if (sunPtrPriv.fd >= 0) {
	if (SET_FLOW(sunPtrPriv.fd) == -1 || WANT_SIGNALS(sunPtrPriv.fd) == -1) {
	    (void) close (sunPtrPriv.fd);
	    sunPtrPriv.fd = -1;
	    FatalError("Async mouse I/O failed in InitInput");
	}
    }
}

void
CloseInput(void)
{
    mieqFini();
}

#if SUNMAXDEPTH == 8

Bool
sunCfbSetupScreen(
    ScreenPtr pScreen,
    void *pbits,		/* pointer to screen bitmap */
    int xsize,			/* in pixels */
    int ysize,			/* in pixels */
    int dpix,			/* dots per inch */
    int dpiy,			/* dots per inch */
    int width,			/* pixel width of frame buffer */
    int	bpp			/* bits per pixel of root */
)
{
    return fbSetupScreen(pScreen, pbits, xsize, ysize, dpix, dpiy,
			 width, bpp);
}

Bool
sunCfbFinishScreenInit(
    ScreenPtr pScreen,
    void *pbits,		/* pointer to screen bitmap */
    int xsize,			/* in pixels */
    int ysize,			/* in pixels */
    int dpix,			/* dots per inch */
    int dpiy,			/* dots per inch */
    int width,			/* pixel width of frame buffer */
    int bpp			/* bits per pixel of root */
)
{
    return fbFinishScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy,
			      width, bpp);
}

Bool
sunCfbScreenInit(
    ScreenPtr pScreen,
    void *pbits,		/* pointer to screen bitmap */
    int xsize,			/* in pixels */
    int ysize,			/* in pixels */
    int dpix,			/* dots per inch */
    int dpiy,			/* dots per inch */
    int width,			/* pixel width of frame buffer */
    int bpp			/* bits per pixel of root */
)
{
    return fbScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width, bpp);
}

#else /* SUNMAXDEPTH != 8 */
#if SUNMAXDEPTH == 32

static Bool
sunCfbCreateGC(GCPtr pGC)
{
    return fbCreateGC (pGC);
}

static void
sunCfbGetSpans(
    DrawablePtr		pDrawable,	/* drawable from which to get bits */
    int			wMax,		/* largest value of all *pwidths */
    DDXPointPtr		ppt,		/* points to start copying from */
    int			*pwidth,	/* list of number of bits to copy */
    int			nspans,		/* number of scanlines to copy */
    char		*pdstStart	/* where to put the bits */
)
{
    fbGetSpans(pDrawable, wMax, ppt, pwidth, nspans, pdstStart);
}

static void
sunCfbGetImage(DrawablePtr pDrawable, int sx, int sy, int w, int h, unsigned int format, unsigned long planeMask, char *pdstLine)
{
    fbGetImage(pDrawable, sx, sy, w, h, format, planeMask, pdstLine);
}

Bool
sunCfbSetupScreen(
    ScreenPtr pScreen,
    void *pbits,		/* pointer to screen bitmap */
    int xsize,			/* in pixels */
    int ysize,			/* in pixels */
    int dpix,			/* dots per inch */
    int dpiy,			/* dots per inch */
    int width,			/* pixel width of frame buffer */
    int	bpp			/* bits per pixel of root */
)
{
    int ret;

    ret = fbSetupScreen(pScreen, pbits, xsize, ysize, dpix, dpiy, width, bpp);
    pScreen->CreateGC = sunCfbCreateGC;
    pScreen->GetImage = sunCfbGetImage;
    pScreen->GetSpans = sunCfbGetSpans;
    return ret;
}

/* Adapt cfb logic */

Bool
sunCfbFinishScreenInit(
    ScreenPtr pScreen,
    void *pbits,		/* pointer to screen bitmap */
    int xsize,			/* in pixels */
    int ysize,			/* in pixels */
    int dpix,			/* dots per inch */
    int dpiy,			/* dots per inch */
    int width,			/* pixel width of frame buffer */
    int bpp
)
{
    VisualPtr	visuals;
    int		nvisuals;
    DepthPtr	depths;
    int		ndepths;
    VisualID	defaultVisual;
    int		rootdepth = 0;

    if (!fbInitVisuals(&visuals, &depths, &nvisuals, &ndepths,
		       &rootdepth, &defaultVisual, 1 << (bpp - 1), 8))
	return FALSE;
    if (! miScreenInit(pScreen, pbits, xsize, ysize, dpix, dpiy, width,
			rootdepth, ndepths, depths,
			defaultVisual, nvisuals, visuals))
	return FALSE;
    pScreen->CloseScreen = fbCloseScreen;
    return TRUE;
}


Bool
sunCfbScreenInit(
    ScreenPtr pScreen,
    void *pbits,		/* pointer to screen bitmap */
    int xsize,			/* in pixels */
    int ysize,			/* in pixels */
    int dpix,			/* dots per inch */
    int dpiy,			/* dots per inch */
    int width,			/* pixel width of frame buffer */
    int bpp
)
{
    if (!sunCfbSetupScreen(pScreen, pbits, xsize, ysize, dpix, dpiy,
			   width, bpp))
	return FALSE;
    return sunCfbFinishScreenInit(pScreen, pbits, xsize, ysize, dpix,
				  dpiy, width, bpp);
}

#endif  /* SUNMAXDEPTH == 32 */
#endif  /* SUNMAXDEPTH */

File Added: xsrc/external/mit/xorg-server/dist/hw/sun/sunIo.c
/* $Xorg: sunIo.c,v 1.4 2001/03/07 17:34:19 pookie Exp $ */
/*-
 * sunIo.c --
 *	Functions to handle input from the keyboard and mouse.
 *
 * Copyright 1987 by the Regents of the University of California
 *
 * Permission to use, copy, modify, and distribute this
 * software and its documentation for any purpose and without
 * fee is hereby granted, provided that the above copyright
 * notice appear in all copies.  The University of California
 * makes no representations about the suitability of this
 * software for any purpose.  It is provided "as is" without
 * express or implied warranty.
 *
 *
 */
/* $XFree86: xc/programs/Xserver/hw/sun/sunIo.c,v 3.10 2003/11/17 22:20:36 dawes Exp $ */

/************************************************************
Copyright 1987 by Sun Microsystems, Inc. Mountain View, CA.

                    All Rights Reserved

Permission  to  use,  copy,  modify,  and  distribute   this
software  and  its documentation for any purpose and without
fee is hereby granted, provided that the above copyright no-
tice  appear  in all copies and that both that copyright no-
tice and this permission notice appear in  supporting  docu-
mentation,  and  that the names of Sun or The Open Group
not be used in advertising or publicity pertaining to
distribution  of  the software  without specific prior
written permission. Sun and The Open Group make no
representations about the suitability of this software for
any purpose. It is provided "as is" without any express or
implied warranty.

SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
THE USE OR PERFORMANCE OF THIS SOFTWARE.

********************************************************/

#define NEED_EVENTS
#include    "sun.h"
#include    "mi.h"
#include    "os.h"

/*-
 *-----------------------------------------------------------------------
 * ProcessInputEvents --
 *	Retrieve all waiting input events and pass them to DIX in their
 *	correct chronological order. Only reads from the system pointer
 *	and keyboard.
 *
 * Results:
 *	None.
 *
 * Side Effects:
 *	Events are passed to the DIX layer.
 *
 *-----------------------------------------------------------------------
 */
void
ProcessInputEvents(void)
{
    mieqProcessInputEvents ();
}

/*
 *-----------------------------------------------------------------------
 * sunEnqueueEvents
 *	When a SIGIO is received, read device hard events and
 *	enqueue them using the mi event queue
 */

void
sunEnqueueEvents(void)
{
    Firm_event	*ptrEvents,    	/* Current pointer event */
		*kbdEvents;    	/* Current keyboard event */
    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 */
    DeviceIntPtr	pPointer;
    DeviceIntPtr	pKeyboard;
    sunKbdPrivPtr       kbdPriv;
    sunPtrPrivPtr       ptrPriv;

    pPointer = sunPointerDevice;
    pKeyboard = sunKeyboardDevice;
    ptrPriv = (sunPtrPrivPtr) pPointer->public.devicePrivate;
    kbdPriv = (sunKbdPrivPtr) pKeyboard->public.devicePrivate;
    if (!pPointer->public.on || !pKeyboard->public.on)
	return;

    numPtrEvents = 0;
    ptrEvents = NULL;
    PtrAgain = TRUE;
    numKbdEvents = 0;
    kbdEvents = NULL;
    KbdAgain = TRUE;

    /*
     * 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 = sunMouseGetEvents (ptrPriv->fd, pPointer->public.on,
					   &nPE, &PtrAgain);
	    numPtrEvents = nPE;
	}
	if ((numKbdEvents == 0) && KbdAgain) {
	    kbdEvents = sunKbdGetEvents (kbdPriv->fd, pKeyboard->public.on,
					 &nKE, &KbdAgain);
	    numKbdEvents = nKE;
	}
	if ((numPtrEvents == 0) && (numKbdEvents == 0))
	    break;
	if (numPtrEvents && numKbdEvents) {
	    if (timercmp (&kbdEvents->time, &ptrEvents->time, <)) {
		sunKbdEnqueueEvent (pKeyboard, kbdEvents);
		numKbdEvents--;
		kbdEvents++;
	    } else {
		sunMouseEnqueueEvent (pPointer, ptrEvents);
		numPtrEvents--;
		ptrEvents++;
	    }
	} else if (numKbdEvents) {
	    sunKbdEnqueueEvent (pKeyboard, kbdEvents);
	    numKbdEvents--;
	    kbdEvents++;
	} else {
	    sunMouseEnqueueEvent (pPointer, ptrEvents);
	    numPtrEvents--;
	    ptrEvents++;
	}
    }
}

/*
 * DDX - specific abort routine.  Called by AbortServer().
 */
void
AbortDDX(enum ExitCode error)
{
    int		i;
    ScreenPtr	pScreen;
    DevicePtr	devPtr;

#ifdef SVR4
    (void) OsSignal (SIGPOLL, SIG_IGN);
#else
    (void) OsSignal (SIGIO, SIG_IGN);
#endif
    if (sunKeyboardDevice) {
        devPtr = &sunKeyboardDevice->public;
	(void) sunChangeKbdTranslation (((sunKbdPrivPtr)(devPtr->devicePrivate))->fd, FALSE);
    }
#if defined(SVR4) || defined(CSRG_BASED)
    sunNonBlockConsoleOff ();
#else
    sunNonBlockConsoleOff (NULL);
#endif
    for (i = 0; i < screenInfo.numScreens; i++)
    {
	pScreen = screenInfo.screens[i];
	(*pScreen->SaveScreen) (pScreen, SCREEN_SAVER_OFF);
#if 0	/* XXX GX is disabled for now */
	sunDisableCursor (pScreen);
#endif
    }
    LogClose(error);
}

/* Called by GiveUp(). */
void
ddxGiveUp(enum ExitCode error)
{
    AbortDDX(error);
}

int
ddxProcessArgument(int argc, char *argv[], int i)
{

    if (strcmp (argv[i], "-swapLkeys") == 0) {	/* -swapLkeys */
	sunSwapLkeys = TRUE;
	return 1;
    }
    if (strcmp (argv[i], "-debug") == 0) {	/* -debug */
	sunDebug = TRUE;
	return 1;
    }
    if (strcmp (argv[i], "-dev") == 0) {	/* -dev /dev/mumble */
	if (++i >= argc)
	    UseMsg();
	sunDeviceList = argv[i];
	return 2;
    }
    if (strcmp (argv[i], "-mono") == 0) {	/* -mono */
	sunForceMono = TRUE;
	return 1;
    }
    if (strcmp (argv[i], "-zaphod") == 0) {	/* -zaphod */
	sunActiveZaphod = FALSE;
	return 1;
    }
    if (strcmp (argv[i], "-flipPixels") == 0) {	/* -flipPixels */
	sunFlipPixels = TRUE;
	return 1;
    }
    if (strcmp (argv[i], "-fbinfo") == 0) {	/* -fbinfo */
	sunFbInfo = TRUE;
	return 1;
    }
    if (strcmp (argv[i], "-cg4frob") == 0) {
	sunCG4Frob = TRUE;
	return 1;
    }
    if (strcmp (argv[i], "-noGX") == 0) {
	sunNoGX = TRUE;
	return 1;
    }
    return 0;
}

void
ddxUseMsg(void)
{
    ErrorF("-swapLkeys          swap keysyms on L1..L10\n");
    ErrorF("-debug              disable non-blocking console mode\n");
    ErrorF("-dev fn[:fn][:fn]   name of device[s] to open\n");
    ErrorF("-mono               force monochrome-only screen\n");
    ErrorF("-zaphod             disable active Zaphod mode\n");
    ErrorF("-fbinfo             tell more about the found frame buffer(s)\n");
#ifdef UNDOCUMENTED
    ErrorF("-cg4frob            don't use the mono plane of the cgfour\n");
    ErrorF("-noGX               treat the GX as a dumb frame buffer\n");
#endif
}

File Added: xsrc/external/mit/xorg-server/dist/hw/sun/sunMouse.c
/* $Xorg: sunMouse.c,v 1.3 2000/08/17 19:48:32 cpqbld Exp $ */
/*-
 * Copyright 1987 by the Regents of the University of California
 *
 * Permission to use, copy, modify, and distribute this
 * software and its documentation for any purpose and without
 * fee is hereby granted, provided that the above copyright
 * notice appear in all copies.  The University of California
 * makes no representations about the suitability of this
 * software for any purpose.  It is provided "as is" without
 * express or implied warranty.
 */

/************************************************************
Copyright 1987 by Sun Microsystems, Inc. Mountain View, CA.

                    All Rights Reserved

Permission  to  use,  copy,  modify,  and  distribute   this
software  and  its documentation for any purpose and without
fee is hereby granted, provided that the above copyright no-
tice  appear  in all copies and that both that copyright no-
tice and this permission notice appear in  supporting  docu-
mentation,  and  that the names of Sun or The Open Group
not be used in advertising or publicity pertaining to
distribution  of  the software  without specific prior
written permission. Sun and The Open Group make no
representations about the suitability of this software for
any purpose. It is provided "as is" without any express or
implied warranty.

SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
ABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
PROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
THE USE OR PERFORMANCE OF THIS SOFTWARE.

********************************************************/
/*
 * Copyright 1991, 1992, 1993 Kaleb S. Keithley
 *
 * Permission to use, copy, modify, and distribute this
 * software and its documentation for any purpose and without
 * fee is hereby granted, provided that the above copyright
 * notice appear in all copies.  Kaleb S. Keithley makes no
 * representations about the suitability of this software for
 * any purpose.  It is provided "as is" without express or
 * implied warranty.
 */
/* $XFree86: xc/programs/Xserver/hw/sun/sunMouse.c,v 1.4 2003/11/17 22:20:36 dawes Exp $ */

#define NEED_EVENTS
#include    "sun.h"
#include    "mi.h"
#include    "cursor.h"
#include    "input.h"
#include    "inpututils.h"
#include    "exevents.h"
#include    "xserver-properties.h"

Bool sunActiveZaphod = TRUE;
DeviceIntPtr sunPointerDevice = NULL;

static void sunMouseHandlerNotify(int, int, void *);
static Bool sunCursorOffScreen(ScreenPtr *, int *, int *);
static void sunCrossScreen(ScreenPtr, int);
static void sunWarpCursor(DeviceIntPtr, ScreenPtr, int, int);

miPointerScreenFuncRec sunPointerScreenFuncs = {
    sunCursorOffScreen,
    sunCrossScreen,
    sunWarpCursor,
};

static void
sunMouseHandlerNotify(int fd __unused, int ready __unused, void *data __unused)
{
}

/*-
 *-----------------------------------------------------------------------
 * sunMouseCtrl --
 *	Alter the control parameters for the mouse. Since acceleration
 *	etc. is done from the PtrCtrl record in the mouse's device record,
 *	there's nothing to do here.
 *
 * Results:
 *	None.
 *
 * Side Effects:
 *	None.
 *
 *-----------------------------------------------------------------------
 */
/*ARGSUSED*/
static void
sunMouseCtrl(DeviceIntPtr device, PtrCtrl *ctrl)
{
}

/*-
 *-----------------------------------------------------------------------
 * sunMouseProc --
 *	Handle the initialization, etc. of a mouse
 *
 * Results:
 *	none.
 *
 * Side Effects:
 *
 * Note:
 *	When using sunwindows, all input comes off a single fd, stored in the
 *	global windowFd.  Therefore, only one device should be enabled and
 *	disabled, even though the application still sees both mouse and
 *	keyboard.  We have arbitrarily chosen to enable and disable windowFd
 *	in the keyboard routine sunKbdProc rather than in sunMouseProc.
 *
 *-----------------------------------------------------------------------
 */
int
sunMouseProc(DeviceIntPtr device, int what)
{
    DevicePtr	  pMouse = &device->public;
    int	    	  format;
    static int	  oformat;
    BYTE    	  map[4];
    Atom btn_labels[3] = {0};
    Atom axes_labels[2] = { 0, 0 };

    switch (what) {
	case DEVICE_INIT:
	    if (pMouse != &sunPointerDevice->public) {
		ErrorF ("Cannot open non-system mouse");
		return !Success;
	    }
	    if (sunPtrPriv.fd == -1)
		return !Success;
	    pMouse->devicePrivate = (void *) &sunPtrPriv;
	    pMouse->on = FALSE;
	    map[1] = 1;
	    map[2] = 2;
	    map[3] = 3;
	    btn_labels[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT);
	    btn_labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE);
	    btn_labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT);
	    axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X);
	    axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y);

	    InitPointerDeviceStruct(pMouse, map, 3, btn_labels,
		sunMouseCtrl, GetMotionHistorySize(),
		2, axes_labels);
	    break;

	case DEVICE_ON:
	    if (ioctl (sunPtrPriv.fd, VUIDGFORMAT, &oformat) == -1) {
		ErrorF("sunMouseProc ioctl VUIDGFORMAT");
		return !Success;
	    }
	    format = VUID_FIRM_EVENT;
	    if (ioctl (sunPtrPriv.fd, VUIDSFORMAT, &format) == -1) {
		ErrorF("sunMouseProc ioctl VUIDSFORMAT");
		return !Success;
	    }
	    sunPtrPriv.bmask = 0;
	    SetNotifyFd(sunPtrPriv.fd, sunMouseHandlerNotify,
		X_NOTIFY_READ, NULL);
	    pMouse->on = TRUE;
	    break;

	case DEVICE_CLOSE:
	    pMouse->on = FALSE;
	    if (ioctl (sunPtrPriv.fd, VUIDSFORMAT, &oformat) == -1)
		ErrorF("sunMouseProc ioctl VUIDSFORMAT");
	    break;

	case DEVICE_OFF:
	    pMouse->on = FALSE;
	    RemoveNotifyFd(sunPtrPriv.fd);
	    break;
    }
    return Success;
}

/*-
 *-----------------------------------------------------------------------
 * sunMouseGetEvents --
 *	Return the events waiting in the wings for the given mouse.
 *
 * Results:
 *	A pointer to an array of Firm_events or (Firm_event *)0 if no events
 *	The number of events contained in the array.
 *	A boolean as to whether more events might be available.
 *
 * Side Effects:
 *	None.
 *-----------------------------------------------------------------------
 */

Firm_event *
sunMouseGetEvents(int fd, Bool on, int *pNumEvents, Bool *pAgain)
{
    int	    	  nBytes;	    /* number of bytes of events available. */
    static Firm_event	evBuf[SUN_MAXEVENTS];   /* Buffer for Firm_events */

    if ((nBytes = read (fd, (char *)evBuf, sizeof(evBuf))) == -1) {
	if (errno == EWOULDBLOCK) {
	    *pNumEvents = 0;
	    *pAgain = FALSE;
	} else {
	    ErrorF("sunMouseGetEvents read");
	    FatalError ("Could not read from mouse");
	}
    } else {
	if (on) {
	    *pNumEvents = nBytes / sizeof (Firm_event);
	    *pAgain = (nBytes == sizeof (evBuf));
	} else {
	    *pNumEvents = 0;
	    *pAgain = FALSE;
	}
    }
    return evBuf;
}


/*-
 *-----------------------------------------------------------------------
 * sunMouseEnqueueEvent --
 *	Given a Firm_event for a mouse, pass it off the the dix layer
 *	properly converted...
 *
 * Results:
 *	None.
 *
 * Side Effects:
 *	The cursor may be redrawn...? devPrivate/x/y will be altered.
 *
 *-----------------------------------------------------------------------
 */

void
sunMouseEnqueueEvent(DeviceIntPtr device, Firm_event *fe)
{
    sunPtrPrivPtr	pPriv;	/* Private data for pointer */
    int			bmask;	/* Temporary button mask */
    int			x, y;
    double		tmpx, tmpy;
    int			type, buttons, flag;
    int			valuators[2];
    ValuatorMask	mask;

    pPriv = (sunPtrPrivPtr)device->public.devicePrivate;

    switch (fe->id) {
    case MS_LEFT:
    case MS_MIDDLE:
    case MS_RIGHT:
	/*
	 * A button changed state. Sometimes we will get two events
	 * for a single state change. Should we get a button event which
	 * reflects the current state of affairs, that event is discarded.
	 *
	 * Mouse buttons start at 1.
	 */
	buttons = (fe->id - MS_LEFT) + 1;
	bmask = 1 << buttons;
	if (fe->value == VKEY_UP) {
	    if (pPriv->bmask & bmask) {
		type = ButtonRelease;
		pPriv->bmask &= ~bmask;
	    } else {
		return;
	    }
	} else {
	    if ((pPriv->bmask & bmask) == 0) {
		type = ButtonPress;
		pPriv->bmask |= bmask;
	    } else {
		return;
	    }
	}
	flag = POINTER_RELATIVE;
	valuator_mask_set_range(&mask, 0, 0, NULL);
	QueuePointerEvents(device, type, buttons, flag, &mask);
	break;
    case LOC_X_DELTA:
	valuators[0] = fe->value;
	valuators[1] = 0;
	valuator_mask_set_range(&mask, 0, 2, valuators);
	flag = POINTER_RELATIVE | POINTER_ACCELERATE;
	QueuePointerEvents(device, MotionNotify, 0, flag, &mask);
	break;
    case LOC_Y_DELTA:
	/*
	 * For some reason, motion up generates a positive y delta
	 * and motion down a negative delta, so we must subtract
	 * here instead of add...
	 */
	valuators[0] = 0;
	valuators[1] = -fe->value;
	valuator_mask_set_range(&mask, 0, 2, valuators);
	flag = POINTER_RELATIVE | POINTER_ACCELERATE;
	QueuePointerEvents(device, MotionNotify, 0, flag, &mask);
	break;
    case LOC_X_ABSOLUTE:
	miPointerGetPosition(device, &x, &y);
	tmpx = fe->value;
	tmpy = y;
	miPointerSetPosition(device, Absolute, &tmpx, &tmpy, NULL, NULL);
	break;
    case LOC_Y_ABSOLUTE:
	miPointerGetPosition(device, &x, &y);
	tmpx = x;
	tmpy = fe->value;
	miPointerSetPosition(device, Absolute, &tmpx, &tmpy, NULL, NULL);
	break;
    default:
	FatalError ("sunMouseEnqueueEvent: unrecognized id\n");
	break;
    }
}

/*ARGSUSED*/
static Bool
sunCursorOffScreen(ScreenPtr *pScreen, int *x, int *y)
{
    int	    index, ret = FALSE;
    DeviceIntPtr device = sunPointerDevice;	/* XXX */

    if (device && PointerConfinedToScreen(device))
	return TRUE;
    /*
     * Active Zaphod implementation:
     *    increment or decrement the current screen
     *    if the x is to the right or the left of
     *    the current screen.
     */
    if (sunActiveZaphod &&
	screenInfo.numScreens > 1 && (*x >= (*pScreen)->width || *x < 0)) {
	index = (*pScreen)->myNum;
	if (*x < 0) {
	    index = (index ? index : screenInfo.numScreens) - 1;
	    *pScreen = screenInfo.screens[index];
	    *x += (*pScreen)->width;
	} else {
	    *x -= (*pScreen)->width;
	    index = (index + 1) % screenInfo.numScreens;
	    *pScreen = screenInfo.screens[index];
	}
	ret = TRUE;
    }
    return ret;
}

static void
sunCrossScreen(ScreenPtr pScreen, int entering)
{
    if (sunFbs[pScreen->myNum].EnterLeave)
	(*sunFbs[pScreen->myNum].EnterLeave) (pScreen, entering ? 0 : 1);
}

static void
sunWarpCursor(DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y)
{
#ifndef i386
    sigset_t newsigmask;

    (void) sigemptyset (&newsigmask);
#ifdef SVR4
    (void) sigaddset (&newsigmask, SIGPOLL);
#else
    (void) sigaddset (&newsigmask, SIGIO);
#endif
    (void) sigprocmask (SIG_BLOCK, &newsigmask, NULL);
    miPointerWarpCursor (pDev, pScreen, x, y);
    (void) sigprocmask (SIG_UNBLOCK, &newsigmask, NULL);
#else
    int oldmask;

    oldmask = sigblock (sigmask (SIGIO));
    miPointerWarpCursor (pDev, pScreen, x, y);
    sigsetmask (oldmask);
#endif
}