Blame util/IMdkit/i18nUtil.c

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