HP OpenVMS Systems Documentation |
前へ | 目次 |
このコールバック関数は,XIC 属性 XNHotKeyCb の値を設定するために呼び出されます。
int setHotKeyCb (w, client_data, reason, value, attribute_flag)
Widget w; Opaque *client_data; int reason; XIMHotKeyTriggers *value; DIMsAttributesType attribute_flag;
このコールバックが正常終了した場合,IMSSL に 1 が返されます。このコールバックが異常終了した場合,IMSSL に 0 が返されます。
setHotKeyCb は,リソース DIMsNsetHotKeyCb で指定されるコールバック関数です。DIMsNsetHotKeyCb については, 第 1.4.47 項 を参照してください。
w 入力コンテキストに対応する DIMs ウィジェットを指定します。 client_data DIMsNclientdata リソースで指定されるデータへのポインタを指定します。 DIMsNclientdata については, 第 1.4.54 項 を参照してください。 reason コールバックの理由を指定します。 DimCR_CreateIC または DimCR_SetICValues のいずれかを指定します。 DimCR_CreateIC はクライアントの XCreateIC() によってコールバックが開始されることを意味し, DimCR_SetICValues はクライアントの XSetICValues() によってコールバックが開始されることを意味します。 value XIMHotKeyTriggers 型の属性値へのポインタを指定します。 attribute_flag PreeditAttribute または StatusAttribute のどちらに属するか,XIC 属性の型を指定します。 DIMsAttributesType のデータ型については, setExtICValuesCb の項を参照してください。
このコールバック関数は,XIC 属性 XNHotKeyCb の値を得るために呼び出されます。
int getHotKeyCb (w, client_data, value, attribute_flag)
Widget w; Opaque *client_data; XIMHotKeyTriggers **value; (呼び出し側ヘ返す) DIMsAttributesType attribute_flag;
このコールバックが正常終了した場合,IMSSL に 1 が返されます。このコールバックが異常終了した場合,IMSSL に 0 が返されます。
getHotKeyCb は,リソース DIMsNgetHotKeyCb で指定されるコールバック関数です。DIMsNgetHotKeyCb については, 第 1.4.48 項 を参照してください。
w 入力コンテキストに対応する DIMs ウィジェットを指定します。 client_data DIMsNclientdata リソースで指定されるデータへのポインタを指定します。 DIMsNclientdata については, 第 1.4.54 項 を参照してください。 value 呼び出し側に,XIMHotKeyTriggers 型の属性値へのポインタを返します。IMS プログラマは,このデータにメモリを割り当てる必要があります。このメモリ割り当ては IMSSL によって後で解放されます。 attribute_flag PreeditAttribute または StatusAttribute のどちらに属するか,XIC 属性の型を指定します。 DIMsAttributesType のデータ型については, setExtICValuesCb の項を参照してください。
このコールバック関数は,XIC 属性 XNHotKeyStateCb の値を設定するために呼び出されます。
int setHotKeyStateCb (w, client_data, reason, value, attribute_flag)
Widget w; Opaque *client_data; int reason; XIMHotKeyState **value; (呼び出し側ヘ返す) DIMsAttributesType attribute_flag;
このコールバックが正常終了した場合,IMSSL に 1 が返されます。このコールバックが異常終了した場合,IMSSL に 0 が返されます。
setHotKeyStateCb は,リソース DIMsNsetHotKeyStateCb で指定されるコールバック関数です。DIMsNsetHotKeyStateCb については, 第 1.4.49 項 を参照してください。
w 入力コンテキストに対応する DIMs ウィジェットを指定します。 client_data DIMsNclientdata リソースで指定されるデータへのポインタを指定します。 DIMsNclientdata については, 第 1.4.54 項 を参照してください。 reason コールバックの理由を指定します。 DimCR_CreateIC または DimCR_SetICValues のいずれかを指定します。 DimCR_CreateIC はクライアントの XCreateIC() によってコールバックが開始されることを意味し, DimCR_SetICValues はクライアントの XSetICValues() によってコールバックが開始されることを意味します。 value XIMHotKeyState 型の属性値へのポインタを指定します。 attribute_flag PreeditAttribute または StatusAttribute のどちらに属するか,XIC 属性の型を指定します。 DIMsAttributesType のデータ型については, setExtICValuesCb の項を参照してください。
このコールバック関数は,XIC 属性 XNHotKeyStateCb の値を得るために呼び出されます。
int getHotKeyStateCb (w, client_data, value, attribute_flag)
Widget w; Opaque *client_data; XIMHotKeyState **value; (呼び出し側ヘ返す) DIMsAttributesType attribute_flag;
このコールバックが正常終了した場合,IMSSL に 1 が返されます。このコールバックが異常終了した場合,IMSSL に 0 が返されます。
getHotKeyStateCb は,リソース DIMsNgetHotKeyStateCb で指定されるコールバック関数です。DIMsNgetHotKeyStateCb については, 第 1.4.50 項 を参照してください。
w 入力コンテキストに対応する DIMs ウィジェットを指定します。 client_data DIMsNclientdata リソースで指定されるデータへのポインタを指定します。 DIMsNclientdata については, 第 1.4.54 項 を参照してください。 value 呼び出し側に,XIMHotKeyState 型の属性値へのポインタを返します。IMS プログラマは,このデータにメモリを割り当てる必要があります。このメモリ割り当ては IMSSL によって後で解放されます。 attribute_flag PreeditAttribute または StatusAttribute のどちらに属するか,XIC 属性の型を指定します。 DIMsAttributesType のデータ型については, setExtICValuesCb の項を参照してください。
このコールバック関数は,XIC 属性 XNPreeditStateCb の値を設定するために呼び出されます。
int setPreeditStateCb (w, client_data, reason, value, attribute_flag)
Widget w; Opaque *client_data; int reason; XIMPreeditState *value; DIMsAttributesType attribute_flag;
このコールバックが正常終了した場合,IMSSL に 1 が返されます。このコールバックが異常終了した場合,IMSSL に 0 が返されます。
setPreeditStateCb は,リソース DIMsNsetPreeditStateCb で指定されるコールバック関数です。DIMsNsetPreeditStateCb については, 第 1.4.51 項 を参照してください。
w 入力コンテキストに対応する DIMs ウィジェットを指定します。 client_data DIMsNclientdata リソースで指定されるデータへのポインタを指定します。 DIMsNclientdata については, 第 1.4.54 項 を参照してください。 reason コールバックの理由を指定します。 DimCR_CreateIC または DimCR_SetICValues のいずれかを指定します。 DimCR_CreateIC はクライアントの XCreateIC() によってコールバックが開始されることを意味し, DimCR_SetICValues はクライアントの XSetICValues() によってコールバックが開始されることを意味します。 value XIMPreeditState 型の属性値へのポインタを指定します。 attribute_flag PreeditAttribute または StatusAttribute のどちらに属するか,XIC 属性の型を指定します。 DIMsAttributesType のデータ型については, setExtICValuesCb の項を参照してください。
このコールバック関数は,XIC 属性 XNPreeditStateCb の値を得るために呼び出されます。
int getPreeditStateCb (w, client_data, value, attribute_flag)
Widget w; Opaque *client_data; XIMPreeditState **value; (呼び出し側ヘ返す) DIMsAttributesType attribute_flag;
このコールバックが正常終了した場合,IMSSL に 1 が返されます。このコールバックが異常終了した場合,IMSSL に 0 が返されます。
getPreeditStateCb は,リソース DIMsNgetPreeditStateCb で指定されるコールバック関数です。DIMsNgetPreeditStateCb については, 第 1.4.52 項 を参照してください。
w 入力コンテキストに対応する DIMs ウィジェットを指定します。 client_data DIMsNclientdata リソースで指定されるデータへのポインタを指定します。 DIMsNclientdata については, 第 1.4.54 項 を参照してください。 value 呼び出し側に,XIMPreeditState 型の属性値へのポインタを返します。IMS プログラマは,このデータにメモリを割り当てる必要があります。このメモリ割り当ては IMSSL によって後で解放されます。 attribute_flag PreeditAttribute または StatusAttribute のどちらに属するか,XIC 属性の型を指定します。 DIMsAttributesType のデータ型については, setExtICValuesCb の項を参照してください。
このコールバック関数は,XIC 属性 XNPreeditStateCallbackCb の値を設定するために呼び出されます。
int setPreeditStateCallbackCb (w, client_data, reason, attribute_flag)
Widget w; Opaque *client_data; int reason; DIMsAttributesType attribute_flag;
このコールバックが正常終了した場合,IMSSL に 1 が返されます。このコールバックが異常終了した場合,IMSSL に 0 が返されます。
setPreeditStateCallbackCb は,リソース DIMsNsetPreeditStateCallbackCb で指定されるコールバック関数です。 DIMsNsetPreeditStateCallbackCb については, 第 1.4.53 項 を参照してください。
w 入力コンテキストに対応する DIMs ウィジェットを指定します。 client_data DIMsNclientdata リソースで指定されるデータへのポインタを指定します。 DIMsNclientdata については, 第 1.4.54 項 を参照してください。 reason コールバックの理由を指定します。 DimCR_CreateIC または DimCR_SetICValues のいずれかを指定します。 DimCR_CreateIC はクライアントの XCreateIC() によってコールバックが開始されることを意味し, DimCR_SetICValues はクライアントの XSetICValues() によってコールバックが開始されることを意味します。 attribute_flag PreeditAttribute または StatusAttribute のどちらに属するか,XIC 属性の型を指定します。 DIMsAttributesType のデータ型については, setExtICValuesCb の項を参照してください。
1.6 サンプル・ファイル
入力サーバに関するサンプル・ファイルが DECW$EXAMPLES:IMS_EXAMPLE.C に用意されています。このサンプル・ファイルを参照することにより, API の使用方法をより明確に理解することができるでしょう。
1.6.1 ビルド・プロシージャ
ビルド用のコマンド・プロシージャとしてDECW$EXAMPLES:IMS_EXAMPLE.COM が用意されています。これにより,実行可能な入力サーバをビルドできます。 IMS の開発に必要なすべての API およびデータ構造体を含むヘッダ・ファイルは, DECW$INCLUDE:DIMSDEF.H にあります。IMSSLは共有ライブラリ SYS$SHARE:DECW$DIMSLIBSHR.EXE として提供されます。
1.6.2 ソース・プログラム
***************************************************************************** * * IMS_example.c * * This is an example of how to write an Input Method Server for X11R6. * The only protocol being used in here is Xi18n and the transport mechanism * is X. * * In this example, there are only 26 composed characters, which are * formed by 2 consecutive key inputs which are equal. These key inputs * should be from a-z, case insensitive. The lookup string * will be found from an array, which is some kind of small-scale dictionary. * * You should load Iso-latin 1 keymap files in order to work properly for * this example. * * You can start this example using four of the languages: * Korean, Traditional Chinese, Simplied Chinese and Japanese * * To start this IMServer, set the xnllanguage resource properly, for example, * if you want to input Korean text, you should set the session language to * Korean, or simply start as * $IMS_example -xnllanguage "ko_KR.deckorean" * * To connect a client to this IMS, simply start up this IMS as a background * job, then start the client with the correct language setting and XMODIFIERS * environment. There are 4 modifiers that can be set according to locales : * "zh_tw_exam", "zh_cn_exam", "ko_kr_exam", ja_jp_exam". For example, * * $define XMODIFIERS "@im=ko_kr_exam" * $mc decw$cardfiler -xnllanguage "ko_KR.deckorean" */ #include #include #ifdef VMS #include "DIMsDef.h" /* #include */ #else #include #endif static char my_dictionary[26][2] = {0xa1, 0xa1, 0xa1, 0xa2, 0xa1, 0xa3, 0xa1, 0xa4, 0xa1, 0xa5, 0xa1, 0xa6, 0xa1, 0xa7, 0xa1, 0xa8, 0xa1, 0xa9, 0xa1, 0xaa, 0xa1, 0xab, 0xa1, 0xac, 0xa1, 0xad, 0xa1, 0xae, 0xa1, 0xaf, 0xa1, 0xb1, 0xa1, 0xb2, 0xa1, 0xb3, 0xa1, 0xb4, 0xa1, 0xb5, 0xa1, 0xb6, 0xa1, 0xb7, 0xa1, 0xb8, 0xa1, 0xb9, 0xa1, 0xba, 0xa1, 0xbb}; typedef struct { char data[1]; int num_char; } MyDataRec, *MyData; /* This is the input context specific data */ static int CreateICCallback(w, client_data, widget_data) Widget w; Opaque *client_data; Opaque **widget_data; { MyData my_data = (MyData)XtMalloc(sizeof(MyDataRec)); if (!my_data) return 0; /* fail */ my_data->num_char = 0; *widget_data = (Opaque *)my_data; return 1; /* success */ } static int DestroyICCallback(w, client_data, widget_data) Widget w; Opaque *client_data; { MyData my_data = (MyData)DIMsUserData(w); if (my_data) XtFree((char *)my_data); return 1; /* success */ } static int GetFilterEventsCallback(w, client_data, mask) Widget w; Opaque *client_data; unsigned long **mask; { *mask = (unsigned long *) XtMalloc(sizeof(unsigned long)); /* Since this IMS supports root-window style only, so just KeyPress events are necessary */ **mask = (unsigned long)(KeyPressMask); return 1; } static int ProcessEventCallback(w, client_data, event, send_back) Widget w; Opaque *client_data; XEvent *event; Boolean *send_back; { MyData my_data = (MyData)DIMsUserData(w); Display *dpy = XtDisplay(w); *send_back = True; switch (event->type) { case KeyPress : { KeyCode keycode = event->xkey.keycode; KeySym keysym; char second_char; XTextProperty text_property; char *text_list[1]; char text[3]; keysym = XKeycodeToKeysym( dpy, keycode, 0 ); if ((keysym >= XK_A && keysym <= XK_Z) || (keysym >= XK_a && keysym <=XK_z)) { if (my_data->num_char) { if (keysym >= XK_a) second_char = keysym - XK_a; else second_char = keysym - XK_A; if (second_char == my_data->data[0]) { /* two consecutive key are equal, send commit string */ text[0] = my_dictionary[second_char][0]; text[1] = my_dictionary[second_char][1]; text[2] = '\0'; text_list[0] = text; XmbTextListToTextProperty(dpy, text_list, 1, XCompoundTextStyle, &text_property); DIMsCommit(w, (char *)text_property.value, strlen((char *)text_property.value)+1); XtFree((char *)text_property.value); *send_back = False; /* the key is used by IMS, no need to return to client */ } my_data->num_char = 0; /* reset to 0*/ } else { my_data->num_char = 1; if (keysym >= XK_a) my_data->data[0] = keysym - XK_a; else my_data->data[0] = keysym - XK_A; *send_back = False; } } break; } default : break; } return 1; } IgnorXErrors(dpy, event) Display *dpy; XErrorEvent *event; { return 0; } main(argc, argv) int argc; char **argv; { Widget toplevel; XtAppContext app_context; DIMsClassCtx ctx; char *zh_tw_server_strings[] = {"_XIM_zh_TW@zh_tw_exam"}; char *zh_cn_server_strings[] = {"_XIM_zh_CN@zh_cn_exam"}; char *ko_kr_server_strings[] = {"_XIM_ko_KR@ko_kr_exam"}; char *ja_jp_server_strings[] = {"_XIM_ja_JP@ja_jp_exam"}; XIMStyle support_styles[1] = {XIMPreeditNothing | XIMStatusNothing}; DIMsLocaleInfoRec locale; DIMsStringListRec server_names; DIMsSupportStylesRec im_styles; Cardinal n; Arg al[40]; DIMsVersionRec im_version; XtSetLanguageProc(NULL, NULL, NULL); toplevel = XtAppInitialize(&app_context, "example", NULL, 0, &argc, argv, NULL, NULL, 0); /* set up DIMs Class */ /* This example targets to work for 4 locales: zh_TW, ja_JP, zh_CN, ko_KR. Therefore many DIMs class contexts are created */ /* create contexts for locales zh_TW, ja_JP, zh_CN, ko_KR */ locale.language = "zh_TW"; locale.num_support_codesets = 0; locale.support_codesets = NULL; server_names.num_of_strings = 1; server_names.string_names = zh_tw_server_strings; im_styles.num_support_styles = 1; im_styles.support_styles = support_styles; n = 0; XtSetArg( al[n], DIMsNlocale, &locale);n++; XtSetArg( al[n], DIMsNserverName, &server_names);n++; /* use Xi18n protocol */ im_version.highest_major_version = 3; im_version.highest_minor_version = 0; im_version.lowest_major_version = 3; im_version.lowest_minor_version = 0; XtSetArg( al[n], DIMsNversion, &im_version);n++; XtSetArg( al[n], DIMsNsupportStyles, &im_styles);n++; XtSetArg( al[n], DIMsNcreateICCb, CreateICCallback);n++; XtSetArg( al[n], DIMsNdestroyICCb, DestroyICCallback);n++; XtSetArg( al[n], DIMsNprocessEventCb, ProcessEventCallback);n++; XtSetArg( al[n], DIMsNgetFilterEventsCb, GetFilterEventsCallback);n++; XtSetArg( al[n], DIMsNtransport, "X/");n++; ctx = DIMsClassCtxCreate(NULL, "zh_tw_xi18n_exam", al, n); locale.language = "zh_CN"; server_names.string_names = zh_cn_server_strings; XtSetArg( al[0], DIMsNlocale, &locale); XtSetArg( al[1], DIMsNserverName, &server_names); ctx = DIMsClassCtxCreate(ctx, "zh_cn_xi18n_exam", al, n); locale.language = "ko_KR"; server_names.string_names = ko_kr_server_strings; XtSetArg( al[0], DIMsNlocale, &locale); XtSetArg( al[1], DIMsNserverName, &server_names); ctx = DIMsClassCtxCreate(ctx, "ko_kr_xi18n_exam", al, n); locale.language = "ja_JP"; server_names.string_names = ja_jp_server_strings; XtSetArg( al[0], DIMsNlocale, &locale); XtSetArg( al[1], DIMsNserverName, &server_names); ctx = DIMsClassCtxCreate(ctx, "ja_jp_xi18n_exam", al, n); XSetErrorHandler(IgnorXErrors); /* Initialize IMSSL */ DIMsSLInitialize(toplevel, ctx); /* Realize widget hierrachy */ XtRealizeWidget(toplevel); /* Initialize protocol layer */ DIMsProtoInit(toplevel, app_context); XtAppMainLoop(app_context); } |
前へ | 目次 |