📄 xcric.c
字号:
Bool_XipCreateDefIC(im) XipIM im;{ im->default_ic = (XipIC)Xcalloc(1, sizeof(XipICRec)); if (im->default_ic == NULL) { return False; } im->default_ic->core.im = (XIM)im; im->default_mask = _XipReadRdb(im->core.display, im->default_ic, (unsigned long)0, im->core.rdb, im->core.res_name, im->core.res_class); return True;}/* * Create an input context within the input method, * and return a pointer the input context ti the caller. */XIC_XipCreateIC(supim, args) XIM supim; XIMArg *args;{ XipIM im = (XipIM)supim; XipIC ic; ximCreateICReq req; ximCreateICReply reply; ximEventReply reply1; unsigned long mask; extern Bool _XipBackEndFilter();#ifdef XML char *p, **nls_list, **l; unsigned int i, n = 0; XLocale xlc;#endif /* XML */ /* * If im is not specified or the file descripter is not available, * return NULL. */ if (im->fd < 0) { return(NULL); } if ((ic = (XipIC)Xcalloc(1, sizeof(XipICRec))) == NULL) { return(NULL); } mask = im->default_mask; if (mask) bcopy((char *)&im->default_ic->values, (char *)&ic->values, sizeof(struct _ICValues)); ic->methods = (XICMethods) &ic_methods; ic->prototype_filter = _XipBackEndFilter; ic->core.im = supim; (void)_XipICSetValues(ic, args, &mask); req.reqType = XIM_CreateIC; req.length = sz_ximCreateICReq + strlen(im->client_data); if ((_XipWriteToIM(im, (char *)&req, sz_ximCreateICReq) < 0) || (_XipWriteToIM(im, im->client_data, strlen(im->client_data)) < 0) || (_XipFlushToIM(im) < 0)) { return(NULL); } if (im->core.rdb && ic->values.res_name && ic->values.res_class) { mask |= _XipReadRdb(im->core.display, ic, mask, im->core.rdb, ic->values.res_name, ic->values.res_class); } #ifdef XML if (im->xlc != NULL) {#endif /* XML */ ic->mb = _XlcDupLocale(im->xlc); ic->wc = _XlcDupLocale(im->xlc);#ifdef XML ic->xlc_num = 0; ic->mb_temp = NULL; ic->wc_temp = NULL; n = strlen(im->xlc->xlc_db->lc_name) + 1; if ((p = Xmalloc(n)) == NULL) return(NULL); strcpy(p, im->xlc->xlc_db->lc_name); p[n - 1] = 0; ic->values.using_language = p; mask |= (1 << ICUsingLanguage); } else { ic->mb = NULL; ic->wc = NULL; ic->xlc_num = 0; if ((ic->mb_temp = (XLocale*)Xmalloc(sizeof(XLocale) * 32)) == NULL) { return(NULL); } if ((ic->wc_temp = (XLocale*)Xmalloc(sizeof(XLocale) * 32)) == NULL) { return(NULL); } _XlcListLocale(&nls_list); for (l = nls_list; *l; l++) { xlc = _XlcMakeLocale(*l); if (!xlc) continue; ic->mb_temp[ic->xlc_num] = xlc; ic->wc_temp[ic->xlc_num] = _XlcDupLocale(xlc); n += strlen(ic->mb_temp[ic->xlc_num]->xlc_db->lc_name) + 1; ic->xlc_num++; } Xfree((char *)nls_list); if ((p = Xmalloc(n)) == NULL) return(NULL); p[0] = '\0'; for (i = 0; i < ic->xlc_num; i++) { strcat(p, ic->mb_temp[i]->xlc_db->lc_name); strcat(p, ";"); } p[n - 1] = '\0'; ic->values.using_language = p; mask |= (1 << ICUsingLanguage); }#endif /* XML */ /* * Attempt to send IC data to the input manager. If sending failed, * free IC structure and return NULL. */ _XipSendICValues(ic, mask); ic->max_of_ct = ic->max_of_wc = 0; ic->ct_buf = NULL; ic->wc_buf = NULL; for (;;) { if ((_XipReadFromIM(im, (char *)&reply1, sz_ximEventReply) < 0) || (reply1.state == 0xffff)) { goto _err_ret; } if (reply1.detail == XIM_CALLBACK) { /* * Call the callback routines. */ if (_XipCallCallbacks(ic) < 0) { goto _err_ret; } } else if (reply1.detail == XIM_IC) { if (_XipReadFromIM(im, (char *)&reply, sz_ximCreateICReply) < 0) { goto _err_ret; } if (reply.state != 0) { goto _err_ret; } ic->icid = reply.xic; break; } else { break; } } /* * Attempt to get current IC data from the input manager. */ _XipReceiveICValues(ic, (unsigned long)ICAllMask);#ifdef XML if (ic->xlc_num > 0) { for (i = 0; i < ic->xlc_num; i++) { if (!strcmp(ic->values.current_language, ic->mb_temp[i]->xlc_db->lc_name)) { ic->mb = ic->mb_temp[i]; ic->wc = ic->wc_temp[i]; break; } } if (ic->mb == NULL) { ic->mb = ic->mb_temp[0]; ic->wc = ic->wc_temp[0]; } }#endif /* XML */ return((XIC)ic);_err_ret: if (ic->mb) _XlcFreeLocale(ic->mb); if (ic->wc) _XlcFreeLocale(ic->wc);#ifdef XML if (ic->xlc_num > 0) { for (i = 0; i < ic->xlc_num; i++) { _XlcFreeLocale(ic->mb_temp[i]); _XlcFreeLocale(ic->wc_temp[i]); } } if (ic->mb_temp) Xfree(ic->mb_temp); if (ic->wc_temp) Xfree(ic->wc_temp); if (ic->values.using_language) Xfree(ic->values.using_language);#endif /* XML */ Xfree((char *)ic); return(NULL);}/* * Reset the input context. */wchar_t *_XipwcResetIC(ic) XIC ic; /* specified the input context to reset*/{ XipIM im = ipIMofIC((XipIC)ic); ximResetICReq req; ximEventReply reply; /* * If im is not specified or the file descripter is not available, * return NULL. */ if (im->fd < 0) { return((wchar_t *)NULL); } req.reqType = XIM_ResetIC; req.length = sz_ximResetICReq; req.xic = ((XipIC)ic)->icid; if ((_XipWriteToIM(im, (char *)&req, sz_ximResetICReq) >= 0) && (_XipFlushToIM(im) >= 0)) { for (;;) { if ((_XipReadFromIM(im, (char *)&reply, sz_ximEventReply) < 0) || (reply.state == 0xffff)) { return((wchar_t *)NULL); } if (reply.detail == XIM_CALLBACK) { /* * Call the callback routines. */ if (_XipCallCallbacks(ic) < 0) { return((wchar_t *)NULL); } } else { break; } } } return((wchar_t *)NULL);}char *_XipmbResetIC(ic) XIC ic; /* specified the input context to reset*/{ XipIM im = ipIMofIC((XipIC)ic); ximResetICReq req; ximEventReply reply; /* * If im is not specified or the file descripter is not available, * return NULL. */ if (im->fd < 0) { return(NULL); } req.reqType = XIM_ResetIC; req.length = sz_ximResetICReq; req.xic = ((XipIC)ic)->icid; if ((_XipWriteToIM(im, (char *)&req, sz_ximResetICReq) >= 0) && (_XipFlushToIM(im) >= 0)) { for (;;) { if ((_XipReadFromIM(im, (char *)&reply, sz_ximEventReply) < 0) || (reply.state == 0xffff)) { return(NULL); } if (reply.detail == XIM_CALLBACK) { /* * Call the callback routines. */ if (_XipCallCallbacks(ic) < 0) { return(NULL); } } else { break; } } } return(NULL);}#ifdef XMLvoid_XipChangeLocale(ic, lc_name) XipIC ic; char *lc_name;{ XLocale xlc; int i; for (i = 0; i < ic->xlc_num; i++) { if ((!strcmp(lc_name, ic->mb_temp[i]->lc_lang)) || (!strcmp(lc_name, ic->mb_temp[i]->xlc_db->lc_name))) { ic->mb = ic->mb_temp[i]; ic->wc = ic->wc_temp[i]; return; } } xlc = _XlcMakeLocale(lc_name); if (xlc) { ic->mb = ic->mb_temp[ic->xlc_num] = xlc; ic->wc = ic->wc_temp[ic->xlc_num] = _XlcDupLocale(xlc); ic->xlc_num++; }}#endif /* XML */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -