/* @(#)67	1.2.1.2  src/bos/usr/include/im.h, libim, bos411, 9428A410j 5/26/93 04:59:21 */
/*
 * COMPONENT_NAME :	LIBIM - AIX Input Method
 *
 * FUNCTIONS : header file for libIM
 *
 * ORIGINS : 27
 *
 * (C) COPYRIGHT International Business Machines Corp. 1989, 1991, 1993
 * All Rights Reserved
 * Licensed Materials - Property of IBM
 *
 * US Government Users Restricted Rights - Use, duplication or
 * disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
 */

/***********************************************************
Copyright International Business Machines Corporation 1989

                        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 IBM not be
used in advertising or publicity pertaining to distribution of the
software without specific, written prior permission.

IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
IBM 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 TORTUOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.

******************************************************************/

#ifndef	_im_h
#define _im_h
 
/*-----------------------------------------------------------------------*
*	Include
*-----------------------------------------------------------------------*/
#include <sys/types.h>
#include "imerrno.h"

#ifndef	True
#define True	1
#endif	/* True */
#ifndef	False
#define False	0
#endif	/* False */
#ifndef	TRUE
#define TRUE	1
#endif	/* TRUE */
#ifndef	FALSE
#define FALSE	0
#endif	/* FALSE */
#ifndef	NULL
		#undef NULL
#define NULL	0
#endif	/* NULL */

/*-----------------------------------------------------------------------*
*	IMDIRECTORY
*-----------------------------------------------------------------------*/
#define	IMDIRECTORY	"/usr/lib/nls/loc"
#define	IMPOSTFIX	".im"
#define	IMKMPOSTFIX	".imkeymap"

/* !!! the following are no longer used */
#define	IMMODULENAME	"inputmethod"
#define	IMKEYMAPNAME	"imkeymap"
#define	IMDEFAULTLANG	"ibmsbcs"
 
/*-----------------------------------------------------------------------*
*	IMLanguage
*-----------------------------------------------------------------------*/
typedef	caddr_t	IMLanguage;
 
/*-----------------------------------------------------------------------*
*	IMSTR and IMSTRATT
*-----------------------------------------------------------------------*/
typedef struct	{
	unsigned int	len;		/* length in byte */
	caddr_t	str;			/* string, not null terminated */
}	IMSTR;

typedef	struct	{
	unsigned int	len;		/* length in byte */
	caddr_t	str;			/* string, not null terminated */
	caddr_t	att;			/* attributes of string */
}	IMSTRATT;
 
/* attribute value is one of... */
#define	IMAttNone	0
#define	IMAttHighlight	(1 << 0)
#define	IMAttAttention	(1 << 1)
 
/*-----------------------------------------------------------------------*
*	IMFunc
*-----------------------------------------------------------------------*/
typedef int	(*IMFunc)();
 
/*-----------------------------------------------------------------------*
*	IMCallback
*-----------------------------------------------------------------------*/
typedef struct  {
	unsigned int	textmaxwidth;	/* max width of Text area */
	IMFunc	textdraw;		/* IMTextDraw() */
	IMFunc	texthide;		/* IMTextHide() */
	IMFunc	textstart;		/* IMTextStart() */
	IMFunc	textcursor;		/* IMTextCursor() */
	IMFunc	auxcreate;		/* IMAuxCreate() */
	IMFunc	auxdraw;		/* IMAuxDraw() */
	IMFunc	auxhide;		/* IMAuxHide() */
	IMFunc	auxdestroy;		/* IMAuxDestroy() */
	IMFunc	indicatordraw;		/* IMIndicatorDraw() */
	IMFunc	indicatorhide;		/* IMIndicatorHide() */
	IMFunc	beep;			/* IMBeep() */
}	IMCallback;

/*-----------------------------------------------------------------------*
*	IMFEP
*-----------------------------------------------------------------------*/
typedef struct	_IMFepCommon	{
	unsigned int		version;		/* version # */
	IMLanguage		language;		/* language str */
	int			imerrno;		/* error # */
	struct	_IMFepCommon	*(*iminitialize)();	/* IMInitialize() */
	void			(*imclose)();		/* IMClose() */
	struct	_IMObjectCommon	*(*imcreate)();		/* IMCreate() */
	void			(*imdestroy)();		/* IMDestroy() */
	int			(*improcess)();		/* IMProcess() */
	int			(*improcessaux)();	/* IMProcessAux() */
	int			(*imioctl)();		/* IMIoctl() */
	int			(*imfilter)();		/* IMFilter() */
	int			(*imlookup)();		/* IMLookupString() */
}	IMFepRec, IMFepCommon, *IMFep;
 
/* current version is 1.1 */
#define	IMVersionNumber	((1 << 16) | 1)

