1 /******************************************************************
3 Copyright 1992, 1993, 1994 by FUJITSU LIMITED
5 Permission to use, copy, modify, distribute, and sell this software
6 and its documentation for any purpose is hereby granted without fee,
7 provided that the above copyright notice appear in all copies and
8 that both that copyright notice and this permission notice appear
9 in supporting documentation, and that the name of FUJITSU LIMITED
10 not be used in advertising or publicity pertaining to distribution
11 of the software without specific, written prior permission.
12 FUJITSU LIMITED makes no representations about the suitability of
13 this software for any purpose.
14 It is provided "as is" without express or implied warranty.
16 FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
17 INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
18 EVENT SHALL FUJITSU LIMITED BE LIABLE FOR ANY SPECIAL, INDIRECT OR
19 CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
20 USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
21 OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
22 PERFORMANCE OF THIS SOFTWARE.
24 Author: Takashi Fujiwara FUJITSU LIMITED
25 fujiwara@a80.tech.yk.fujitsu.co.jp
27 ******************************************************************/
32 #include <X11/Xatom.h>
44 for (pic = (Xic)im->core.ic_chain; pic; pic = (Xic)pic->core.next) {
45 if (pic->private.proto.icid == icid)
52 _XimProcIMSetEventMask(
56 EVENTMASK *buf_l = (EVENTMASK *)buf;
58 im->private.proto.forward_event_mask = buf_l[0];
59 im->private.proto.synchronous_event_mask = buf_l[1];
64 _XimProcICSetEventMask(
68 EVENTMASK *buf_l = (EVENTMASK *)buf;
70 ic->private.proto.forward_event_mask = buf_l[0];
71 ic->private.proto.synchronous_event_mask = buf_l[1];
72 _XimReregisterFilter(ic);
77 _XimSetEventMaskCallback(
83 CARD16 *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
84 XIMID imid = buf_s[0];
85 XICID icid = buf_s[1];
86 Xim im = (Xim)call_data;
89 if (imid == im->private.proto.imid) {
91 ic = _XimICOfXICID(im, icid);
92 _XimProcICSetEventMask(ic, (XPointer)&buf_s[2]);
94 _XimProcIMSetEventMask(im, (XPointer)&buf_s[2]);
109 CARD16 *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
110 CARD8 major_opcode = *((CARD8 *)data);
111 CARD8 minor_opcode = *((CARD8 *)data + 1);
112 XIMID imid = buf_s[0];
113 XICID icid = buf_s[1];
115 if ((major_opcode == XIM_SYNC_REPLY)
116 && (minor_opcode == 0)
117 && (imid == im->private.proto.imid)
118 && (icid == ic->private.proto.icid))
120 if ((major_opcode == XIM_ERROR)
121 && (minor_opcode == 0)
122 && (buf_s[2] & XIM_IMID_VALID)
123 && (imid == im->private.proto.imid)
124 && (buf_s[2] & XIM_ICID_VALID)
125 && (icid == ic->private.proto.icid))
135 CARD32 buf32[BUFSIZE/4];
136 CARD8 *buf = (CARD8 *)buf32;
137 CARD16 *buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
139 CARD32 reply32[BUFSIZE/4];
140 char *reply = (char *)reply32;
145 buf_s[0] = im->private.proto.imid; /* imid */
146 buf_s[1] = ic->private.proto.icid; /* icid */
148 len = sizeof(CARD16) /* sizeof imid */
149 + sizeof(CARD16); /* sizeof icid */
151 _XimSetHeader((XPointer)buf, XIM_SYNC, 0, &len);
152 if (!(_XimWrite(im, len, (XPointer)buf)))
156 ret_code = _XimRead(im, &len, (XPointer)reply, buf_size,
157 _XimSyncCheck, (XPointer)ic);
158 if(ret_code == XIM_TRUE) {
160 } else if(ret_code == XIM_OVERFLOW) {
165 preply = (XPointer)Xmalloc(len);
166 ret_code = _XimRead(im, &len, preply, buf_size,
167 _XimSyncCheck, (XPointer)ic);
168 if(ret_code != XIM_TRUE) {
176 buf_s = (CARD16 *)((char *)preply + XIM_HEADER_SIZE);
177 if (*((CARD8 *)preply) == XIM_ERROR) {
178 _XimProcError(im, 0, (XPointer)&buf_s[3]);
193 CARD32 buf32[BUFSIZE/4];
194 CARD8 *buf = (CARD8 *)buf32;
195 CARD16 *buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
198 buf_s[0] = im->private.proto.imid; /* imid */
199 buf_s[1] = ic->private.proto.icid; /* icid */
201 len = sizeof(CARD16) /* sizeof imid */
202 + sizeof(CARD16); /* sizeof icid */
204 _XimSetHeader((XPointer)buf, XIM_SYNC_REPLY, 0, &len);
205 if (!(_XimWrite(im, len, (XPointer)buf)))
216 if (mode & XimSYNCHRONUS) /* SYNC Request */
217 MARK_NEED_SYNC_REPLY(ic->core.im);
229 CARD16 *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
230 XIMID imid = buf_s[0];
231 XICID icid = buf_s[1];
232 Xim im = (Xim)call_data;
235 if ((imid == im->private.proto.imid)
236 && (ic = _XimICOfXICID(im, icid))) {
237 (void)_XimProcSyncReply(im, ic);
248 if (!(_XimProtoEventToWire(ev, event, False)))
250 event->u.u.sequenceNumber =
251 ((XAnyEvent *)ev)->serial & (unsigned long)0xffff;
256 _XimForwardEventCore(
261 Xim im = (Xim)ic->core.im;
262 CARD32 buf32[BUFSIZE/4];
263 CARD8 *buf = (CARD8 *)buf32;
264 CARD16 *buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
265 CARD32 reply32[BUFSIZE/4];
266 char *reply = (char *)reply32;
272 if (!(len = _XimSetEventToWire(ev, (xEvent *)&buf_s[4])))
273 return False; /* X event */
275 buf_s[0] = im->private.proto.imid; /* imid */
276 buf_s[1] = ic->private.proto.icid; /* icid */
277 buf_s[2] = sync ? XimSYNCHRONUS : 0; /* flag */
279 (CARD16)((((XAnyEvent *)ev)->serial & ~((unsigned long)0xffff)) >> 16);
282 len += sizeof(CARD16) /* sizeof imid */
283 + sizeof(CARD16) /* sizeof icid */
284 + sizeof(BITMASK16) /* sizeof flag */
285 + sizeof(CARD16); /* sizeof serila number */
287 _XimSetHeader((XPointer)buf, XIM_FORWARD_EVENT, 0, &len);
288 if (!(_XimWrite(im, len, (XPointer)buf)))
294 ret_code = _XimRead(im, &len, (XPointer)reply, buf_size,
295 _XimSyncCheck, (XPointer)ic);
296 if(ret_code == XIM_TRUE) {
298 } else if(ret_code == XIM_OVERFLOW) {
303 preply = (XPointer)Xmalloc(len);
304 ret_code = _XimRead(im, &len, preply, buf_size,
305 _XimSyncCheck, (XPointer)ic);
306 if(ret_code != XIM_TRUE) {
314 buf_s = (CARD16 *)((char *)preply + XIM_HEADER_SIZE);
315 if (*((CARD8 *)preply) == XIM_ERROR) {
316 _XimProcError(im, 0, (XPointer)&buf_s[3]);
334 if (((ev->type == KeyPress) || (ev->type == KeyRelease)))
335 if (_XimExtForwardKeyEvent(ic, (XKeyEvent *)ev, sync))
338 return _XimForwardEventCore(ic, ev, sync);
348 INT16 serial = buf[0];
349 xEvent *xev = (xEvent *)&buf[1];
351 _XimProtoWireToEvent(ev, xev, False);
352 ev->xany.serial |= serial << 16;
353 ev->xany.send_event = False;
354 ev->xany.display = d;
355 MARK_FABRICATED(ic->core.im);
360 _XimForwardEventRecv(
365 CARD16 *buf_s = (CARD16 *)buf;
366 Display *d = im->core.display;
369 _XimProcEvent(d, ic, &ev, &buf_s[1]);
371 (void)_XimRespSyncReply(ic, buf_s[0]);
373 XPutBackEvent(d, &ev);
379 _XimForwardEventCallback(
385 CARD16 *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
386 XIMID imid = buf_s[0];
387 XICID icid = buf_s[1];
388 Xim im = (Xim)call_data;
391 if ((imid == im->private.proto.imid)
392 && (ic = _XimICOfXICID(im, icid))) {
393 (void)_XimForwardEventRecv(im, ic, (XPointer)&buf_s[2]);
400 _XimRegisterTriggerkey(
404 CARD32 *buf_l = (CARD32 *)buf;
408 if (IS_DYNAMIC_EVENT_FLOW(im)) /* already Dynamic event flow mode */
415 len = buf_l[0]; /* length of on-keys */
416 len += sizeof(INT32); /* sizeof length of on-keys */
418 if (!(key = (CARD32 *)Xmalloc(len))) {
419 _XimError(im, 0, XIM_BadAlloc, (INT16)0, (CARD16)0, (char *)NULL);
422 memcpy((char *)key, (char *)buf_l, len);
423 im->private.proto.im_onkeylist = key;
425 MARK_DYNAMIC_EVENT_FLOW(im);
428 * register offkeylist
431 buf_l = (CARD32 *)((char *)buf + len);
432 len = buf_l[0]; /* length of off-keys */
433 len += sizeof(INT32); /* sizeof length of off-keys */
435 if (!(key = (CARD32 *)Xmalloc(len))) {
436 _XimError(im, 0, XIM_BadAlloc, (INT16)0, (CARD16)0, (char *)NULL);
440 memcpy((char *)key, (char *)buf_l, len);
441 im->private.proto.im_offkeylist = key;
447 _XimRegisterTriggerKeysCallback(
453 CARD16 *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
454 Xim im = (Xim)call_data;
456 (void )_XimRegisterTriggerkey(im, (XPointer)&buf_s[2]);
461 _XimGetWindowEventmask(
464 Xim im = (Xim )ic->core.im;
465 XWindowAttributes atr;
467 if (!XGetWindowAttributes(im->core.display, ic->core.focus_window, &atr))
469 return (EVENTMASK)atr.your_event_mask;
474 _XimTriggerNotifyCheck(
481 CARD16 *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
482 CARD8 major_opcode = *((CARD8 *)data);
483 CARD8 minor_opcode = *((CARD8 *)data + 1);
484 XIMID imid = buf_s[0];
485 XICID icid = buf_s[1];
487 if ((major_opcode == XIM_TRIGGER_NOTIFY_REPLY)
488 && (minor_opcode == 0)
489 && (imid == im->private.proto.imid)
490 && (icid == ic->private.proto.icid))
492 if ((major_opcode == XIM_ERROR)
493 && (minor_opcode == 0)
494 && (buf_s[2] & XIM_IMID_VALID)
495 && (imid == im->private.proto.imid)
496 && (buf_s[2] & XIM_ICID_VALID)
497 && (icid == ic->private.proto.icid))
509 CARD32 buf32[BUFSIZE/4];
510 CARD8 *buf = (CARD8 *)buf32;
511 CARD16 *buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
512 CARD32 *buf_l = (CARD32 *)&buf[XIM_HEADER_SIZE];
513 CARD32 reply32[BUFSIZE/4];
514 char *reply = (char *)reply32;
519 EVENTMASK mask = _XimGetWindowEventmask(ic);
521 buf_s[0] = im->private.proto.imid; /* imid */
522 buf_s[1] = ic->private.proto.icid; /* icid */
523 buf_l[1] = mode; /* flag */
524 buf_l[2] = idx; /* index of keys list */
525 buf_l[3] = mask; /* select-event-mask */
527 len = sizeof(CARD16) /* sizeof imid */
528 + sizeof(CARD16) /* sizeof icid */
529 + sizeof(CARD32) /* sizeof flag */
530 + sizeof(CARD32) /* sizeof index of key list */
531 + sizeof(EVENTMASK); /* sizeof select-event-mask */
533 _XimSetHeader((XPointer)buf, XIM_TRIGGER_NOTIFY, 0, &len);
534 if (!(_XimWrite(im, len, (XPointer)buf)))
538 ret_code = _XimRead(im, &len, (XPointer)reply, buf_size,
539 _XimTriggerNotifyCheck, (XPointer)ic);
540 if(ret_code == XIM_TRUE) {
542 } else if(ret_code == XIM_OVERFLOW) {
547 preply = (XPointer)Xmalloc(len);
548 ret_code = _XimRead(im, &len, (XPointer)reply, buf_size,
549 _XimTriggerNotifyCheck, (XPointer)ic);
550 if(ret_code != XIM_TRUE) {
558 buf_s = (CARD16 *)((char *)preply + XIM_HEADER_SIZE);
559 if (*((CARD8 *)preply) == XIM_ERROR) {
560 _XimProcError(im, 0, (XPointer)&buf_s[3]);
580 if (!(info = (XimCommitInfo)Xmalloc(sizeof(XimCommitInfoRec))))
582 info->string = string;
583 info->string_len = string_len;
584 info->keysym = keysym;
585 info->keysym_len = keysym_len;
586 info->next = ic->private.proto.commit_info;
587 ic->private.proto.commit_info = info;
597 if (!(info = ic->private.proto.commit_info))
604 ic->private.proto.commit_info = info->next;
613 while (ic->private.proto.commit_info)
614 _XimUnregCommitInfo(ic);
625 Xim im = (Xim)ic->core.im;
627 if (!(*xim_keysym = (KeySym *)Xmalloc(sizeof(KeySym)))) {
628 _XimError(im, ic, XIM_BadAlloc, (INT16)0, (CARD16)0, (char *)NULL);
632 **xim_keysym = (KeySym)sym;
646 Xim im = (Xim)ic->core.im;
649 if (!(string = (char *)Xmalloc(len + 1))) {
650 _XimError(im, ic, XIM_BadAlloc, (INT16)0, (CARD16)0, (char *)NULL);
654 (void)memcpy(string, (char *)buf, len);
657 *xim_string = string;
658 *xim_string_len = len;
668 CARD16 *buf_s = (CARD16 *)buf;
669 BITMASK16 flag = buf_s[0];
673 KeySym *keysym = NULL;
676 if ((flag & XimLookupBoth) == XimLookupChars) {
677 if (!(_XimProcCommit(ic, (BYTE *)&buf_s[2],
678 (int)buf_s[1], &string, &string_len)))
681 } else if ((flag & XimLookupBoth) == XimLookupKeySym) {
682 if (!(_XimProcKeySym(ic, *(CARD32 *)&buf_s[2], &keysym, &keysym_len)))
685 } else if ((flag & XimLookupBoth) == XimLookupBoth) {
686 if (!(_XimProcKeySym(ic, *(CARD32 *)&buf_s[2], &keysym, &keysym_len)))
689 if (!(_XimProcCommit(ic, (BYTE *)&buf_s[5],
690 (int)buf_s[4], &string, &string_len))) {
696 if (!(_XimRegCommitInfo(ic, string, string_len, keysym, keysym_len))) {
701 _XimError(im, ic, XIM_BadAlloc, (INT16)0, (CARD16)0, (char *)NULL);
705 (void)_XimRespSyncReply(ic, flag);
710 ev.send_event = False;
711 ev.display = im->core.display;
712 ev.window = ic->core.focus_window;
716 XPutBackEvent(im->core.display, (XEvent *)&ev);
728 CARD16 *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
729 XIMID imid = buf_s[0];
730 XICID icid = buf_s[1];
731 Xim im = (Xim)call_data;
734 if ((imid == im->private.proto.imid)
735 && (ic = _XimICOfXICID(im, icid))) {
736 (void)_XimCommitRecv(im, ic, (XPointer)&buf_s[2]);
758 CARD16 *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
759 BITMASK16 flag = buf_s[2];
762 Xim im = (Xim)call_data;
765 if (flag & XIM_IMID_VALID) {
767 if (imid != im->private.proto.imid)
770 if (flag & XIM_ICID_VALID) {
772 if (!(ic = _XimICOfXICID(im, icid)))
775 _XimProcError(im, ic, (XPointer)&buf_s[3]);
789 CARD32 buf32[BUFSIZE/4];
790 CARD8 *buf = (CARD8 *)buf32;
791 CARD16 *buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
794 buf_s[0] = im->private.proto.imid; /* imid */
795 buf_s[2] = XIM_IMID_VALID; /* flag */
797 buf_s[1] = ic->private.proto.icid; /* icid */
798 buf_s[2] |= XIM_ICID_VALID; /* flag */
800 buf_s[3] = error_code; /* Error Code */
801 buf_s[4] = detail_length; /* length of error detail */
802 buf_s[5] = type; /* type of error detail */
804 if (detail_length && detail) {
806 memcpy((char *)&buf_s[6], detail, len);
807 XIM_SET_PAD(&buf_s[6], len);
810 len += sizeof(CARD16) /* sizeof imid */
811 + sizeof(CARD16) /* sizeof icid */
812 + sizeof(BITMASK16) /* sizeof flag */
813 + sizeof(CARD16) /* sizeof error_code */
814 + sizeof(INT16) /* sizeof length of detail */
815 + sizeof(CARD16); /* sizeof type */
817 _XimSetHeader((XPointer)buf, XIM_ERROR, 0, &len);
818 if (!(_XimWrite(im, len, (XPointer)buf)))
841 char scratchbuf[BUFSIZ];
847 if (!conv || !from || !from_len) {
848 *state = XLookupNone;
852 /* Reset the converter. The CompoundText at 'from' starts in
854 _XlcResetConverter(conv);
856 from_left = from_len;
861 from_buf = &from[from_cnvlen];
862 from_savelen = from_left;
863 to_buf = &scratchbuf[to_cnvlen];
864 to_savelen = to_left;
865 if (_XlcConvert(conv, (XPointer *)&from_buf, &from_left,
866 (XPointer *)&to_buf, &to_left, NULL, 0) < 0) {
867 *state = XLookupNone;
870 from_cnvlen += (from_savelen - from_left);
871 to_cnvlen += (to_savelen - to_left);
872 if (from_left == 0) {
874 *state = XLookupNone;
881 if (!to || !to_len || (to_len < to_cnvlen)) {
882 *state = XBufferOverflow;
884 memcpy(to, scratchbuf, to_cnvlen);
885 *state = XLookupChars;
891 _Ximctstombs(XIM xim, char *from, int from_len,
892 char *to, int to_len, Status *state)
894 return _Ximctsconvert(((Xim)xim)->private.proto.ctom_conv,
895 from, from_len, to, to_len, state);
908 XlcConv conv = im->private.proto.ctow_conv;
917 wchar_t scratchbuf[BUFSIZ];
923 if (!conv || !from || !from_len) {
924 *state = XLookupNone;
928 /* Reset the converter. The CompoundText at 'from' starts in
930 _XlcResetConverter(conv);
932 from_left = from_len;
937 from_buf = &from[from_cnvlen];
938 from_savelen = from_left;
939 to_buf = &scratchbuf[to_cnvlen];
940 to_savelen = to_left;
941 if (_XlcConvert(conv, (XPointer *)&from_buf, &from_left,
942 (XPointer *)&to_buf, &to_left, NULL, 0) < 0) {
943 *state = XLookupNone;
946 from_cnvlen += (from_savelen - from_left);
947 to_cnvlen += (to_savelen - to_left);
948 if (from_left == 0) {
950 *state = XLookupNone;
957 if (!to || !to_len || (to_len < to_cnvlen)) {
958 *state = XBufferOverflow;
960 memcpy(to, scratchbuf, to_cnvlen * sizeof(wchar_t));
961 *state = XLookupChars;
975 return _Ximctsconvert(((Xim)xim)->private.proto.ctoutf8_conv,
976 from, from_len, to, to_len, state);
980 _XimProtoMbLookupString(
989 Xim im = (Xim)ic->core.im;
994 if (!IS_SERVER_CONNECTED(im))
1000 if ((ev->type == KeyPress) && (ev->keycode == 0)) { /* Filter function */
1001 if (!(info = ic->private.proto.commit_info)) {
1002 *state = XLookupNone;
1006 ret = im->methods->ctstombs((XIM)im, info->string,
1007 info->string_len, buffer, bytes, state);
1008 if (*state == XBufferOverflow)
1010 if (keysym && (info->keysym && *(info->keysym))) {
1011 *keysym = *(info->keysym);
1012 if (*state == XLookupChars)
1013 *state = XLookupBoth;
1015 *state = XLookupKeySym;
1017 _XimUnregCommitInfo(ic);
1019 } else if (ev->type == KeyPress) {
1020 ret = _XimLookupMBText(ic, ev, buffer, bytes, keysym, NULL);
1023 *state = XBufferOverflow;
1024 else if (keysym && *keysym != NoSymbol)
1025 *state = XLookupBoth;
1027 *state = XLookupChars;
1029 if (keysym && *keysym != NoSymbol)
1030 *state = XLookupKeySym;
1032 *state = XLookupNone;
1035 *state = XLookupNone;
1043 _XimProtoWcLookupString(
1052 Xim im = (Xim)ic->core.im;
1057 if (!IS_SERVER_CONNECTED(im))
1063 if (ev->type == KeyPress && ev->keycode == 0) { /* Filter function */
1064 if (!(info = ic->private.proto.commit_info)) {
1065 *state = XLookupNone;
1069 ret = im->methods->ctstowcs((XIM)im, info->string,
1070 info->string_len, buffer, bytes, state);
1071 if (*state == XBufferOverflow)
1073 if (keysym && (info->keysym && *(info->keysym))) {
1074 *keysym = *(info->keysym);
1075 if (*state == XLookupChars)
1076 *state = XLookupBoth;
1078 *state = XLookupKeySym;
1080 _XimUnregCommitInfo(ic);
1082 } else if (ev->type == KeyPress) {
1083 ret = _XimLookupWCText(ic, ev, buffer, bytes, keysym, NULL);
1086 *state = XBufferOverflow;
1087 else if (keysym && *keysym != NoSymbol)
1088 *state = XLookupBoth;
1090 *state = XLookupChars;
1092 if (keysym && *keysym != NoSymbol)
1093 *state = XLookupKeySym;
1095 *state = XLookupNone;
1098 *state = XLookupNone;
1106 _XimProtoUtf8LookupString(
1115 Xim im = (Xim)ic->core.im;
1120 if (!IS_SERVER_CONNECTED(im))
1126 if (ev->type == KeyPress && ev->keycode == 0) { /* Filter function */
1127 if (!(info = ic->private.proto.commit_info)) {
1128 *state = XLookupNone;
1132 ret = im->methods->ctstoutf8((XIM)im, info->string,
1133 info->string_len, buffer, bytes, state);
1134 if (*state == XBufferOverflow)
1136 if (keysym && (info->keysym && *(info->keysym))) {
1137 *keysym = *(info->keysym);
1138 if (*state == XLookupChars)
1139 *state = XLookupBoth;
1141 *state = XLookupKeySym;
1143 _XimUnregCommitInfo(ic);
1145 } else if (ev->type == KeyPress) {
1146 ret = _XimLookupUTF8Text(ic, ev, buffer, bytes, keysym, NULL);
1149 *state = XBufferOverflow;
1150 else if (keysym && *keysym != NoSymbol)
1151 *state = XLookupBoth;
1153 *state = XLookupChars;
1155 if (keysym && *keysym != NoSymbol)
1156 *state = XLookupKeySym;
1158 *state = XLookupNone;
1161 *state = XLookupNone;