--- src/video/svga/SDL_svgaevents.c.orig Wed Nov 24 01:46:25 1999 +++ src/video/svga/SDL_svgaevents.c Sun Sep 24 00:28:45 2000 @@ -28,12 +28,14 @@ /* Handle the event stream, converting X11 events into SDL events */ #include <stdio.h> +#include <stdlib.h> #include <vga.h> #include <vgamouse.h> #include <vgakeyboard.h> #include <linux/kd.h> #include <linux/keyboard.h> +#include <sys/kbio.h> #include "SDL.h" #include "SDL_sysevents.h" @@ -42,9 +44,8 @@ #include "SDL_svgaevents_c.h" /* The translation tables from a console scancode to a SDL keysym */ -#define NUM_VGAKEYMAPS (1<<KG_CAPSSHIFT) -static Uint16 vga_keymap[NUM_VGAKEYMAPS][NR_KEYS]; static SDLKey keymap[128]; +keymap_t *vga_keymap = NULL; static SDL_keysym *TranslateKey(int scancode, SDL_keysym *keysym); /* Ugh, we have to duplicate the kernel's keysym mapping code... @@ -54,69 +55,10 @@ */ void SVGA_initkeymaps(int fd) { - struct kbentry entry; - int map, i; - - /* Load all the keysym mappings */ - for ( map=0; map<NUM_VGAKEYMAPS; ++map ) { - memset(vga_keymap[map], 0, NR_KEYS*sizeof(Uint16)); - for ( i=0; i<NR_KEYS; ++i ) { - entry.kb_table = map; - entry.kb_index = i; - if ( ioctl(fd, KDGKBENT, &entry) == 0 ) { - /* The "Enter" key is a special case */ - if ( entry.kb_value == K_ENTER ) { - entry.kb_value = K(KT_ASCII,13); - } - /* Handle numpad specially as well */ - if ( KTYP(entry.kb_value) == KT_PAD ) { - switch ( entry.kb_value ) { - case K_P0: - case K_P1: - case K_P2: - case K_P3: - case K_P4: - case K_P5: - case K_P6: - case K_P7: - case K_P8: - case K_P9: - vga_keymap[map][i]=entry.kb_value; - vga_keymap[map][i]+= '0'; - break; - case K_PPLUS: - vga_keymap[map][i]=K(KT_ASCII,'+'); - break; - case K_PMINUS: - vga_keymap[map][i]=K(KT_ASCII,'-'); - break; - case K_PSTAR: - vga_keymap[map][i]=K(KT_ASCII,'*'); - break; - case K_PSLASH: - vga_keymap[map][i]=K(KT_ASCII,'/'); - break; - case K_PENTER: - vga_keymap[map][i]=K(KT_ASCII,'\r'); - break; - case K_PCOMMA: - vga_keymap[map][i]=K(KT_ASCII,','); - break; - case K_PDOT: - vga_keymap[map][i]=K(KT_ASCII,'.'); - break; - default: - break; - } - } - /* Do the normal key translation */ - if ( (KTYP(entry.kb_value) == KT_LATIN) || - (KTYP(entry.kb_value) == KT_ASCII) || - (KTYP(entry.kb_value) == KT_LETTER) ) { - vga_keymap[map][i] = entry.kb_value; - } - } - } + vga_keymap = malloc(sizeof(keymap_t)); + if (ioctl(fd, GIO_KEYMAP, vga_keymap) == -1) { + free(vga_keymap); + vga_keymap = NULL; } } @@ -312,38 +254,24 @@ keysym->sym = keymap[scancode]; keysym->mod = KMOD_NONE; - /* If UNICODE is on, get the UNICODE value for the key */ keysym->unicode = 0; - if ( SDL_TranslateUNICODE ) { + if ( (SDL_TranslateUNICODE) && (vga_keymap != NULL) ) { int map; SDLMod modstate; modstate = SDL_GetModState(); map = 0; if ( modstate & KMOD_SHIFT ) { - map |= (1<<KG_SHIFT); + map += 1; } if ( modstate & KMOD_CTRL ) { - map |= (1<<KG_CTRL); + map += 2; } if ( modstate & KMOD_ALT ) { - map |= (1<<KG_ALT); - } - if ( modstate & KMOD_MODE ) { - map |= (1<<KG_ALTGR); - } - if ( KTYP(vga_keymap[map][scancode]) == KT_LETTER ) { - if ( modstate & KMOD_CAPS ) { - map ^= (1<<KG_SHIFT); - } - } - if ( KTYP(vga_keymap[map][scancode]) == KT_PAD ) { - if ( modstate & KMOD_NUM ) { - keysym->unicode=KVAL(vga_keymap[map][scancode]); - } - } else { - keysym->unicode = KVAL(vga_keymap[map][scancode]); + map += 4; } + if ( !(vga_keymap->key[scancode].spcl & (0x80 >> map)) ) + keysym->unicode = vga_keymap->key[scancode].map[map]; } return(keysym); }