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);