i18npthdr.c

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

C
1,849
字号
    FrameMgr fm;    extern XimFrameRec destroy_ic_fr[];    extern XimFrameRec destroy_ic_reply_fr[];    register int total_size;    unsigned char *reply = NULL;    IMDestroyICStruct *destroy =        (IMDestroyICStruct *) &call_data->destroyic;    CARD16 connect_id = call_data->any.connect_id;    CARD16 input_method_ID;    fm = FrameMgrInit (destroy_ic_fr,                       (char *) p,                       _Xi18nNeedSwap (i18n_core, connect_id));    /* get data */    FrameMgrGetToken (fm, input_method_ID);    FrameMgrGetToken (fm, destroy->icid);    FrameMgrFree (fm);    if (i18n_core->address.improto)    {        if (!(i18n_core->address.improto (ims, call_data)))            return;        /*endif*/    }    /*endif*/        fm = FrameMgrInit (destroy_ic_reply_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;    }    /*endif*/    memset (reply, 0, total_size);    FrameMgrSetBuffer (fm, reply);    FrameMgrPutToken (fm, input_method_ID);    FrameMgrPutToken (fm, destroy->icid);    _Xi18nSendMessage (ims,                       connect_id,                       XIM_DESTROY_IC_REPLY,                       0,                       reply,                       total_size);    XFree(reply);    FrameMgrFree (fm);}static void ResetICMessageProc (XIMS ims,                                IMProtocol *call_data,                                unsigned char *p){    Xi18n i18n_core = ims->protocol;    FrameMgr fm;    extern XimFrameRec reset_ic_fr[];    extern XimFrameRec reset_ic_reply_fr[];    register int total_size;    unsigned char *reply = NULL;    IMResetICStruct *resetic =        (IMResetICStruct *) &call_data->resetic;    CARD16 connect_id = call_data->any.connect_id;    CARD16 input_method_ID;    fm = FrameMgrInit (reset_ic_fr,                       (char *) p,                       _Xi18nNeedSwap (i18n_core, connect_id));    /* get data */    FrameMgrGetToken (fm, input_method_ID);    FrameMgrGetToken (fm, resetic->icid);    FrameMgrFree (fm);    if (i18n_core->address.improto)    {        if (!(i18n_core->address.improto(ims, call_data)))            return;        /*endif*/    }    /*endif*/        /* create FrameMgr */    fm = FrameMgrInit (reset_ic_reply_fr,                       NULL,                       _Xi18nNeedSwap (i18n_core, connect_id));    /* set length of STRING8 */    FrameMgrSetSize (fm, resetic->length);    total_size = FrameMgrGetTotalSize (fm);    reply = (unsigned char *) malloc (total_size);    if (!reply)    {        _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0);        return;    }    /*endif*/    memset (reply, 0, total_size);    FrameMgrSetBuffer (fm, reply);    FrameMgrPutToken (fm, input_method_ID);    FrameMgrPutToken (fm, resetic->icid);    FrameMgrPutToken(fm, resetic->length);    FrameMgrPutToken (fm, resetic->commit_string);    _Xi18nSendMessage (ims,                       connect_id,                       XIM_RESET_IC_REPLY,                       0,                       reply,                       total_size);    FrameMgrFree (fm);    XFree(reply);}static int WireEventToEvent (Xi18n i18n_core,                             xEvent *event,                             CARD16 serial,                             XEvent *ev,                             Bool byte_swap){    FrameMgr fm;    extern XimFrameRec wire_keyevent_fr[];    BYTE b;    CARD16 c16;    CARD32 c32;    int ret = False;    /* create FrameMgr */    fm = FrameMgrInit(wire_keyevent_fr, (char *)(&(event->u)), byte_swap);    /* get & set type */    FrameMgrGetToken(fm, b);    ev->type = (unsigned int)b;    /* get detail */    FrameMgrGetToken(fm, b);    /* get & set serial */    FrameMgrGetToken(fm, c16);    ev->xany.serial = (unsigned long)c16;    ev->xany.serial |= serial << 16;    ev->xany.send_event = False;    ev->xany.display = i18n_core->address.dpy;    /* Remove SendEvent flag from event type to emulate KeyPress/Release */    ev->type &= 0x7F;    switch (ev->type) {      case KeyPress:      case KeyRelease:      {          XKeyEvent *kev = (XKeyEvent*)ev;          /* set keycode (detail) */          kev->keycode = (unsigned int)b;          /* get & set values */          FrameMgrGetToken(fm, c32); kev->time = (Time)c32;          FrameMgrGetToken(fm, c32); kev->root = (Window)c32;          FrameMgrGetToken(fm, c32); kev->window = (Window)c32;          FrameMgrGetToken(fm, c32); kev->subwindow = (Window)c32;          FrameMgrGetToken(fm, c16); kev->x_root = (int)c16;          FrameMgrGetToken(fm, c16); kev->y_root = (int)c16;          FrameMgrGetToken(fm, c16); kev->x = (int)c16;          FrameMgrGetToken(fm, c16); kev->y = (int)c16;          FrameMgrGetToken(fm, c16); kev->state = (unsigned int)c16;          FrameMgrGetToken(fm, b);   kev->same_screen = (Bool)b;      }      ret = True;      break;      default:      break;    }    /* free FrameMgr */    FrameMgrFree(fm);    return ret;}static void ForwardEventMessageProc (XIMS ims,                                     IMProtocol *call_data,                                     unsigned char *p){    Xi18n i18n_core = ims->protocol;    FrameMgr fm;    extern XimFrameRec forward_event_fr[];    xEvent wire_event;    IMForwardEventStruct *forward =        (IMForwardEventStruct*) &call_data->forwardevent;    CARD16 connect_id = call_data->any.connect_id;    CARD16 input_method_ID;    fm = FrameMgrInit (forward_event_fr,                       (char *) p,                       _Xi18nNeedSwap (i18n_core, connect_id));    /* get data */    FrameMgrGetToken (fm, input_method_ID);    FrameMgrGetToken (fm, forward->icid);    FrameMgrGetToken (fm, forward->sync_bit);    FrameMgrGetToken (fm, forward->serial_number);    p += sizeof (CARD16)*4;    memmove (&wire_event, p, sizeof (xEvent));    FrameMgrFree (fm);    if (WireEventToEvent (i18n_core,                          &wire_event,                          forward->serial_number,                          &forward->event,			  _Xi18nNeedSwap (i18n_core, connect_id)) == True)    {        if (i18n_core->address.improto)        {            if (!(i18n_core->address.improto(ims, call_data)))                return;            /*endif*/        }        /*endif*/    }    /*endif*/}static void ExtForwardKeyEventMessageProc (XIMS ims,                                           IMProtocol *call_data,                                           unsigned char *p){    Xi18n i18n_core = ims->protocol;    FrameMgr fm;    extern XimFrameRec ext_forward_keyevent_fr[];    CARD8 type, keycode;    CARD16 state;    CARD32 ev_time, window;    IMForwardEventStruct *forward =        (IMForwardEventStruct *) &call_data->forwardevent;    XEvent *ev = (XEvent *) &forward->event;    CARD16 connect_id = call_data->any.connect_id;    CARD16 input_method_ID;    fm = FrameMgrInit (ext_forward_keyevent_fr,                       (char *) p,                       _Xi18nNeedSwap (i18n_core, connect_id));    /* get data */    FrameMgrGetToken (fm, input_method_ID);    FrameMgrGetToken (fm, forward->icid);    FrameMgrGetToken (fm, forward->sync_bit);    FrameMgrGetToken (fm, forward->serial_number);    FrameMgrGetToken (fm, type);    FrameMgrGetToken (fm, keycode);    FrameMgrGetToken (fm, state);    FrameMgrGetToken (fm, ev_time);    FrameMgrGetToken (fm, window);    FrameMgrFree (fm);    if (type != KeyPress)    {        _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0);        return;    }    /*endif*/        /* make a faked keypress event */    ev->type = (int)type;    ev->xany.send_event = True;    ev->xany.display = i18n_core->address.dpy;    ev->xany.serial = (unsigned long) forward->serial_number;    ((XKeyEvent *) ev)->keycode = (unsigned int) keycode;    ((XKeyEvent *) ev)->state = (unsigned int) state;    ((XKeyEvent *) ev)->time = (Time) ev_time;    ((XKeyEvent *) ev)->window = (Window) window;    ((XKeyEvent *) ev)->root = DefaultRootWindow (ev->xany.display);    ((XKeyEvent *) ev)->x = 0;    ((XKeyEvent *) ev)->y = 0;    ((XKeyEvent *) ev)->x_root = 0;    ((XKeyEvent *) ev)->y_root = 0;    if (i18n_core->address.improto)    {        if (!(i18n_core->address.improto (ims, call_data)))            return;        /*endif*/    }    /*endif*/}static void ExtMoveMessageProc (XIMS ims,                                IMProtocol *call_data,                                unsigned char *p){    Xi18n i18n_core = ims->protocol;    FrameMgr fm;    extern XimFrameRec ext_move_fr[];    IMMoveStruct *extmove =        (IMMoveStruct*) & call_data->extmove;    CARD16 connect_id = call_data->any.connect_id;    CARD16 input_method_ID;    fm = FrameMgrInit (ext_move_fr,                       (char *) p,                       _Xi18nNeedSwap (i18n_core, connect_id));    /* get data */    FrameMgrGetToken (fm, input_method_ID);    FrameMgrGetToken (fm, extmove->icid);    FrameMgrGetToken (fm, extmove->x);    FrameMgrGetToken (fm, extmove->y);    FrameMgrFree (fm);    if (i18n_core->address.improto)    {        if (!(i18n_core->address.improto (ims, call_data)))            return;        /*endif*/    }    /*endif*/}static void ExtensionMessageProc (XIMS ims,                                  IMProtocol *call_data,                                  unsigned char *p){    switch (call_data->any.minor_code)    {    case XIM_EXT_FORWARD_KEYEVENT:        ExtForwardKeyEventMessageProc (ims, call_data, p);        break;    case XIM_EXT_MOVE:        ExtMoveMessageProc (ims, call_data, p);        break;    }    /*endswitch*/}static void TriggerNotifyMessageProc (XIMS ims,                                      IMProtocol *call_data,                                      unsigned char *p){    Xi18n i18n_core = ims->protocol;    FrameMgr fm;    extern XimFrameRec trigger_notify_fr[], trigger_notify_reply_fr[];    register int total_size;    unsigned char *reply = NULL;    IMTriggerNotifyStruct *trigger =        (IMTriggerNotifyStruct *) &call_data->triggernotify;    CARD16 connect_id = call_data->any.connect_id;    CARD16 input_method_ID;    CARD32 flag;    fm = FrameMgrInit (trigger_notify_fr,                       (char *) p,                       _Xi18nNeedSwap (i18n_core, connect_id));    /* get data */    FrameMgrGetToken (fm, input_method_ID);    FrameMgrGetToken (fm, trigger->icid);    FrameMgrGetToken (fm, trigger->flag);    FrameMgrGetToken (fm, trigger->key_index);    FrameMgrGetToken (fm, trigger->event_mask);    /*      In order to support Front End Method, this event_mask must be saved      per clients so that it should be restored by an XIM_EXT_SET_EVENT_MASK      call when preediting mode is reset to off.     */    flag = trigger->flag;    FrameMgrFree (fm);    fm = FrameMgrInit (trigger_notify_reply_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;    }    /*endif*/    memset (reply, 0, total_size);    FrameMgrSetBuffer (fm, reply);    FrameMgrPutToken (fm, input_method_ID);    FrameMgrPutToken (fm, trigger->icid);    /* NOTE:       XIM_TRIGGER_NOTIFY_REPLY should be sent before XIM_SET_EVENT_MASK       in case of XIM_TRIGGER_NOTIFY(flag == ON), while it should be       sent after XIM_SET_EVENT_MASK in case of       XIM_TRIGGER_NOTIFY(flag == OFF).       */    if (flag == 0)    {        /* on key */        _Xi18nSendMessage (ims,                           connect_id,                           XIM_TRIGGER_NOTIFY_REPLY,                           0,                           reply,                           total_size);        IMPreeditStart (ims, (XPointer)call_data);    }    /*endif*/    if (i18n_core->address.improto)    {        if (!(i18n_core->address.improto(ims, call_data)))            return;        /*endif*/    }    /*endif*/    if (flag == 1)    {        /* off key */        IMPreeditEnd (ims, (XPointer) call_data);        _Xi18nSendMessage (ims,                           connect_id,                           XIM_TRIGGER_NOTIFY_REPLY,                           0,                           reply,                           total_size);    }    /*endif*/    FrameMgrFree (fm);    XFree (reply);}static INT16 ChooseEncoding (Xi18n i18n_core,                             IMEncodingNegotiationStruct *enc_nego){    Xi18nAddressRec *address = (Xi18nAddressRec *) & i18n_core->address;    XIMEncodings *p;    int i, j;    int enc_index=0;    p = (XIMEncodings *) &address->encoding_list;    for (i = 0;  i < (int) p->count_encodings;  i++)    {        for (j = 0;  j < (int) enc_nego->encoding_number;  j++)        {            if (strcmp (p->supported_encodings[i],                        enc_nego->encoding[j].name) == 0)            {                enc_index = j;                break;            }            /*endif*/        }        /*endfor*/    }    /*endfor*/    return (INT16) enc_index;#if 0    return (INT16) XIM_Default_Encoding_IDX;

⌨️ 快捷键说明

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