1 /******************************************************************
3 Copyright 1994, 1995 by Sun Microsystems, Inc.
4 Copyright 1993, 1994 by Hewlett-Packard Company
6 Permission to use, copy, modify, distribute, and sell this software
7 and its documentation for any purpose is hereby granted without fee,
8 provided that the above copyright notice appear in all copies and
9 that both that copyright notice and this permission notice appear
10 in supporting documentation, and that the name of Sun Microsystems, Inc.
11 and Hewlett-Packard not be used in advertising or publicity pertaining to
12 distribution of the software without specific, written prior permission.
13 Sun Microsystems, Inc. and Hewlett-Packard make no representations about
14 the suitability of this software for any purpose. It is provided "as is"
15 without express or implied warranty.
17 SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL
18 WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED
19 WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
20 SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY
21 SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
22 RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
23 CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
24 IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
26 Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc.
28 This version tidied and debugged by Steve Underwood May 1999
30 ******************************************************************/
33 #include <sys/param.h>
38 #include <X11/Xproto.h>
48 static void DebugLog(char * msg)
54 extern Xi18nClient *_Xi18nFindClient (Xi18n, CARD16);
56 static void GetProtocolVersion (CARD16 client_major,
61 *server_major = client_major;
62 *server_minor = client_minor;
65 static void ConnectMessageProc (XIMS ims,
66 IMProtocol *call_data,
69 Xi18n i18n_core = ims->protocol;
71 extern XimFrameRec connect_fr[], connect_reply_fr[];
72 register int total_size;
73 CARD16 server_major_version, server_minor_version;
74 unsigned char *reply = NULL;
75 IMConnectStruct *imconnect =
76 (IMConnectStruct*) &call_data->imconnect;
77 CARD16 connect_id = call_data->any.connect_id;
79 fm = FrameMgrInit (connect_fr,
81 _Xi18nNeedSwap (i18n_core, connect_id));
84 FrameMgrGetToken (fm, imconnect->byte_order);
85 FrameMgrGetToken (fm, imconnect->major_version);
86 FrameMgrGetToken (fm, imconnect->minor_version);
90 GetProtocolVersion (imconnect->major_version,
91 imconnect->minor_version,
92 &server_major_version,
93 &server_minor_version);
95 if (i18n_core->address.improto)
97 if (!(i18n_core->address.improto(ims, call_data)))
102 #endif /* PROTOCOL_RICH */
104 fm = FrameMgrInit (connect_reply_fr,
106 _Xi18nNeedSwap (i18n_core, connect_id));
108 total_size = FrameMgrGetTotalSize (fm);
109 reply = (unsigned char *) malloc (total_size);
112 _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0);
116 memset (reply, 0, total_size);
117 FrameMgrSetBuffer (fm, reply);
119 FrameMgrPutToken (fm, server_major_version);
120 FrameMgrPutToken (fm, server_minor_version);
122 _Xi18nSendMessage (ims,
133 static void DisConnectMessageProc (XIMS ims, IMProtocol *call_data)
135 Xi18n i18n_core = ims->protocol;
136 unsigned char *reply = NULL;
137 CARD16 connect_id = call_data->any.connect_id;
140 if (i18n_core->address.improto)
142 if (!(i18n_core->address.improto (ims, call_data)))
147 #endif /* PROTOCOL_RICH */
149 _Xi18nSendMessage (ims,
151 XIM_DISCONNECT_REPLY,
156 i18n_core->methods.disconnect (ims, connect_id);
159 static void OpenMessageProc(XIMS ims, IMProtocol *call_data, unsigned char *p)
161 Xi18n i18n_core = ims->protocol;
163 extern XimFrameRec open_fr[];
164 extern XimFrameRec open_reply_fr[];
165 unsigned char *reply = NULL;
167 register int i, total_size;
168 CARD16 connect_id = call_data->any.connect_id;
171 IMOpenStruct *imopen = (IMOpenStruct *) &call_data->imopen;
173 fm = FrameMgrInit (open_fr,
175 _Xi18nNeedSwap (i18n_core, connect_id));
178 FrameMgrGetToken (fm, str_length);
179 FrameMgrSetSize (fm, str_length);
180 FrameMgrGetToken (fm, name);
181 imopen->lang.length = str_length;
182 imopen->lang.name = malloc (str_length + 1);
183 strncpy (imopen->lang.name, name, str_length);
184 imopen->lang.name[str_length] = (char) 0;
188 if (i18n_core->address.improto)
190 if (!(i18n_core->address.improto(ims, call_data)))
195 if ((i18n_core->address.imvalue_mask & I18N_ON_KEYS)
197 (i18n_core->address.imvalue_mask & I18N_OFF_KEYS))
199 _Xi18nSendTriggerKey (ims, connect_id);
202 XFree (imopen->lang.name);
204 fm = FrameMgrInit (open_reply_fr,
206 _Xi18nNeedSwap (i18n_core, connect_id));
208 /* set iteration count for list of imattr */
209 FrameMgrSetIterCount (fm, i18n_core->address.im_attr_num);
211 /* set length of BARRAY item in ximattr_fr */
212 for (i = 0; i < i18n_core->address.im_attr_num; i++)
214 str_size = strlen (i18n_core->address.xim_attr[i].name);
215 FrameMgrSetSize (fm, str_size);
218 /* set iteration count for list of icattr */
219 FrameMgrSetIterCount (fm, i18n_core->address.ic_attr_num);
220 /* set length of BARRAY item in xicattr_fr */
221 for (i = 0; i < i18n_core->address.ic_attr_num; i++)
223 str_size = strlen (i18n_core->address.xic_attr[i].name);
224 FrameMgrSetSize (fm, str_size);
228 total_size = FrameMgrGetTotalSize (fm);
229 reply = (unsigned char *) malloc (total_size);
232 _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0);
236 memset (reply, 0, total_size);
237 FrameMgrSetBuffer (fm, reply);
239 /* input input-method ID */
240 FrameMgrPutToken (fm, connect_id);
242 for (i = 0; i < i18n_core->address.im_attr_num; i++)
244 str_size = FrameMgrGetSize (fm);
245 FrameMgrPutToken (fm, i18n_core->address.xim_attr[i].attribute_id);
246 FrameMgrPutToken (fm, i18n_core->address.xim_attr[i].type);
247 FrameMgrPutToken (fm, str_size);
248 FrameMgrPutToken (fm, i18n_core->address.xim_attr[i].name);
251 for (i = 0; i < i18n_core->address.ic_attr_num; i++)
253 str_size = FrameMgrGetSize (fm);
254 FrameMgrPutToken (fm, i18n_core->address.xic_attr[i].attribute_id);
255 FrameMgrPutToken (fm, i18n_core->address.xic_attr[i].type);
256 FrameMgrPutToken (fm, str_size);
257 FrameMgrPutToken (fm, i18n_core->address.xic_attr[i].name);
261 _Xi18nSendMessage (ims,
272 static void CloseMessageProc (XIMS ims,
273 IMProtocol *call_data,
276 Xi18n i18n_core = ims->protocol;
278 extern XimFrameRec close_fr[];
279 extern XimFrameRec close_reply_fr[];
280 unsigned char *reply = NULL;
281 register int total_size;
282 CARD16 connect_id = call_data->any.connect_id;
283 CARD16 input_method_ID;
285 fm = FrameMgrInit (close_fr,
287 _Xi18nNeedSwap (i18n_core, connect_id));
289 FrameMgrGetToken (fm, input_method_ID);
293 if (i18n_core->address.improto)
295 if (!(i18n_core->address.improto (ims, call_data)))
301 fm = FrameMgrInit (close_reply_fr,
303 _Xi18nNeedSwap (i18n_core, connect_id));
305 total_size = FrameMgrGetTotalSize (fm);
306 reply = (unsigned char *) malloc (total_size);
309 _Xi18nSendMessage (ims,
318 memset (reply, 0, total_size);
319 FrameMgrSetBuffer (fm, reply);
321 FrameMgrPutToken (fm, input_method_ID);
323 _Xi18nSendMessage (ims,
334 static XIMExt *MakeExtensionList (Xi18n i18n_core,
335 XIMStr *lib_extension,
340 XIMExt *im_ext = (XIMExt *) i18n_core->address.extension;
341 int im_ext_len = i18n_core->address.ext_num;
349 /* query all extensions */
350 *reply_number = im_ext_len;
354 for (i = 0; i < im_ext_len; i++)
356 for (j = 0; j < (int) number; j++)
358 if (strcmp (lib_extension[j].name, im_ext[i].name) == 0)
371 if (!(*reply_number))
374 ext_list = (XIMExt *) malloc (sizeof (XIMExt)*(*reply_number));
378 memset (ext_list, 0, sizeof (XIMExt)*(*reply_number));
382 /* query all extensions */
383 for (i = 0; i < im_ext_len; i++)
385 ext_list[i].major_opcode = im_ext[i].major_opcode;
386 ext_list[i].minor_opcode = im_ext[i].minor_opcode;
387 ext_list[i].length = im_ext[i].length;
388 ext_list[i].name = malloc (im_ext[i].length + 1);
389 strcpy (ext_list[i].name, im_ext[i].name);
397 for (i = 0; i < im_ext_len; i++)
399 for (j = 0; j < (int)number; j++)
401 if (strcmp (lib_extension[j].name, im_ext[i].name) == 0)
403 ext_list[n].major_opcode = im_ext[i].major_opcode;
404 ext_list[n].minor_opcode = im_ext[i].minor_opcode;
405 ext_list[n].length = im_ext[i].length;
406 ext_list[n].name = malloc (im_ext[i].length + 1);
407 strcpy (ext_list[n].name, im_ext[i].name);
421 static void QueryExtensionMessageProc (XIMS ims,
422 IMProtocol *call_data,
425 Xi18n i18n_core = ims->protocol;
428 extern XimFrameRec query_extension_fr[];
429 extern XimFrameRec query_extension_reply_fr[];
430 unsigned char *reply = NULL;
434 register int total_size;
436 int reply_number = 0;
438 IMQueryExtensionStruct *query_ext =
439 (IMQueryExtensionStruct *) &call_data->queryext;
440 CARD16 connect_id = call_data->any.connect_id;
441 CARD16 input_method_ID;
443 fm = FrameMgrInit (query_extension_fr,
445 _Xi18nNeedSwap (i18n_core, connect_id));
447 FrameMgrGetToken (fm, input_method_ID);
448 FrameMgrGetToken (fm, byte_length);
449 query_ext->extension = (XIMStr *) malloc (sizeof (XIMStr)*10);
450 memset (query_ext->extension, 0, sizeof (XIMStr)*10);
452 while (FrameMgrIsIterLoopEnd (fm, &status) == False)
457 FrameMgrGetToken (fm, str_length);
458 FrameMgrSetSize (fm, str_length);
459 query_ext->extension[number].length = str_length;
460 FrameMgrGetToken (fm, name);
461 query_ext->extension[number].name = malloc (str_length + 1);
462 strncpy (query_ext->extension[number].name, name, str_length);
463 query_ext->extension[number].name[str_length] = (char) 0;
467 query_ext->number = number;
470 if (i18n_core->address.improto)
472 if (!(i18n_core->address.improto(ims, call_data)))
477 #endif /* PROTOCOL_RICH */
481 ext_list = MakeExtensionList (i18n_core,
482 query_ext->extension,
486 for (i = 0; i < number; i++)
487 XFree (query_ext->extension[i].name);
489 XFree (query_ext->extension);
491 fm = FrameMgrInit (query_extension_reply_fr,
493 _Xi18nNeedSwap (i18n_core, connect_id));
495 /* set iteration count for list of extensions */
496 FrameMgrSetIterCount (fm, reply_number);
498 /* set length of BARRAY item in ext_fr */
499 for (i = 0; i < reply_number; i++)
501 str_size = strlen (ext_list[i].name);
502 FrameMgrSetSize (fm, str_size);
506 total_size = FrameMgrGetTotalSize (fm);
507 reply = (unsigned char *) malloc (total_size);
510 _Xi18nSendMessage (ims,
519 memset (reply, 0, total_size);
520 FrameMgrSetBuffer (fm, reply);
522 FrameMgrPutToken (fm, input_method_ID);
524 for (i = 0; i < reply_number; i++)
526 str_size = FrameMgrGetSize (fm);
527 FrameMgrPutToken (fm, ext_list[i].major_opcode);
528 FrameMgrPutToken (fm, ext_list[i].minor_opcode);
529 FrameMgrPutToken (fm, str_size);
530 FrameMgrPutToken (fm, ext_list[i].name);
533 _Xi18nSendMessage (ims,
535 XIM_QUERY_EXTENSION_REPLY,
542 for (i = 0; i < reply_number; i++)
543 XFree (ext_list[i].name);
545 XFree ((char *) ext_list);
548 static void SyncReplyMessageProc (XIMS ims,
549 IMProtocol *call_data,
552 Xi18n i18n_core = ims->protocol;
554 extern XimFrameRec sync_reply_fr[];
555 CARD16 connect_id = call_data->any.connect_id;
557 CARD16 input_method_ID;
558 CARD16 input_context_ID;
560 client = (Xi18nClient *)_Xi18nFindClient (i18n_core, connect_id);
561 fm = FrameMgrInit (sync_reply_fr,
563 _Xi18nNeedSwap (i18n_core, connect_id));
564 FrameMgrGetToken (fm, input_method_ID);
565 FrameMgrGetToken (fm, input_context_ID);
568 client->sync = False;
570 if (ims->sync == True) {
572 if (i18n_core->address.improto) {
573 call_data->sync_xlib.major_code = XIM_SYNC_REPLY;
574 call_data->sync_xlib.minor_code = 0;
575 call_data->sync_xlib.connect_id = input_method_ID;
576 call_data->sync_xlib.icid = input_context_ID;
577 i18n_core->address.improto(ims, call_data);
582 static void GetIMValueFromName (Xi18n i18n_core,
590 if (strcmp (name, XNQueryInputStyle) == 0)
592 XIMStyles *styles = (XIMStyles *) &i18n_core->address.input_styles;
594 *length = sizeof (CARD16)*2; /* count_styles, unused */
595 *length += styles->count_styles*sizeof (CARD32);
600 extern XimFrameRec input_styles_fr[];
601 unsigned char *data = NULL;
604 fm = FrameMgrInit (input_styles_fr,
606 _Xi18nNeedSwap (i18n_core, connect_id));
608 /* set iteration count for list of input_style */
609 FrameMgrSetIterCount (fm, styles->count_styles);
611 total_size = FrameMgrGetTotalSize (fm);
612 data = (unsigned char *) malloc (total_size);
616 memset (data, 0, total_size);
617 FrameMgrSetBuffer (fm, data);
619 FrameMgrPutToken (fm, styles->count_styles);
620 for (i = 0; i < (int) styles->count_styles; i++)
621 FrameMgrPutToken (fm, styles->supported_styles[i]);
623 memmove (buf, data, total_size);
634 else if (strcmp (name, XNQueryIMValuesList) == 0) {
638 static XIMAttribute *MakeIMAttributeList (Xi18n i18n_core,
644 XIMAttribute *attrib_list;
646 XIMAttr *attr = i18n_core->address.xim_attr;
647 int list_len = i18n_core->address.im_attr_num;
655 for (i = 0; i < *number; i++)
657 for (j = 0; j < list_len; j++)
659 if (attr[j].attribute_id == list[i])
669 attrib_list = (XIMAttribute *) malloc (sizeof (XIMAttribute)*list_num);
673 memset (attrib_list, 0, sizeof (XIMAttribute)*list_num);
674 number_ret = list_num;
676 for (i = 0; i < *number; i++)
678 for (j = 0; j < list_len; j++)
680 if (attr[j].attribute_id == list[i])
682 attrib_list[list_num].attribute_id = attr[j].attribute_id;
683 attrib_list[list_num].name_length = attr[j].length;
684 attrib_list[list_num].name = attr[j].name;
685 attrib_list[list_num].type = attr[j].type;
686 GetIMValueFromName (i18n_core,
691 attrib_list[list_num].value_length = value_length;
692 attrib_list[list_num].value = (void *) malloc (value_length);
693 memset(attrib_list[list_num].value, 0, value_length);
694 GetIMValueFromName (i18n_core,
696 attrib_list[list_num].value,
699 *length += sizeof (CARD16)*2;
700 *length += value_length;
701 *length += IMPAD (value_length);
710 *number = number_ret;
714 static void GetIMValuesMessageProc (XIMS ims,
715 IMProtocol *call_data,
718 Xi18n i18n_core = ims->protocol;
721 extern XimFrameRec get_im_values_fr[];
722 extern XimFrameRec get_im_values_reply_fr[];
724 int list_len, total_size;
725 unsigned char *reply = NULL;
730 CARD16 *im_attrID_list;
733 XIMAttribute *im_attribute_list;
734 IMGetIMValuesStruct *getim = (IMGetIMValuesStruct *)&call_data->getim;
735 CARD16 connect_id = call_data->any.connect_id;
736 CARD16 input_method_ID;
738 /* create FrameMgr */
739 fm = FrameMgrInit (get_im_values_fr,
741 _Xi18nNeedSwap (i18n_core, connect_id));
743 FrameMgrGetToken (fm, input_method_ID);
744 FrameMgrGetToken (fm, byte_length);
745 im_attrID_list = (CARD16 *) malloc (sizeof (CARD16)*20);
746 memset (im_attrID_list, 0, sizeof (CARD16)*20);
747 name_list = (char **)malloc(sizeof(char *) * 20);
748 memset(name_list, 0, sizeof(char *) * 20);
750 while (FrameMgrIsIterLoopEnd (fm, &status) == False)
752 FrameMgrGetToken (fm, im_attrID_list[number]);
758 for (i = 0; i < number; i++) {
759 for (j = 0; j < i18n_core->address.im_attr_num; j++) {
760 if (i18n_core->address.xim_attr[j].attribute_id ==
762 name_list[name_number++] =
763 i18n_core->address.xim_attr[j].name;
768 getim->number = name_number;
769 getim->im_attr_list = name_list;
774 if (i18n_core->address.improto) {
775 if (!(i18n_core->address.improto (ims, call_data)))
778 #endif /* PROTOCOL_RICH */
780 im_attribute_list = MakeIMAttributeList (i18n_core,
786 XFree (im_attrID_list);
789 fm = FrameMgrInit (get_im_values_reply_fr,
791 _Xi18nNeedSwap (i18n_core, connect_id));
795 /* set iteration count for list of im_attribute */
796 FrameMgrSetIterCount (fm, iter_count);
798 /* set length of BARRAY item in ximattribute_fr */
799 for (i = 0; i < iter_count; i++)
800 FrameMgrSetSize (fm, im_attribute_list[i].value_length);
803 total_size = FrameMgrGetTotalSize (fm);
804 reply = (unsigned char *) malloc (total_size);
807 _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0);
811 memset (reply, 0, total_size);
812 FrameMgrSetBuffer (fm, reply);
814 FrameMgrPutToken (fm, input_method_ID);
816 for (i = 0; i < iter_count; i++)
818 FrameMgrPutToken (fm, im_attribute_list[i].attribute_id);
819 FrameMgrPutToken (fm, im_attribute_list[i].value_length);
820 FrameMgrPutToken (fm, im_attribute_list[i].value);
823 _Xi18nSendMessage (ims,
825 XIM_GET_IM_VALUES_REPLY,
832 for (i = 0; i < iter_count; i++)
833 XFree(im_attribute_list[i].value);
834 XFree (im_attribute_list);
837 static void CreateICMessageProc (XIMS ims,
838 IMProtocol *call_data,
841 _Xi18nChangeIC (ims, call_data, p, True);
844 static void SetICValuesMessageProc (XIMS ims,
845 IMProtocol *call_data,
848 _Xi18nChangeIC (ims, call_data, p, False);
851 static void GetICValuesMessageProc (XIMS ims,
852 IMProtocol *call_data,
855 _Xi18nGetIC (ims, call_data, p);
858 static void SetICFocusMessageProc (XIMS ims,
859 IMProtocol *call_data,
862 Xi18n i18n_core = ims->protocol;
864 extern XimFrameRec set_ic_focus_fr[];
865 IMChangeFocusStruct *setfocus;
866 CARD16 connect_id = call_data->any.connect_id;
867 CARD16 input_method_ID;
869 setfocus = (IMChangeFocusStruct *) &call_data->changefocus;
871 fm = FrameMgrInit (set_ic_focus_fr,
873 _Xi18nNeedSwap (i18n_core, connect_id));
876 FrameMgrGetToken (fm, input_method_ID);
877 FrameMgrGetToken (fm, setfocus->icid);
881 if (i18n_core->address.improto)
883 if (!(i18n_core->address.improto (ims, call_data)))
890 static void UnsetICFocusMessageProc (XIMS ims,
891 IMProtocol *call_data,
894 Xi18n i18n_core = ims->protocol;
896 extern XimFrameRec unset_ic_focus_fr[];
897 IMChangeFocusStruct *unsetfocus;
898 CARD16 connect_id = call_data->any.connect_id;
899 CARD16 input_method_ID;
901 unsetfocus = (IMChangeFocusStruct *) &call_data->changefocus;
903 fm = FrameMgrInit (unset_ic_focus_fr,
905 _Xi18nNeedSwap (i18n_core, connect_id));
908 FrameMgrGetToken (fm, input_method_ID);
909 FrameMgrGetToken (fm, unsetfocus->icid);
913 if (i18n_core->address.improto)
915 if (!(i18n_core->address.improto (ims, call_data)))
922 static void DestroyICMessageProc (XIMS ims,
923 IMProtocol *call_data,
926 Xi18n i18n_core = ims->protocol;
928 extern XimFrameRec destroy_ic_fr[];
929 extern XimFrameRec destroy_ic_reply_fr[];
930 register int total_size;
931 unsigned char *reply = NULL;
932 IMDestroyICStruct *destroy =
933 (IMDestroyICStruct *) &call_data->destroyic;
934 CARD16 connect_id = call_data->any.connect_id;
935 CARD16 input_method_ID;
937 fm = FrameMgrInit (destroy_ic_fr,
939 _Xi18nNeedSwap (i18n_core, connect_id));
942 FrameMgrGetToken (fm, input_method_ID);
943 FrameMgrGetToken (fm, destroy->icid);
947 if (i18n_core->address.improto)
949 if (!(i18n_core->address.improto (ims, call_data)))
955 fm = FrameMgrInit (destroy_ic_reply_fr,
957 _Xi18nNeedSwap (i18n_core, connect_id));
959 total_size = FrameMgrGetTotalSize (fm);
960 reply = (unsigned char *) malloc (total_size);
963 _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0);
967 memset (reply, 0, total_size);
968 FrameMgrSetBuffer (fm, reply);
970 FrameMgrPutToken (fm, input_method_ID);
971 FrameMgrPutToken (fm, destroy->icid);
973 _Xi18nSendMessage (ims,
975 XIM_DESTROY_IC_REPLY,
983 static void ResetICMessageProc (XIMS ims,
984 IMProtocol *call_data,
987 Xi18n i18n_core = ims->protocol;
989 extern XimFrameRec reset_ic_fr[];
990 extern XimFrameRec reset_ic_reply_fr[];
991 register int total_size;
992 unsigned char *reply = NULL;
993 IMResetICStruct *resetic =
994 (IMResetICStruct *) &call_data->resetic;
995 CARD16 connect_id = call_data->any.connect_id;
996 CARD16 input_method_ID;
998 fm = FrameMgrInit (reset_ic_fr,
1000 _Xi18nNeedSwap (i18n_core, connect_id));
1003 FrameMgrGetToken (fm, input_method_ID);
1004 FrameMgrGetToken (fm, resetic->icid);
1008 if (i18n_core->address.improto)
1010 if (!(i18n_core->address.improto(ims, call_data)))
1016 /* create FrameMgr */
1017 fm = FrameMgrInit (reset_ic_reply_fr,
1019 _Xi18nNeedSwap (i18n_core, connect_id));
1021 /* set length of STRING8 */
1022 FrameMgrSetSize (fm, resetic->length);
1024 total_size = FrameMgrGetTotalSize (fm);
1025 reply = (unsigned char *) malloc (total_size);
1028 _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0);
1032 memset (reply, 0, total_size);
1033 FrameMgrSetBuffer (fm, reply);
1035 FrameMgrPutToken (fm, input_method_ID);
1036 FrameMgrPutToken (fm, resetic->icid);
1037 FrameMgrPutToken(fm, resetic->length);
1038 FrameMgrPutToken (fm, resetic->commit_string);
1040 _Xi18nSendMessage (ims,
1050 static int WireEventToEvent (Xi18n i18n_core,
1057 extern XimFrameRec wire_keyevent_fr[];
1063 /* create FrameMgr */
1064 fm = FrameMgrInit(wire_keyevent_fr, (char *)(&(event->u)), byte_swap);
1067 /* get & set type */
1068 FrameMgrGetToken(fm, b);
1069 ev->type = (unsigned int)b;
1071 FrameMgrGetToken(fm, b);
1072 /* get & set serial */
1073 FrameMgrGetToken(fm, c16);
1074 ev->xany.serial = (unsigned long)c16;
1075 ev->xany.serial |= serial << 16;
1076 ev->xany.send_event = False;
1077 ev->xany.display = i18n_core->address.dpy;
1079 /* Remove SendEvent flag from event type to emulate KeyPress/Release */
1086 XKeyEvent *kev = (XKeyEvent*)ev;
1088 /* set keycode (detail) */
1089 kev->keycode = (unsigned int)b;
1091 /* get & set values */
1092 FrameMgrGetToken(fm, c32); kev->time = (Time)c32;
1093 FrameMgrGetToken(fm, c32); kev->root = (Window)c32;
1094 FrameMgrGetToken(fm, c32); kev->window = (Window)c32;
1095 FrameMgrGetToken(fm, c32); kev->subwindow = (Window)c32;
1096 FrameMgrGetToken(fm, c16); kev->x_root = (int)c16;
1097 FrameMgrGetToken(fm, c16); kev->y_root = (int)c16;
1098 FrameMgrGetToken(fm, c16); kev->x = (int)c16;
1099 FrameMgrGetToken(fm, c16); kev->y = (int)c16;
1100 FrameMgrGetToken(fm, c16); kev->state = (unsigned int)c16;
1101 FrameMgrGetToken(fm, b); kev->same_screen = (Bool)b;
1113 static void ForwardEventMessageProc (XIMS ims,
1114 IMProtocol *call_data,
1117 Xi18n i18n_core = ims->protocol;
1119 extern XimFrameRec forward_event_fr[];
1121 IMForwardEventStruct *forward =
1122 (IMForwardEventStruct*) &call_data->forwardevent;
1123 CARD16 connect_id = call_data->any.connect_id;
1124 CARD16 input_method_ID;
1126 fm = FrameMgrInit (forward_event_fr,
1128 _Xi18nNeedSwap (i18n_core, connect_id));
1130 FrameMgrGetToken (fm, input_method_ID);
1131 FrameMgrGetToken (fm, forward->icid);
1132 FrameMgrGetToken (fm, forward->sync_bit);
1133 FrameMgrGetToken (fm, forward->serial_number);
1134 p += sizeof (CARD16)*4;
1135 memmove (&wire_event, p, sizeof (xEvent));
1139 if (WireEventToEvent (i18n_core,
1141 forward->serial_number,
1143 _Xi18nNeedSwap (i18n_core, connect_id)) == True)
1145 if (i18n_core->address.improto)
1147 if (!(i18n_core->address.improto(ims, call_data)))
1156 static void ExtForwardKeyEventMessageProc (XIMS ims,
1157 IMProtocol *call_data,
1160 Xi18n i18n_core = ims->protocol;
1162 extern XimFrameRec ext_forward_keyevent_fr[];
1163 CARD8 type, keycode;
1165 CARD32 ev_time, window;
1166 IMForwardEventStruct *forward =
1167 (IMForwardEventStruct *) &call_data->forwardevent;
1168 XEvent *ev = (XEvent *) &forward->event;
1169 CARD16 connect_id = call_data->any.connect_id;
1170 CARD16 input_method_ID;
1172 fm = FrameMgrInit (ext_forward_keyevent_fr,
1174 _Xi18nNeedSwap (i18n_core, connect_id));
1176 FrameMgrGetToken (fm, input_method_ID);
1177 FrameMgrGetToken (fm, forward->icid);
1178 FrameMgrGetToken (fm, forward->sync_bit);
1179 FrameMgrGetToken (fm, forward->serial_number);
1180 FrameMgrGetToken (fm, type);
1181 FrameMgrGetToken (fm, keycode);
1182 FrameMgrGetToken (fm, state);
1183 FrameMgrGetToken (fm, ev_time);
1184 FrameMgrGetToken (fm, window);
1188 if (type != KeyPress)
1190 _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0);
1195 /* make a faked keypress event */
1196 ev->type = (int)type;
1197 ev->xany.send_event = True;
1198 ev->xany.display = i18n_core->address.dpy;
1199 ev->xany.serial = (unsigned long) forward->serial_number;
1200 ((XKeyEvent *) ev)->keycode = (unsigned int) keycode;
1201 ((XKeyEvent *) ev)->state = (unsigned int) state;
1202 ((XKeyEvent *) ev)->time = (Time) ev_time;
1203 ((XKeyEvent *) ev)->window = (Window) window;
1204 ((XKeyEvent *) ev)->root = DefaultRootWindow (ev->xany.display);
1205 ((XKeyEvent *) ev)->x = 0;
1206 ((XKeyEvent *) ev)->y = 0;
1207 ((XKeyEvent *) ev)->x_root = 0;
1208 ((XKeyEvent *) ev)->y_root = 0;
1210 if (i18n_core->address.improto)
1212 if (!(i18n_core->address.improto (ims, call_data)))
1219 static void ExtMoveMessageProc (XIMS ims,
1220 IMProtocol *call_data,
1223 Xi18n i18n_core = ims->protocol;
1225 extern XimFrameRec ext_move_fr[];
1226 IMMoveStruct *extmove =
1227 (IMMoveStruct*) & call_data->extmove;
1228 CARD16 connect_id = call_data->any.connect_id;
1229 CARD16 input_method_ID;
1231 fm = FrameMgrInit (ext_move_fr,
1233 _Xi18nNeedSwap (i18n_core, connect_id));
1235 FrameMgrGetToken (fm, input_method_ID);
1236 FrameMgrGetToken (fm, extmove->icid);
1237 FrameMgrGetToken (fm, extmove->x);
1238 FrameMgrGetToken (fm, extmove->y);
1242 if (i18n_core->address.improto)
1244 if (!(i18n_core->address.improto (ims, call_data)))
1251 static void ExtensionMessageProc (XIMS ims,
1252 IMProtocol *call_data,
1255 switch (call_data->any.minor_code)
1257 case XIM_EXT_FORWARD_KEYEVENT:
1258 ExtForwardKeyEventMessageProc (ims, call_data, p);
1262 ExtMoveMessageProc (ims, call_data, p);
1268 static void TriggerNotifyMessageProc (XIMS ims,
1269 IMProtocol *call_data,
1272 Xi18n i18n_core = ims->protocol;
1274 extern XimFrameRec trigger_notify_fr[], trigger_notify_reply_fr[];
1275 register int total_size;
1276 unsigned char *reply = NULL;
1277 IMTriggerNotifyStruct *trigger =
1278 (IMTriggerNotifyStruct *) &call_data->triggernotify;
1279 CARD16 connect_id = call_data->any.connect_id;
1280 CARD16 input_method_ID;
1283 fm = FrameMgrInit (trigger_notify_fr,
1285 _Xi18nNeedSwap (i18n_core, connect_id));
1287 FrameMgrGetToken (fm, input_method_ID);
1288 FrameMgrGetToken (fm, trigger->icid);
1289 FrameMgrGetToken (fm, trigger->flag);
1290 FrameMgrGetToken (fm, trigger->key_index);
1291 FrameMgrGetToken (fm, trigger->event_mask);
1293 In order to support Front End Method, this event_mask must be saved
1294 per clients so that it should be restored by an XIM_EXT_SET_EVENT_MASK
1295 call when preediting mode is reset to off.
1298 flag = trigger->flag;
1302 fm = FrameMgrInit (trigger_notify_reply_fr,
1304 _Xi18nNeedSwap (i18n_core, connect_id));
1306 total_size = FrameMgrGetTotalSize (fm);
1307 reply = (unsigned char *) malloc (total_size);
1310 _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0);
1314 memset (reply, 0, total_size);
1315 FrameMgrSetBuffer (fm, reply);
1317 FrameMgrPutToken (fm, input_method_ID);
1318 FrameMgrPutToken (fm, trigger->icid);
1321 XIM_TRIGGER_NOTIFY_REPLY should be sent before XIM_SET_EVENT_MASK
1322 in case of XIM_TRIGGER_NOTIFY(flag == ON), while it should be
1323 sent after XIM_SET_EVENT_MASK in case of
1324 XIM_TRIGGER_NOTIFY(flag == OFF).
1329 _Xi18nSendMessage (ims,
1331 XIM_TRIGGER_NOTIFY_REPLY,
1335 IMPreeditStart (ims, (XPointer)call_data);
1338 if (i18n_core->address.improto)
1340 if (!(i18n_core->address.improto(ims, call_data)))
1349 IMPreeditEnd (ims, (XPointer) call_data);
1350 _Xi18nSendMessage (ims,
1352 XIM_TRIGGER_NOTIFY_REPLY,
1362 static INT16 ChooseEncoding (Xi18n i18n_core,
1363 IMEncodingNegotiationStruct *enc_nego)
1365 Xi18nAddressRec *address = (Xi18nAddressRec *) & i18n_core->address;
1370 p = (XIMEncodings *) &address->encoding_list;
1371 for (i = 0; i < (int) p->count_encodings; i++)
1373 for (j = 0; j < (int) enc_nego->encoding_number; j++)
1375 if (strcmp (p->supported_encodings[i],
1376 enc_nego->encoding[j].name) == 0)
1387 return (INT16) enc_index;
1389 return (INT16) XIM_Default_Encoding_IDX;
1393 static void EncodingNegotiatonMessageProc (XIMS ims,
1394 IMProtocol *call_data,
1397 Xi18n i18n_core = ims->protocol;
1401 extern XimFrameRec encoding_negotiation_fr[];
1402 extern XimFrameRec encoding_negotiation_reply_fr[];
1403 register int i, total_size;
1404 unsigned char *reply = NULL;
1405 IMEncodingNegotiationStruct *enc_nego =
1406 (IMEncodingNegotiationStruct *) &call_data->encodingnego;
1407 CARD16 connect_id = call_data->any.connect_id;
1408 CARD16 input_method_ID;
1410 fm = FrameMgrInit (encoding_negotiation_fr,
1412 _Xi18nNeedSwap (i18n_core, connect_id));
1414 FrameMgrGetToken (fm, input_method_ID);
1416 /* get ENCODING STR field */
1417 FrameMgrGetToken (fm, byte_length);
1418 if (byte_length > 0)
1420 enc_nego->encoding = (XIMStr *) malloc (sizeof (XIMStr)*10);
1421 memset (enc_nego->encoding, 0, sizeof (XIMStr)*10);
1423 while (FrameMgrIsIterLoopEnd (fm, &status) == False)
1428 FrameMgrGetToken (fm, str_length);
1429 FrameMgrSetSize (fm, str_length);
1430 enc_nego->encoding[i].length = str_length;
1431 FrameMgrGetToken (fm, name);
1432 enc_nego->encoding[i].name = malloc (str_length + 1);
1433 strncpy (enc_nego->encoding[i].name, name, str_length);
1434 enc_nego->encoding[i].name[str_length] = '\0';
1438 enc_nego->encoding_number = i;
1441 /* get ENCODING INFO field */
1442 FrameMgrGetToken (fm, byte_length);
1443 if (byte_length > 0)
1445 enc_nego->encodinginfo = (XIMStr *) malloc (sizeof (XIMStr)*10);
1446 memset (enc_nego->encoding, 0, sizeof (XIMStr)*10);
1448 while (FrameMgrIsIterLoopEnd (fm, &status) == False)
1453 FrameMgrGetToken (fm, str_length);
1454 FrameMgrSetSize (fm, str_length);
1455 enc_nego->encodinginfo[i].length = str_length;
1456 FrameMgrGetToken (fm, name);
1457 enc_nego->encodinginfo[i].name = malloc (str_length + 1);
1458 strncpy (enc_nego->encodinginfo[i].name, name, str_length);
1459 enc_nego->encodinginfo[i].name[str_length] = '\0';
1463 enc_nego->encoding_info_number = i;
1467 enc_nego->enc_index = ChooseEncoding (i18n_core, enc_nego);
1468 enc_nego->category = 0;
1470 #ifdef PROTOCOL_RICH
1471 if (i18n_core->address.improto)
1473 if (!(i18n_core->address.improto(ims, call_data)))
1478 #endif /* PROTOCOL_RICH */
1482 fm = FrameMgrInit (encoding_negotiation_reply_fr,
1484 _Xi18nNeedSwap (i18n_core, connect_id));
1486 total_size = FrameMgrGetTotalSize (fm);
1487 reply = (unsigned char *) malloc (total_size);
1490 _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0);
1494 memset (reply, 0, total_size);
1495 FrameMgrSetBuffer (fm, reply);
1497 FrameMgrPutToken (fm, input_method_ID);
1498 FrameMgrPutToken (fm, enc_nego->category);
1499 FrameMgrPutToken (fm, enc_nego->enc_index);
1501 _Xi18nSendMessage (ims,
1503 XIM_ENCODING_NEGOTIATION_REPLY,
1509 /* free data for encoding list */
1510 if (enc_nego->encoding)
1512 for (i = 0; i < (int) enc_nego->encoding_number; i++)
1513 XFree (enc_nego->encoding[i].name);
1515 XFree (enc_nego->encoding);
1518 if (enc_nego->encodinginfo)
1520 for (i = 0; i < (int) enc_nego->encoding_info_number; i++)
1521 XFree (enc_nego->encodinginfo[i].name);
1523 XFree (enc_nego->encodinginfo);
1529 void PreeditStartReplyMessageProc (XIMS ims,
1530 IMProtocol *call_data,
1533 Xi18n i18n_core = ims->protocol;
1535 extern XimFrameRec preedit_start_reply_fr[];
1536 IMPreeditCBStruct *preedit_CB =
1537 (IMPreeditCBStruct *) &call_data->preedit_callback;
1538 CARD16 connect_id = call_data->any.connect_id;
1539 CARD16 input_method_ID;
1541 fm = FrameMgrInit (preedit_start_reply_fr,
1543 _Xi18nNeedSwap (i18n_core, connect_id));
1545 FrameMgrGetToken (fm, input_method_ID);
1546 FrameMgrGetToken (fm, preedit_CB->icid);
1547 FrameMgrGetToken (fm, preedit_CB->todo.return_value);
1551 if (i18n_core->address.improto)
1553 if (!(i18n_core->address.improto (ims, call_data)))
1560 void PreeditCaretReplyMessageProc (XIMS ims,
1561 IMProtocol *call_data,
1564 Xi18n i18n_core = ims->protocol;
1566 extern XimFrameRec preedit_caret_reply_fr[];
1567 IMPreeditCBStruct *preedit_CB =
1568 (IMPreeditCBStruct *) &call_data->preedit_callback;
1569 XIMPreeditCaretCallbackStruct *caret =
1570 (XIMPreeditCaretCallbackStruct *) & preedit_CB->todo.caret;
1571 CARD16 connect_id = call_data->any.connect_id;
1572 CARD16 input_method_ID;
1574 fm = FrameMgrInit (preedit_caret_reply_fr,
1576 _Xi18nNeedSwap (i18n_core, connect_id));
1578 FrameMgrGetToken (fm, input_method_ID);
1579 FrameMgrGetToken (fm, preedit_CB->icid);
1580 FrameMgrGetToken (fm, caret->position);
1584 if (i18n_core->address.improto)
1586 if (!(i18n_core->address.improto(ims, call_data)))
1593 void StrConvReplyMessageProc (XIMS ims,
1594 IMProtocol *call_data,
1600 static void AddQueue (Xi18nClient *client, unsigned char *p)
1605 if ((new = (XIMPending *) malloc (sizeof (XIMPending))) == NULL)
1609 new->next = (XIMPending *) NULL;
1610 if (!client->pending)
1612 client->pending = new;
1616 for (last = client->pending; last->next; last = last->next)
1625 static void ProcessQueue (XIMS ims, CARD16 connect_id)
1627 Xi18n i18n_core = ims->protocol;
1628 Xi18nClient *client = (Xi18nClient *) _Xi18nFindClient (i18n_core,
1631 while (client->sync == False && client->pending)
1633 XimProtoHdr *hdr = (XimProtoHdr *) client->pending->p;
1634 unsigned char *p1 = (unsigned char *) (hdr + 1);
1635 IMProtocol call_data;
1637 call_data.major_code = hdr->major_opcode;
1638 call_data.any.minor_code = hdr->minor_opcode;
1639 call_data.any.connect_id = connect_id;
1641 switch (hdr->major_opcode)
1643 case XIM_FORWARD_EVENT:
1644 ForwardEventMessageProc(ims, &call_data, p1);
1650 XIMPending *old = client->pending;
1652 client->pending = old->next;
1661 void _Xi18nMessageHandler (XIMS ims,
1666 XimProtoHdr *hdr = (XimProtoHdr *)p;
1667 unsigned char *p1 = (unsigned char *)(hdr + 1);
1668 IMProtocol call_data;
1669 Xi18n i18n_core = ims->protocol;
1670 Xi18nClient *client;
1672 client = (Xi18nClient *) _Xi18nFindClient (i18n_core, connect_id);
1673 if (hdr == (XimProtoHdr *) NULL)
1677 memset (&call_data, 0, sizeof(IMProtocol));
1679 call_data.major_code = hdr->major_opcode;
1680 call_data.any.minor_code = hdr->minor_opcode;
1681 call_data.any.connect_id = connect_id;
1683 switch (call_data.major_code)
1687 DebugLog("-- XIM_CONNECT\n");
1689 ConnectMessageProc (ims, &call_data, p1);
1692 case XIM_DISCONNECT:
1694 DebugLog("-- XIM_DISCONNECT\n");
1696 DisConnectMessageProc (ims, &call_data);
1701 DebugLog("-- XIM_OPEN\n");
1703 OpenMessageProc (ims, &call_data, p1);
1708 DebugLog("-- XIM_CLOSE\n");
1710 CloseMessageProc (ims, &call_data, p1);
1713 case XIM_QUERY_EXTENSION:
1715 DebugLog("-- XIM_QUERY_EXTENSION\n");
1717 QueryExtensionMessageProc (ims, &call_data, p1);
1720 case XIM_GET_IM_VALUES:
1722 DebugLog("-- XIM_GET_IM_VALUES\n");
1724 GetIMValuesMessageProc (ims, &call_data, p1);
1729 DebugLog("-- XIM_CREATE_IC\n");
1731 CreateICMessageProc (ims, &call_data, p1);
1734 case XIM_SET_IC_VALUES:
1736 DebugLog("-- XIM_SET_IC_VALUES\n");
1738 SetICValuesMessageProc (ims, &call_data, p1);
1741 case XIM_GET_IC_VALUES:
1743 DebugLog("-- XIM_GET_IC_VALUES\n");
1745 GetICValuesMessageProc (ims, &call_data, p1);
1748 case XIM_SET_IC_FOCUS:
1750 DebugLog("-- XIM_SET_IC_FOCUS\n");
1752 SetICFocusMessageProc (ims, &call_data, p1);
1755 case XIM_UNSET_IC_FOCUS:
1757 DebugLog("-- XIM_UNSET_IC_FOCUS\n");
1759 UnsetICFocusMessageProc (ims, &call_data, p1);
1762 case XIM_DESTROY_IC:
1764 DebugLog("-- XIM_DESTROY_IC\n");
1766 DestroyICMessageProc (ims, &call_data, p1);
1771 DebugLog("-- XIM_RESET_IC\n");
1773 ResetICMessageProc (ims, &call_data, p1);
1776 case XIM_FORWARD_EVENT:
1778 DebugLog("-- XIM_FORWARD_EVENT\n");
1780 if (client->sync == True)
1782 AddQueue (client, p);
1787 ForwardEventMessageProc (ims, &call_data, p1);
1793 DebugLog("-- XIM_EXTENSION\n");
1795 ExtensionMessageProc (ims, &call_data, p1);
1800 DebugLog("-- XIM_SYNC\n");
1804 case XIM_SYNC_REPLY:
1806 DebugLog("-- XIM_SYNC_REPLY\n");
1808 SyncReplyMessageProc (ims, &call_data, p1);
1809 ProcessQueue (ims, connect_id);
1812 case XIM_TRIGGER_NOTIFY:
1814 DebugLog("-- XIM_TRIGGER_NOTIFY\n");
1816 TriggerNotifyMessageProc (ims, &call_data, p1);
1819 case XIM_ENCODING_NEGOTIATION:
1821 DebugLog("-- XIM_ENCODING_NEGOTIATION\n");
1823 EncodingNegotiatonMessageProc (ims, &call_data, p1);
1826 case XIM_PREEDIT_START_REPLY:
1828 DebugLog("-- XIM_PREEDIT_START_REPLY\n");
1830 PreeditStartReplyMessageProc (ims, &call_data, p1);
1833 case XIM_PREEDIT_CARET_REPLY:
1835 DebugLog("-- XIM_PREEDIT_CARET_REPLY\n");
1837 PreeditCaretReplyMessageProc (ims, &call_data, p1);
1840 case XIM_STR_CONVERSION_REPLY:
1842 DebugLog("-- XIM_STR_CONVERSION_REPLY\n");
1844 StrConvReplyMessageProc (ims, &call_data, p1);