diff -ur blt2.4m.ORIG/src/bltTkInt.h blt2.4m/src/bltTkInt.h --- blt2.4m.ORIG/src/bltTkInt.h Fri Oct 8 15:40:46 1999 +++ blt2.4m/src/bltTkInt.h Mon Aug 28 17:07:15 2000 @@ -35,6 +35,36 @@ int slant; /* Slant flag; see below for def'n. */ int underline; /* Non-zero for underline font. */ int overstrike; /* Non-zero for overstrike font. */ +#ifdef KANJI + int setwidth; /* setwidth field. */ + Tk_Uid foundry; /* font foundry field. */ + Tk_Uid charset; /* font charset field. */ + int fontType; /* One of the follows: + * TK_FONT_GENERIC + * TK_FONT_2BYTES + * TK_FONT_OTHER + * TK_FONT_COMPOUND */ +/* + * This macro only can be used in file that include this header. + * Otherwise, use convinient functions. + */ +#define Tk_FontType(tkfont) (((TkFont *)tkfont)->fa.fontType) +#define Tk_FontSize(tkfont) (((TkFont *)tkfont)->fa.pointsize) +#define Tk_FontFamily(tkfont) (((TkFont *)tkfont)->fa.family) +#define Tk_FontCharset(tkfont) (((TkFont *)tkfont)->fa.charset) +#define Tk_FontFoundry(tkfont) (((TkFont *)tkfont)->fa.foundry) + Tk_Uid asciiFontName; + Tk_Uid kanjiFontName; /* if fontType == TK_FONT_COMPOUND, + * use these names. */ + struct TkFontAttributes *asciiFaPtr; + struct TkFontAttributes *kanjiFaPtr; + /* if fontType == TK_FONT_COMPOUND, + * use these attributes. malloc'd. */ + double pointAdjust; /* Point size adjustment between kanji + * font and ascii font. + * (ascii size) / (kanji size). */ +#define Tk_FontPointAdjust(tkfont) (((TkFont *)tkfont)->fa.pointAdjust) +#endif /* KANJI */ } TkFontAttributes; typedef struct TkFontMetrics { @@ -105,6 +135,11 @@ * chained together off a single entry in * a hash table. */ #endif /* TK_VERSION_NUMBER >= 8.1.0 */ +#ifdef KANJI + struct TkFont *asciiFontPtr; + struct TkFont *kanjiFontPtr;/* if fa.fontType == TK_FONT_COMPOUND, + * use these pointer. */ +#endif /* KANJI */ } TkFont; /* diff -ur blt2.4m.ORIG/src/bltWindow.c blt2.4m/src/bltWindow.c --- blt2.4m.ORIG/src/bltWindow.c Wed Oct 13 12:51:58 1999 +++ blt2.4m/src/bltWindow.c Mon Aug 28 17:02:38 2000 @@ -344,6 +344,9 @@ Atom timestampAtom; /* Atom for TIMESTAMP. */ Atom textAtom; /* Atom for TEXT. */ Atom compoundTextAtom; /* Atom for COMPOUND_TEXT. */ +#ifdef KANJI + Atom cStringAtom; /* Atom for C_STRING. */ +#endif /* KANJI */ Atom applicationAtom; /* Atom for TK_APPLICATION. */ Atom windowAtom; /* Atom for TK_WINDOW. */ Atom clipboardAtom; /* Atom for CLIPBOARD. */ @@ -441,6 +444,19 @@ * the display when we no longer have any * Tk applications using it. */ +#ifdef TK_USE_INPUT_METHODS +#ifdef XIM_IMPROVE + XIMStyles *imSupportedStyle; + unsigned long imIcValues; /* Or'd value of IC attributes supported by + this IM. */ + char *modifiers; /* Hint for specific support of the input + * method. Malloc'd. */ + XIC lastFocusedIC; /* IC that currently focused. */ +#ifdef XNDestroyCallback + XIMCallback destroyCallback; +#endif /* XNDestroyCallback */ +#endif /* XIM_IMPROVE */ +#endif /* TK_USE_INPUT_METHODS */ } TkDisplay; #else @@ -715,6 +731,87 @@ #endif /* TK_VERSION_NUMBER >= _VERSION(8,1,0) */ +#ifdef TK_USE_INPUT_METHODS +#ifdef XIM_IMPROVE +/* Struct keeping input context attributes */ +typedef struct { + int icState; +#define IC_NEVER_USED 0x0000 +#define IC_USED_AT_LEAST_ONETIME 0x0001 +#define IC_ASSOC_WIN_DELETED 0x0002 +#define IC_DESTROYED 0x0004 +#define IC_IN_USE_RITE_NOW 0x0008 +#define SetICState(icAttr, flag) (icAttr)->icState |= (flag) +#define ResetICState(icAttr, flag) (icAttr)->icState &= ~(flag) +#define IsSetICState(icAttr, flag) (((icAttr)->icState & (flag)) == (flag)) + + Tk_Uid style; + XIMStyle styleVal; + + Tk_Uid peArea; + XRectangle peAreaVal; + + Tk_Uid stArea; + XRectangle stAreaVal; + + /* Get only */ + Tk_Uid stPrefArea; + XRectangle stPrefAreaVal; + + Tk_Uid spot; + XPoint spotVal; + + Tk_Uid font; /* A font name in Tk's world. */ + Tk_Uid fontlist; /* A fontset (XFontSet) name of below, in X's world. */ + XFontSet fontset; + + Tk_Uid fg; + unsigned long fgVal; + + Tk_Uid bg; + unsigned long bgVal; + + int isChanged; +#define IM_NOTHING_CHANGE 0x0000 +#define IM_STYLE_CHANGE 0x0001 +#define IM_PREEDITAREA_CHANGE 0x0002 +#define IM_STATUSAREA_CHANGE 0x0004 +#define IM_SPOT_CHANGE 0x0008 +#define IM_FONT_CHANGE 0x0010 +#define IM_COLOR_CHANGE 0x0020 + + int doPreedit; + int doStatus; + + XIMCallback peCB[4]; +#define IM_PEStartCB 0 +#define IM_PEDoneCB 1 +#define IM_PEDrawCB 2 +#define IM_PECaretCB 3 + XIMCallback stCB[3]; +#define IM_STStartCB 0 +#define IM_STDoneCB 1 +#define IM_STDrawCB 2 + + Tk_Uid callbackCmd; /* tcl script called when above + callback is activated. */ +} TkpICAttribute; + +/* + * Supported IC attributes flags. + */ +#define IM_SUPPORT_NOTHING 0x0000 +#define IM_SUPPORT_PREEDITAREA 0x0001 +#define IM_SUPPORT_STATUSAREA 0x0002 +#define IM_SUPPORT_AREA 0x0004 +#define IM_SUPPORT_AREANEEDED 0x0008 +#define IM_SUPPORT_SPOT 0x0010 +#define IM_SUPPORT_FONT 0x0020 +#define IM_SUPPORT_COLOR 0x0040 + +#endif /* XIM_IMPROVE */ +#endif /* TK_USE_INPUT_METHODS */ + struct TkWindow { Display *display; @@ -754,6 +851,11 @@ ClientData instanceData; #endif TkWindowPrivate *privatePtr; +#ifdef TK_USE_INPUT_METHODS +#ifdef XIM_IMPROVE + TkpICAttribute *icAttr; /* Input context attributes. */ +#endif /* XIM_IMPROVE */ +#endif /* TK_USE_INPUT_METHODS */ }; #ifdef WIN32 diff -ur blt2.4m.ORIG/src/tkButton.c blt2.4m/src/tkButton.c --- blt2.4m.ORIG/src/tkButton.c Tue Oct 12 09:19:27 1999 +++ blt2.4m/src/tkButton.c Mon Aug 28 16:32:20 2000 @@ -424,8 +424,13 @@ {TK_CONFIG_STRING, "-takefocus", "takeFocus", "TakeFocus", DEF_BUTTON_TAKE_FOCUS, Tk_Offset(Button, takeFocus), BUTTON_MASK | CHECK_BUTTON_MASK | RADIO_BUTTON_MASK | TK_CONFIG_NULL_OK}, +#ifdef TK_KANJI_OK + {TK_CONFIG_WSTRING, "-text", "text", "Text", + DEF_BUTTON_TEXT, Tk_Offset(TkButton, text), ALL_MASK}, +#else {TK_CONFIG_STRING, "-text", "text", "Text", DEF_BUTTON_TEXT, Tk_Offset(Button, text), ALL_MASK}, +#endif {TK_CONFIG_STRING, "-textvariable", "textVariable", "Variable", DEF_BUTTON_TEXT_VARIABLE, Tk_Offset(Button, textVarName), ALL_MASK | TK_CONFIG_NULL_OK}, @@ -1320,6 +1325,21 @@ char *value; value = Tcl_GetVar(interp, butPtr->textVarName, TCL_GLOBAL_ONLY); +#ifdef TK_KANJI_OK + if (value == NULL) { + if (Tcl_SetVar(interp, butPtr->textVarName, + Tcl_DecodeWStr(interp, butPtr->text, NULL), + TCL_GLOBAL_ONLY|TCL_LEAVE_ERR_MSG) == NULL) { + return TCL_ERROR; + } + } else { + wchar *old = butPtr->text; + butPtr->text = Tcl_GetWStr(NULL, value, NULL); + if (old != NULL) { + Tcl_FreeWStr(old); + } + } +#else if (value == NULL) { if (Tcl_SetVar(interp, butPtr->textVarName, butPtr->text, TCL_GLOBAL_ONLY | TCL_LEAVE_ERR_MSG) == NULL) { @@ -1332,6 +1352,7 @@ butPtr->text = (char *)ckalloc((unsigned)(strlen(value) + 1)); strcpy(butPtr->text, value); } +#endif /* TK_KANJI_OK */ Tcl_TraceVar(interp, butPtr->textVarName, TCL_GLOBAL_ONLY | TCL_TRACE_WRITES | TCL_TRACE_UNSETS, ButtonTextVarProc, (ClientData)butPtr); @@ -2032,6 +2053,9 @@ { register Button *butPtr = (Button *)clientData; char *value; +#ifdef TK_KANJI_OK + wchar *old = butPtr->text; +#endif /* TK_KANJI_OK */ /* * If the variable is unset, then immediately recreate it unless @@ -2040,8 +2064,14 @@ if (flags & TCL_TRACE_UNSETS) { if ((flags & TCL_TRACE_DESTROYED) && !(flags & TCL_INTERP_DESTROYED)) { +#ifdef TK_KANJI_OK + Tcl_SetVar(interp, butPtr->textVarName, + Tcl_DecodeWStr(interp, butPtr->text, NULL), + TCL_GLOBAL_ONLY); +#else Tcl_SetVar(interp, butPtr->textVarName, butPtr->text, TCL_GLOBAL_ONLY); +#endif /* TK_KANJI_OK */ Tcl_TraceVar(interp, butPtr->textVarName, TCL_GLOBAL_ONLY | TCL_TRACE_WRITES | TCL_TRACE_UNSETS, ButtonTextVarProc, clientData); @@ -2052,11 +2082,18 @@ if (value == NULL) { value = ""; } +#ifdef TK_KANJI_OK + butPtr->text = Tcl_GetWStr(NULL, value, NULL); + if (old != NULL) { + Tcl_FreeWStr(old); + } +#else if (butPtr->text != NULL) { ckfree(butPtr->text); } butPtr->text = (char *)ckalloc((unsigned)(strlen(value) + 1)); strcpy(butPtr->text, value); +#endif /* TK_KANJI_OK */ ComputeButtonGeometry(butPtr); if ((butPtr->tkwin != NULL) && Tk_IsMapped(butPtr->tkwin) diff -ur blt2.4m.ORIG/src/tkMenubutton.c blt2.4m/src/tkMenubutton.c --- blt2.4m.ORIG/src/tkMenubutton.c Fri Oct 8 15:40:46 1999 +++ blt2.4m/src/tkMenubutton.c Mon Aug 28 16:39:13 2000 @@ -253,8 +253,13 @@ {TK_CONFIG_STRING, "-takefocus", "takeFocus", "TakeFocus", DEF_MENUBUTTON_TAKE_FOCUS, Tk_Offset(MenuButton, takeFocus), TK_CONFIG_NULL_OK}, +#ifdef TK_KANJI_OK + {TK_CONFIG_WSTRING, "-text", "text", "Text", + DEF_MENUBUTTON_TEXT, Tk_Offset(TkMenuButton, text), 0}, +#else {TK_CONFIG_STRING, "-text", "text", "Text", DEF_MENUBUTTON_TEXT, Tk_Offset(MenuButton, text), 0}, +#endif /* TK_KANJI_OK */ {TK_CONFIG_STRING, "-textvariable", "textVariable", "Variable", DEF_MENUBUTTON_TEXT_VARIABLE, Tk_Offset(MenuButton, textVarName), TK_CONFIG_NULL_OK}, @@ -689,6 +694,20 @@ char *value; value = Tcl_GetVar(interp, mbPtr->textVarName, TCL_GLOBAL_ONLY); +#ifdef TK_KANJI_OK + if (value == NULL) { + Tcl_SetVar(interp, mbPtr->textVarName, + Tcl_DecodeWStr(interp, mbPtr->text, NULL), + TCL_GLOBAL_ONLY); + } else { + wchar *old = mbPtr->text; + + mbPtr->text = Tcl_GetWStr(NULL, value, NULL); + if (old != NULL) { + Tcl_FreeWStr(old); + } + } +#else if (value == NULL) { Tcl_SetVar(interp, mbPtr->textVarName, mbPtr->text, TCL_GLOBAL_ONLY); @@ -699,6 +718,7 @@ mbPtr->text = (char *)ckalloc((unsigned)(strlen(value) + 1)); strcpy(mbPtr->text, value); } +#endif Tcl_TraceVar(interp, mbPtr->textVarName, TCL_GLOBAL_ONLY | TCL_TRACE_WRITES | TCL_TRACE_UNSETS, MenuButtonTextVarProc, (ClientData)mbPtr); @@ -1166,6 +1186,9 @@ { register MenuButton *mbPtr = (MenuButton *)clientData; char *value; +#ifdef TK_KANJI_OK + wchar *old = mbPtr->text; +#endif /* TK_KANJI_OK */ /* * If the variable is unset, then immediately recreate it unless @@ -1174,8 +1197,14 @@ if (flags & TCL_TRACE_UNSETS) { if ((flags & TCL_TRACE_DESTROYED) && !(flags & TCL_INTERP_DESTROYED)) { +#ifdef TK_KANJI_OK + Tcl_SetVar(interp, mbPtr->textVarName, + Tcl_DecodeWStr(interp, mbPtr->text, NULL), + TCL_GLOBAL_ONLY); +#else Tcl_SetVar(interp, mbPtr->textVarName, mbPtr->text, TCL_GLOBAL_ONLY); +#endif /* TK_KANJI_OK */ Tcl_TraceVar(interp, mbPtr->textVarName, TCL_GLOBAL_ONLY | TCL_TRACE_WRITES | TCL_TRACE_UNSETS, MenuButtonTextVarProc, clientData); @@ -1186,11 +1215,18 @@ if (value == NULL) { value = ""; } +#ifdef TK_KANJI_OK + mbPtr->text = Tcl_GetWStr(NULL, value, NULL); + if (old != NULL ) { + Tcl_FreeWStr(old); + } +#else if (mbPtr->text != NULL) { ckfree(mbPtr->text); } mbPtr->text = (char *)ckalloc((unsigned)(strlen(value) + 1)); strcpy(mbPtr->text, value); +#endif /* TK_KANJI_OK */ ComputeMenuButtonGeometry(mbPtr); if ((mbPtr->tkwin != NULL) && Tk_IsMapped(mbPtr->tkwin)