/* $Id: Exp $
***************************************************************************

   X server for LibGLTEX - Handling of input devices (keyboard)

   Copyright (C) 2002 Christopher Alexander North-Keys
                      http://www.talisman.org/~erlkonig/

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

#include "X.h"
#include "inputstr.h"
#include "input.h"
#include "mi.h"

#include "keysym.h"
#include "keysymdef.h"

#include "keymap.h"				/* in this dir */
#include "keyboard.h"			/* in this dir */

static unsigned long int xgltexCodemap[NUM_KEYCODES] = {
	100, /* arbitrary code in place of, eventually, a list of Z sym-keycodes */
};

Bool LegalModifier(unsigned int key, DevicePtr pDev)
{
	return TRUE;
}

int xgltexKeybdProc(DeviceIntPtr pDevice, int onoff)
{
	KeySymsRec  keySyms;
	CARD8       modMap[MAP_LENGTH];
	DevicePtr   pDev = (DevicePtr)pDevice;
	KeySym     *ksym;
	int i;
	
	switch (onoff) {
	case DEVICE_INIT:
		/* Clear map */
		for (i = 0; i < MAP_LENGTH; i++) {
			modMap[i] = NoSymbol;
		}
		for (ksym = xgltexKeymap, i = MIN_KEYCODE;
		     i < (NUM_KEYCODES + MIN_KEYCODE);
		     i++, ksym += 4)
		{
			switch (*ksym) {
			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] = AltMask;        break;
			case XK_Num_Lock:    modMap[i] = NumLockMask;    break;
			case XK_Scroll_Lock: modMap[i] = ScrollLockMask; break;
			case XK_Kana_Lock:
			case XK_Kana_Shift:  modMap[i] = KanaMask;       break;
			case XK_Mode_switch: modMap[i] = AltLangMask;    break;
			}
		}
		keySyms.minKeyCode = MIN_KEYCODE;
		keySyms.maxKeyCode = MAX_KEYCODE;
		keySyms.mapWidth = GLYPHS_PER_KEY;
		keySyms.map = xgltexKeymap;

		InitKeyboardDeviceStruct(pDev, &keySyms, modMap,
								 (BellProcPtr)NoopDDA,
								 (KbdCtrlProcPtr)NoopDDA);
		break;
		
	case DEVICE_ON: 
		pDev->on = TRUE;
		break;
		
	case DEVICE_OFF: 
		pDev->on = FALSE;
		break;
		
	case DEVICE_CLOSE:
		pDev->on = FALSE;
		break;
	}
	
	return Success;
}

