Blame util/IMdkit/i18nUtil.c

Packit Service 1d8f1c
/******************************************************************
Packit Service 1d8f1c
 
Packit Service 1d8f1c
         Copyright (C) 1994-1995 Sun Microsystems, Inc.
Packit Service 1d8f1c
         Copyright (C) 1993-1994 Hewlett-Packard Company
Packit Service 1d8f1c
         Copyright (C) 2014 Peng Huang <shawn.p.huang@gmail.com>
Packit Service 1d8f1c
         Copyright (C) 2014 Red Hat, Inc.
Packit Service 1d8f1c
 
Packit Service 1d8f1c
Permission to use, copy, modify, distribute, and sell this software
Packit Service 1d8f1c
and its documentation for any purpose is hereby granted without fee,
Packit Service 1d8f1c
provided that the above copyright notice appear in all copies and
Packit Service 1d8f1c
that both that copyright notice and this permission notice appear
Packit Service 1d8f1c
in supporting documentation, and that the name of Sun Microsystems, Inc.
Packit Service 1d8f1c
and Hewlett-Packard not be used in advertising or publicity pertaining to
Packit Service 1d8f1c
distribution of the software without specific, written prior permission.
Packit Service 1d8f1c
Sun Microsystems, Inc. and Hewlett-Packard make no representations about
Packit Service 1d8f1c
the suitability of this software for any purpose.  It is provided "as is"
Packit Service 1d8f1c
without express or implied warranty.
Packit Service 1d8f1c
 
Packit Service 1d8f1c
SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL
Packit Service 1d8f1c
WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED
Packit Service 1d8f1c
WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
Packit Service 1d8f1c
SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY
Packit Service 1d8f1c
SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
Packit Service 1d8f1c
RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
Packit Service 1d8f1c
CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
Packit Service 1d8f1c
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Packit Service 1d8f1c
 
Packit Service 1d8f1c
  Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc.
Packit Service 1d8f1c
Packit Service 1d8f1c
    This version tidied and debugged by Steve Underwood May 1999
Packit Service 1d8f1c
 
Packit Service 1d8f1c
******************************************************************/
Packit Service 1d8f1c
Packit Service 1d8f1c
#include <X11/Xlib.h>
Packit Service 1d8f1c
#include "IMdkit.h"
Packit Service 1d8f1c
#include "Xi18n.h"
Packit Service 1d8f1c
#include "FrameMgr.h"
Packit Service 1d8f1c
#include "XimFunc.h"
Packit Service 1d8f1c
Packit Service 1d8f1c
Xi18nClient *_Xi18nFindClient (Xi18n, CARD16);
Packit Service 1d8f1c
void _Xi18nInitOffsetCache (Xi18nOffsetCache *);
Packit Service 1d8f1c
Packit Service 1d8f1c
int
Packit Service 1d8f1c
_Xi18nNeedSwap (Xi18n i18n_core, CARD16 connect_id)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    CARD8 im_byteOrder = i18n_core->address.im_byteOrder;
Packit Service 1d8f1c
    Xi18nClient *client = _Xi18nFindClient (i18n_core, connect_id);
Packit Service 1d8f1c
Packit Service 1d8f1c
    return (client->byte_order != im_byteOrder);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
Xi18nClient *_Xi18nNewClient(Xi18n i18n_core)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    static CARD16 connect_id = 0;
Packit Service 1d8f1c
    int new_connect_id;
Packit Service 1d8f1c
    Xi18nClient *client;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (i18n_core->address.free_clients)
