char* FcitxUIMessagesToCStringForCommit(FcitxMessages* messages) { int length = 0; int i = 0; int count = FcitxMessagesGetMessageCount(messages); char *message_strs[count]; int msg_count = 0; for (i = 0;i < count;i++) { if ((FcitxMessagesGetClientMessageType(messages, i) & MSG_DONOT_COMMIT_WHEN_UNFOCUS) == 0) { char *msg_str = FcitxMessagesGetMessageString(messages, i); message_strs[msg_count++] = msg_str; length += strlen(msg_str); } } char* str = fcitx_utils_malloc0(sizeof(char) * (length + 1)); for (i = 0;i < msg_count;i++) { strcat(str, message_strs[i]); } return str; }
char* FcitxUIMessagesToCStringForCommit(FcitxMessages* messages) { int length = 0; int i = 0; for (i = 0; i < FcitxMessagesGetMessageCount(messages) ; i ++) { if ((FcitxMessagesGetClientMessageType(messages, i) & MSG_DONOT_COMMIT_WHEN_UNFOCUS) == 0) length += strlen(FcitxMessagesGetMessageString(messages, i)); } char* str = fcitx_utils_malloc0(sizeof(char) * (length + 1)); for (i = 0; i < FcitxMessagesGetMessageCount(messages) ; i ++) { if ((FcitxMessagesGetClientMessageType(messages, i) & MSG_DONOT_COMMIT_WHEN_UNFOCUS) == 0) strcat(str, FcitxMessagesGetMessageString(messages, i)); } return str; }
void XimPreeditCallbackDraw(FcitxXimFrontend* xim, FcitxXimIC* ic, const char* preedit_string, int cursorPos) { XTextProperty tp; uint i, len; if (preedit_string == NULL) return; len = fcitx_utf8_strlen(preedit_string); if (len + 1 > xim->feedback_len) { xim->feedback_len = len + 1; if (xim->feedback) { xim->feedback = realloc(xim->feedback, sizeof(XIMFeedback) * xim->feedback_len); } else { xim->feedback = fcitx_utils_malloc0(sizeof(XIMFeedback) * xim->feedback_len); } } FcitxInputState* input = FcitxInstanceGetInputState(xim->owner); FcitxMessages* clientPreedit = FcitxInputStateGetClientPreedit(input); int offset = 0; for (i = 0; i < FcitxMessagesGetMessageCount(clientPreedit) ; i ++) { int type = FcitxMessagesGetClientMessageType(clientPreedit, i); char* str = FcitxMessagesGetMessageString(clientPreedit, i); int j = 0; XIMFeedback fb = 0; if ((type & MSG_NOUNDERLINE) == 0) fb |= XIMUnderline; if (type & MSG_HIGHLIGHT) fb |= XIMReverse; for (; j < fcitx_utf8_strlen(str); j++) { xim->feedback[offset] = fb; offset ++; } } xim->feedback[len] = 0; IMPreeditCBStruct* pcb = fcitx_utils_new(IMPreeditCBStruct); XIMText* text = fcitx_utils_new(XIMText); pcb->major_code = XIM_PREEDIT_DRAW; pcb->connect_id = ic->connect_id; pcb->icid = ic->id; pcb->todo.draw.caret = fcitx_utf8_strnlen(preedit_string, cursorPos); pcb->todo.draw.chg_first = 0; pcb->todo.draw.chg_length = ic->onspot_preedit_length; pcb->todo.draw.text = text; text->feedback = xim->feedback; Xutf8TextListToTextProperty(xim->display, (char **)&preedit_string, 1, XCompoundTextStyle, &tp); text->encoding_is_wchar = 0; text->length = strlen((char*)tp.value); text->string.multi_byte = (char*)tp.value; XimPendingCall(xim, XCT_CALLCALLBACK, (XPointer) pcb); ic->onspot_preedit_length = len; }