/*-----------------------------------------------------------------------*
*	IMOBJ
*-----------------------------------------------------------------------*/
typedef struct  _IMObjectCommon  {
	IMFep		imfep;		/* pointer to IMFepRec */
	IMCallback	*cb;		/* pointer to CALLBACKs */
	unsigned int	mode;		/* Processing Mode */
	caddr_t		udata;		/* caller's data */
}	IMObjectRec, IMObjectCommon, *IMObject;
 
/* mode member is one of */
#define IMSuppressedMode	0
#define IMNormalMode		(IMSuppressedMode + 1)

/*-----------------------------------------------------------------------*
*	IMTextInfo
*-----------------------------------------------------------------------*/
typedef	struct	{
	unsigned int	maxwidth;	/* maximum width on display */
	unsigned int	cur;		/* cursor position on display */
	unsigned int	chgtop;		/* top of change in byte offset */
	unsigned int	chglen;		/* length of change in byte */
	IMSTRATT	text;		/* text string & attribute */
}	IMTextInfo;

/*-----------------------------------------------------------------------*
*	IMAuxInfo
*-----------------------------------------------------------------------*/
typedef	IMSTR	IMTitle;

typedef	struct	{
	unsigned int	maxwidth;	/* maximum width of text */
	unsigned int	nline;		/* nubmer of msg text line */
	unsigned int	cursor;		/* TRUE if it has cursor */
	unsigned int	cur_row;	/* cursor position in row */
	unsigned int	cur_col;	/* cursor position in column */
	IMSTRATT	*text;		/* ptr to array of IMSTRATT struct */
}	IMMessage;

typedef	unsigned int	IMButton;

typedef	struct	{
	unsigned int	selectable;	/* TRUE if selectable */
	IMSTR	text;			/* text of item */
}	IMItem;

typedef	struct	{
	unsigned int	maxwidth;		/* maximum width of item */
	unsigned int	item_row;		/* # of items in row */
	unsigned int	item_col;		/* # of items in column */
	IMItem	*item;			/* array of items */
}	IMPanel;

typedef	struct	{
	unsigned int	panel_row;	/* # of panels in row */
	unsigned int	panel_col;	/* # of panels in column */
	IMPanel		*panel;		/* ptr to panel array */
}	IMSelection;

typedef struct	{
	IMTitle		title;		/* title string */
	IMMessage	message;	/* message text */
	IMButton	button;		/* type of button */
	IMSelection	selection;	/* selections */
	unsigned int		hint;		/* hint of location */
	unsigned int		status;		/* shown or hidden or ...ing */
}	IMAuxInfo;
 
/* buttons member is one of */
#define IM_NONE			0
#define IM_OK			(1 << 0)
#define	IM_YES			(1 << 1)
#define IM_NO			(1 << 2)
#define IM_ENTER		(1 << 3)
#define IM_ABORT		(1 << 4)
#define IM_RETRY		(1 << 5)
#define IM_IGNORE		(1 << 6)
#define	IM_CANCEL		(1 << 7)
#define IM_HELP			(1 << 8)
#define	IM_SELECTED		(1 << 9)
#define	IM_ERROR		(1 << 10)
#define	IM_NEXT			(1 << 11)
#define	IM_PREV			(1 << 12)
#define IM_OKCANCEL		(IM_OK | IM_CANCEL)
#define IM_ENTERCANCEL		(IM_ENTER | IM_CANCEL)
#define IM_RETRYCANCEL		(IM_RETRY | IM_CANCEL)
#define IM_ABORTRETRYIGNORE	(IM_ABORT | IM_RETRY | IM_IGNORE)
#define IM_YESNO		(IM_YES | IM_NO)
#define IM_YESNOCANCEL		(IM_YES | IM_NO | IM_CANCEL)

/* hint member is one of */
#define	IM_AtTheEvent	0
#define	IM_UpperLeft	(IM_AtTheEvent + 1)
#define	IM_UpperRight	(IM_UpperLeft + 1)
#define	IM_LowerLeft	(IM_UpperRight + 1)
#define	IM_LowerRight	(IM_LowerLeft + 1)

/* status member is one of */
#define IMAuxShowing	0
#define IMAuxUpdated	(IMAuxShowing + 1)
#define IMAuxShown	(IMAuxUpdated + 1)
#define IMAuxHiding	(IMAuxShown + 1)
#define IMAuxHidden	(IMAuxHiding + 1)

/*-----------------------------------------------------------------------*
*	IMIndicatorInfo
*-----------------------------------------------------------------------*/
typedef struct  {
	unsigned int	size	:  4;		/* size of character */
	unsigned int	insert	:  4;		/* insert/replace */
	unsigned int	unique	: 24;
}	IMIndicatorInfo;

/* size member is one of */
#define IMHalfWidth		0
#define IMFullWidth		(IMHalfWidth + 1)

/* insert member is one of */
#define IMInsertMode		True
#define IMReplaceMode		False
 
