|
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 |
}
|