📄 i18nmethod.c
字号:
return False; /*endif*/ _XUnregisterFilter (dpy, i18n_core->address.im_window, WaitXSelectionRequest, ims);/* * Now we should delete the atom list in XIM_Servers property of Root Window *//* XGetWindowProperty (dpy, root, XIM_Servers, 0L, 1000000L, False, XA_ATOM, &realtype, &realformat, &length, &bytesafter, (unsigned char **) (&data)); if (realtype == XA_ATOM && realformat == 32 && length>0) { new_data = malloc(sizeof(long) * length); memset(new_data, 0, sizeof(long) * length); for (i=0, j=0; i<length; i++) { if (data[i] != atom) { new_data[j] = data[i]; j ++; } } XDeleteProperty (dpy, root, XIM_Servers); if (j > 0) XChangeProperty (dpy, root, XIM_Servers, XA_ATOM, 32, PropModePrepend, (unsigned char *)new_data, j); free(new_data); } XFlush(dpy); if (data != NULL) XFree ((char *) data); XFree (i18n_core->address.im_name); XFree (i18n_core->address.im_locale); XFree (i18n_core->address.im_addr); XFree (i18n_core);*/ return True;}static char *xi18n_setIMValues (XIMS ims, XIMArg *args){ Xi18n i18n_core = ims->protocol; char *ret; if ((ret = ParseArgs (i18n_core, I18N_SET, args)) != NULL) return ret; /*endif*/ return NULL;}static char *xi18n_getIMValues (XIMS ims, XIMArg *args){ Xi18n i18n_core = ims->protocol; char *ret; if ((ret = ParseArgs (i18n_core, I18N_GET, args)) != NULL) return ret; /*endif*/ return NULL;}static void EventToWireEvent (XEvent *ev, xEvent *event, CARD16 *serial){ *serial = (CARD16) (ev->xany.serial >> 16); event->u.u.sequenceNumber = (CARD16) (ev->xany.serial & (unsigned long) 0xFFFF); switch (ev->type) { case KeyPress: case KeyRelease: { XKeyEvent *kev = (XKeyEvent *) ev; event->u.u.type = ev->type; event->u.keyButtonPointer.root = kev->root; event->u.keyButtonPointer.state = kev->state; event->u.keyButtonPointer.time = kev->time; event->u.keyButtonPointer.event = kev->window; event->u.keyButtonPointer.child = kev->subwindow; event->u.keyButtonPointer.eventX = kev->x; event->u.keyButtonPointer.eventY = kev->y; event->u.keyButtonPointer.rootX = kev->x_root; event->u.keyButtonPointer.rootY = kev->y_root; event->u.keyButtonPointer.sameScreen = kev->same_screen; event->u.u.detail = kev->keycode; } } /*endswitch*/}static Status xi18n_forwardEvent (XIMS ims, IMForwardEventStruct *call_data){ Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec forward_event_fr[]; register int total_size; unsigned char *reply = NULL; unsigned char *replyp; CARD16 serial; int event_size; Xi18nClient *client; client = (Xi18nClient *) _Xi18nFindClient (i18n_core, call_data->connect_id); /* create FrameMgr */ fm = FrameMgrInit (forward_event_fr, NULL, _Xi18nNeedSwap (i18n_core, call_data->connect_id)); total_size = FrameMgrGetTotalSize (fm); event_size = sizeof (xEvent); reply = (unsigned char *) malloc (total_size + event_size); if (!reply) { _Xi18nSendMessage (ims, call_data->connect_id, XIM_ERROR, 0, 0, 0); return False; } /*endif*/ memset (reply, 0, total_size + event_size); FrameMgrSetBuffer (fm, reply); replyp = reply; call_data->sync_bit = 1; /* always sync */ client->sync = True; FrameMgrPutToken (fm, call_data->connect_id); FrameMgrPutToken (fm, call_data->icid); FrameMgrPutToken (fm, call_data->sync_bit); replyp += total_size; EventToWireEvent (&(call_data->event), (xEvent *) replyp, &serial); FrameMgrPutToken (fm, serial); _Xi18nSendMessage (ims, call_data->connect_id, XIM_FORWARD_EVENT, 0, reply, total_size + event_size); XFree (reply); FrameMgrFree (fm); return True;}static Status xi18n_commit (XIMS ims, IMCommitStruct *call_data){ Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec commit_chars_fr[]; extern XimFrameRec commit_both_fr[]; register int total_size; unsigned char *reply = NULL; CARD16 str_length; call_data->flag |= XimSYNCHRONUS; /* always sync */ if (!(call_data->flag & XimLookupKeySym) && (call_data->flag & XimLookupChars)) { fm = FrameMgrInit (commit_chars_fr, NULL, _Xi18nNeedSwap (i18n_core, call_data->connect_id)); /* set length of STRING8 */ str_length = strlen (call_data->commit_string); FrameMgrSetSize (fm, str_length); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, call_data->connect_id, XIM_ERROR, 0, 0, 0); return False; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); str_length = FrameMgrGetSize (fm); FrameMgrPutToken (fm, call_data->connect_id); FrameMgrPutToken (fm, call_data->icid); FrameMgrPutToken (fm, call_data->flag); FrameMgrPutToken (fm, str_length); FrameMgrPutToken (fm, call_data->commit_string); } else { fm = FrameMgrInit (commit_both_fr, NULL, _Xi18nNeedSwap (i18n_core, call_data->connect_id)); /* set length of STRING8 */ str_length = strlen (call_data->commit_string); if (str_length > 0) FrameMgrSetSize (fm, str_length); /*endif*/ total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, call_data->connect_id, XIM_ERROR, 0, 0, 0); return False; } /*endif*/ FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, call_data->connect_id); FrameMgrPutToken (fm, call_data->icid); FrameMgrPutToken (fm, call_data->flag); FrameMgrPutToken (fm, call_data->keysym); if (str_length > 0) { str_length = FrameMgrGetSize (fm); FrameMgrPutToken (fm, str_length); FrameMgrPutToken (fm, call_data->commit_string); } /*endif*/ } /*endif*/ _Xi18nSendMessage (ims, call_data->connect_id, XIM_COMMIT, 0, reply, total_size); FrameMgrFree (fm); XFree (reply); return True;}static int xi18n_callCallback (XIMS ims, IMProtocol *call_data){ switch (call_data->major_code) { case XIM_GEOMETRY: return _Xi18nGeometryCallback (ims, call_data); case XIM_PREEDIT_START: return _Xi18nPreeditStartCallback (ims, call_data); case XIM_PREEDIT_DRAW: return _Xi18nPreeditDrawCallback (ims, call_data); case XIM_PREEDIT_CARET: return _Xi18nPreeditCaretCallback (ims, call_data); case XIM_PREEDIT_DONE: return _Xi18nPreeditDoneCallback (ims, call_data); case XIM_STATUS_START: return _Xi18nStatusStartCallback (ims, call_data); case XIM_STATUS_DRAW: return _Xi18nStatusDrawCallback (ims, call_data); case XIM_STATUS_DONE: return _Xi18nStatusDoneCallback (ims, call_data); case XIM_STR_CONVERSION: return _Xi18nStringConversionCallback (ims, call_data); } /*endswitch*/ return False;}/* preeditStart and preeditEnd are used only for Dynamic Event Flow. */static int xi18n_preeditStart (XIMS ims, IMProtocol *call_data){ Xi18n i18n_core = ims->protocol; IMPreeditStateStruct *preedit_state = (IMPreeditStateStruct *) &call_data->preedit_state; long mask; int on_key_num = i18n_core->address.on_keys.count_keys; int off_key_num = i18n_core->address.off_keys.count_keys; if (on_key_num == 0 && off_key_num == 0) return False; /*endif*/ if (i18n_core->address.imvalue_mask & I18N_FILTERMASK) mask = i18n_core->address.filterevent_mask; else mask = DEFAULT_FILTER_MASK; /*endif*/ _Xi18nSetEventMask (ims, preedit_state->connect_id, preedit_state->connect_id, preedit_state->icid, mask, ~mask); return True;}static int xi18n_preeditEnd (XIMS ims, IMProtocol *call_data){ Xi18n i18n_core = ims->protocol; int on_key_num = i18n_core->address.on_keys.count_keys; int off_key_num = i18n_core->address.off_keys.count_keys; IMPreeditStateStruct *preedit_state; preedit_state = (IMPreeditStateStruct *) &call_data->preedit_state; if (on_key_num == 0 && off_key_num == 0) return False; /*endif*/ _Xi18nSetEventMask (ims, preedit_state->connect_id, preedit_state->connect_id, preedit_state->icid, 0, 0); return True;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -