Mercurial > kinput2.yaz
diff lib/InputConv.c @ 0:92745d501b9a
initial import from kinput2-v3.1
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Mon, 08 Mar 2010 04:44:30 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/InputConv.c Mon Mar 08 04:44:30 2010 +0900 @@ -0,0 +1,569 @@ +#ifndef lint +static char *rcsid = "$Id: InputConv.c,v 1.17 1999/01/13 08:42:00 ishisone Exp $"; +#endif +/* + * Copyright (c) 1990 Software Research Associates, Inc. + * + * 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 name of Software Research Associates not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Software Research + * Associates makes no representations about the suitability of this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + * + * Author: Makoto Ishisone, Software Research Associates, Inc., Japan + */ + +#include <X11/IntrinsicP.h> +#include <X11/StringDefs.h> +#include "InputConvP.h" + +static XtResource resources[] = { +#define offset(field) XtOffset(InputConvObject, inputConv.field) + {XtNselectionControl, XtCCallback, XtRCallback, sizeof(XtCallbackList), + offset(selectioncallback), XtRCallback, (XtPointer)NULL}, + {XtNtextChangeNotify, XtCCallback, XtRCallback, sizeof(XtCallbackList), + offset(textchangecallback), XtRCallback, (XtPointer)NULL}, + {XtNmodeChangeNotify, XtCCallback, XtRCallback, sizeof(XtCallbackList), + offset(modechangecallback), XtRCallback, (XtPointer)NULL}, + {XtNendNotify, XtCCallback, XtRCallback, sizeof(XtCallbackList), + offset(endcallback), XtRCallback, (XtPointer)NULL}, + {XtNfixNotify, XtCCallback, XtRCallback, sizeof(XtCallbackList), + offset(fixcallback), XtRCallback, (XtPointer)NULL}, + {XtNauxControl, XtCCallback, XtRCallback, sizeof(XtCallbackList), + offset(auxcallback), XtRCallback, (XtPointer)NULL}, + {XtNdisplayObjectClass, XtCClass, XtRPointer, sizeof(WidgetClass), + offset(displayObjClass), XtRImmediate, (XtPointer)NULL }, +#undef offset +}; + +static void ClassPartInitialize(); +static void Initialize(); +static void Destroy(); + +static int InputEvent(); +static ICString *GetMode(); +static int CursorPos(); +static int NumSegments(); +static ICString *GetSegment(); +static int CompareSegment(); +static ICString *GetItemList(); +static int SelectItem(); +static int ConvertedString(); +static int Clear(); +static ICString *GetAuxSegments(); +static int GetTriggerKeys(); +static int GetPreeditString(); +static int GetStatusString(); + +InputConvClassRec inputConvClassRec = { + { /* object fields */ + /* superclass */ (WidgetClass) &objectClassRec, + /* class_name */ "InputConv", + /* widget_size */ sizeof(InputConvRec), + /* class_initialize */ NULL, + /* class_part_initialize */ ClassPartInitialize, + /* class_inited */ FALSE, + /* initialize */ Initialize, + /* initialize_hook */ NULL, + /* obj1 */ NULL, + /* obj2 */ NULL, + /* obj3 */ 0, + /* resources */ resources, + /* num_resources */ XtNumber(resources), + /* xrm_class */ NULLQUARK, + /* obj4 */ FALSE, + /* obj5 */ FALSE, + /* obj6 */ FALSE, + /* obj7 */ FALSE, + /* destroy */ Destroy, + /* obj8 */ NULL, + /* obj9 */ NULL, + /* set_values */ NULL, + /* set_values_hook */ NULL, + /* obj10 */ NULL, + /* get_values_hook */ NULL, + /* obj11 */ NULL, + /* version */ XtVersion, + /* callback_private */ NULL, + /* obj12 */ NULL, + /* obj13 */ NULL, + /* obj14 */ NULL, + /* extension */ NULL, + }, + { /* inputConv fields */ + /* InputEvent */ InputEvent, + /* GetMode */ GetMode, + /* CursorPos */ CursorPos, + /* NumSegments */ NumSegments, + /* GetSegment */ GetSegment, + /* CompareSegment */ CompareSegment, + /* GetItemList */ GetItemList, + /* SelectItem */ SelectItem, + /* GetConvertedString */ ConvertedString, + /* ClearConversion */ Clear, + /* GetSegments */ GetAuxSegments, + /* SupportMultipleObjects */ False, + /* GetTriggerKeys */ GetTriggerKeys, + /* num_trigger_keys */ 0, + /* trigger_keys */ NULL, + /* GetPreeditString */ GetPreeditString, + /* GetStatusString */ GetStatusString, + /* NoMoreObjects */ False, + } +}; + +WidgetClass inputConvObjectClass = (WidgetClass)&inputConvClassRec; + +static void +ClassPartInitialize(cl) +WidgetClass cl; +{ + InputConvObjectClass class = (InputConvObjectClass)cl; + InputConvObjectClass super = (InputConvObjectClass)class->object_class.superclass; + + if (class->inputConv_class.InputEvent == XtInheritInputEvent) + class->inputConv_class.InputEvent = super->inputConv_class.InputEvent; + if (class->inputConv_class.GetMode == XtInheritGetMode) + class->inputConv_class.GetMode = super->inputConv_class.GetMode; + if (class->inputConv_class.CursorPos == XtInheritCursorPos) + class->inputConv_class.CursorPos = super->inputConv_class.CursorPos; + if (class->inputConv_class.NumSegments == XtInheritNumSegments) + class->inputConv_class.NumSegments = super->inputConv_class.NumSegments; + if (class->inputConv_class.GetSegment == XtInheritGetSegment) + class->inputConv_class.GetSegment = super->inputConv_class.GetSegment; + if (class->inputConv_class.CompareSegment == XtInheritCompareSegment) + class->inputConv_class.CompareSegment = super->inputConv_class.CompareSegment; + if (class->inputConv_class.GetItemList == XtInheritGetItemList) + class->inputConv_class.GetItemList = super->inputConv_class.GetItemList; + if (class->inputConv_class.SelectItem == XtInheritSelectItem) + class->inputConv_class.SelectItem = super->inputConv_class.SelectItem; + if (class->inputConv_class.GetConvertedString == XtInheritGetConvertedString) + class->inputConv_class.GetConvertedString = super->inputConv_class.GetConvertedString; + if (class->inputConv_class.ClearConversion == XtInheritClearConversion) + class->inputConv_class.ClearConversion = super->inputConv_class.ClearConversion; + if (class->inputConv_class.GetAuxSegments == XtInheritGetAuxSegments) + class->inputConv_class.GetAuxSegments = super->inputConv_class.GetAuxSegments; + if (class->inputConv_class.GetTriggerKeys == XtInheritGetTriggerKeys) + class->inputConv_class.GetTriggerKeys = super->inputConv_class.GetTriggerKeys; + if (class->inputConv_class.GetPreeditString == XtInheritGetPreeditString) + class->inputConv_class.GetPreeditString = super->inputConv_class.GetPreeditString; + if (class->inputConv_class.GetStatusString == XtInheritGetStatusString) + class->inputConv_class.GetStatusString = super->inputConv_class.GetStatusString; + + class->inputConv_class.NoMoreObjects = False; +} + +/* ARGSUSED */ +static void +Initialize(req, new, args, num_args) +Widget req; +Widget new; +ArgList args; +Cardinal *num_args; +{ + InputConvObjectClass class = (InputConvObjectClass)new->core.widget_class; + String params[1]; + Cardinal num_params; + + if (class->inputConv_class.NoMoreObjects) { + params[0] = XtClass(new)->core_class.class_name; + num_params = 1; + XtAppErrorMsg(XtWidgetToApplicationContext(new), + "creationError", "widget", "WidgetError", + "Class %s cannot have multiple instances", + params, &num_params); + } + if (!class->inputConv_class.SupportMultipleObjects) { + class->inputConv_class.NoMoreObjects = True; + } +} + +static void +Destroy(w) +Widget w; +{ + InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class; + + class->inputConv_class.NoMoreObjects = False; +} + +/* ARGSUSED */ +static int +InputEvent(w, event) +Widget w; +XEvent *event; +{ + XtAppError(XtWidgetToApplicationContext(w), + "InputConv Object: InputEvent function isn't defined."); + return -1; /* for lint */ +} + +/* ARGSUSED */ +static ICString * +GetMode(w) +Widget w; +{ + XtAppError(XtWidgetToApplicationContext(w), + "InputConv Object: GetMode function isn't defined."); + return NULL; /* for lint */ +} + +/* ARGSUSED */ +static int +CursorPos(w, segidx, offset) +Widget w; +Cardinal *segidx; +Cardinal *offset; +{ + XtAppError(XtWidgetToApplicationContext(w), + "InputConv Object: CursorPos function isn't defined."); + return 0; /* for lint */ +} + +/* ARGSUSED */ +static int +NumSegments(w) +Widget w; +{ + XtAppError(XtWidgetToApplicationContext(w), + "InputConv Object: NumSegments function isn't defined."); + return 0; /* for lint */ +} + +/* ARGSUSED */ +static ICString * +GetSegment(w, n) +Widget w; +Cardinal n; +{ + XtAppError(XtWidgetToApplicationContext(w), + "InputConv Object: GetSegment function isn't defined."); + return NULL; /* for lint */ +} + +/* ARGSUSED */ +static int +CompareSegment(w, seg1, seg2, n) +Widget w; +ICString *seg1; +ICString *seg2; +Cardinal *n; +{ + XtAppError(XtWidgetToApplicationContext(w), + "InputConv Object: CompareSegment function isn't defined."); + return 0; /* for lint */ +} + +/* ARGSUSED */ +static ICString * +GetItemList(w, n) +Widget w; +Cardinal *n; +{ + XtAppError(XtWidgetToApplicationContext(w), + "InputConv Object: GetItem function isn't defined."); + return NULL; /* for lint */ +} + +/* ARGSUSED */ +static int +SelectItem(w, n) +Widget w; +int n; +{ + XtAppError(XtWidgetToApplicationContext(w), + "InputConv Object: SelectItem function isn't defined."); + return -1; /* for lint */ +} + +/* ARGSUSED */ +static int +ConvertedString(w, encoding, format, length, string) +Widget w; +Atom *encoding; +int *format; +int *length; +XtPointer *string; +{ + XtAppError(XtWidgetToApplicationContext(w), + "InputConv Object: GetConvertedString function isn't defined."); + return -1; /* for lint */ +} + +/* ARGSUSED */ +static int +Clear(w) +Widget w; +{ + XtAppError(XtWidgetToApplicationContext(w), + "InputConv Object: ClearConversion function isn't defined."); + return -1; /* for lint */ +} + +/* ARGSUSED */ +static ICString * +GetAuxSegments(w, n, ns, nc) +Widget w; +Cardinal *n, *ns, *nc; +{ + XtAppError(XtWidgetToApplicationContext(w), + "InputConv Object: GetAuxSegments function isn't defined."); + return NULL; /* for lint */ +} + + +/* ARGSUSED */ +static int +GetTriggerKeys(w, keys_return) +Widget w; +ICTriggerKey **keys_return; +{ + return 0; +} + +/* ARGSUSED */ +static int +GetPreeditString(w, segn, offset, encoding, format, length, string) +Widget w; +int segn; +int offset; +Atom *encoding; +int *format; +int *length; +XtPointer *string; +{ + XtAppError(XtWidgetToApplicationContext(w), + "InputConv Object: GetPreeditString function isn't defined."); + return 0; /* for lint */ +} + +static int +GetStatusString(w, encoding, format, length, string, nchars) +Widget w; +Atom *encoding; +int *format; +int *length; +XtPointer *string; +int *nchars; +{ + XtAppError(XtWidgetToApplicationContext(w), + "InputConv Object: GetStatusString function isn't defined."); + return 0; /* for lint */ +} + + +/* + * public functions + */ + +Boolean +ICSupportMultipleObjects(cl) +WidgetClass cl; +{ + InputConvObjectClass class = (InputConvObjectClass)cl; + + /* check if specified class is a subclass of InputConvObjectClass */ + while (cl != NULL) { + if (cl == inputConvObjectClass) { + /* OK */ + XtInitializeWidgetClass(cl); + return class->inputConv_class.SupportMultipleObjects; + } + cl = cl->core_class.superclass; + } + return True; /* for almost all of other classes, it's True */ +} + +int +ICInputEvent(w, event) +Widget w; +XEvent *event; +{ + InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class; + + XtCheckSubclass(w, inputConvObjectClass, "ICInputEvent()"); + return (*class->inputConv_class.InputEvent)(w, event); +} + +ICString * +ICGetMode(w) +Widget w; +{ + InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class; + + XtCheckSubclass(w, inputConvObjectClass, "ICGetMode()"); + return (*class->inputConv_class.GetMode)(w); +} + +int +ICCursorPos(w, segidx, offset) +Widget w; +Cardinal *segidx; +Cardinal *offset; +{ + InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class; + + XtCheckSubclass(w, inputConvObjectClass, "ICCursorPos()"); + return (*class->inputConv_class.CursorPos)(w, segidx, offset); +} + +int +ICNumSegments(w) +Widget w; +{ + InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class; + + XtCheckSubclass(w, inputConvObjectClass, "ICNumSegments()"); + return (*class->inputConv_class.NumSegments)(w); +} + +ICString * +ICGetSegment(w, n) +Widget w; +Cardinal n; +{ + InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class; + + XtCheckSubclass(w, inputConvObjectClass, "ICGetSegment()"); + return (*class->inputConv_class.GetSegment)(w, n); +} + +int +ICCompareSegment(w, seg1, seg2, n) +Widget w; +ICString *seg1; +ICString *seg2; +Cardinal *n; +{ + InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class; + + XtCheckSubclass(w, inputConvObjectClass, "ICCompareSegment()"); + return (*class->inputConv_class.CompareSegment)(w, seg1, seg2, n); +} + +ICString * +ICGetItemList(w, n) +Widget w; +Cardinal *n; +{ + InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class; + + XtCheckSubclass(w, inputConvObjectClass, "ICGetItemList()"); + return (*class->inputConv_class.GetItemList)(w, n); +} + +int +ICSelectItem(w, n) +Widget w; +int n; +{ + InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class; + + XtCheckSubclass(w, inputConvObjectClass, "ICSelectItem()"); + return (*class->inputConv_class.SelectItem)(w, n); +} + +int +ICGetConvertedString(w, encoding, format, length, string) +Widget w; +Atom *encoding; +int *format; +int *length; +XtPointer *string; +{ + InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class; + + XtCheckSubclass(w, inputConvObjectClass, "ICGetConvertedString()"); + return (*class->inputConv_class.GetConvertedString)(w, encoding, format, + length, string); +} + +int +ICClearConversion(w) +Widget w; +{ + InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class; + + XtCheckSubclass(w, inputConvObjectClass, "ICClearConversion()"); + return (*class->inputConv_class.ClearConversion)(w); +} + +ICString * +ICGetAuxSegments(w, n, ns, nc) +Widget w; +Cardinal *n, *ns, *nc; +{ + InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class; + + XtCheckSubclass(w, inputConvObjectClass, "ICGetAuxSegments()"); + return (*class->inputConv_class.GetAuxSegments)(w, n, ns, nc); +} + +int +ICGetPreeditString(w, segn, offset, encoding, format, length, string) +Widget w; +int segn; +int offset; +Atom *encoding; +int *format; +int *length; +XtPointer *string; +{ + InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class; + + XtCheckSubclass(w, inputConvObjectClass, "ICGetPreeditString()"); + return (*class->inputConv_class.GetPreeditString)(w, segn, offset, encoding, format, length, string); +} + +int +ICGetStatusString(w, encoding, format, length, string, nchars) +Widget w; +Atom *encoding; +int *format; +int *length; +XtPointer *string; +int *nchars; +{ + InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class; + + XtCheckSubclass(w, inputConvObjectClass, "ICGetStatusString()"); + return (*class->inputConv_class.GetStatusString)(w, encoding, format, length, string, nchars); +} + +/* + + Though the following procedure should be done during initialization + of object class, I will do the following separately from the + initialization procedure in order to prevent duplicate + initialization of input object, that is, to prevent making + connection twice to input conversion server. + + */ + +int +ICRegisterTriggerKeys(w) +Widget w; +{ + InputConvObjectClass class = (InputConvObjectClass)w->core.widget_class; + + XtCheckSubclass(w, inputConvObjectClass, "ICRegisterTriggerKeys()"); + return class->inputConv_class.num_trigger_keys = + (*class->inputConv_class.GetTriggerKeys) + (w, &class->inputConv_class.trigger_keys); +} + +int +ICGetTriggerKeysOfInputObjectClass(cl, keys_return) +WidgetClass cl; +ICTriggerKey **keys_return; +{ + InputConvObjectClass class = (InputConvObjectClass)cl; + + *keys_return = class->inputConv_class.trigger_keys; + return class->inputConv_class.num_trigger_keys; +}