Packit Service 1d8f1c
    {
Packit Service 1d8f1c
        client = i18n_core->address.free_clients;
Packit Service 1d8f1c
        i18n_core->address.free_clients = client->next;
Packit Service 1d8f1c
	new_connect_id = client->connect_id;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else
Packit Service 1d8f1c
    {
Packit Service 1d8f1c
        client = (Xi18nClient *) malloc (sizeof (Xi18nClient));
Packit Service 1d8f1c
	new_connect_id = ++connect_id;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    /*endif*/
Packit Service 1d8f1c
    memset (client, 0, sizeof (Xi18nClient));
Packit Service 1d8f1c
    client->connect_id = new_connect_id;
Packit Service 1d8f1c
    client->pending = (XIMPending *) NULL;
Packit Service 1d8f1c
    client->sync = False;
Packit Service 1d8f1c
    client->byte_order = '?'; 	/* initial value */
Packit Service 1d8f1c
    memset (&client->pending, 0, sizeof (XIMPending *));
Packit Service 1d8f1c
    _Xi18nInitOffsetCache (&client->offset_cache);
Packit Service 1d8f1c
    client->next = i18n_core->address.clients;
Packit Service 1d8f1c
    i18n_core->address.clients = client;
Packit Service 1d8f1c
Packit Service 1d8f1c
    return (Xi18nClient *) client;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
Xi18nClient *_Xi18nFindClient (Xi18n i18n_core, CARD16 connect_id)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    Xi18nClient *client = i18n_core->address.clients;
Packit Service 1d8f1c
Packit Service 1d8f1c
    while (client)
Packit Service 1d8f1c
    {
Packit Service 1d8f1c
        if (client->connect_id == connect_id)
Packit Service 1d8f1c
            return client;
Packit Service 1d8f1c
        /*endif*/
Packit Service 1d8f1c
        client = client->next;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    /*endwhile*/
Packit Service 1d8f1c
    return NULL;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void _Xi18nDeleteClient (Xi18n i18n_core, CARD16 connect_id)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    Xi18nClient *target = _Xi18nFindClient (i18n_core, connect_id);
Packit Service 1d8f1c
    Xi18nClient *ccp;
Packit Service 1d8f1c
    Xi18nClient *ccp0;
Packit Service 1d8f1c
Packit Service 1d8f1c
    for (ccp = i18n_core->address.clients, ccp0 = NULL;
Packit Service 1d8f1c
         ccp != NULL;
Packit Service 1d8f1c
         ccp0 = ccp, ccp = ccp->next)
Packit Service 1d8f1c
    {
Packit Service 1d8f1c
        if (ccp == target)
Packit Service 1d8f1c
        {
Packit Service 1d8f1c
            if (ccp0 == NULL)
Packit Service 1d8f1c
                i18n_core->address.clients = ccp->next;
Packit Service 1d8f1c
            else
Packit Service 1d8f1c
                ccp0->next = ccp->next;
Packit Service 1d8f1c
            /*endif*/
Packit Service 1d8f1c
            /* put it back to free list */
Packit Service 1d8f1c
            target->next = i18n_core->address.free_clients;
Packit Service 1d8f1c
            i18n_core->address.free_clients = target;
Packit Service 1d8f1c
            return;
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        /*endif*/
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    /*endfor*/
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void _Xi18nSendMessage (XIMS ims,
Packit Service 1d8f1c
                        CARD16 connect_id,
Packit Service 1d8f1c
                        CARD8 major_opcode,
Packit Service 1d8f1c
                        CARD8 minor_opcode,
Packit Service 1d8f1c
                        unsigned char *data,
Packit Service 1d8f1c
                        long length)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    Xi18n i18n_core = ims->protocol;
Packit Service 1d8f1c
    FrameMgr fm;
Packit Service 1d8f1c
    extern XimFrameRec packet_header_fr[];
Packit Service 1d8f1c
    unsigned char *reply_hdr = NULL;
Packit Service 1d8f1c
    int header_size;
Packit Service 1d8f1c
    unsigned char *reply = NULL;
Packit Service 1d8f1c
    unsigned char *replyp;
Packit Service 1d8f1c
    int reply_length;
Packit Service 1d8f1c
    long p_len = length/4;
Packit Service 1d8f1c
Packit Service 1d8f1c
    fm = FrameMgrInit (packet_header_fr,
Packit Service 1d8f1c
                       NULL,
Packit Service 1d8f1c
                       _Xi18nNeedSwap (i18n_core, connect_id));
Packit Service 1d8f1c
Packit Service 1d8f1c
    header_size = FrameMgrGetTotalSize (fm);
Packit Service 1d8f1c
    reply_hdr = (unsigned char *) malloc (header_size);
Packit Service 1d8f1c
    if (reply_hdr == NULL)
Packit Service 1d8f1c
    {
Packit Service 1d8f1c
        _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0);
Packit Service 1d8f1c
        FrameMgrFree (fm);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    /*endif*/
Packit Service 1d8f1c
    FrameMgrSetBuffer (fm, reply_hdr);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* put data */
Packit Service 1d8f1c
    FrameMgrPutToken (fm, major_opcode);
Packit Service 1d8f1c
    FrameMgrPutToken (fm, minor_opcode);
Packit Service 1d8f1c
    FrameMgrPutToken (fm, p_len);
Packit Service 1d8f1c
Packit Service 1d8f1c
    reply_length = header_size + length;
Packit Service 1d8f1c
    reply = (unsigned char *) malloc (reply_length);
Packit Service 1d8f1c
    replyp = reply;
Packit Service 1d8f1c
    memmove (reply, reply_hdr, header_size);
Packit Service 1d8f1c
    replyp += header_size;
Packit Service 1d8f1c
    if (length > 0 && data != NULL)
Packit Service 1d8f1c
        memmove (replyp, data, length);
Packit Service 1d8f1c
Packit Service 1d8f1c
    i18n_core->methods.send (ims, connect_id, reply, reply_length);
Packit Service 1d8f1c
Packit Service 1d8f1c
    XFree (reply);
Packit Service 1d8f1c
    XFree (reply_hdr);
Packit Service 1d8f1c
    FrameMgrFree (fm);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void _Xi18nSendTriggerKey (XIMS ims, CARD16 connect_id)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    Xi18n i18n_core = ims->protocol;
Packit Service 1d8f1c
    FrameMgr fm;
Packit Service 1d8f1c
    extern XimFrameRec register_triggerkeys_fr[];
Packit Service 1d8f1c
    XIMTriggerKey *on_keys = i18n_core->address.on_keys.keylist;
Packit Service 1d8f1c
    XIMTriggerKey *off_keys = i18n_core->address.off_keys.keylist;
Packit Service 1d8f1c
    int on_key_num = i18n_core->address.on_keys.count_keys;
Packit Service 1d8f1c
    int off_key_num = i18n_core->address.off_keys.count_keys;
Packit Service 1d8f1c
    unsigned char *reply = NULL;
Packit Service 1d8f1c
    register int i, total_size;
Packit Service 1d8f1c
    CARD16 im_id;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (on_key_num == 0  &&  off_key_num == 0)
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    /*endif*/
Packit Service 1d8f1c
    
Packit Service 1d8f1c
    fm = FrameMgrInit (register_triggerkeys_fr,
Packit Service 1d8f1c
                       NULL,
Packit Service 1d8f1c
                       _Xi18nNeedSwap (i18n_core, connect_id));
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* set iteration count for on-keys list */
Packit Service 1d8f1c
    FrameMgrSetIterCount (fm, on_key_num);
Packit Service 1d8f1c
    /* set iteration count for off-keys list */
Packit Service 1d8f1c
    FrameMgrSetIterCount (fm, off_key_num);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* get total_size */
Packit Service 1d8f1c
    total_size = FrameMgrGetTotalSize (fm);
Packit Service 1d8f1c
Packit Service 1d8f1c
    reply = (unsigned char *) malloc (total_size);
Packit Service 1d8f1c
    if (!reply) {
Packit Service 1d8f1c
        FrameMgrFree (fm);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    /*endif*/
Packit Service 1d8f1c
    memset (reply, 0, total_size);
Packit Service 1d8f1c
    FrameMgrSetBuffer (fm, reply);
Packit Service 1d8f1c
Packit Service 1d8f1c
    /* Right now XIM_OPEN_REPLY hasn't been sent to this new client, so
Packit Service 1d8f1c
       the input-method-id is still invalid, and should be set to zero...
Packit Service 1d8f1c
       Reter to $(XC)/lib/X11/imDefLkup.c:_XimRegisterTriggerKeysCallback
Packit Service 1d8f1c
     */
Packit Service 1d8f1c
    im_id = 0;
Packit Service 1d8f1c
    FrameMgrPutToken (fm, im_id);  /* input-method-id */
Packit Service 1d8f1c
    for (i = 0;  i < on_key_num;  i++)
Packit Service 1d8f1c
    {
Packit Service 1d8f1c
        FrameMgrPutToken (fm, on_keys[i].keysym);
Packit Service 1d8f1c
        FrameMgrPutToken (fm, on_keys[i].modifier);
Packit Service 1d8f1c
        FrameMgrPutToken (fm, on_keys[i].modifier_mask);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    /*endfor*/
Packit Service 1d8f1c
    for (i = 0;  i < off_key_num;  i++)
Packit Service 1d8f1c
    {
Packit Service 1d8f1c
        FrameMgrPutToken (fm, off_keys[i].keysym);
Packit Service 1d8f1c
        FrameMgrPutToken (fm, off_keys[i].modifier);
Packit Service 1d8f1c
        FrameMgrPutToken (fm, off_keys[i].modifier_mask);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    /*endfor*/
Packit Service 1d8f1c
    _Xi18nSendMessage (ims,
Packit Service 1d8f1c
                       connect_id,
Packit Service 1d8f1c
                       XIM_REGISTER_TRIGGERKEYS,
Packit Service 1d8f1c
                       0,
Packit Service 1d8f1c
                       reply,
Packit Service 1d8f1c
                       total_size);
Packit Service 1d8f1c
    FrameMgrFree (fm);
Packit Service 1d8f1c
    XFree(reply);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
void _Xi18nSetEventMask (XIMS ims,
Packit Service 1d8f1c
                         CARD16 connect_id,
Packit Service 1d8f1c
                         CARD16 im_id,
Packit Service 1d8f1c
                         CARD16 ic_id,
Packit Service 1d8f1c
                         CARD32 forward_mask,
Packit Service 1d8f1c
                         CARD32 sync_mask)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    Xi18n i18n_core = ims->protocol;
Packit Service 1d8f1c
    FrameMgr fm;
Packit Service 1d8f1c
    extern XimFrameRec set_event_mask_fr[];
Packit Service 1d8f1c
    unsigned char *reply = NULL;
Packit Service 1d8f1c
    register int total_size;
Packit Service 1d8f1c
Packit Service 1d8f1c
    fm = FrameMgrInit (set_event_mask_fr,
Packit Service 1d8f1c
                       NULL,
Packit Service 1d8f1c
                       _Xi18nNeedSwap (i18n_core, connect_id));
Packit Service 1d8f1c
Packit Service 1d8f1c
    total_size = FrameMgrGetTotalSize (fm);
Packit Service 1d8f1c
    reply = (unsigned char *) malloc (total_size);
Packit Service 1d8f1c
    if (!reply) {
Packit Service 1d8f1c
        FrameMgrFree (fm);
Packit Service 1d8f1c
        return;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    /*endif*/
Packit Service 1d8f1c
    memset (reply, 0, total_size);
Packit Service 1d8f1c
    FrameMgrSetBuffer (fm, reply);
Packit Service 1d8f1c
Packit Service 1d8f1c
    FrameMgrPutToken (fm, im_id); 	/* input-method-id */
Packit Service 1d8f1c
    FrameMgrPutToken (fm, ic_id); 	/* input-context-id */
Packit Service 1d8f1c
    FrameMgrPutToken (fm, forward_mask);
Packit Service 1d8f1c
    FrameMgrPutToken (fm, sync_mask);
Packit Service 1d8f1c
Packit Service 1d8f1c
    _Xi18nSendMessage (ims,
Packit Service 1d8f1c
                       connect_id,
Packit Service 1d8f1c
                       XIM_SET_EVENT_MASK,
Packit Service 1d8f1c
                       0,
Packit Service 1d8f1c
                       reply,
Packit Service 1d8f1c
                       total_size);
Packit Service 1d8f1c
Packit Service 1d8f1c
    FrameMgrFree (fm);
Packit Service 1d8f1c
    XFree(reply);
Packit Service 1d8f1c
}