void export_text_xim() { char *text = output_buffer; if (!output_bufferN) return; XTextProperty tp; #if 0 char outbuf[512]; utf8_big5(output_buffer, outbuf); text = outbuf; XmbTextListToTextProperty(dpy, &text, 1, XCompoundTextStyle, &tp); #else Xutf8TextListToTextProperty(dpy, &text, 1, XCompoundTextStyle, &tp); #endif #if DEBUG && 0 dbg("send_utf8_ch: %s\n", text); #endif ((IMCommitStruct*)current_forward_eve)->flag |= XimLookupChars; ((IMCommitStruct*)current_forward_eve)->commit_string = (char *)tp.value; IMCommitString(current_ims, (XPointer)current_forward_eve); clear_output_buffer(); XFree(tp.value); }
void XimCommitString(void* arg, FcitxInputContext* ic, const char* str) { FcitxXimFrontend* xim = (FcitxXimFrontend*) arg; XTextProperty tp; IMCommitStruct cms; FcitxXimIC* ximic = (FcitxXimIC*) ic->privateic; /* avoid Seg fault */ if (!ic) return; /* * I'm not sure whether xim should commit string before preedit done * but this can fix opera's crash in specific input box * quite strange. */ if (GetXimIC(ic)->bPreeditStarted == true) { XimPreeditCallbackDraw(xim, GetXimIC(ic), "", 0); XimPreeditCallbackDone(xim, GetXimIC(ic)); GetXimIC(ic)->bPreeditStarted = false; } Xutf8TextListToTextProperty(xim->display, (char **) &str, 1, XCompoundTextStyle, &tp); memset(&cms, 0, sizeof(IMCommitStruct)); cms.major_code = XIM_COMMIT; cms.icid = ximic->id; cms.connect_id = ximic->connect_id; cms.flag = XimLookupChars; cms.commit_string = (char *) tp.value; IMCommitString(xim->ims, (XPointer) & cms); XFree(tp.value); }
void* XimConsumeQueue(void* arg, FcitxModuleFunctionArg args) { FcitxXimFrontend* xim = arg; if (!xim->ims) return NULL; XimQueue* item; size_t len = utarray_len(xim->queue); for (item = (XimQueue*) utarray_front(xim->queue); item != NULL; item = (XimQueue*) utarray_next(xim->queue, item)) { switch(item->type) { case XCT_FORWARD: { IMForwardEvent(xim->ims, item->ptr); } break; case XCT_CALLCALLBACK: { IMCallCallback(xim->ims, item->ptr); IMPreeditCBStruct* pcb = (IMPreeditCBStruct*) item->ptr; if (pcb->major_code == XIM_PREEDIT_DRAW) { XFree(pcb->todo.draw.text->string.multi_byte); free(pcb->todo.draw.text); } } break; case XCT_COMMIT: { IMCommitString(xim->ims, item->ptr); IMCommitStruct* cms = (IMCommitStruct*) item->ptr; XFree(cms->commit_string); } break; case XCT_PREEDIT_START: IMPreeditStart(xim->ims, item->ptr); break; case XCT_PREEDIT_END: IMPreeditEnd(xim->ims, item->ptr); break; } free(item->ptr); } utarray_clear(xim->queue); if (len) FcitxInstanceSetRecheckEvent(xim->owner); return NULL; }
void xim_commit_preedit(XIMHandle* handle, const char* result_str) { IC* ic = icmgr_get_current(); if (ic == NULL) return; XTextProperty tp; IMCommitStruct cs; Xutf8TextListToTextProperty(dpy, (char**) &result_str, 1, XCompoundTextStyle, &tp); memset(&cs, 0, sizeof(IMCommitStruct)); cs.major_code = XIM_COMMIT; cs.icid = ic->icid; cs.connect_id = ic->connect_id; cs.flag = XimLookupChars; cs.commit_string = (char*) tp.value; IMCommitString(handle, (XPointer) &cs); XFree(tp.value); }
static void _context_commit_text_cb (IBusInputContext *context, IBusText *text, X11IC *x11ic) { g_assert (IBUS_IS_INPUT_CONTEXT (context)); g_assert (IBUS_IS_TEXT (text)); g_assert (x11ic != NULL); XTextProperty tp; IMCommitStruct cms = {0}; Xutf8TextListToTextProperty (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), (gchar **)&(text->text), 1, XCompoundTextStyle, &tp); cms.major_code = XIM_COMMIT; cms.icid = x11ic->icid; cms.connect_id = x11ic->connect_id; cms.flag = XimLookupChars; cms.commit_string = (gchar *)tp.value; IMCommitString (_xims, (XPointer) & cms); XFree (tp.value); }
void SendHZtoClient (IMForwardEventStruct * call_data, char *strHZ) { XTextProperty tp; IMCommitStruct cms; char strOutput[300]; char *ps; char *pS2T = (char *) NULL; #ifdef _DEBUG fprintf (stderr, "Sending %s icid=%d connectid=%d\n", strHZ, CurrentIC->id, connect_id); #endif /* avoid Seg fault */ if (!call_data && !CurrentIC) return; #ifdef _ENABLE_RECORDING if (bRecording) { if (OpenRecording(True)) { if ( !bWrittenRecord ) { char buf[20]; struct tm *ts; time_t now; now=time(NULL); ts = localtime(&now); strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", ts); fprintf(fpRecord, "%s\n", buf); } fprintf(fpRecord, "%s", strHZ); bWrittenRecord = True; } } #endif if (bUseGBKT) pS2T = strHZ = ConvertGBKSimple2Tradition (strHZ); if (bIsUtf8) { size_t l1, l2; ps = strOutput; l1 = strlen (strHZ); l2 = 299; l1 = iconv (convUTF8, (ICONV_CONST char **) (&strHZ), &l1, &ps, &l2); *ps = '\0'; ps = strOutput; } else ps = strHZ; XmbTextListToTextProperty (dpy, (char **) &ps, 1, XCompoundTextStyle, &tp); memset (&cms, 0, sizeof (cms)); cms.major_code = XIM_COMMIT; if (call_data) { cms.icid = call_data->icid; cms.connect_id = call_data->connect_id; } else { cms.icid = CurrentIC->id; cms.connect_id = connect_id; } cms.flag = XimLookupChars; cms.commit_string = (char *) tp.value; IMCommitString (ims, (XPointer) & cms); XFree (tp.value); if (bUseGBKT) free (pS2T); }