/[dtapublic]/projs/ets/trunk/src/c_tk_base_7_5_w_mods/tkwinkey.c
ViewVC logotype

Annotation of /projs/ets/trunk/src/c_tk_base_7_5_w_mods/tkwinkey.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 220 - (hide annotations) (download)
Sun Jul 22 15:58:07 2018 UTC (5 years, 11 months ago) by dashley
File MIME type: text/plain
File size: 20147 byte(s)
Reorganize.
1 dashley 71 /* $Header$ */
2    
3     /*
4     * tkWinKey.c --
5     *
6     * This file contains X emulation routines for keyboard related
7     * functions.
8     *
9     * Copyright (c) 1995 Sun Microsystems, Inc.
10     *
11     * See the file "license.terms" for information on usage and redistribution
12     * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
13     *
14     * RCS: @(#) $Id: tkwinkey.c,v 1.1.1.1 2001/06/13 05:13:42 dtashley Exp $
15     */
16    
17     #include "tkWinInt.h"
18     /*
19     * The keymap table holds mappings of Windows keycodes to X keysyms.
20     * If Windows ever comes along and changes the value of their keycodes,
21     * this will break all kinds of things. However, this table lookup is much
22     * faster than the alternative, in which we walked a list of keycodes looking
23     * for a match. Since this lookup is performed for every Windows keypress
24     * event, it seems like a worthwhile improvement to use the table.
25     */
26     #define MAX_KEYCODE 145 /* VK_SCROLL is the last entry in our table below */
27     static KeySym keymap[] = {
28     NoSymbol, NoSymbol, NoSymbol, XK_Cancel, NoSymbol,
29     NoSymbol, NoSymbol, NoSymbol, XK_BackSpace, XK_Tab,
30     NoSymbol, NoSymbol, XK_Clear, XK_Return, NoSymbol,
31     NoSymbol, XK_Shift_L, XK_Control_L, XK_Alt_L, XK_Pause,
32     XK_Caps_Lock, NoSymbol, NoSymbol, NoSymbol, NoSymbol,
33     NoSymbol, NoSymbol, XK_Escape, NoSymbol, NoSymbol,
34     NoSymbol, NoSymbol, XK_space, XK_Prior, XK_Next,
35     XK_End, XK_Home, XK_Left, XK_Up, XK_Right,
36     XK_Down, XK_Select, XK_Print, XK_Execute, NoSymbol,
37     XK_Insert, XK_Delete, XK_Help, NoSymbol, NoSymbol,
38     NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol,
39     NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol,
40     NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol,
41     NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol,
42     NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol,
43     NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol,
44     NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol,
45     NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol,
46     NoSymbol, XK_Win_L, XK_Win_R, XK_App, NoSymbol,
47     NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol,
48     NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol,
49     NoSymbol, NoSymbol, NoSymbol, NoSymbol, NoSymbol,
50     NoSymbol, NoSymbol, XK_F1, XK_F2, XK_F3,
51     XK_F4, XK_F5, XK_F6, XK_F7, XK_F8,
52     XK_F9, XK_F10, XK_F11, XK_F12, XK_F13,
53     XK_F14, XK_F15, XK_F16, XK_F17, XK_F18,
54     XK_F19, XK_F20, XK_F21, XK_F22, XK_F23,
55     XK_F24, NoSymbol, NoSymbol, NoSymbol, NoSymbol,
56     NoSymbol, NoSymbol, NoSymbol, NoSymbol, XK_Num_Lock,
57     XK_Scroll_Lock
58     };
59    
60     /*
61     * Prototypes for local procedures defined in this file:
62     */
63    
64     static KeySym KeycodeToKeysym _ANSI_ARGS_((unsigned int keycode,
65     int state, int noascii));
66    
67     /*
68     *----------------------------------------------------------------------
69     *
70     * TkpGetString --
71     *
72     * Retrieve the UTF string equivalent for the given keyboard event.
73     *
74     * Results:
75     * Returns the UTF string.
76     *
77     * Side effects:
78     * None.
79     *
80     *----------------------------------------------------------------------
81     */
82    
83     char *
84     TkpGetString(winPtr, eventPtr, dsPtr)
85     TkWindow *winPtr; /* Window where event occurred: needed to
86     * get input context. */
87     XEvent *eventPtr; /* X keyboard event. */
88     Tcl_DString *dsPtr; /* Uninitialized or empty string to hold
89     * result. */
90     {
91     KeySym keysym;
92     XKeyEvent* keyEv = &eventPtr->xkey;
93    
94     Tcl_DStringInit(dsPtr);
95     if (eventPtr->xkey.send_event != -1) {
96     /*
97     * This is an event generated from generic code. It has no
98     * nchars or trans_chars members.
99     */
100    
101     keysym = KeycodeToKeysym(eventPtr->xkey.keycode,
102     eventPtr->xkey.state, 0);
103     if (((keysym != NoSymbol) && (keysym > 0) && (keysym < 256))
104     || (keysym == XK_Return)
105     || (keysym == XK_Tab)) {
106     char buf[TCL_UTF_MAX];
107     int len = Tcl_UniCharToUtf((Tcl_UniChar) (keysym & 255), buf);
108     Tcl_DStringAppend(dsPtr, buf, len);
109     }
110     } else if (eventPtr->xkey.nbytes > 0) {
111     Tcl_ExternalToUtfDString(NULL, eventPtr->xkey.trans_chars,
112     eventPtr->xkey.nbytes, dsPtr);
113     }
114     return Tcl_DStringValue(dsPtr);
115     }
116    
117     /*
118     *----------------------------------------------------------------------
119     *
120     * XKeycodeToKeysym --
121     *
122     * Translate from a system-dependent keycode to a
123     * system-independent keysym.
124     *
125     * Results:
126     * Returns the translated keysym, or NoSymbol on failure.
127     *
128     * Side effects:
129     * None.
130     *
131     *----------------------------------------------------------------------
132     */
133    
134     KeySym
135     XKeycodeToKeysym(display, keycode, index)
136     Display* display;
137     unsigned int keycode;
138     int index;
139     {
140     int state = 0;
141    
142     if (index & 0x01) {
143     state |= ShiftMask;
144     }
145     return KeycodeToKeysym(keycode, state, 0);
146     }
147    
148    
149    
150     /*
151     *----------------------------------------------------------------------
152     *
153     * KeycodeToKeysym --
154     *
155     * Translate from a system-dependent keycode to a
156     * system-independent keysym.
157     *
158     * Results:
159     * Returns the translated keysym, or NoSymbol on failure.
160     *
161     * Side effects:
162     * It may affect the internal state of the keyboard, such as
163     * remembered dead key or lock indicator lamps.
164     *
165     *----------------------------------------------------------------------
166     */
167    
168     static KeySym
169     KeycodeToKeysym(keycode, state, noascii)
170     unsigned int keycode;
171     int state;
172     int noascii;
173     {
174     BYTE keys[256];
175     int result, deadkey, shift;
176     char buf[4];
177     unsigned int scancode = MapVirtualKey(keycode, 0);
178    
179     /*
180     * Do not run keycodes of lock keys through ToAscii().
181     * One of ToAscii()'s side effects is to handle the lights
182     * on the keyboard, and we don't want to mess that up.
183     */
184    
185     if (noascii || keycode == VK_CAPITAL || keycode == VK_SCROLL ||
186     keycode == VK_NUMLOCK)
187     goto skipToAscii;
188    
189     /*
190     * Use MapVirtualKey() to detect some dead keys.
191     */
192    
193     if (MapVirtualKey(keycode, 2) > 0x7fffUL)
194     return XK_Multi_key;
195    
196     /*
197     * Set up a keyboard with correct modifiers
198     */
199    
200     memset(keys, 0, 256);
201     if (state & ShiftMask)
202     keys[VK_SHIFT] = 0x80;
203     if (state & ControlMask)
204     keys[VK_CONTROL] = 0x80;
205     if (state & Mod2Mask)
206     keys[VK_MENU] = 0x80;
207    
208     /*
209     * Make sure all lock button info is correct so we don't mess up the
210     * lights
211     */
212    
213     if (state & LockMask)
214     keys[VK_CAPITAL] = 1;
215     if (state & Mod3Mask)
216     keys[VK_SCROLL] = 1;
217     if (state & Mod1Mask)
218     keys[VK_NUMLOCK] = 1;
219    
220     result = ToAscii(keycode, scancode, keys, (LPWORD) buf, 0);
221    
222     if (result < 0) {
223     /*
224     * Win95/98:
225     * This was a dead char, which is now remembered by the keyboard.
226     * Call ToAscii() again to forget it.
227     * WinNT:
228     * This was a dead char, overwriting any previously remembered
229     * key. Calling ToAscii() again does not affect anything.
230     */
231    
232     ToAscii(keycode, scancode, keys, (LPWORD) buf, 0);
233     return XK_Multi_key;
234     }
235     if (result == 2) {
236     /*
237     * This was a dead char, and there were one previously remembered
238     * by the keyboard.
239     * Call ToAscii() again with proper parameters to restore it.
240     */
241    
242     /*
243     * Get information about the old char
244     */
245    
246     deadkey = VkKeyScan(buf[0]);
247     shift = deadkey >> 8;
248     deadkey &= 255;
249     scancode = MapVirtualKey(deadkey, 0);
250    
251     /*
252     * Set up a keyboard with proper modifier keys
253     */
254    
255     memset(keys, 0, 256);
256     if (shift & 1)
257     keys[VK_SHIFT] = 0x80;
258     if (shift & 2)
259     keys[VK_CONTROL] = 0x80;
260     if (shift & 4)
261     keys[VK_MENU] = 0x80;
262     ToAscii(deadkey, scancode, keys, (LPWORD) buf, 0);
263     return XK_Multi_key;
264     }
265    
266     /*
267     * Keycode mapped to a valid Latin-1 character. Since the keysyms
268     * for alphanumeric characters map onto Latin-1, we just return it.
269     *
270     * We treat 0x7F as a special case mostly for backwards compatibility.
271     * In versions of Tk<=8.2, Control-Backspace returned "XK_BackSpace"
272     * as the X Keysym. This was due to the fact that we did not
273     * initialize the keys array properly when we passed it to ToAscii, above.
274     * We had previously not been setting the state bit for the Control key.
275     * When we fixed that, we found that Control-Backspace on Windows is
276     * interpreted as ASCII-127 (0x7F), which corresponds to the Delete key.
277     *
278     * Upon discovering this, we realized we had two choices: return XK_Delete
279     * or return XK_BackSpace. If we returned XK_Delete, that could be
280     * considered "more correct" (although the correctness would be dependant
281     * on whether you believe that ToAscii is doing the right thing in that
282     * case); however, this would break backwards compatibility, and worse,
283     * it would limit application programmers -- they would effectively be
284     * unable to bind to <Control-Backspace> on Windows. We therefore chose
285     * instead to return XK_BackSpace (handled here by letting the code
286     * "fall-through" to the return statement below, which works because the
287     * keycode for this event is VK_BACKSPACE, and the keymap table maps that
288     * keycode to XK_BackSpace).
289     */
290    
291     if (result == 1 && UCHAR(buf[0]) >= 0x20 && UCHAR(buf[0]) != 0x7F) {
292     return (KeySym) UCHAR(buf[0]);
293     }
294    
295     /*
296     * Keycode is a non-alphanumeric key, so we have to do the lookup.
297     */
298    
299     skipToAscii:
300     if (keycode < 0 || keycode > MAX_KEYCODE) {
301     return NoSymbol;
302     }
303     switch (keycode) {
304     /*
305     * Windows only gives us an undifferentiated VK_CONTROL
306     * code (for example) when either Control key is pressed.
307     * To distinguish between left and right, we have to query the
308     * state of one of the two to determine which was actually
309     * pressed. So if the keycode indicates Control, Shift, or Menu
310     * (the key that everybody else calls Alt), do this extra test.
311     * If the right-side key was pressed, return the appropriate
312     * keycode. Otherwise, we fall through and rely on the
313     * keymap table to hold the correct keysym value.
314     */
315     case VK_CONTROL: {
316     if (GetKeyState(VK_RCONTROL) & 0x80) {
317     return XK_Control_R;
318     }
319     break;
320     }
321     case VK_SHIFT: {
322     if (GetKeyState(VK_RSHIFT) & 0x80) {
323     return XK_Shift_R;
324     }
325     break;
326     }
327     case VK_MENU: {
328     if (GetKeyState(VK_RMENU) & 0x80) {
329     return XK_Alt_R;
330     }
331     break;
332     }
333     }
334     return keymap[keycode];
335     }
336    
337    
338     /*
339     *----------------------------------------------------------------------
340     *
341     * TkpGetKeySym --
342     *
343     * Given an X KeyPress or KeyRelease event, map the
344     * keycode in the event into a KeySym.
345     *
346     * Results:
347     * The return value is the KeySym corresponding to
348     * eventPtr, or NoSymbol if no matching Keysym could be
349     * found.
350     *
351     * Side effects:
352     * In the first call for a given display, keycode-to-
353     * KeySym maps get loaded.
354     *
355     *----------------------------------------------------------------------
356     */
357    
358     KeySym
359     TkpGetKeySym(dispPtr, eventPtr)
360     TkDisplay *dispPtr; /* Display in which to map keycode. */
361     XEvent *eventPtr; /* Description of X event. */
362     {
363     KeySym sym;
364     int state = eventPtr->xkey.state;
365    
366     /*
367     * Refresh the mapping information if it's stale
368     */
369    
370     if (dispPtr->bindInfoStale) {
371     TkpInitKeymapInfo(dispPtr);
372     }
373    
374     sym = KeycodeToKeysym(eventPtr->xkey.keycode, state, 0);
375    
376     /*
377     * Special handling: if this is a ctrl-alt or shifted key, and there
378     * is no keysym defined, try without the modifiers.
379     */
380    
381     if ((sym == NoSymbol) && ((state & ControlMask) || (state & Mod2Mask))) {
382     state &= ~(ControlMask | Mod2Mask);
383     sym = KeycodeToKeysym(eventPtr->xkey.keycode, state, 0);
384     }
385     if ((sym == NoSymbol) && (state & ShiftMask)) {
386     state &= ~ShiftMask;
387     sym = KeycodeToKeysym(eventPtr->xkey.keycode, state, 0);
388     }
389     return sym;
390     }
391    
392     /*
393     *--------------------------------------------------------------
394     *
395     * TkpInitKeymapInfo --
396     *
397     * This procedure is invoked to scan keymap information
398     * to recompute stuff that's important for binding, such
399     * as the modifier key (if any) that corresponds to "mode
400     * switch".
401     *
402     * Results:
403     * None.
404     *
405     * Side effects:
406     * Keymap-related information in dispPtr is updated.
407     *
408     *--------------------------------------------------------------
409     */
410    
411     void
412     TkpInitKeymapInfo(dispPtr)
413     TkDisplay *dispPtr; /* Display for which to recompute keymap
414     * information. */
415     {
416     XModifierKeymap *modMapPtr;
417     KeyCode *codePtr;
418     KeySym keysym;
419     int count, i, j, max, arraySize;
420     #define KEYCODE_ARRAY_SIZE 20
421    
422     dispPtr->bindInfoStale = 0;
423     modMapPtr = XGetModifierMapping(dispPtr->display);
424    
425     /*
426     * Check the keycodes associated with the Lock modifier. If
427     * any of them is associated with the XK_Shift_Lock modifier,
428     * then Lock has to be interpreted as Shift Lock, not Caps Lock.
429     */
430    
431     dispPtr->lockUsage = LU_IGNORE;
432     codePtr = modMapPtr->modifiermap + modMapPtr->max_keypermod*LockMapIndex;
433     for (count = modMapPtr->max_keypermod; count > 0; count--, codePtr++) {
434     if (*codePtr == 0) {
435     continue;
436     }
437     keysym = KeycodeToKeysym(*codePtr, 0, 1);
438     if (keysym == XK_Shift_Lock) {
439     dispPtr->lockUsage = LU_SHIFT;
440     break;
441     }
442     if (keysym == XK_Caps_Lock) {
443     dispPtr->lockUsage = LU_CAPS;
444     break;
445     }
446     }
447    
448     /*
449     * Look through the keycodes associated with modifiers to see if
450     * the the "mode switch", "meta", or "alt" keysyms are associated
451     * with any modifiers. If so, remember their modifier mask bits.
452     */
453    
454     dispPtr->modeModMask = 0;
455     dispPtr->metaModMask = 0;
456     dispPtr->altModMask = 0;
457     codePtr = modMapPtr->modifiermap;
458     max = 8*modMapPtr->max_keypermod;
459     for (i = 0; i < max; i++, codePtr++) {
460     if (*codePtr == 0) {
461     continue;
462     }
463     keysym = KeycodeToKeysym(*codePtr, 0, 1);
464     if (keysym == XK_Mode_switch) {
465     dispPtr->modeModMask |= ShiftMask << (i/modMapPtr->max_keypermod);
466     }
467     if ((keysym == XK_Meta_L) || (keysym == XK_Meta_R)) {
468     dispPtr->metaModMask |= ShiftMask << (i/modMapPtr->max_keypermod);
469     }
470     if ((keysym == XK_Alt_L) || (keysym == XK_Alt_R)) {
471     dispPtr->altModMask |= ShiftMask << (i/modMapPtr->max_keypermod);
472     }
473     }
474    
475     /*
476     * Create an array of the keycodes for all modifier keys.
477     */
478    
479     if (dispPtr->modKeyCodes != NULL) {
480     ckfree((char *) dispPtr->modKeyCodes);
481     }
482     dispPtr->numModKeyCodes = 0;
483     arraySize = KEYCODE_ARRAY_SIZE;
484     dispPtr->modKeyCodes = (KeyCode *) ckalloc((unsigned)
485     (KEYCODE_ARRAY_SIZE * sizeof(KeyCode)));
486     for (i = 0, codePtr = modMapPtr->modifiermap; i < max; i++, codePtr++) {
487     if (*codePtr == 0) {
488     continue;
489     }
490    
491     /*
492     * Make sure that the keycode isn't already in the array.
493     */
494    
495     for (j = 0; j < dispPtr->numModKeyCodes; j++) {
496     if (dispPtr->modKeyCodes[j] == *codePtr) {
497     goto nextModCode;
498     }
499     }
500     if (dispPtr->numModKeyCodes >= arraySize) {
501     KeyCode *new;
502    
503     /*
504     * Ran out of space in the array; grow it.
505     */
506    
507     arraySize *= 2;
508     new = (KeyCode *) ckalloc((unsigned)
509     (arraySize * sizeof(KeyCode)));
510     memcpy((VOID *) new, (VOID *) dispPtr->modKeyCodes,
511     (dispPtr->numModKeyCodes * sizeof(KeyCode)));
512     ckfree((char *) dispPtr->modKeyCodes);
513     dispPtr->modKeyCodes = new;
514     }
515     dispPtr->modKeyCodes[dispPtr->numModKeyCodes] = *codePtr;
516     dispPtr->numModKeyCodes++;
517     nextModCode: continue;
518     }
519     XFreeModifiermap(modMapPtr);
520     }
521    
522     /*
523     * When mapping from a keysym to a keycode, need
524     * information about the modifier state that should be used
525     * so that when they call XKeycodeToKeysym taking into
526     * account the xkey.state, they will get back the original
527     * keysym.
528     */
529    
530     void
531     TkpSetKeycodeAndState(tkwin, keySym, eventPtr)
532     Tk_Window tkwin;
533     KeySym keySym;
534     XEvent *eventPtr;
535     {
536     int i;
537     SHORT result;
538     int shift;
539    
540     eventPtr->xkey.keycode = 0;
541     if (keySym == NoSymbol) {
542     return;
543     }
544    
545     /*
546     * We check our private map first for a virtual keycode,
547     * as VkKeyScan will return values that don't map to X
548     * for the "extended" Syms. This may be due to just casting
549     * problems below, but this works.
550     */
551     for (i = 0; i <= MAX_KEYCODE; i++) {
552     if (keymap[i] == keySym) {
553     eventPtr->xkey.keycode = i;
554     return;
555     }
556     }
557     if (keySym >= 0x20) {
558     result = VkKeyScan((char) keySym);
559     if (result != -1) {
560     shift = result >> 8;
561     if (shift & 1)
562     eventPtr->xkey.state |= ShiftMask;
563     if (shift & 2)
564     eventPtr->xkey.state |= ControlMask;
565     if (shift & 4)
566     eventPtr->xkey.state |= Mod2Mask;
567     eventPtr->xkey.keycode = (KeyCode) (result & 0xff);
568     }
569     }
570     {
571     /* Debug log */
572     FILE *fp = fopen("c:\\temp\\tklog.txt", "a");
573     if (fp != NULL) {
574     fprintf(fp, "TkpSetKeycode. Keycode %d State %d Keysym %d\n", eventPtr->xkey.keycode, eventPtr->xkey.state, keySym);
575     fclose(fp);
576     }
577     }
578     }
579    
580     /*
581     *----------------------------------------------------------------------
582     *
583     * XKeysymToKeycode --
584     *
585     * Translate a keysym back into a keycode.
586     *
587     * Results:
588     * Returns the keycode that would generate the specified keysym.
589     *
590     * Side effects:
591     * None.
592     *
593     *----------------------------------------------------------------------
594     */
595    
596     KeyCode
597     XKeysymToKeycode(display, keysym)
598     Display* display;
599     KeySym keysym;
600     {
601     int i;
602     SHORT result;
603    
604     /*
605     * We check our private map first for a virtual keycode,
606     * as VkKeyScan will return values that don't map to X
607     * for the "extended" Syms. This may be due to just casting
608     * problems below, but this works.
609     */
610     if (keysym == NoSymbol) {
611     return 0;
612     }
613     for (i = 0; i <= MAX_KEYCODE; i++) {
614     if (keymap[i] == keysym) {
615     return ((KeyCode) i);
616     }
617     }
618     if (keysym >= 0x20) {
619     result = VkKeyScan((char) keysym);
620     if (result != -1) {
621     return (KeyCode) (result & 0xff);
622     }
623     }
624    
625     return 0;
626     }
627    
628     /*
629     *----------------------------------------------------------------------
630     *
631     * XGetModifierMapping --
632     *
633     * Fetch the current keycodes used as modifiers.
634     *
635     * Results:
636     * Returns a new modifier map.
637     *
638     * Side effects:
639     * Allocates a new modifier map data structure.
640     *
641     *----------------------------------------------------------------------
642     */
643    
644     XModifierKeymap *
645     XGetModifierMapping(display)
646     Display* display;
647     {
648     XModifierKeymap *map = (XModifierKeymap *)ckalloc(sizeof(XModifierKeymap));
649    
650     map->max_keypermod = 1;
651     map->modifiermap = (KeyCode *) ckalloc(sizeof(KeyCode)*8);
652     map->modifiermap[ShiftMapIndex] = VK_SHIFT;
653     map->modifiermap[LockMapIndex] = VK_CAPITAL;
654     map->modifiermap[ControlMapIndex] = VK_CONTROL;
655     map->modifiermap[Mod1MapIndex] = VK_NUMLOCK;
656     map->modifiermap[Mod2MapIndex] = VK_MENU;
657     map->modifiermap[Mod3MapIndex] = VK_SCROLL;
658     map->modifiermap[Mod4MapIndex] = 0;
659     map->modifiermap[Mod5MapIndex] = 0;
660     return map;
661     }
662    
663     /*
664     *----------------------------------------------------------------------
665     *
666     * XFreeModifiermap --
667     *
668     * Deallocate a modifier map that was created by
669     * XGetModifierMapping.
670     *
671     * Results:
672     * None.
673     *
674     * Side effects:
675     * Frees the datastructure referenced by modmap.
676     *
677     *----------------------------------------------------------------------
678     */
679    
680     void
681     XFreeModifiermap(modmap)
682     XModifierKeymap* modmap;
683     {
684     ckfree((char *) modmap->modifiermap);
685     ckfree((char *) modmap);
686     }
687    
688     /*
689     *----------------------------------------------------------------------
690     *
691     * XStringToKeysym --
692     *
693     * Translate a keysym name to the matching keysym.
694     *
695     * Results:
696     * Returns the keysym. Since this is already handled by
697     * Tk's StringToKeysym function, we just return NoSymbol.
698     *
699     * Side effects:
700     * None.
701     *
702     *----------------------------------------------------------------------
703     */
704    
705     KeySym
706     XStringToKeysym(string)
707     _Xconst char *string;
708     {
709     return NoSymbol;
710     }
711    
712     /*
713     *----------------------------------------------------------------------
714     *
715     * XKeysymToString --
716     *
717     * Convert a keysym to character form.
718     *
719     * Results:
720     * Returns NULL, since Tk will have handled this already.
721     *
722     * Side effects:
723     * None.
724     *
725     *----------------------------------------------------------------------
726     */
727    
728     char *
729     XKeysymToString(keysym)
730     KeySym keysym;
731     {
732     return NULL;
733     }
734    
735     /* End of tkwinkey.c */

Properties

Name Value
svn:eol-style native
svn:keywords Header

dashley@gmail.com
ViewVC Help
Powered by ViewVC 1.1.25