i18nmethod.c

来自「linux 下的 oxim 输入法,简单易用.」· C语言 代码 · 共 1,154 行 · 第 1/3 页

C
1,154 行
字号
                            i18n_core->address.im_window,                            SelectionRequest,                            SelectionRequest,                            WaitXSelectionRequest,                            (XPointer)ims);    XFlush(dpy);    return True;}static Status xi18n_closeIM(XIMS ims){    Xi18n i18n_core = ims->protocol;    Display *dpy = i18n_core->address.dpy;    DeleteXi18nAtom(i18n_core);    if (!i18n_core->methods.end (ims))        return False;        _XUnregisterFilter (dpy,                        i18n_core->address.im_window,                        WaitXSelectionRequest,                        (XPointer)ims);    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, Bool byte_swap){    FrameMgr fm;    extern XimFrameRec wire_keyevent_fr[];    extern XimFrameRec short_fr[];    BYTE b;    CARD16 c16;    CARD32 c32;    *serial = (CARD16)(ev->xany.serial >> 16);    switch (ev->type) {      case KeyPress:      case KeyRelease:	{	    XKeyEvent *kev = (XKeyEvent*)ev;	    /* create FrameMgr */	    fm = FrameMgrInit(wire_keyevent_fr, (char *)(&(event->u)), byte_swap);	    /* set values */	    b = (BYTE)kev->type;          FrameMgrPutToken(fm, b);	    b = (BYTE)kev->keycode;       FrameMgrPutToken(fm, b);	    c16 = (CARD16)(kev->serial & (unsigned long)0xffff);					  FrameMgrPutToken(fm, c16);	    c32 = (CARD32)kev->time;      FrameMgrPutToken(fm, c32);	    c32 = (CARD32)kev->root;      FrameMgrPutToken(fm, c32);	    c32 = (CARD32)kev->window;    FrameMgrPutToken(fm, c32);	    c32 = (CARD32)kev->subwindow; FrameMgrPutToken(fm, c32);	    c16 = (CARD16)kev->x_root;    FrameMgrPutToken(fm, c16);	    c16 = (CARD16)kev->y_root;    FrameMgrPutToken(fm, c16);	    c16 = (CARD16)kev->x;         FrameMgrPutToken(fm, c16);	    c16 = (CARD16)kev->y;         FrameMgrPutToken(fm, c16);	    c16 = (CARD16)kev->state;     FrameMgrPutToken(fm, c16);	    b = (BYTE)kev->same_screen;   FrameMgrPutToken(fm, b);	}	break;      default:	  /* create FrameMgr */	  fm = FrameMgrInit(short_fr, (char *)(&(event->u.u.sequenceNumber)),			    byte_swap);	  c16 = (CARD16)(ev->xany.serial & (unsigned long)0xffff);	  FrameMgrPutToken(fm, c16);	  break;    }    /* free FrameMgr */    FrameMgrFree(fm);}static Status xi18n_forwardEvent (XIMS ims, XPointer xp){    Xi18n i18n_core = ims->protocol;    IMForwardEventStruct *call_data = (IMForwardEventStruct *)xp;    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,                      _Xi18nNeedSwap (i18n_core, call_data->connect_id));    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, XPointer xp){    Xi18n i18n_core = ims->protocol;    IMCommitStruct *call_data = (IMCommitStruct *)xp;    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, XPointer xp){    IMProtocol *call_data = (IMProtocol *)xp;    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, XPointer xp){    IMProtocol *call_data = (IMProtocol *)xp;    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, XPointer xp){    IMProtocol *call_data = (IMProtocol *)xp;    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;}static int xi18n_syncXlib (XIMS ims, XPointer xp){    IMProtocol *call_data = (IMProtocol *)xp;    Xi18n i18n_core = ims->protocol;    IMSyncXlibStruct *sync_xlib;    extern XimFrameRec sync_fr[];    FrameMgr fm;    CARD16 connect_id = call_data->any.connect_id;    int total_size;    unsigned char *reply;    sync_xlib = (IMSyncXlibStruct *) &call_data->sync_xlib;    fm = FrameMgrInit (sync_fr, NULL,                       _Xi18nNeedSwap (i18n_core, connect_id));    total_size = FrameMgrGetTotalSize(fm);    reply = (unsigned char *) malloc (total_size);    if (!reply) {        _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0);        return False;    }    memset (reply, 0, total_size);    FrameMgrSetBuffer (fm, reply);    /* input input-method ID */    FrameMgrPutToken (fm, connect_id);    /* input input-context ID */    FrameMgrPutToken (fm, sync_xlib->icid);    _Xi18nSendMessage (ims, connect_id, XIM_SYNC, 0, reply, total_size);    FrameMgrFree (fm);    XFree(reply);    return True;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?