|
楼主 |
发表于 2004-5-25 10:09:36
|
显示全部楼层
是的,我依照你的IC结构写的,ICL的L代表Locale。
IC.H中
[PHP]
typedef struct _ICL {
CARD16 connect_id;
char *locale;
unsigned int created;
struct _ICL *next;
}ICL;
[/PHP]
IC.C中
[PHP]
static ICL *icl_list=(ICL*)NULL;
static ICL *freel_list =(ICL *)NULL;
void NewICL(IMOpenStruct *call_data)
/*在open hangler中调用,因为IMOpenStruct中给出了本窗口的locale*/
{
CARD16 cnid=call_data->connect_id;
ICL *rec;
if (freel_list != NULL) {
rec = freel_list;
freel_list = freel_list->next;
}
else {
rec=(ICL *) malloc (sizeof (ICL));
}
memset (rec, 0, sizeof(ICL));
rec->connect_id = cnid;
rec->next=icl_list;
rec->locale=(char *)malloc(sizeof(char)*(1+call_data->lang.length));
strcpy(rec->locale, call_data->lang.name);
icl_list=rec;
//return rec;
}
char *GetIcLocale(CARD16 connect_id)
/*在SendHZtoClient中调用,此时需要知道窗口的locale*/
{
ICL *rec;
for(rec=icl_list; rec != NULL; rec = rec->next) {
if(rec->connect_id==connect_id) {
return rec->locale;
}
}
return "C";
}
static void DeleteICL (CARD16 icid)
{
ICL *rec, *last;
last = NULL;
for(rec=icl_list; rec != NULL; last = rec, rec = rec->next) {
if (rec->connect_id==icid) {
rec->created--;
}
if (!rec->created) {
//printf("truely deleted\n");
if(last != NULL)
last->next = rec->next;
else
icl_list=rec->next;
rec->next=freel_list;
freel_list=rec;
if(rec->locale)
free(rec->locale);
return;
}
}
}
void CreateIC (IMChangeICStruct * call_data)
//我应该写个CreateICL的,偷懒了一把。
{
IC *rec;
ICL *recl;
//printf("createic conn and icid %d %d\n", call_data->connect_id, call_data->icid);
rec = NewIC ();
if (rec == NULL)
return;
//**********************************
rec->imeState = IS_CLOSED;
//**********************************
StoreIC (rec, call_data);
call_data->icid = rec->id;
for(recl=icl_list; recl!=NULL; recl=recl->next) {
if(recl->connect_id==call_data->connect_id) {
recl->created++;
break;
}
}
return;
}
void DestroyIC (IMChangeICStruct * call_data)
{
//printf("destroy conn and icid %d %d\n", call_data->connect_id, call_data->icid);
DeleteIC (call_data->icid);
DeleteICL(call_data->connect_id);
return;
}
[/PHP]
xim.c中
[PHP]
void SendHZtoClient (XIMS ims, IMForwardEventStruct * call_data, char *strHZ)
{
XTextProperty tp;
Display *display = ims->core.display;
char strOutput[300];
char *ps;
char *loc=GetIcLocale(call_data->connect_id);
if(strstr(loc, "utf")||strstr(loc, "UTF")) {
int l1, l2;
ps = strOutput;
l1 = strlen (strHZ);
l2 = 299;
iconv (convUTF8, (char **) (&strHZ), (size_t *) & l1, &ps, (size_t *) & l2);
*ps = '\0';
ps = strOutput;
Xutf8TextListToTextProperty(display, (char **) &ps, 1, XCompoundTextStyle, &tp);
}
else {
ps = strHZ;
setlocale(LC_CTYPE, loc);
XmbTextListToTextProperty (display, (char **) &ps, 1, XCompoundTextStyle, &tp);
}
((IMCommitStruct *) call_data)->flag |= XimLookupChars;
((IMCommitStruct *) call_data)->commit_string = (char *) tp.value;
//printf("locale is %s\n strHZ is %s\n", GetIcLocale(call_data->connect_id), ps);
//printf("the tp is %s\n", tp.value);
IMCommitString (ims, (XPointer) call_data);
XFree (tp.value);
setlocale(LC_CTYPE, "zh_CN.gbk");
}
[/PHP] |
|