View | Details | Raw Unified | Return to bug 400520
Collapse All | Expand All

(-)xorg-server-1.9.3/hw/vnc/kbdptr.c (-62 / +227 lines)
Lines 33-38 Link Here
33
#define NEED_EVENTS
33
#define NEED_EVENTS
34
#include "X11/Xproto.h"
34
#include "X11/Xproto.h"
35
#include "inputstr.h"
35
#include "inputstr.h"
36
#include "xkbsrv.h"
37
#include "xkbstr.h"
36
#define XK_CYRILLIC
38
#define XK_CYRILLIC
37
#include <X11/keysym.h>
39
#include <X11/keysym.h>
38
#include <X11/Xatom.h>
40
#include <X11/Xatom.h>
Lines 46-64 Link Here
46
#endif
48
#endif
47
49
48
#define KEY_IS_PRESSED(keycode) \
50
#define KEY_IS_PRESSED(keycode) \
49
    (kbdDevice->key->down[(keycode) >> 3] & (1 << ((keycode) & 7)))
51
    (inputInfo.keyboard->key->down[(keycode) >> 3] & (1 << ((keycode) & 7)))
50
52
51
static void vncXConvertCase(KeySym sym, KeySym *lower, KeySym *upper);
53
static void vncXConvertCase(KeySym sym, KeySym *lower, KeySym *upper);
52
54
53
static DeviceIntPtr ptrDevice = NULL, kbdDevice = NULL;
55
static DeviceIntPtr ptrDevice = NULL;
54
56
55
57
56
void
58
void
57
vncSetKeyboardDevice(DeviceIntPtr kbd)
59
vncSetKeyboardDevice(DeviceIntPtr kbd)
58
{
60
{
59
   if (kbdDevice && kbd)
61
  // obsoleted by inputInfo
60
      return; /* set once */
61
   kbdDevice = kbd;
62
}
62
}
63
63
64
64
Lines 126-131 EnqueueKey(DeviceIntPtr kbdDev, int type Link Here
126
      mieqEnqueue(kbdDev, (InternalEvent*)(events + i)->event);
126
      mieqEnqueue(kbdDev, (InternalEvent*)(events + i)->event);
127
}
127
}
128
128
129
/* In-server and highly changed version of XkbKeycodeToKeysym */
130
static KeySym
131
_XkbKeycodeToKeysym(XkbDescPtr xkb, KeyCode kc, int group, int level)
132
{
133
    KeySym ks;
134
135
    if ((kc<xkb->min_key_code)||(kc>xkb->max_key_code))
136
	return NoSymbol;
137
    /* Treat single group elements as present in all groups */
138
    if (XkbKeyNumGroups (xkb,kc) == 1)
139
	group = 0;
140
    if ((group<0)||(level<0)||(group>=XkbKeyNumGroups(xkb,kc)))
141
	return NoSymbol;
142
    if (level < XkbKeyGroupWidth(xkb, kc, group))
143
	ks = XkbKeySymEntry(xkb, kc, level, group);
144
    else
145
	ks = NoSymbol;
146
    /* Treat 'K' as 'K K', */
147
    if (ks == NoSymbol && (level & 1) && level-1 < XkbKeyGroupWidth(xkb, kc, group))
148
	ks = XkbKeySymEntry(xkb, kc, level-1, group);
149
    return ks;
150
}
151
129
/*
152
/*
130
 * Called when the rfbserver receives a rfbKeyEvent event from a client.
153
 * Called when the rfbserver receives a rfbKeyEvent event from a client.
131
 * Put an X keyboard event into the event queue.
154
 * Put an X keyboard event into the event queue.
Lines 134-154 void Link Here
134
KbdAddEvent(Bool down, KeySym keySym, rfbClientPtr cl)
157
KbdAddEvent(Bool down, KeySym keySym, rfbClientPtr cl)
135
{
158
{
136
    const int type = down ? KeyPress : KeyRelease;
159
    const int type = down ? KeyPress : KeyRelease;
137
    KeySymsPtr keySyms;
160
    XkbSrvInfoPtr xkbInfo;
138
    XkbStateRec *xkb;
161
    int i, group, level;
139
    int i;
140
    int keyCode = 0;
162
    int keyCode = 0;
141
    int freeIndex = -1;
142
    Bool fakeShiftPress = FALSE;
163
    Bool fakeShiftPress = FALSE;
143
    Bool fakeShiftLRelease = FALSE;
164
    Bool fakeShiftLRelease = FALSE;
144
    Bool fakeShiftRRelease = FALSE;
165
    Bool fakeShiftRRelease = FALSE;
145
    Bool shiftMustBeReleased = FALSE;
166
    Bool shiftMustBeReleased = FALSE;
146
    Bool shiftMustBePressed = FALSE;
167
    Bool shiftMustBePressed = FALSE;
168
    Bool fakeLevel3Press = FALSE;
169
    Bool fakeLevel3Release = FALSE;
170
    Bool level3MustBeReleased = FALSE;
171
    Bool level3MustBePressed = FALSE;
172
173
    /* Incomplete maps may create NoSymbol - which lets us
174
     * select and/or overwrite otherwise valid entries.
175
     * E.g Level3+a in serbian layout creates NoSymbol on os11.4
176
     * 2011-05-24 mhopf@suse.de */
