summaryrefslogtreecommitdiff
path: root/devel/sdl10/files/patch-an
blob: 25d17067352554d8117c6983408f6d241d40acc5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
--- 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);
 }