|
Packit Service |
1d8f1c |
/******************************************************************
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
Copyright 1994, 1995 by Sun Microsystems, Inc.
|
|
Packit Service |
1d8f1c |
Copyright 1993, 1994 by Hewlett-Packard Company
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
Permission to use, copy, modify, distribute, and sell this software
|
|
Packit Service |
1d8f1c |
and its documentation for any purpose is hereby granted without fee,
|
|
Packit Service |
1d8f1c |
provided that the above copyright notice appear in all copies and
|
|
Packit Service |
1d8f1c |
that both that copyright notice and this permission notice appear
|
|
Packit Service |
1d8f1c |
in supporting documentation, and that the name of Sun Microsystems, Inc.
|
|
Packit Service |
1d8f1c |
and Hewlett-Packard not be used in advertising or publicity pertaining to
|
|
Packit Service |
1d8f1c |
distribution of the software without specific, written prior permission.
|
|
Packit Service |
1d8f1c |
Sun Microsystems, Inc. and Hewlett-Packard make no representations about
|
|
Packit Service |
1d8f1c |
the suitability of this software for any purpose. It is provided "as is"
|
|
Packit Service |
1d8f1c |
without express or implied warranty.
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL
|
|
Packit Service |
1d8f1c |
WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED
|
|
Packit Service |
1d8f1c |
WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
|
|
Packit Service |
1d8f1c |
SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY
|
|
Packit Service |
1d8f1c |
SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
|
|
Packit Service |
1d8f1c |
RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
|
|
Packit Service |
1d8f1c |
CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
|
|
Packit Service |
1d8f1c |
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc.
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
This version tidied and debugged by Steve Underwood May 1999
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
******************************************************************/
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
#include <X11/Xlib.h>
|
|
Packit Service |
1d8f1c |
#include <stdlib.h>
|
|
Packit Service |
1d8f1c |
#include <string.h>
|
|
Packit Service |
1d8f1c |
#include "IMdkit.h"
|
|
Packit Service |
1d8f1c |
#include <stdarg.h>
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
#define Va_start(a,b) va_start(a,b)
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
static void _IMCountVaList(va_list var, int *total_count)
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
char *attr;
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
*total_count = 0;
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
for (attr = va_arg (var, char*); attr; attr = va_arg (var, char*))
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
(void)va_arg (var, XIMArg *);
|
|
Packit Service |
1d8f1c |
++(*total_count);
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
/*endfor*/
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
static void _IMVaToNestedList(va_list var, int max_count, XIMArg **args_return)
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
XIMArg *args;
|
|
Packit Service |
1d8f1c |
char *attr;
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
if (max_count <= 0)
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
*args_return = (XIMArg *) NULL;
|
|
Packit Service |
1d8f1c |
return;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
/*endif*/
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
args = (XIMArg *) malloc ((unsigned) (max_count + 1)*sizeof (XIMArg));
|
|
Packit Service |
1d8f1c |
*args_return = args;
|
|
Packit Service |
1d8f1c |
if (!args)
|
|
Packit Service |
1d8f1c |
return;
|
|
Packit Service |
1d8f1c |
/*endif*/
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
for (attr = va_arg (var, char*); attr; attr = va_arg (var, char *))
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
args->name = attr;
|
|
Packit Service |
1d8f1c |
args->value = va_arg (var, XPointer);
|
|
Packit Service |
1d8f1c |
args++;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
/*endfor*/
|
|
Packit Service |
1d8f1c |
args->name = (char*)NULL;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
static char *_FindModifiers (XIMArg *args)
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
char *modifiers;
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
while (args && args->name)
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
if (strcmp (args->name, IMModifiers) == 0)
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
modifiers = args->value;
|
|
Packit Service |
1d8f1c |
return modifiers;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
else
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
args++;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
/*endif*/
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
/*endwhile*/
|
|
Packit Service |
1d8f1c |
return NULL;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
XIMS _GetIMS (char *modifiers)
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
XIMS ims;
|
|
Packit Service |
1d8f1c |
extern IMMethodsRec Xi18n_im_methods;
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
if ((ims = (XIMS) malloc (sizeof (XIMProtocolRec))) == (XIMS) NULL)
|
|
Packit Service |
1d8f1c |
return ((XIMS) NULL);
|
|
Packit Service |
1d8f1c |
/*endif*/
|
|
Packit Service |
1d8f1c |
memset ((void *) ims, 0, sizeof (XIMProtocolRec));
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
if (modifiers == NULL
|
|
Packit Service |
1d8f1c |
||
|
|
Packit Service |
1d8f1c |
modifiers[0] == '\0'
|
|
Packit Service |
1d8f1c |
||
|
|
Packit Service |
1d8f1c |
strcmp (modifiers, "Xi18n") == 0)
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
ims->methods = &Xi18n_im_methods;
|
|
Packit Service |
1d8f1c |
return ims;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
/*endif*/
|
|
Packit Service |
1d8f1c |
XFree (ims);
|
|
Packit Service |
1d8f1c |
return (XIMS) NULL;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
XIMS IMOpenIM (Display *display, ...)
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
va_list var;
|
|
Packit Service |
1d8f1c |
int total_count;
|
|
Packit Service |
1d8f1c |
XIMArg *args;
|
|
Packit Service |
1d8f1c |
XIMS ims;
|
|
Packit Service |
1d8f1c |
char *modifiers;
|
|
Packit Service |
1d8f1c |
Status ret;
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
Va_start (var, display);
|
|
Packit Service |
1d8f1c |
_IMCountVaList (var, &total_count);
|
|
Packit Service |
1d8f1c |
va_end (var);
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
Va_start (var, display);
|
|
Packit Service |
1d8f1c |
_IMVaToNestedList (var, total_count, &args);
|
|
Packit Service |
1d8f1c |
va_end (var);
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
modifiers = _FindModifiers (args);
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
ims = _GetIMS (modifiers);
|
|
Packit Service |
1d8f1c |
if (ims == (XIMS) NULL) {
|
|
Packit Service |
1d8f1c |
XFree (args);
|
|
Packit Service |
1d8f1c |
return (XIMS) NULL;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
/*endif*/
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
ims->core.display = display;
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
ims->protocol = (*ims->methods->setup) (display, args);
|
|
Packit Service |
1d8f1c |
XFree (args);
|
|
Packit Service |
1d8f1c |
if (ims->protocol == (void *) NULL)
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
XFree (ims);
|
|
Packit Service |
1d8f1c |
return (XIMS) NULL;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
/*endif*/
|
|
Packit Service |
1d8f1c |
ret = (ims->methods->openIM) (ims);
|
|
Packit Service |
1d8f1c |
if (ret == False)
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
XFree (ims);
|
|
Packit Service |
1d8f1c |
return (XIMS) NULL;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
/*endif*/
|
|
Packit Service |
1d8f1c |
return (XIMS) ims;
|
|
Packit Service |
1d8f1c |
}
|
|
Packit Service |
1d8f1c |
|
|
Packit Service |
1d8f1c |
Status IMCloseIM (XIMS ims)
|
|
Packit Service |
1d8f1c |
{
|
|
Packit Service |
1d8f1c |
(ims->methods->closeIM) (ims);
|
|
Packit Service |
1d8f1c |
XFree (ims);
|
|
Packit Service |
1d8f1c |
return True;
|
|
Packit Service |
1d8f1c |
}
|