(file) Return to xf86Kbd.c CVS log (file) (dir) Up to [XFree86 CVS] / xc / programs / Xserver / hw / xfree86 / common

  1 dawes 3.18 /* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86Kbd.c,v 3.17 1998/08/16 10:25:40 dawes Exp $ */
  2 dawes 3.6  /*
  3 dawes 1.1   * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.
  4             *
  5             * Permission to use, copy, modify, distribute, and sell this software and its
  6             * documentation for any purpose is hereby granted without fee, provided that
  7             * the above copyright notice appear in all copies and that both that
  8             * copyright notice and this permission notice appear in supporting
  9             * documentation, and that the name of Thomas Roell not be used in
 10             * advertising or publicity pertaining to distribution of the software without
 11             * specific, written prior permission.  Thomas Roell makes no representations
 12             * about the suitability of this software for any purpose.  It is provided
 13             * "as is" without express or implied warranty.
 14             *
 15             * THOMAS ROELL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 16             * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 17             * EVENT SHALL THOMAS ROELL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 18             * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
 19             * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 20             * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 21             * PERFORMANCE OF THIS SOFTWARE.
 22             *
 23             */
 24 dawes 3.13 /* $XConsortium: xf86Kbd.c /main/10 1996/02/21 17:38:32 kaleb $ */
 25 dawes 1.1  
 26            #include "X.h"
 27            #include "Xmd.h"
 28            #include "input.h"
 29            #include "scrnintstr.h"
 30            
 31            #include "compiler.h"
 32            
 33 dawes 3.16 #include "xf86.h"
 34            #include "xf86Priv.h"
 35 dawes 1.1  #include "xf86_OSlib.h"
 36            #include "atKeynames.h"
 37 dawes 3.16 #include "xf86Config.h"
 38 dawes 1.1  
 39            #include "xf86Keymap.h"
 40            
 41            #define KD_GET_ENTRY(i,n) \
 42              eascii_to_x[((keymap.key[i].spcl << (n+1)) & 0x100) + keymap.key[i].map[n]]
 43            
 44            /*
 45             * NOTE: Not all possible remappable symbols are remapped. There are two main
 46             *       reasons:
 47             *                 a) The mapping between scancode and SYSV/386 - symboltable
 48             *                    is inconsistent between different versions and has some
 49             *                    BIG mistakes.
 50             *                 b) In X-Windows there is a difference between numpad-keys
 51             *                    and normal keys. SYSV/386 uses for both kinds of keys
 52             *                    the same symbol.
 53             *
 54             *       Thus only the alpha keypad and the function keys are translated.
 55             *       Also CapsLock, NumLock, ScrollLock, Shift, Control & Alt.
 56             */
 57            
 58            static unsigned char remap[128] = {
 59 dawes 1.1       0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,   /* 0x00 - 0x07 */
 60              0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,   /* 0x08 - 0x0f */
 61              0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,   /* 0x10 - 0x17 */
 62              0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,   /* 0x18 - 0x1f */
 63              0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,   /* 0x20 - 0x27 */
 64              0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,   /* 0x28 - 0x2f */
 65              0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36,    0,   /* 0x30 - 0x37 */
 66              0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,   /* 0x38 - 0x3f */
 67              0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,    0,   /* 0x40 - 0x47 */
 68                 0,    0,    0,    0,    0,    0,    0,    0,   /* 0x48 - 0x4f */
 69                 0,    0,    0,    0,    0,    0, 0x56, 0x57,   /* 0x50 - 0x57 */
 70              0x58,    0,    0,    0,    0,    0,    0,    0,   /* 0x58 - 0x5f */
 71                 0,    0,    0,    0,    0,    0,    0,    0,   /* 0x60 - 0x67 */
 72                 0,    0,    0,    0,    0,    0,    0,    0,   /* 0x68 - 0x6f */
 73                 0,    0, 0x69, 0x65,    0,    0,    0,    0,   /* 0x70 - 0x77 */
 74                 0,    0,    0,    0,    0,    0,    0,    0,   /* 0x78 - 0x7f */
 75            };
 76            
 77            static KeySym eascii_to_x[512] = {
 78            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
 79            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
 80 dawes 1.1  	XK_BackSpace,	XK_Tab,		XK_Linefeed,	NoSymbol,
 81            	NoSymbol,	XK_Return,	NoSymbol,	NoSymbol,
 82            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
 83            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
 84            	NoSymbol,	NoSymbol,	NoSymbol,	XK_Escape,
 85            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
 86            	XK_space,	XK_exclam,	XK_quotedbl,	XK_numbersign,
 87            	XK_dollar,	XK_percent,	XK_ampersand,	XK_apostrophe,
 88            	XK_parenleft,	XK_parenright,	XK_asterisk,	XK_plus,
 89            	XK_comma,	XK_minus,	XK_period,	XK_slash,
 90            	XK_0,		XK_1,		XK_2,		XK_3,
 91            	XK_4,		XK_5,		XK_6,		XK_7,
 92            	XK_8,		XK_9,		XK_colon,	XK_semicolon,
 93            	XK_less,	XK_equal,	XK_greater,	XK_question,
 94            	XK_at,		XK_A,		XK_B,		XK_C,
 95            	XK_D,		XK_E,		XK_F,		XK_G,
 96            	XK_H,		XK_I,		XK_J,		XK_K,
 97            	XK_L,		XK_M,		XK_N,		XK_O,
 98            	XK_P,		XK_Q,		XK_R,		XK_S,
 99            	XK_T,		XK_U,		XK_V,		XK_W,
100            	XK_X,		XK_Y,		XK_Z,		XK_bracketleft,
101 dawes 1.1  	XK_backslash,	XK_bracketright,XK_asciicircum,	XK_underscore,
102            	XK_grave,	XK_a,		XK_b,		XK_c,
103            	XK_d,		XK_e,		XK_f,		XK_g,
104            	XK_h,		XK_i,		XK_j,		XK_k,
105            	XK_l,		XK_m,		XK_n,		XK_o,
106            	XK_p,		XK_q,		XK_r,		XK_s,
107            	XK_t,		XK_u,		XK_v,		XK_w,
108            	XK_x,		XK_y,		XK_z,		XK_braceleft,
109            	XK_bar,		XK_braceright,	XK_asciitilde,	XK_Delete,
110            	XK_Ccedilla,	XK_udiaeresis,	XK_eacute,	XK_acircumflex,
111            	XK_adiaeresis,	XK_agrave,	XK_aring,	XK_ccedilla,
112            	XK_ecircumflex,	XK_ediaeresis,	XK_egrave,	XK_idiaeresis,
113            	XK_icircumflex,	XK_igrave,	XK_Adiaeresis,	XK_Aring,
114            	XK_Eacute,	XK_ae,		XK_AE,		XK_ocircumflex,
115            	XK_odiaeresis,	XK_ograve,	XK_ucircumflex,	XK_ugrave,
116            	XK_ydiaeresis,	XK_Odiaeresis,	XK_Udiaeresis,	XK_cent,
117            	XK_sterling,	XK_yen,		XK_paragraph,	XK_section,
118            	XK_aacute,	XK_iacute,	XK_oacute,	XK_uacute,
119            	XK_ntilde,	XK_Ntilde,	XK_ordfeminine,	XK_masculine,
120            	XK_questiondown,XK_hyphen,	XK_notsign,	XK_onehalf,
121            	XK_onequarter,	XK_exclamdown,	XK_guillemotleft,XK_guillemotright,
122 dawes 1.1  	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
123            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
124            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
125            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
126            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
127            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
128            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
129            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
130            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
131            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
132            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
133            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
134            	XK_Greek_alpha,	XK_ssharp,	XK_Greek_GAMMA,	XK_Greek_pi,
135            	XK_Greek_SIGMA,	XK_Greek_sigma,	XK_mu,	        XK_Greek_tau,
136            	XK_Greek_PHI,	XK_Greek_THETA,	XK_Greek_OMEGA,	XK_Greek_delta,
137            	XK_infinity,	XK_Ooblique,	XK_Greek_epsilon, XK_intersection,
138            	XK_identical,	XK_plusminus,	XK_greaterthanequal, XK_lessthanequal,
139            	XK_topintegral,	XK_botintegral,	XK_division,	XK_similarequal,
140            	XK_degree,	NoSymbol,	NoSymbol,	XK_radical,
141            	XK_Greek_eta,	XK_twosuperior,	XK_periodcentered, NoSymbol,
142            
143 dawes 1.1  	/* 
144            	 * special marked entries (256 + x)
145            	 */
146            
147            	NoSymbol,	NoSymbol,	XK_Shift_L,	XK_Shift_R,
148            	XK_Caps_Lock,	XK_Num_Lock,	XK_Scroll_Lock,	XK_Alt_L,
149            	NoSymbol,	XK_Control_L,	XK_Alt_L,	XK_Alt_R,
150            	XK_Control_L,	XK_Control_R,	NoSymbol,	NoSymbol,
151            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
152            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
153            	NoSymbol,	NoSymbol,	NoSymbol,	XK_F1,
154            	XK_F2,		XK_F3,		XK_F4,		XK_F5,
155            	XK_F6,		XK_F7,		XK_F8,		XK_F9,
156            	XK_F10,		XK_F11,		XK_F12,		NoSymbol,
157            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
158            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
159            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
160            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
161            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
162            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
163            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
164 dawes 1.1  	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
165            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
166            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
167            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
168            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
169            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
170            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
171            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
172            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
173            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
174            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
175            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
176            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
177            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
178            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
179            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
180            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
181            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
182            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
183            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
184            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
185 dawes 1.1  	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
186            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
187            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
188            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
189            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
190            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
191            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
192            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
193            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
194            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
195            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
196            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
197            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
198            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
199            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
200            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
201            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
202            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
203            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
204            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
205            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
206 dawes 1.1  	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
207            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
208            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
209            	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
210                  };
211            
212            
213            /*
214             * LegalModifier --
215             *      determine whether a key is a legal modifier key, i.e send a
216             *      press/release sequence.
217             */
218            
219            /*ARGSUSED*/
220            Bool
221            LegalModifier(key, pDev)
222                 unsigned int  key;
223                 DevicePtr	pDev;
224            {
225              return (TRUE);
226            }
227 dawes 1.1  
228            
229                  
230            /*
231             * xf86KbdGetMapping --
232             *	Get the national keyboard mapping. The keyboard type is set, a new map
233             *      and the modifiermap is computed.
234             */
235            
236            void
237            xf86KbdGetMapping (pKeySyms, pModMap)
238                 KeySymsPtr pKeySyms;
239                 CARD8      *pModMap;
240            {
241              KeySym        *k;
242 dawes 3.18 #if !defined(Lynx) && !defined(AMOEBA) && !defined(MINIX) && !defined(__OSF__) && !defined(__EMX__) && !defined(__mips__) && !defined(__arm32__) && !defined(__GNU__) && !defined(DGUX)
243 dawes 1.1    keymap_t      keymap;
244 dawes 3.18 #endif /* !Lynx && !AMOEBA && !MINIX && !__OSF__ && !__EMX__ && !__mips__ && !__arm32__ && !__GNU__ && !DGUX */
245 dawes 1.1    char          type;
246              int           i, j;
247 dawes 3.8    KeySym        *pMap;
248 dawes 1.1    
249 dawes 3.17 #if !defined(Lynx) && !defined(AMOEBA) && !defined(MINIX) && !defined(__OSF__) && !defined(__EMX__) && !defined(__mips__) && !defined(__arm32__) && !defined(__GNU__)
250 dawes 3.8    xf86Info.kbdType =
251                ioctl(xf86Info.consoleFd, KDGKBTYPE, &type) != -1 ? type : KB_101;
252              if (xf86Info.kbdType == KB_84)
253                pMap = map84;
254              else
255                pMap = map;
256            #else
257              xf86Info.kbdType = 0;
258              pMap = map;
259            #endif
260            
261 dawes 3.18 #if !defined(Lynx) && !defined(AMOEBA) && !defined(MINIX) && !defined(__OSF__) && !defined(__EMX__) && !defined(__mips__) && !defined(__arm32__) && !defined(__GNU__) && !defined(DGUX)
262 dawes 1.1    /*
263               * use the keymap, which can be gotten from our oringinal vt??.
264               * ( ttymap(1) !!!! )
265               */
266              if (ioctl(xf86Info.consoleFd, GIO_KEYMAP, &keymap) != -1) {
267                for (i = 0; i < keymap.n_keys && i < NUM_KEYCODES; i++)
268                  
269                  if (remap[i]) {
270            	
271 dawes 3.4  	k = pMap + (remap[i] << 2);
272 dawes 1.1  	
273            	k[0] = KD_GET_ENTRY(i,0);             /* non-shifed */
274            	k[1] = KD_GET_ENTRY(i,1);	      /* shifted */
275            	k[2] = KD_GET_ENTRY(i,4);	      /* alt */
276            	k[3] = KD_GET_ENTRY(i,5);	      /* alt - shifted */
277            
278            	if (k[3] == k[2]) k[3] = NoSymbol;
279            	if (k[2] == k[1]) k[2] = NoSymbol;
280            	if (k[1] == k[0]) k[1] = NoSymbol;
281            	if (k[0] == k[2] && k[1] == k[3]) k[2] = k[3] = NoSymbol;
282                  }
283              }
284 dawes 3.18 #endif /* !Lynx && !AMOEBA && !MINIX && !__OSF__ && !__EMX__ && !__mips__ && !__arm32__ && !__GNU__ && !DGUX */
285 dawes 1.1  
286              /*
287 dawes 3.1     * Apply the special key mapping specified in XF86Config 
288 dawes 1.1     */
289 dawes 3.4    for (k = pMap, i = MIN_KEYCODE;
290 dawes 1.1         i < (NUM_KEYCODES + MIN_KEYCODE);
291                   i++, k += 4) {
292                switch (k[0]) {
293                  case XK_Alt_L:
294                    j = K_INDEX_LEFTALT;
295                    break;
296                  case XK_Alt_R:
297                    j = K_INDEX_RIGHTALT;
298                    break;
299                  case XK_Scroll_Lock:
300                    j = K_INDEX_SCROLLLOCK;
301                    break;
302                  case XK_Control_R:
303                    j = K_INDEX_RIGHTCTL;
304                    break;
305                  default:
306                    j = -1;
307                }
308                if (j >= 0)
309                  switch (xf86Info.specialKeyMap[j]) {
310 dawes 3.2          case KM_META:
311 dawes 1.1            if (k[0] == XK_Alt_R)
312                        k[1] = XK_Meta_R;
313                      else {
314                        k[0] = XK_Alt_L;
315                        k[1] = XK_Meta_L;
316                      }
317                      break;
318 dawes 3.2          case KM_COMPOSE:
319 dawes 1.1            k[0] = XK_Multi_key;
320                      break;
321 dawes 3.2          case KM_MODESHIFT:
322 dawes 1.1            k[0] = XK_Mode_switch;
323                      k[1] = NoSymbol;
324                      break;
325 dawes 3.2          case KM_MODELOCK:
326 dawes 1.1            k[0] = XK_Mode_switch;
327 dawes 3.10           k[1] = XF86XK_ModeLock;
328 dawes 1.1            break;
329 dawes 3.2          case KM_SCROLLLOCK:
330 dawes 1.1            k[0] = XK_Scroll_Lock;
331                      break;
332 dawes 3.2          case KM_CONTROL:
333 dawes 1.1            k[0] = XK_Control_R;
334                      break;
335                  }
336              }
337            
338              /*
339               * compute the modifier map
340               */
341              for (i = 0; i < MAP_LENGTH; i++)
342                pModMap[i] = NoSymbol;  /* make sure it is restored */
343              
344 dawes 3.4    for (k = pMap, i = MIN_KEYCODE;
345 dawes 1.1         i < (NUM_KEYCODES + MIN_KEYCODE);
346                   i++, k += 4)
347                
348                switch(*k) {
349                  
350                case XK_Shift_L:
351                case XK_Shift_R:
352                  pModMap[i] = ShiftMask;
353                  break;
354                  
355                case XK_Control_L:
356                case XK_Control_R:
357                  pModMap[i] = ControlMask;
358                  break;
359                  
360                case XK_Caps_Lock:
361                  pModMap[i] = LockMask;
362                  break;
363                  
364                case XK_Alt_L:
365                case XK_Alt_R:
366 dawes 1.1        pModMap[i] = AltMask;
367                  break;
368                  
369                case XK_Num_Lock:
370                  if (!xf86Info.serverNumLock) pModMap[i] = NumLockMask;
371                  break;
372            
373                case XK_Scroll_Lock:
374                  pModMap[i] = ScrollLockMask;
375                  break;
376            
377                  /* kana support */
378                case XK_Kana_Lock:
379                case XK_Kana_Shift:
380                  pModMap[i] = KanaMask;
381                  break;
382            
383                  /* alternate toggle for multinational support */
384                case XK_Mode_switch:
385                  pModMap[i] = AltLangMask;
386                  break;
387 dawes 1.1  
388                }
389              
390 dawes 3.17 #if !defined(Lynx) && !defined(AMOEBA) && !defined(MINIX) && !defined(__OSF__) && !defined(__EMX__) && !defined(__mips__) && !defined(__arm32__) && !defined(__GNU__)
391 dawes 3.7    xf86Info.kbdType =
392                ioctl(xf86Info.consoleFd, KDGKBTYPE, &type) != -1 ? type : KB_101;
393            #else
394            /* OS/2 sets the keyboard type during xf86OpenKbd */
395            #ifndef __EMX__
396              xf86Info.kbdType = 0;
397            #endif
398            #endif
399            
400 dawes 1.1  
401 dawes 3.4    pKeySyms->map        = pMap;
402 dawes 1.1    pKeySyms->mapWidth   = GLYPHS_PER_KEY;
403              pKeySyms->minKeyCode = MIN_KEYCODE;
404 dawes 3.3    if (xf86Info.serverNumLock)
405                pKeySyms->maxKeyCode = MAX_KEYCODE;
406              else
407                pKeySyms->maxKeyCode = MAX_STD_KEYCODE;
408 dawes 1.1  }

Powered by
ViewCVS 0.9.2