/*-----------------------------------------------------------------------*
*	IM Query State
*-----------------------------------------------------------------------*/
typedef struct	{
	unsigned int	mode;		/* IMNormalMode/IMSuppressedMode */
	unsigned int	text;		/* TRUE/FALSE */
	unsigned int	aux;		/* TRUE/FALSE */
	unsigned int	indicator;	/* TRUE/FALSE */
	int	beep;			/* persent */
}	IMQueryState;
 
/*-----------------------------------------------------------------------*
*	IMQueryText
*-----------------------------------------------------------------------*/
typedef struct	{
	IMTextInfo	*textinfo;	/* RETURN */
}	IMQueryText;
 
/*-----------------------------------------------------------------------*
*	IMQueryAuxiliary
*-----------------------------------------------------------------------*/
typedef struct	{
	caddr_t		auxid;		/* id of the Auxiliary area */
	IMAuxInfo	*auxinfo;	/* RETURN */
}	IMQueryAuxiliary;
 
/*-----------------------------------------------------------------------*
*	IMQueryIndicator
*-----------------------------------------------------------------------*/
typedef struct	{
	IMIndicatorInfo		*indicatorinfo;		/* RETURN */
}	IMQueryIndicator;
 
/*-----------------------------------------------------------------------*
*	IM Query Indicator String
*-----------------------------------------------------------------------*/
typedef struct	{
	unsigned int	format;			/* format of indicator */
	IMSTR		indicator;		/* RETURN */
}	IMQueryIndicatorString;

/* format member is one of */
#define IMShortForm	0
#define IMLongForm	(IMShortForm + 1)

/*-----------------------------------------------------------------------*
*	Return Value of IMFilter()
*-----------------------------------------------------------------------*/
#define	IMInputNotUsed	False
#define	IMInputUsed	True

/*-----------------------------------------------------------------------*
*	Return Value of IMLookupString()
*-----------------------------------------------------------------------*/
#define	IMReturnNothing	0
#define	IMReturnString	1

/*-----------------------------------------------------------------------*
*	Return Value of IMProcess() and IMIoctl()
*-----------------------------------------------------------------------*/
#define IMNoError	0
#define	IMError		-1

/*-----------------------------------------------------------------------*
*	Return Value of IMProcess()
*-----------------------------------------------------------------------*/
#define	IMTextAndAuxiliaryOff	0
#define	IMTextOn		(IMTextAndAuxiliaryOff + 1)
#define	IMAuxiliaryOn		(IMTextOn + 1)
#define	IMTextAndAuxiliaryOn	(IMAuxiliaryOn + 1)

/*-----------------------------------------------------------------------*
*	Command of IMIoctl()
*-----------------------------------------------------------------------*/
#define	IM_Refresh		0
#define IM_GetString		(IM_Refresh + 1)
#define IM_Clear		(IM_GetString + 1)
#define IM_Reset		(IM_Clear + 1)
#define IM_ChangeLength		(IM_Reset + 1)
#define IM_QueryState		(IM_ChangeLength + 1)
#define IM_QueryText		(IM_QueryState + 1)
#define IM_QueryAuxiliary	(IM_QueryText + 1)
#define IM_QueryIndicator	(IM_QueryAuxiliary + 1)
#define IM_QueryIndicatorString	(IM_QueryIndicator + 1)
#define IM_ChangeMode		(IM_QueryIndicatorString + 1)
#define IM_GetKeymap		(IM_ChangeMode + 1)
#define IM_SupportSelection	(IM_GetKeymap + 1)
#define IM_QueryKeyboard	(IM_SupportSelection + 1)

/* To add Language Dependent Commands */

/* SBCS Input Method */
#define SIMIOC	('S' << 16)

/* Japanese Input Method */
#define JIMIOC	('J' << 16)

/* Chinese (Hanji) Input Method */
#define HIMIOC	('H' << 16)

/* Korean (Hangeul) Input Method */
#define KIMIOC	('K' << 16)

/*-----------------------------------------------------------------------*
*	Constant Definitions for IMTextCursor() Callback
*-----------------------------------------------------------------------*/
#define	IM_CursorUp	0
#define	IM_CursorDown	1

/*-----------------------------------------------------------------------*
*	IM Keymap Handling Functions
*-----------------------------------------------------------------------*/

typedef	struct _IMMapRec	*IMMap;

IMMap	IMInitializeKeymap();	/* Do search for Keymap file */
IMMap	IMUseKeymap();		/* Do not search for Keymap file */
void	IMFreeKeymap();		/* free resources allocated for IM Keymap */
char	*IMAIXMapping();	/* map keysym to string: do call IMED */
char	*IMSimpleMapping();	/* map keysym to string: do not call IMED */
int	IMRebindCode();		/* rebind */

/*-----------------------------------------------------------------------*
*	Memory allocation.   These are obsolete.
*-----------------------------------------------------------------------*/
#define	imfree(p)	free(p)
#define	immalloc(s)	malloc(s)
#define	imcalloc(n, e)	calloc(n, e)
#define	imrealloc(s, n)	realloc(s, n)

#endif	/* _im_h */
