diff -ruN xwin86/IMdkit/FrameMgr.c xwin/IMdkit/FrameMgr.c --- xwin86/IMdkit/FrameMgr.c Thu Jan 1 09:00:00 1970 +++ xwin/IMdkit/FrameMgr.c Fri Dec 14 01:14:54 2001 @@ -0,0 +1,2453 @@ +/****************************************************************** +Copyright 1993, 1994 by Digital Equipment Corporation, Maynard, Massachusetts, + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + + Author: Hiroyuki Miyamoto Digital Equipment Corporation + miyamoto@jrd.dec.com + + This version tidied and debugged by Steve Underwood May 1999 + +******************************************************************/ + +#include +#include +#include "FrameMgr.h" + +/* Convenient macro */ + +#define _UNIT(n) ((int)(n) & 0xFF) +#define _NUMBER(n) (((int)(n) >> 8) & 0xFF) + +/* For byte swapping */ + +#define Swap16(p, n) ((p)->byte_swap ? \ +(((n) << 8 & 0xFF00) | \ + ((n) >> 8 & 0xFF) \ +) : n) +#define Swap32(p, n) ((p)->byte_swap ? \ + (((n) << 24 & 0xFF000000) | \ + ((n) << 8 & 0xFF0000) | \ + ((n) >> 8 & 0xFF00) | \ + ((n) >> 24 & 0xFF) \ + ) : n) +#define Swap64(p, n) ((p)->byte_swap ? \ + (((n) << 56 & 0xFF00000000000000) | \ + ((n) << 40 & 0xFF000000000000) | \ + ((n) << 24 & 0xFF0000000000) | \ + ((n) << 8 & 0xFF00000000) | \ + ((n) >> 8 & 0xFF000000) | \ + ((n) >> 24 & 0xFF0000) | \ + ((n) >> 40 & 0xFF00) | \ + ((n) >> 56 & 0xFF) \ + ) : n) + +/* Type definition */ + +typedef struct _Iter *Iter; + +typedef struct _FrameInst *FrameInst; + +typedef union +{ + int num; /* For BARRAY */ + FrameInst fi; /* For POINTER */ + Iter iter; /* For ITER */ +} ExtraDataRec, *ExtraData; + +typedef struct _Chain +{ + ExtraDataRec d; + int frame_no; + struct _Chain *next; +} ChainRec, *Chain; + +typedef struct _ChainMgr +{ + Chain top; + Chain tail; +} ChainMgrRec, *ChainMgr; + +typedef struct _ChainIter +{ + Chain cur; +} ChainIterRec, *ChainIter; + +typedef struct _FrameIter +{ + Iter iter; + Bool counting; + unsigned int counter; + int end; + struct _FrameIter* next; +} FrameIterRec, *FrameIter; + +typedef struct _FrameInst +{ + XimFrame template; + ChainMgrRec cm; + int cur_no; +} FrameInstRec; + +typedef void (*IterStartWatchProc) (Iter it, void *client_data); + +typedef struct _Iter +{ + XimFrame template; + int max_count; + Bool allow_expansion; + ChainMgrRec cm; + int cur_no; + IterStartWatchProc start_watch_proc; + void *client_data; + Bool start_counter; +} IterRec; + +typedef struct _FrameMgr +{ + XimFrame frame; + FrameInst fi; + char *area; + int idx; + Bool byte_swap; + int total_size; + FrameIter iters; +} FrameMgrRec; + +typedef union +{ + int num; /* For BARRAY and PAD */ + struct + { /* For COUNTER_* */ + Iter iter; + Bool is_byte_len; + } counter; +} XimFrameTypeInfoRec, *XimFrameTypeInfo; + +/* Special values */ +#define NO_VALUE -1 +#define NO_VALID_FIELD -2 + +static FrameInst FrameInstInit(XimFrame frame); +static void FrameInstFree(FrameInst fi); +static XimFrameType FrameInstGetNextType(FrameInst fi, XimFrameTypeInfo info); +static XimFrameType FrameInstPeekNextType(FrameInst fi, XimFrameTypeInfo info); +static FmStatus FrameInstSetSize(FrameInst fi, int num); +static FmStatus FrameInstSetIterCount(FrameInst fi, int num); +static int FrameInstGetTotalSize(FrameInst fi); +static void FrameInstReset(FrameInst fi); + +static Iter IterInit(XimFrame frame, int count); +static void IterFree(Iter it); +static int FrameInstGetSize(FrameInst fi); +static int IterGetSize(Iter it); +static XimFrameType IterGetNextType(Iter it, XimFrameTypeInfo info); +static XimFrameType IterPeekNextType(Iter it, XimFrameTypeInfo info); +static FmStatus IterSetSize(Iter it, int num); +static FmStatus IterSetIterCount(Iter it, int num); +static int IterGetTotalSize(Iter it); +static void IterReset(Iter it); +static Bool IterIsLoopEnd(Iter it, Bool* myself); +static void IterSetStartWatch(Iter it, IterStartWatchProc proc, void* client_data); +static void _IterStartWatch(Iter it, void* client_data); + +static ExtraData ChainMgrGetExtraData(ChainMgr cm, int frame_no); +static ExtraData ChainMgrSetData(ChainMgr cm, int frame_no, + ExtraDataRec data); +static Bool ChainIterGetNext(ChainIter ci, int* frame_no, ExtraData d); +static int _FrameInstIncrement(XimFrame frame, int count); +static int _FrameInstDecrement(XimFrame frame, int count); +static int _FrameInstGetItemSize(FrameInst fi, int cur_no); +static Bool FrameInstIsIterLoopEnd(FrameInst fi); + +static FrameIter _FrameMgrAppendIter(FrameMgr fm, Iter it, int end); +static FrameIter _FrameIterCounterIncr(FrameIter fitr, int i); +static void _FrameMgrRemoveIter(FrameMgr fm, FrameIter it); +static Bool _FrameMgrIsIterLoopEnd(FrameMgr fm); +static Bool _FrameMgrProcessPadding(FrameMgr fm, FmStatus* status); + +#define IterGetIterCount(it) ((it)->allow_expansion ? \ +NO_VALUE : (it)->max_count) + +#define IterFixIteration(it) ((it)->allow_expansion = False) + +#define IterSetStarter(it) ((it)->start_counter = True) + +#define ChainMgrInit(cm) (cm)->top = (cm)->tail = NULL +#define ChainMgrFree(cm) \ +{ \ + Chain tmp; \ + Chain cur = (cm)->top; \ + \ + while (cur) \ + { \ + tmp = cur->next; \ + Xfree (cur); \ + cur = tmp; \ + } \ +} + +#define ChainIterInit(ci, cm) \ +{ \ + (ci)->cur = (cm)->top; \ +} + +/* ChainIterFree has nothing to do. */ +#define ChainIterFree(ci) + +#define FrameInstIsEnd(fi) ((fi)->template[(fi)->cur_no].type == EOL) + +FrameMgr FrameMgrInit (XimFrame frame, char* area, Bool byte_swap) +{ + FrameMgr fm; + + fm = (FrameMgr) Xmalloc (sizeof (FrameMgrRec)); + + fm->frame = frame; + fm->fi = FrameInstInit (frame); + fm->area = (char *) area; + fm->idx = 0; + fm->byte_swap = byte_swap; + fm->total_size = NO_VALUE; + fm->iters = NULL; + + return fm; +} + +void FrameMgrInitWithData (FrameMgr fm, + XimFrame frame, + void * area, + Bool byte_swap) +{ + fm->frame = frame; + fm->fi = FrameInstInit (frame); + fm->area = (char *) area; + fm->idx = 0; + fm->byte_swap = byte_swap; + fm->total_size = NO_VALUE; +} + +void FrameMgrFree (FrameMgr fm) +{ + FrameInstFree (fm->fi); + Xfree (fm); +} + +FmStatus FrameMgrSetBuffer (FrameMgr fm, void* area) +{ + if (fm->area) + return FmBufExist; + fm->area = (char *) area; + return FmSuccess; +} + +FmStatus _FrameMgrPutToken (FrameMgr fm, void *data, int data_size) +{ + XimFrameType type; + XimFrameTypeInfoRec info; + + if (fm->total_size != NO_VALUE && fm->idx >= fm->total_size) + return FmNoMoreData; + /*endif*/ + + type = FrameInstGetNextType(fm->fi, &info); + + if (type & COUNTER_MASK) + { + unsigned long input_length; + + if (info.counter.is_byte_len) + { + if ((input_length = IterGetTotalSize (info.counter.iter)) + == NO_VALUE) + { + return FmCannotCalc; + } + /*endif*/ + } + else + { + if ((input_length = IterGetIterCount (info.counter.iter)) + == NO_VALUE) + { + return FmCannotCalc; + } + /*endif*/ + } + /*endif*/ + switch (type) + { + case COUNTER_BIT8: + *(CARD8 *) (fm->area + fm->idx) = input_length; + fm->idx++; + break; + + case COUNTER_BIT16: + *(CARD16 *) (fm->area + fm->idx) = Swap16 (fm, input_length); + fm->idx += 2; + break; + + case COUNTER_BIT32: + *(CARD32 *) (fm->area + fm->idx) = Swap32 (fm, input_length); + fm->idx += 4; + break; + +#if defined(_NEED64BIT) + case COUNTER_BIT64: + *(CARD64 *) (fm->area + fm->idx) = Swap64 (fm, input_length); + fm->idx += 8; + break; +#endif + default: + break; + } + /*endswitch*/ + _FrameMgrPutToken(fm, data, data_size); + return FmSuccess; + } + /*endif*/ + + switch (type) + { + case BIT8: + if (data_size == sizeof (unsigned char)) + { + unsigned long num = *(unsigned char *) data; + *(CARD8 *) (fm->area + fm->idx) = num; + } + else if (data_size == sizeof (unsigned short)) + { + unsigned long num = *(unsigned short *) data; + *(CARD8 *) (fm->area + fm->idx) = num; + } + else if (data_size == sizeof (unsigned int)) + { + unsigned long num = *(unsigned int *) data; + *(CARD8 *) (fm->area + fm->idx) = num; + } + else if (data_size == sizeof (unsigned long)) + { + unsigned long num = *(unsigned long *) data; + *(CARD8 *) (fm->area + fm->idx) = num; + } + else + { + ; /* Should never be reached */ + } + /*endif*/ + fm->idx++; + return FmSuccess; + + case BIT16: + if (data_size == sizeof (unsigned char)) + { + unsigned long num = *(unsigned char *) data; + *(CARD16*)(fm->area + fm->idx) = Swap16 (fm, num); + } + else if (data_size == sizeof (unsigned short)) + { + unsigned long num = *(unsigned short *) data; + *(CARD16 *) (fm->area + fm->idx) = Swap16 (fm, num); + } + else if (data_size == sizeof (unsigned int)) + { + unsigned long num = *(unsigned int *) data; + *(CARD16 *) (fm->area + fm->idx) = Swap16 (fm, num); + } + else if (data_size == sizeof (unsigned long)) + { + unsigned long num = *(unsigned long *) data; + *(CARD16 *) (fm->area + fm->idx) = Swap16 (fm, num); + } + else + { + ; /* Should never reached */ + } + /*endif*/ + fm->idx += 2; + return FmSuccess; + + case BIT32: + if (data_size == sizeof (unsigned char)) + { + unsigned long num = *(unsigned char *) data; + *(CARD32 *) (fm->area + fm->idx) = Swap32 (fm, num); + } + else if (data_size == sizeof (unsigned short)) + { + unsigned long num = *(unsigned short *) data; + *(CARD32 *) (fm->area + fm->idx) = Swap32 (fm, num); + } + else if (data_size == sizeof (unsigned int)) + { + unsigned long num = *(unsigned int *) data; + *(CARD32 *) (fm->area + fm->idx) = Swap32 (fm, num); + } + else if (data_size == sizeof (unsigned long)) + { + unsigned long num = *(unsigned long *) data; + *(CARD32 *) (fm->area + fm->idx) = Swap32 (fm, num); + } + else + { + ; /* Should never reached */ + } + /*endif*/ + fm->idx += 4; + return FmSuccess; + +#if defined(_NEED64BIT) + case BIT64: + if (data_size == sizeof (unsigned char)) + { + unsigned long num = *(unsigned char *) data; + *(CARD64 *) (fm->area + fm->idx) = Swap64 (fm, num); + } + else if (data_size == sizeof (unsigned short)) + { + unsigned long num = *(unsigned short *) data; + *(CARD64 *) (fm->area + fm->idx) = Swap64 (fm, num); + } + else if (data_size == sizeof (unsigned int)) + { + unsigned long num = *(unsigned int *) data; + *(CARD64 *) (fm->area + fm->idx) = Swap64 (fm, num); + } + else if (data_size == sizeof (unsigned long)) + { + unsigned long num = *(unsigned long *) data; + *(CARD64 *) (fm->area + fm->idx) = Swap64 (fm, num); + } + else + { + ; /* Should never reached */ + } + /*endif*/ + fm->idx += 4; + return FmSuccess; +#endif + + case BARRAY: + if (info.num == NO_VALUE) + return FmInvalidCall; + /*endif*/ + if (info.num > 0) + { + bcopy (*(char **) data, fm->area + fm->idx, info.num); + fm->idx += info.num; + } + /*endif*/ + return FmSuccess; + + case PADDING: + if (info.num == NO_VALUE) + return FmInvalidCall; + /*endif*/ + fm->idx += info.num; + return _FrameMgrPutToken(fm, data, data_size); + + case ITER: + return FmInvalidCall; + + case EOL: + return FmEOD; + default: + break; + } + /*endswitch*/ + return (FmStatus) NULL; /* Should never be reached */ +} + +FmStatus _FrameMgrGetToken (FrameMgr fm , void* data, int data_size) +{ + XimFrameType type; + static XimFrameTypeInfoRec info; /* memory */ + FrameIter fitr; + + if (fm->total_size != NO_VALUE && fm->idx >= fm->total_size) + return FmNoMoreData; + /*endif*/ + + type = FrameInstGetNextType(fm->fi, &info); + + if (type & COUNTER_MASK) + { + int end=0; + FrameIter client_data; + + type &= ~COUNTER_MASK; + switch (type) + { + case BIT8: + end = *(CARD8 *) (fm->area + fm->idx); + break; + + case BIT16: + end = Swap16 (fm, *(CARD16 *) (fm->area + fm->idx)); + break; + + case BIT32: + end = Swap32 (fm, *(CARD32 *) (fm->area + fm->idx)); + break; + +#if defined(_NEED64BIT) + case BIT64: + end = Swap64 (fm, *(CARD64 *) (fm->area + fm->idx)); + break; +#endif + default: + break; + } + /*endswitch*/ + + if ((client_data = _FrameMgrAppendIter (fm, info.counter.iter, end))) + { + IterSetStarter (info.counter.iter); + IterSetStartWatch (info.counter.iter, + _IterStartWatch, + (void *) client_data); + } + /*endif*/ + } + /*endif*/ + + type &= ~COUNTER_MASK; + switch (type) + { + case BIT8: + if (data_size == sizeof (unsigned char)) + { + *(unsigned char*) data = *(CARD8 *) (fm->area + fm->idx); + } + else if (data_size == sizeof (unsigned short)) + { + *(unsigned short *) data = *(CARD8 *) (fm->area + fm->idx); + } + else if (data_size == sizeof (unsigned int)) + { + *(unsigned int *) data = *(CARD8 *) (fm->area + fm->idx); + } + else if (data_size == sizeof (unsigned long)) + { + *(unsigned long *) data = *(CARD8 *) (fm->area + fm->idx); + } + else + { + ; /* Should never reached */ + } + /*endif*/ + fm->idx++; + if ((fitr = _FrameIterCounterIncr (fm->iters, 1/*BIT8*/))) + _FrameMgrRemoveIter (fm, fitr); + /*endif*/ + return FmSuccess; + + case BIT16: + if (data_size == sizeof (unsigned char)) + { + *(unsigned char *) data = + Swap16 (fm, *(CARD16 *) (fm->area + fm->idx)); + } + else if (data_size == sizeof (unsigned short)) + { + *(unsigned short *) data = + Swap16 (fm, *(CARD16 *) (fm->area + fm->idx)); + } + else if (data_size == sizeof (unsigned int)) + { + *(unsigned int *) data = + Swap16 (fm, *(CARD16 *) (fm->area + fm->idx)); + } + else if (data_size == sizeof (unsigned long)) + { + *(unsigned long *) data = + Swap16 (fm, *(CARD16 *) (fm->area + fm->idx)); + } + else + { + ; /* Should never reached */ + } + /*endif*/ + fm->idx += 2; + if ((fitr = _FrameIterCounterIncr (fm->iters, 2/*BIT16*/))) + _FrameMgrRemoveIter(fm, fitr); + /*endif*/ + return FmSuccess; + + case BIT32: + if (data_size == sizeof (unsigned char)) + { + *(unsigned char *) data = + Swap32 (fm, *(CARD32 *) (fm->area + fm->idx)); + } + else if (data_size == sizeof (unsigned short)) + { + *(unsigned short *) data = + Swap32 (fm, *(CARD32 *) (fm->area + fm->idx)); + } + else if (data_size == sizeof (unsigned int)) + { + *(unsigned int *) data = + Swap32 (fm, *(CARD32 *) (fm->area + fm->idx)); + } + else if (data_size == sizeof (unsigned long)) + { + *(unsigned long *) data = + Swap32 (fm, *(CARD32 *) (fm->area + fm->idx)); + } + else + { + ; /* Should never reached */ + } + /*endif*/ + fm->idx += 4; + if ((fitr = _FrameIterCounterIncr (fm->iters, 4/*BIT32*/))) + _FrameMgrRemoveIter (fm, fitr); + /*endif*/ + return FmSuccess; + +#if defined(_NEED64BIT) + case BIT64: + if (data_size == sizeof (unsigned char)) + { + *(unsigned char *) data = + Swap64 (fm, *(CARD64 *) (fm->area + fm->idx)); + } + else if (data_size == sizeof (unsigned short)) + { + *(unsigned short *) data = + Swap64 (fm, *(CARD64 *) (fm->area + fm->idx)); + } + else if (data_size == sizeof (unsigned int)) + { + *(unsigned int *) data = + Swap64 (fm, *(CARD64 *) (fm->area + fm->idx)); + } + else if (data_size == sizeof (unsigned long)) + { + *(unsigned long *) data = + Swap64 (fm, *(CARD64 *) (fm->area + fm->idx)); + } + else + { + ; /* Should never reached */ + } + /*endif*/ + fm->idx += 8; + if ((fitr = _FrameIterCounterIncr (fm->iters, 8/*BIT64*/))) + _FrameMgrRemoveIter (fm, fitr); + /*endif*/ + return FmSuccess; +#endif + + case BARRAY: + if (info.num == NO_VALUE) + return FmInvalidCall; + /*endif*/ + if (info.num > 0) + { + *(char **) data = fm->area + fm->idx; + + fm->idx += info.num; + if ((fitr = _FrameIterCounterIncr (fm->iters, info.num))) + _FrameMgrRemoveIter (fm, fitr); + /*endif*/ + } + else + { + *(char **) data = NULL; + } + /*endif*/ + return FmSuccess; + + case PADDING: + if (info.num == NO_VALUE) + return FmInvalidCall; + /*endif*/ + fm->idx += info.num; + if ((fitr = _FrameIterCounterIncr (fm->iters, info.num))) + _FrameMgrRemoveIter (fm, fitr); + /*endif*/ + return _FrameMgrGetToken (fm, data, data_size); + + case ITER: + return FmInvalidCall; /* if comes here, it's a bug! */ + + case EOL: + return FmEOD; + default: + break; + } + /*endswitch*/ + return (FmStatus) NULL; /* Should never be reached */ +} + +FmStatus FrameMgrSetSize (FrameMgr fm, int barray_size) +{ + if (FrameInstSetSize (fm->fi, barray_size) == FmSuccess) + return FmSuccess; + /*endif*/ + return FmNoMoreData; +} + +FmStatus FrameMgrSetIterCount (FrameMgr fm, int count) +{ + if (FrameInstSetIterCount (fm->fi, count) == FmSuccess) + return FmSuccess; + /*endif*/ + return FmNoMoreData; +} + +FmStatus FrameMgrSetTotalSize (FrameMgr fm, int total_size) +{ + fm->total_size = total_size; + return FmSuccess; +} + +int FrameMgrGetTotalSize (FrameMgr fm) +{ + return FrameInstGetTotalSize (fm->fi); +} + +int FrameMgrGetSize (FrameMgr fm) +{ + register int ret_size; + + ret_size = FrameInstGetSize (fm->fi); + if (ret_size == NO_VALID_FIELD) + return NO_VALUE; + /*endif*/ + return ret_size; +} + +FmStatus FrameMgrSkipToken (FrameMgr fm, int skip_count) +{ + XimFrameType type; + XimFrameTypeInfoRec info; + register int i; + + if (fm->total_size != NO_VALUE && fm->idx >= fm->total_size) + return FmNoMoreData; + /*endif*/ + for (i = 0; i < skip_count; i++) + { + type = FrameInstGetNextType (fm->fi, &info); + type &= ~COUNTER_MASK; + + switch (type) + { + case BIT8: + fm->idx++; + break; + + case BIT16: + fm->idx += 2; + break; + + case BIT32: + fm->idx += 4; + break; + + case BIT64: + fm->idx += 8; + break; + + case BARRAY: + if (info.num == NO_VALUE) + return FmInvalidCall; + /*endif*/ + fm->idx += info.num; + break; + + case PADDING: + if (info.num == NO_VALUE) + return FmInvalidCall; + /*endif*/ + fm->idx += info.num; + return FrameMgrSkipToken (fm, skip_count); + + case ITER: + return FmInvalidCall; + + case EOL: + return FmEOD; + default: + break; + } + /*endswitch*/ + } + /*endfor*/ + return FmSuccess; +} + +void FrameMgrReset (FrameMgr fm) +{ + fm->idx = 0; + FrameInstReset (fm->fi); +} + +Bool FrameMgrIsIterLoopEnd (FrameMgr fm, FmStatus* status) +{ + do + { + if (_FrameMgrIsIterLoopEnd (fm)) + return True; + /*endif*/ + } + while (_FrameMgrProcessPadding (fm, status)); + + return False; +} + + +/* Internal routines */ + +static Bool _FrameMgrIsIterLoopEnd (FrameMgr fm) +{ + return FrameInstIsIterLoopEnd (fm->fi); +} + +static Bool _FrameMgrProcessPadding (FrameMgr fm, FmStatus* status) +{ + XimFrameTypeInfoRec info; + XimFrameType next_type = FrameInstPeekNextType (fm->fi, &info); + FrameIter fitr; + + if (next_type == PADDING) + { + if (info.num == NO_VALUE) + { + *status = FmInvalidCall; + return True; + } + /*endif*/ + next_type = FrameInstGetNextType (fm->fi, &info); + fm->idx += info.num; + if ((fitr = _FrameIterCounterIncr (fm->iters, info.num))) + _FrameMgrRemoveIter (fm, fitr); + /*endif*/ + *status = FmSuccess; + return True; + } + /*endif*/ + *status = FmSuccess; + return False; +} + +static FrameInst FrameInstInit (XimFrame frame) +{ + FrameInst fi; + + fi = (FrameInst) Xmalloc (sizeof (FrameInstRec)); + + fi->template = frame; + fi->cur_no = 0; + ChainMgrInit (&fi->cm); + return fi; +} + +static void FrameInstFree (FrameInst fi) +{ + ChainIterRec ci; + int frame_no; + ExtraDataRec d; + + ChainIterInit (&ci, &fi->cm); + + while (ChainIterGetNext (&ci, &frame_no, &d)) + { + register XimFrameType type; + type = fi->template[frame_no].type; + if (type == ITER) + { + if (d.iter) + IterFree (d.iter); + /*endif*/ + } + else if (type == POINTER) + { + if (d.fi) + FrameInstFree (d.fi); + /*endif*/ + } + /*endif*/ + } + /*endwhile*/ + ChainIterFree (&ci); + ChainMgrFree (&fi->cm); + Xfree (fi); +} + +static XimFrameType FrameInstGetNextType(FrameInst fi, XimFrameTypeInfo info) +{ + XimFrameType ret_type; + + ret_type = fi->template[fi->cur_no].type; + + switch (ret_type) + { + case BIT8: + case BIT16: + case BIT32: + case BIT64: + case EOL: + fi->cur_no = _FrameInstIncrement(fi->template, fi->cur_no); + break; + + case COUNTER_BIT8: + case COUNTER_BIT16: + case COUNTER_BIT32: + case COUNTER_BIT64: + if (info) + { + register int offset, iter_idx; + + info->counter.is_byte_len = + (((long) fi->template[fi->cur_no].data & 0xFF)) == FmCounterByte; + offset = ((long) fi->template[fi->cur_no].data) >> 8; + iter_idx = fi->cur_no + offset; + if (fi->template[iter_idx].type == ITER) + { + ExtraData d; + ExtraDataRec dr; + + if ((d = ChainMgrGetExtraData (&fi->cm, iter_idx)) == NULL) + { + dr.iter = IterInit (&fi->template[iter_idx + 1], NO_VALUE); + d = ChainMgrSetData (&fi->cm, iter_idx, dr); + } + /*endif*/ + info->counter.iter = d->iter; + } + else + { + /* Should never reach here */ + } + /*endif*/ + } + /*endif*/ + fi->cur_no = _FrameInstIncrement (fi->template, fi->cur_no); + break; + + case BARRAY: + if (info) + { + ExtraData d; + + if ((d = ChainMgrGetExtraData (&fi->cm, fi->cur_no)) == NULL) + info->num = NO_VALUE; + else + info->num = d->num; + /*endif*/ + } + /*endif*/ + fi->cur_no = _FrameInstIncrement (fi->template, fi->cur_no); + break; + + case PADDING: + if (info) + { + register int unit; + register int number; + register int size; + register int i; + + unit = _UNIT ((long) fi->template[fi->cur_no].data); + number = _NUMBER ((long) fi->template[fi->cur_no].data); + + i = fi->cur_no; + size = 0; + while (number > 0) + { + i = _FrameInstDecrement (fi->template, i); + size += _FrameInstGetItemSize (fi, i); + number--; + } + /*endwhile*/ + info->num = (unit - (size%unit))%unit; + } + /*endif*/ + fi->cur_no = _FrameInstIncrement (fi->template, fi->cur_no); + break; + + case ITER: + { + ExtraData d; + ExtraDataRec dr; + XimFrameType sub_type; + + + if ((d = ChainMgrGetExtraData (&fi->cm, fi->cur_no)) == NULL) + { + dr.iter = IterInit (&fi->template[fi->cur_no + 1], NO_VALUE); + d = ChainMgrSetData (&fi->cm, fi->cur_no, dr); + } + /*endif*/ + sub_type = IterGetNextType (d->iter, info); + if (sub_type == EOL) + { + fi->cur_no = _FrameInstIncrement (fi->template, fi->cur_no); + ret_type = FrameInstGetNextType (fi, info); + } + else + { + ret_type = sub_type; + } + /*endif*/ + } + break; + + case POINTER: + { + ExtraData d; + ExtraDataRec dr; + XimFrameType sub_type; + + if ((d = ChainMgrGetExtraData (&fi->cm, fi->cur_no)) == NULL) + { + dr.fi = FrameInstInit (fi->template[fi->cur_no + 1].data); + d = ChainMgrSetData (&fi->cm, fi->cur_no, dr); + } + /*endif*/ + sub_type = FrameInstGetNextType (d->fi, info); + if (sub_type == EOL) + { + fi->cur_no = _FrameInstIncrement (fi->template, fi->cur_no); + ret_type = FrameInstGetNextType (fi, info); + } + else + { + ret_type = sub_type; + } + /*endif*/ + } + break; + default: + break; + } + /*endswitch*/ + return ret_type; +} + +static XimFrameType FrameInstPeekNextType (FrameInst fi, XimFrameTypeInfo info) +{ + XimFrameType ret_type; + + ret_type = fi->template[fi->cur_no].type; + + switch (ret_type) + { + case BIT8: + case BIT16: + case BIT32: + case BIT64: + case EOL: + break; + + case COUNTER_BIT8: + case COUNTER_BIT16: + case COUNTER_BIT32: + case COUNTER_BIT64: + if (info) + { + register int offset; + register int iter_idx; + + info->counter.is_byte_len = + (((long) fi->template[fi->cur_no].data) & 0xFF) == FmCounterByte; + offset = ((long)fi->template[fi->cur_no].data) >> 8; + iter_idx = fi->cur_no + offset; + if (fi->template[iter_idx].type == ITER) + { + ExtraData d; + ExtraDataRec dr; + + if ((d = ChainMgrGetExtraData (&fi->cm, iter_idx)) == NULL) + { + dr.iter = IterInit (&fi->template[iter_idx + 1], NO_VALUE); + d = ChainMgrSetData (&fi->cm, iter_idx, dr); + } + /*endif*/ + info->counter.iter = d->iter; + } + else + { + /* Should not be reached here */ + } + /*endif*/ + } + /*endif*/ + break; + + case BARRAY: + if (info) + { + ExtraData d; + + if ((d = ChainMgrGetExtraData (&fi->cm, fi->cur_no)) == NULL) + info->num = NO_VALUE; + else + info->num = d->num; + /*endif*/ + } + /*endif*/ + break; + + case PADDING: + if (info) + { + register int unit; + register int number; + register int size; + register int i; + + unit = _UNIT ((long) fi->template[fi->cur_no].data); + number = _NUMBER ((long) fi->template[fi->cur_no].data); + + i = fi->cur_no; + size = 0; + while (number > 0) + { + i = _FrameInstDecrement (fi->template, i); + size += _FrameInstGetItemSize (fi, i); + number--; + } + /*endwhile*/ + info->num = (unit - (size%unit))%unit; + } + /*endif*/ + break; + + case ITER: + { + ExtraData d; + ExtraDataRec dr; + XimFrameType sub_type; + + if ((d = ChainMgrGetExtraData (&fi->cm, fi->cur_no)) == NULL) + { + dr.iter = IterInit (&fi->template[fi->cur_no + 1], NO_VALUE); + d = ChainMgrSetData (&fi->cm, fi->cur_no, dr); + } + /*endif*/ + sub_type = IterPeekNextType (d->iter, info); + if (sub_type == EOL) + ret_type = FrameInstPeekNextType (fi, info); + else + ret_type = sub_type; + /*endif*/ + } + break; + + case POINTER: + { + ExtraData d; + ExtraDataRec dr; + XimFrameType sub_type; + + if ((d = ChainMgrGetExtraData (&fi->cm, fi->cur_no)) == NULL) + { + dr.fi = FrameInstInit (fi->template[fi->cur_no + 1].data); + d = ChainMgrSetData (&fi->cm, fi->cur_no, dr); + } + /*endif*/ + sub_type = FrameInstPeekNextType (d->fi, info); + if (sub_type == EOL) + ret_type = FrameInstPeekNextType (fi, info); + else + ret_type = sub_type; + /*endif*/ + default: + break; + } + break; + } + /*endswitch*/ + return ret_type; +} + +static Bool FrameInstIsIterLoopEnd (FrameInst fi) +{ + Bool ret = False; + + if (fi->template[fi->cur_no].type == ITER) + { + ExtraData d = ChainMgrGetExtraData (&fi->cm, fi->cur_no); + Bool yourself; + + if (d) + { + ret = IterIsLoopEnd (d->iter, &yourself); + if (ret && yourself) + fi->cur_no = _FrameInstIncrement (fi->template, fi->cur_no); + /*endif*/ + } + /*endif*/ + } + /*endif*/ + return (ret); +} + +static FrameIter _FrameMgrAppendIter (FrameMgr fm, Iter it, int end) +{ + FrameIter p = fm->iters; + + while (p && p->next) + p = p->next; + /*endwhile*/ + + if (!p) + { + fm->iters = + p = (FrameIter) Xmalloc (sizeof (FrameIterRec)); + } + else + { + p->next = (FrameIter) Xmalloc (sizeof (FrameIterRec)); + p = p->next; + } + /*endif*/ + if (p) + { + p->iter = it; + p->counting = False; + p->counter = 0; + p->end = end; + p->next = NULL; + } + /*endif*/ + return (p); +} + +static void _FrameMgrRemoveIter (FrameMgr fm, FrameIter it) +{ + FrameIter prev; + FrameIter p; + + prev = NULL; + p = fm->iters; + while (p) + { + if (p == it) + { + if (prev) + prev->next = p->next; + else + fm->iters = p->next; + /*endif*/ + Xfree (p); + break; + } + /*endif*/ + prev = p; + p = p->next; + } + /*endwhile*/ +} + +static FrameIter _FrameIterCounterIncr (FrameIter fitr, int i) +{ + FrameIter p = fitr; + + while (p) + { + if (p->counting) + { + p->counter += i; + if (p->counter >= p->end) + { + IterFixIteration (p->iter); + return (p); + } + /*endif*/ + } + /*endif*/ + p = p->next; + } + /*endwhile*/ + return (NULL); +} + +static void _IterStartWatch (Iter it, void *client_data) +{ + FrameIter p = (FrameIter) client_data; + p->counting = True; +} + +static FmStatus FrameInstSetSize (FrameInst fi, int num) +{ + ExtraData d; + ExtraDataRec dr; + XimFrameType type; + register int i; + + i = 0; + while ((type = fi->template[i].type) != EOL) + { + switch (type) + { + case BARRAY: + if ((d = ChainMgrGetExtraData (&fi->cm, i)) == NULL) + { + dr.num = -1; + d = ChainMgrSetData (&fi->cm, i, dr); + } + /*endif*/ + if (d->num == NO_VALUE) + { + d->num = num; + return FmSuccess; + } + /*endif*/ + break; + case ITER: + if ((d = ChainMgrGetExtraData (&fi->cm, i)) == NULL) + { + dr.iter = IterInit (&fi->template[i + 1], NO_VALUE); + d = ChainMgrSetData (&fi->cm, i, dr); + } + /*endif*/ + if (IterSetSize (d->iter, num) == FmSuccess) + return FmSuccess; + /*endif*/ + break; + + case POINTER: + if ((d = ChainMgrGetExtraData(&fi->cm, i)) == NULL) + { + dr.fi = FrameInstInit(fi->template[i + 1].data); + d = ChainMgrSetData(&fi->cm, i, dr); + } + /*endif*/ + if (FrameInstSetSize(d->fi, num) == FmSuccess) + return FmSuccess; + /*endif*/ + break; + default: + break; + } + /*endswitch*/ + i = _FrameInstIncrement(fi->template, i); + } + /*endwhile*/ + return FmNoMoreData; +} + +static int FrameInstGetSize (FrameInst fi) +{ + XimFrameType type; + register int i; + ExtraData d; + ExtraDataRec dr; + int ret_size; + + i = fi->cur_no; + while ((type = fi->template[i].type) != EOL) + { + switch (type) + { + case BARRAY: + if ((d = ChainMgrGetExtraData (&fi->cm, i)) == NULL) + return NO_VALUE; + /*endif*/ + return d->num; + + case ITER: + if ((d = ChainMgrGetExtraData (&fi->cm, i)) == NULL) + { + dr.iter = IterInit (&fi->template[i + 1], NO_VALUE); + d = ChainMgrSetData (&fi->cm, i, dr); + } + /*endif*/ + ret_size = IterGetSize(d->iter); + if (ret_size != NO_VALID_FIELD) + return ret_size; + /*endif*/ + break; + + case POINTER: + if ((d = ChainMgrGetExtraData (&fi->cm, i)) == NULL) + { + dr.fi = FrameInstInit (fi->template[i + 1].data); + d = ChainMgrSetData (&fi->cm, i, dr); + } + /*endif*/ + ret_size = FrameInstGetSize (d->fi); + if (ret_size != NO_VALID_FIELD) + return ret_size; + /*endif*/ + break; + default: + break; + } + /*endswitch*/ + i = _FrameInstIncrement (fi->template, i); + } + /*endwhile*/ + return NO_VALID_FIELD; +} + +static FmStatus FrameInstSetIterCount (FrameInst fi, int num) +{ + ExtraData d; + ExtraDataRec dr; + register int i; + XimFrameType type; + + i = 0; + while ((type = fi->template[i].type) != EOL) + { + switch (type) + { + case ITER: + if ((d = ChainMgrGetExtraData (&fi->cm, i)) == NULL) + { + dr.iter = IterInit (&fi->template[i + 1], num); + (void)ChainMgrSetData (&fi->cm, i, dr); + return FmSuccess; + } + /*endif*/ + if (IterSetIterCount (d->iter, num) == FmSuccess) + return FmSuccess; + /*endif*/ + break; + + case POINTER: + if ((d = ChainMgrGetExtraData (&fi->cm, i)) == NULL) + { + dr.fi = FrameInstInit (fi->template[i + 1].data); + d = ChainMgrSetData (&fi->cm, i, dr); + } + /*endif*/ + if (FrameInstSetIterCount (d->fi, num) == FmSuccess) + return FmSuccess; + /*endif*/ + break; + + default: + break; + } + /*endswitch*/ + i = _FrameInstIncrement (fi->template, i); + } + /*endwhile*/ + return FmNoMoreData; +} + +static int FrameInstGetTotalSize (FrameInst fi) +{ + register int size; + register int i; + + size = 0; + i = 0; + + while (fi->template[i].type != EOL) + { + size += _FrameInstGetItemSize (fi, i); + i = _FrameInstIncrement (fi->template, i); + } + /*endwhile*/ + return size; +} + +static void FrameInstReset (FrameInst fi) +{ + ChainIterRec ci; + int frame_no; + ExtraDataRec d; + + ChainIterInit (&ci, &fi->cm); + + while (ChainIterGetNext (&ci, &frame_no, &d)) + { + register XimFrameType type; + type = fi->template[frame_no].type; + if (type == ITER) + { + if (d.iter) + IterReset (d.iter); + /*endif*/ + } + else if (type == POINTER) + { + if (d.fi) + FrameInstReset (d.fi); + /*endif*/ + } + /*endif*/ + } + /*endwhile*/ + ChainIterFree (&ci); + + fi->cur_no = 0; +} + +static Iter IterInit (XimFrame frame, int count) +{ + Iter it; + register XimFrameType type; + + it = (Iter) Xmalloc (sizeof (IterRec)); + it->template = frame; + it->max_count = (count == NO_VALUE) ? 0 : count; + it->allow_expansion = (count == NO_VALUE); + it->cur_no = 0; + it->start_watch_proc = NULL; + it->client_data = NULL; + it->start_counter = False; + + type = frame->type; + if (type & COUNTER_MASK) + { + /* COUNTER_XXX cannot be an item of a ITER */ + Xfree (it); + return NULL; + } + /*endif*/ + + switch (type) + { + case BIT8: + case BIT16: + case BIT32: + case BIT64: + /* Do nothing */ + break; + + case BARRAY: + case ITER: + case POINTER: + ChainMgrInit (&it->cm); + break; + + default: + Xfree (it); + return NULL; /* This should never occur */ + } + /*endswitch*/ + return it; +} + +static void IterFree (Iter it) +{ + switch (it->template->type) + { + case BARRAY: + ChainMgrFree (&it->cm); + break; + + case ITER: + { + ChainIterRec ci; + int count; + ExtraDataRec d; + + ChainIterInit (&ci, &it->cm); + while (ChainIterGetNext (&ci, &count, &d)) + IterFree (d.iter); + /*endwhile*/ + ChainIterFree (&ci); + ChainMgrFree (&it->cm); + } + break; + + case POINTER: + { + ChainIterRec ci; + int count; + ExtraDataRec dr; + + ChainIterInit (&ci, &it->cm); + while (ChainIterGetNext (&ci, &count, &dr)) + FrameInstFree (dr.fi); + /*endwhile*/ + ChainIterFree (&ci); + ChainMgrFree (&it->cm); + } + break; + + default: + break; + } + /*endswitch*/ + Xfree (it); +} + +static Bool IterIsLoopEnd (Iter it, Bool *myself) +{ + Bool ret = False; + *myself = False; + + if (!it->allow_expansion && (it->cur_no == it->max_count)) + { + *myself = True; + return True; + } + /*endif*/ + + if (it->template->type == POINTER) + { + ExtraData d = ChainMgrGetExtraData (&it->cm, it->cur_no); + if (d) + { + if (FrameInstIsIterLoopEnd (d->fi)) + { + ret = True; + } + else + { + if (FrameInstIsEnd (d->fi)) + { + it->cur_no++; + if (!it->allow_expansion && it->cur_no == it->max_count) + { + *myself = True; + ret = True; + } + /*endif*/ + } + /*endif*/ + } + /*endif*/ + } + /*endif*/ + } + else if (it->template->type == ITER) + { + ExtraData d = ChainMgrGetExtraData (&it->cm, it->cur_no); + if (d) + { + Bool yourself; + + if (IterIsLoopEnd (d->iter, &yourself)) + ret = True; + /*endif*/ + } + /*endif*/ + } + /*endif*/ + + return ret; +} + +static XimFrameType IterGetNextType (Iter it, XimFrameTypeInfo info) +{ + XimFrameType type = it->template->type; + + if (it->start_counter) + { + (*it->start_watch_proc) (it, it->client_data); + it->start_counter = False; + } + /*endif*/ + if (it->cur_no >= it->max_count) + { + if (it->allow_expansion) + it->max_count = it->cur_no + 1; + else + return EOL; + /*endif*/ + } + /*endif*/ + + switch (type) + { + case BIT8: + case BIT16: + case BIT32: + case BIT64: + it->cur_no++; + return type; + + case BARRAY: + if (info) + { + ExtraData d; + + if ((d = ChainMgrGetExtraData (&it->cm, it->cur_no)) == NULL) + info->num = NO_VALUE; + else + info->num = d->num; + /*endif*/ + } + /*endif*/ + it->cur_no++; + return BARRAY; + + case ITER: + { + XimFrameType ret_type; + ExtraData d; + ExtraDataRec dr; + + if ((d = ChainMgrGetExtraData (&it->cm, it->cur_no)) == NULL) + { + dr.iter = IterInit (it->template + 1, NO_VALUE); + d = ChainMgrSetData (&it->cm, it->cur_no, dr); + } + /*endif*/ + + ret_type = IterGetNextType (d->iter, info); + if (ret_type == EOL) + { + it->cur_no++; + ret_type = IterGetNextType (it, info); + } + /*endif*/ + return ret_type; + } + + case POINTER: + { + XimFrameType ret_type; + ExtraData d; + ExtraDataRec dr; + + if ((d = ChainMgrGetExtraData (&it->cm, it->cur_no)) == NULL) + { + dr.fi = FrameInstInit (it->template[1].data); + d = ChainMgrSetData (&it->cm, it->cur_no, dr); + } + /*endif*/ + + ret_type = FrameInstGetNextType (d->fi, info); + if (ret_type == EOL) + { + it->cur_no++; + ret_type = IterGetNextType (it, info); + } + /*endif*/ + return ret_type; + } + + default: + return (XimFrameType) NULL; + } + /*endswitch*/ + return (XimFrameType) NULL; /* This should never occur */ +} + +static XimFrameType IterPeekNextType (Iter it, XimFrameTypeInfo info) +{ + XimFrameType type = it->template->type; + + if (!it->allow_expansion && it->cur_no >= it->max_count) + return (EOL); + /*endif*/ + + switch (type) + { + case BIT8: + case BIT16: + case BIT32: + case BIT64: + return type; + + case BARRAY: + if (info) + { + ExtraData d; + + if ((d = ChainMgrGetExtraData (&it->cm, it->cur_no)) == NULL) + info->num = NO_VALUE; + else + info->num = d->num; + /*endif*/ + } + /*endif*/ + return BARRAY; + + case ITER: + { + XimFrameType ret_type; + ExtraData d; + ExtraDataRec dr; + + if ((d = ChainMgrGetExtraData (&it->cm, it->cur_no)) == NULL) + { + dr.iter = IterInit (it->template + 1, NO_VALUE); + d = ChainMgrSetData (&it->cm, it->cur_no, dr); + } + /*endif*/ + + ret_type = IterPeekNextType (d->iter, info); + if (ret_type == EOL) + ret_type = IterPeekNextType (it, info); + /*endif*/ + return ret_type; + } + + case POINTER: + { + XimFrameType ret_type; + ExtraData d; + ExtraDataRec dr; + + if ((d = ChainMgrGetExtraData (&it->cm, it->cur_no)) == NULL) + { + dr.fi = FrameInstInit (it->template[1].data); + d = ChainMgrSetData (&it->cm, it->cur_no, dr); + } + /*endif*/ + + ret_type = FrameInstPeekNextType (d->fi, info); + if (ret_type == EOL) + ret_type = IterPeekNextType (it, info); + /*endif*/ + return (ret_type); + } + + default: + break; + } + /*endswitch*/ + /* Reaching here is a bug! */ + return (XimFrameType) NULL; +} + +static FmStatus IterSetSize (Iter it, int num) +{ + XimFrameType type; + register int i; + + if (!it->allow_expansion && it->max_count == 0) + return FmNoMoreData; + /*endif*/ + + type = it->template->type; + switch (type) + { + case BARRAY: + { + ExtraData d; + ExtraDataRec dr; + + for (i = 0; i < it->max_count; i++) + { + if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL) + { + dr.num = NO_VALUE; + d = ChainMgrSetData (&it->cm, i, dr); + } + /*endif*/ + if (d->num == NO_VALUE) + { + d->num = num; + return FmSuccess; + } + /*endif*/ + } + /*endfor*/ + if (it->allow_expansion) + { + ExtraDataRec dr; + + dr.num = num; + ChainMgrSetData (&it->cm, it->max_count, dr); + it->max_count++; + + return FmSuccess; + } + /*endif*/ + } + return FmNoMoreData; + + case ITER: + { + ExtraData d; + ExtraDataRec dr; + + for (i = 0; i < it->max_count; i++) + { + if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL) + { + dr.iter = IterInit (it->template + 1, NO_VALUE); + d = ChainMgrSetData (&it->cm, i, dr); + } + /*endif*/ + if (IterSetSize (d->iter, num) == FmSuccess) + return FmSuccess; + /*endif*/ + } + /*endfor*/ + if (it->allow_expansion) + { + ExtraDataRec dr; + + dr.iter = IterInit (it->template + 1, NO_VALUE); + ChainMgrSetData (&it->cm, it->max_count, dr); + it->max_count++; + + if (IterSetSize(dr.iter, num) == FmSuccess) + return FmSuccess; + /*endif*/ + } + /*endif*/ + } + return FmNoMoreData; + + case POINTER: + { + ExtraData d; + ExtraDataRec dr; + + for (i = 0; i < it->max_count; i++) + { + if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL) + { + dr.fi = FrameInstInit (it->template[1].data); + d = ChainMgrSetData (&it->cm, i, dr); + } + /*endif*/ + if (FrameInstSetSize (d->fi, num) == FmSuccess) + return FmSuccess; + /*endif*/ + } + /*endfor*/ + if (it->allow_expansion) + { + ExtraDataRec dr; + + dr.fi = FrameInstInit (it->template[1].data); + ChainMgrSetData (&it->cm, it->max_count, dr); + it->max_count++; + + if (FrameInstSetSize (dr.fi, num) == FmSuccess) + return FmSuccess; + /*endif*/ + } + /*endif*/ + } + return FmNoMoreData; + + default: + break; + } + /*endswitch*/ + return FmNoMoreData; +} + +static int IterGetSize (Iter it) +{ + register int i; + ExtraData d; + ExtraDataRec dr; + + if (it->cur_no >= it->max_count) + return NO_VALID_FIELD; + /*endif*/ + + switch (it->template->type) + { + case BARRAY: + if ((d = ChainMgrGetExtraData (&it->cm, it->cur_no)) == NULL) + return NO_VALUE; + /*endif*/ + return d->num; + + case ITER: + for (i = it->cur_no; i < it->max_count; i++) + { + int ret_size; + + if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL) + { + dr.iter = IterInit (it->template + 1, NO_VALUE); + d = ChainMgrSetData (&it->cm, i, dr); + } + /*endif*/ + ret_size = IterGetSize (d->iter); + if (ret_size != NO_VALID_FIELD) + return ret_size; + /*endif*/ + } + /*endfor*/ + return NO_VALID_FIELD; + + case POINTER: + for (i = it->cur_no; i < it->max_count; i++) + { + int ret_size; + + if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL) + { + dr.fi = FrameInstInit (it->template[1].data); + d = ChainMgrSetData (&it->cm, i, dr); + } + /*endif*/ + ret_size = FrameInstGetSize (d->fi); + if (ret_size != NO_VALID_FIELD) + return ret_size; + /*endif*/ + } + /*endfor*/ + return NO_VALID_FIELD; + + default: + break; + } + /*endswitch*/ + return NO_VALID_FIELD; +} + +static FmStatus IterSetIterCount (Iter it, int num) +{ + register int i; + + if (it->allow_expansion) + { + it->max_count = num; + it->allow_expansion = False; + return FmSuccess; + } + /*endif*/ + + if (it->max_count == 0) + return FmNoMoreData; + /*endif*/ + + switch (it->template->type) + { + case ITER: + for (i = 0; i < it->max_count; i++) + { + ExtraData d; + ExtraDataRec dr; + + if ((d = ChainMgrGetExtraData(&it->cm, i)) == NULL) + { + dr.iter = IterInit(it->template + 1, num); + (void)ChainMgrSetData(&it->cm, i, dr); + return FmSuccess; + } + /*endif*/ + if (IterSetIterCount(d->iter, num) == FmSuccess) + return FmSuccess; + /*endif*/ + } + /*endfor*/ + if (it->allow_expansion) + { + ExtraDataRec dr; + + dr.iter = IterInit (it->template + 1, num); + ChainMgrSetData (&it->cm, it->max_count, dr); + it->max_count++; + + return FmSuccess; + } + /*endif*/ + break; + + case POINTER: + for (i = 0; i < it->max_count; i++) + { + ExtraData d; + ExtraDataRec dr; + + if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL) + { + dr.fi = FrameInstInit (it->template[1].data); + d = ChainMgrSetData (&it->cm, i, dr); + } + /*endif*/ + if (FrameInstSetIterCount (d->fi, num) == FmSuccess) + return FmSuccess; + /*endif*/ + } + /*endfor*/ + if (it->allow_expansion) + { + ExtraDataRec dr; + + dr.fi = FrameInstInit (it->template[1].data); + ChainMgrSetData (&it->cm, it->max_count, dr); + it->max_count++; + + if (FrameInstSetIterCount (dr.fi, num) == FmSuccess) + return FmSuccess; + /*endif*/ + } + /*endif*/ + break; + + default: + break; + } + /*endswitch*/ + return FmNoMoreData; +} + +static int IterGetTotalSize (Iter it) +{ + register int size, i; + XimFrameType type; + + if (it->allow_expansion) + return NO_VALUE; + /*endif*/ + if (it->max_count == 0) + return 0; + /*endif*/ + + size = 0; + type = it->template->type; + + switch (type) + { + case BIT8: + size = it->max_count; + break; + + case BIT16: + size = it->max_count*2; + break; + + case BIT32: + size = it->max_count*4; + break; + + case BIT64: + size = it->max_count*8; + break; + + case BARRAY: + for (i = 0; i < it->max_count; i++) + { + register int num; + ExtraData d; + + if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL) + return NO_VALUE; + /*endif*/ + if ((num = d->num) == NO_VALUE) + return NO_VALUE; + /*endif*/ + size += num; + } + /*endfor*/ + break; + + case ITER: + for (i = 0; i < it->max_count; i++) + { + register int num; + ExtraData d; + + if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL) + return NO_VALUE; + /*endif*/ + if ((num = IterGetTotalSize (d->iter)) == NO_VALUE) + return NO_VALUE; + /*endif*/ + size += num; + } + /*endfor*/ + break; + + case POINTER: + for (i = 0; i < it->max_count; i++) + { + register int num; + ExtraData d; + ExtraDataRec dr; + + if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL) + { + dr.fi = FrameInstInit (it->template[1].data); + d = ChainMgrSetData (&it->cm, i, dr); + } + /*endif*/ + if ((num = FrameInstGetTotalSize (d->fi)) == NO_VALUE) + return NO_VALUE; + /*endif*/ + size += num; + } + /*endfor*/ + break; + + default: + break; + } + /*endswitch*/ + return size; +} + +static void IterReset (Iter it) +{ + ChainIterRec ci; + int count; + ExtraDataRec d; + + switch (it->template->type) + { + case ITER: + ChainIterInit (&ci, &it->cm); + while (ChainIterGetNext (&ci, &count, &d)) + IterReset (d.iter); + /*endwhile*/ + ChainIterFree (&ci); + break; + + case POINTER: + ChainIterInit (&ci, &it->cm); + while (ChainIterGetNext (&ci, &count, &d)) + FrameInstReset (d.fi); + /*endwhile*/ + ChainIterFree (&ci); + break; + + default: + break; + } + /*endswitch*/ + it->cur_no = 0; +} + +static void IterSetStartWatch (Iter it, + IterStartWatchProc proc, + void *client_data) +{ + it->start_watch_proc = proc; + it->client_data = client_data; +} + +static ExtraData ChainMgrSetData (ChainMgr cm, + int frame_no, + ExtraDataRec data) +{ + Chain cur = (Chain) Xmalloc (sizeof (ChainRec)); + + cur->frame_no = frame_no; + cur->d = data; + cur->next = NULL; + + if (cm->top == NULL) + { + cm->top = cm->tail = cur; + } + else + { + cm->tail->next = cur; + cm->tail = cur; + } + /*endif*/ + return &cur->d; +} + +static ExtraData ChainMgrGetExtraData (ChainMgr cm, int frame_no) +{ + Chain cur; + + cur = cm->top; + + while (cur) + { + if (cur->frame_no == frame_no) + return &cur->d; + /*endif*/ + cur = cur->next; + } + /*endwhile*/ + return NULL; +} + +static Bool ChainIterGetNext (ChainIter ci, int *frame_no, ExtraData d) +{ + if (ci->cur == NULL) + return False; + /*endif*/ + + *frame_no = ci->cur->frame_no; + *d = ci->cur->d; + + ci->cur = ci->cur->next; + + return True; +} + +static int _FrameInstIncrement (XimFrame frame, int count) +{ + XimFrameType type; + + type = frame[count].type; + type &= ~COUNTER_MASK; + + switch (type) + { + case BIT8: + case BIT16: + case BIT32: + case BIT64: + case BARRAY: + case PADDING: + return count + 1; + + case POINTER: + return count + 2; + + case ITER: + return _FrameInstIncrement (frame, count + 1); + default: + break; + } + /*endswitch*/ + return - 1; /* Error */ +} + +static int _FrameInstDecrement (XimFrame frame, int count) +{ + register int i; + XimFrameType type; + + if (count == 0) + return - 1; /* cannot decrement */ + /*endif*/ + + if (count == 1) + return 0; /* BOGUS - It should check the contents of data */ + /*endif*/ + + type = frame[count - 2].type; + type &= ~COUNTER_MASK; + + switch (type) + { + case BIT8: + case BIT16: + case BIT32: + case BIT64: + case BARRAY: + case PADDING: + case PTR_ITEM: + return count - 1; + + case POINTER: + case ITER: + i = count - 3; + while (i >= 0) + { + if (frame[i].type != ITER) + return i + 1; + /*endif*/ + i--; + } + /*endwhile*/ + return 0; + default: + break; + } + /*enswitch*/ + return - 1; /* Error */ +} + +static int _FrameInstGetItemSize (FrameInst fi, int cur_no) +{ + XimFrameType type; + + type = fi->template[cur_no].type; + type &= ~COUNTER_MASK; + + switch (type) + { + case BIT8: + return 1; + + case BIT16: + return 2; + + case BIT32: + return 4; + + case BIT64: + return 8; + + case BARRAY: + { + ExtraData d; + + if ((d = ChainMgrGetExtraData (&fi->cm, cur_no)) == NULL) + return NO_VALUE; + /*endif*/ + if (d->num == NO_VALUE) + return NO_VALUE; + /*endif*/ + return d->num; + } + + case PADDING: + { + register int unit; + register int number; + register int size; + register int i; + + unit = _UNIT ((long) fi->template[cur_no].data); + number = _NUMBER ((long) fi->template[cur_no].data); + + i = cur_no; + size = 0; + while (number > 0) + { + i = _FrameInstDecrement (fi->template, i); + size += _FrameInstGetItemSize (fi, i); + number--; + } + /*endwhile*/ + size = (unit - (size%unit))%unit; + return size; + } + + case ITER: + { + ExtraData d; + int sub_size; + + if ((d = ChainMgrGetExtraData (&fi->cm, cur_no)) == NULL) + return NO_VALUE; + /*endif*/ + sub_size = IterGetTotalSize (d->iter); + if (sub_size == NO_VALUE) + return NO_VALUE; + /*endif*/ + return sub_size; + } + + case POINTER: + { + ExtraData d; + int sub_size; + + if ((d = ChainMgrGetExtraData (&fi->cm, cur_no)) == NULL) + return NO_VALUE; + /*endif*/ + sub_size = FrameInstGetTotalSize (d->fi); + if (sub_size == NO_VALUE) + return NO_VALUE; + /*endif*/ + return sub_size; + } + + default: + break; + } + /*endswitch*/ + return NO_VALUE; +} diff -ruN xwin86/IMdkit/FrameMgr.h xwin/IMdkit/FrameMgr.h --- xwin86/IMdkit/FrameMgr.h Thu Jan 1 09:00:00 1970 +++ xwin/IMdkit/FrameMgr.h Mon May 26 17:37:46 2003 @@ -0,0 +1,132 @@ +/****************************************************************** +Copyright 1993, 1994 by Digital Equipment Corporation, Maynard, Massachusetts, + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + + Author: Hiroyuki Miyamoto Digital Equipment Corporation + miyamoto@jrd.dec.com + + This version tidied and debugged by Steve Underwood May 1999 + +******************************************************************/ + +#ifndef FRAMEMGR_H +#define FRAMEMGR_H + +#include +#include +#include + +#if defined(VAXC) && !defined(__DECC) +#define xim_externalref globalref +#define xim_externaldef globaldef +#else +#define xim_externalref extern +#define xim_externaldef +#endif + +/* Definitions for FrameMgr */ + +#define COUNTER_MASK 0x10 + +typedef enum +{ + BIT8 = 0x1, /* {CARD8* | INT8*} */ + BIT16 = 0x2, /* {CARD16* | INT16*} */ + BIT32 = 0x3, /* {CARD32* | INT32*} */ + BIT64 = 0x4, /* {CARD64* | INT64*} */ + BARRAY = 0x5, /* int*, void* */ + ITER = 0x6, /* int* */ + POINTER = 0x7, /* specifies next item is a PTR_ITEM */ + PTR_ITEM = 0x8, /* specifies the item has a pointer */ + /* BOGUS - POINTER and PTR_ITEM + * In the current implementation, PTR_ITEM should be lead by + * POINTER. But actually, it's just redundant logically. Someone + * may remove this redundancy and POINTER from the enum member but he + * should also modify the logic in FrameMgr program. + */ + PADDING = 0x9, /* specifies that a padding is needed. + * This requires extra data in data field. + */ + EOL = 0xA, /* specifies the end of list */ + + COUNTER_BIT8 = COUNTER_MASK | 0x1, + COUNTER_BIT16 = COUNTER_MASK | 0x2, + COUNTER_BIT32 = COUNTER_MASK | 0x3, + COUNTER_BIT64 = COUNTER_MASK | 0x4 +} XimFrameType; + +/* Convenient macro */ +#define _FRAME(a) {a, NULL} +#undef _PTR +#define _PTR(p) {PTR_ITEM, (void *)p} +/* PADDING's usage of data field + * B15-B8 : Shows the number of effective items. + * B7-B0 : Shows padding unit. ex) 04 shows 4 unit padding. + */ +#define _PAD2(n) {PADDING, (void*)((n)<<8|2)} +#define _PAD4(n) {PADDING, (void*)((n)<<8|4)} + +#define FmCounterByte 0 +#define FmCounterNumber 1 + +#define _BYTE_COUNTER(type, offset) \ + {(COUNTER_MASK|type), (void*)((offset)<<8|FmCounterByte)} + +#define _NUMBER_COUNTER(type, offset) \ + {(COUNTER_MASK|type), (void*)((offset)<<8|FmCounterNumber)} + +typedef struct _XimFrame +{ + XimFrameType type; + void* data; /* For PTR_ITEM and PADDING */ +} XimFrameRec, *XimFrame; + +typedef enum +{ + FmSuccess, + FmEOD, + FmInvalidCall, + FmBufExist, + FmCannotCalc, + FmNoMoreData +} FmStatus; + +typedef struct _FrameMgr *FrameMgr; + +FrameMgr FrameMgrInit(XimFrame frame, char* area, Bool byte_swap); +void FrameMgrInitWithData(FrameMgr fm, XimFrame frame, void* area, + Bool byte_swap); +void FrameMgrFree(FrameMgr fm); +FmStatus FrameMgrSetBuffer(FrameMgr, void*); +FmStatus _FrameMgrPutToken(FrameMgr, void*, int); +FmStatus _FrameMgrGetToken(FrameMgr, void*, int); +FmStatus FrameMgrSetSize(FrameMgr, int); +FmStatus FrameMgrSetIterCount(FrameMgr, int); +FmStatus FrameMgrSetTotalSize(FrameMgr, int); +int FrameMgrGetTotalSize(FrameMgr); +int FrameMgrGetSize(FrameMgr); +FmStatus FrameMgrSkipToken(FrameMgr, int); +void FrameMgrReset(FrameMgr); +Bool FrameMgrIsIterLoopEnd(FrameMgr, FmStatus*); + +#define FrameMgrPutToken(fm, obj) _FrameMgrPutToken((fm), &(obj), sizeof(obj)) +#define FrameMgrGetToken(fm, obj) _FrameMgrGetToken((fm), &(obj), sizeof(obj)) + +#endif /* FRAMEMGR_H */ diff -ruN xwin86/IMdkit/IMConn.c xwin/IMdkit/IMConn.c --- xwin86/IMdkit/IMConn.c Thu Jan 1 09:00:00 1970 +++ xwin/IMdkit/IMConn.c Fri Dec 14 01:15:00 2001 @@ -0,0 +1,176 @@ +/****************************************************************** + + Copyright 1994, 1995 by Sun Microsystems, Inc. + Copyright 1993, 1994 by Hewlett-Packard Company + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without fee, +provided that the above copyright notice appear in all copies and +that both that copyright notice and this permission notice appear +in supporting documentation, and that the name of Sun Microsystems, Inc. +and Hewlett-Packard not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior permission. +Sun Microsystems, Inc. and Hewlett-Packard make no representations about +the suitability of this software for any purpose. It is provided "as is" +without express or implied warranty. + +SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. + + This version tidied and debugged by Steve Underwood May 1999 + +******************************************************************/ + +#include +#include +#include +#include "IMdkit.h" +#include + +#define Va_start(a,b) va_start(a,b) + +static void _IMCountVaList(va_list var, int *total_count) +{ + char *attr; + + *total_count = 0; + + for (attr = va_arg (var, char*); attr; attr = va_arg (var, char*)) + { + (void)va_arg (var, XIMArg *); + ++(*total_count); + } + /*endfor*/ +} + +static void _IMVaToNestedList(va_list var, int max_count, XIMArg **args_return) +{ + XIMArg *args; + char *attr; + + if (max_count <= 0) + { + *args_return = (XIMArg *) NULL; + return; + } + /*endif*/ + + args = (XIMArg *) malloc ((unsigned) (max_count + 1)*sizeof (XIMArg)); + *args_return = args; + if (!args) + return; + /*endif*/ + + for (attr = va_arg (var, char*); attr; attr = va_arg (var, char *)) + { + args->name = attr; + args->value = va_arg (var, XPointer); + args++; + } + /*endfor*/ + args->name = (char*)NULL; +} + +static char *_FindModifiers (XIMArg *args) +{ + char *modifiers; + + while (args->name) + { + if (strcmp (args->name, IMModifiers) == 0) + { + modifiers = args->value; + return modifiers; + } + else + { + args++; + } + /*endif*/ + } + /*endwhile*/ + return NULL; +} + +XIMS _GetIMS (char *modifiers) +{ + XIMS ims; + extern IMMethodsRec Xi18n_im_methods; + + if ((ims = (XIMS) malloc (sizeof (XIMProtocolRec))) == (XIMS) NULL) + return ((XIMS) NULL); + /*endif*/ + memset ((void *) ims, 0, sizeof (XIMProtocolRec)); + + if (modifiers == NULL + || + modifiers[0] == '\0' + || + strcmp (modifiers, "Xi18n") == 0) + { + ims->methods = &Xi18n_im_methods; + return ims; + } + /*endif*/ + XFree (ims); + return (XIMS) NULL; +} + +XIMS IMOpenIM (Display *display, ...) +{ + va_list var; + int total_count; + XIMArg *args; + XIMS ims; + char *modifiers; + Status ret; + + Va_start (var, display); + _IMCountVaList (var, &total_count); + va_end (var); + + Va_start (var, display); + _IMVaToNestedList (var, total_count, &args); + va_end (var); + + modifiers = _FindModifiers (args); + + ims = _GetIMS (modifiers); + if (ims == (XIMS) NULL) + return (XIMS) NULL; + /*endif*/ + + ims->core.display = display; + + ims->protocol = (*ims->methods->setup) (display, args); + XFree (args); + if (ims->protocol == (void *) NULL) + { + XFree (ims); + return (XIMS) NULL; + } + /*endif*/ + ret = (ims->methods->openIM) (ims); + if (ret == False) + { + XFree (ims); + return (XIMS) NULL; + } + /*endif*/ + return (XIMS) ims; +} + +Status IMCloseIM (XIMS ims) +{ + (ims->methods->closeIM) (ims); + XFree (ims); + return True; +} diff -ruN xwin86/IMdkit/IMMethod.c xwin/IMdkit/IMMethod.c --- xwin86/IMdkit/IMMethod.c Thu Jan 1 09:00:00 1970 +++ xwin/IMdkit/IMMethod.c Fri Dec 14 01:15:00 2001 @@ -0,0 +1,65 @@ +/****************************************************************** + + Copyright 1994, 1995 by Sun Microsystems, Inc. + Copyright 1993, 1994 by Hewlett-Packard Company + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without fee, +provided that the above copyright notice appear in all copies and +that both that copyright notice and this permission notice appear +in supporting documentation, and that the name of Sun Microsystems, Inc. +and Hewlett-Packard not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior permission. +Sun Microsystems, Inc. and Hewlett-Packard make no representations about +the suitability of this software for any purpose. It is provided "as is" +without express or implied warranty. + +SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. + + This version tidied and debugged by Steve Underwood May 1999 + +******************************************************************/ + +#include +#include "IMdkit.h" + +/* Public Function */ +void IMForwardEvent (XIMS ims, XPointer call_data) +{ + (ims->methods->forwardEvent) (ims, call_data); +} + +void IMCommitString (XIMS ims, XPointer call_data) +{ + (ims->methods->commitString) (ims, call_data); +} + +int IMCallCallback (XIMS ims, XPointer call_data) +{ + return (ims->methods->callCallback) (ims, call_data); +} + +int IMPreeditStart (XIMS ims, XPointer call_data) +{ + return (ims->methods->preeditStart) (ims, call_data); +} + +int IMPreeditEnd (XIMS ims, XPointer call_data) +{ + return (ims->methods->preeditEnd) (ims, call_data); +} + +int IMSyncXlib(XIMS ims, XPointer call_data) +{ + ims->sync = True; + return (ims->methods->syncXlib) (ims, call_data); +} diff -ruN xwin86/IMdkit/IMValues.c xwin/IMdkit/IMValues.c --- xwin86/IMdkit/IMValues.c Thu Jan 1 09:00:00 1970 +++ xwin/IMdkit/IMValues.c Fri Dec 14 01:15:00 2001 @@ -0,0 +1,124 @@ +/****************************************************************** + + Copyright 1994, 1995 by Sun Microsystems, Inc. + Copyright 1993, 1994 by Hewlett-Packard Company + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without fee, +provided that the above copyright notice appear in all copies and +that both that copyright notice and this permission notice appear +in supporting documentation, and that the name of Sun Microsystems, Inc. +and Hewlett-Packard not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior permission. +Sun Microsystems, Inc. and Hewlett-Packard make no representations about +the suitability of this software for any purpose. It is provided "as is" +without express or implied warranty. + +SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. + + This version tidied and debugged by Steve Underwood May 1999 + +******************************************************************/ + +#include +#include +#include "IMdkit.h" +#include + +#define Va_start(a,b) va_start(a,b) + +static void _IMCountVaList (va_list var, int *total_count) +{ + char *attr; + + *total_count = 0; + + for (attr = va_arg (var, char *); attr; attr = va_arg (var, char *)) + { + (void)va_arg (var, XIMArg *); + ++(*total_count); + } + /*endfor*/ +} + +static void _IMVaToNestedList (va_list var, int max_count, XIMArg **args_return) +{ + XIMArg *args; + char *attr; + + if (max_count <= 0) + { + *args_return = (XIMArg *) NULL; + return; + } + /*endif*/ + + args = (XIMArg *) malloc ((unsigned) (max_count + 1)*sizeof (XIMArg)); + *args_return = args; + if (!args) + return; + /*endif*/ + for (attr = va_arg (var, char *); attr; attr = va_arg (var, char *)) + { + args->name = attr; + args->value = va_arg (var, XPointer); + args++; + } + /*endfor*/ + args->name = (char *) NULL; +} + +char *IMGetIMValues (XIMS ims, ...) +{ + va_list var; + int total_count; + XIMArg *args; + char *ret; + + Va_start (var, ims); + _IMCountVaList (var, &total_count); + va_end (var); + + Va_start (var, ims); + _IMVaToNestedList (var, total_count, &args); + va_end (var); + + ret = (*ims->methods->getIMValues) (ims, args); + + if (args) + XFree ((char *) args); + /*endif*/ + return ret; +} + +char *IMSetIMValues (XIMS ims, ...) +{ + va_list var; + int total_count; + XIMArg *args; + char *ret; + + Va_start (var, ims); + _IMCountVaList (var, &total_count); + va_end (var); + + Va_start (var, ims); + _IMVaToNestedList (var, total_count, &args); + va_end (var); + + ret = (*ims->methods->setIMValues) (ims, args); + + if (args) + XFree ((char *) args); + /*endif*/ + return ret; +} diff -ruN xwin86/IMdkit/IMdkit.h xwin/IMdkit/IMdkit.h --- xwin86/IMdkit/IMdkit.h Thu Jan 1 09:00:00 1970 +++ xwin/IMdkit/IMdkit.h Fri Dec 14 01:15:00 2001 @@ -0,0 +1,136 @@ +/****************************************************************** + + Copyright 1994, 1995 by Sun Microsystems, Inc. + Copyright 1993, 1994 by Hewlett-Packard Company + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without fee, +provided that the above copyright notice appear in all copies and +that both that copyright notice and this permission notice appear +in supporting documentation, and that the name of Sun Microsystems, Inc. +and Hewlett-Packard not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior permission. +Sun Microsystems, Inc. and Hewlett-Packard make no representations about +the suitability of this software for any purpose. It is provided "as is" +without express or implied warranty. + +SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. + + This version tidied and debugged by Steve Underwood May 1999 + +******************************************************************/ + +#ifndef _IMdkit_h +#define _IMdkit_h + +#include + +/* IM Attributes Name */ +#define IMModifiers "modifiers" +#define IMServerWindow "serverWindow" +#define IMServerName "serverName" +#define IMServerTransport "serverTransport" +#define IMLocale "locale" +#define IMInputStyles "inputStyles" +#define IMProtocolHandler "protocolHandler" +#define IMOnKeysList "onKeysList" +#define IMOffKeysList "offKeysList" +#define IMEncodingList "encodingList" +#define IMFilterEventMask "filterEventMask" +#define IMProtocolDepend "protocolDepend" + +/* Masks for IM Attributes Name */ +#define I18N_IMSERVER_WIN 0x0001 /* IMServerWindow */ +#define I18N_IM_NAME 0x0002 /* IMServerName */ +#define I18N_IM_LOCALE 0x0004 /* IMLocale */ +#define I18N_IM_ADDRESS 0x0008 /* IMServerTransport */ +#define I18N_INPUT_STYLES 0x0010 /* IMInputStyles */ +#define I18N_ON_KEYS 0x0020 /* IMOnKeysList */ +#define I18N_OFF_KEYS 0x0040 /* IMOffKeysList */ +#define I18N_IM_HANDLER 0x0080 /* IMProtocolHander */ +#define I18N_ENCODINGS 0x0100 /* IMEncodingList */ +#define I18N_FILTERMASK 0x0200 /* IMFilterEventMask */ +#define I18N_PROTO_DEPEND 0x0400 /* IMProtoDepend */ + +typedef struct +{ + char *name; + XPointer value; +} XIMArg; + +typedef struct +{ + CARD32 keysym; + CARD32 modifier; + CARD32 modifier_mask; +} XIMTriggerKey; + +typedef struct +{ + unsigned short count_keys; + XIMTriggerKey *keylist; +} XIMTriggerKeys; + +typedef char *XIMEncoding; + +typedef struct +{ + unsigned short count_encodings; + XIMEncoding *supported_encodings; +} XIMEncodings; + +typedef struct _XIMS *XIMS; + +typedef struct +{ + void* (*setup) (Display *, XIMArg *); + Status (*openIM) (XIMS); + Status (*closeIM) (XIMS); + char* (*setIMValues) (XIMS, XIMArg *); + char* (*getIMValues) (XIMS, XIMArg *); + Status (*forwardEvent) (XIMS, XPointer); + Status (*commitString) (XIMS, XPointer); + int (*callCallback) (XIMS, XPointer); + int (*preeditStart) (XIMS, XPointer); + int (*preeditEnd) (XIMS, XPointer); + int (*syncXlib) (XIMS, XPointer); +} IMMethodsRec, *IMMethods; + +typedef struct +{ + Display *display; + int screen; +} IMCoreRec, *IMCore; + +typedef struct _XIMS +{ + IMMethods methods; + IMCoreRec core; + Bool sync; + void *protocol; +} XIMProtocolRec; + +/* + * X function declarations. + */ +extern XIMS IMOpenIM (Display *, ...); +extern Status IMCloseIM (XIMS); +extern char *IMSetIMValues (XIMS, ...); +extern char *IMGetIMValues (XIMS, ...); +void IMForwardEvent (XIMS, XPointer); +void IMCommitString (XIMS, XPointer); +int IMCallCallback (XIMS, XPointer); +int IMPreeditStart (XIMS, XPointer); +int IMPreeditEnd (XIMS, XPointer); +int IMSyncXlib (XIMS, XPointer); + +#endif /* IMdkit_h */ diff -ruN xwin86/IMdkit/Imakefile_ xwin/IMdkit/Imakefile_ --- xwin86/IMdkit/Imakefile_ Thu Jan 1 09:00:00 1970 +++ xwin/IMdkit/Imakefile_ Mon May 26 18:10:52 2003 @@ -0,0 +1,50 @@ +#include + +#if HasShm +SHMDEF = -DHAS_SHM +#endif + +MMAPDEF = -DHAS_MMAP + +SRCS = FrameMgr.c \ + IMValues.c \ + i18nIMProto.c \ + i18nPtHdr.c \ + i18nX.c \ + IMConn.c \ + i18nAttr.c \ + i18nIc.c \ + IMMethod.c \ + i18nClbk.c \ + i18nMethod.c \ + i18nTr.c \ + i18nUtil.c + +OBJS = FrameMgr.o \ + IMValues.o \ + i18nIMProto.o \ + i18nPtHdr.o \ + i18nX.o \ + IMConn.o \ + i18nAttr.o \ + i18nIc.o \ + IMMethod.o \ + i18nClbk.o \ + i18nMethod.o \ + i18nTr.o \ + i18nUtil.o + +INCLUDES = -I. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \ + -I$(SERVERSRC)/fb -I$(SERVERSRC)/mi \ + -I$(SERVERSRC)/miext/shadow -I$(SERVERSRC)/miext/layer \ + -I$(SERVERSRC)/include -I$(SERVERSRC)/os \ + -I$(EXTINCSRC) -I$(XINCLUDESRC) \ + -I$(SERVERSRC)/render -I$(SERVERSRC)/randr + +DEFINES = $(OS_DEFINES) $(SHMDEF) $(MMAPDEF) -UXFree86LOADER -UXF86DRI \ + -DPROJECTROOT="\"$(PROJECTROOT)\"" + +NormalLibraryObjectRule() +NormalLibraryTarget(Ximd,$(OBJS)) + +DependTarget() diff -ruN xwin86/IMdkit/Xi18n.h xwin/IMdkit/Xi18n.h --- xwin86/IMdkit/Xi18n.h Thu Jan 1 09:00:00 1970 +++ xwin/IMdkit/Xi18n.h Mon May 26 19:15:10 2003 @@ -0,0 +1,505 @@ +/****************************************************************** + + Copyright 1994, 1995 by Sun Microsystems, Inc. + Copyright 1993, 1994 by Hewlett-Packard Company + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without fee, +provided that the above copyright notice appear in all copies and +that both that copyright notice and this permission notice appear +in supporting documentation, and that the name of Sun Microsystems, Inc. +and Hewlett-Packard not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior permission. +Sun Microsystems, Inc. and Hewlett-Packard make no representations about +the suitability of this software for any purpose. It is provided "as is" +without express or implied warranty. + +SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. + + This version tidied and debugged by Steve Underwood May 1999 + +******************************************************************/ + +#ifndef _Xi18n_h +#define _Xi18n_h +#include +#include +/*#include */ +#include "XimProto.h" + +/* + * Minor Protocol Number for Extension Protocol + */ +#define XIM_EXTENSION 128 +#define XIM_EXT_SET_EVENT_MASK (0x30) +#define XIM_EXT_FORWARD_KEYEVENT (0x32) +#define XIM_EXT_MOVE (0x33) +#define COMMON_EXTENSIONS_NUM 3 + +#include +#include "IMdkit.h" + +/* XI18N Valid Attribute Name Definition */ +#define ExtForwardKeyEvent "extForwardKeyEvent" +#define ExtMove "extMove" +#define ExtSetEventMask "extSetEventMask" + +/* + * Padding macro + */ +#define IMPAD(length) ((4 - ((length)%4))%4) + +/* + * Target Atom for Transport Connection + */ +#define LOCALES "LOCALES" +#define TRANSPORT "TRANSPORT" + +#define I18N_OPEN 0 +#define I18N_SET 1 +#define I18N_GET 2 + +typedef struct +{ + char *transportname; + int namelen; + Bool (*checkAddr) (); +} TransportSW; + +typedef struct _XIMPending +{ + unsigned char *p; + struct _XIMPending *next; +} XIMPending; + +typedef struct _XimProtoHdr +{ + CARD8 major_opcode; + CARD8 minor_opcode; + CARD16 length; +} XimProtoHdr; + +typedef struct +{ + CARD16 attribute_id; + CARD16 type; + CARD16 length; + char *name; +} XIMAttr; + +typedef struct +{ + CARD16 attribute_id; + CARD16 type; + CARD16 length; + char *name; +} XICAttr; + +typedef struct +{ + int attribute_id; + CARD16 name_length; + char *name; + int value_length; + void *value; + int type; +} XIMAttribute; + +typedef struct +{ + int attribute_id; + CARD16 name_length; + char *name; + int value_length; + void *value; + int type; +} XICAttribute; + +typedef struct +{ + int length; + char *name; +} XIMStr; + +typedef struct +{ + CARD16 major_opcode; + CARD16 minor_opcode; + CARD16 length; + char *name; +} XIMExt; + +typedef struct _Xi18nClient +{ + int connect_id; + CARD8 byte_order; + /* + '?': initial value + 'B': for Big-Endian + 'l': for little-endian + */ + int sync; + XIMPending *pending; + void *trans_rec; /* contains transport specific data */ + struct _Xi18nClient *next; +} Xi18nClient; + +typedef struct _Xi18nCore *Xi18n; + +/* + * Callback Struct for XIM Protocol + */ +typedef struct +{ + int major_code; + int minor_code; + CARD16 connect_id; +} IMAnyStruct; + +typedef struct +{ + int major_code; + int minor_code; + CARD16 connect_id; + CARD8 byte_order; + CARD16 major_version; + CARD16 minor_version; +} IMConnectStruct; + +typedef struct +{ + int major_code; + int minor_code; + CARD16 connect_id; +} IMDisConnectStruct; + +typedef struct +{ + int major_code; + int minor_code; + CARD16 connect_id; + XIMStr lang; +} IMOpenStruct; + +typedef struct +{ + int major_code; + int minor_code; + CARD16 connect_id; +} IMCloseStruct; + +typedef struct +{ + int major_code; + int minor_code; + CARD16 connect_id; + CARD16 number; + XIMStr *extension; +} IMQueryExtensionStruct; + +typedef struct +{ + int major_code; + int minor_code; + CARD16 connect_id; + CARD16 number; + char **im_attr_list; +} IMGetIMValuesStruct; + +typedef struct +{ + int major_code; + int minor_code; + CARD16 connect_id; + CARD16 icid; + CARD16 preedit_attr_num; + CARD16 status_attr_num; + CARD16 ic_attr_num; + XICAttribute *preedit_attr; + XICAttribute *status_attr; + XICAttribute *ic_attr; +} IMChangeICStruct; + +typedef struct +{ + int major_code; + int minor_code; + CARD16 connect_id; + CARD16 icid; +} IMDestroyICStruct; + +typedef struct +{ + int major_code; + int minor_code; + CARD16 connect_id; + CARD16 icid; + CARD16 length; + char *commit_string; +} IMResetICStruct; + +typedef struct +{ + int major_code; + int minor_code; + CARD16 connect_id; + CARD16 icid; +} IMChangeFocusStruct; + +typedef struct +{ + int major_code; + int minor_code; + CARD16 connect_id; + CARD16 icid; + BITMASK16 sync_bit; + CARD16 serial_number; + XEvent event; +} IMForwardEventStruct; + +typedef struct +{ + int major_code; + int minor_code; + CARD16 connect_id; + CARD16 icid; + CARD16 flag; + KeySym keysym; + char *commit_string; +} IMCommitStruct; + +typedef struct +{ + int major_code; + int minor_code; + CARD16 connect_id; + CARD16 icid; + CARD32 flag; + CARD32 key_index; + CARD32 event_mask; +} IMTriggerNotifyStruct; + +typedef struct +{ + int major_code; + int minor_code; + CARD16 connect_id; + CARD16 encoding_number; + XIMStr *encoding; /* name information */ + CARD16 encoding_info_number; + XIMStr *encodinginfo; /* detailed information */ + CARD16 category; /* #0 for name, #1 for detail */ + INT16 enc_index; /* index of the encoding determined */ +} IMEncodingNegotiationStruct; + +typedef struct +{ + int major_code; + int minor_code; + CARD16 connect_id; + CARD16 icid; + CARD32 flag; + CARD32 forward_event_mask; + CARD32 sync_event_mask; +} IMSetEventMaskStruct; + +typedef struct +{ + int major_code; + int minor_code; + CARD16 connect_id; + CARD16 icid; + CARD32 filter_event_mask; + CARD32 intercept_event_mask; + CARD32 select_event_mask; + CARD32 forward_event_mask; + CARD32 sync_event_mask; +} IMExtSetEventMaskStruct; + +typedef struct +{ + int major_code; + int minor_code; + CARD16 connect_id; + CARD16 icid; + CARD16 x; + CARD16 y; +} IMMoveStruct; + +typedef struct +{ + int major_code; + int minor_code; + CARD16 connect_id; + CARD16 icid; + BITMASK16 flag; + CARD16 error_code; + CARD16 str_length; + CARD16 error_type; + char *error_detail; +} IMErrorStruct; + +typedef struct +{ + int major_code; + int minor_code; + CARD16 connect_id; + CARD16 icid; +} IMPreeditStateStruct; + +/* Callbacks */ +typedef struct +{ + int major_code; + int minor_code; + CARD16 connect_id; + CARD16 icid; +} IMGeometryCBStruct; + +typedef struct +{ + int major_code; + int minor_code; + CARD16 connect_id; + CARD16 icid; + union + { + int return_value; /* PreeditStart */ + XIMPreeditDrawCallbackStruct draw; /* PreeditDraw */ + XIMPreeditCaretCallbackStruct caret; /* PreeditCaret */ + } todo; +} IMPreeditCBStruct; + +typedef struct +{ + int major_code; + int minor_code; + CARD16 connect_id; + CARD16 icid; + union + { + XIMStatusDrawCallbackStruct draw; /* StatusDraw */ + } todo; +} IMStatusCBStruct; + +typedef struct +{ + int major_code; + int minor_code; + CARD16 connect_id; + CARD16 icid; + XIMStringConversionCallbackStruct strconv; +} IMStrConvCBStruct; + +typedef struct +{ + int major_code; + int minor_code; + CARD16 connect_id; + CARD16 icid; +} IMSyncXlibStruct; + +typedef union _IMProtocol +{ + int major_code; + IMAnyStruct any; + IMConnectStruct imconnect; + IMDisConnectStruct imdisconnect; + IMOpenStruct imopen; + IMCloseStruct imclose; + IMQueryExtensionStruct queryext; + IMGetIMValuesStruct getim; + IMEncodingNegotiationStruct encodingnego; + IMExtSetEventMaskStruct extsetevent; + IMMoveStruct extmove; + IMSetEventMaskStruct setevent; + IMChangeICStruct changeic; + IMDestroyICStruct destroyic; + IMResetICStruct resetic; + IMChangeFocusStruct changefocus; + IMCommitStruct commitstring; + IMForwardEventStruct forwardevent; + IMTriggerNotifyStruct triggernotify; + IMPreeditStateStruct preedit_state; + IMErrorStruct imerror; + IMGeometryCBStruct geometry_callback; + IMPreeditCBStruct preedit_callback; + IMStatusCBStruct status_callback; + IMStrConvCBStruct strconv_callback; + IMSyncXlibStruct sync_xlib; + long pad[32]; +} IMProtocol; + +typedef int (*IMProtoHandler) (XIMS, IMProtocol*); + +#define DEFAULT_FILTER_MASK (KeyPressMask) + +/* Xi18nAddressRec structure */ +typedef struct _Xi18nAddressRec +{ + Display *dpy; + CARD8 im_byteOrder; /* byte order 'B' or 'l' */ + /* IM Values */ + long imvalue_mask; + Window im_window; /* IMServerWindow */ + char *im_name; /* IMServerName */ + char *im_locale; /* IMLocale */ + char *im_addr; /* IMServerTransport */ + XIMStyles input_styles; /* IMInputStyles */ + XIMTriggerKeys on_keys; /* IMOnKeysList */ + XIMTriggerKeys off_keys; /* IMOffKeysList */ + XIMEncodings encoding_list; /* IMEncodingList */ + IMProtoHandler improto; /* IMProtocolHander */ + long filterevent_mask; /* IMFilterEventMask */ + /* XIM_SERVERS target Atoms */ + Atom selection; + Atom Localename; + Atom Transportname; + /* XIM/XIC Attr */ + int im_attr_num; + XIMAttr *xim_attr; + int ic_attr_num; + XICAttr *xic_attr; + CARD16 preeditAttr_id; + CARD16 statusAttr_id; + CARD16 separatorAttr_id; + /* XIMExtension List */ + int ext_num; + XIMExt extension[COMMON_EXTENSIONS_NUM]; + /* transport specific connection address */ + void *connect_addr; + /* actual data is defined: + XSpecRec in Xi18nX.h for X-based connection. + TransSpecRec in Xi18nTr.h for Socket-based connection. + */ + /* clients table */ + Xi18nClient *clients; + Xi18nClient *free_clients; +} Xi18nAddressRec; + +typedef struct _Xi18nMethodsRec +{ + Bool (*begin) (XIMS); + Bool (*end) (XIMS); + Bool (*send) (XIMS, CARD16, unsigned char*, long); + Bool (*wait) (XIMS, CARD16, CARD8, CARD8); + Bool (*disconnect) (XIMS, CARD16); +} Xi18nMethodsRec; + +typedef struct _Xi18nCore +{ + Xi18nAddressRec address; + Xi18nMethodsRec methods; +} Xi18nCore; + +#endif + diff -ruN xwin86/IMdkit/Xi18nTr.h xwin/IMdkit/Xi18nTr.h --- xwin86/IMdkit/Xi18nTr.h Thu Jan 1 09:00:00 1970 +++ xwin/IMdkit/Xi18nTr.h Fri Dec 14 01:15:10 2001 @@ -0,0 +1,47 @@ +/****************************************************************** + + Copyright 1994, 1995 by Sun Microsystems, Inc. + Copyright 1993, 1994 by Hewlett-Packard Company + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without fee, +provided that the above copyright notice appear in all copies and +that both that copyright notice and this permission notice appear +in supporting documentation, and that the name of Sun Microsystems, Inc. +and Hewlett-Packard not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior permission. +Sun Microsystems, Inc. and Hewlett-Packard make no representations about +the suitability of this software for any purpose. It is provided "as is" +without express or implied warranty. + +SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. + + This version tidied and debugged by Steve Underwood May 1999 + +******************************************************************/ + +#ifndef _Xi18nTrTrans_h +#define _Xi18nTrTrans_h + +typedef struct _TransClient +{ + int accept_fd; + struct _XtransConnInfo *accept_conn; +} TransClient; + +typedef struct +{ + struct _XtransConnInfo *trans_conn; /* transport connection object */ + char *port; +} TransSpecRec; + +#endif diff -ruN xwin86/IMdkit/Xi18nX.h xwin/IMdkit/Xi18nX.h --- xwin86/IMdkit/Xi18nX.h Thu Jan 1 09:00:00 1970 +++ xwin/IMdkit/Xi18nX.h Fri Dec 14 01:15:10 2001 @@ -0,0 +1,52 @@ +/****************************************************************** + + Copyright 1994, 1995 by Sun Microsystems, Inc. + Copyright 1993, 1994 by Hewlett-Packard Company + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without fee, +provided that the above copyright notice appear in all copies and +that both that copyright notice and this permission notice appear +in supporting documentation, and that the name of Sun Microsystems, Inc. +and Hewlett-Packard not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior permission. +Sun Microsystems, Inc. and Hewlett-Packard make no representations about +the suitability of this software for any purpose. It is provided "as is" +without express or implied warranty. + +SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. + + This version tidied and debugged by Steve Underwood May 1999 + +******************************************************************/ + +#ifndef _Xi18nTrX_h +#define _Xi18nTrX_h + +#define _XIM_PROTOCOL "_XIM_PROTOCOL" +#define _XIM_XCONNECT "_XIM_XCONNECT" + +#define XCM_DATA_LIMIT 20 + +typedef struct _XClient +{ + Window client_win; /* client window */ + Window accept_win; /* accept window */ +} XClient; + +typedef struct +{ + Atom xim_request; + Atom connect_request; +} XSpecRec; + +#endif diff -ruN xwin86/IMdkit/XimFunc.h xwin/IMdkit/XimFunc.h --- xwin86/IMdkit/XimFunc.h Thu Jan 1 09:00:00 1970 +++ xwin/IMdkit/XimFunc.h Fri Dec 14 01:15:10 2001 @@ -0,0 +1,72 @@ +/****************************************************************** + + Copyright 1994, 1995 by Sun Microsystems, Inc. + Copyright 1993, 1994 by Hewlett-Packard Company + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without fee, +provided that the above copyright notice appear in all copies and +that both that copyright notice and this permission notice appear +in supporting documentation, and that the name of Sun Microsystems, Inc. +and Hewlett-Packard not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior permission. +Sun Microsystems, Inc. and Hewlett-Packard make no representations about +the suitability of this software for any purpose. It is provided "as is" +without express or implied warranty. + +SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. + + This version tidied and debugged by Steve Underwood May 1999 + +******************************************************************/ + +#ifndef _XimFunc_h +#define _XimFunc_h + +/* i18nAttr.c */ +void _Xi18nInitAttrList (Xi18n i18n_core); +void _Xi18nInitExtension(Xi18n i18n_core); + +/* i18nClbk.c */ +int _Xi18nGeometryCallback (XIMS ims, IMProtocol *call_data); +int _Xi18nPreeditStartCallback (XIMS ims, IMProtocol *call_data); +int _Xi18nPreeditDrawCallback (XIMS ims, IMProtocol *call_data); +int _Xi18nPreeditCaretCallback (XIMS ims, IMProtocol *call_data); +int _Xi18nPreeditDoneCallback (XIMS ims, IMProtocol *call_data); +int _Xi18nStatusStartCallback (XIMS ims, IMProtocol *call_data); +int _Xi18nStatusDrawCallback (XIMS ims, IMProtocol *call_data); +int _Xi18nStatusDoneCallback (XIMS ims, IMProtocol *call_data); +int _Xi18nStringConversionCallback (XIMS ims, IMProtocol *call_data); + +/* i18nIc.c */ +void _Xi18nChangeIC (XIMS ims, IMProtocol *call_data, unsigned char *p, + int create_flag); +void _Xi18nGetIC (XIMS ims, IMProtocol *call_data, unsigned char *p); + +/* i18nUtil.c */ +int _Xi18nNeedSwap (Xi18n i18n_core, CARD16 connect_id); +Xi18nClient *_Xi18nNewClient(Xi18n i18n_core); +Xi18nClient *_Xi18nFindClient (Xi18n i18n_core, CARD16 connect_id); +void _Xi18nDeleteClient (Xi18n i18n_core, CARD16 connect_id); +void _Xi18nSendMessage (XIMS ims, CARD16 connect_id, CARD8 major_opcode, + CARD8 minor_opcode, unsigned char *data, long length); +void _Xi18nSendTriggerKey (XIMS ims, CARD16 connect_id); +void _Xi18nSetEventMask (XIMS ims, CARD16 connect_id, CARD16 im_id, + CARD16 ic_id, CARD32 forward_mask, CARD32 sync_mask); + +/* Xlib internal */ +void _XRegisterFilterByType(Display*, Window, int, int, + Bool (*filter)(Display*, Window, XEvent*, XPointer), XPointer); +void _XUnregisterFilter(Display*, Window, + Bool (*filter)(Display*, Window, XEvent*, XPointer), XPointer); + +#endif diff -ruN xwin86/IMdkit/XimProto.h xwin/IMdkit/XimProto.h --- xwin86/IMdkit/XimProto.h Thu Jan 1 09:00:00 1970 +++ xwin/IMdkit/XimProto.h Fri Dec 14 01:15:10 2001 @@ -0,0 +1,230 @@ +/* $XConsortium: XimProto.h,v 1.2 94/01/20 18:02:24 rws Exp $ */ +/****************************************************************** + + Copyright 1992, 1993, 1994 by FUJITSU LIMITED + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without fee, +provided that the above copyright notice appear in all copies and +that both that copyright notice and this permission notice appear +in supporting documentation, and that the name of FUJITSU LIMITED +not be used in advertising or publicity pertaining to distribution +of the software without specific, written prior permission. +FUJITSU LIMITED makes no representations about the suitability of +this software for any purpose. +It is provided "as is" without express or implied warranty. + +FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +EVENT SHALL FUJITSU LIMITED BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF +USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + + Author: Takashi Fujiwara FUJITSU LIMITED + fujiwara@a80.tech.yk.fujitsu.co.jp + + This version tidied and debugged by Steve Underwood May 1999 + +******************************************************************/ + +#ifndef _XIMPROTO_H +#define _XIMPROTO_H + +/* + * Default Preconnection selection target + */ +#define XIM_SERVERS "XIM_SERVERS" +#define XIM_LOCALES "LOCALES" +#define XIM_TRANSPORT "TRANSPORT" + +/* + * categories in XIM_SERVERS + */ +#define XIM_SERVER_CATEGORY "@server=" +#define XIM_LOCAL_CATEGORY "@locale=" +#define XIM_TRANSPORT_CATEGORY "@transport=" + +/* + * Xim implementation revision + */ +#define PROTOCOLMAJORVERSION 0 +#define PROTOCOLMINORVERSION 0 + +/* + * Major Protocol number + */ +#define XIM_CONNECT 1 +#define XIM_CONNECT_REPLY 2 +#define XIM_DISCONNECT 3 +#define XIM_DISCONNECT_REPLY 4 + +#define XIM_AUTH_REQUIRED 10 +#define XIM_AUTH_REPLY 11 +#define XIM_AUTH_NEXT 12 +#define XIM_AUTH_SETUP 13 +#define XIM_AUTH_NG 14 + +#define XIM_ERROR 20 + +#define XIM_OPEN 30 +#define XIM_OPEN_REPLY 31 +#define XIM_CLOSE 32 +#define XIM_CLOSE_REPLY 33 +#define XIM_REGISTER_TRIGGERKEYS 34 +#define XIM_TRIGGER_NOTIFY 35 +#define XIM_TRIGGER_NOTIFY_REPLY 36 +#define XIM_SET_EVENT_MASK 37 +#define XIM_ENCODING_NEGOTIATION 38 +#define XIM_ENCODING_NEGOTIATION_REPLY 39 +#define XIM_QUERY_EXTENSION 40 +#define XIM_QUERY_EXTENSION_REPLY 41 +#define XIM_SET_IM_VALUES 42 +#define XIM_SET_IM_VALUES_REPLY 43 +#define XIM_GET_IM_VALUES 44 +#define XIM_GET_IM_VALUES_REPLY 45 + +#define XIM_CREATE_IC 50 +#define XIM_CREATE_IC_REPLY 51 +#define XIM_DESTROY_IC 52 +#define XIM_DESTROY_IC_REPLY 53 +#define XIM_SET_IC_VALUES 54 +#define XIM_SET_IC_VALUES_REPLY 55 +#define XIM_GET_IC_VALUES 56 +#define XIM_GET_IC_VALUES_REPLY 57 +#define XIM_SET_IC_FOCUS 58 +#define XIM_UNSET_IC_FOCUS 59 +#define XIM_FORWARD_EVENT 60 +#define XIM_SYNC 61 +#define XIM_SYNC_REPLY 62 +#define XIM_COMMIT 63 +#define XIM_RESET_IC 64 +#define XIM_RESET_IC_REPLY 65 + +#define XIM_GEOMETRY 70 +#define XIM_STR_CONVERSION 71 +#define XIM_STR_CONVERSION_REPLY 72 +#define XIM_PREEDIT_START 73 +#define XIM_PREEDIT_START_REPLY 74 +#define XIM_PREEDIT_DRAW 75 +#define XIM_PREEDIT_CARET 76 +#define XIM_PREEDIT_CARET_REPLY 77 +#define XIM_PREEDIT_DONE 78 +#define XIM_STATUS_START 79 +#define XIM_STATUS_DRAW 80 +#define XIM_STATUS_DONE 81 + +/* + * values for the flag of XIM_ERROR + */ +#define XIM_IMID_VALID 0x0001 +#define XIM_ICID_VALID 0x0002 + +/* + * XIM Error Code + */ +#define XIM_BadAlloc 1 +#define XIM_BadStyle 2 +#define XIM_BadClientWindow 3 +#define XIM_BadFocusWindow 4 +#define XIM_BadArea 5 +#define XIM_BadSpotLocation 6 +#define XIM_BadColormap 7 +#define XIM_BadAtom 8 +#define XIM_BadPixel 9 +#define XIM_BadPixmap 10 +#define XIM_BadName 11 +#define XIM_BadCursor 12 +#define XIM_BadProtocol 13 +#define XIM_BadForeground 14 +#define XIM_BadBackground 15 +#define XIM_LocaleNotSupported 16 +#define XIM_BadSomething 999 + +/* + * byte order + */ +#define BIGENDIAN (CARD8) 0x42 /* MSB first */ +#define LITTLEENDIAN (CARD8) 0x6c /* LSB first */ + +/* + * values for the type of XIMATTR & XICATTR + */ +#define XimType_SeparatorOfNestedList 0 +#define XimType_CARD8 1 +#define XimType_CARD16 2 +#define XimType_CARD32 3 +#define XimType_STRING8 4 +#define XimType_Window 5 +#define XimType_XIMStyles 10 +#define XimType_XRectangle 11 +#define XimType_XPoint 12 +#define XimType_XFontSet 13 +#define XimType_XIMOptions 14 +#define XimType_XIMHotKeyTriggers 15 +#define XimType_XIMHotKeyState 16 +#define XimType_XIMStringConversion 17 +#define XimType_XIMValuesList 18 +#define XimType_NEST 0x7FFF + +/* + * values for the category of XIM_ENCODING_NEGOTIATON_REPLY + */ +#define XIM_Encoding_NameCategory 0 +#define XIM_Encoding_DetailCategory 1 + +/* + * value for the index of XIM_ENCODING_NEGOTIATON_REPLY + */ +#define XIM_Default_Encoding_IDX -1 + +/* + * value for the flag of XIM_FORWARD_EVENT, XIM_COMMIT + */ +#define XimSYNCHRONUS 0x0001 +#define XimLookupChars 0x0002 +#define XimLookupKeySym 0x0004 +#define XimLookupBoth 0x0006 + +/* + * request packet header size + */ +#define XIM_HEADER_SIZE \ + sizeof(CARD8) /* sizeof mejor-opcode */ \ + + sizeof(CARD8) /* sizeof minor-opcode */ \ + + sizeof(INT16) /* sizeof length */ + +/* + * Client Message data size + */ +#define XIM_CM_DATA_SIZE 20 + +/* + * XIM data structure + */ +typedef CARD16 BITMASK16; +typedef CARD32 BITMASK32; +typedef CARD32 EVENTMASK; + +typedef CARD16 XIMID; /* Input Method ID */ +typedef CARD16 XICID; /* Input Context ID */ + +/* + * Padding macro + */ +#define XIM_PAD(length) ((4 - ((length) % 4)) % 4) + +#define XIM_SET_PAD(ptr, length) \ + { \ + register int Counter = XIM_PAD((int)length); \ + if (Counter) { \ + register char *Ptr = (char *)(ptr) + (length); \ + length += Counter; \ + for (; Counter; --Counter, ++Ptr) \ + *Ptr = '\0'; \ + } \ + } + +#endif + diff -ruN xwin86/IMdkit/i18nAttr.c xwin/IMdkit/i18nAttr.c --- xwin86/IMdkit/i18nAttr.c Thu Jan 1 09:00:00 1970 +++ xwin/IMdkit/i18nAttr.c Fri Dec 14 01:15:20 2001 @@ -0,0 +1,175 @@ +/****************************************************************** + + Copyright 1994, 1995 by Sun Microsystems, Inc. + Copyright 1993, 1994 by Hewlett-Packard Company + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without fee, +provided that the above copyright notice appear in all copies and +that both that copyright notice and this permission notice appear +in supporting documentation, and that the name of Sun Microsystems, Inc. +and Hewlett-Packard not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior permission. +Sun Microsystems, Inc. and Hewlett-Packard make no representations about +the suitability of this software for any purpose. It is provided "as is" +without express or implied warranty. + +SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. + + This version tidied and debugged by Steve Underwood May 1999 + +******************************************************************/ + +#include +#include +#include "IMdkit.h" +#include "Xi18n.h" +#include "XimFunc.h" + +typedef struct +{ + char *name; + CARD16 type; +} IMListOfAttr; + +typedef struct +{ + char *name; + CARD8 major_opcode; + CARD8 minor_opcode; +} IMExtList; + +IMListOfAttr Default_IMattr[] = +{ + {XNQueryInputStyle, XimType_XIMStyles}, +/* {XNQueryIMValuesList, XimType_XIMValuesList}, */ + {(char *) NULL, (CARD16) 0} +}; + +IMListOfAttr Default_ICattr[] = +{ + {XNInputStyle, XimType_CARD32}, + {XNClientWindow, XimType_Window}, + {XNFocusWindow, XimType_Window}, + {XNFilterEvents, XimType_CARD32}, + {XNPreeditAttributes, XimType_NEST}, + {XNStatusAttributes, XimType_NEST}, + {XNFontSet, XimType_XFontSet}, + {XNArea, XimType_XRectangle}, + {XNAreaNeeded, XimType_XRectangle}, + {XNColormap, XimType_CARD32}, + {XNStdColormap, XimType_CARD32}, + {XNForeground, XimType_CARD32}, + {XNBackground, XimType_CARD32}, + {XNBackgroundPixmap, XimType_CARD32}, + {XNSpotLocation, XimType_XPoint}, + {XNLineSpace, XimType_CARD32}, + {XNPreeditState, XimType_CARD32}, + {XNSeparatorofNestedList, XimType_SeparatorOfNestedList}, + {(char *) NULL, (CARD16) NULL} +}; + +IMExtList Default_Extension[] = +{ + {"XIM_EXT_MOVE", XIM_EXTENSION, XIM_EXT_MOVE}, + {"XIM_EXT_SET_EVENT_MASK", XIM_EXTENSION, XIM_EXT_SET_EVENT_MASK}, + {"XIM_EXT_FORWARD_KEYEVENT", XIM_EXTENSION, XIM_EXT_FORWARD_KEYEVENT}, + {(char *) NULL, (CARD8) NULL, (CARD8) NULL} +}; + +static void CountAttrList(IMListOfAttr *attr, int *total_count) +{ + *total_count = 0; + + while (attr->name != NULL) + { + attr++; + ++(*total_count); + } +} + +static XIMAttr *CreateAttrList (Xi18n i18n_core, + IMListOfAttr *attr, + int *total_count) +{ + XIMAttr *args, *p; + unsigned int buf_size; + + CountAttrList(attr, total_count); + + buf_size = (unsigned) (*total_count + 1)*sizeof (XIMAttr); + args = (XIMAttr *) malloc (buf_size); + if (!args) + return (XIMAttr *) NULL; + /*endif*/ + memset (args, 0, buf_size); + + for (p = args; attr->name != NULL; attr++, p++) + { + p->name = attr->name; + p->length = strlen (attr->name); + p->type = (CARD16) attr->type; + p->attribute_id = XrmStringToQuark (p->name); + if (strcmp (p->name, XNPreeditAttributes) == 0) + i18n_core->address.preeditAttr_id = p->attribute_id; + else if (strcmp (p->name, XNStatusAttributes) == 0) + i18n_core->address.statusAttr_id = p->attribute_id; + else if (strcmp (p->name, XNSeparatorofNestedList) == 0) + i18n_core->address.separatorAttr_id = p->attribute_id; + /*endif*/ + } + /*endfor*/ + p->name = (char *) NULL; + + return args; +} + +void _Xi18nInitAttrList (Xi18n i18n_core) +{ + XIMAttr *args; + int total_count; + + /* init IMAttr list */ + if (i18n_core->address.xim_attr) + XFree ((char *)i18n_core->address.xim_attr); + /*endif*/ + args = CreateAttrList (i18n_core, Default_IMattr, &total_count); + + i18n_core->address.im_attr_num = total_count; + i18n_core->address.xim_attr = (XIMAttr *)args; + + /* init ICAttr list */ + if (i18n_core->address.xic_attr) + XFree ((char *) i18n_core->address.xic_attr); + /*endif*/ + args = CreateAttrList (i18n_core, Default_ICattr, &total_count); + + i18n_core->address.ic_attr_num = total_count; + i18n_core->address.xic_attr = (XICAttr *) args; +} + +void _Xi18nInitExtension(Xi18n i18n_core) +{ + register int i; + IMExtList *extensions = (IMExtList *) Default_Extension; + XIMExt *ext_list = (XIMExt *) i18n_core->address.extension; + + for (i = 0; extensions->name; i++, ext_list++, extensions++) + { + ext_list->major_opcode = extensions->major_opcode; + ext_list->minor_opcode = extensions->minor_opcode; + ext_list->name = extensions->name; + ext_list->length = strlen(ext_list->name); + } + /*endfor*/ + i18n_core->address.ext_num = i; +} diff -ruN xwin86/IMdkit/i18nClbk.c xwin/IMdkit/i18nClbk.c --- xwin86/IMdkit/i18nClbk.c Thu Jan 1 09:00:00 1970 +++ xwin/IMdkit/i18nClbk.c Fri Dec 14 01:15:20 2001 @@ -0,0 +1,518 @@ +/****************************************************************** + + Copyright 1994, 1995 by Sun Microsystems, Inc. + Copyright 1993, 1994 by Hewlett-Packard Company + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without fee, +provided that the above copyright notice appear in all copies and +that both that copyright notice and this permission notice appear +in supporting documentation, and that the name of Sun Microsystems, Inc. +and Hewlett-Packard not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior permission. +Sun Microsystems, Inc. and Hewlett-Packard make no representations about +the suitability of this software for any purpose. It is provided "as is" +without express or implied warranty. + +SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. + + This version tidied and debugged by Steve Underwood May 1999 + +******************************************************************/ + +#include +#include "IMdkit.h" +#include "Xi18n.h" +#include "FrameMgr.h" +#include "XimFunc.h" + +int _Xi18nGeometryCallback (XIMS ims, IMProtocol *call_data) +{ + Xi18n i18n_core = ims->protocol; + FrameMgr fm; + extern XimFrameRec geometry_fr[]; + register int total_size; + unsigned char *reply = NULL; + IMGeometryCBStruct *geometry_CB = + (IMGeometryCBStruct *) &call_data->geometry_callback; + CARD16 connect_id = call_data->any.connect_id; + + fm = FrameMgrInit (geometry_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; + } + /*endif*/ + memset (reply, 0, total_size); + FrameMgrSetBuffer (fm, reply); + + FrameMgrPutToken (fm, connect_id); + FrameMgrPutToken (fm, geometry_CB->icid); + + _Xi18nSendMessage (ims, + connect_id, + XIM_GEOMETRY, + 0, + reply, + total_size); + FrameMgrFree (fm); + XFree (reply); + + /* XIM_GEOMETRY is an asyncronous protocol, + so return immediately. */ + return True; +} + +int _Xi18nPreeditStartCallback (XIMS ims, IMProtocol *call_data) +{ + Xi18n i18n_core = ims->protocol; + FrameMgr fm; + extern XimFrameRec preedit_start_fr[]; + register int total_size; + unsigned char *reply = NULL; + IMPreeditCBStruct *preedit_CB = + (IMPreeditCBStruct*) &call_data->preedit_callback; + CARD16 connect_id = call_data->any.connect_id; + + fm = FrameMgrInit (preedit_start_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; + } + /*endif*/ + memset (reply, 0, total_size); + FrameMgrSetBuffer (fm, reply); + + FrameMgrPutToken (fm, connect_id); + FrameMgrPutToken (fm, preedit_CB->icid); + + _Xi18nSendMessage (ims, + connect_id, + XIM_PREEDIT_START, + 0, + reply, + total_size); + FrameMgrFree (fm); + XFree (reply); + + return True; +} + +int _Xi18nPreeditDrawCallback (XIMS ims, IMProtocol *call_data) +{ + Xi18n i18n_core = ims->protocol; + FrameMgr fm; + extern XimFrameRec preedit_draw_fr[]; + register int total_size; + unsigned char *reply = NULL; + IMPreeditCBStruct *preedit_CB = + (IMPreeditCBStruct *) &call_data->preedit_callback; + XIMPreeditDrawCallbackStruct *draw = + (XIMPreeditDrawCallbackStruct *) &preedit_CB->todo.draw; + CARD16 connect_id = call_data->any.connect_id; + register int feedback_count; + register int i; + BITMASK32 status = 0x0; + + if (draw->text->length == 0) + status = 0x00000001; + else if (draw->text->feedback[0] == 0) + status = 0x00000002; + /*endif*/ + + fm = FrameMgrInit (preedit_draw_fr, + NULL, + _Xi18nNeedSwap (i18n_core, connect_id)); + + /* set length of preedit string */ + FrameMgrSetSize (fm, draw->text->length); + + /* set iteration count for list of feedback */ + for (i = 0; draw->text->feedback[i] != 0; i++) + ; + /*endfor*/ + feedback_count = i; + FrameMgrSetIterCount (fm, feedback_count); + + total_size = FrameMgrGetTotalSize (fm); + reply = (unsigned char *) malloc (total_size); + if (!reply) + { + _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); + return False; + } + /*endif*/ + memset (reply, 0, total_size); + FrameMgrSetBuffer (fm, reply); + + FrameMgrPutToken (fm, connect_id); + FrameMgrPutToken (fm, preedit_CB->icid); + FrameMgrPutToken (fm, draw->caret); + FrameMgrPutToken (fm, draw->chg_first); + FrameMgrPutToken (fm, draw->chg_length); + FrameMgrPutToken (fm, status); + FrameMgrPutToken (fm, draw->text->length); + FrameMgrPutToken (fm, draw->text->string); + for (i = 0; i < feedback_count; i++) + FrameMgrPutToken (fm, draw->text->feedback[i]); + /*endfor*/ + + _Xi18nSendMessage (ims, + connect_id, + XIM_PREEDIT_DRAW, + 0, + reply, + total_size); + FrameMgrFree (fm); + XFree (reply); + + /* XIM_PREEDIT_DRAW is an asyncronous protocol, so return immediately. */ + return True; +} + +int _Xi18nPreeditCaretCallback (XIMS ims, IMProtocol *call_data) +{ + Xi18n i18n_core = ims->protocol; + FrameMgr fm; + extern XimFrameRec preedit_caret_fr[]; + register int total_size; + unsigned char *reply = NULL; + IMPreeditCBStruct *preedit_CB = + (IMPreeditCBStruct*) &call_data->preedit_callback; + XIMPreeditCaretCallbackStruct *caret = + (XIMPreeditCaretCallbackStruct *) &preedit_CB->todo.caret; + CARD16 connect_id = call_data->any.connect_id; + + fm = FrameMgrInit (preedit_caret_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; + } + /*endif*/ + memset (reply, 0, total_size); + FrameMgrSetBuffer (fm, reply); + + FrameMgrPutToken (fm, connect_id); + FrameMgrPutToken (fm, preedit_CB->icid); + FrameMgrPutToken (fm, caret->position); + FrameMgrPutToken (fm, caret->direction); + FrameMgrPutToken (fm, caret->style); + + _Xi18nSendMessage (ims, + connect_id, + XIM_PREEDIT_CARET, + 0, + reply, + total_size); + FrameMgrFree (fm); + XFree (reply); + + return True; +} + +int _Xi18nPreeditDoneCallback (XIMS ims, IMProtocol *call_data) +{ + Xi18n i18n_core = ims->protocol; + FrameMgr fm; + extern XimFrameRec preedit_done_fr[]; + register int total_size; + unsigned char *reply = NULL; + IMPreeditCBStruct *preedit_CB = + (IMPreeditCBStruct *) &call_data->preedit_callback; + CARD16 connect_id = call_data->any.connect_id; + + fm = FrameMgrInit (preedit_done_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; + } + /*endif*/ + memset (reply, 0, total_size); + FrameMgrSetBuffer (fm, reply); + + FrameMgrPutToken (fm, connect_id); + FrameMgrPutToken (fm, preedit_CB->icid); + + _Xi18nSendMessage (ims, + connect_id, + XIM_PREEDIT_DONE, + 0, + reply, + total_size); + FrameMgrFree (fm); + XFree (reply); + + /* XIM_PREEDIT_DONE is an asyncronous protocol, so return immediately. */ + return True; +} + +int _Xi18nStatusStartCallback (XIMS ims, IMProtocol *call_data) +{ + Xi18n i18n_core = ims->protocol; + FrameMgr fm; + extern XimFrameRec status_start_fr[]; + register int total_size; + unsigned char *reply = NULL; + IMStatusCBStruct *status_CB = + (IMStatusCBStruct*) &call_data->status_callback; + CARD16 connect_id = call_data->any.connect_id; + + fm = FrameMgrInit (status_start_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; + } + /*endif*/ + memset (reply, 0, total_size); + FrameMgrSetBuffer (fm, reply); + + FrameMgrPutToken (fm, connect_id); + FrameMgrPutToken (fm, status_CB->icid); + + _Xi18nSendMessage (ims, + connect_id, + XIM_STATUS_START, + 0, + reply, + total_size); + FrameMgrFree (fm); + XFree (reply); + + /* XIM_STATUS_START is an asyncronous protocol, so return immediately. */ + return True; +} + +int _Xi18nStatusDrawCallback (XIMS ims, IMProtocol *call_data) +{ + Xi18n i18n_core = ims->protocol; + FrameMgr fm = (FrameMgr)0; + extern XimFrameRec status_draw_text_fr[]; + extern XimFrameRec status_draw_bitmap_fr[]; + register int total_size = 0; + unsigned char *reply = NULL; + IMStatusCBStruct *status_CB = + (IMStatusCBStruct *) &call_data->status_callback; + XIMStatusDrawCallbackStruct *draw = + (XIMStatusDrawCallbackStruct *) &status_CB->todo.draw; + CARD16 connect_id = call_data->any.connect_id; + register int feedback_count; + register int i; + BITMASK32 status = 0x0; + + switch (draw->type) + { + case XIMTextType: + fm = FrameMgrInit (status_draw_text_fr, + NULL, + _Xi18nNeedSwap (i18n_core, connect_id)); + + if (draw->data.text->length == 0) + status = 0x00000001; + else if (draw->data.text->feedback[0] == 0) + status = 0x00000002; + /*endif*/ + + /* set length of status string */ + FrameMgrSetSize(fm, draw->data.text->length); + /* set iteration count for list of feedback */ + for (i = 0; draw->data.text->feedback[i] != 0; i++) + ; + /*endfor*/ + feedback_count = i; + FrameMgrSetIterCount (fm, feedback_count); + + total_size = FrameMgrGetTotalSize (fm); + reply = (unsigned char *) malloc (total_size); + if (!reply) + { + _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); + return False; + } + /*endif*/ + memset (reply, 0, total_size); + FrameMgrSetBuffer (fm, reply); + + FrameMgrPutToken (fm, connect_id); + FrameMgrPutToken (fm, status_CB->icid); + FrameMgrPutToken (fm, draw->type); + FrameMgrPutToken (fm, status); + FrameMgrPutToken (fm, draw->data.text->length); + FrameMgrPutToken (fm, draw->data.text->string); + for (i = 0; i < feedback_count; i++) + FrameMgrPutToken (fm, draw->data.text->feedback[i]); + /*endfor*/ + break; + + case XIMBitmapType: + fm = FrameMgrInit (status_draw_bitmap_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; + } + /*endif*/ + memset (reply, 0, total_size); + FrameMgrSetBuffer (fm, reply); + + FrameMgrPutToken (fm, connect_id); + FrameMgrPutToken (fm, status_CB->icid); + FrameMgrPutToken (fm, draw->data.bitmap); + break; + } + /*endswitch*/ + _Xi18nSendMessage (ims, + connect_id, + XIM_STATUS_DRAW, + 0, + reply, + total_size); + FrameMgrFree (fm); + XFree (reply); + + /* XIM_STATUS_DRAW is an asyncronous protocol, so return immediately. */ + return True; +} + +int _Xi18nStatusDoneCallback (XIMS ims, IMProtocol *call_data) +{ + Xi18n i18n_core = ims->protocol; + FrameMgr fm; + extern XimFrameRec status_done_fr[]; + register int total_size; + unsigned char *reply = NULL; + IMStatusCBStruct *status_CB = + (IMStatusCBStruct *) &call_data->status_callback; + CARD16 connect_id = call_data->any.connect_id; + + fm = FrameMgrInit (status_done_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; + } + /*endif*/ + memset (reply, 0, total_size); + FrameMgrSetBuffer (fm, reply); + + FrameMgrPutToken (fm, connect_id); + FrameMgrPutToken (fm, status_CB->icid); + + _Xi18nSendMessage (ims, + connect_id, + XIM_STATUS_DONE, + 0, + reply, + total_size); + FrameMgrFree (fm); + XFree (reply); + + /* XIM_STATUS_DONE is an asyncronous protocol, so return immediately. */ + return True; +} + +int _Xi18nStringConversionCallback (XIMS ims, IMProtocol *call_data) +{ + Xi18n i18n_core = ims->protocol; + FrameMgr fm; + extern XimFrameRec str_conversion_fr[]; + register int total_size; + unsigned char *reply = NULL; + IMStrConvCBStruct *call_back = + (IMStrConvCBStruct *) &call_data->strconv_callback; + XIMStringConversionCallbackStruct *strconv = + (XIMStringConversionCallbackStruct *) &call_back->strconv; + CARD16 connect_id = call_data->any.connect_id; + + fm = FrameMgrInit (str_conversion_fr, + NULL, + _Xi18nNeedSwap (i18n_core, connect_id)); +#if 0 + /* set length of preedit string */ + FrameMgrSetSize (fm, strconv->text->length); +#endif + total_size = FrameMgrGetTotalSize (fm); + reply = (unsigned char *) malloc (total_size); + if (!reply) + { + _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); + return False; + } + /*endif*/ + memset (reply, 0, total_size); + FrameMgrSetBuffer (fm, reply); + + FrameMgrPutToken (fm, connect_id); + FrameMgrPutToken (fm, call_back->icid); + FrameMgrPutToken (fm, strconv->position); + FrameMgrPutToken (fm, strconv->direction); + FrameMgrPutToken (fm, strconv->operation); +#if 0 + FrameMgrPutToken (fm, strconv->text->string); +#endif + _Xi18nSendMessage (ims, connect_id, + XIM_STR_CONVERSION, + 0, + reply, + total_size); + FrameMgrFree (fm); + XFree (reply); + + /* XIM_STR_CONVERSION is a syncronous protocol, + so should wait here for XIM_STR_CONVERSION_REPLY. */ + if (i18n_core->methods.wait (ims, + connect_id, + XIM_STR_CONVERSION_REPLY, + 0) == False) + { + return False; + } + /*endif*/ + return True; +} diff -ruN xwin86/IMdkit/i18nIMProto.c xwin/IMdkit/i18nIMProto.c --- xwin86/IMdkit/i18nIMProto.c Thu Jan 1 09:00:00 1970 +++ xwin/IMdkit/i18nIMProto.c Fri Dec 14 01:15:20 2001 @@ -0,0 +1,756 @@ +/****************************************************************** +Copyright 1993, 1994 by Digital Equipment Corporation, Maynard, Massachusetts, +Copyright 1993, 1994 by Hewlett-Packard Company + +Copyright 1994, 1995 by Sun Microsystems, Inc. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Digital or MIT not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL WARRANTIES WITH REGARD +TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL DIGITAL AND HEWLETT-PACKARD COMPANY BE LIABLE +FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + Author: Hiroyuki Miyamoto Digital Equipment Corporation + miyamoto@jrd.dec.com + Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. + + This version tidied and debugged by Steve Underwood May 1999 + +******************************************************************/ + +/* Protocol Packet frames */ + +#include "FrameMgr.h" + +/* Data type definitions */ + +static XimFrameRec ximattr_fr[] = +{ + _FRAME(BIT16), /* attribute ID */ + _FRAME(BIT16), /* type of the value */ + _FRAME(BIT16), /* length of im-attribute */ + _FRAME(BARRAY), /* im-attribute */ + _PAD4(2), + _FRAME(EOL), +}; + +static XimFrameRec xicattr_fr[] = +{ + _FRAME(BIT16), /* attribute ID */ + _FRAME(BIT16), /* type of the value */ + _FRAME(BIT16), /* length of ic-attribute */ + _FRAME(BARRAY), /* ic-attribute */ + _PAD4(2), + _FRAME(EOL), +}; + +static XimFrameRec ximattribute_fr[] = +{ + _FRAME(BIT16), /* attribute ID */ + _FRAME(BIT16), /* value length */ + _FRAME(BARRAY), /* value */ + _PAD4(1), + _FRAME(EOL), +}; + +static XimFrameRec xicattribute_fr[] = +{ + _FRAME(BIT16), /* attribute ID */ + _FRAME(BIT16), /* value length */ + _FRAME(BARRAY), /* value */ + _PAD4(1), + _FRAME(EOL), +}; + +static XimFrameRec ximtriggerkey_fr[] = +{ + _FRAME(BIT32), /* keysym */ + _FRAME(BIT32), /* modifier */ + _FRAME(BIT32), /* modifier mask */ + _FRAME(EOL), +}; + +static XimFrameRec encodinginfo_fr[] = +{ + _FRAME(BIT16), /* length of encoding info */ + _FRAME(BARRAY), /* encoding info */ + _PAD4(2), + _FRAME(EOL), +}; + +static XimFrameRec str_fr[] = +{ + _FRAME(BIT8), /* number of byte */ + _FRAME(BARRAY), /* string */ + _FRAME(EOL), +}; + +static XimFrameRec xpcs_fr[] = +{ + _FRAME(BIT16), /* length of string in bytes */ + _FRAME(BARRAY), /* string */ + _PAD4(2), +}; + +static XimFrameRec ext_fr[] = +{ + _FRAME(BIT16), /* extension major-opcode */ + _FRAME(BIT16), /* extension minor-opcode */ + _FRAME(BIT16), /* length of extension name */ + _FRAME(BARRAY), /* extension name */ + _PAD4(2), + _FRAME(EOL), +}; + +static XimFrameRec inputstyle_fr[] = +{ + _FRAME(BIT32), /* inputstyle */ + _FRAME(EOL), +}; +/* Protocol definitions */ + +xim_externaldef XimFrameRec attr_head_fr[] = +{ + _FRAME(BIT16), /* attribute id */ + _FRAME(BIT16), /* attribute length */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec short_fr[] = +{ + _FRAME(BIT16), /* value */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec long_fr[] = +{ + _FRAME(BIT32), /* value */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec xrectangle_fr[] = +{ + _FRAME(BIT16), /* x */ + _FRAME(BIT16), /* y */ + _FRAME(BIT16), /* width */ + _FRAME(BIT16), /* height */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec xpoint_fr[] = +{ + _FRAME(BIT16), /* x */ + _FRAME(BIT16), /* y */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec fontset_fr[] = +{ + _FRAME(BIT16), /* length of base font name */ + _FRAME(BARRAY), /* base font name list */ + _PAD4(2), /* unused */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec input_styles_fr[] = +{ + _FRAME(BIT16), /* number of list */ + _PAD4(1), /* unused */ + _FRAME(ITER), /* XIMStyle list */ + _FRAME(POINTER), + _PTR(inputstyle_fr), + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec packet_header_fr[] = +{ + _FRAME(BIT8), /* major-opcode */ + _FRAME(BIT8), /* minor-opcode */ + _FRAME(BIT16), /* length */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec error_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(BIT16), /* flag */ + _FRAME(BIT16), /* Error Code */ + _FRAME(BIT16), /* length of error detail */ + _FRAME(BIT16), /* type of error detail */ + _FRAME(BARRAY), /* error detail */ + _PAD4(1), + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec connect_fr[] = +{ + _FRAME(BIT8), /* byte order */ + _PAD2(1), /* unused */ + _FRAME(BIT16), /* client-major-protocol-version */ + _FRAME(BIT16), /* client-minor-protocol-version */ + _BYTE_COUNTER(BIT16, 1), /* length of client-auth-protocol-names */ + _FRAME(ITER), /* client-auth-protocol-names */ + _FRAME(POINTER), + _PTR(xpcs_fr), + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec connect_reply_fr[] = +{ + _FRAME(BIT16), /* server-major-protocol-version */ + _FRAME(BIT16), /* server-minor-protocol-version */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec auth_required_fr[] = +{ + _FRAME(BIT8), /* auth-protocol-index */ + _FRAME(BIT8), /* auth-data1 */ + _FRAME(BARRAY), /* auth-data2 */ + _PAD4(3), + _FRAME(EOL), +}; + + +xim_externaldef XimFrameRec auth_reply_fr[] = +{ + _FRAME(BIT8), + _FRAME(BARRAY), + _PAD4(2), + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec auth_next_fr[] = +{ + _FRAME(BIT8), /* auth-data1 */ + _FRAME(BARRAY), /* auth-data2 */ + _PAD4(2), + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec auth_setup_fr[] = +{ + _BYTE_COUNTER(BIT16, 2), /* number of client-auth-protocol-names */ + _PAD4(1), /* unused */ + _FRAME(ITER), /* server-auth-protocol-names */ + _FRAME(POINTER), + _PTR(xpcs_fr), + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec auth_ng_fr[] = +{ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec disconnect_fr[] = +{ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec disconnect_reply_fr[] = +{ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec open_fr[] = +{ + _FRAME(POINTER), /* locale name */ + _PTR(str_fr), + _PAD4(1), + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec open_reply_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _BYTE_COUNTER(BIT16, 1), /* byte length of IM attributes supported */ + _FRAME(ITER), /* IM attribute supported */ + _FRAME(POINTER), + _PTR(ximattr_fr), + _BYTE_COUNTER(BIT16, 2), /* number of IC attribute supported */ + _PAD4(1), /* unused */ + _FRAME(ITER), /* IC attribute supported */ + _FRAME(POINTER), + _PTR(xicattr_fr), + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec close_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _PAD4(1), /* unused */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec close_reply_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _PAD4(1), /* unused */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec register_triggerkeys_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _PAD4(1), /* unused */ + _BYTE_COUNTER(BIT32, 1), /* byte length of on-keys */ + _FRAME(ITER), /* on-keys list */ + _FRAME(POINTER), + _PTR(ximtriggerkey_fr), + _BYTE_COUNTER(BIT32, 1), /* byte length of off-keys */ + _FRAME(ITER), /* off-keys list */ + _FRAME(POINTER), + _PTR(ximtriggerkey_fr), + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec trigger_notify_fr[] = +{ + _FRAME(BIT16), /* input-mehotd-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(BIT32), /* flag */ + _FRAME(BIT32), /* index of keys list */ + _FRAME(BIT32), /* client-select-event-mask */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec trigger_notify_reply_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec set_event_mask_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(BIT32), /* forward-event-mask */ + _FRAME(BIT32), /* synchronous-event-mask */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec encoding_negotiation_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _BYTE_COUNTER(BIT16, 1), /* byte length of encodings listed by name */ + _FRAME(ITER), /* supported list of encoding in IM library */ + _FRAME(POINTER), + _PTR(str_fr), + _PAD4(1), + _BYTE_COUNTER(BIT16, 2), /* byte length of encodings listed by + detailed data */ + _PAD4(1), + _FRAME(ITER), /* list of encodings supported in the + IM library */ + _FRAME(POINTER), + _PTR(encodinginfo_fr), + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec encoding_negotiation_reply_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* category of the encoding determined */ + _FRAME(BIT16), /* index of the encoding dterminated */ + _PAD4(1), + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec query_extension_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _BYTE_COUNTER(BIT16, 1), /* byte length of extensions supported + by the IM library */ + _FRAME(ITER), /* extensions supported by the IM library */ + _FRAME(POINTER), + _PTR(str_fr), + _PAD4(1), + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec query_extension_reply_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _BYTE_COUNTER(BIT16, 1), /* byte length of extensions supported + by the IM server */ + _FRAME(ITER), /* list of extensions supported by the + IM server */ + _FRAME(POINTER), + _PTR(ext_fr), + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec get_im_values_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _BYTE_COUNTER(BIT16, 1), /* byte length of im-attribute-id */ + _FRAME(ITER), /* im-attribute-id */ + _FRAME(BIT16), + _PAD4(1), + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec get_im_values_reply_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _BYTE_COUNTER(BIT16, 1), /* byte length of im-attribute returned */ + _FRAME(ITER), /* im-attribute returned */ + _FRAME(POINTER), + _PTR(ximattribute_fr), + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec create_ic_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _BYTE_COUNTER(BIT16, 1), /* byte length of ic-attributes */ + _FRAME(ITER), /* ic-attributes */ + _FRAME(POINTER), + _PTR(xicattribute_fr), + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec create_ic_reply_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec destroy_ic_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec destroy_ic_reply_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec set_ic_values_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _BYTE_COUNTER(BIT16, 2), /* byte length of ic-attributes */ + _PAD4(1), + _FRAME(ITER), /* ic-attribute */ + _FRAME(POINTER), + _PTR(xicattribute_fr), + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec set_ic_values_reply_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec get_ic_values_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _BYTE_COUNTER(BIT16, 1), /* byte length of ic-attribute-id */ + _FRAME(ITER), /* ic-attribute */ + _FRAME(BIT16), + _PAD4(2), + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec get_ic_values_reply_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _BYTE_COUNTER(BIT16, 2), /* byte length of ic-attribute */ + _PAD4(1), + _FRAME(ITER), /* ic-attribute */ + _FRAME(POINTER), + _PTR(xicattribute_fr), + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec set_ic_focus_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec unset_ic_focus_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec forward_event_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(BIT16), /* flag */ + _FRAME(BIT16), /* sequence number */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec sync_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec sync_reply_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(EOL), +}; + +#if 0 +xim_externaldef XimFrameRec commit_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(BIT16), /* flag */ + _FRAME(BIT16), /* byte length of committed string */ + _FRAME(BARRAY), /* committed string */ + _PAD4(1), + _BYTE_COUNTER(BIT16, 1), /* byte length of keysym */ + _FRAME(ITER), /* keysym */ + _FRAME(BIT32), + _PAD4(1), + _FRAME(EOL), +}; +#endif + +xim_externaldef XimFrameRec commit_chars_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(BIT16), /* flag */ + _FRAME(BIT16), /* byte length of committed string */ + _FRAME(BARRAY), /* committed string */ + _PAD4(1), + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec commit_both_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(BIT16), /* flag */ + _PAD4(1), /* unused */ + _FRAME(BIT32), /* keysym */ + _FRAME(BIT16), /* byte length of committed string */ + _FRAME(BARRAY), /* committed string */ + _PAD4(2), + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec reset_ic_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec reset_ic_reply_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(BIT16), /* byte length of committed string */ + _FRAME(BARRAY), /* committed string */ + _PAD4(2), + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec geometry_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec str_conversion_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(BIT32), /* XIMStringConversionPosition */ + _FRAME(BIT32), /* XIMStringConversionType */ + _FRAME(BIT32), /* XIMStringConversionOperation */ + _FRAME(BIT16), /* length to multiply the + XIMStringConversionType */ + _FRAME(BIT16), /* length of the string to be + substituted */ +#if 0 + _FRAME(BARRAY), /* string */ + _PAD4(1), +#endif + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec str_conversion_reply_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(BIT32), /* XIMStringConversionFeedback */ + _FRAME(BIT16), /* length of the retrieved string */ + _FRAME(BARRAY), /* retrieved string */ + _PAD4(2), + _BYTE_COUNTER(BIT16, 2), /* number of feedback array */ + _PAD4(1), + _FRAME(ITER), /* feedback array */ + _FRAME(BIT32), + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec preedit_start_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec preedit_start_reply_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(BIT32), /* return value */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec preedit_draw_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(BIT32), /* caret */ + _FRAME(BIT32), /* chg_first */ + _FRAME(BIT32), /* chg_length */ + _FRAME(BIT32), /* status */ + _FRAME(BIT16), /* length of preedit string */ + _FRAME(BARRAY), /* preedit string */ + _PAD4(2), + _BYTE_COUNTER(BIT16, 2), /* number of feedback array */ + _PAD4(1), + _FRAME(ITER), /* feedback array */ + _FRAME(BIT32), + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec preedit_caret_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(BIT32), /* position */ + _FRAME(BIT32), /* direction */ + _FRAME(BIT32), /* style */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec preedit_caret_reply_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(BIT32), /* position */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec preedit_done_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec status_start_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec status_draw_text_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(BIT32), /* type */ + _FRAME(BIT32), /* status */ + _FRAME(BIT16), /* length of status string */ + _FRAME(BARRAY), /* status string */ + _PAD4(2), + _BYTE_COUNTER(BIT16, 2), /* number of feedback array */ + _PAD4(1), + _FRAME(ITER), /* feedback array */ + _FRAME(BIT32), + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec status_draw_bitmap_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(BIT32), /* type */ + _FRAME(BIT32), /* pixmap data */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec status_done_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec ext_set_event_mask_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(BIT32), /* filter-event-mask */ + _FRAME(BIT32), /* intercept-event-mask */ + _FRAME(BIT32), /* select-event-mask */ + _FRAME(BIT32), /* forward-event-mask */ + _FRAME(BIT32), /* synchronous-event-mask */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec ext_forward_keyevent_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(BIT16), /* flag */ + _FRAME(BIT16), /* sequence number */ + _FRAME(BIT8), /* xEvent.u.u.type */ + _FRAME(BIT8), /* keycode */ + _FRAME(BIT16), /* state */ + _FRAME(BIT32), /* time */ + _FRAME(BIT32), /* window */ + _FRAME(EOL), +}; + +xim_externaldef XimFrameRec ext_move_fr[] = +{ + _FRAME(BIT16), /* input-method-ID */ + _FRAME(BIT16), /* input-context-ID */ + _FRAME(BIT16), /* X */ + _FRAME(BIT16), /* Y */ + _FRAME(EOL), +}; diff -ruN xwin86/IMdkit/i18nIc.c xwin/IMdkit/i18nIc.c --- xwin86/IMdkit/i18nIc.c Thu Jan 1 09:00:00 1970 +++ xwin/IMdkit/i18nIc.c Fri Dec 14 01:15:29 2001 @@ -0,0 +1,1028 @@ +/****************************************************************** + + Copyright 1994, 1995 by Sun Microsystems, Inc. + Copyright 1993, 1994 by Hewlett-Packard Company + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without fee, +provided that the above copyright notice appear in all copies and +that both that copyright notice and this permission notice appear +in supporting documentation, and that the name of Sun Microsystems, Inc. +and Hewlett-Packard not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior permission. +Sun Microsystems, Inc. and Hewlett-Packard make no representations about +the suitability of this software for any purpose. It is provided "as is" +without express or implied warranty. + +SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. + + This version tidied and debugged by Steve Underwood May 1999 + +******************************************************************/ + +#include +#include "IMdkit.h" +#include "Xi18n.h" +#include "FrameMgr.h" +#include "XimFunc.h" + +#define IC_SIZE 64 + +/* Set IC values */ +static void SetCardAttribute (XICAttribute *value_ret, + char *p, + XICAttr *ic_attr, + int value_length, + int need_swap) +{ + char *buf; + FrameMgr fm; + + if ((buf = (char *) malloc (value_length)) == NULL) + return; + /*endif*/ + if (value_length == sizeof (CARD8)) + { + memmove (buf, p, value_length); + } + else if (value_length == sizeof (CARD16)) + { + INT16 value; + extern XimFrameRec short_fr[]; + + fm = FrameMgrInit (short_fr, (char *) p, need_swap); + /* get data */ + FrameMgrGetToken (fm, value); + FrameMgrFree (fm); + memmove (buf, &value, value_length); + } + else if (value_length == sizeof(CARD32)) + { + INT32 value; + extern XimFrameRec long_fr[]; + + fm = FrameMgrInit (long_fr, (char *) p, need_swap); + /* get data */ + FrameMgrGetToken (fm, value); + FrameMgrFree (fm); + memmove (buf, &value, value_length); + } + /*endif*/ + value_ret->attribute_id = ic_attr->attribute_id; + value_ret->name = ic_attr->name; + value_ret->name_length = ic_attr->length; + value_ret->type = ic_attr->type; + value_ret->value_length = value_length; + value_ret->value = buf; +} + +static void SetFontAttribute (XICAttribute *value_ret, + char *p, + XICAttr *ic_attr, + int value_length, + int need_swap) +{ + char *buf; + char *base_name; + CARD16 base_length; + FrameMgr fm; + extern XimFrameRec fontset_fr[]; + + fm = FrameMgrInit (fontset_fr, (char *) p, need_swap); + /* get data */ + FrameMgrGetToken (fm, base_length); + FrameMgrSetSize (fm, base_length); + if ((buf = (char *) malloc (base_length + 1)) == NULL) + return; + /*endif*/ + FrameMgrGetToken (fm, base_name); + FrameMgrFree(fm); + strncpy (buf, base_name, base_length); + buf[base_length] = (char) 0; + + value_ret->attribute_id = ic_attr->attribute_id; + value_ret->name = ic_attr->name; + value_ret->name_length = ic_attr->length; + value_ret->type = ic_attr->type; + value_ret->value_length = value_length; + value_ret->value = buf; +} + +static void SetPointAttribute (XICAttribute *value_ret, + char *p, + XICAttr *ic_attr, + int value_length, + int need_swap) +{ + XPoint *buf; + FrameMgr fm; + extern XimFrameRec xpoint_fr[]; + + if ((buf = (XPoint *) malloc (sizeof (XPoint))) == NULL) + return; + /*endif*/ + + fm = FrameMgrInit (xpoint_fr, (char *) p, need_swap); + /* get data */ + FrameMgrGetToken (fm, buf->x); + FrameMgrGetToken (fm, buf->y); + FrameMgrFree (fm); + + memmove (&(buf->x), p, sizeof (INT16)); + p += sizeof (INT16); + memmove (&(buf->y), p, sizeof (INT16)); + + value_ret->attribute_id = ic_attr->attribute_id; + value_ret->name = ic_attr->name; + value_ret->name_length = ic_attr->length; + value_ret->type = ic_attr->type; + value_ret->value_length = value_length; + value_ret->value = (char *) buf; +} + +static void SetRectAttribute (XICAttribute *value_ret, + char *p, + XICAttr *ic_attr, + int value_length, + int need_swap) +{ + XRectangle *buf; + FrameMgr fm; + extern XimFrameRec xrectangle_fr[]; + + if ((buf = (XRectangle *) malloc (sizeof (XRectangle))) == NULL) + return; + /*endif*/ + + fm = FrameMgrInit (xrectangle_fr, (char *) p, need_swap); + /* get data */ + FrameMgrGetToken (fm, buf->x); + FrameMgrGetToken (fm, buf->y); + FrameMgrGetToken (fm, buf->width); + FrameMgrGetToken (fm, buf->height); + FrameMgrFree (fm); + + value_ret->attribute_id = ic_attr->attribute_id; + value_ret->name = ic_attr->name; + value_ret->name_length = ic_attr->length; + value_ret->type = ic_attr->type; + value_ret->value_length = value_length; + value_ret->value = (char *) buf; + + return; +} + +#if 0 +static void SetHotKeyAttribute (XICAttribute *value_ret, + char *p, + XICAttr *ic_attr, + int value_length, + int need_swap) +{ + INT32 list_number; + XIMTriggerKey *hotkeys; + + memmove (&list_number, p, sizeof(INT32)); p += sizeof(INT32); + + hotkeys = (XIMTriggerKey *) malloc (list_number*sizeof (XIMTriggerKey)); + if (hotkeys == NULL) + return; + /*endif*/ + + memmove (hotkeys, p, list_number*sizeof (XIMTriggerKey)); + + value_ret->attribute_id = ic_attr->attribute_id; + value_ret->name = ic_attr->name; + value_ret->name_length = ic_attr->length; + value_ret->type = ic_attr->type; + value_ret->value_length = value_length; + value_ret->value = (char *) hotkeys; +} +#endif + +/* get IC values */ +static void GetAttrHeader (unsigned char *rec, + XICAttribute *list, + int need_swap) +{ + FrameMgr fm; + extern XimFrameRec attr_head_fr[]; + + fm = FrameMgrInit (attr_head_fr, (char *) rec, need_swap); + /* put data */ + FrameMgrPutToken (fm, list->attribute_id); + FrameMgrPutToken (fm, list->value_length); + FrameMgrFree (fm); +} + +static void GetCardAttribute (char *rec, XICAttribute *list, int need_swap) +{ + FrameMgr fm; + unsigned char *recp = (unsigned char *) rec; + + GetAttrHeader (recp, list, need_swap); + recp += sizeof (CARD16)*2; + + if (list->value_length == sizeof (CARD8)) + { + memmove (recp, list->value, list->value_length); + } + else if (list->value_length == sizeof (CARD16)) + { + INT16 *value = (INT16 *) list->value; + extern XimFrameRec short_fr[]; + + fm = FrameMgrInit (short_fr, (char *) recp, need_swap); + /* put data */ + FrameMgrPutToken (fm, *value); + FrameMgrFree (fm); + } + else if (list->value_length == sizeof (CARD32)) + { + INT32 *value = (INT32 *) list->value; + extern XimFrameRec long_fr[]; + + fm = FrameMgrInit (long_fr, (char *) recp, need_swap); + /* put data */ + FrameMgrPutToken (fm, *value); + FrameMgrFree (fm); + } + /*endif*/ +} + +static void GetFontAttribute(char *rec, XICAttribute *list, int need_swap) +{ + FrameMgr fm; + extern XimFrameRec fontset_fr[]; + char *base_name = (char *) list->value; + unsigned char *recp = (unsigned char *) rec; + + GetAttrHeader (recp, list, need_swap); + recp += sizeof (CARD16)*2; + + fm = FrameMgrInit (fontset_fr, (char *)recp, need_swap); + /* put data */ + FrameMgrSetSize (fm, list->value_length); + FrameMgrPutToken (fm, list->value_length); + FrameMgrPutToken (fm, base_name); + FrameMgrFree (fm); +} + +static void GetRectAttribute (char *rec, XICAttribute *list, int need_swap) +{ + FrameMgr fm; + extern XimFrameRec xrectangle_fr[]; + XRectangle *rect = (XRectangle *) list->value; + unsigned char *recp = (unsigned char *) rec; + + GetAttrHeader (recp, list, need_swap); + recp += sizeof(CARD16)*2; + + fm = FrameMgrInit (xrectangle_fr, (char *) recp, need_swap); + /* put data */ + FrameMgrPutToken (fm, rect->x); + FrameMgrPutToken (fm, rect->y); + FrameMgrPutToken (fm, rect->width); + FrameMgrPutToken (fm, rect->height); + FrameMgrFree (fm); +} + +static void GetPointAttribute (char *rec, XICAttribute *list, int need_swap) +{ + FrameMgr fm; + extern XimFrameRec xpoint_fr[]; + XPoint *rect = (XPoint *) list->value; + unsigned char *recp = (unsigned char *) rec; + + GetAttrHeader (recp, list, need_swap); + recp += sizeof(CARD16)*2; + + fm = FrameMgrInit (xpoint_fr, (char *) recp, need_swap); + /* put data */ + FrameMgrPutToken (fm, rect->x); + FrameMgrPutToken (fm, rect->y); + FrameMgrFree (fm); +} + +static int ReadICValue (Xi18n i18n_core, + CARD16 icvalue_id, + int value_length, + void *p, + XICAttribute *value_ret, + CARD16 *number_ret, + int need_swap) +{ + XICAttr *ic_attr = i18n_core->address.xic_attr; + int i; + + *number_ret = (CARD16) 0; + + for (i = 0; i < i18n_core->address.ic_attr_num; i++, ic_attr++) + { + if (ic_attr->attribute_id == icvalue_id) + break; + /*endif*/ + } + /*endfor*/ + switch (ic_attr->type) + { + case XimType_NEST: + { + int total_length = 0; + CARD16 attribute_ID; + INT16 attribute_length; + unsigned char *p1 = (unsigned char *) p; + CARD16 ic_len = 0; + CARD16 number; + FrameMgr fm; + extern XimFrameRec attr_head_fr[]; + + while (total_length < value_length) + { + fm = FrameMgrInit (attr_head_fr, (char *) p1, need_swap); + /* get data */ + FrameMgrGetToken (fm, attribute_ID); + FrameMgrGetToken (fm, attribute_length); + FrameMgrFree (fm); + p1 += sizeof (CARD16)*2; + ReadICValue (i18n_core, + attribute_ID, + attribute_length, + p1, + (value_ret + ic_len), + &number, + need_swap); + ic_len++; + *number_ret += number; + p1 += attribute_length; + p1 += IMPAD (attribute_length); + total_length += (CARD16) sizeof(CARD16)*2 + + (INT16) attribute_length + + IMPAD (attribute_length); + } + /*endwhile*/ + return ic_len; + } + + case XimType_CARD8: + case XimType_CARD16: + case XimType_CARD32: + case XimType_Window: + SetCardAttribute (value_ret, p, ic_attr, value_length, need_swap); + *number_ret = (CARD16) 1; + return *number_ret; + + case XimType_XFontSet: + SetFontAttribute (value_ret, p, ic_attr, value_length, need_swap); + *number_ret = (CARD16) 1; + return *number_ret; + + case XimType_XRectangle: + SetRectAttribute (value_ret, p, ic_attr, value_length, need_swap); + *number_ret = (CARD16) 1; + return *number_ret; + + case XimType_XPoint: + SetPointAttribute(value_ret, p, ic_attr, value_length, need_swap); + *number_ret = (CARD16) 1; + return *number_ret; + +#if 0 + case XimType_XIMHotKeyTriggers: + SetHotKeyAttribute (value_ret, p, ic_attr, value_length, need_swap); + *number_ret = (CARD16) 1; + return *number_ret; +#endif + } + /*endswitch*/ + return 0; +} + +static XICAttribute *CreateNestedList (CARD16 attr_id, + XICAttribute *list, + int number, + int need_swap) +{ + XICAttribute *nest_list = NULL; + register int i; + char *values = NULL; + char *valuesp; + int value_length = 0; + + if (number == 0) + return NULL; + /*endif*/ + for (i = 0; i < number; i++) + { + value_length += sizeof (CARD16)*2; + value_length += list[i].value_length; + value_length += IMPAD (list[i].value_length); + } + /*endfor*/ + if ((values = (char *) malloc (value_length)) == NULL) + return NULL; + /*endif*/ + memset (values, 0, value_length); + + valuesp = values; + for (i = 0; i < number; i++) + { + switch (list[i].type) + { + case XimType_CARD8: + case XimType_CARD16: + case XimType_CARD32: + case XimType_Window: + GetCardAttribute (valuesp, &list[i], need_swap); + break; + + case XimType_XFontSet: + GetFontAttribute (valuesp, &list[i], need_swap); + break; + + case XimType_XRectangle: + GetRectAttribute (valuesp, &list[i], need_swap); + break; + + case XimType_XPoint: + GetPointAttribute (valuesp, &list[i], need_swap); + break; + +#if 0 + case XimType_XIMHotKeyTriggers: + GetHotKeyAttribute (valuesp, &list[i], need_swap); + break; +#endif + } + /*endswitch*/ + valuesp += sizeof (CARD16)*2; + valuesp += list[i].value_length; + valuesp += IMPAD(list[i].value_length); + } + /*endfor*/ + + nest_list = (XICAttribute *) malloc (sizeof (XICAttribute)); + if (nest_list == NULL) + return NULL; + /*endif*/ + memset (nest_list, 0, sizeof (XICAttribute)); + nest_list->value = (void *) malloc (value_length); + if (nest_list->value == NULL) + return NULL; + /*endif*/ + memset (nest_list->value, 0, sizeof (value_length)); + + nest_list->attribute_id = attr_id; + nest_list->value_length = value_length; + memmove (nest_list->value, values, value_length); + + XFree (values); + return nest_list; +} + +static Bool IsNestedList (Xi18n i18n_core, CARD16 icvalue_id) +{ + XICAttr *ic_attr = i18n_core->address.xic_attr; + int i; + + for (i = 0; i < i18n_core->address.ic_attr_num; i++, ic_attr++) + { + if (ic_attr->attribute_id == icvalue_id) + { + if (ic_attr->type == XimType_NEST) + return True; + /*endif*/ + return False; + } + /*endif*/ + } + /*endfor*/ + return False; +} + +static Bool IsSeparator (Xi18n i18n_core, CARD16 icvalue_id) +{ + return (i18n_core->address.separatorAttr_id == icvalue_id); +} + +static int GetICValue (Xi18n i18n_core, + XICAttribute *attr_ret, + CARD16 *id_list, + int list_num) +{ + XICAttr *xic_attr = i18n_core->address.xic_attr; + register int i; + register int j; + register int n; + + i = + n = 0; + if (IsNestedList (i18n_core, id_list[i])) + { + i++; + while (i < list_num && !IsSeparator (i18n_core, id_list[i])) + { + for (j = 0; j < i18n_core->address.ic_attr_num; j++) + { + if (xic_attr[j].attribute_id == id_list[i]) + { + attr_ret[n].attribute_id = xic_attr[j].attribute_id; + attr_ret[n].name_length = xic_attr[j].length; + attr_ret[n].name = malloc (xic_attr[j].length + 1); + strcpy(attr_ret[n].name, xic_attr[j].name); + attr_ret[n].type = xic_attr[j].type; + n++; + i++; + break; + } + /*endif*/ + } + /*endfor*/ + } + /*endwhile*/ + } + else + { + for (j = 0; j < i18n_core->address.ic_attr_num; j++) + { + if (xic_attr[j].attribute_id == id_list[i]) + { + attr_ret[n].attribute_id = xic_attr[j].attribute_id; + attr_ret[n].name_length = xic_attr[j].length; + attr_ret[n].name = malloc (xic_attr[j].length + 1); + strcpy(attr_ret[n].name, xic_attr[j].name); + attr_ret[n].type = xic_attr[j].type; + n++; + break; + } + /*endif*/ + } + /*endfor*/ + } + /*endif*/ + return n; +} + +/* called from CreateICMessageProc and SetICValueMessageProc */ +void _Xi18nChangeIC (XIMS ims, + IMProtocol *call_data, + unsigned char *p, + int create_flag) +{ + Xi18n i18n_core = ims->protocol; + FrameMgr fm; + FmStatus status; + CARD16 byte_length; + register int total_size; + unsigned char *reply = NULL; + register int i; + register int attrib_num; + XICAttribute *attrib_list; + XICAttribute pre_attr[IC_SIZE]; + XICAttribute sts_attr[IC_SIZE]; + XICAttribute ic_attr[IC_SIZE]; + CARD16 preedit_ic_num = 0; + CARD16 status_ic_num = 0; + CARD16 ic_num = 0; + CARD16 connect_id = call_data->any.connect_id; + IMChangeICStruct *changeic = (IMChangeICStruct *) &call_data->changeic; + extern XimFrameRec create_ic_fr[]; + extern XimFrameRec create_ic_reply_fr[]; + extern XimFrameRec set_ic_values_fr[]; + extern XimFrameRec set_ic_values_reply_fr[]; + CARD16 input_method_ID; + + memset (pre_attr, 0, sizeof (XICAttribute)*IC_SIZE); + memset (sts_attr, 0, sizeof (XICAttribute)*IC_SIZE); + memset (ic_attr, 0, sizeof (XICAttribute)*IC_SIZE); + + if (create_flag == True) + { + fm = FrameMgrInit (create_ic_fr, + (char *) p, + _Xi18nNeedSwap (i18n_core, connect_id)); + /* get data */ + FrameMgrGetToken (fm, input_method_ID); + FrameMgrGetToken (fm, byte_length); + } + else + { + fm = FrameMgrInit (set_ic_values_fr, + (char *) p, + _Xi18nNeedSwap (i18n_core, connect_id)); + /* get data */ + FrameMgrGetToken (fm, input_method_ID); + FrameMgrGetToken (fm, changeic->icid); + FrameMgrGetToken (fm, byte_length); + } + /*endif*/ + attrib_list = (XICAttribute *) malloc (sizeof (XICAttribute)*IC_SIZE); + if (!attrib_list) + { + _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); + return; + } + /*endif*/ + memset (attrib_list, 0, sizeof(XICAttribute)*IC_SIZE); + + attrib_num = 0; + while (FrameMgrIsIterLoopEnd (fm, &status) == False) + { + void *value; + int value_length; + + FrameMgrGetToken (fm, attrib_list[attrib_num].attribute_id); + FrameMgrGetToken (fm, value_length); + FrameMgrSetSize (fm, value_length); + attrib_list[attrib_num].value_length = value_length; + FrameMgrGetToken (fm, value); + attrib_list[attrib_num].value = (void *) malloc (value_length + 1); + memmove (attrib_list[attrib_num].value, value, value_length); + ((char *)attrib_list[attrib_num].value)[value_length] = '\0'; + attrib_num++; + } + /*endwhile*/ + + for (i = 0; i < attrib_num; i++) + { + CARD16 number; + + if (IsNestedList (i18n_core, attrib_list[i].attribute_id)) + { + if (attrib_list[i].attribute_id + == i18n_core->address.preeditAttr_id) + { + ReadICValue (i18n_core, + attrib_list[i].attribute_id, + attrib_list[i].value_length, + attrib_list[i].value, + &pre_attr[preedit_ic_num], + &number, + _Xi18nNeedSwap(i18n_core, connect_id)); + preedit_ic_num += number; + } + else if (attrib_list[i].attribute_id == i18n_core->address.statusAttr_id) + { + ReadICValue (i18n_core, + attrib_list[i].attribute_id, + attrib_list[i].value_length, + attrib_list[i].value, + &sts_attr[status_ic_num], + &number, + _Xi18nNeedSwap (i18n_core, connect_id)); + status_ic_num += number; + } + else + { + /* another nested list.. possible? */ + } + /*endif*/ + } + else + { + ReadICValue (i18n_core, + attrib_list[i].attribute_id, + attrib_list[i].value_length, + attrib_list[i].value, + &ic_attr[ic_num], + &number, + _Xi18nNeedSwap (i18n_core, connect_id)); + ic_num += number; + } + /*endif*/ + } + /*endfor*/ + for (i = 0; i < attrib_num; i++) + XFree (attrib_list[i].value); + /*endfor*/ + XFree (attrib_list); + + FrameMgrFree (fm); + + changeic->preedit_attr_num = preedit_ic_num; + changeic->status_attr_num = status_ic_num; + changeic->ic_attr_num = ic_num; + changeic->preedit_attr = pre_attr; + changeic->status_attr = sts_attr; + changeic->ic_attr = ic_attr; + + if (i18n_core->address.improto) + { + if (!(i18n_core->address.improto(ims, call_data))) + return; + /*endif*/ + } + /*endif*/ + if (create_flag == True) + { + fm = FrameMgrInit (create_ic_reply_fr, + NULL, + _Xi18nNeedSwap (i18n_core, connect_id)); + } + else + { + fm = FrameMgrInit (set_ic_values_reply_fr, + NULL, + _Xi18nNeedSwap (i18n_core, connect_id)); + } + /*endif*/ + 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, changeic->icid); + + if (create_flag == True) + { + _Xi18nSendMessage (ims, + connect_id, + XIM_CREATE_IC_REPLY, + 0, + reply, + total_size); + } + else + { + _Xi18nSendMessage (ims, + connect_id, + XIM_SET_IC_VALUES_REPLY, + 0, + reply, + total_size); + } + /*endif*/ + if (create_flag == True) + { + 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) + { + long mask; + + if (i18n_core->address.imvalue_mask & I18N_FILTERMASK) + mask = i18n_core->address.filterevent_mask; + else + mask = DEFAULT_FILTER_MASK; + /*endif*/ + /* static event flow is default */ + _Xi18nSetEventMask (ims, + connect_id, + input_method_ID, + changeic->icid, + mask, + ~mask); + } + /*endif*/ + } + /*endif*/ + FrameMgrFree (fm); + XFree(reply); +} + +/* called from GetICValueMessageProc */ +void _Xi18nGetIC (XIMS ims, IMProtocol *call_data, unsigned char *p) +{ + Xi18n i18n_core = ims->protocol; + FrameMgr fm; + FmStatus status; + extern XimFrameRec get_ic_values_fr[]; + extern XimFrameRec get_ic_values_reply_fr[]; + CARD16 byte_length; + register int total_size; + unsigned char *reply = NULL; + XICAttribute *preedit_ret = NULL; + XICAttribute *status_ret = NULL; + register int i; + register int number; + int iter_count; + CARD16 *attrID_list; + XICAttribute pre_attr[IC_SIZE]; + XICAttribute sts_attr[IC_SIZE]; + XICAttribute ic_attr[IC_SIZE]; + CARD16 pre_count = 0; + CARD16 sts_count = 0; + CARD16 ic_count = 0; + IMChangeICStruct *getic = (IMChangeICStruct *) &call_data->changeic; + CARD16 connect_id = call_data->any.connect_id; + CARD16 input_method_ID; + + memset (pre_attr, 0, sizeof (XICAttribute)*IC_SIZE); + memset (sts_attr, 0, sizeof (XICAttribute)*IC_SIZE); + memset (ic_attr, 0, sizeof (XICAttribute)*IC_SIZE); + + fm = FrameMgrInit (get_ic_values_fr, + (char *) p, + _Xi18nNeedSwap (i18n_core, connect_id)); + + /* get data */ + FrameMgrGetToken (fm, input_method_ID); + FrameMgrGetToken (fm, getic->icid); + FrameMgrGetToken (fm, byte_length); + + attrID_list = (CARD16 *) malloc (sizeof (CARD16)*IC_SIZE); /* bogus */ + memset (attrID_list, 0, sizeof (CARD16)*IC_SIZE); + + number = 0; + while (FrameMgrIsIterLoopEnd (fm, &status) == False) + FrameMgrGetToken (fm, attrID_list[number++]); + /*endwhile*/ + FrameMgrFree (fm); + + i = 0; + while (i < number) + { + int read_number; + + if (IsNestedList (i18n_core, attrID_list[i])) + { + if (attrID_list[i] == i18n_core->address.preeditAttr_id) + { + read_number = GetICValue (i18n_core, + &pre_attr[pre_count], + &attrID_list[i], + number); + i += read_number + 1; + pre_count += read_number; + } + else if (attrID_list[i] == i18n_core->address.statusAttr_id) + { + read_number = GetICValue (i18n_core, + &sts_attr[sts_count], + &attrID_list[i], + number); + i += read_number + 1; + sts_count += read_number; + } + else + { + /* another nested list.. possible? */ + } + /*endif*/ + } + else + { + read_number = GetICValue (i18n_core, + &ic_attr[ic_count], + &attrID_list[i], + number); + i += read_number; + ic_count += read_number; + } + /*endif*/ + } + /*endwhile*/ + getic->preedit_attr_num = pre_count; + getic->status_attr_num = sts_count; + getic->ic_attr_num = ic_count; + getic->preedit_attr = pre_attr; + getic->status_attr = sts_attr; + getic->ic_attr = ic_attr; + if (i18n_core->address.improto) + { + if (!(i18n_core->address.improto (ims, call_data))) + return; + /*endif*/ + } + /*endif*/ + iter_count = getic->ic_attr_num; + + preedit_ret = CreateNestedList (i18n_core->address.preeditAttr_id, + getic->preedit_attr, + getic->preedit_attr_num, + _Xi18nNeedSwap (i18n_core, connect_id)); + if (preedit_ret) + iter_count++; + /*endif*/ + status_ret = CreateNestedList (i18n_core->address.statusAttr_id, + getic->status_attr, + getic->status_attr_num, + _Xi18nNeedSwap (i18n_core, connect_id)); + if (status_ret) + iter_count++; + /*endif*/ + + fm = FrameMgrInit (get_ic_values_reply_fr, + NULL, + _Xi18nNeedSwap (i18n_core, connect_id)); + + /* set iteration count for list of ic_attribute */ + FrameMgrSetIterCount (fm, iter_count); + + /* set length of BARRAY item in xicattribute_fr */ + for (i = 0; i < (int) getic->ic_attr_num; i++) + FrameMgrSetSize (fm, ic_attr[i].value_length); + /*endfor*/ + + if (preedit_ret) + FrameMgrSetSize (fm, preedit_ret->value_length); + /*endif*/ + if (status_ret) + FrameMgrSetSize (fm, status_ret->value_length); + /*endif*/ + total_size = FrameMgrGetTotalSize (fm); + reply = (unsigned char *) malloc (total_size); + if (reply == NULL) + { + _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, getic->icid); + + for (i = 0; i < (int) getic->ic_attr_num; i++) + { + FrameMgrPutToken (fm, ic_attr[i].attribute_id); + FrameMgrPutToken (fm, ic_attr[i].value_length); + FrameMgrPutToken (fm, ic_attr[i].value); + } + /*endfor*/ + if (preedit_ret) + { + FrameMgrPutToken (fm, preedit_ret->attribute_id); + FrameMgrPutToken (fm, preedit_ret->value_length); + FrameMgrPutToken (fm, preedit_ret->value); + } + /*endif*/ + if (status_ret) + { + FrameMgrPutToken (fm, status_ret->attribute_id); + FrameMgrPutToken (fm, status_ret->value_length); + FrameMgrPutToken (fm, status_ret->value); + } + /*endif*/ + _Xi18nSendMessage (ims, + connect_id, + XIM_GET_IC_VALUES_REPLY, + 0, + reply, + total_size); + XFree (reply); + XFree (attrID_list); + + for (i = 0; i < (int) getic->ic_attr_num; i++) + { + if (getic->ic_attr[i].name) + XFree (getic->ic_attr[i].name); + /*endif*/ + if (getic->ic_attr[i].value) + XFree (getic->ic_attr[i].value); + /*endif*/ + } + /*endfor*/ + for (i = 0; i < (int) getic->preedit_attr_num; i++) + { + if (getic->preedit_attr[i].name) + XFree (getic->preedit_attr[i].name); + /*endif*/ + if (getic->preedit_attr[i].value) + XFree (getic->preedit_attr[i].value); + /*endif*/ + } + /*endfor*/ + for (i = 0; i < (int) getic->status_attr_num; i++) + { + if (getic->status_attr[i].name) + XFree (getic->status_attr[i].name); + /*endif*/ + if (getic->status_attr[i].value) + XFree (getic->status_attr[i].value); + /*endif*/ + } + /*endfor*/ + + if (preedit_ret) + { + XFree (preedit_ret->value); + XFree (preedit_ret); + } + /*endif*/ + if (status_ret) + { + XFree (status_ret->value); + XFree (status_ret); + } + /*endif*/ + FrameMgrFree (fm); +} diff -ruN xwin86/IMdkit/i18nMethod.c xwin/IMdkit/i18nMethod.c --- xwin86/IMdkit/i18nMethod.c Thu Jan 1 09:00:00 1970 +++ xwin/IMdkit/i18nMethod.c Mon May 26 17:48:02 2003 @@ -0,0 +1,1131 @@ +/****************************************************************** + + Copyright 1994, 1995 by Sun Microsystems, Inc. + Copyright 1993, 1994 by Hewlett-Packard Company + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without fee, +provided that the above copyright notice appear in all copies and +that both that copyright notice and this permission notice appear +in supporting documentation, and that the name of Sun Microsystems, Inc. +and Hewlett-Packard not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior permission. +Sun Microsystems, Inc. and Hewlett-Packard make no representations about +the suitability of this software for any purpose. It is provided "as is" +without express or implied warranty. + +SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. + + This version tidied and debugged by Steve Underwood May 1999 + +******************************************************************/ + +#include +#include +#ifndef NEED_EVENTS +#define NEED_EVENTS +#endif +#include +#undef NEED_EVENTS +#include +#include "Xtrans.h" +#include "FrameMgr.h" +#include "IMdkit.h" +#include "Xi18n.h" +#include "XimFunc.h" + +extern Xi18nClient *_Xi18nFindClient (Xi18n, CARD16); + +static void *xi18n_setup (Display *, XIMArg *); +static Status xi18n_openIM (XIMS); +static Status xi18n_closeIM (XIMS); +static char *xi18n_setIMValues (XIMS, XIMArg *); +static char *xi18n_getIMValues (XIMS, XIMArg *); +static Status xi18n_forwardEvent (XIMS, XPointer); +static Status xi18n_commit (XIMS, XPointer); +static int xi18n_callCallback (XIMS, XPointer); +static int xi18n_preeditStart (XIMS, XPointer); +static int xi18n_preeditEnd (XIMS, XPointer); +static int xi18n_syncXlib (XIMS, XPointer); + +#ifndef XIM_SERVERS +#define XIM_SERVERS "XIM_SERVERS" +#endif +static Atom XIM_Servers = None; + + +IMMethodsRec Xi18n_im_methods = +{ + xi18n_setup, + xi18n_openIM, + xi18n_closeIM, + xi18n_setIMValues, + xi18n_getIMValues, + xi18n_forwardEvent, + xi18n_commit, + xi18n_callCallback, + xi18n_preeditStart, + xi18n_preeditEnd, + xi18n_syncXlib, +}; + +extern Bool _Xi18nCheckXAddress (Xi18n, TransportSW *, char *); +extern Bool _Xi18nCheckTransAddress (Xi18n, TransportSW *, char *); + +TransportSW _TransR[] = +{ + {"X", 1, _Xi18nCheckXAddress}, +#ifdef TCPCONN + {"tcp", 3, _Xi18nCheckTransAddress}, + {"local", 5, _Xi18nCheckTransAddress}, +#endif +#ifdef DNETCONN + {"decnet", 6, _Xi18nCheckTransAddress}, +#endif + {(char *) NULL, 0, (Bool (*) ()) NULL} +}; + +static Bool GetInputStyles (Xi18n i18n_core, XIMStyles **p_style) +{ + Xi18nAddressRec *address = (Xi18nAddressRec *) &i18n_core->address; + XIMStyles *p; + int i; + + p = &address->input_styles; + if ((*p_style = (XIMStyles *) malloc (sizeof (XIMStyles) + + p->count_styles*sizeof (XIMStyle))) + == NULL) + { + return False; + } + /*endif*/ + (*p_style)->count_styles = p->count_styles; + (*p_style)->supported_styles = (XIMStyle *) ((XPointer) *p_style + sizeof (XIMStyles)); + for (i = 0; i < (int) p->count_styles; i++) + (*p_style)->supported_styles[i] = p->supported_styles[i]; + /*endfor*/ + return True; +} + +static Bool GetOnOffKeys (Xi18n i18n_core, long mask, XIMTriggerKeys **p_key) +{ + Xi18nAddressRec *address = (Xi18nAddressRec *) &i18n_core->address; + XIMTriggerKeys *p; + int i; + + if (mask & I18N_ON_KEYS) + p = &address->on_keys; + else + p = &address->off_keys; + /*endif*/ + if ((*p_key = (XIMTriggerKeys *) malloc (sizeof(XIMTriggerKeys) + + p->count_keys*sizeof(XIMTriggerKey))) + == NULL) + { + return False; + } + /*endif*/ + (*p_key)->count_keys = p->count_keys; + (*p_key)->keylist = + (XIMTriggerKey *) ((XPointer) *p_key + sizeof(XIMTriggerKeys)); + for (i = 0; i < (int) p->count_keys; i++) + { + (*p_key)->keylist[i].keysym = p->keylist[i].keysym; + (*p_key)->keylist[i].modifier = p->keylist[i].modifier; + (*p_key)->keylist[i].modifier_mask = p->keylist[i].modifier_mask; + } + /*endfor*/ + return True; +} + +static Bool GetEncodings(Xi18n i18n_core, XIMEncodings **p_encoding) +{ + Xi18nAddressRec *address = (Xi18nAddressRec *) &i18n_core->address; + XIMEncodings *p; + int i; + + p = &address->encoding_list; + + if ((*p_encoding = (XIMEncodings *) malloc (sizeof (XIMEncodings) + + p->count_encodings*sizeof(XIMEncoding))) == NULL) + { + return False; + } + /*endif*/ + (*p_encoding)->count_encodings = p->count_encodings; + (*p_encoding)->supported_encodings = + (XIMEncoding *) ((XPointer)*p_encoding + sizeof (XIMEncodings)); + for (i = 0; i < (int) p->count_encodings; i++) + { + (*p_encoding)->supported_encodings[i] + = (char *) malloc (strlen (p->supported_encodings[i]) + 1); + strcpy ((*p_encoding)->supported_encodings[i], + p->supported_encodings[i]); + } + /*endif*/ + return True; +} + +static char *ParseArgs (Xi18n i18n_core, int mode, XIMArg *args) +{ + Xi18nAddressRec *address = (Xi18nAddressRec *) &i18n_core->address; + XIMArg *p; + + if (mode == I18N_OPEN || mode == I18N_SET) + { + for (p = args; p->name != NULL; p++) + { + if (strcmp (p->name, IMLocale) == 0) + { + if (address->imvalue_mask & I18N_IM_LOCALE) + return IMLocale; + /*endif*/ + address->im_locale = (char *) malloc (strlen (p->value) + 1); + if (!address->im_locale) + return IMLocale; + /*endif*/ + strcpy (address->im_locale, p->value); + address->imvalue_mask |= I18N_IM_LOCALE; + } + else if (strcmp (p->name, IMServerTransport) == 0) + { + if (address->imvalue_mask & I18N_IM_ADDRESS) + return IMServerTransport; + /*endif*/ + address->im_addr = (char *) malloc (strlen (p->value) + 1); + if (!address->im_addr) + return IMServerTransport; + /*endif*/ + strcpy(address->im_addr, p->value); + address->imvalue_mask |= I18N_IM_ADDRESS; + } + else if (strcmp (p->name, IMServerName) == 0) + { + if (address->imvalue_mask & I18N_IM_NAME) + return IMServerName; + /*endif*/ + address->im_name = (char *) malloc (strlen (p->value) + 1); + if (!address->im_name) + return IMServerName; + /*endif*/ + strcpy (address->im_name, p->value); + address->imvalue_mask |= I18N_IM_NAME; + } + else if (strcmp (p->name, IMServerWindow) == 0) + { + if (address->imvalue_mask & I18N_IMSERVER_WIN) + return IMServerWindow; + /*endif*/ + address->im_window = (Window) p->value; + address->imvalue_mask |= I18N_IMSERVER_WIN; + } + else if (strcmp (p->name, IMInputStyles) == 0) + { + if (address->imvalue_mask & I18N_INPUT_STYLES) + return IMInputStyles; + /*endif*/ + address->input_styles.count_styles = + ((XIMStyles*)p->value)->count_styles; + address->input_styles.supported_styles = + (XIMStyle *) malloc (sizeof (XIMStyle)*address->input_styles.count_styles); + if (address->input_styles.supported_styles == (XIMStyle *) NULL) + return IMInputStyles; + /*endif*/ + memmove (address->input_styles.supported_styles, + ((XIMStyles *) p->value)->supported_styles, + sizeof (XIMStyle)*address->input_styles.count_styles); + address->imvalue_mask |= I18N_INPUT_STYLES; + } + else if (strcmp (p->name, IMProtocolHandler) == 0) + { + address->improto = (IMProtoHandler) p->value; + address->imvalue_mask |= I18N_IM_HANDLER; + } + else if (strcmp (p->name, IMOnKeysList) == 0) + { + if (address->imvalue_mask & I18N_ON_KEYS) + return IMOnKeysList; + /*endif*/ + address->on_keys.count_keys = + ((XIMTriggerKeys *) p->value)->count_keys; + address->on_keys.keylist = + (XIMTriggerKey *) malloc (sizeof (XIMTriggerKey)*address->on_keys.count_keys); + if (address->on_keys.keylist == (XIMTriggerKey *) NULL) + return IMOnKeysList; + /*endif*/ + memmove (address->on_keys.keylist, + ((XIMTriggerKeys *) p->value)->keylist, + sizeof (XIMTriggerKey)*address->on_keys.count_keys); + address->imvalue_mask |= I18N_ON_KEYS; + } + else if (strcmp (p->name, IMOffKeysList) == 0) + { + if (address->imvalue_mask & I18N_OFF_KEYS) + return IMOffKeysList; + /*endif*/ + address->off_keys.count_keys = + ((XIMTriggerKeys *) p->value)->count_keys; + address->off_keys.keylist = + (XIMTriggerKey *) malloc (sizeof (XIMTriggerKey)*address->off_keys.count_keys); + if (address->off_keys.keylist == (XIMTriggerKey *) NULL) + return IMOffKeysList; + /*endif*/ + memmove (address->off_keys.keylist, + ((XIMTriggerKeys *) p->value)->keylist, + sizeof (XIMTriggerKey)*address->off_keys.count_keys); + address->imvalue_mask |= I18N_OFF_KEYS; + } + else if (strcmp (p->name, IMEncodingList) == 0) + { + if (address->imvalue_mask & I18N_ENCODINGS) + return IMEncodingList; + /*endif*/ + address->encoding_list.count_encodings = + ((XIMEncodings *) p->value)->count_encodings; + address->encoding_list.supported_encodings = + (XIMEncoding *) malloc (sizeof (XIMEncoding)*address->encoding_list.count_encodings); + if (address->encoding_list.supported_encodings + == (XIMEncoding *) NULL) + { + return IMEncodingList; + } + /*endif*/ + memmove (address->encoding_list.supported_encodings, + ((XIMEncodings *) p->value)->supported_encodings, + sizeof (XIMEncoding)*address->encoding_list.count_encodings); + address->imvalue_mask |= I18N_ENCODINGS; + } + else if (strcmp (p->name, IMFilterEventMask) == 0) + { + if (address->imvalue_mask & I18N_FILTERMASK) + return IMFilterEventMask; + /*endif*/ + address->filterevent_mask = (long) p->value; + address->imvalue_mask |= I18N_FILTERMASK; + } + /*endif*/ + } + /*endfor*/ + if (mode == I18N_OPEN) + { + /* check mandatory IM values */ + if (!(address->imvalue_mask & I18N_IM_LOCALE)) + { + /* locales must be set in IMOpenIM */ + return IMLocale; + } + /*endif*/ + if (!(address->imvalue_mask & I18N_IM_ADDRESS)) + { + /* address must be set in IMOpenIM */ + return IMServerTransport; + } + /*endif*/ + } + /*endif*/ + } + else if (mode == I18N_GET) + { + for (p = args; p->name != NULL; p++) + { + if (strcmp (p->name, IMLocale) == 0) + { + p->value = (char *) malloc (strlen (address->im_locale) + 1); + if (!p->value) + return IMLocale; + /*endif*/ + strcpy (p->value, address->im_locale); + } + else if (strcmp (p->name, IMServerTransport) == 0) + { + p->value = (char *) malloc (strlen (address->im_addr) + 1); + if (!p->value) + return IMServerTransport; + /*endif*/ + strcpy (p->value, address->im_addr); + } + else if (strcmp (p->name, IMServerName) == 0) + { + if (address->imvalue_mask & I18N_IM_NAME) + { + p->value = (char *) malloc (strlen (address->im_name) + 1); + if (!p->value) + return IMServerName; + /*endif*/ + strcpy (p->value, address->im_name); + } + else + { + return IMServerName; + } + /*endif*/ + } + else if (strcmp (p->name, IMServerWindow) == 0) + { + if (address->imvalue_mask & I18N_IMSERVER_WIN) + *((Window *) (p->value)) = address->im_window; + else + return IMServerWindow; + /*endif*/ + } + else if (strcmp (p->name, IMInputStyles) == 0) + { + if (GetInputStyles (i18n_core, + (XIMStyles **) p->value) == False) + { + return IMInputStyles; + } + /*endif*/ + } + else if (strcmp (p->name, IMProtocolHandler) == 0) + { + if (address->imvalue_mask & I18N_IM_HANDLER) + *((IMProtoHandler *) (p->value)) = address->improto; + else + return IMProtocolHandler; + /*endif*/ + } + else if (strcmp (p->name, IMOnKeysList) == 0) + { + if (address->imvalue_mask & I18N_ON_KEYS) + { + if (GetOnOffKeys (i18n_core, + I18N_ON_KEYS, + (XIMTriggerKeys **) p->value) == False) + { + return IMOnKeysList; + } + /*endif*/ + } + else + { + return IMOnKeysList; + } + /*endif*/ + } + else if (strcmp (p->name, IMOffKeysList) == 0) + { + if (address->imvalue_mask & I18N_OFF_KEYS) + { + if (GetOnOffKeys (i18n_core, + I18N_OFF_KEYS, + (XIMTriggerKeys **) p->value) == False) + { + return IMOffKeysList; + } + /*endif*/ + } + else + { + return IMOffKeysList; + } + /*endif*/ + } + else if (strcmp (p->name, IMEncodingList) == 0) + { + if (address->imvalue_mask & I18N_ENCODINGS) + { + if (GetEncodings (i18n_core, + (XIMEncodings **) p->value) == False) + { + return IMEncodingList; + } + /*endif*/ + } + else + { + return IMEncodingList; + } + /*endif*/ + } + else if (strcmp (p->name, IMFilterEventMask) == 0) + { + if (address->imvalue_mask & I18N_FILTERMASK) + *((long *) (p->value)) = address->filterevent_mask; + else + return IMFilterEventMask; + /*endif*/ + } + /*endif*/ + } + /*endfor*/ + } + /*endif*/ + return NULL; +} + +static int CheckIMName (Xi18n i18n_core) +{ + char *address = i18n_core->address.im_addr; + int i; + + for (i = 0; _TransR[i].transportname; i++) + { + while (*address == ' ' || *address == '\t') + address++; + /*endwhile*/ + if (strncmp (address, + _TransR[i].transportname, + _TransR[i].namelen) == 0 + && + address[_TransR[i].namelen] == '/') + { + if (_TransR[i].checkAddr (i18n_core, + &_TransR[i], + address + _TransR[i].namelen + 1) == True) + { + return True; + } + /*endif*/ + return False; + } + /*endif*/ + } + /*endfor*/ + return False; +} + +static int SetXi18nSelectionOwner(Xi18n i18n_core) +{ + Display *dpy = i18n_core->address.dpy; + Window ims_win = i18n_core->address.im_window; + Window root = RootWindow (dpy, DefaultScreen (dpy)); + Atom realtype; + int realformat; + unsigned long bytesafter; + long *data=NULL; + unsigned long length; + Atom atom; + int i; + int found; + int forse = False; + char buf[256]; + + (void)sprintf(buf, "@server=%s", i18n_core->address.im_name); + if ((atom = XInternAtom(dpy, buf, False)) == 0) + return False; + i18n_core->address.selection = atom; + + if (XIM_Servers == None) + XIM_Servers = XInternAtom (dpy, XIM_SERVERS, False); + /*endif*/ + XGetWindowProperty (dpy, + root, + XIM_Servers, + 0L, + 1000000L, + False, + XA_ATOM, + &realtype, + &realformat, + &length, + &bytesafter, + (unsigned char **) (&data)); + if (realtype != None && (realtype != XA_ATOM || realformat != 32)) { + if (data != NULL) + XFree ((char *) data); + return False; + } + + found = False; + for (i = 0; i < length; i++) { + if (data[i] == atom) { + Window owner; + found = True; + if ((owner = XGetSelectionOwner (dpy, atom)) != ims_win) { + if (owner == None || forse == True) + XSetSelectionOwner (dpy, atom, ims_win, CurrentTime); + else + return False; + } + break; + } + } + + if (found == False) { + XSetSelectionOwner (dpy, atom, ims_win, CurrentTime); + XChangeProperty (dpy, + root, + XIM_Servers, + XA_ATOM, + 32, + PropModePrepend, + (unsigned char *) &atom, + 1); + } + else { + /* + * We always need to generate the PropertyNotify to the Root Window + */ + XChangeProperty (dpy, + root, + XIM_Servers, + XA_ATOM, + 32, + PropModePrepend, + (unsigned char *) data, + 0); + } + if (data != NULL) + XFree ((char *) data); + + /* Intern "LOCALES" and "TRANSOPORT" Target Atoms */ + i18n_core->address.Localename = XInternAtom (dpy, LOCALES, False); + i18n_core->address.Transportname = XInternAtom (dpy, TRANSPORT, False); + return (XGetSelectionOwner (dpy, atom) == ims_win); +} + +static int DeleteXi18nAtom(Xi18n i18n_core) +{ + Display *dpy = i18n_core->address.dpy; + Window root = RootWindow (dpy, DefaultScreen (dpy)); + Atom realtype; + int realformat; + unsigned long bytesafter; + long *data=NULL; + unsigned long length; + Atom atom; + int i, ret; + int found; + char buf[256]; + + (void)sprintf(buf, "@server=%s", i18n_core->address.im_name); + if ((atom = XInternAtom(dpy, buf, False)) == 0) + return False; + i18n_core->address.selection = atom; + + if (XIM_Servers == None) + XIM_Servers = XInternAtom (dpy, XIM_SERVERS, False); + XGetWindowProperty (dpy, + root, + XIM_Servers, + 0L, + 1000000L, + False, + XA_ATOM, + &realtype, + &realformat, + &length, + &bytesafter, + (unsigned char **) (&data)); + if (realtype != XA_ATOM || realformat != 32) { + if (data != NULL) + XFree ((char *) data); + return False; + } + + found = False; + for (i = 0; i < length; i++) { + if (data[i] == atom) { + found = True; + break; + } + } + + if (found == True) { + for (i=i+1; iaddress.dpy = dpy; + + if (ParseArgs (i18n_core, I18N_OPEN, args) != NULL) + { + XFree (i18n_core); + return NULL; + } + /*endif*/ + if (*(char *) &endian) + i18n_core->address.im_byteOrder = 'l'; + else + i18n_core->address.im_byteOrder = 'B'; + /*endif*/ + + /* install IMAttr and ICAttr list in i18n_core */ + _Xi18nInitAttrList (i18n_core); + + /* install IMExtension list in i18n_core */ + _Xi18nInitExtension (i18n_core); + + return i18n_core; +} + +static void ReturnSelectionNotify (Xi18n i18n_core, XSelectionRequestEvent *ev) +{ + XEvent event; + Display *dpy = i18n_core->address.dpy; + char buf[256]; + + event.type = SelectionNotify; + event.xselection.requestor = ev->requestor; + event.xselection.selection = ev->selection; + event.xselection.target = ev->target; + event.xselection.time = ev->time; + event.xselection.property = ev->property; + if (ev->target == i18n_core->address.Localename) + { + sprintf (buf, "@locale=%s", i18n_core->address.im_locale); + } + else if (ev->target == i18n_core->address.Transportname) + { + sprintf (buf, "@transport=%s", i18n_core->address.im_addr); + } + /*endif*/ + XChangeProperty (dpy, + event.xselection.requestor, + ev->target, + ev->target, + 8, + PropModeReplace, + (unsigned char *) buf, + strlen (buf)); + XSendEvent (dpy, event.xselection.requestor, False, NoEventMask, &event); + XFlush (i18n_core->address.dpy); +} + +static Bool WaitXSelectionRequest (Display *dpy, + Window win, + XEvent *ev, + XPointer client_data) +{ + XIMS ims = (XIMS) client_data; + Xi18n i18n_core = ims->protocol; + + if (((XSelectionRequestEvent *) ev)->selection + == i18n_core->address.selection) + { + ReturnSelectionNotify (i18n_core, (XSelectionRequestEvent *) ev); + return True; + } + /*endif*/ + return False; +} + +static Status xi18n_openIM(XIMS ims) +{ + Xi18n i18n_core = ims->protocol; + Display *dpy = i18n_core->address.dpy; + + if (!CheckIMName (i18n_core) + || + !SetXi18nSelectionOwner (i18n_core) + || + !i18n_core->methods.begin (ims)) + { + XFree (i18n_core->address.im_name); + XFree (i18n_core->address.im_locale); + XFree (i18n_core->address.im_addr); + XFree (i18n_core); + return False; + } + /*endif*/ + + _XRegisterFilterByType (dpy, + 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) +{ + *serial = (CARD16) (ev->xany.serial >> 16); + event->u.u.sequenceNumber = + (CARD16) (ev->xany.serial & (unsigned long) 0xFFFF); + + switch (ev->type) + { + case KeyPress: + case KeyRelease: + { + XKeyEvent *kev = (XKeyEvent *) ev; + + event->u.u.type = ev->type; + event->u.keyButtonPointer.root = kev->root; + event->u.keyButtonPointer.state = kev->state; + event->u.keyButtonPointer.time = kev->time; + event->u.keyButtonPointer.event = kev->window; + event->u.keyButtonPointer.child = kev->subwindow; + event->u.keyButtonPointer.eventX = kev->x; + event->u.keyButtonPointer.eventY = kev->y; + event->u.keyButtonPointer.rootX = kev->x_root; + event->u.keyButtonPointer.rootY = kev->y_root; + event->u.keyButtonPointer.sameScreen = kev->same_screen; + event->u.u.detail = kev->keycode; + } + } + /*endswitch*/ +} + +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); + + 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; +} + diff -ruN xwin86/IMdkit/i18nPtHdr.c xwin/IMdkit/i18nPtHdr.c --- xwin86/IMdkit/i18nPtHdr.c Thu Jan 1 09:00:00 1970 +++ xwin/IMdkit/i18nPtHdr.c Mon May 26 17:44:10 2003 @@ -0,0 +1,1808 @@ +/****************************************************************** + + Copyright 1994, 1995 by Sun Microsystems, Inc. + Copyright 1993, 1994 by Hewlett-Packard Company + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without fee, +provided that the above copyright notice appear in all copies and +that both that copyright notice and this permission notice appear +in supporting documentation, and that the name of Sun Microsystems, Inc. +and Hewlett-Packard not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior permission. +Sun Microsystems, Inc. and Hewlett-Packard make no representations about +the suitability of this software for any purpose. It is provided "as is" +without express or implied warranty. + +SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. + + This version tidied and debugged by Steve Underwood May 1999 + +******************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif +#ifdef DEBUG +extern int verbose; +extern void DebugLog(int deflevel, int inplevel, char *fmt, ...); +#endif + +#include +#ifndef NEED_EVENTS +#define NEED_EVENTS +#endif +#include +#undef NEED_EVENTS +#include +/*#include */ + +#include "Xtrans.h" +#include "FrameMgr.h" +#include "IMdkit.h" +#include "Xi18n.h" +#include "XimFunc.h" + +extern Xi18nClient *_Xi18nFindClient (Xi18n, CARD16); + +static void GetProtocolVersion (CARD16 client_major, + CARD16 client_minor, + CARD16 *server_major, + CARD16 *server_minor) +{ + *server_major = client_major; + *server_minor = client_minor; +} + +static void ConnectMessageProc (XIMS ims, + IMProtocol *call_data, + unsigned char *p) +{ + Xi18n i18n_core = ims->protocol; + FrameMgr fm; + extern XimFrameRec connect_fr[], connect_reply_fr[]; + register int total_size; + CARD16 server_major_version, server_minor_version; + unsigned char *reply = NULL; + IMConnectStruct *imconnect = + (IMConnectStruct*) &call_data->imconnect; + CARD16 connect_id = call_data->any.connect_id; + + fm = FrameMgrInit (connect_fr, + (char *) p, + _Xi18nNeedSwap (i18n_core, connect_id)); + + /* get data */ + FrameMgrGetToken (fm, imconnect->byte_order); + FrameMgrGetToken (fm, imconnect->major_version); + FrameMgrGetToken (fm, imconnect->minor_version); + + FrameMgrFree (fm); + + GetProtocolVersion (imconnect->major_version, + imconnect->minor_version, + &server_major_version, + &server_minor_version); +#ifdef PROTOCOL_RICH + if (i18n_core->address.improto) + { + if (!(i18n_core->address.improto(ims, call_data))) + return; + /*endif*/ + } + /*endif*/ +#endif /* PROTOCOL_RICH */ + + fm = FrameMgrInit (connect_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, server_major_version); + FrameMgrPutToken (fm, server_minor_version); + + _Xi18nSendMessage (ims, + connect_id, + XIM_CONNECT_REPLY, + 0, + reply, + total_size); + + FrameMgrFree (fm); + XFree (reply); +} + +static void DisConnectMessageProc (XIMS ims, IMProtocol *call_data) +{ + Xi18n i18n_core = ims->protocol; + unsigned char *reply = NULL; + CARD16 connect_id = call_data->any.connect_id; + +#ifdef PROTOCOL_RICH + if (i18n_core->address.improto) + { + if (!(i18n_core->address.improto (ims, call_data))) + return; + /*endif*/ + } + /*endif*/ +#endif /* PROTOCOL_RICH */ + + _Xi18nSendMessage (ims, + connect_id, + XIM_DISCONNECT_REPLY, + 0, + reply, + 0); + + i18n_core->methods.disconnect (ims, connect_id); +} + +static void OpenMessageProc(XIMS ims, IMProtocol *call_data, unsigned char *p) +{ + Xi18n i18n_core = ims->protocol; + FrameMgr fm; + extern XimFrameRec open_fr[]; + extern XimFrameRec open_reply_fr[]; + unsigned char *reply = NULL; + int str_size; + register int i, total_size; + CARD16 connect_id = call_data->any.connect_id; + int str_length; + char *name; + IMOpenStruct *imopen = (IMOpenStruct *) &call_data->imopen; + + fm = FrameMgrInit (open_fr, + (char *) p, + _Xi18nNeedSwap (i18n_core, connect_id)); + + /* get data */ + FrameMgrGetToken (fm, str_length); + FrameMgrSetSize (fm, str_length); + FrameMgrGetToken (fm, name); + imopen->lang.length = str_length; + imopen->lang.name = malloc (str_length + 1); + strncpy (imopen->lang.name, name, str_length); + imopen->lang.name[str_length] = (char) 0; + + FrameMgrFree (fm); + + if (i18n_core->address.improto) + { + if (!(i18n_core->address.improto(ims, call_data))) + return; + /*endif*/ + } + /*endif*/ + if ((i18n_core->address.imvalue_mask & I18N_ON_KEYS) + || + (i18n_core->address.imvalue_mask & I18N_OFF_KEYS)) + { + _Xi18nSendTriggerKey (ims, connect_id); + } + /*endif*/ + XFree (imopen->lang.name); + + fm = FrameMgrInit (open_reply_fr, + NULL, + _Xi18nNeedSwap (i18n_core, connect_id)); + + /* set iteration count for list of imattr */ + FrameMgrSetIterCount (fm, i18n_core->address.im_attr_num); + + /* set length of BARRAY item in ximattr_fr */ + for (i = 0; i < i18n_core->address.im_attr_num; i++) + { + str_size = strlen (i18n_core->address.xim_attr[i].name); + FrameMgrSetSize (fm, str_size); + } + /*endfor*/ + /* set iteration count for list of icattr */ + FrameMgrSetIterCount (fm, i18n_core->address.ic_attr_num); + /* set length of BARRAY item in xicattr_fr */ + for (i = 0; i < i18n_core->address.ic_attr_num; i++) + { + str_size = strlen (i18n_core->address.xic_attr[i].name); + FrameMgrSetSize (fm, str_size); + } + /*endfor*/ + + 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); + + /* input input-method ID */ + FrameMgrPutToken (fm, connect_id); + + for (i = 0; i < i18n_core->address.im_attr_num; i++) + { + str_size = FrameMgrGetSize (fm); + FrameMgrPutToken (fm, i18n_core->address.xim_attr[i].attribute_id); + FrameMgrPutToken (fm, i18n_core->address.xim_attr[i].type); + FrameMgrPutToken (fm, str_size); + FrameMgrPutToken (fm, i18n_core->address.xim_attr[i].name); + } + /*endfor*/ + for (i = 0; i < i18n_core->address.ic_attr_num; i++) + { + str_size = FrameMgrGetSize (fm); + FrameMgrPutToken (fm, i18n_core->address.xic_attr[i].attribute_id); + FrameMgrPutToken (fm, i18n_core->address.xic_attr[i].type); + FrameMgrPutToken (fm, str_size); + FrameMgrPutToken (fm, i18n_core->address.xic_attr[i].name); + } + /*endfor*/ + + _Xi18nSendMessage (ims, + connect_id, + XIM_OPEN_REPLY, + 0, + reply, + total_size); + + FrameMgrFree (fm); + XFree (reply); +} + +static void CloseMessageProc (XIMS ims, + IMProtocol *call_data, + unsigned char *p) +{ + Xi18n i18n_core = ims->protocol; + FrameMgr fm; + extern XimFrameRec close_fr[]; + extern XimFrameRec close_reply_fr[]; + unsigned char *reply = NULL; + register int total_size; + CARD16 connect_id = call_data->any.connect_id; + CARD16 input_method_ID; + + fm = FrameMgrInit (close_fr, + (char *) p, + _Xi18nNeedSwap (i18n_core, connect_id)); + + FrameMgrGetToken (fm, input_method_ID); + + FrameMgrFree (fm); + + if (i18n_core->address.improto) + { + if (!(i18n_core->address.improto (ims, call_data))) + return; + /*endif*/ + } + /*endif*/ + + fm = FrameMgrInit (close_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); + + _Xi18nSendMessage (ims, + connect_id, + XIM_CLOSE_REPLY, + 0, + reply, + total_size); + + FrameMgrFree (fm); + XFree (reply); +} + +static XIMExt *MakeExtensionList (Xi18n i18n_core, + XIMStr *lib_extension, + int number, + int *reply_number) +{ + XIMExt *ext_list; + XIMExt *im_ext = (XIMExt *) i18n_core->address.extension; + int im_ext_len = i18n_core->address.ext_num; + int i; + int j; + + *reply_number = 0; + + if (number == 0) + { + /* query all extensions */ + *reply_number = im_ext_len; + } + else + { + for (i = 0; i < im_ext_len; i++) + { + for (j = 0; j < (int) number; j++) + { + if (strcmp (lib_extension[j].name, im_ext[i].name) == 0) + { + (*reply_number)++; + break; + } + /*endif*/ + } + /*endfor*/ + } + /*endfor*/ + } + /*endif*/ + + if (!(*reply_number)) + return NULL; + /*endif*/ + ext_list = (XIMExt *) malloc (sizeof (XIMExt)*(*reply_number)); + if (!ext_list) + return NULL; + /*endif*/ + memset (ext_list, 0, sizeof (XIMExt)*(*reply_number)); + + if (number == 0) + { + /* query all extensions */ + for (i = 0; i < im_ext_len; i++) + { + ext_list[i].major_opcode = im_ext[i].major_opcode; + ext_list[i].minor_opcode = im_ext[i].minor_opcode; + ext_list[i].length = im_ext[i].length; + ext_list[i].name = malloc (im_ext[i].length + 1); + strcpy (ext_list[i].name, im_ext[i].name); + } + /*endfor*/ + } + else + { + int n = 0; + + for (i = 0; i < im_ext_len; i++) + { + for (j = 0; j < (int)number; j++) + { + if (strcmp (lib_extension[j].name, im_ext[i].name) == 0) + { + ext_list[n].major_opcode = im_ext[i].major_opcode; + ext_list[n].minor_opcode = im_ext[i].minor_opcode; + ext_list[n].length = im_ext[i].length; + ext_list[n].name = malloc (im_ext[i].length + 1); + strcpy (ext_list[n].name, im_ext[i].name); + n++; + break; + } + /*endif*/ + } + /*endfor*/ + } + /*endfor*/ + } + /*endif*/ + return ext_list; +} + +static void QueryExtensionMessageProc (XIMS ims, + IMProtocol *call_data, + unsigned char *p) +{ + Xi18n i18n_core = ims->protocol; + FrameMgr fm; + FmStatus status; + extern XimFrameRec query_extension_fr[]; + extern XimFrameRec query_extension_reply_fr[]; + unsigned char *reply = NULL; + int str_size; + register int i; + register int number; + register int total_size; + int byte_length; + int reply_number = 0; + XIMExt *ext_list; + IMQueryExtensionStruct *query_ext = + (IMQueryExtensionStruct *) &call_data->queryext; + CARD16 connect_id = call_data->any.connect_id; + CARD16 input_method_ID; + + fm = FrameMgrInit (query_extension_fr, + (char *) p, + _Xi18nNeedSwap (i18n_core, connect_id)); + + FrameMgrGetToken (fm, input_method_ID); + FrameMgrGetToken (fm, byte_length); + query_ext->extension = (XIMStr *) malloc (sizeof (XIMStr)*10); + memset (query_ext->extension, 0, sizeof (XIMStr)*10); + number = 0; + while (FrameMgrIsIterLoopEnd (fm, &status) == False) + { + char *name; + int str_length; + + FrameMgrGetToken (fm, str_length); + FrameMgrSetSize (fm, str_length); + query_ext->extension[number].length = str_length; + FrameMgrGetToken (fm, name); + query_ext->extension[number].name = malloc (str_length + 1); + strncpy (query_ext->extension[number].name, name, str_length); + query_ext->extension[number].name[str_length] = (char) 0; + number++; + } + /*endwhile*/ + query_ext->number = number; + +#ifdef PROTOCOL_RICH + if (i18n_core->address.improto) + { + if (!(i18n_core->address.improto(ims, call_data))) + return; + /*endif*/ + } + /*endif*/ +#endif /* PROTOCOL_RICH */ + + FrameMgrFree (fm); + + ext_list = MakeExtensionList (i18n_core, + query_ext->extension, + number, + &reply_number); + + for (i = 0; i < number; i++) + XFree (query_ext->extension[i].name); + /*endfor*/ + XFree (query_ext->extension); + + fm = FrameMgrInit (query_extension_reply_fr, + NULL, + _Xi18nNeedSwap (i18n_core, connect_id)); + + /* set iteration count for list of extensions */ + FrameMgrSetIterCount (fm, reply_number); + + /* set length of BARRAY item in ext_fr */ + for (i = 0; i < reply_number; i++) + { + str_size = strlen (ext_list[i].name); + FrameMgrSetSize (fm, str_size); + } + /*endfor*/ + + 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); + + for (i = 0; i < reply_number; i++) + { + str_size = FrameMgrGetSize (fm); + FrameMgrPutToken (fm, ext_list[i].major_opcode); + FrameMgrPutToken (fm, ext_list[i].minor_opcode); + FrameMgrPutToken (fm, str_size); + FrameMgrPutToken (fm, ext_list[i].name); + } + /*endfor*/ + _Xi18nSendMessage (ims, + connect_id, + XIM_QUERY_EXTENSION_REPLY, + 0, + reply, + total_size); + FrameMgrFree (fm); + XFree (reply); + + for (i = 0; i < reply_number; i++) + XFree (ext_list[i].name); + /*endfor*/ + XFree ((char *) ext_list); +} + +static void SyncReplyMessageProc (XIMS ims, + IMProtocol *call_data, + unsigned char *p) +{ + Xi18n i18n_core = ims->protocol; + FrameMgr fm; + extern XimFrameRec sync_reply_fr[]; + CARD16 connect_id = call_data->any.connect_id; + Xi18nClient *client; + CARD16 input_method_ID; + CARD16 input_context_ID; + + client = (Xi18nClient *)_Xi18nFindClient (i18n_core, connect_id); + fm = FrameMgrInit (sync_reply_fr, + (char *) p, + _Xi18nNeedSwap (i18n_core, connect_id)); + FrameMgrGetToken (fm, input_method_ID); + FrameMgrGetToken (fm, input_context_ID); + FrameMgrFree (fm); + + client->sync = False; + + if (ims->sync == True) { + ims->sync = False; + if (i18n_core->address.improto) { + call_data->sync_xlib.major_code = XIM_SYNC_REPLY; + call_data->sync_xlib.minor_code = 0; + call_data->sync_xlib.connect_id = input_method_ID; + call_data->sync_xlib.icid = input_context_ID; + i18n_core->address.improto(ims, call_data); + } + } +} + +static void GetIMValueFromName (Xi18n i18n_core, + CARD16 connect_id, + char *buf, + char *name, + int *length) +{ + register int i; + + if (strcmp (name, XNQueryInputStyle) == 0) + { + XIMStyles *styles = (XIMStyles *) &i18n_core->address.input_styles; + + *length = sizeof (CARD16)*2; /* count_styles, unused */ + *length += styles->count_styles*sizeof (CARD32); + + if (buf != NULL) + { + FrameMgr fm; + extern XimFrameRec input_styles_fr[]; + unsigned char *data = NULL; + int total_size; + + fm = FrameMgrInit (input_styles_fr, + NULL, + _Xi18nNeedSwap (i18n_core, connect_id)); + + /* set iteration count for list of input_style */ + FrameMgrSetIterCount (fm, styles->count_styles); + + total_size = FrameMgrGetTotalSize (fm); + data = (unsigned char *) malloc (total_size); + if (!data) + return; + /*endif*/ + memset (data, 0, total_size); + FrameMgrSetBuffer (fm, data); + + FrameMgrPutToken (fm, styles->count_styles); + for (i = 0; i < (int) styles->count_styles; i++) + FrameMgrPutToken (fm, styles->supported_styles[i]); + /*endfor*/ + memmove (buf, data, total_size); + FrameMgrFree (fm); + } + /*endif*/ + } + /*endif*/ + + else if (strcmp (name, XNQueryIMValuesList) == 0) { + } +} + +static XIMAttribute *MakeIMAttributeList (Xi18n i18n_core, + CARD16 connect_id, + CARD16 *list, + int *number, + int *length) +{ + XIMAttribute *attrib_list; + int list_num; + XIMAttr *attr = i18n_core->address.xim_attr; + int list_len = i18n_core->address.im_attr_num; + register int i; + register int j; + int value_length; + int number_ret = 0; + + *length = 0; + list_num = 0; + for (i = 0; i < *number; i++) + { + for (j = 0; j < list_len; j++) + { + if (attr[j].attribute_id == list[i]) + { + list_num++; + break; + } + /*endif*/ + } + /*endfor*/ + } + /*endfor*/ + attrib_list = (XIMAttribute *) malloc (sizeof (XIMAttribute)*list_num); + if (!attrib_list) + return NULL; + /*endif*/ + memset (attrib_list, 0, sizeof (XIMAttribute)*list_num); + number_ret = list_num; + list_num = 0; + for (i = 0; i < *number; i++) + { + for (j = 0; j < list_len; j++) + { + if (attr[j].attribute_id == list[i]) + { + attrib_list[list_num].attribute_id = attr[j].attribute_id; + attrib_list[list_num].name_length = attr[j].length; + attrib_list[list_num].name = attr[j].name; + attrib_list[list_num].type = attr[j].type; + GetIMValueFromName (i18n_core, + connect_id, + NULL, + attr[j].name, + &value_length); + attrib_list[list_num].value_length = value_length; + attrib_list[list_num].value = (void *) malloc (value_length); + memset(attrib_list[list_num].value, 0, value_length); + GetIMValueFromName (i18n_core, + connect_id, + attrib_list[list_num].value, + attr[j].name, + &value_length); + *length += sizeof (CARD16)*2; + *length += value_length; + *length += IMPAD (value_length); + list_num++; + break; + } + /*endif*/ + } + /*endfor*/ + } + /*endfor*/ + *number = number_ret; + return attrib_list; +} + +static void GetIMValuesMessageProc (XIMS ims, + IMProtocol *call_data, + unsigned char *p) +{ + Xi18n i18n_core = ims->protocol; + FrameMgr fm; + FmStatus status; + extern XimFrameRec get_im_values_fr[]; + extern XimFrameRec get_im_values_reply_fr[]; + CARD16 byte_length; + int list_len, total_size; + unsigned char *reply = NULL; + int iter_count; + register int i; + register int j; + int number; + CARD16 *im_attrID_list; + char **name_list; + CARD16 name_number; + XIMAttribute *im_attribute_list; + IMGetIMValuesStruct *getim = (IMGetIMValuesStruct *)&call_data->getim; + CARD16 connect_id = call_data->any.connect_id; + CARD16 input_method_ID; + + /* create FrameMgr */ + fm = FrameMgrInit (get_im_values_fr, + (char *) p, + _Xi18nNeedSwap (i18n_core, connect_id)); + + FrameMgrGetToken (fm, input_method_ID); + FrameMgrGetToken (fm, byte_length); + im_attrID_list = (CARD16 *) malloc (sizeof (CARD16)*20); + memset (im_attrID_list, 0, sizeof (CARD16)*20); + name_list = (char **)malloc(sizeof(char *) * 20); + memset(name_list, 0, sizeof(char *) * 20); + number = 0; + while (FrameMgrIsIterLoopEnd (fm, &status) == False) + { + FrameMgrGetToken (fm, im_attrID_list[number]); + number++; + } + FrameMgrFree (fm); + + name_number = 0; + for (i = 0; i < number; i++) { + for (j = 0; j < i18n_core->address.im_attr_num; j++) { + if (i18n_core->address.xim_attr[j].attribute_id == + im_attrID_list[i]) { + name_list[name_number++] = + i18n_core->address.xim_attr[j].name; + break; + } + } + } + getim->number = name_number; + getim->im_attr_list = name_list; + XFree (name_list); + + +#ifdef PROTOCOL_RICH + if (i18n_core->address.improto) { + if (!(i18n_core->address.improto (ims, call_data))) + return; + } +#endif /* PROTOCOL_RICH */ + + im_attribute_list = MakeIMAttributeList (i18n_core, + connect_id, + im_attrID_list, + &number, + &list_len); + if (im_attrID_list) + XFree (im_attrID_list); + /*endif*/ + + fm = FrameMgrInit (get_im_values_reply_fr, + NULL, + _Xi18nNeedSwap (i18n_core, connect_id)); + + iter_count = number; + + /* set iteration count for list of im_attribute */ + FrameMgrSetIterCount (fm, iter_count); + + /* set length of BARRAY item in ximattribute_fr */ + for (i = 0; i < iter_count; i++) + FrameMgrSetSize (fm, im_attribute_list[i].value_length); + /*endfor*/ + + 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); + + for (i = 0; i < iter_count; i++) + { + FrameMgrPutToken (fm, im_attribute_list[i].attribute_id); + FrameMgrPutToken (fm, im_attribute_list[i].value_length); + FrameMgrPutToken (fm, im_attribute_list[i].value); + } + /*endfor*/ + _Xi18nSendMessage (ims, + connect_id, + XIM_GET_IM_VALUES_REPLY, + 0, + reply, + total_size); + FrameMgrFree (fm); + XFree (reply); + + for (i = 0; i < iter_count; i++) + XFree(im_attribute_list[i].value); + XFree (im_attribute_list); +} + +static void CreateICMessageProc (XIMS ims, + IMProtocol *call_data, + unsigned char *p) +{ + _Xi18nChangeIC (ims, call_data, p, True); +} + +static void SetICValuesMessageProc (XIMS ims, + IMProtocol *call_data, + unsigned char *p) +{ + _Xi18nChangeIC (ims, call_data, p, False); +} + +static void GetICValuesMessageProc (XIMS ims, + IMProtocol *call_data, + unsigned char *p) +{ + _Xi18nGetIC (ims, call_data, p); +} + +static void SetICFocusMessageProc (XIMS ims, + IMProtocol *call_data, + unsigned char *p) +{ + Xi18n i18n_core = ims->protocol; + FrameMgr fm; + extern XimFrameRec set_ic_focus_fr[]; + IMChangeFocusStruct *setfocus; + CARD16 connect_id = call_data->any.connect_id; + CARD16 input_method_ID; + + setfocus = (IMChangeFocusStruct *) &call_data->changefocus; + + fm = FrameMgrInit (set_ic_focus_fr, + (char *) p, + _Xi18nNeedSwap (i18n_core, connect_id)); + + /* get data */ + FrameMgrGetToken (fm, input_method_ID); + FrameMgrGetToken (fm, setfocus->icid); + + FrameMgrFree (fm); + + if (i18n_core->address.improto) + { + if (!(i18n_core->address.improto (ims, call_data))) + return; + /*endif*/ + } + /*endif*/ +} + +static void UnsetICFocusMessageProc (XIMS ims, + IMProtocol *call_data, + unsigned char *p) +{ + Xi18n i18n_core = ims->protocol; + FrameMgr fm; + extern XimFrameRec unset_ic_focus_fr[]; + IMChangeFocusStruct *unsetfocus; + CARD16 connect_id = call_data->any.connect_id; + CARD16 input_method_ID; + + unsetfocus = (IMChangeFocusStruct *) &call_data->changefocus; + + fm = FrameMgrInit (unset_ic_focus_fr, + (char *) p, + _Xi18nNeedSwap (i18n_core, connect_id)); + + /* get data */ + FrameMgrGetToken (fm, input_method_ID); + FrameMgrGetToken (fm, unsetfocus->icid); + + FrameMgrFree (fm); + + if (i18n_core->address.improto) + { + if (!(i18n_core->address.improto (ims, call_data))) + return; + /*endif*/ + } + /*endif*/ +} + +static void DestroyICMessageProc (XIMS ims, + IMProtocol *call_data, + unsigned char *p) +{ + Xi18n i18n_core = ims->protocol; + 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) +{ + ev->xany.serial = event->u.u.sequenceNumber & ((unsigned long) 0xFFFF); + ev->xany.serial |= serial << 16; + ev->xany.send_event = False; + ev->xany.display = i18n_core->address.dpy; + switch (ev->type = event->u.u.type & 0x7F) + { + case KeyPress: + case KeyRelease: + ((XKeyEvent *) ev)->keycode = event->u.u.detail; + ((XKeyEvent *) ev)->window = event->u.keyButtonPointer.event; + ((XKeyEvent *) ev)->state = event->u.keyButtonPointer.state; + ((XKeyEvent *) ev)->time = event->u.keyButtonPointer.time; + ((XKeyEvent *) ev)->root = event->u.keyButtonPointer.root; + ((XKeyEvent *) ev)->x = event->u.keyButtonPointer.eventX; + ((XKeyEvent *) ev)->y = event->u.keyButtonPointer.eventY; + ((XKeyEvent *) ev)->x_root = 0; + ((XKeyEvent *) ev)->y_root = 0; + return True; + } + return False; +} + +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) == 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; +#endif +} + +static void EncodingNegotiatonMessageProc (XIMS ims, + IMProtocol *call_data, + unsigned char *p) +{ + Xi18n i18n_core = ims->protocol; + FrameMgr fm; + FmStatus status; + CARD16 byte_length; + extern XimFrameRec encoding_negotiation_fr[]; + extern XimFrameRec encoding_negotiation_reply_fr[]; + register int i, total_size; + unsigned char *reply = NULL; + IMEncodingNegotiationStruct *enc_nego = + (IMEncodingNegotiationStruct *) &call_data->encodingnego; + CARD16 connect_id = call_data->any.connect_id; + CARD16 input_method_ID; + + fm = FrameMgrInit (encoding_negotiation_fr, + (char *) p, + _Xi18nNeedSwap (i18n_core, connect_id)); + + FrameMgrGetToken (fm, input_method_ID); + + /* get ENCODING STR field */ + FrameMgrGetToken (fm, byte_length); + if (byte_length > 0) + { + enc_nego->encoding = (XIMStr *) malloc (sizeof (XIMStr)*10); + memset (enc_nego->encoding, 0, sizeof (XIMStr)*10); + i = 0; + while (FrameMgrIsIterLoopEnd (fm, &status) == False) + { + char *name; + int str_length; + + FrameMgrGetToken (fm, str_length); + FrameMgrSetSize (fm, str_length); + enc_nego->encoding[i].length = str_length; + FrameMgrGetToken (fm, name); + enc_nego->encoding[i].name = malloc (str_length + 1); + strncpy (enc_nego->encoding[i].name, name, str_length); + enc_nego->encoding[i].name[str_length] = '\0'; + i++; + } + /*endwhile*/ + enc_nego->encoding_number = i; + } + /*endif*/ + /* get ENCODING INFO field */ + FrameMgrGetToken (fm, byte_length); + if (byte_length > 0) + { + enc_nego->encodinginfo = (XIMStr *) malloc (sizeof (XIMStr)*10); + memset (enc_nego->encoding, 0, sizeof (XIMStr)*10); + i = 0; + while (FrameMgrIsIterLoopEnd (fm, &status) == False) + { + char *name; + int str_length; + + FrameMgrGetToken (fm, str_length); + FrameMgrSetSize (fm, str_length); + enc_nego->encodinginfo[i].length = str_length; + FrameMgrGetToken (fm, name); + enc_nego->encodinginfo[i].name = malloc (str_length + 1); + strncpy (enc_nego->encodinginfo[i].name, name, str_length); + enc_nego->encodinginfo[i].name[str_length] = '\0'; + i++; + } + /*endwhile*/ + enc_nego->encoding_info_number = i; + } + /*endif*/ + + enc_nego->enc_index = ChooseEncoding (i18n_core, enc_nego); + enc_nego->category = 0; + +#ifdef PROTOCOL_RICH + if (i18n_core->address.improto) + { + if (!(i18n_core->address.improto(ims, call_data))) + return; + /*endif*/ + } + /*endif*/ +#endif /* PROTOCOL_RICH */ + + FrameMgrFree (fm); + + fm = FrameMgrInit (encoding_negotiation_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, enc_nego->category); + FrameMgrPutToken (fm, enc_nego->enc_index); + + _Xi18nSendMessage (ims, + connect_id, + XIM_ENCODING_NEGOTIATION_REPLY, + 0, + reply, + total_size); + XFree (reply); + + /* free data for encoding list */ + if (enc_nego->encoding) + { + for (i = 0; i < (int) enc_nego->encoding_number; i++) + XFree (enc_nego->encoding[i].name); + /*endfor*/ + XFree (enc_nego->encoding); + } + /*endif*/ + if (enc_nego->encodinginfo) + { + for (i = 0; i < (int) enc_nego->encoding_info_number; i++) + XFree (enc_nego->encodinginfo[i].name); + /*endfor*/ + XFree (enc_nego->encodinginfo); + } + /*endif*/ + FrameMgrFree (fm); +} + +void PreeditStartReplyMessageProc (XIMS ims, + IMProtocol *call_data, + unsigned char *p) +{ + Xi18n i18n_core = ims->protocol; + FrameMgr fm; + extern XimFrameRec preedit_start_reply_fr[]; + IMPreeditCBStruct *preedit_CB = + (IMPreeditCBStruct *) &call_data->preedit_callback; + CARD16 connect_id = call_data->any.connect_id; + CARD16 input_method_ID; + + fm = FrameMgrInit (preedit_start_reply_fr, + (char *) p, + _Xi18nNeedSwap (i18n_core, connect_id)); + /* get data */ + FrameMgrGetToken (fm, input_method_ID); + FrameMgrGetToken (fm, preedit_CB->icid); + FrameMgrGetToken (fm, preedit_CB->todo.return_value); + + FrameMgrFree (fm); + + if (i18n_core->address.improto) + { + if (!(i18n_core->address.improto (ims, call_data))) + return; + /*endif*/ + } + /*endif*/ +} + +void PreeditCaretReplyMessageProc (XIMS ims, + IMProtocol *call_data, + unsigned char *p) +{ + Xi18n i18n_core = ims->protocol; + FrameMgr fm; + extern XimFrameRec preedit_caret_reply_fr[]; + IMPreeditCBStruct *preedit_CB = + (IMPreeditCBStruct *) &call_data->preedit_callback; + XIMPreeditCaretCallbackStruct *caret = + (XIMPreeditCaretCallbackStruct *) & preedit_CB->todo.caret; + CARD16 connect_id = call_data->any.connect_id; + CARD16 input_method_ID; + + fm = FrameMgrInit (preedit_caret_reply_fr, + (char *) p, + _Xi18nNeedSwap (i18n_core, connect_id)); + /* get data */ + FrameMgrGetToken (fm, input_method_ID); + FrameMgrGetToken (fm, preedit_CB->icid); + FrameMgrGetToken (fm, caret->position); + + FrameMgrFree (fm); + + if (i18n_core->address.improto) + { + if (!(i18n_core->address.improto(ims, call_data))) + return; + /*endif*/ + } + /*endif*/ +} + +void StrConvReplyMessageProc (XIMS ims, + IMProtocol *call_data, + unsigned char *p) +{ + return; +} + +static void AddQueue (Xi18nClient *client, unsigned char *p) +{ + XIMPending *new; + XIMPending *last; + + if ((new = (XIMPending *) malloc (sizeof (XIMPending))) == NULL) + return; + /*endif*/ + new->p = p; + new->next = (XIMPending *) NULL; + if (!client->pending) + { + client->pending = new; + } + else + { + for (last = client->pending; last->next; last = last->next) + ; + /*endfor*/ + last->next = new; + } + /*endif*/ + return; +} + +static void ProcessQueue (XIMS ims, CARD16 connect_id) +{ + Xi18n i18n_core = ims->protocol; + Xi18nClient *client = (Xi18nClient *) _Xi18nFindClient (i18n_core, + connect_id); + + while (client->sync == False && client->pending) + { + XimProtoHdr *hdr = (XimProtoHdr *) client->pending->p; + unsigned char *p1 = (unsigned char *) (hdr + 1); + IMProtocol call_data; + + call_data.major_code = hdr->major_opcode; + call_data.any.minor_code = hdr->minor_opcode; + call_data.any.connect_id = connect_id; + + switch (hdr->major_opcode) + { + case XIM_FORWARD_EVENT: + ForwardEventMessageProc(ims, &call_data, p1); + break; + } + /*endswitch*/ + XFree (hdr); + { + XIMPending *old = client->pending; + + client->pending = old->next; + XFree (old); + } + } + /*endwhile*/ + return; +} + + +void _Xi18nMessageHandler (XIMS ims, + CARD16 connect_id, + unsigned char *p, + Bool *delete) +{ + XimProtoHdr *hdr = (XimProtoHdr *)p; + unsigned char *p1 = (unsigned char *)(hdr + 1); + IMProtocol call_data; + Xi18n i18n_core = ims->protocol; + Xi18nClient *client; + + client = (Xi18nClient *) _Xi18nFindClient (i18n_core, connect_id); + if (hdr == (XimProtoHdr *) NULL) + return; + /*endif*/ + + memset (&call_data, 0, sizeof(IMProtocol)); + + call_data.major_code = hdr->major_opcode; + call_data.any.minor_code = hdr->minor_opcode; + call_data.any.connect_id = connect_id; + + switch (call_data.major_code) + { + case XIM_CONNECT: +#ifdef DEBUG + DebugLog(3, verbose, "-- XIM_CONNECT\n"); +#endif + ConnectMessageProc (ims, &call_data, p1); + break; + + case XIM_DISCONNECT: +#ifdef DEBUG + DebugLog(3, verbose, "-- XIM_DISCONNECT\n"); +#endif + DisConnectMessageProc (ims, &call_data); + break; + + case XIM_OPEN: +#ifdef DEBUG + DebugLog(3, verbose, "-- XIM_OPEN\n"); +#endif + OpenMessageProc (ims, &call_data, p1); + break; + + case XIM_CLOSE: +#ifdef DEBUG + DebugLog(3, verbose, "-- XIM_CLOSE\n"); +#endif + CloseMessageProc (ims, &call_data, p1); + break; + + case XIM_QUERY_EXTENSION: +#ifdef DEBUG + DebugLog(3, verbose, "-- XIM_QUERY_EXTENSION\n"); +#endif + QueryExtensionMessageProc (ims, &call_data, p1); + break; + + case XIM_GET_IM_VALUES: +#ifdef DEBUG + DebugLog(3, verbose, "-- XIM_GET_IM_VALUES\n"); +#endif + GetIMValuesMessageProc (ims, &call_data, p1); + break; + + case XIM_CREATE_IC: +#ifdef DEBUG + DebugLog(3, verbose, "-- XIM_CREATE_IC\n"); +#endif + CreateICMessageProc (ims, &call_data, p1); + break; + + case XIM_SET_IC_VALUES: +#ifdef DEBUG + DebugLog(3, verbose, "-- XIM_SET_IC_VALUES\n"); +#endif + SetICValuesMessageProc (ims, &call_data, p1); + break; + + case XIM_GET_IC_VALUES: +#ifdef DEBUG + DebugLog(3, verbose, "-- XIM_GET_IC_VALUES\n"); +#endif + GetICValuesMessageProc (ims, &call_data, p1); + break; + + case XIM_SET_IC_FOCUS: +#ifdef DEBUG + DebugLog(3, verbose, "-- XIM_SET_IC_FOCUS\n"); +#endif + SetICFocusMessageProc (ims, &call_data, p1); + break; + + case XIM_UNSET_IC_FOCUS: +#ifdef DEBUG + DebugLog(3, verbose, "-- XIM_UNSET_IC_FOCUS\n"); +#endif + UnsetICFocusMessageProc (ims, &call_data, p1); + break; + + case XIM_DESTROY_IC: +#ifdef DEBUG + DebugLog(3, verbose, "-- XIM_DESTROY_IC\n"); +#endif + DestroyICMessageProc (ims, &call_data, p1); + break; + + case XIM_RESET_IC: +#ifdef DEBUG + DebugLog(3, verbose, "-- XIM_RESET_IC\n"); +#endif + ResetICMessageProc (ims, &call_data, p1); + break; + + case XIM_FORWARD_EVENT: +#ifdef DEBUG + DebugLog(3, verbose, "-- XIM_FORWARD_EVENT\n"); +#endif + if (client->sync == True) + { + AddQueue (client, p); + *delete = False; + } + else + { + ForwardEventMessageProc (ims, &call_data, p1); + } + break; + + case XIM_EXTENSION: +#ifdef DEBUG + DebugLog(3, verbose, "-- XIM_EXTENSION\n"); +#endif + ExtensionMessageProc (ims, &call_data, p1); + break; + + case XIM_SYNC: +#ifdef DEBUG + DebugLog(3, verbose, "-- XIM_SYNC\n"); +#endif + break; + + case XIM_SYNC_REPLY: +#ifdef DEBUG + DebugLog(3, verbose, "-- XIM_SYNC_REPLY\n"); +#endif + SyncReplyMessageProc (ims, &call_data, p1); + ProcessQueue (ims, connect_id); + break; + + case XIM_TRIGGER_NOTIFY: +#ifdef DEBUG + DebugLog(3, verbose, "-- XIM_TRIGGER_NOTIFY\n"); +#endif + TriggerNotifyMessageProc (ims, &call_data, p1); + break; + + case XIM_ENCODING_NEGOTIATION: +#ifdef DEBUG + DebugLog(3, verbose, "-- XIM_ENCODING_NEGOTIATION\n"); +#endif + EncodingNegotiatonMessageProc (ims, &call_data, p1); + break; + + case XIM_PREEDIT_START_REPLY: +#ifdef DEBUG + DebugLog(3, verbose, "-- XIM_PREEDIT_START_REPLY\n"); +#endif + PreeditStartReplyMessageProc (ims, &call_data, p1); + break; + + case XIM_PREEDIT_CARET_REPLY: +#ifdef DEBUG + DebugLog(3, verbose, "-- XIM_PREEDIT_CARET_REPLY\n"); +#endif + PreeditCaretReplyMessageProc (ims, &call_data, p1); + break; + + case XIM_STR_CONVERSION_REPLY: +#ifdef DEBUG + DebugLog(3, verbose, "-- XIM_STR_CONVERSION_REPLY\n"); +#endif + StrConvReplyMessageProc (ims, &call_data, p1); + break; + } + /*endswitch*/ +} diff -ruN xwin86/IMdkit/i18nTr.c xwin/IMdkit/i18nTr.c --- xwin86/IMdkit/i18nTr.c Thu Jan 1 09:00:00 1970 +++ xwin/IMdkit/i18nTr.c Fri Dec 14 01:15:40 2001 @@ -0,0 +1,437 @@ +/****************************************************************** + + Copyright 1994, 1995 by Sun Microsystems, Inc. + Copyright 1993, 1994 by Hewlett-Packard Company + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without fee, +provided that the above copyright notice appear in all copies and +that both that copyright notice and this permission notice appear +in supporting documentation, and that the name of Sun Microsystems, Inc. +and Hewlett-Packard not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior permission. +Sun Microsystems, Inc. and Hewlett-Packard make no representations about +the suitability of this software for any purpose. It is provided "as is" +without express or implied warranty. + +SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. + + This version tidied and debugged by Steve Underwood May 1999 + +******************************************************************/ + +#include +#include +#include +#include + +#include "Xtrans.h" +#include "FrameMgr.h" +#include "IMdkit.h" +#include "Xi18n.h" +#include "Xi18nTr.h" + +extern Xi18nClient *_Xi18nFindClient (Xi18n, CARD16); +extern Xi18nClient *_Xi18nNewClient (Xi18n); +extern void _Xi18nDeleteClient (Xi18n, CARD16); +static Bool TransRead (XtransConnInfo, char *, int, int *); +static Bool TransWrite (XtransConnInfo, char *, int); +static void Xi18nWaitTransListen (Display *, int, XPointer); +static void Xi18nWaitTransAccept (Display *, int, XPointer); + +static unsigned char *ReadTrIMMessage (XIMS ims, int fd, int *connect_id) +{ + Xi18n i18n_core = ims->protocol; + Xi18nClient *client = i18n_core->address.clients; + TransClient *tr_client; + + FrameMgr fm; + extern XimFrameRec packet_header_fr[]; + register int total_size; + unsigned char *p = NULL; + unsigned char *pp; + int read_length; + XimProtoHdr *hdr; + Bool isConnect = False; + CARD8 major_opcode, minor_opcode; + CARD16 length; + + while (client != NULL) + { + tr_client = (TransClient *) client->trans_rec; + if (tr_client->accept_fd == fd) + { + *connect_id = client->connect_id; + break; + } + /*endif*/ + client = client->next; + } + /*endwhile*/ + + if ((hdr = (XimProtoHdr *) malloc (sizeof (hdr))) == NULL) + return (unsigned char *) NULL; + /*endif*/ + + if (!TransRead (tr_client->accept_conn, + (char *) hdr, + sizeof (hdr), + &read_length) + || + read_length != sizeof (hdr)) + { + goto read_error; + } + else + { + if (client->byte_order == '?') + { + if (hdr->major_opcode == XIM_CONNECT) + { + CARD8 byte_order; + + if (!TransRead (tr_client->accept_conn, + (char *) &byte_order, + sizeof (CARD8), + &read_length) + || + read_length != sizeof (CARD8)) + { + goto read_error; + } + /*endif*/ + isConnect = True; + client->byte_order = (CARD8) byte_order; + } + else + { + return (unsigned char *) NULL; /* can do nothing */ + } + /*endif*/ + } + /*endif*/ + fm = FrameMgrInit (packet_header_fr, + (char *) hdr, + _Xi18nNeedSwap (i18n_core, *connect_id)); + total_size = FrameMgrGetTotalSize (fm); + /* get data */ + FrameMgrGetToken (fm, major_opcode); + FrameMgrGetToken (fm, minor_opcode); + FrameMgrGetToken (fm, length); + FrameMgrFree (fm); + + if ((p = (unsigned char *) malloc (total_size + length*4)) == NULL) + return (unsigned char *) NULL; + /*endif*/ + pp = p; + memmove(pp, &major_opcode, sizeof (CARD8)); + pp += sizeof (CARD8); + memmove(pp, &minor_opcode, sizeof (CARD8)); + pp += sizeof (CARD8); + memmove(pp, &length, sizeof (CARD16)); + pp += sizeof (CARD16); + XFree (hdr); + if (!isConnect) + { + if (length > 0) + { + if (!TransRead (tr_client->accept_conn, + (char *) pp, + length*4, + &read_length) + || + read_length != length * 4) + { + goto read_error; + } + /*endif*/ + } + /*endif*/ + } + else + { + memmove (pp, &client->byte_order, sizeof (CARD8)); + pp += sizeof (CARD8); + if (!TransRead (tr_client->accept_conn, + (char *) pp, + length*4 - sizeof (CARD8), + &read_length) + || + read_length != length*4 - sizeof (CARD8)) + { + goto read_error; + } + /*endif*/ + } + /*endif*/ + } + /*endif*/ + return (unsigned char *) p; + + /* TODO: Get rid of this label, and the goto's */ +read_error: + _XUnregisterInternalConnection (i18n_core->address.dpy, fd); + _XimXTransDisconnect (tr_client->accept_conn); + _XimXTransClose (tr_client->accept_conn); + return (unsigned char *) NULL; +} + +static Bool Xi18nTransBegin(XIMS ims) +{ + Xi18n i18n_core = ims->protocol; + char *address = i18n_core->address.im_addr; + TransSpecRec *spec = (TransSpecRec *) i18n_core->address.connect_addr; + int fd; + + if (((spec->trans_conn = (struct _XtransConnInfo *) + _XimdXTransOpenCOTSServer(address)) == NULL) + || + (_XimdXTransCreateListener(spec->trans_conn, spec->port) != 0)) + { + return False; + } + /*endif*/ + fd = _XimXTransGetConnectionNumber(spec->trans_conn); + return _XRegisterInternalConnection(i18n_core->address.dpy, fd, + (_XInternalConnectionProc)Xi18nWaitTransListen, + (XPointer)ims); +} + +static Bool Xi18nTransEnd(XIMS ims) +{ + Xi18n i18n_core = ims->protocol; + TransSpecRec *spec = (TransSpecRec *) i18n_core->address.connect_addr; + int fd; + + fd = _XimXTransGetConnectionNumber (spec->trans_conn); + if (fd == 0) + return False; + /*endif*/ + _XUnregisterInternalConnection (i18n_core->address.dpy, fd); + _XimXTransDisconnect (spec->trans_conn); + _XimXTransClose (spec->trans_conn); + + XFree (spec->port); + XFree (spec); + return True; +} + +static Bool Xi18nTransSend (XIMS ims, + CARD16 connect_id, + unsigned char *reply, + long length) +{ + Xi18n i18n_core = ims->protocol; + Xi18nClient *client = _Xi18nFindClient (i18n_core, connect_id); + TransClient *tr_client = (TransClient *) client->trans_rec; + + if (length > 0) + { + if (TransWrite (tr_client->accept_conn, (char *) reply, length) + != length) + { + return False; + } + /*endif*/ + } + /*endif*/ + return True; +} + +static Bool Xi18nTransWait (XIMS ims, + CARD16 connect_id, + CARD8 major_opcode, + CARD8 minor_opcode) +{ + Xi18n i18n_core = ims->protocol; + Xi18nClient *client = _Xi18nFindClient(i18n_core, connect_id); + TransClient *tr_client = (TransClient *)client->trans_rec; + int fd = _XimXTransGetConnectionNumber(tr_client->accept_conn); + + for (;;) + { + unsigned char *packet; + XimProtoHdr *hdr; + int connect_id_ret; + + if ((packet = ReadTrIMMessage (ims, fd, &connect_id_ret)) + == (unsigned char *) NULL) + { + return False; + } + /*endif*/ + hdr = (XimProtoHdr *) packet; + + if ((hdr->major_opcode == major_opcode) + && + (hdr->minor_opcode == minor_opcode)) + { + return True; + } + else if (hdr->major_opcode == XIM_ERROR) + { + return False; + } + /*endif*/ + } + /*endfor*/ +} + +static Bool Xi18nTransDisconnect(XIMS ims, CARD16 connect_id) +{ + Xi18n i18n_core = ims->protocol; + Xi18nClient *client = _Xi18nFindClient (i18n_core, connect_id); + TransClient *tr_client = (TransClient *) client->trans_rec; + + _XUnregisterInternalConnection (i18n_core->address.dpy, + tr_client->accept_fd); + _XimXTransDisconnect (tr_client->accept_conn); + _XimXTransClose (tr_client->accept_conn); + XFree (tr_client); + _Xi18nDeleteClient (i18n_core, connect_id); + return True; +} + +static Bool TransRead (XtransConnInfo accept_conn, + char *buf, + int buf_len, + int *ret_len) +{ + int len; + + if ((len = _XimXTransRead (accept_conn, buf, buf_len)) <= 0) + return False; + /*endif*/ + *ret_len = len; + return True; +} + +static Bool TransWrite (XtransConnInfo accept_conn, char *buf, int len) +{ + register int nbyte; + + while (len > 0) + { + if ((nbyte = _XimXTransWrite (accept_conn, buf, len)) <= 0) + return False; + /*endif*/ + len -= nbyte; + buf += nbyte; + } + /*endwhile*/ + return True; +} + +Bool _Xi18nCheckTransAddress (Xi18n i18n_core, + TransportSW *transSW, + char *address) +{ + TransSpecRec *spec; + char *p; + char *hostname; + + if (!(spec = (TransSpecRec *) malloc (sizeof (TransSpecRec)))) + return False; + /*endif*/ + if (!(hostname = (char *) malloc (strlen (address) + 1))) + { + XFree (spec); + return False; + } + /*endif*/ + strcpy (hostname, address); + + if (p = index (hostname, ':')) + { + p++; + if (!(spec->port = (char *) malloc (strlen (p) + 1))) + { + XFree (spec); + XFree (hostname); + return False; + } + /*endif*/ + strcpy (spec->port, p); + XFree (hostname); + } + else + { + XFree (spec); + XFree (hostname); + return False; + } + /*endif*/ + i18n_core->address.connect_addr = (TransSpecRec *) spec; + i18n_core->methods.begin = Xi18nTransBegin; + i18n_core->methods.end = Xi18nTransEnd; + i18n_core->methods.send = Xi18nTransSend; + i18n_core->methods.wait = Xi18nTransWait; + i18n_core->methods.disconnect = Xi18nTransDisconnect; + return True; +} + +static TransClient *NewTrClient (Xi18n i18n_core, XtransConnInfo accept_conn) +{ + Xi18nClient *client = _Xi18nNewClient (i18n_core); + TransClient *tr_client; + + tr_client = (TransClient *) malloc (sizeof (TransClient)); + + tr_client->accept_conn = accept_conn; + tr_client->accept_fd = _XimXTransGetConnectionNumber (accept_conn); + client->trans_rec = tr_client; + + return ((TransClient *) tr_client); +} + +static void Xi18nWaitTransListen (Display *d, int fd, XPointer arg) +{ + XIMS ims = (XIMS)arg; + Xi18n i18n_core = ims->protocol; + TransSpecRec *spec = (TransSpecRec *) i18n_core->address.connect_addr; + XtransConnInfo new_client; + TransClient *client; + int status; + + if ((new_client = (struct _XtransConnInfo *) + _XimdXTransAccept (spec->trans_conn, &status)) != NULL) + { + client = NewTrClient (i18n_core, new_client); + _XRegisterInternalConnection (i18n_core->address.dpy, + client->accept_fd, + (_XInternalConnectionProc) Xi18nWaitTransAccept, + (XPointer) ims); + } + /*endif*/ + return; +} + +static void Xi18nWaitTransAccept (Display *d, int fd, XPointer arg) +{ + XIMS ims = (XIMS) arg; + extern void _Xi18nMessageHandler (XIMS, CARD16, unsigned char *, Bool *); + Bool delete = True; + unsigned char *packet; + int connect_id; + + if ((packet = ReadTrIMMessage (ims, fd, &connect_id)) + == (unsigned char *) NULL) + { + return; + } + /*endif*/ + _Xi18nMessageHandler (ims, connect_id, packet, &delete); + if (delete == True) + XFree (packet); + /*endif*/ + return; +} diff -ruN xwin86/IMdkit/i18nUtil.c xwin/IMdkit/i18nUtil.c --- xwin86/IMdkit/i18nUtil.c Thu Jan 1 09:00:00 1970 +++ xwin/IMdkit/i18nUtil.c Fri Dec 14 01:15:44 2001 @@ -0,0 +1,276 @@ +/****************************************************************** + + Copyright 1994, 1995 by Sun Microsystems, Inc. + Copyright 1993, 1994 by Hewlett-Packard Company + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without fee, +provided that the above copyright notice appear in all copies and +that both that copyright notice and this permission notice appear +in supporting documentation, and that the name of Sun Microsystems, Inc. +and Hewlett-Packard not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior permission. +Sun Microsystems, Inc. and Hewlett-Packard make no representations about +the suitability of this software for any purpose. It is provided "as is" +without express or implied warranty. + +SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. + + This version tidied and debugged by Steve Underwood May 1999 + +******************************************************************/ + +#include +#include "IMdkit.h" +#include "Xi18n.h" +#include "FrameMgr.h" +#include "XimFunc.h" + +Xi18nClient *_Xi18nFindClient (Xi18n, CARD16); + +int +_Xi18nNeedSwap (Xi18n i18n_core, CARD16 connect_id) +{ + CARD8 im_byteOrder = i18n_core->address.im_byteOrder; + Xi18nClient *client = _Xi18nFindClient (i18n_core, connect_id); + + return (client->byte_order != im_byteOrder); +} + +Xi18nClient *_Xi18nNewClient(Xi18n i18n_core) +{ + static CARD16 connect_id = 0; + int new_connect_id; + Xi18nClient *client; + + if (i18n_core->address.free_clients) + { + client = i18n_core->address.free_clients; + i18n_core->address.free_clients = client->next; + new_connect_id = client->connect_id; + } + else + { + client = (Xi18nClient *) malloc (sizeof (Xi18nClient)); + new_connect_id = ++connect_id; + } + /*endif*/ + memset (client, 0, sizeof (Xi18nClient)); + client->connect_id = new_connect_id; + client->pending = (XIMPending *) NULL; + client->sync = False; + client->byte_order = '?'; /* initial value */ + memset (&client->pending, 0, sizeof (XIMPending *)); + client->next = i18n_core->address.clients; + i18n_core->address.clients = client; + + return (Xi18nClient *) client; +} + +Xi18nClient *_Xi18nFindClient (Xi18n i18n_core, CARD16 connect_id) +{ + Xi18nClient *client = i18n_core->address.clients; + + while (client) + { + if (client->connect_id == connect_id) + return client; + /*endif*/ + client = client->next; + } + /*endwhile*/ + return NULL; +} + +void _Xi18nDeleteClient (Xi18n i18n_core, CARD16 connect_id) +{ + Xi18nClient *target = _Xi18nFindClient (i18n_core, connect_id); + Xi18nClient *ccp; + Xi18nClient *ccp0; + + for (ccp = i18n_core->address.clients, ccp0 = NULL; + ccp != NULL; + ccp0 = ccp, ccp = ccp->next) + { + if (ccp == target) + { + if (ccp0 == NULL) + i18n_core->address.clients = ccp->next; + else + ccp0->next = ccp->next; + /*endif*/ + /* put it back to free list */ + target->next = i18n_core->address.free_clients; + i18n_core->address.free_clients = target; + return; + } + /*endif*/ + } + /*endfor*/ +} + +void _Xi18nSendMessage (XIMS ims, + CARD16 connect_id, + CARD8 major_opcode, + CARD8 minor_opcode, + unsigned char *data, + long length) +{ + Xi18n i18n_core = ims->protocol; + FrameMgr fm; + extern XimFrameRec packet_header_fr[]; + unsigned char *reply_hdr = NULL; + int header_size; + unsigned char *reply = NULL; + unsigned char *replyp; + int reply_length; + long p_len = length/4; + + fm = FrameMgrInit (packet_header_fr, + NULL, + _Xi18nNeedSwap (i18n_core, connect_id)); + + header_size = FrameMgrGetTotalSize (fm); + reply_hdr = (unsigned char *) malloc (header_size); + if (reply_hdr == NULL) + { + _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); + return; + } + /*endif*/ + FrameMgrSetBuffer (fm, reply_hdr); + + /* put data */ + FrameMgrPutToken (fm, major_opcode); + FrameMgrPutToken (fm, minor_opcode); + FrameMgrPutToken (fm, p_len); + + reply_length = header_size + length; + reply = (unsigned char *) malloc (reply_length); + replyp = reply; + memmove (reply, reply_hdr, header_size); + replyp += header_size; + memmove (replyp, data, length); + + i18n_core->methods.send (ims, connect_id, reply, reply_length); + + XFree (reply); + XFree (reply_hdr); + FrameMgrFree (fm); +} + +void _Xi18nSendTriggerKey (XIMS ims, CARD16 connect_id) +{ + Xi18n i18n_core = ims->protocol; + FrameMgr fm; + extern XimFrameRec register_triggerkeys_fr[]; + XIMTriggerKey *on_keys = i18n_core->address.on_keys.keylist; + XIMTriggerKey *off_keys = i18n_core->address.off_keys.keylist; + int on_key_num = i18n_core->address.on_keys.count_keys; + int off_key_num = i18n_core->address.off_keys.count_keys; + unsigned char *reply = NULL; + register int i, total_size; + CARD16 im_id; + + if (on_key_num == 0 && off_key_num == 0) + return; + /*endif*/ + + fm = FrameMgrInit (register_triggerkeys_fr, + NULL, + _Xi18nNeedSwap (i18n_core, connect_id)); + + /* set iteration count for on-keys list */ + FrameMgrSetIterCount (fm, on_key_num); + /* set iteration count for off-keys list */ + FrameMgrSetIterCount (fm, off_key_num); + + /* get total_size */ + total_size = FrameMgrGetTotalSize (fm); + + reply = (unsigned char *) malloc (total_size); + if (!reply) + return; + /*endif*/ + memset (reply, 0, total_size); + FrameMgrSetBuffer (fm, reply); + + /* Right now XIM_OPEN_REPLY hasn't been sent to this new client, so + the input-method-id is still invalid, and should be set to zero... + Reter to $(XC)/lib/X11/imDefLkup.c:_XimRegisterTriggerKeysCallback + */ + im_id = 0; + FrameMgrPutToken (fm, im_id); /* input-method-id */ + for (i = 0; i < on_key_num; i++) + { + FrameMgrPutToken (fm, on_keys[i].keysym); + FrameMgrPutToken (fm, on_keys[i].modifier); + FrameMgrPutToken (fm, on_keys[i].modifier_mask); + } + /*endfor*/ + for (i = 0; i < off_key_num; i++) + { + FrameMgrPutToken (fm, off_keys[i].keysym); + FrameMgrPutToken (fm, off_keys[i].modifier); + FrameMgrPutToken (fm, off_keys[i].modifier_mask); + } + /*endfor*/ + _Xi18nSendMessage (ims, + connect_id, + XIM_REGISTER_TRIGGERKEYS, + 0, + reply, + total_size); + FrameMgrFree (fm); + XFree(reply); +} + +void _Xi18nSetEventMask (XIMS ims, + CARD16 connect_id, + CARD16 im_id, + CARD16 ic_id, + CARD32 forward_mask, + CARD32 sync_mask) +{ + Xi18n i18n_core = ims->protocol; + FrameMgr fm; + extern XimFrameRec set_event_mask_fr[]; + unsigned char *reply = NULL; + register int total_size; + + fm = FrameMgrInit (set_event_mask_fr, + NULL, + _Xi18nNeedSwap (i18n_core, connect_id)); + + total_size = FrameMgrGetTotalSize (fm); + reply = (unsigned char *) malloc (total_size); + if (!reply) + return; + /*endif*/ + memset (reply, 0, total_size); + FrameMgrSetBuffer (fm, reply); + + FrameMgrPutToken (fm, im_id); /* input-method-id */ + FrameMgrPutToken (fm, ic_id); /* input-context-id */ + FrameMgrPutToken (fm, forward_mask); + FrameMgrPutToken (fm, sync_mask); + + _Xi18nSendMessage (ims, + connect_id, + XIM_SET_EVENT_MASK, + 0, + reply, + total_size); + + FrameMgrFree (fm); + XFree(reply); +} diff -ruN xwin86/IMdkit/i18nX.c xwin/IMdkit/i18nX.c --- xwin86/IMdkit/i18nX.c Thu Jan 1 09:00:00 1970 +++ xwin/IMdkit/i18nX.c Mon May 26 17:47:12 2003 @@ -0,0 +1,499 @@ +/****************************************************************** + + Copyright 1994, 1995 by Sun Microsystems, Inc. + Copyright 1993, 1994 by Hewlett-Packard Company + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose is hereby granted without fee, +provided that the above copyright notice appear in all copies and +that both that copyright notice and this permission notice appear +in supporting documentation, and that the name of Sun Microsystems, Inc. +and Hewlett-Packard not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior permission. +Sun Microsystems, Inc. and Hewlett-Packard make no representations about +the suitability of this software for any purpose. It is provided "as is" +without express or implied warranty. + +SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. + + This version tidied and debugged by Steve Underwood May 1999 + +******************************************************************/ + +#include +#include +#include +#include "Xtrans.h" +#include "FrameMgr.h" +#include "IMdkit.h" +#include "Xi18n.h" +#include "Xi18nX.h" +#include "XimFunc.h" + +extern Xi18nClient *_Xi18nFindClient(Xi18n, CARD16); +extern Xi18nClient *_Xi18nNewClient(Xi18n); +extern void _Xi18nDeleteClient(Xi18n, CARD16); +static Bool WaitXConnectMessage(Display*, Window, + XEvent*, XPointer); +static Bool WaitXIMProtocol(Display*, Window, XEvent*, XPointer); + +static XClient *NewXClient (Xi18n i18n_core, Window new_client) +{ + Display *dpy = i18n_core->address.dpy; + Xi18nClient *client = _Xi18nNewClient (i18n_core); + XClient *x_client; + + x_client = (XClient *) malloc (sizeof (XClient)); + x_client->client_win = new_client; + x_client->accept_win = XCreateSimpleWindow (dpy, + DefaultRootWindow(dpy), + 0, + 0, + 1, + 1, + 1, + 0, + 0); + client->trans_rec = x_client; + return ((XClient *) x_client); +} + +static unsigned char *ReadXIMMessage (XIMS ims, + XClientMessageEvent *ev, + int *connect_id) +{ + Xi18n i18n_core = ims->protocol; + Xi18nClient *client = i18n_core->address.clients; + XClient *x_client = NULL; + FrameMgr fm; + extern XimFrameRec packet_header_fr[]; + unsigned char *p = NULL; + unsigned char *p1; + + while (client != NULL) { + x_client = (XClient *) client->trans_rec; + if (x_client->accept_win == ev->window) { + *connect_id = client->connect_id; + break; + } + client = client->next; + } + + if (ev->format == 8) { + /* ClientMessage only */ + XimProtoHdr *hdr = (XimProtoHdr *) ev->data.b; + unsigned char *rec = (unsigned char *) (hdr + 1); + register int total_size; + CARD8 major_opcode; + CARD8 minor_opcode; + CARD16 length; + extern int _Xi18nNeedSwap (Xi18n, CARD16); + + if (client->byte_order == '?') + { + if (hdr->major_opcode != XIM_CONNECT) + return (unsigned char *) NULL; /* can do nothing */ + client->byte_order = (CARD8) rec[0]; + } + + fm = FrameMgrInit (packet_header_fr, + (char *) hdr, + _Xi18nNeedSwap (i18n_core, *connect_id)); + total_size = FrameMgrGetTotalSize (fm); + /* get data */ + FrameMgrGetToken (fm, major_opcode); + FrameMgrGetToken (fm, minor_opcode); + FrameMgrGetToken (fm, length); + FrameMgrFree (fm); + + if ((p = (unsigned char *) malloc (total_size + length * 4)) == NULL) + return (unsigned char *) NULL; + + p1 = p; + memmove (p1, &major_opcode, sizeof (CARD8)); + p1 += sizeof (CARD8); + memmove (p1, &minor_opcode, sizeof (CARD8)); + p1 += sizeof (CARD8); + memmove (p1, &length, sizeof (CARD16)); + p1 += sizeof (CARD16); + memmove (p1, rec, length * 4); + } + else if (ev->format == 32) { + /* ClientMessage and WindowProperty */ + unsigned long length = (unsigned long) ev->data.l[0]; + Atom atom = (Atom) ev->data.l[1]; + int return_code; + Atom actual_type_ret; + int actual_format_ret; + unsigned long bytes_after_ret; + unsigned char *prop; + unsigned long nitems; + + return_code = XGetWindowProperty (i18n_core->address.dpy, + x_client->accept_win, + atom, + 0L, + length, + True, + AnyPropertyType, + &actual_type_ret, + &actual_format_ret, + &nitems, + &bytes_after_ret, + &prop); + if (return_code != Success || actual_format_ret == 0 || nitems == 0) { + if (return_code == Success) + XFree (prop); + return (unsigned char *) NULL; + } + if (length != nitems) + length = nitems; + if (actual_format_ret == 16) + length *= 2; + else if (actual_format_ret == 32) + length *= 4; + + /* if hit, it might be an error */ + if ((p = (unsigned char *) malloc (length)) == NULL) + return (unsigned char *) NULL; + + memmove (p, prop, length); + XFree (prop); + } + return (unsigned char *) p; +} + +static void ReadXConnectMessage (XIMS ims, XClientMessageEvent *ev) +{ + Xi18n i18n_core = ims->protocol; + XSpecRec *spec = (XSpecRec *) i18n_core->address.connect_addr; + XEvent event; + Display *dpy = i18n_core->address.dpy; + Window new_client = ev->data.l[0]; + CARD32 major_version = ev->data.l[1]; + CARD32 minor_version = ev->data.l[2]; + XClient *x_client = NewXClient (i18n_core, new_client); + + if (ev->window != i18n_core->address.im_window) + return; /* incorrect connection request */ + /*endif*/ + if (major_version != 0 || minor_version != 0) + { + major_version = + minor_version = 0; + /* Only supporting only-CM & Property-with-CM method */ + } + /*endif*/ + _XRegisterFilterByType (dpy, + x_client->accept_win, + ClientMessage, + ClientMessage, + WaitXIMProtocol, + (XPointer)ims); + event.xclient.type = ClientMessage; + event.xclient.display = dpy; + event.xclient.window = new_client; + event.xclient.message_type = spec->connect_request; + event.xclient.format = 32; + event.xclient.data.l[0] = x_client->accept_win; + event.xclient.data.l[1] = major_version; + event.xclient.data.l[2] = minor_version; + event.xclient.data.l[3] = XCM_DATA_LIMIT; + + XSendEvent (dpy, + new_client, + False, + NoEventMask, + &event); + XFlush (dpy); +} + +static Bool Xi18nXBegin (XIMS ims) +{ + Xi18n i18n_core = ims->protocol; + Display *dpy = i18n_core->address.dpy; + XSpecRec *spec = (XSpecRec *) i18n_core->address.connect_addr; + + spec->xim_request = XInternAtom (i18n_core->address.dpy, + _XIM_PROTOCOL, + False); + spec->connect_request = XInternAtom (i18n_core->address.dpy, + _XIM_XCONNECT, + False); + + _XRegisterFilterByType (dpy, + i18n_core->address.im_window, + ClientMessage, + ClientMessage, + WaitXConnectMessage, + (XPointer)ims); + return True; +} + +static Bool Xi18nXEnd(XIMS ims) +{ + Xi18n i18n_core = ims->protocol; + Display *dpy = i18n_core->address.dpy; + + _XUnregisterFilter (dpy, + i18n_core->address.im_window, + WaitXConnectMessage, + (XPointer)ims); + return True; +} + +static char *MakeNewAtom (CARD16 connect_id, char *atomName) +{ + static int sequence = 0; + + sprintf (atomName, + "_server%d_%d", + connect_id, + ((sequence > 20) ? (sequence = 0) : sequence++)); + return atomName; +} + +static Bool Xi18nXSend (XIMS ims, + CARD16 connect_id, + unsigned char *reply, + long length) +{ + Xi18n i18n_core = ims->protocol; + Xi18nClient *client = _Xi18nFindClient (i18n_core, connect_id); + XSpecRec *spec = (XSpecRec *) i18n_core->address.connect_addr; + XClient *x_client = (XClient *) client->trans_rec; + XEvent event; + + event.type = ClientMessage; + event.xclient.window = x_client->client_win; + event.xclient.message_type = spec->xim_request; + + if (length > XCM_DATA_LIMIT) + { + Atom atom; + char atomName[16]; + Atom actual_type_ret; + int actual_format_ret; + int return_code; + unsigned long nitems_ret; + unsigned long bytes_after_ret; + unsigned char *win_data; + + event.xclient.format = 32; + atom = XInternAtom (i18n_core->address.dpy, + MakeNewAtom (connect_id, atomName), + False); + return_code = XGetWindowProperty (i18n_core->address.dpy, + x_client->client_win, + atom, + 0L, + 10000L, + False, + XA_STRING, + &actual_type_ret, + &actual_format_ret, + &nitems_ret, + &bytes_after_ret, + &win_data); + if (return_code != Success) + return False; + /*endif*/ + if (win_data) + XFree ((char *) win_data); + /*endif*/ + XChangeProperty (i18n_core->address.dpy, + x_client->client_win, + atom, + XA_STRING, + 8, + PropModeAppend, + (unsigned char *) reply, + length); + event.xclient.data.l[0] = length; + event.xclient.data.l[1] = atom; + } + else + { + unsigned char buffer[XCM_DATA_LIMIT]; + int i; + + event.xclient.format = 8; + + /* Clear unused field with NULL */ + memmove(buffer, reply, length); + for (i = length; i < XCM_DATA_LIMIT; i++) + buffer[i] = (char) 0; + /*endfor*/ + length = XCM_DATA_LIMIT; + memmove (event.xclient.data.b, buffer, length); + } + XSendEvent (i18n_core->address.dpy, + x_client->client_win, + False, + NoEventMask, + &event); + XFlush (i18n_core->address.dpy); + return True; +} + +static Bool CheckCMEvent (Display *display, XEvent *event, XPointer xi18n_core) +{ + Xi18n i18n_core = (Xi18n) ((void *) xi18n_core); + XSpecRec *spec = (XSpecRec *) i18n_core->address.connect_addr; + + if ((event->type == ClientMessage) + && + (event->xclient.message_type == spec->xim_request)) + { + return True; + } + /*endif*/ + return False; +} + +static Bool Xi18nXWait (XIMS ims, + CARD16 connect_id, + CARD8 major_opcode, + CARD8 minor_opcode) +{ + Xi18n i18n_core = ims->protocol; + XEvent event; + Xi18nClient *client = _Xi18nFindClient (i18n_core, connect_id); + XClient *x_client = (XClient *) client->trans_rec; + + for (;;) + { + unsigned char *packet; + XimProtoHdr *hdr; + int connect_id_ret; + + XIfEvent (i18n_core->address.dpy, + &event, + CheckCMEvent, + (XPointer) i18n_core); + if (event.xclient.window == x_client->accept_win) + { + if ((packet = ReadXIMMessage (ims, + (XClientMessageEvent *) & event, + &connect_id_ret)) + == (unsigned char*) NULL) + { + return False; + } + /*endif*/ + hdr = (XimProtoHdr *)packet; + + if ((hdr->major_opcode == major_opcode) + && + (hdr->minor_opcode == minor_opcode)) + { + return True; + } + else if (hdr->major_opcode == XIM_ERROR) + { + return False; + } + /*endif*/ + } + /*endif*/ + } + /*endfor*/ +} + +static Bool Xi18nXDisconnect (XIMS ims, CARD16 connect_id) +{ + Xi18n i18n_core = ims->protocol; + Display *dpy = i18n_core->address.dpy; + Xi18nClient *client = _Xi18nFindClient (i18n_core, connect_id); + XClient *x_client = (XClient *) client->trans_rec; + + XDestroyWindow (dpy, x_client->accept_win); + _XUnregisterFilter (dpy, + x_client->accept_win, + WaitXIMProtocol, + (XPointer)ims); + XFree (x_client); + _Xi18nDeleteClient (i18n_core, connect_id); + return True; +} + +Bool _Xi18nCheckXAddress (Xi18n i18n_core, + TransportSW *transSW, + char *address) +{ + XSpecRec *spec; + + if (!(spec = (XSpecRec *) malloc (sizeof (XSpecRec)))) + return False; + /*endif*/ + + i18n_core->address.connect_addr = (XSpecRec *) spec; + i18n_core->methods.begin = Xi18nXBegin; + i18n_core->methods.end = Xi18nXEnd; + i18n_core->methods.send = Xi18nXSend; + i18n_core->methods.wait = Xi18nXWait; + i18n_core->methods.disconnect = Xi18nXDisconnect; + return True; +} + +static Bool WaitXConnectMessage (Display *dpy, + Window win, + XEvent *ev, + XPointer client_data) +{ + XIMS ims = (XIMS)client_data; + Xi18n i18n_core = ims->protocol; + XSpecRec *spec = (XSpecRec *) i18n_core->address.connect_addr; + + if (((XClientMessageEvent *) ev)->message_type + == spec->connect_request) + { + ReadXConnectMessage (ims, (XClientMessageEvent *) ev); + return True; + } + /*endif*/ + return False; +} + +static Bool WaitXIMProtocol (Display *dpy, + Window win, + XEvent *ev, + XPointer client_data) +{ + extern void _Xi18nMessageHandler (XIMS, CARD16, unsigned char *, Bool *); + XIMS ims = (XIMS) client_data; + Xi18n i18n_core = ims->protocol; + XSpecRec *spec = (XSpecRec *) i18n_core->address.connect_addr; + Bool delete = True; + unsigned char *packet; + int connect_id; + + if (((XClientMessageEvent *) ev)->message_type + == spec->xim_request) + { + if ((packet = ReadXIMMessage (ims, + (XClientMessageEvent *) ev, + &connect_id)) + == (unsigned char *) NULL) + { + return False; + } + /*endif*/ + _Xi18nMessageHandler (ims, connect_id, packet, &delete); + if (delete == True) + XFree (packet); + /*endif*/ + return True; + } + /*endif*/ + return False; +} diff -ruN xwin86/Imakefile xwin/Imakefile --- xwin86/Imakefile Thu May 1 02:54:39 2003 +++ xwin/Imakefile Thu May 29 22:53:38 2003 @@ -55,7 +55,21 @@ winclipboardxevents.c \ winvideo.c \ wintrayicon.c \ - windialogs.c + windialogs.c \ + winIC.c \ + IMdkit/FrameMgr.c \ + IMdkit/IMValues.c \ + IMdkit/i18nIMProto.c \ + IMdkit/i18nPtHdr.c \ + IMdkit/i18nX.c \ + IMdkit/IMConn.c \ + IMdkit/i18nAttr.c \ + IMdkit/i18nIc.c \ + IMdkit/IMMethod.c \ + IMdkit/i18nClbk.c \ + IMdkit/i18nMethod.c \ + IMdkit/i18nTr.c \ + IMdkit/i18nUtil.c /* * NOTE: The windialogs.rc file is compiled into windialogs.res. @@ -111,7 +125,23 @@ winclipboardxevents.o \ winvideo.o \ wintrayicon.o \ - windialogs.o + windialogs.o \ + winIC.o \ + IMdkit/FrameMgr.o \ + IMdkit/IMValues.o \ + IMdkit/i18nIMProto.o \ + IMdkit/i18nPtHdr.o \ + IMdkit/i18nX.o \ + IMdkit/IMConn.o \ + IMdkit/i18nAttr.o \ + IMdkit/i18nIc.o \ + IMdkit/IMMethod.o \ + IMdkit/i18nClbk.o \ + IMdkit/i18nMethod.o \ + IMdkit/i18nTr.o \ + IMdkit/i18nUtil.o + +SUBDIRS = IMdkit INCLUDES = -I. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \ -I$(SERVERSRC)/fb -I$(SERVERSRC)/mi \ diff -ruN xwin86/win.h xwin/win.h --- xwin86/win.h Sat May 17 14:57:24 2003 +++ xwin/win.h Thu May 29 23:58:22 2003 @@ -563,6 +563,9 @@ extern HINSTANCE g_hInstance; extern HWND g_hDlgDepthChange; extern HWND g_hDlgExit; +extern pthread_mutex_t g_pmIMEMutex; +extern char* g_pszIMECommitString; +extern POINT g_pCompositionPos; /* diff -ruN xwin86/winIC.c xwin/winIC.c --- xwin86/winIC.c Thu Jan 1 09:00:00 1970 +++ xwin/winIC.c Mon May 26 19:18:00 2003 @@ -0,0 +1,285 @@ +/****************************************************************** + + Copyright 1993, 1994 by Hewlett-Packard Company + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose without fee is hereby granted, +provided that the above copyright notice appear in all copies and +that both that copyright notice and this permission notice appear +in supporting documentation, and that the name of Hewlett-Packard not +be used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. +Hewlett-Packard Company makes no representations about the suitability +of this software for any purpose. +It is provided "as is" without express or implied warranty. + +HEWLETT-PACKARD COMPANY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS +SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, +IN NO EVENT SHALL HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY SPECIAL, +INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + +Author: + Hidetoshi Tajima Hewlett-Packard Company. + (tajima@kobe.hp.com) +******************************************************************/ + +#include +#include +#include "IMdkit/IMdkit.h" +#include "IMdkit/Xi18n.h" +#include "winIC.h" + +static ICX *ic_list = (ICX *)NULL; +static ICX *free_list = (ICX *)NULL; + +static ICX +*NewICX() +{ + static CARD16 icid = 0; + ICX *rec; + + if (free_list != NULL) { + rec = free_list; + free_list = free_list->next; + } else { + rec = (ICX *)malloc(sizeof(ICX)); + } + memset(rec, 0, sizeof(ICX)); + rec->id = ++icid; + + rec->next = ic_list; + ic_list = rec; + return rec; +} + +static void +StoreICX(rec, call_data) +ICX *rec; +IMChangeICStruct *call_data; +{ + XICAttribute *ic_attr = call_data->ic_attr; + XICAttribute *pre_attr = call_data->preedit_attr; + XICAttribute *sts_attr = call_data->status_attr; + register int i; + + for (i = 0; i < (int)call_data->ic_attr_num; i++, ic_attr++) { + if (!strcmp(XNInputStyle, ic_attr->name)) + rec->input_style = *(INT32*)ic_attr->value; + else if (!strcmp(XNClientWindow, ic_attr->name)) + rec->client_win = *(Window*)ic_attr->value; + else if (!strcmp(XNFocusWindow, ic_attr->name)) + rec->focus_win = *(Window*)ic_attr->value; + } + for (i = 0; i < (int)call_data->preedit_attr_num; i++, pre_attr++) { + if (!strcmp(XNArea, pre_attr->name)) + rec->pre_attr.area = *(XRectangle*)pre_attr->value; + else if (!strcmp(XNAreaNeeded, pre_attr->name)) + rec->pre_attr.area_needed = *(XRectangle*)pre_attr->value; + else if (!strcmp(XNSpotLocation, pre_attr->name)) + rec->pre_attr.spot_location = *(XPoint*)pre_attr->value; + else if (!strcmp(XNColormap, pre_attr->name)) + rec->pre_attr.cmap = *(Colormap*)pre_attr->value; + else if (!strcmp(XNStdColormap, pre_attr->name)) + rec->pre_attr.cmap = *(Colormap*)pre_attr->value; + else if (!strcmp(XNForeground, pre_attr->name)) + rec->pre_attr.foreground = *(CARD32*)pre_attr->value; + else if (!strcmp(XNBackground, pre_attr->name)) + rec->pre_attr.background = *(CARD32*)pre_attr->value; + else if (!strcmp(XNBackgroundPixmap, pre_attr->name)) + rec->pre_attr.bg_pixmap = *(Pixmap*)pre_attr->value; + else if (!strcmp(XNFontSet, pre_attr->name)) { + int str_length = strlen(pre_attr->value); + if (rec->pre_attr.base_font != NULL) { + if (strcmp(rec->pre_attr.base_font, pre_attr->value)) { + XFree(rec->pre_attr.base_font); + } else { + continue; + } + } + rec->pre_attr.base_font = malloc(str_length + 1); + strcpy(rec->pre_attr.base_font, pre_attr->value); + } else if (!strcmp(XNLineSpace, pre_attr->name)) + rec->pre_attr.line_space = *(CARD32*)pre_attr->value; + else if (!strcmp(XNCursor, pre_attr->name)) + rec->pre_attr.cursor = *(Cursor*)pre_attr->value; + } + for (i = 0; i < (int)call_data->status_attr_num; i++, sts_attr++) { + if (!strcmp(XNArea, sts_attr->name)) + rec->sts_attr.area = *(XRectangle*)sts_attr->value; + else if (!strcmp(XNAreaNeeded, sts_attr->name)) + rec->sts_attr.area_needed = *(XRectangle*)sts_attr->value; + else if (!strcmp(XNColormap, sts_attr->name)) + rec->sts_attr.cmap = *(Colormap*)sts_attr->value; + else if (!strcmp(XNStdColormap, sts_attr->name)) + rec->sts_attr.cmap = *(Colormap*)sts_attr->value; + else if (!strcmp(XNForeground, sts_attr->name)) + rec->sts_attr.foreground = *(CARD32*)sts_attr->value; + else if (!strcmp(XNBackground, sts_attr->name)) + rec->sts_attr.background = *(CARD32*)sts_attr->value; + else if (!strcmp(XNBackgroundPixmap, sts_attr->name)) + rec->sts_attr.bg_pixmap = *(Pixmap*)sts_attr->value; + else if (!strcmp(XNFontSet, sts_attr->name)) { + int str_length = strlen(sts_attr->value); + if (rec->sts_attr.base_font != NULL) { + if (strcmp(rec->sts_attr.base_font, sts_attr->value)) { + XFree(rec->sts_attr.base_font); + } else { + continue; + } + } + rec->sts_attr.base_font = malloc(str_length + 1); + strcpy(rec->sts_attr.base_font, sts_attr->value); + } else if (!strcmp(XNLineSpace, sts_attr->name)) + rec->sts_attr.line_space= *(CARD32*)sts_attr->value; + else if (!strcmp(XNCursor, sts_attr->name)) + rec->sts_attr.cursor = *(Cursor*)sts_attr->value; + } + +} + +ICX +*FindICX(icid) +CARD16 icid; +{ + ICX *rec = ic_list; + + while (rec != NULL) { + if (rec->id == icid) + return rec; + rec = rec->next; + } + + return NULL; +} + +void +CreateICX(call_data) +IMChangeICStruct *call_data; +{ + ICX *rec; + + rec = NewICX(); + if (rec == NULL) + return; + StoreICX(rec, call_data); + call_data->icid = rec->id; + return; +} + +void +SetICX(call_data) +IMChangeICStruct *call_data; +{ + ICX *rec = FindICX(call_data->icid); + + if (rec == NULL) + return; + StoreICX(rec, call_data); + return; +} + +void +GetICX(call_data) +IMChangeICStruct *call_data; +{ + XICAttribute *ic_attr = call_data->ic_attr; + XICAttribute *pre_attr = call_data->preedit_attr; + XICAttribute *sts_attr = call_data->status_attr; + register int i; + ICX *rec = FindICX(call_data->icid); + + if (rec == NULL) + return; + for (i = 0; i < (int)call_data->ic_attr_num; i++, ic_attr++) { + if (!strcmp(XNFilterEvents, ic_attr->name)) { + ic_attr->value = (void *)malloc(sizeof(CARD32)); + *(CARD32*)ic_attr->value = KeyPressMask|KeyReleaseMask; + ic_attr->value_length = sizeof(CARD32); + } + } + + /* preedit attributes */ + for (i = 0; i < (int)call_data->preedit_attr_num; i++, pre_attr++) { + if (!strcmp(XNArea, pre_attr->name)) { + pre_attr->value = (void *)malloc(sizeof(XRectangle)); + *(XRectangle*)pre_attr->value = rec->pre_attr.area; + pre_attr->value_length = sizeof(XRectangle); + } else if (!strcmp(XNAreaNeeded, pre_attr->name)) { + pre_attr->value = (void *)malloc(sizeof(XRectangle)); + *(XRectangle*)pre_attr->value = rec->pre_attr.area_needed; + pre_attr->value_length = sizeof(XRectangle); + } else if (!strcmp(XNSpotLocation, pre_attr->name)) { + pre_attr->value = (void *)malloc(sizeof(XPoint)); + *(XPoint*)pre_attr->value = rec->pre_attr.spot_location; + pre_attr->value_length = sizeof(XPoint); + } else if (!strcmp(XNFontSet, pre_attr->name)) { + CARD16 base_len = (CARD16)strlen(rec->pre_attr.base_font); + int total_len = sizeof(CARD16) + (CARD16)base_len; + char *p; + + pre_attr->value = (void *)malloc(total_len); + p = (char *)pre_attr->value; + memmove(p, &base_len, sizeof(CARD16)); + p += sizeof(CARD16); + strncpy(p, rec->pre_attr.base_font, base_len); + pre_attr->value_length = total_len; + } else if (!strcmp(XNForeground, pre_attr->name)) { + pre_attr->value = (void *)malloc(sizeof(long)); + *(long*)pre_attr->value = rec->pre_attr.foreground; + pre_attr->value_length = sizeof(long); + } else if (!strcmp(XNBackground, pre_attr->name)) { + pre_attr->value = (void *)malloc(sizeof(long)); + *(long*)pre_attr->value = rec->pre_attr.background; + pre_attr->value_length = sizeof(long); + } else if (!strcmp(XNLineSpace, pre_attr->name)) { + pre_attr->value = (void *)malloc(sizeof(long)); +#if 0 + *(long*)pre_attr->value = rec->pre_attr.line_space; +#endif + *(long*)pre_attr->value = 18; + pre_attr->value_length = sizeof(long); + } + } + + /* status attributes */ + for (i = 0; i < (int)call_data->status_attr_num; i++, sts_attr++) { + if (!strcmp(XNArea, sts_attr->name)) { + sts_attr->value = (void *)malloc(sizeof(XRectangle)); + *(XRectangle*)sts_attr->value = rec->sts_attr.area; + sts_attr->value_length = sizeof(XRectangle); + } else if (!strcmp(XNAreaNeeded, sts_attr->name)) { + sts_attr->value = (void *)malloc(sizeof(XRectangle)); + *(XRectangle*)sts_attr->value = rec->sts_attr.area_needed; + sts_attr->value_length = sizeof(XRectangle); + } else if (!strcmp(XNFontSet, sts_attr->name)) { + CARD16 base_len = (CARD16)strlen(rec->sts_attr.base_font); + int total_len = sizeof(CARD16) + (CARD16)base_len; + char *p; + + sts_attr->value = (void *)malloc(total_len); + p = (char *)sts_attr->value; + memmove(p, &base_len, sizeof(CARD16)); + p += sizeof(CARD16); + strncpy(p, rec->sts_attr.base_font, base_len); + sts_attr->value_length = total_len; + } else if (!strcmp(XNForeground, sts_attr->name)) { + sts_attr->value = (void *)malloc(sizeof(long)); + *(long*)sts_attr->value = rec->sts_attr.foreground; + sts_attr->value_length = sizeof(long); + } else if (!strcmp(XNBackground, sts_attr->name)) { + sts_attr->value = (void *)malloc(sizeof(long)); + *(long*)sts_attr->value = rec->sts_attr.background; + sts_attr->value_length = sizeof(long); + } else if (!strcmp(XNLineSpace, sts_attr->name)) { + sts_attr->value = (void *)malloc(sizeof(long)); +#if 0 + *(long*)sts_attr->value = rec->sts_attr.line_space; +#endif + *(long*)sts_attr->value = 18; + sts_attr->value_length = sizeof(long); + } + } +} diff -ruN xwin86/winIC.h xwin/winIC.h --- xwin86/winIC.h Thu Jan 1 09:00:00 1970 +++ xwin/winIC.h Mon May 26 19:12:25 2003 @@ -0,0 +1,77 @@ +/****************************************************************** + + Copyright 1993, 1994 by Hewlett-Packard Company + +Permission to use, copy, modify, distribute, and sell this software +and its documentation for any purpose without fee is hereby granted, +provided that the above copyright notice appear in all copies and +that both that copyright notice and this permission notice appear +in supporting documentation, and that the name of Hewlett-Packard not +be used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. +Hewlett-Packard Company makes no representations about the suitability +of this software for any purpose. +It is provided "as is" without express or implied warranty. + +HEWLETT-PACKARD COMPANY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS +SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, +IN NO EVENT SHALL HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY SPECIAL, +INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + +Author: + Hidetoshi Tajima Hewlett-Packard Company. + (tajima@kobe.hp.com) +******************************************************************/ + +typedef struct { + XRectangle area; /* area */ + XRectangle area_needed; /* area needed */ + XPoint spot_location; /* spot location */ + Colormap cmap; /* colormap */ + CARD32 foreground; /* foreground */ + CARD32 background; /* background */ + Pixmap bg_pixmap; /* background pixmap */ + char *base_font; /* base font of fontset */ + CARD32 line_space; /* line spacing */ + Cursor cursor; /* cursor */ +} PreeditAttributes; + +typedef struct { + XRectangle area; /* area */ + XRectangle area_needed; /* area needed */ + Colormap cmap; /* colormap */ + CARD32 foreground; /* foreground */ + CARD32 background; /* background */ + Pixmap bg_pixmap; /* background pixmap */ + char *base_font; /* base font of fontset */ + CARD32 line_space; /* line spacing */ + Cursor cursor; /* cursor */ +} StatusAttributes; + +typedef struct _ICX { + CARD16 id; /* ic id */ + INT32 input_style; /* input style */ + Window client_win; /* client window */ + Window focus_win; /* focus window */ + char *resource_name; /* resource name */ + char *resource_class; /* resource class */ + PreeditAttributes pre_attr; /* preedit attributes */ + StatusAttributes sts_attr; /* status attributes */ + struct _ICX *next; +} ICX; + +ICX* +FindICX(CARD16 icid); + +void +CreateICX(IMChangeICStruct *call_data); + +void +SetICX(IMChangeICStruct *call_data); + +void +GetICX(IMChangeICStruct *call_data); + diff -ruN xwin86/winblock.c xwin/winblock.c --- xwin86/winblock.c Fri May 2 00:57:52 2003 +++ xwin/winblock.c Mon May 26 11:52:49 2003 @@ -73,6 +73,7 @@ && (g_hDlgExit == 0 || !IsDialogMessage (g_hDlgExit, &msg))) { + TranslateMessage(&msg); DispatchMessage (&msg); } } diff -ruN xwin86/winmultiwindowwindow.c xwin/winmultiwindowwindow.c --- xwin86/winmultiwindowwindow.c Mon May 19 03:19:59 2003 +++ xwin/winmultiwindowwindow.c Fri May 30 00:07:09 2003 @@ -31,10 +31,11 @@ #include "win.h" #include "dixevents.h" +#include +#include "../xfree86/common/atKeynames.h" extern Bool g_fCursor; - /* * Prototypes for local functions */ @@ -1344,6 +1345,83 @@ ErrorF ("winTopLevelWindowProc - Unknown WM_TIMER\n"); } return 0; + + case WM_IME_NOTIFY: + { + if (wParam == IMN_SETOPENSTATUS) + { + HIMC hIMC = ImmGetContext(hwnd); + if (ImmGetOpenStatus(hIMC)) { + winSendKeyEvent (KEY_F11, TRUE); + winSendKeyEvent (KEY_F11, FALSE); + } else { + winSendKeyEvent (KEY_F12, TRUE); + winSendKeyEvent (KEY_F12, FALSE); + } + ImmReleaseContext(hwnd, hIMC); + } + } + break; + + case WM_IME_STARTCOMPOSITION: + { + HIMC hIMC = ImmGetContext(hwnd); + COMPOSITIONFORM cf; + + cf.dwStyle = CFS_POINT; + cf.ptCurrentPos.x = g_pCompositionPos.x; + cf.ptCurrentPos.y = g_pCompositionPos.y; + ImmSetCompositionWindow(hIMC, &cf); + ImmReleaseContext(hwnd, hIMC); + } + break; + + case WM_IME_COMPOSITION: + { + HIMC hIMC = ImmGetContext(hwnd); + COMPOSITIONFORM cf; + + if (lParam & GCS_RESULTSTR) { + int iUnicodeLen = 0; + wchar_t *pwszUnicodeStr = NULL; + int iUTF8; + char *pszUTF8 = NULL; + + iUnicodeLen = ImmGetCompositionStringW(hIMC, GCS_RESULTSTR, NULL, 0); + pwszUnicodeStr + = (wchar_t*) malloc (sizeof (wchar_t) * (iUnicodeLen + 1)); + ImmGetCompositionStringW(hIMC, GCS_RESULTSTR, pwszUnicodeStr, iUnicodeLen); + ImmReleaseContext(hwnd, hIMC); + + iUTF8 = WideCharToMultiByte (CP_UTF8, + 0, + (LPCWSTR)pwszUnicodeStr, + -1, + NULL, + 0, + NULL, + NULL); + pszUTF8 = (char *) malloc (iUTF8); /* Don't need +1 */ + WideCharToMultiByte (CP_UTF8, + 0, + (LPCWSTR)pwszUnicodeStr, + -1, + pszUTF8, + iUTF8, + NULL, + NULL); + pthread_mutex_lock (&g_pmIMEMutex); + if (g_pszIMECommitString) + { + free (g_pszIMECommitString); + } + + g_pszIMECommitString = pszUTF8; + pthread_mutex_unlock (&g_pmIMEMutex); + free (pwszUnicodeStr); + } + } + break; default: break; @@ -1456,6 +1534,7 @@ { if (g_hDlgDepthChange == 0 || !IsDialogMessage (g_hDlgDepthChange, &msg)) { + TranslateMessage(&msg); DispatchMessage (&msg); } } diff -ruN xwin86/winmultiwindowwm.c xwin/winmultiwindowwm.c --- xwin86/winmultiwindowwm.c Sun May 18 02:01:08 2003 +++ xwin/winmultiwindowwm.c Fri May 30 01:28:28 2003 @@ -43,6 +43,7 @@ #include #include #include +#include /* Fixups to prevent collisions between Windows and X headers */ #define ATOM DWORD @@ -50,8 +51,13 @@ /* Windows headers */ #include +/* IMdkit headers */ +#include "IMdkit/IMdkit.h" +#include "IMdkit/Xi18n.h" + /* Local headers */ #include "winwindow.h" +#include "winIC.h" /* @@ -60,9 +66,10 @@ #define WIN_CONNECT_RETRIES 5 #define WIN_CONNECT_DELAY 5 -#define WIN_MSG_QUEUE_FNAME "/dev/windows" #define WIN_JMP_OKAY 0 #define WIN_JMP_ERROR_IO 2 +#define DEFAULT_IMNAME "XFREE86_CYGWIN_IM" +#define DEFAULT_LOCALE "ja_JP" /* @@ -151,15 +158,368 @@ /* + * Globals + */ + +pthread_mutex_t g_pmIMEMutex; +char* g_pszIMECommitString; +POINT g_pCompositionPos; +POINT g_pCompositionPosMy; + + +/* * Local globals */ static int g_nQueueSize; static jmp_buf g_jmpEntry; +static Display* g_dpy; +//static Bool use_trigger = True; /* Dynamic Event Flow is default */ +//static Bool use_offkey = True; /* Register OFF Key for Dynamic Event Flow */ +static Bool use_tcp = False; /* Using TCP/IP Transport or not */ +static Bool use_local = False; /* Using Unix domain Tranport or not */ +static long filter_mask = KeyPressMask; + + +/* + * Supported Inputstyles + */ + +static XIMStyle Styles[] = + { + // XIMPreeditCallbacks | XIMStatusCallbacks, + XIMPreeditPosition | XIMStatusArea, + XIMPreeditPosition | XIMStatusNothing, + //XIMPreeditArea | XIMStatusArea, + XIMPreeditNothing | XIMStatusNothing, + 0 + }; + +/* Trigger Keys List */ +static XIMTriggerKey On_Trigger_Keys[] = { + {XK_space, ShiftMask, ShiftMask}, + {XK_F11, 0L, 0L}, + {0L, 0L, 0L} +}; + +/* Trigger Keys List */ +static XIMTriggerKey Off_Trigger_Keys[] = { + {XK_space, ShiftMask, ShiftMask}, + {XK_F12, 0L, 0L}, + {0L, 0L, 0L} +}; + +/* Conversion Keys List */ +static XIMTriggerKey Conversion_Keys[] = { + {XK_k, ControlMask, ControlMask}, + {0L, 0L, 0L} +}; + +/* + * Forward Keys List + */ + +static XIMTriggerKey Forward_Keys[] = + { + {XK_Return, 0, 0}, + {XK_Tab, 0, 0}, + {0L, 0L, 0L} + }; + +/* + * Supported Japanese Encodings + */ + +static XIMEncoding jaEncodings[] = + { + "COMPOUND_TEXT", + "eucJP", + "SJIS", + NULL + }; /* + * Supported Taiwanese Encodings + */ + +static XIMEncoding zhEncodings[] = +{ + "COMPOUND_TEXT", + "eucTW", + NULL +}; + + +/**/ + +static Bool +MyGetICValuesHandler(ims, call_data) +XIMS ims; +IMChangeICStruct *call_data; +{ + GetICX(call_data); + return True; +} + +static Bool +MySetICValuesHandler(ims, call_data) +XIMS ims; +IMChangeICStruct *call_data; +{ + ICX *rec = FindICX(call_data->icid); + //XWindowAttributes attr; + + SetICX(call_data); + + if (rec != NULL) + { + Window iDummy; + /* + Window iWin = rec->focus_win; + Window iParent = rec->focus_win; + Window iRoot = DefaultRootWindow(g_dpy); + Window *pDummy; + int nDummy; + + XQueryTree (g_dpy, iWin, &iDummy, &iParent, &pDummy, &nDummy); + XFree (pDummy); + + while (iParent != iRoot) + { + iWin = iParent; + XQueryTree (g_dpy, iWin, &iDummy, &iParent, &pDummy, &nDummy); + XFree (pDummy); + } + + /* XGetWindowAttributes (g_dpy, + rec->focus_win, + &attr);*/ + XTranslateCoordinates (g_dpy, + rec->focus_win, + rec->client_win, + rec->pre_attr.spot_location.x, + rec->pre_attr.spot_location.y, + &g_pCompositionPos.x, + &g_pCompositionPos.y, + &iDummy); + fprintf(stdout, "pCompositionPos %d, %d\n", (int)g_pCompositionPos.x, (int)g_pCompositionPos.y); + } + return True; +} + +static Bool +MyOpenHandler(ims, call_data) +XIMS ims; +IMOpenStruct *call_data; +{ +#ifdef DEBUG + printf("new_client lang is %s\n", call_data->lang.name); +#endif + return True; +} + +static Bool +MyCreateICHandler(ims, call_data) +XIMS ims; +IMChangeICStruct *call_data; +{ + CreateICX(call_data); + return True; +} + +#define STRBUFLEN 64 +static Bool +IsMatchKeys(ims, call_data, trigger) +XIMS ims; +IMForwardEventStruct *call_data; +XIMTriggerKey *trigger; +{ + char strbuf[STRBUFLEN]; + KeySym keysym; + int i; + int modifier; + int modifier_mask; + XKeyEvent *kev; + int key_count; + + kev = (XKeyEvent*)&call_data->event; + XLookupString(kev, strbuf, STRBUFLEN, &keysym, NULL); + + for (i = 0; trigger[i].keysym != 0; i++); + key_count = i; + for (i = 0; i < key_count; i++) { + modifier = trigger[i].modifier; + modifier_mask = trigger[i].modifier_mask; + if (((KeySym)trigger[i].keysym == keysym) + && ((kev->state & modifier_mask) == modifier)) + return True; + } + return False; +} + +static void +ProcessKey(ims, call_data) +XIMS ims; +IMForwardEventStruct *call_data; +{ + char strbuf[STRBUFLEN]; + KeySym keysym; + XKeyEvent *kev; + int count; + + kev = (XKeyEvent*)&call_data->event; + count = XLookupString(kev, strbuf, STRBUFLEN, &keysym, NULL); + + if (count > 0) { + fprintf(stdout, "'%s' is filtered in sampleIM\n", strbuf); + } +} + +static Bool +MyForwardEventHandler(ims, call_data) +XIMS ims; +IMForwardEventStruct *call_data; +{ + XTextProperty tp; + Display *display = ims->core.display; + char *text;// = "This is string from IM."; + char lang[20]; + /* Lookup KeyPress Events only */ + if (call_data->event.type != KeyPress) return True; + + //if (IsMatchKeys(ims, call_data, Conversion_Keys)) + pthread_mutex_lock (&g_pmIMEMutex); + text = g_pszIMECommitString;//"This is string from IM."; + //setlocale(LC_CTYPE, ""); + fprintf(stdout, "commit %s", text); + Xutf8TextListToTextProperty(display, (char **)&text, 1, + XCompoundTextStyle, &tp); + free (g_pszIMECommitString); + g_pszIMECommitString = NULL; + pthread_mutex_unlock (&g_pmIMEMutex); + + if (text != NULL) + { + ((IMCommitStruct*)call_data)->flag |= XimLookupChars; + ((IMCommitStruct*)call_data)->commit_string = (char *)tp.value; + IMCommitString(ims, (XPointer)call_data); + } + else if (IsMatchKeys(ims, call_data, Forward_Keys)) + { + IMForwardEvent(ims, (XPointer)call_data); + } + else + { + ProcessKey(ims, call_data); + } + return True; +} + +static Bool +MyTriggerNotifyHandler(ims, call_data) +XIMS ims; +IMTriggerNotifyStruct *call_data; +{ + if (call_data->flag == 0) { /* on key */ + /* Here, the start of preediting is notified from IMlibrary, which + is the only way to start preediting in case of Dynamic Event + Flow, because ON key is mandatary for Dynamic Event Flow. */ + return True; + } else if (call_data->flag == 1) { /* off key */ + /* Here, the end of preediting is notified from the IMlibrary, which + happens only if OFF key, which is optional for Dynamic Event Flow, + has been registered by IMOpenIM or IMSetIMValues, otherwise, + the end of preediting must be notified from the IMserver to the + IMlibrary. */ + return True; + } else { + /* never happens */ + return False; + } +} + +static Bool +MyPreeditStartReplyHandler(ims, call_data) +XIMS ims; +IMPreeditCBStruct *call_data; +{ +} + +static Bool +MyPreeditCaretReplyHandler(ims, call_data) +XIMS ims; +IMPreeditCBStruct *call_data; +{ +} + +static Bool +MyProtoHandler(ims, call_data) +XIMS ims; +IMProtocol *call_data; +{ + switch (call_data->major_code) { + case XIM_OPEN: + MyOpenHandler(ims, call_data); + break; + case XIM_CREATE_IC: + MyCreateICHandler(ims, call_data); + break; + case XIM_DESTROY_IC: + break; + case XIM_SET_IC_VALUES: + MySetICValuesHandler(ims, call_data); + break; + case XIM_GET_IC_VALUES: + MyGetICValuesHandler(ims, call_data); + break; + case XIM_FORWARD_EVENT: + MyForwardEventHandler(ims, call_data); + break; + case XIM_SET_IC_FOCUS: + break; + case XIM_UNSET_IC_FOCUS: + break; + case XIM_RESET_IC: + break; + case XIM_TRIGGER_NOTIFY: + MyTriggerNotifyHandler(ims, call_data); + break; + case XIM_PREEDIT_START_REPLY: + MyPreeditStartReplyHandler(ims, call_data); + break; + case XIM_PREEDIT_CARET_REPLY: + MyPreeditCaretReplyHandler(ims, call_data); + break; + } +} + +void MyXEventHandler(im_window, event) +Window im_window; +XEvent *event; +{ + switch (event->type) { + case DestroyNotify: + break; + case ButtonPress: + switch (event->xbutton.button) { + case Button3: + if (event->xbutton.window == im_window) + goto Exit; + break; + } + default: + break; + } + return; + Exit: + XDestroyWindow(event->xbutton.display, im_window); + exit(0); +} + +/**/ +/* * PushMessage - Push a message onto the queue */ @@ -722,6 +1082,16 @@ Atom atmWmName; Atom atmWmHints; int iReturn; + char *imname = NULL; + XIMS ims; + XIMStyles *input_styles, *styles2; + XIMTriggerKeys *on_keys, *on_trigger2; + XIMTriggerKeys *off_keys, *off_trigger2; + XIMEncodings *encodings, *encoding2; + Window im_window; + register int i; + char transport[80]; /* enough */ + imname = DEFAULT_IMNAME; ErrorF ("winMultiWindowXMsgProc - Hello\n"); @@ -812,12 +1182,117 @@ "WM_HINTS", False); + /**/ + g_dpy = pProcArg->pDisplay; + im_window = XCreateSimpleWindow(g_dpy, DefaultRootWindow(g_dpy), + 0, 0, 1, 1, 1, 0, 0); + if (im_window == (Window)NULL) + { + fprintf(stderr, "Can't Create Window\n"); + exit(1); + } + + XStoreName(g_dpy, im_window, "XFree86/Cygwin Input Method Server"); + + if ((input_styles = (XIMStyles *)malloc(sizeof(XIMStyles))) == NULL) + { + fprintf(stderr, "Can't allocate\n"); + exit(1); + } + + input_styles->count_styles = sizeof(Styles)/sizeof(XIMStyle) - 1; + input_styles->supported_styles = Styles; + + if ((on_keys = (XIMTriggerKeys *) + malloc(sizeof(XIMTriggerKeys))) == NULL) + { + fprintf(stderr, "Can't allocate\n"); + exit(1); + } + on_keys->count_keys = sizeof(On_Trigger_Keys)/sizeof(XIMTriggerKey) - 1; + on_keys->keylist = On_Trigger_Keys; + + if ((off_keys = (XIMTriggerKeys *) + malloc(sizeof(XIMTriggerKeys))) == NULL) + { + fprintf(stderr, "Can't allocate\n"); + exit(1); + } + off_keys->count_keys = sizeof(Off_Trigger_Keys)/sizeof(XIMTriggerKey) - 1; + off_keys->keylist = Off_Trigger_Keys; + + if ((encodings = (XIMEncodings *)malloc(sizeof(XIMEncodings))) == NULL) + { + fprintf(stderr, "Can't allocate\n"); + exit(1); + } + encodings->count_encodings = sizeof(jaEncodings)/sizeof(XIMEncoding) - 1; + encodings->supported_encodings = jaEncodings; + + if (use_local) + { + char hostname[64]; + char *address = "/tmp/.ximsock"; + + gethostname(hostname, 64); + sprintf(transport, "local/%s:%s", hostname, address); + } + else if (use_tcp) + { + char hostname[64]; + int port_number = 9010; + + gethostname(hostname, 64); + sprintf(transport, "tcp/%s:%d", hostname, port_number); + } + else + { + strcpy(transport, "X/"); + } + + ims = IMOpenIM(g_dpy, + IMModifiers, "Xi18n", + IMServerWindow, im_window, + IMServerName, imname, + IMLocale, DEFAULT_LOCALE, + IMServerTransport, transport, + IMInputStyles, input_styles, + NULL); + if (ims == (XIMS)NULL) + { + fprintf(stderr, "Can't Open Input Method Service:\n"); + fprintf(stderr, "\tInput Method Name :%s\n", imname); + fprintf(stderr, "\tTranport Address:%s\n", transport); + exit(1); + } + IMSetIMValues(ims, + IMOnKeysList, on_keys, + IMOffKeysList, off_keys, + NULL); + IMSetIMValues(ims, + IMEncodingList, encodings, + IMProtocolHandler, MyProtoHandler, + IMFilterEventMask, filter_mask, + NULL); + IMGetIMValues(ims, + IMInputStyles, &styles2, + IMOnKeysList, &on_trigger2, + IMOffKeysList, &off_trigger2, + IMEncodingList, &encoding2, + NULL); + XSelectInput(g_dpy, im_window, StructureNotifyMask|ButtonPressMask); + //XMapWindow(g_dpy, im_window); + /* Loop until we explicitly break out */ while (1) { /* Fetch next event */ XNextEvent (pProcArg->pDisplay, &event); + if (XFilterEvent(&event, None) == True) + continue; + MyXEventHandler(im_window, &event); + /* Branch on event type */ if (event.type == CreateNotify) { @@ -953,6 +1428,8 @@ } ErrorF ("winInitMultiWindowWM - pthread_mutex_lock () returned.\n"); + + pthread_mutex_init (&g_pmIMEMutex, NULL); /* Do we have Unicode support? */ fUnicodeSupport = winClipboardDetectUnicodeSupport (); diff -ruN xwin86/winwakeup.c xwin/winwakeup.c --- xwin86/winwakeup.c Fri May 2 00:59:13 2003 +++ xwin/winwakeup.c Mon May 26 11:53:02 2003 @@ -52,6 +52,7 @@ && (g_hDlgExit == 0 || !IsDialogMessage (g_hDlgExit, &msg))) { + TranslateMessage(&msg); DispatchMessage (&msg); } }