2 * Copyright 1991, 1992 Oracle and/or its affiliates. All rights reserved.
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 * DEALINGS IN THE SOFTWARE.
23 /******************************************************************
25 Copyright 1992, 1993, 1994 by FUJITSU LIMITED
27 Permission to use, copy, modify, distribute, and sell this software
28 and its documentation for any purpose is hereby granted without fee,
29 provided that the above copyright notice appear in all copies and
30 that both that copyright notice and this permission notice appear
31 in supporting documentation, and that the name of FUJITSU LIMITED
32 not be used in advertising or publicity pertaining to distribution
33 of the software without specific, written prior permission.
34 FUJITSU LIMITED makes no representations about the suitability of
35 this software for any purpose.
36 It is provided "as is" without express or implied warranty.
38 FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
39 INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
40 EVENT SHALL FUJITSU LIMITED BE LIABLE FOR ANY SPECIAL, INDIRECT OR
41 CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
42 USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
43 OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
44 PERFORMANCE OF THIS SOFTWARE.
46 Author: Hideki Hiura (hhiura@Sun.COM) Sun Microsystems, Inc.
47 Takashi Fujiwara FUJITSU LIMITED
48 fujiwara@a80.tech.yk.fujitsu.co.jp
50 ******************************************************************/
66 CARD16 *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
67 CARD8 major_opcode = *((CARD8 *)data);
68 CARD8 minor_opcode = *((CARD8 *)data + 1);
69 XIMID imid = buf_s[0];
71 if ((major_opcode == XIM_CREATE_IC_REPLY)
72 && (minor_opcode == 0)
73 && (imid == im->private.proto.imid))
75 if ((major_opcode == XIM_ERROR)
76 && (minor_opcode == 0)
77 && (buf_s[2] & XIM_IMID_VALID)
78 && (imid == im->private.proto.imid))
83 #ifdef XIM_CONNECTABLE
88 Xim im = (Xim)ic->core.im;
92 XIMStyle input_style = ic->core.input_style;
93 XimDefICValues ic_values;
97 CARD32 tmp_buf32[BUFSIZE/4];
98 char *tmp_buf = (char *)tmp_buf32;
106 CARD32 reply32[BUFSIZE/4];
107 char *reply = (char *)reply32;
111 if (!(save_ic = (Xic)Xmalloc(sizeof(XicRec))))
113 memcpy((char *)save_ic, (char *)ic, sizeof(XicRec));
115 ic->core.filter_events = im->private.proto.forward_event_mask;
116 ic->private.proto.forward_event_mask =
117 im->private.proto.forward_event_mask;
118 ic->private.proto.synchronous_event_mask =
119 im->private.proto.synchronous_event_mask;
121 num = im->core.ic_num_resources;
122 buf_size = sizeof(XIMResource) * num;
123 if (!(res = (XIMResourceList)Xmalloc(buf_size)))
124 goto ErrorOnReCreateIC;
125 (void)memcpy((char *)res, (char *)im->core.ic_resources, buf_size);
126 ic->private.proto.ic_resources = res;
127 ic->private.proto.ic_num_resources = num;
129 num = im->private.proto.ic_num_inner_resources;
130 buf_size = sizeof(XIMResource) * num;
131 if (!(res = (XIMResourceList)Xmalloc(buf_size)))
132 goto ErrorOnReCreateIC;
133 (void)memcpy((char *)res,
134 (char *)im->private.proto.ic_inner_resources, buf_size);
135 ic->private.proto.ic_inner_resources = res;
136 ic->private.proto.ic_num_inner_resources = num;
138 _XimSetICMode(ic->private.proto.ic_resources,
139 ic->private.proto.ic_num_resources, input_style);
141 _XimSetICMode(ic->private.proto.ic_inner_resources,
142 ic->private.proto.ic_num_inner_resources, input_style);
144 _XimGetCurrentICValues(ic, &ic_values);
146 buf_size = XIM_HEADER_SIZE + sizeof(CARD16) + sizeof(INT16);
147 data_len = BUFSIZE - buf_size;
151 data = &buf[buf_size];
152 if (!_XimEncodeSavedICATTRIBUTE(ic, ic->private.proto.ic_resources,
153 ic->private.proto.ic_num_resources, &idx, data, data_len,
154 &ret_len, (XPointer)&ic_values, XIM_CREATEIC)) {
157 goto ErrorOnReCreateIC;
166 if (buf == tmp_buf) {
167 if (!(tmp = (char *)Xmalloc(buf_size + data_len))) {
168 goto ErrorOnReCreateIC;
170 memcpy(tmp, buf, buf_size);
173 if (!(tmp = (char *)Xrealloc(buf, (buf_size + data_len)))) {
175 goto ErrorOnReCreateIC;
181 buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
182 buf_s[0] = im->private.proto.imid;
183 buf_s[1] = (INT16)total;
185 len = (INT16)(sizeof(CARD16) + sizeof(INT16) + total);
186 _XimSetHeader((XPointer)buf, XIM_CREATE_IC, 0, &len);
187 if (!(_XimWrite(im, len, (XPointer)buf))) {
190 goto ErrorOnReCreateIC;
195 ic->private.proto.waitCallback = True;
197 ret_code = _XimRead(im, &len, (XPointer)reply, buf_size,
198 _XimCreateICCheck, 0);
199 if (ret_code == XIM_TRUE) {
201 } else if (ret_code == XIM_OVERFLOW) {
206 preply = (XPointer)Xmalloc(buf_size);
207 ret_code = _XimRead(im, &len, preply, buf_size,
208 _XimCreateICCheck, 0);
209 if (ret_code != XIM_TRUE) {
211 ic->private.proto.waitCallback = False;
212 goto ErrorOnReCreateIC;
216 ic->private.proto.waitCallback = False;
217 goto ErrorOnReCreateIC;
219 ic->private.proto.waitCallback = False;
220 buf_s = (CARD16 *)((char *)preply + XIM_HEADER_SIZE);
221 if (*((CARD8 *)preply) == XIM_ERROR) {
222 _XimProcError(im, 0, (XPointer)&buf_s[3]);
225 goto ErrorOnReCreateIC;
228 ic->private.proto.icid = buf_s[1]; /* icid */
232 _XimRegisterFilter(ic);
233 MARK_IC_CONNECTED(ic);
234 if (save_ic->private.proto.ic_resources)
235 Xfree(save_ic->private.proto.ic_resources);
236 if (save_ic->private.proto.ic_inner_resources)
237 Xfree(save_ic->private.proto.ic_inner_resources);
242 memcpy((char *)ic, (char *)save_ic, sizeof(XicRec));
248 _XimDelayModeGetICValues(ic, arg)
252 XimDefICValues ic_values;
254 _XimGetCurrentICValues(ic, &ic_values);
255 return _XimGetICValueData(ic, (XPointer)&ic_values,
256 ic->private.proto.ic_resources,
257 ic->private.proto.ic_num_resources,
258 arg, XIM_GETICVALUES);
260 #endif /* XIM_CONNECTABLE */
263 _XimGetICValuesCheck(
270 CARD16 *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
271 CARD8 major_opcode = *((CARD8 *)data);
272 CARD8 minor_opcode = *((CARD8 *)data + 1);
273 XIMID imid = buf_s[0];
274 XICID icid = buf_s[1];
276 if ((major_opcode == XIM_GET_IC_VALUES_REPLY)
277 && (minor_opcode == 0)
278 && (imid == im->private.proto.imid)
279 && (icid == ic->private.proto.icid))
281 if ((major_opcode == XIM_ERROR)
282 && (minor_opcode == 0)
283 && (buf_s[2] & XIM_IMID_VALID)
284 && (imid == im->private.proto.imid)
285 && (buf_s[2] & XIM_ICID_VALID)
286 && (icid == ic->private.proto.icid))
292 _XimProtoGetICValues(
297 Xim im = (Xim)ic->core.im;
304 CARD32 reply32[BUFSIZE/4];
305 char *reply = (char *)reply32;
306 XPointer preply = NULL;
314 #ifndef XIM_CONNECTABLE
315 if (!IS_IC_CONNECTED(ic))
318 if (!IS_IC_CONNECTED(ic)) {
319 if (IS_CONNECTABLE(im)) {
320 if (_XimConnectServer(im)) {
321 if (!_XimReCreateIC(ic)) {
322 _XimDelayModeSetAttr(im);
323 return _XimDelayModeGetICValues(ic, arg);
326 return _XimDelayModeGetICValues(ic, arg);
332 #endif /* XIM_CONNECTABLE */
334 for (n = 0, p = arg; p && p->name; p++) {
336 if ((strcmp(p->name, XNPreeditAttributes) == 0)
337 || (strcmp(p->name, XNStatusAttributes) == 0)) {
339 for (pp = (XIMArg *)p->value; pp && pp->name; pp++)
347 buf_size = sizeof(CARD16) * n;
348 buf_size += XIM_HEADER_SIZE
352 + XIM_PAD(2 + buf_size);
354 if (!(buf = (CARD8 *)Xmalloc(buf_size)))
356 buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
358 makeid_name = _XimMakeICAttrIDList(ic, ic->private.proto.ic_resources,
359 ic->private.proto.ic_num_resources, arg,
360 &buf_s[3], &len, XIM_GETICVALUES);
363 buf_s[0] = im->private.proto.imid; /* imid */
364 buf_s[1] = ic->private.proto.icid; /* icid */
365 buf_s[2] = len; /* length of ic-attr-id */
366 len += sizeof(INT16); /* sizeof length of attr */
367 XIM_SET_PAD(&buf_s[2], len); /* pad */
368 len += sizeof(CARD16) /* sizeof imid */
369 + sizeof(CARD16); /* sizeof icid */
371 _XimSetHeader((XPointer)buf, XIM_GET_IC_VALUES, 0, &len);
372 if (!(_XimWrite(im, len, (XPointer)buf))) {
379 ret_code = _XimRead(im, &len, (XPointer)reply, buf_size,
380 _XimGetICValuesCheck, (XPointer)ic);
381 if (ret_code == XIM_TRUE) {
383 } else if (ret_code == XIM_OVERFLOW) {
388 preply = (XPointer)Xmalloc(len);
389 ret_code = _XimRead(im, &len, preply, buf_size,
390 _XimGetICValuesCheck, (XPointer)ic);
391 if (ret_code != XIM_TRUE) {
400 buf_s = (CARD16 *)((char *)preply + XIM_HEADER_SIZE);
401 if (*((CARD8 *)preply) == XIM_ERROR) {
402 _XimProcError(im, 0, (XPointer)&buf_s[3]);
414 decode_name = _XimDecodeICATTRIBUTE(ic, ic->private.proto.ic_resources,
415 ic->private.proto.ic_num_resources, data, data_len,
416 arg, XIM_GETICVALUES);
426 #ifdef XIM_CONNECTABLE
428 _XimCheckNestQuarkList(quark_list, num_quark, quark, separator)
429 XrmQuark *quark_list;
436 for (i = 0; i < num_quark; i++) {
437 if (quark_list[i] == separator) {
440 if (quark_list[i] == quark) {
448 _XimCheckNestedQuarkList(quark_list, idx, num_quark, arg, separator)
449 XrmQuark **quark_list;
455 XrmQuark *q_list = *quark_list;
456 int n_quark = *num_quark;
462 for (p = arg; p && p->name; p++) {
463 quark = XrmStringToQuark(p->name);
464 if (_XimCheckNestQuarkList(&q_list[idx], n_quark - idx,
468 if (!(tmp = (XrmQuark *)Xmalloc((sizeof(XrmQuark) * (n_quark + 1))))) {
469 *quark_list = q_list;
470 *num_quark = n_quark;
474 for (i = 0; i < idx; i++) {
478 for (i = idx + 1; i < n_quark; i++) {
479 tmp[i] = q_list[i - 1];
483 *quark_list = q_list;
484 *num_quark = n_quark;
489 _XimCheckICQuarkList(quark_list, num_quark, quark, idx)
490 XrmQuark *quark_list;
497 for (i = 0; i < num_quark; i++) {
498 if (quark_list[i] == quark) {
507 _XimSaveICValues(ic, arg)
513 XrmQuark *quark_list;
522 pre_quark = XrmStringToQuark(XNPreeditAttributes);
523 sts_quark = XrmStringToQuark(XNStatusAttributes);
524 separator = XrmStringToQuark(XNSeparatorofNestedList);
526 if (quark_list = ic->private.proto.saved_icvalues) {
527 num_quark = ic->private.proto.num_saved_icvalues;
528 for (p = arg; p && p->name; p++) {
529 quark = XrmStringToQuark(p->name);
530 if ((quark == pre_quark) || (quark == sts_quark)) {
531 if (!_XimCheckICQuarkList(quark_list, num_quark, quark, &idx)) {
536 for (pp = (XIMArg *)p->value, nn = 0;
537 pp && pp->name; pp++, nn++);
538 if (!(tmp = (XrmQuark *)Xrealloc(quark_list,
539 (sizeof(XrmQuark) * (num_quark + nn + 2))))) {
540 ic->private.proto.saved_icvalues = quark_list;
541 ic->private.proto.num_saved_icvalues = num_quark;
545 q_list = &quark_list[num_quark];
548 for (pp = (XIMArg *)p->value;
549 pp && pp->name; pp++, quark_list++) {
550 *q_list = XrmStringToQuark(pp->name);
554 if (!_XimCheckNestedQuarkList(&quark_list, idx + 1,
555 &num_quark, (XIMArg *)p->value, separator)) {
556 ic->private.proto.saved_icvalues = quark_list;
557 ic->private.proto.num_saved_icvalues = num_quark;
562 if (_XimCheckICQuarkList(quark_list, num_quark, quark, &idx)) {
565 if (!(tmp = (XrmQuark *)Xrealloc(quark_list,
566 (sizeof(XrmQuark) * (num_quark + 1))))) {
567 ic->private.proto.saved_icvalues = quark_list;
568 ic->private.proto.num_saved_icvalues = num_quark;
572 quark_list[num_quark] = quark;
576 ic->private.proto.saved_icvalues = quark_list;
577 ic->private.proto.num_saved_icvalues = num_quark;
581 for (p = arg, n = 0; p && p->name; p++, n++) {
582 if ((!strcmp(p->name, XNPreeditAttributes))
583 || (!strcmp(p->name, XNStatusAttributes))) {
587 for (pp = (XIMArg *)p->value, nn = 0; pp && pp->name; pp++, nn++);
592 if (!(quark_list = (XrmQuark *)Xmalloc(sizeof(XrmQuark) * n))) {
596 ic->private.proto.saved_icvalues = quark_list;
597 ic->private.proto.num_saved_icvalues = n;
598 for (p = arg; p && p->name; p++, quark_list++) {
599 *quark_list = XrmStringToQuark(p->name);
600 if ((*quark_list == pre_quark) || (*quark_list == sts_quark)) {
604 for (pp = (XIMArg *)p->value; pp && pp->name; pp++, quark_list++) {
605 *quark_list = XrmStringToQuark(pp->name);
607 *quark_list = separator;
614 _XimDelayModeSetICValues(ic, arg)
618 XimDefICValues ic_values;
621 _XimGetCurrentICValues(ic, &ic_values);
622 name = _XimSetICValueData(ic, (XPointer)&ic_values,
623 ic->private.proto.ic_resources,
624 ic->private.proto.ic_num_resources,
625 arg, XIM_SETICVALUES, False);
626 _XimSetCurrentICValues(ic, &ic_values);
629 #endif /* XIM_CONNECTABLE */
632 _XimSetICValuesCheck(
639 CARD16 *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
640 CARD8 major_opcode = *((CARD8 *)data);
641 CARD8 minor_opcode = *((CARD8 *)data + 1);
642 XIMID imid = buf_s[0];
643 XICID icid = buf_s[1];
645 if ((major_opcode == XIM_SET_IC_VALUES_REPLY)
646 && (minor_opcode == 0)
647 && (imid == im->private.proto.imid)
648 && (icid == ic->private.proto.icid))
650 if ((major_opcode == XIM_ERROR)
651 && (minor_opcode == 0)
652 && (buf_s[2] & XIM_IMID_VALID)
653 && (imid == im->private.proto.imid)
654 && (buf_s[2] & XIM_ICID_VALID)
655 && (icid == ic->private.proto.icid))
661 _XimProtoSetICValues(
666 Xim im = (Xim)ic->core.im;
667 XimDefICValues ic_values;
671 CARD32 tmp_buf32[BUFSIZE/4];
672 char *tmp_buf = (char *)tmp_buf32;
680 CARD32 reply32[BUFSIZE/4];
681 char *reply = (char *)reply32;
682 XPointer preply = NULL;
686 char *tmp_name = (arg) ? arg->name : NULL;
688 #ifndef XIM_CONNECTABLE
689 if (!IS_IC_CONNECTED(ic))
692 if (!_XimSaveICValues(ic, arg))
695 if (!IS_IC_CONNECTED(ic)) {
696 if (IS_CONNECTABLE(im)) {
697 if (_XimConnectServer(im)) {
698 if (!_XimReCreateIC(ic)) {
699 _XimDelayModeSetAttr(im);
700 return _XimDelayModeSetICValues(ic, arg);
703 return _XimDelayModeSetICValues(ic, arg);
709 #endif /* XIM_CONNECTABLE */
711 _XimGetCurrentICValues(ic, &ic_values);
713 buf_size = XIM_HEADER_SIZE
714 + sizeof(CARD16) + sizeof(CARD16) + sizeof(INT16) + sizeof(CARD16);
715 data_len = BUFSIZE - buf_size;
719 data = &buf[buf_size];
720 if ((name = _XimEncodeICATTRIBUTE(ic, ic->private.proto.ic_resources,
721 ic->private.proto.ic_num_resources, arg, &arg_ret,
722 data, data_len, &ret_len, (XPointer)&ic_values,
723 &flag, XIM_SETICVALUES))) {
728 if (!(arg = arg_ret)) {
733 if (buf == tmp_buf) {
734 if (!(tmp = (char *)Xmalloc(buf_size + data_len))) {
737 memcpy(tmp, buf, buf_size);
740 if (!(tmp = (char *)Xrealloc(buf, (buf_size + data_len)))) {
747 _XimSetCurrentICValues(ic, &ic_values);
753 buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
756 if (_XimExtenMove(im, ic, flag, &buf_s[4], (INT16)total))
760 buf_s[0] = im->private.proto.imid;
761 buf_s[1] = ic->private.proto.icid;
762 buf_s[2] = (INT16)total;
764 len = (INT16)(sizeof(CARD16) + sizeof(CARD16)
765 + sizeof(INT16) + sizeof(CARD16) + total);
767 _XimSetHeader((XPointer)buf, XIM_SET_IC_VALUES, 0, &len);
768 if (!(_XimWrite(im, len, (XPointer)buf))) {
776 ic->private.proto.waitCallback = True;
778 ret_code = _XimRead(im, &len, (XPointer)reply, buf_size,
779 _XimSetICValuesCheck, (XPointer)ic);
780 if (ret_code == XIM_TRUE) {
782 } else if (ret_code == XIM_OVERFLOW) {
784 preply = (XPointer)Xmalloc(buf_size);
785 ret_code = _XimRead(im, &len, preply, buf_size,
786 _XimSetICValuesCheck, (XPointer)ic);
787 if (ret_code != XIM_TRUE) {
789 ic->private.proto.waitCallback = False;
793 ic->private.proto.waitCallback = False;
796 ic->private.proto.waitCallback = False;
797 buf_s = (CARD16 *)((char *)preply + XIM_HEADER_SIZE);
798 if (*((CARD8 *)preply) == XIM_ERROR) {
799 _XimProcError(im, 0, (XPointer)&buf_s[3]);
818 CARD16 *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
819 CARD8 major_opcode = *((CARD8 *)data);
820 CARD8 minor_opcode = *((CARD8 *)data + 1);
821 XIMID imid = buf_s[0];
822 XICID icid = buf_s[1];
825 if ((major_opcode == XIM_DESTROY_IC_REPLY)
826 && (minor_opcode == 0)
827 && (imid == im->private.proto.imid)
828 && (icid == ic->private.proto.icid))
830 if ((major_opcode == XIM_ERROR)
831 && (minor_opcode == 0)
832 && (buf_s[2] & XIM_IMID_VALID)
833 && (imid == im->private.proto.imid)
834 && (buf_s[2] & XIM_ICID_VALID)
835 && (icid == ic->private.proto.icid))
844 #ifdef XIM_CONNECTABLE
845 Xim im = (Xim)ic->core.im;
848 if (ic->private.proto.preedit_font) {
849 Xfree(ic->private.proto.preedit_font);
850 ic->private.proto.preedit_font = NULL;
852 if (ic->private.proto.status_font) {
853 Xfree(ic->private.proto.status_font);
854 ic->private.proto.status_font = NULL;
856 if (ic->private.proto.commit_info) {
857 _XimFreeCommitInfo(ic);
858 ic->private.proto.commit_info = NULL;
860 if (ic->private.proto.ic_inner_resources) {
861 Xfree(ic->private.proto.ic_inner_resources);
862 ic->private.proto.ic_inner_resources = NULL;
865 #ifdef XIM_CONNECTABLE
866 if (IS_SERVER_CONNECTED(im) && IS_RECONNECTABLE(im)) {
869 #endif /* XIM_CONNECTABLE */
871 if (ic->private.proto.saved_icvalues) {
872 Xfree(ic->private.proto.saved_icvalues);
873 ic->private.proto.saved_icvalues = NULL;
875 if (ic->private.proto.ic_resources) {
876 Xfree(ic->private.proto.ic_resources);
877 ic->private.proto.ic_resources = NULL;
879 if (ic->core.hotkey) {
880 Xfree(ic->core.hotkey);
881 ic->core.hotkey = NULL;
892 Xim im = (Xim)ic->core.im;
893 CARD32 buf32[BUFSIZE/4];
894 CARD8 *buf = (CARD8 *)buf32;
895 CARD16 *buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
897 CARD32 reply32[BUFSIZE/4];
898 char *reply = (char *)reply32;
903 if (IS_SERVER_CONNECTED(im)) {
904 buf_s[0] = im->private.proto.imid; /* imid */
905 buf_s[1] = ic->private.proto.icid; /* icid */
907 len = sizeof(CARD16) /* sizeof imid */
908 + sizeof(CARD16); /* sizeof icid */
910 _XimSetHeader((XPointer)buf, XIM_DESTROY_IC, 0, &len);
911 (void)_XimWrite(im, len, (XPointer)buf);
914 ret_code = _XimRead(im, &len, (XPointer)reply, buf_size,
915 _XimDestroyICCheck, (XPointer)ic);
916 if (ret_code == XIM_OVERFLOW) {
918 preply = (XPointer)Xmalloc(buf_size);
919 (void)_XimRead(im, &len, preply, buf_size,
920 _XimDestroyICCheck, (XPointer)ic);
924 UNMARK_IC_CONNECTED(ic);
925 _XimUnregisterFilter(ic);
935 Xim im = (Xim)ic->core.im;
936 CARD32 buf32[BUFSIZE/4];
937 CARD8 *buf = (CARD8 *)buf32;
938 CARD16 *buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
941 #ifndef XIM_CONNECTABLE
942 if (!IS_IC_CONNECTED(ic))
945 if (!IS_IC_CONNECTED(ic)) {
946 if (IS_CONNECTABLE(im)) {
947 if (_XimConnectServer(im)) {
948 if (!_XimReCreateIC(ic)) {
949 _XimDelayModeSetAttr(im);
959 #endif /* XIM_CONNECTABLE */
961 buf_s[0] = im->private.proto.imid; /* imid */
962 buf_s[1] = ic->private.proto.icid; /* icid */
964 len = sizeof(CARD16) /* sizeof imid */
965 + sizeof(CARD16); /* sizeof icid */
967 _XimSetHeader((XPointer)buf, XIM_SET_IC_FOCUS, 0, &len);
968 (void)_XimWrite(im, len, (XPointer)buf);
971 _XimRegisterFilter(ic);
980 Xim im = (Xim)ic->core.im;
981 CARD32 buf32[BUFSIZE/4];
982 CARD8 *buf = (CARD8 *)buf32;
983 CARD16 *buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
986 #ifndef XIM_CONNECTABLE
987 if (!IS_IC_CONNECTED(ic))
990 if (!IS_IC_CONNECTED(ic)) {
991 if (IS_CONNECTABLE(im)) {
992 if (_XimConnectServer(im)) {
993 if (!_XimReCreateIC(ic)) {
994 _XimDelayModeSetAttr(im);
1004 #endif /* XIM_CONNECTABLE */
1006 buf_s[0] = im->private.proto.imid; /* imid */
1007 buf_s[1] = ic->private.proto.icid; /* icid */
1009 len = sizeof(CARD16) /* sizeof imid */
1010 + sizeof(CARD16); /* sizeof icid */
1012 _XimSetHeader((XPointer)buf, XIM_UNSET_IC_FOCUS, 0, &len);
1013 (void)_XimWrite(im, len, (XPointer)buf);
1016 _XimUnregisterFilter(ic);
1028 CARD16 *buf_s = (CARD16 *)((CARD8 *)data + XIM_HEADER_SIZE);
1029 CARD8 major_opcode = *((CARD8 *)data);
1030 CARD8 minor_opcode = *((CARD8 *)data + 1);
1031 XIMID imid = buf_s[0];
1032 XICID icid = buf_s[1];
1034 if ((major_opcode == XIM_RESET_IC_REPLY)
1035 && (minor_opcode == 0)
1036 && (imid == im->private.proto.imid)
1037 && (icid == ic->private.proto.icid))
1039 if ((major_opcode == XIM_ERROR)
1040 && (minor_opcode == 0)
1041 && (buf_s[2] & XIM_IMID_VALID)
1042 && (imid == im->private.proto.imid)
1043 && (buf_s[2] & XIM_ICID_VALID)
1044 && (icid == ic->private.proto.icid))
1052 char * (*retfunc) (Xim im, Xic ic, XPointer buf) )
1055 Xim im = (Xim)ic->core.im;
1056 CARD32 buf32[BUFSIZE/4];
1057 CARD8 *buf = (CARD8 *)buf32;
1058 CARD16 *buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
1060 CARD32 reply32[BUFSIZE/4];
1061 char *reply = (char *)reply32;
1067 if (!IS_IC_CONNECTED(ic))
1068 return (char *)NULL;
1070 buf_s[0] = im->private.proto.imid; /* imid */
1071 buf_s[1] = ic->private.proto.icid; /* icid */
1073 len = sizeof(CARD16) /* sizeof imid */
1074 + sizeof(CARD16); /* sizeof icid */
1076 _XimSetHeader((XPointer)buf, XIM_RESET_IC, 0, &len);
1077 if (!(_XimWrite(im, len, (XPointer)buf)))
1080 ic->private.proto.waitCallback = True;
1082 ret_code = _XimRead(im, &len, (XPointer)reply, buf_size,
1083 _XimResetICCheck, (XPointer)ic);
1084 if (ret_code == XIM_TRUE) {
1086 } else if (ret_code == XIM_OVERFLOW) {
1091 preply = (XPointer)Xmalloc(buf_size);
1092 ret_code = _XimRead(im, &len, preply, buf_size,
1093 _XimResetICCheck, (XPointer)ic);
1094 if (ret_code != XIM_TRUE) {
1096 ic->private.proto.waitCallback = False;
1101 ic->private.proto.waitCallback = False;
1104 ic->private.proto.waitCallback = False;
1105 buf_s = (CARD16 *)((char *)preply + XIM_HEADER_SIZE);
1106 if (*((CARD8 *)preply) == XIM_ERROR) {
1107 _XimProcError(im, 0, (XPointer)&buf_s[3]);
1108 if (reply != preply)
1113 commit = retfunc(im, ic, (XPointer)&buf_s[2]);
1115 if (reply != preply)
1121 _XimCommitedMbString(
1126 CARD16 *buf_s = (CARD16 *)buf;
1131 char *new_commit = NULL;
1136 for (info = ic->private.proto.commit_info; info; info = info->next)
1137 len += info->string_len;
1142 if (!(commit = (char *)Xmalloc(len + 1)))
1143 goto Error_On_Reset;
1146 for (info = ic->private.proto.commit_info; info; info = info->next) {
1147 (void)memcpy(str, info->string, info->string_len);
1148 str += info->string_len;
1150 (void)memcpy(str, (char *)&buf_s[1], buf_s[0]);
1153 new_len = im->methods->ctstombs((XIM)im, commit, len, NULL, 0, &status);
1154 if (status != XLookupNone) {
1155 if (!(new_commit = Xmalloc(new_len + 1))) {
1157 goto Error_On_Reset;
1159 (void)im->methods->ctstombs((XIM)im, commit, len,
1160 new_commit, new_len, NULL);
1161 new_commit[new_len] = '\0';
1166 _XimFreeCommitInfo( ic );
1174 return _XimProtoReset(xic, _XimCommitedMbString);
1178 _XimCommitedWcString(
1183 CARD16 *buf_s = (CARD16 *)buf;
1188 wchar_t *new_commit = (wchar_t *)NULL;
1193 for (info = ic->private.proto.commit_info; info; info = info->next)
1194 len += info->string_len;
1197 return( (wchar_t *)NULL );
1199 if (!(commit = (char *)Xmalloc(len + 1)))
1200 goto Error_On_Reset;
1203 for (info = ic->private.proto.commit_info; info; info = info->next) {
1204 (void)memcpy(str, info->string, info->string_len);
1205 str += info->string_len;
1207 (void)memcpy(str, (char *)&buf_s[1], buf_s[0]);
1210 new_len = im->methods->ctstowcs((XIM)im, commit, len, NULL, 0, &status);
1211 if (status != XLookupNone) {
1213 (wchar_t *)Xmalloc(sizeof(wchar_t) * (new_len + 1)))) {
1215 goto Error_On_Reset;
1217 (void)im->methods->ctstowcs((XIM)im, commit, len,
1218 new_commit, new_len, NULL);
1219 new_commit[new_len] = (wchar_t)'\0';
1224 _XimFreeCommitInfo( ic );
1232 return (wchar_t *) _XimProtoReset(xic,
1233 (char * (*) (Xim, Xic, XPointer)) _XimCommitedWcString);
1237 _XimCommitedUtf8String(
1242 CARD16 *buf_s = (CARD16 *)buf;
1247 char *new_commit = NULL;
1252 for (info = ic->private.proto.commit_info; info; info = info->next)
1253 len += info->string_len;
1258 if (!(commit = (char *)Xmalloc(len + 1)))
1259 goto Error_On_Reset;
1262 for (info = ic->private.proto.commit_info; info; info = info->next) {
1263 (void)memcpy(str, info->string, info->string_len);
1264 str += info->string_len;
1266 (void)memcpy(str, (char *)&buf_s[1], buf_s[0]);
1269 new_len = im->methods->ctstoutf8((XIM)im, commit, len, NULL, 0, &status);
1270 if (status != XLookupNone) {
1271 if (!(new_commit = Xmalloc(new_len + 1))) {
1273 goto Error_On_Reset;
1275 (void)im->methods->ctstoutf8((XIM)im, commit, len,
1276 new_commit, new_len, NULL);
1277 new_commit[new_len] = '\0';
1282 _XimFreeCommitInfo( ic );
1290 return _XimProtoReset(xic, _XimCommitedUtf8String);
1293 Private XICMethodsRec ic_methods = {
1294 _XimProtoDestroyIC, /* destroy */
1295 _XimProtoSetFocus, /* set_focus */
1296 _XimProtoUnsetFocus, /* unset_focus */
1297 _XimProtoSetICValues, /* set_values */
1298 _XimProtoGetICValues, /* get_values */
1299 _XimProtoMbReset, /* mb_reset */
1300 _XimProtoWcReset, /* wc_reset */
1301 _XimProtoUtf8Reset, /* utf8_reset */
1302 _XimProtoMbLookupString, /* mb_lookup_string */
1303 _XimProtoWcLookupString, /* wc_lookup_string */
1304 _XimProtoUtf8LookupString /* utf8_lookup_string */
1310 XIMStyle *input_style)
1314 for (p = arg; p && p->name; p++) {
1315 if (!(strcmp(p->name, XNInputStyle))) {
1316 *input_style = (XIMStyle)p->value;
1323 #ifdef XIM_CONNECTABLE
1325 _XimDelayModeCreateIC(
1328 XIMResourceList res,
1331 Xim im = (Xim)ic->core.im;
1332 XimDefICValues ic_values;
1334 XIMStyle input_style;
1336 bzero((char *)&ic_values, sizeof(XimDefICValues));
1337 _XimGetCurrentICValues(ic, &ic_values);
1338 if (!(_XimGetInputStyle(values, &input_style)))
1341 _XimSetICMode(res, num, input_style);
1343 if (_XimSetICValueData(ic, (XPointer)&ic_values, res, num,
1344 values, XIM_CREATEIC, False)) {
1347 _XimSetCurrentICValues(ic, &ic_values);
1348 if (!_XimSetICDefaults(ic, (XPointer)&ic_values,
1349 XIM_SETICDEFAULTS, res, num)) {
1352 ic_values.filter_events = KeyPressMask;
1353 _XimSetCurrentICValues(ic, &ic_values);
1354 _XimRegisterFilter(ic);
1360 _XimReconnectModeCreateIC(ic)
1363 Xim im = (Xim)ic->core.im;
1365 XIMStyle input_style = ic->core.input_style;
1366 XIMResourceList res;
1369 num = im->core.ic_num_resources;
1370 len = sizeof(XIMResource) * num;
1371 if (!(res = (XIMResourceList)Xmalloc(len)))
1373 (void)memcpy((char *)res, (char *)im->core.ic_resources, len);
1374 ic->private.proto.ic_resources = res;
1375 ic->private.proto.ic_num_resources = num;
1377 _XimSetICMode(res, num, input_style);
1379 ic->core.filter_events = KeyPressMask;
1383 #endif /* XIM_CONNECTABLE */
1392 XimDefICValues ic_values;
1393 XIMResourceList res;
1395 XIMStyle input_style;
1399 CARD32 tmp_buf32[BUFSIZE/4];
1400 char *tmp_buf = (char *)tmp_buf32;
1408 CARD32 reply32[BUFSIZE/4];
1409 char *reply = (char *)reply32;
1413 #ifdef XIM_CONNECTABLE
1414 if (!IS_SERVER_CONNECTED(im) && !IS_CONNECTABLE(im))
1417 if (!IS_SERVER_CONNECTED(im))
1419 #endif /* XIM_CONNECTABLE */
1421 if (!(_XimGetInputStyle(arg, &input_style)))
1424 if ((ic = Xcalloc(1, sizeof(XicRec))) == (Xic)NULL)
1427 ic->methods = &ic_methods;
1428 ic->core.im = (XIM)im;
1429 ic->core.input_style = input_style;
1431 num = im->core.ic_num_resources;
1432 len = sizeof(XIMResource) * num;
1433 if (!(res = (XIMResourceList)Xmalloc(len)))
1434 goto ErrorOnCreatingIC;
1435 (void)memcpy((char *)res, (char *)im->core.ic_resources, len);
1436 ic->private.proto.ic_resources = res;
1437 ic->private.proto.ic_num_resources = num;
1439 #ifdef XIM_CONNECTABLE
1440 if (!_XimSaveICValues(ic, arg))
1443 if (!IS_SERVER_CONNECTED(im)) {
1444 if (!_XimConnectServer(im)) {
1445 if (_XimDelayModeCreateIC(ic, arg, res, num)) {
1448 goto ErrorOnCreatingIC;
1451 #endif /* XIM_CONNECTABLE */
1453 ic->core.filter_events = im->private.proto.forward_event_mask;
1454 ic->private.proto.forward_event_mask =
1455 im->private.proto.forward_event_mask;
1456 ic->private.proto.synchronous_event_mask =
1457 im->private.proto.synchronous_event_mask;
1459 num = im->private.proto.ic_num_inner_resources;
1460 len = sizeof(XIMResource) * num;
1461 if (!(res = (XIMResourceList)Xmalloc(len)))
1462 goto ErrorOnCreatingIC;
1463 (void)memcpy((char *)res,
1464 (char *)im->private.proto.ic_inner_resources, len);
1465 ic->private.proto.ic_inner_resources = res;
1466 ic->private.proto.ic_num_inner_resources = num;
1468 _XimSetICMode(ic->private.proto.ic_resources,
1469 ic->private.proto.ic_num_resources, input_style);
1471 _XimSetICMode(ic->private.proto.ic_inner_resources,
1472 ic->private.proto.ic_num_inner_resources, input_style);
1474 _XimGetCurrentICValues(ic, &ic_values);
1476 buf_size = XIM_HEADER_SIZE + sizeof(CARD16) + sizeof(INT16);
1477 data_len = BUFSIZE - buf_size;
1481 data = &buf[buf_size];
1482 if (_XimEncodeICATTRIBUTE(ic, ic->private.proto.ic_resources,
1483 ic->private.proto.ic_num_resources, arg, &arg_ret, data,
1484 data_len, &ret_len, (XPointer)&ic_values, 0, XIM_CREATEIC)) {
1485 goto ErrorOnCreatingIC;
1489 if (!(arg = arg_ret)) {
1493 buf_size += ret_len;
1494 if (buf == tmp_buf) {
1495 if (!(tmp = (char *)Xmalloc(buf_size + data_len))) {
1496 goto ErrorOnCreatingIC;
1498 memcpy(tmp, buf, buf_size);
1501 if (!(tmp = (char *)Xrealloc(buf, (buf_size + data_len)))) {
1503 goto ErrorOnCreatingIC;
1508 _XimSetCurrentICValues(ic, &ic_values);
1510 if (!(_XimCheckCreateICValues(ic->private.proto.ic_resources,
1511 ic->private.proto.ic_num_resources)))
1512 goto ErrorOnCreatingIC;
1514 _XimRegisterFilter(ic);
1516 buf_s = (CARD16 *)&buf[XIM_HEADER_SIZE];
1517 buf_s[0] = im->private.proto.imid;
1518 buf_s[1] = (INT16)total;
1520 len = (INT16)(sizeof(CARD16) + sizeof(INT16) + total);
1521 _XimSetHeader((XPointer)buf, XIM_CREATE_IC, 0, &len);
1522 if (!(_XimWrite(im, len, (XPointer)buf))) {
1525 goto ErrorOnCreatingIC;
1530 ic->private.proto.waitCallback = True;
1532 ret_code = _XimRead(im, &len, (XPointer)reply, buf_size,
1533 _XimCreateICCheck, 0);
1534 if (ret_code == XIM_TRUE) {
1536 } else if (ret_code == XIM_OVERFLOW) {
1540 buf_size = (int)len;
1541 preply = (XPointer)Xmalloc(buf_size);
1542 ret_code = _XimRead(im, &len, preply, buf_size,
1543 _XimCreateICCheck, 0);
1544 if (ret_code != XIM_TRUE) {
1546 ic->private.proto.waitCallback = False;
1547 goto ErrorOnCreatingIC;
1551 ic->private.proto.waitCallback = False;
1552 goto ErrorOnCreatingIC;
1554 ic->private.proto.waitCallback = False;
1555 buf_s = (CARD16 *)((char *)preply + XIM_HEADER_SIZE);
1556 if (*((CARD8 *)preply) == XIM_ERROR) {
1557 _XimProcError(im, 0, (XPointer)&buf_s[3]);
1558 if (reply != preply)
1560 goto ErrorOnCreatingIC;
1563 ic->private.proto.icid = buf_s[1]; /* icid */
1564 if (reply != preply)
1566 MARK_IC_CONNECTED(ic);
1570 _XimUnregisterFilter(ic);
1571 if (ic->private.proto.ic_resources)
1572 Xfree(ic->private.proto.ic_resources);
1573 if (ic->private.proto.ic_inner_resources)
1574 Xfree(ic->private.proto.ic_inner_resources);