summaryrefslogtreecommitdiff
path: root/IMdkit/IMConn.c
diff options
context:
space:
mode:
Diffstat (limited to 'IMdkit/IMConn.c')
-rw-r--r--IMdkit/IMConn.c176
1 files changed, 176 insertions, 0 deletions
diff --git a/IMdkit/IMConn.c b/IMdkit/IMConn.c
new file mode 100644
index 0000000..6d36589
--- /dev/null
+++ b/IMdkit/IMConn.c
@@ -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 <X11/Xlib.h>
+#include <stdlib.h>
+#include <string.h>
+#include "IMdkit.h"
+#include <stdarg.h>
+
+#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;
+}