177
    if (keySym == NoSymbol) {
178
	ErrorF("KbdAddEvent: ignoring illegal NoSymbol\n");
179
	return;
180
    }
147
181
148
    if (!kbdDevice)
182
    xkbInfo = inputInfo.keyboard->key->xkbInfo;
149
        return;
183
    group   = xkbInfo->state.group;
150
184
    level   = (KEY_IS_PRESSED(ISO_LEVEL3_KEY_CODE) ? 2 : 0) |
151
    keySyms = XkbGetCoreMap(kbdDevice);
185
	      (XkbStateFieldFromRec(&xkbInfo->state) & ShiftMask ? 1 : 0);
186
#if 0
187
    ErrorF ("VNCkbd:\t%s Sym %04x\n", down ? "+":"-", (int)keySym);
188
#endif
152
189
153
#ifdef CORBA
190
#ifdef CORBA
154
    if (cl) {
191
    if (cl) {
Lines 166-171 KbdAddEvent(Bool down, KeySym keySym, rf Link Here
166
     *
203
     *
167
     * Alan.
204
     * Alan.
168
     */
205
     */
206
    /* Never use predefined keys.
207
     * This is inherently incapable of dealing with changing
208
     * keyboard layouts. Not being able to work with non-local xmodmaps
209
     * is a nuisance at worst, and probably even preferred.
210
     * 2011-04-15 mhopf@suse.de */
211
#if 0
169
#if !XFREE86VNC
212
#if !XFREE86VNC
170
    /* First check if it's one of our predefined keys.  If so then we can make
213
    /* First check if it's one of our predefined keys.  If so then we can make
171
       some attempt at allowing an xmodmap inside a VNC desktop behave
214
       some attempt at allowing an xmodmap inside a VNC desktop behave
Lines 192-298 KbdAddEvent(Bool down, KeySym keySym, rf Link Here
192
	}
235
	}
193
    }
236
    }
194
#endif
237
#endif
238
#endif
195
239
196
    if (!keyCode) {
240
    if (!keyCode) {
197
241
198
	/* not one of our predefined keys - see if it's in the current keyboard
242
	/* not one of our predefined keys - see if it's in the current keyboard
199
           mapping (i.e. we've already allocated an extra keycode for it) */
243
           mapping (i.e. we've already allocated an extra keycode for it) */
200
244
201
	if (keySyms->mapWidth < 2) {
245
	for (keyCode = MIN_KEY_CODE; keyCode < MIN_KEY_CODE + NO_OF_KEYS; keyCode++) {
202
	    ErrorF("KbdAddEvent: Sanity check failed - Keyboard mapping has "
246
	    /* Check all keycodes, but only continue on those where
203
		   "less than 2 keysyms per keycode (KeySym 0x%x)\n", (int)keySym);
247
	     * backconversion results in keySym.
204
	    return;
248
	     * 2011-05-20 mhopf@suse.de */
205
	}
249
	    int j;
250
251
#if 0
252
	    ErrorF ("   keyCode %3d map# %4d++ level %d of %d:  keySyms",
253
		    keyCode, (i / keySyms->mapWidth) * keySyms->mapWidth,
254
		    i % keySyms->mapWidth, keySyms->mapWidth);
255
	    for (j = 0; j < keySyms->mapWidth; j++)
256
		ErrorF (" %02x", (int)keySyms->map[(i / keySyms->mapWidth) * keySyms->mapWidth + j]);
257
	    ErrorF ("\n");
258
#endif
259
#if 0
260
	    ErrorF ("   group %d of %d width %d:  keySyms",
261
		    group, XkbKeyNumGroups(xkbInfo->desc, keyCode),
262
		    XkbKeyGroupWidth(xkbInfo->desc, keyCode, group));
263
	    if (XkbKeyNumGroups(xkbInfo->desc, keyCode) > group)
264
		for (j = 0; j < XkbKeyGroupWidth(xkbInfo->desc, keyCode, group); j++)
265
		    ErrorF (" %02x", (int) XkbKeySymEntry(xkbInfo->desc, keyCode, j, group));
266
	    ErrorF ("\n");
267
#endif
206
268
207
	for (i = 0; i < NO_OF_KEYS * keySyms->mapWidth; i++) {
269
	    /* Check whether keySym is reachable in current group
208
	    if (keySym == keySyms->map[i]) {
270
	     * by any shift/Level3_shift state (preferrable w/o change).
209
		keyCode = MIN_KEY_CODE + i / keySyms->mapWidth;
271
	     * This doesn't do real modifyer analysis, only Shift and Level3_Shift.
210
272
	     * 2011-05-23 mhopf@suse.de */
211
		if (keySyms->map[(i / keySyms->mapWidth)
273
	    if (_XkbKeycodeToKeysym(xkbInfo->desc, keyCode, group, level) == keySym)
212
					* keySyms->mapWidth + 1] != NoSymbol) {
274
		break;
213
275
	    if (_XkbKeycodeToKeysym(xkbInfo->desc, keyCode, group, level ^ 2) == keySym) {
214
		    /* this keycode has more than one symbol associated with
276
		if (level & 2)
215
		       it, so shift state is important */
277
		    level3MustBeReleased = TRUE;
216
278
		else
217
		    if ((i % keySyms->mapWidth) == 0)
279
		    level3MustBePressed = TRUE;
218
			shiftMustBeReleased = TRUE;
219
		    else
220
			shiftMustBePressed = TRUE;
221
		}
222
		break;
280
		break;
223
	    }
281
	    }
224
	    if ((freeIndex == -1) && (keySyms->map[i] == NoSymbol)
282
	    if (_XkbKeycodeToKeysym(xkbInfo->desc, keyCode, group, level ^ 1) == keySym) {
225
		&& (i % keySyms->mapWidth) == 0)
283
		if (level & 1)
226
	    {
284
		    shiftMustBeReleased = TRUE;
227
		freeIndex = i;
285
		else
286
		    shiftMustBePressed = TRUE;
287
		break;
288
	    }
289
	    if (_XkbKeycodeToKeysym(xkbInfo->desc, keyCode, group, level ^ 3) == keySym) {
290
		if (level & 2)
291
		    level3MustBeReleased = TRUE;
292
		else
293
		    level3MustBePressed = TRUE;
294
		if (level & 1)
295
		    shiftMustBeReleased = TRUE;
296
		else
297
		    shiftMustBePressed = TRUE;
298
		break;
228
	    }
299
	    }
229
	}
300
	}
301
	if (keyCode == MIN_KEY_CODE + NO_OF_KEYS)
302
	    keyCode = 0;
230
    }
303
    }
231
304
232
    if (!keyCode) {
305
    if (!keyCode) {
233
	KeySym lower, upper;
306
	KeySym lower, upper;
307
	KeySymsPtr keySyms = XkbGetCoreMap(inputInfo.keyboard);
234
308
235
	/* we don't have an existing keycode - make one up on the fly and add
309
	/* we don't have an existing keycode - make one up on the fly and add
236
	   it to the keyboard mapping.  Thanks to Vlad Harchev for pointing
310
	   it to the keyboard mapping.  Thanks to Vlad Harchev for pointing
237
	   out problems with non-ascii capitalisation. */
311
	   out problems with non-ascii capitalisation. */
238
312
239
	if (freeIndex == -1) {
313
	/* Find free index for current group. */
314
	for (keyCode = MIN_KEY_CODE; keyCode < MIN_KEY_CODE + NO_OF_KEYS; keyCode++) {
315
	    /* A keyCode is free if no groups are assigned at all */
316
	    if (XkbKeyNumGroups(xkbInfo->desc, keyCode) == 0)
317
		break;
318
#if 0
319
	    /* We can use exact map positions for group 1+2, but only partially
320
	     * filling out xkb legacy maps may suddenly change the # of groups.
321
	     * Reason for that is unknown yet. Might be related to (fixed) NoSymbol issue.
322
	     * 2011-05-24 mhopf@suse.de */
323
	    /* For primary groups: A keyCode is free if current group is empty */
324
	    if (XkbKeyGroupWidth(xkbInfo->desc, keyCode, group) < 1 && group < 2)
325
		break;
326
	    /* Never touch groups that have a single level only (weird group?!?) */
327
	    if (XkbKeyGroupWidth(xkbInfo->desc, keyCode, group) < 2)
328
		continue;
329
	    /* For primary groups: A keyCode is free if only NoSymbol is assigned
330
	     * to available levels (only validating levels 0-3) */
331
	    if (group < 2 &&
332
		XkbKeySymEntry(xkbInfo->desc, keyCode, 0, group) == NoSymbol &&
333
		XkbKeySymEntry(xkbInfo->desc, keyCode, 1, group) == NoSymbol &&
334
		(XkbKeyGroupWidth(xkbInfo->desc, keyCode, group) < 3 ||
335
		 (XkbKeySymEntry(xkbInfo->desc, keyCode, 2, group) == NoSymbol &&
336
		  (XkbKeyGroupWidth(xkbInfo->desc, keyCode, group) < 4 ||
337
		   XkbKeySymEntry(xkbInfo->desc, keyCode, 3, group) == NoSymbol))))
338
		break;
339
#endif
340
	}
341
342
	if (keyCode == MIN_KEY_CODE + NO_OF_KEYS) {
240
	    ErrorF("KbdAddEvent: ignoring KeySym 0x%x - no free KeyCodes\n",
343
	    ErrorF("KbdAddEvent: ignoring KeySym 0x%x - no free KeyCodes\n",
241
		   (int)keySym);
344
		   (int)keySym);
345
	    free (keySyms->map);
346
	    free (keySyms);
242
	    return;
347
	    return;
243
	}
348
	}
244
349
245
	keyCode = MIN_KEY_CODE + freeIndex / keySyms->mapWidth;
246
247
	vncXConvertCase(keySym, &lower, &upper);
350
	vncXConvertCase(keySym, &lower, &upper);
248
351
249
	if (lower == upper) {
352
	/* Adding keys is not using xkb mechanisms yet, but relying on support
250
	    keySyms->map[freeIndex] = keySym;
353
	 * for changing keys in the legacy map. Should be changed, eventually.
251
354
	 * 2011-05-19 mhopf@suse.de */
252
	} else {
355
#if 0
253
	    keySyms->map[freeIndex] = lower;
356
	if (group < 2) {
254
	    keySyms->map[freeIndex+1] = upper;
357
	    /* Only set mapping for active group. Will only work with dual layouts.
255
358
	     * 2011-05-23 mhopf@suse.de */
359
	    int active_group_offset = group ? 2 : 0;
360
361
	    if (lower == upper) {
362
		keySyms->map[(keyCode - MIN_KEY_CODE) * keySyms->mapWidth + active_group_offset] = keySym;
363
		keySyms->map[(keyCode - MIN_KEY_CODE) * keySyms->mapWidth + active_group_offset + 1] = NoSymbol;
364
	    } else {
365
		keySyms->map[(keyCode - MIN_KEY_CODE) * keySyms->mapWidth + active_group_offset] = lower;
366
		keySyms->map[(keyCode - MIN_KEY_CODE) * keySyms->mapWidth + active_group_offset + 1] = upper;
367
	    }
368
	}
369
#endif
370
	/* Generic layouts needs to set the full map width.
371
	 * Weird enough, mapWidth seems too big...
372
	 * 2011-05-23 mhopf@suse.de */
373
	for (i = 0; i < (keySyms->mapWidth & ~1); i += 2) {
374
	    if (lower == upper) {
375
		keySyms->map[(keyCode - MIN_KEY_CODE) * keySyms->mapWidth + i]     = keySym;
376
		keySyms->map[(keyCode - MIN_KEY_CODE) * keySyms->mapWidth + i + 1] = NoSymbol;
377
	    } else {
378
		keySyms->map[(keyCode - MIN_KEY_CODE) * keySyms->mapWidth + i]     = lower;
379
		keySyms->map[(keyCode - MIN_KEY_CODE) * keySyms->mapWidth + i + 1] = upper;
380
	    }
381
	}
382
	if (lower != upper) {
256
	    if (keySym == lower)
383
	    if (keySym == lower)
257
		shiftMustBeReleased = TRUE;
384
		shiftMustBeReleased = TRUE;
258
	    else
385
	    else
259
		shiftMustBePressed = TRUE;
386
		shiftMustBePressed = TRUE;
260
	}
387
	}
388
	level3MustBeReleased = TRUE;
261
389
262
	XkbApplyMappingChange(kbdDevice, keySyms, keyCode, 1, NULL, serverClient);
390
	XkbApplyMappingChange(inputInfo.keyboard, keySyms, keyCode, 1, NULL, serverClient);
263
391
264
	ErrorF("KbdAddEvent: unknown KeySym 0x%x - allocating KeyCode %d\n",
392
	ErrorF("KbdAddEvent: unknown KeySym 0x%x - allocating KeyCode %d\n",
265
	       (int)keySym, keyCode);
393
	       (int)keySym, keyCode);
394
	free (keySyms->map);
395
	free (keySyms);
266
    }
396
    }
267
397
268
    xkb = &kbdDevice->key->xkbInfo->state;
398
#if 0
399
    ErrorF ("\t%s Sym %04x Code%3d\tState x%02x %s%s%s\tSh %s%s\tL3 %s%s\n",
400
	    down ? "+":"-", (int)keySym, keyCode, XkbStateFieldFromRec(&xkbInfo->state),
401
	    KEY_IS_PRESSED(SHIFT_L_KEY_CODE) ? "Sl":"",
402
	    KEY_IS_PRESSED(SHIFT_R_KEY_CODE) ? "Sr":"",
403
	    KEY_IS_PRESSED(ISO_LEVEL3_KEY_CODE) ? "L3":"",
404
	    shiftMustBePressed ? "+":"", shiftMustBeReleased ? "-":"",
405
	    level3MustBePressed ? "+":"", level3MustBeReleased ? "-":"");
406
#endif
407
#if 0
408
    int back = _XkbKeycodeToKeysym (xkbInfo->desc, keyCode, group,
409
				    ((level3MustBePressed || (!level3MustBeReleased && (level & 2))) ? 2 : 0) |
410
				    ((shiftMustBePressed || (!shiftMustBeReleased && (level & 1))) ? 1 : 0));
411
    ErrorF ("\tvalidate code %d %-2s%-2s -> sym %04x %s\n\n", keyCode,
412
	    (shiftMustBePressed || (!shiftMustBeReleased && (level & 1)))   ? "Sh" : "",
413
	    (level3MustBePressed || (!level3MustBeReleased && (level & 2))) ? "L3" : "",
414
	    back, (back == keySym ? "ok" : "FAILED"));
415
#endif
416
269
    if (down) {
417
    if (down) {
270
	if (shiftMustBePressed && !(XkbStateFieldFromRec(xkb) & ShiftMask)) {
418
	/* TODO: would require to check which keycodes are actually
419
	 * bound to ISO_Level3_Shift and/or Shift_L.
420
	 * 2011-04-18 mhopf@suse.de */
421
	if (level3MustBePressed && !(level & 2)) {
422
	    fakeLevel3Press = TRUE;
423
	    EnqueueKey(inputInfo.keyboard, KeyPress, ISO_LEVEL3_KEY_CODE);
424
	}
425
	if (level3MustBeReleased && (level & 2)) {
426
	    fakeLevel3Release = TRUE;
427
	    EnqueueKey(inputInfo.keyboard, KeyRelease, ISO_LEVEL3_KEY_CODE);
428
	}
429
	if (shiftMustBePressed && !(level & 1)) {
271
	    fakeShiftPress = TRUE;
430
	    fakeShiftPress = TRUE;
272
            EnqueueKey(kbdDevice, KeyPress, SHIFT_L_KEY_CODE);
431
            EnqueueKey(inputInfo.keyboard, KeyPress, SHIFT_L_KEY_CODE);
273
	}
432
	}
274
	if (shiftMustBeReleased && (XkbStateFieldFromRec(xkb) & ShiftMask)) {
433
	if (shiftMustBeReleased && (level & 1)) {
275
	    if (KEY_IS_PRESSED(SHIFT_L_KEY_CODE)) {
434
	    if (KEY_IS_PRESSED(SHIFT_L_KEY_CODE)) {
276
		fakeShiftLRelease = TRUE;
435
		fakeShiftLRelease = TRUE;
277
                EnqueueKey(kbdDevice, KeyRelease, SHIFT_L_KEY_CODE);
436
                EnqueueKey(inputInfo.keyboard, KeyRelease, SHIFT_L_KEY_CODE);
278
	    }
437
	    }
279
	    if (KEY_IS_PRESSED(SHIFT_R_KEY_CODE)) {
438
	    if (KEY_IS_PRESSED(SHIFT_R_KEY_CODE)) {
280
		fakeShiftRRelease = TRUE;
439
		fakeShiftRRelease = TRUE;
281
                EnqueueKey(kbdDevice, KeyRelease, SHIFT_R_KEY_CODE);
440
                EnqueueKey(inputInfo.keyboard, KeyRelease, SHIFT_R_KEY_CODE);
282
	    }
441
	    }
283
	}
442
	}
284
    }
443
    }
285
444
286
    EnqueueKey(kbdDevice, type, keyCode);
445
    EnqueueKey(inputInfo.keyboard, type, keyCode);
287
446
288
    if (fakeShiftPress) {
447
    if (fakeShiftPress) {
289
        EnqueueKey(kbdDevice, KeyRelease, SHIFT_L_KEY_CODE);
448
        EnqueueKey(inputInfo.keyboard, KeyRelease, SHIFT_L_KEY_CODE);
290
    }
449
    }
291
    if (fakeShiftLRelease) {
450
    if (fakeShiftLRelease) {
292
        EnqueueKey(kbdDevice, KeyPress, SHIFT_L_KEY_CODE);
451
        EnqueueKey(inputInfo.keyboard, KeyPress, SHIFT_L_KEY_CODE);
293
    }
452
    }
294
    if (fakeShiftRRelease) {
453
    if (fakeShiftRRelease) {
295
        EnqueueKey(kbdDevice, KeyPress, SHIFT_R_KEY_CODE);
454
        EnqueueKey(inputInfo.keyboard, KeyPress, SHIFT_R_KEY_CODE);
455
    }
456
    if (fakeLevel3Press) {
457
        EnqueueKey(inputInfo.keyboard, KeyRelease, ISO_LEVEL3_KEY_CODE);
458
    }
459
    if (fakeLevel3Release) {
460
        EnqueueKey(inputInfo.keyboard, KeyPress, ISO_LEVEL3_KEY_CODE);
296
    }
461
    }
297
}
462
}
298
463
Lines 343-357 KbdReleaseAllKeys(void) Link Here
343
{
508
{
344
    int i, j;
509
    int i, j;
345
510
346
    if (!kbdDevice) 
511
    if (!inputInfo.keyboard) 
347
	return;
512
	return;
348
513
349
    for (i = 0; i < DOWN_LENGTH; i++) {
514
    for (i = 0; i < DOWN_LENGTH; i++) {
350
	if (kbdDevice->key->down[i] != 0) {
515
	if (inputInfo.keyboard->key->down[i] != 0) {
351
	    for (j = 0; j < 8; j++) {
516
	    for (j = 0; j < 8; j++) {
352
		if (kbdDevice->key->down[i] & (1 << j)) {
517
		if (inputInfo.keyboard->key->down[i] & (1 << j)) {
353
                    int detail = (i << 3) | j;
518
                    int detail = (i << 3) | j;
354
                    EnqueueKey(kbdDevice, KeyRelease, detail);
519
                    EnqueueKey(inputInfo.keyboard, KeyRelease, detail);
355
		}
520
		}
356
	    }
521
	    }
357
	}
522
	}
(-)xorg-server-1.9.3/hw/vnc/keyboard.h (+1 lines)
Lines 32-37 Link Here
32
#define META_R_KEY_CODE		(MIN_KEY_CODE + 108)
32
#define META_R_KEY_CODE		(MIN_KEY_CODE + 108)
33
#define ALT_L_KEY_CODE		(MIN_KEY_CODE + 56)
33
#define ALT_L_KEY_CODE		(MIN_KEY_CODE + 56)
34
#define ALT_R_KEY_CODE		(MIN_KEY_CODE + 105)
34
#define ALT_R_KEY_CODE		(MIN_KEY_CODE + 105)
35
#define ISO_LEVEL3_KEY_CODE	ALT_R_KEY_CODE
35
36
36
static KeySym map[MAX_KEY_CODE * GLYPHS_PER_KEY] = {
37
static KeySym map[MAX_KEY_CODE * GLYPHS_PER_KEY] = {
37
    /* 0x00 */  NoSymbol,       NoSymbol,	NoSymbol,	NoSymbol,
38
    /* 0x00 */  NoSymbol,       NoSymbol,	NoSymbol,	NoSymbol,

Return to bug 400520