diff options
author | vanilla <vanilla@FreeBSD.org> | 2000-04-24 06:25:50 +0000 |
---|---|---|
committer | vanilla <vanilla@FreeBSD.org> | 2000-04-24 06:25:50 +0000 |
commit | 8abdcc0e931384405f7a570fb4e1947085e90c72 (patch) | |
tree | a773d2abd1d29db4a741d25c5fc63ed44d9127b7 /chinese | |
parent | 8398b0a5523c8541e3820e0a2387d1700ae3704b (diff) | |
download | FreeBSD-ports-8abdcc0e931384405f7a570fb4e1947085e90c72.zip FreeBSD-ports-8abdcc0e931384405f7a570fb4e1947085e90c72.tar.gz |
Upgrade to 2.5.2p3
Submitted by: maintainer
Diffstat (limited to 'chinese')
-rw-r--r-- | chinese/xcin25/Makefile | 8 | ||||
-rw-r--r-- | chinese/xcin25/distinfo | 2 | ||||
-rw-r--r-- | chinese/xcin25/files/patch-af | 2156 | ||||
-rw-r--r-- | chinese/xcin25/pkg-plist | 2 |
4 files changed, 8 insertions, 2160 deletions
diff --git a/chinese/xcin25/Makefile b/chinese/xcin25/Makefile index 81e92c8..f07ec39 100644 --- a/chinese/xcin25/Makefile +++ b/chinese/xcin25/Makefile @@ -6,10 +6,10 @@ # PORTNAME= xcin -PORTVERSION= 2.5.2.p2 +PORTVERSION= 2.5.2p3 CATEGORIES= chinese x11 MASTER_SITES= ftp://xcin.linux.org.tw/pub/xcin/xcin/devel/ -DISTNAME= xcin-2.5.2-pre2 +DISTNAME= xcin-2.5.2-pre3 MAINTAINER= keith@freebsd.sinica.edu.tw @@ -17,12 +17,14 @@ LIB_DEPENDS= tabe.0:${PORTSDIR}/chinese/libtabe \ intl.1:${PORTSDIR}/devel/gettext BUILD_DEPENDS= ${LOCALBASE}/lib/libdb2.a:${PORTSDIR}/databases/db RUN_DEPENDS= ${X11BASE}/lib/X11/locale/zh_TW.Big5/XLC_LOCALE:${PORTSDIR}/x11/XFree86 \ - ${X11BASE}/lib/X11/fonts/local/kc15f.pcf.gz:${PORTSDIR}/chinese/kcfonts + ${X11BASE}/lib/X11/fonts/local/kc15f.pcf.gz:${PORTSDIR}/chinese/kcfonts \ + ${LOCALBASE}/share/tabe/libtabe-0.1-4:${PORTSDIR}/chinese/libtabe WRKSRC= ${WRKDIR}/xcin-2.5 USE_X_PREFIX= yes GNU_CONFIGURE= yes CONFIGURE_ARGS= --prefix=${PREFIX} \ + --x-libraries=${PREFIX}/lib \ --with-xcin-dir=${PREFIX}/lib/X11/xcin25 \ --with-dbinc=${LOCALBASE}/include/db2 \ --with-dblib=${LOCALBASE}/lib \ diff --git a/chinese/xcin25/distinfo b/chinese/xcin25/distinfo index 273d9dd..e293941 100644 --- a/chinese/xcin25/distinfo +++ b/chinese/xcin25/distinfo @@ -1 +1 @@ -MD5 (xcin-2.5.2-pre2.tar.gz) = 9a0c961068778ca9f33f9bcb71d33550 +MD5 (xcin-2.5.2-pre3.tar.gz) = f6bdbf762bba8c7efe1efe02acf8db45 diff --git a/chinese/xcin25/files/patch-af b/chinese/xcin25/files/patch-af deleted file mode 100644 index 108e6a6..0000000 --- a/chinese/xcin25/files/patch-af +++ /dev/null @@ -1,2156 +0,0 @@ ---- doc/CREDITS.orig Thu Feb 17 08:32:52 2000 -+++ doc/CREDITS Mon Mar 6 08:48:05 2000 -@@ -14,6 +14,11 @@ - Contribution: Donate GB cin tables: biaoxingma.cin, pinyin.cin, shuangpin.cin, - wubizixing.cin. - -+Name: Array: 行列科技有限公司, 負責人: 廖明德先生 -+ (http://www.array.com.tw/) -+Email: array30@ms10.hinet.net -+Contribution: Donate array30.cin table. -+ - Name: 邱智偉 (Chao, Weichung) - Email: weichung@mail.cynix.com.tw - Contribution: XCIN po file Big5 translation. -@@ -50,7 +55,8 @@ - Contribution: GPL translation modification. - - Name: PhantomCat (Hung, Peter) --Email: peter@phantom.wahoo.com.tw -+ (美商網虎 XLinux 軟體工程師) -+Email: peter@xlinux.com - Contribution: Add the OverTheSpot input style support. - - Name: Joe ---- doc/Changes.orig Wed Feb 23 09:47:57 2000 -+++ doc/Changes Mon Mar 6 08:48:05 2000 -@@ -1,3 +1,35 @@ -+xcin-2.5.2-pre3: 2000/03/ -+------------------------------ -+1. Fix the bug of multiply creating GC in gui_overspot & gui_menusel. -+ Thanks to Peter Hung <peter@phantom.wahoo.com.tw> -+ -+2. Fix bugs when xcin is going to exit and xccore->ic = NULL case; -+ -+3. Change the mechanism of IMC windows' map change during IC focus changes. -+ Add a gui->winchange flag: WIN_CHANGE_FOCUS. -+ -+4. Remove the check_focus() function. Let xim_trigger_handler() to set -+ xccore->ic and xccore->ic->imc->icid. -+ -+5. Fix a bug when IM_FOCUS_ON in xcinrc truned on, xcin will only initially -+ start from Setkey=0 input method. -+ -+6. Move the fontset data from gui_t to winlist_t. -+ -+7. Change the OverTheSpot styles: -+ 1. the candidate window will always follow the spot location of the client. -+ 2. the candidate window will use the fontset specified by the client if -+ possible. -+ 3. the length of the candidate window will be adjusted according to the -+ amount of the data being drawed. -+ 4. add xcinrc option "OVERSPOT_DRAW_AREA3". -+ 5. change testprog for valid OverTheSpot styles. -+ Thanks to Peter Hung <peter@phantom.wahoo.com.tw> -+ -+8. Fix bug in gen_inp: to remove the handling of CapsLock ON. -+ Thanks to loneeagle <loneeagle@cle.linux.org.tw>. -+ -+ - xcin-2.5.2-pre2: 2000/02/23 - ------------------------------ - 1. Register a WM protocol into testprog such that it can be terminated by WM. ---- src/Cinput/gen_inp/gen_inp.c.orig Thu Feb 17 08:33:05 2000 -+++ src/Cinput/gen_inp/gen_inp.c Mon Mar 6 08:48:05 2000 -@@ -903,8 +903,10 @@ - else if ((keyinfo->keystate & Mod1Mask) && - (ret1 = modifier_escape(cf, QPHR_ALT))) - return (ret | ret1); -+/* - else if ((keyinfo->keystate & LockMask)) - return (ret | IMKEY_SHIFTESC); -+*/ - - else if (! wch.wch) - return (ret | IMKEY_IGNORE); ---- src/gui.c.orig Wed Feb 23 09:47:57 2000 -+++ src/gui.c Mon Mar 6 08:48:05 2000 -@@ -36,73 +36,6 @@ - - ----------------------------------------------------------------------------*/ - --static void --x_set_font(gui_t *gui, char *fontset_name, char *indexfont_name) --{ -- int fsize; -- char *s, *s1; -- int charset_count, fontset_count=0; -- char **charset_list; -- char *def_string; -- XFontStruct **font_structs; -- int i; -- --/* -- * Compute the number of input font names. -- */ -- if (*fontset_name != '\0') -- fontset_count ++; -- s1 = fontset_name; -- while ((s=strchr(s1, ',')) != NULL) { -- if (*(s+1) != '\0') { -- fontset_count ++; -- s1 = s + 1; -- } -- } -- --/* -- * Create the fontset. -- */ -- gui->fontset = XCreateFontSet(gui->display, fontset_name, -- &charset_list, &charset_count, &def_string); -- if (charset_count || ! gui->fontset) { -- for (i=0; i<charset_count; i++) -- perr(XCINMSG_NORMAL, "invalid font %s.\n", charset_list[i]); -- perr(XCINMSG_ERROR, "fontset setting error.\n"); -- } -- charset_count = XFontsOfFontSet(gui->fontset, &font_structs, &charset_list); -- if (charset_count != fontset_count) { -- for (i=0; i<charset_count; i++) -- perr(XCINMSG_NORMAL, "only valid font %s.\n", charset_list[i]); -- perr(XCINMSG_ERROR, "fontset setting error.\n"); -- } -- -- for (i=0; i<charset_count; i++) { -- fsize = font_structs[i]->max_bounds.width / 2; -- if (fsize > gui->ef_width) -- gui->ef_width = fsize; -- fsize = font_structs[i]->ascent + font_structs[i]->descent; -- if (fsize > gui->ef_height) { -- gui->ef_height = fsize; -- gui->ef_ascent = font_structs[i]->ascent; -- } -- } -- --/* -- * Create the index font. -- */ -- for (i=0; i<charset_count; i++) { -- if (! strcmp(indexfont_name, charset_list[i])) -- break; -- } -- if (i < charset_count) -- gui->indexfont = font_structs[i]; -- else if(! (gui->indexfont = XLoadQueryFont(gui->display, indexfont_name))) { -- perr(XCINMSG_ERROR, "invalid INDEX_FONT: %s\n", indexfont_name); -- gui->if_descent = gui->indexfont->descent; -- } --} -- - static unsigned long - x_set_color(gui_t *gui, char *color_name) - { -@@ -131,7 +64,6 @@ - gui->display_width = DisplayWidth(gui->display, gui->screen); - gui->display_height = DisplayHeight(gui->display, gui->screen); - gui->root = RootWindow(gui->display, gui->screen); -- x_set_font(gui, xc->fontset, xc->indexfont); - - gui->fg_color = x_set_color(gui, xc->fg_color); - gui->bg_color = x_set_color(gui, xc->bg_color); -@@ -153,6 +85,52 @@ - - ----------------------------------------------------------------------------*/ - -+XFontSet -+gui_create_fontset(gui_t *gui, char *base_font, int *ef_width, -+ int *ef_height, int *ef_ascent, int verbose) -+{ -+ int charset_count=0, i, fsize; -+ char **charset_list=NULL; -+ char *def_string=NULL; -+ XFontSet fontset=(XFontSet)NULL; -+ XFontStruct **font_structs; -+ -+ if (! base_font) -+ return (XFontSet)NULL; -+ -+ fontset = XCreateFontSet(gui->display, base_font, -+ &charset_list, &charset_count, &def_string); -+ if (charset_count || ! fontset) { -+ for (i=0; i<charset_count; i++) { -+ if (verbose) -+ perr(XCINMSG_WARNING, "invalid font %s.\n", charset_list[i]); -+ XFree(charset_list[i]); -+ } -+ if (charset_list) -+ XFree(charset_list); -+ if (fontset) -+ XFreeFontSet(gui->display, fontset); -+ return (XFontSet)NULL; -+ } -+ -+ charset_count = XFontsOfFontSet(fontset, &font_structs, &charset_list); -+ *ef_width = 0; -+ *ef_height = 0; -+ *ef_ascent = 0; -+ -+ for (i=0; i<charset_count; i++) { -+ fsize = font_structs[i]->max_bounds.width / 2; -+ if (fsize > *ef_width) -+ *ef_width = fsize; -+ fsize = font_structs[i]->ascent + font_structs[i]->descent; -+ if (fsize > *ef_height) { -+ *ef_height = fsize; -+ *ef_ascent = font_structs[i]->ascent; -+ } -+ } -+ return fontset; -+} -+ - void - gui_freewin(Window window) - { -@@ -176,6 +154,7 @@ - - if (w->winmap != (byte_t)-1) { - w->winmap = (byte_t)-1; -+ XUnmapWindow(xccore->gui.display, w->window); - if (w->win_destroy_func) - w->win_destroy_func(&(xccore->gui), w); - else -@@ -191,31 +170,19 @@ - return; - - if (state) { -- if (! win->winmap) { -+ if (win->winmap == (ubyte_t)0) { - XMapWindow(gui->display, win->window); - win->winmap = (byte_t)1; - } - } - else { -- if (win->winmap) { -+ if (win->winmap == (ubyte_t)1) { - XUnmapWindow(gui->display, win->window); - win->winmap = (byte_t)0; - } - } - } - --void --gui_greq_winmap_change(gui_t *gui, greq_win_t *greqw, int state) --{ -- winlist_t *w; -- int i; -- -- for (i=0; i<greqw->n_greq; i++) { -- w = (winlist_t *)(greqw->win[i]); -- gui_winmap_change(gui, w, state); -- } --} -- - void - gui_greq_win_destroy(greq_win_t *greqw) - { -@@ -229,22 +196,6 @@ - } - - void --gui_overspot_winmap_change(gui_t *gui, int imid, int state) --{ -- winlist_t *w = xccore->win; -- -- while (w) { -- if (w->imid == imid && w->wid == WID_OVERSPOT) { -- gui_winmap_change(gui, w, state); -- if (state == 1) -- XRaiseWindow(gui->display, w->window); -- break; -- } -- w = w->next; -- } --} -- --void - gui_overspot_destroy(int imid) - { - winlist_t *w = xccore->win; -@@ -351,6 +302,20 @@ - return win; - } - -+static void -+gui_greq_windraw(gui_t *gui, greq_win_t *greqw, int state) -+{ -+ winlist_t *w; -+ int i; -+ -+ for (i=0; i<greqw->n_greq; i++) { -+ w = (winlist_t *)(greqw->win[i]); -+ gui_winmap_change(gui, w, state); -+ if (state) -+ w->win_draw_func(&(xccore->gui), w); -+ } -+} -+ - static void - update_gui_request(void) - { -@@ -360,6 +325,13 @@ - greq_win_t gw_handling; - int i, j; - -+ if ((xccore->gui.winchange & WIN_CHANGE_FOCUS) && xccore->icp) { -+ greq_win_t *greqw = &(xccore->icp->imc->gwin); -+ for (i=0; i<greqw->n_greq; i++) { -+ win = (winlist_t *)(greqw->win[i]); -+ gui_winmap_change(&(xccore->gui), win, 0); -+ } -+ } - if (! greqd && imc->gwin.n_greq == 0) - return; - -@@ -384,14 +356,11 @@ - gw_handling.win[gw_handling.n_greq] = imc->gwin.win[i]; - (gw_handling.n_greq) ++; - -- if ((win = search_winlist(xccore->win, WID_GUIREQ, -- imc->id, greqd->reqid))) -- win->win_draw_func(&(xccore->gui), win); -- else { -- if ((win=gui_request_init(imc, greqd))) { -- xccore->win_end->next = win; -- xccore->win_end = win; -- } -+ if (! search_winlist(xccore->win, -+ WID_GUIREQ, imc->id, greqd->reqid) && -+ (win=gui_request_init(imc, greqd))) { -+ xccore->win_end->next = win; -+ xccore->win_end = win; - } - } - greqd = greqd->next; -@@ -407,15 +376,11 @@ - } - memcpy(&(imc->gwin), &(gw_handling), sizeof(greq_win_t)); - -- if ((xccore->xcin_mode & XCIN_SINGLE_IMC)) { -- if (! xccore->ic || !(xccore->ic->imc->inp_state & IM_CINPUT) || -- !(xccore->ic->imc->inp_state & IM_XIMFOCUS)) { -- gui_greq_winmap_change(&(xccore->gui), &(imc->gwin), 0); -- return; -- } -- else -- gui_greq_winmap_change(&(xccore->gui), &(imc->gwin), 1); -- } -+ if (! xccore->ic || !(xccore->ic->imc->inp_state & IM_CINPUT) || -+ !(xccore->ic->imc->inp_state & IM_XIMFOCUS)) -+ gui_greq_windraw(&(xccore->gui), &(imc->gwin), 0); -+ else -+ gui_greq_windraw(&(xccore->gui), &(imc->gwin), 1); - } - - /*--------------------------------------------------------------------------*/ -@@ -425,17 +390,18 @@ - update_gui_overspot(void) - { - winlist_t *win; -- IC *ic = xccore->ic; -+ IC *ic = xccore->ic, *icp = xccore->icp; - -- if (ic->imc->pre_attr == NULL) -- ic->imc->pre_attr = &(ic->pre_attr); -- if (ic->imc->sts_attr == NULL) -- ic->imc->sts_attr = &(ic->sts_attr); -+ if ((xccore->gui.winchange & WIN_CHANGE_FOCUS) && icp && -+ (win = search_winlist(xccore->win, WID_OVERSPOT, icp->imc->id, 0))) -+ gui_winmap_change(&(xccore->gui), win, 0); - - if ((win = search_winlist(xccore->win, WID_OVERSPOT, ic->imc->id, 0))) - win->win_draw_func(&(xccore->gui), win); - else { -- win = gui_overspot_init(&(xccore->gui), xccore->main_win, ic->imc); -+ ic->imc->ic_rec = &(ic->ic_rec); -+ win = gui_overspot_init(&(xccore->gui), xccore->main_win, ic->imc, -+ (xccore->xcin_mode & XCIN_OVERSPOT_AREA3)); - xccore->win_end->next = win; - xccore->win_end = win; - } -@@ -454,7 +420,7 @@ - if (xccore->ic) { - update_gui_request(); - -- if (xccore->ic->input_style == XIMSTY_OverSpot) -+ if (xccore->ic->ic_rec.input_style == XIMSTY_OverSpot) - update_gui_overspot(); - } - xccore->gui.winchange = 0; ---- src/gui_main.c.orig Wed Feb 23 09:47:57 2000 -+++ src/gui_main.c Mon Mar 6 08:48:05 2000 -@@ -46,6 +46,8 @@ - GC gcm; /* For spot mark: mfg_color, mbg_color */ - GC gcrm; /* For keystroke area background: mbg_color */ - GC gcline; /* For underline mark: uline_color */ -+ -+ XFontStruct *indexfont; - } xcin_main_win_t; - - static xcin_main_win_t xmw; -@@ -58,7 +60,8 @@ - ----------------------------------------------------------------------------*/ - - static void --inpstate_content(gui_t *gui, IC *ic, xmode_t xcin_mode, inp_state_t inp_state) -+inpstate_content(gui_t *gui, winlist_t *win, -+ IC *ic, xmode_t xcin_mode, inp_state_t inp_state) - { - char *inpn, *inpb, *str; - -@@ -70,11 +73,11 @@ - snprintf(xmw.s_inpname, CIN_CNAME_LENGTH*2, "[%s][%s]", inpn, inpb); - xmw.w_inpname.x = FIELD_STEP; - xmw.w_inpname.width = XmbTextEscapement( -- gui->fontset, xmw.s_inpname, strlen(xmw.s_inpname)); -+ win->fontset, xmw.s_inpname, strlen(xmw.s_inpname)); - if (! ic) - return; - -- xmw.w_coding.width = ic->imc->inpinfo.area3_len * gui->ef_width; -+ xmw.w_coding.width = ic->imc->inpinfo.area3_len * win->ef_width; - xmw.w_coding.x = 2*FIELD_STEP + xmw.w_inpname.x + xmw.w_inpname.width; - xmw.w_show_coding.x = 2*FIELD_STEP + xmw.w_coding.x + xmw.w_coding.width; - -@@ -85,12 +88,12 @@ - else - snprintf(xmw.e_inpname, CIN_ENAME_LENGTH, - "*%s", ic->imc->inpinfo.inp_ename); -- xmw.w_e_inpname.width = XTextWidth(gui->indexfont, str, strlen(str)); -+ xmw.w_e_inpname.width = XTextWidth(xmw.indexfont, str, strlen(str)); - } - } - - static void --win_draw_multich(gui_t *gui, Window window, inpinfo_t *inpinfo) -+win_draw_multich(gui_t *gui, winlist_t *win, inpinfo_t *inpinfo) - { - int i, j, n_groups, n, x, y, len=0; - byte_t toggle_flag; -@@ -101,7 +104,7 @@ - if ((cch = inpinfo->mcch) == NULL) - return; - x = FIELD_STEP; -- y = gui->ef_ascent; -+ y = win->ef_ascent; - selkey = inpinfo->s_selkey; - spot_gc = ((inpinfo->guimode & GUIMOD_SELKEYSPOT)) ? xmw.gcm : xmw.gc; - if (! inpinfo->mcch_grouping || inpinfo->mcch_grouping[0]==0) { -@@ -116,18 +119,18 @@ - for (i=0; i<n_groups && toggle_flag!=-1; i++, selkey++) { - n = (toggle_flag > 0) ? inpinfo->mcch_grouping[i+1] : 1; - if ((len = strlen(selkey->s))) { -- XmbDrawImageString(gui->display, window, -- gui->fontset, spot_gc, x, y, selkey->s, len); -- x += (XmbTextEscapement(gui->fontset, selkey->s, len) + 5); -+ XmbDrawImageString(gui->display, win->window, -+ win->fontset, spot_gc, x, y, selkey->s, len); -+ x += (XmbTextEscapement(win->fontset, selkey->s, len) + 5); - } - for (j=0; j<n; j++, cch++) { - if (! (len = strlen(cch->s))) { - toggle_flag = -1; - break; - } -- XmbDrawImageString(gui->display, window, -- gui->fontset, xmw.gc, x, y, cch->s, len); -- x += XmbTextEscapement(gui->fontset, cch->s, len); -+ XmbDrawImageString(gui->display, win->window, -+ win->fontset, xmw.gc, x, y, cch->s, len); -+ x += XmbTextEscapement(win->fontset, cch->s, len); - } - x += FIELD_STEP; - } -@@ -150,12 +153,12 @@ - break; - } - if (pgstate) -- XmbDrawImageString(gui->display, window, -- gui->fontset, xmw.gc, x, y, pgstate, len); -+ XmbDrawImageString(gui->display, win->window, -+ win->fontset, xmw.gc, x, y, pgstate, len); - } - - static void --draw_lcch_grouping(gui_t *gui, Window window, -+draw_lcch_grouping(gui_t *gui, winlist_t *win, - wch_t *lcch, int n, ubyte_t *glist) - { - int i, x1, x2, y, n_cch=0, n_seg; -@@ -163,7 +166,7 @@ - wch_t tmpch; - - x1 = FIELD_STEP; -- y = gui->ef_height+1; -+ y = win->ef_height+1; - for (i=0; i<n; i++) { - n_seg = glist[i]; - -@@ -172,16 +175,16 @@ - wchs_to_mbs(str, lcch+n_cch, 65); - lcch[n_cch+n_seg].wch = tmpch.wch; - -- x2 = x1 + XmbTextEscapement(gui->fontset, str, strlen(str)); -+ x2 = x1 + XmbTextEscapement(win->fontset, str, strlen(str)); - if (n_seg > 1) -- XDrawLine(gui->display, window, xmw.gcline, x1+2, y, x2-5, y); -+ XDrawLine(gui->display, win->window, xmw.gcline, x1+2, y, x2-5, y); - x1 = x2; - n_cch += n_seg; - } - } - - static void --win_draw_listcch(gui_t *gui, Window window, inpinfo_t *inpinfo) -+win_draw_listcch(gui_t *gui, winlist_t *win, inpinfo_t *inpinfo) - { - int x, y, edit_pos, len; - wch_t tmp; -@@ -191,10 +194,10 @@ - if (! inpinfo->lcch) - return; - if (inpinfo->lcch_grouping) -- draw_lcch_grouping(gui, window, inpinfo->lcch, -+ draw_lcch_grouping(gui, win, inpinfo->lcch, - inpinfo->lcch_grouping[0], inpinfo->lcch_grouping+1); - x = FIELD_STEP; -- y = gui->ef_ascent; -+ y = win->ef_ascent; - len = WCH_SIZE * inpinfo->n_lcch; - - if (len >= str_size) { -@@ -212,20 +215,20 @@ - if (edit_pos > 0) { - wchs_to_mbs(str, inpinfo->lcch, str_size); - len = strlen(str); -- XmbDrawImageString(gui->display, window, -- gui->fontset, xmw.gc, x, y, str, len); -- x += XmbTextEscapement(gui->fontset, str, len); -+ XmbDrawImageString(gui->display, win->window, -+ win->fontset, xmw.gc, x, y, str, len); -+ x += XmbTextEscapement(win->fontset, str, len); - } - - len = strlen(tmp.s); -- XmbDrawImageString(gui->display, window, -- gui->fontset, xmw.gcm, x, y, tmp.s, len); -- x += XmbTextEscapement(gui->fontset, str, len); -+ XmbDrawImageString(gui->display, win->window, -+ win->fontset, xmw.gcm, x, y, tmp.s, len); -+ x += XmbTextEscapement(win->fontset, str, len); - - if (edit_pos < inpinfo->n_lcch - 1) { - wchs_to_mbs(str, inpinfo->lcch+edit_pos+1, str_size); -- XmbDrawImageString(gui->display, window, -- gui->fontset, xmw.gc, x, y, str, strlen(str)); -+ XmbDrawImageString(gui->display, win->window, -+ win->fontset, xmw.gc, x, y, str, strlen(str)); - } - inpinfo->lcch[edit_pos].wch = tmp.wch; - } -@@ -233,14 +236,14 @@ - wchs_to_mbs(str, inpinfo->lcch, str_size); - len = strlen(str); - if (len) { -- XmbDrawImageString(gui->display, window, -- gui->fontset, xmw.gc, x, y, str, len); -- x += XmbTextEscapement(gui->fontset, str, len); -+ XmbDrawImageString(gui->display, win->window, -+ win->fontset, xmw.gc, x, y, str, len); -+ x += XmbTextEscapement(win->fontset, str, len); - } - else - x = FIELD_STEP; -- XFillRectangle(gui->display, window, xmw.gcrm, -- x, 0, gui->ef_width, gui->ef_height); -+ XFillRectangle(gui->display, win->window, xmw.gcrm, -+ x, 0, win->ef_width, win->ef_height); - } - } - -@@ -254,35 +257,37 @@ - if ((gui->winchange & WIN_CHANGE_IM)) { - XClearWindow(gui->display, win->window); - if ((gui->winchange & WIN_CHANGE_IM) == WIN_CHANGE_IM) -- inpstate_content(gui, ic, xcin_mode, inp_state); -+ inpstate_content(gui, win, ic, xcin_mode, inp_state); - } - - /* Draw area 2. */ - x = xmw.w_inpname.x; -- y = gui->ef_height + gui->ef_ascent + 5; -+ y = (win->c_height == 1) ? win->ef_ascent + 5: -+ win->ef_height + win->ef_ascent + 5; - str = xmw.s_inpname; - XmbDrawImageString(gui->display, win->window, -- gui->fontset, xmw.gc, x, y, str, strlen(str)); -+ win->fontset, xmw.gc, x, y, str, strlen(str)); - - if (ic && (ic->imc->inp_state & IM_CINPUT) && - (ic->imc->inp_state & IM_XIMFOCUS)) { - IM_Context_t *imc = ic->imc; - /* Draw area 1. */ - if ((imc->inpinfo.guimode & GUIMOD_LISTCHAR)) -- win_draw_listcch(gui, win->window, &(imc->inpinfo)); -+ win_draw_listcch(gui, win, &(imc->inpinfo)); - else if (imc->inpinfo.n_mcch > 0) { -- if (ic->input_style == XIMSTY_Root) -- win_draw_multich(gui, win->window, &(imc->inpinfo)); -+ if (ic->ic_rec.input_style == XIMSTY_Root) -+ win_draw_multich(gui, win, &(imc->inpinfo)); - } - - /* Draw area 3. */ -- if (ic->input_style == XIMSTY_Root) { -+ if (ic->ic_rec.input_style == XIMSTY_Root || -+ ! (xcin_mode & XCIN_OVERSPOT_AREA3)) { - x = xmw.w_coding.x; - XFillRectangle(gui->display, win->window, xmw.gcrm, x, -- y-gui->ef_ascent, xmw.w_coding.width, gui->ef_height); -+ y-win->ef_ascent, xmw.w_coding.width, win->ef_height); - if (wchs_to_mbs(buf, imc->inpinfo.s_keystroke, 256)) - XmbDrawImageString(gui->display, win->window, -- gui->fontset, xmw.gcm, x, y, buf, strlen(buf)); -+ win->fontset, xmw.gcm, x, y, buf, strlen(buf)); - } - - /* Draw area 4. */ -@@ -295,12 +300,12 @@ - wchs_to_mbs(str, imc->sinmd_keystroke, 256-slen)) { - if ((imc->inpinfo.guimode & GUIMOD_SINMDLINE1)) { - x = FIELD_STEP; -- y = gui->ef_ascent; -+ y = win->ef_ascent; - } - else - x = xmw.w_show_coding.x; - XmbDrawImageString(gui->display, win->window, -- gui->fontset, xmw.gc, x, y, buf, strlen(buf)); -+ win->fontset, xmw.gc, x, y, buf, strlen(buf)); - } - } - -@@ -308,7 +313,7 @@ - str = xmw.e_inpname; - if (str[0]) { - x = win->width - FIELD_STEP - xmw.w_e_inpname.width; -- y = win->height - gui->if_descent; -+ y = win->height - xmw.indexfont->descent; - XDrawString(gui->display, win->window, - xmw.gce, x, y, str, strlen(str)); - } -@@ -362,7 +367,7 @@ - win->pos_y = event->y; - } - win->width = event->width; -- win->c_width = win->width / gui->ef_width; -+ win->c_width = win->width / win->ef_width; - } - - static void -@@ -394,10 +399,8 @@ - win->c_width = MIN_WIN_WIDTH; - if ((r & WidthValue)) - win->c_width = (width < MIN_WIN_WIDTH) ? MIN_WIN_WIDTH : width; -- win->c_height = 2; - -- win->width = win->c_width * gui->ef_width; -- win->height = win->c_height * gui->ef_height + 5; -+ win->width = win->c_width * win->ef_width; - if (win->pos_x < 0) { - win->pos_x += (gui->display_width - win->width); - *negx = 1; -@@ -427,11 +430,11 @@ - size_hints.y = win->pos_y; - size_hints.width = win->width; - size_hints.height = win->height; -- size_hints.min_width = MIN_WIN_WIDTH * gui->ef_width; -- size_hints.max_width = MAX_WIN_WIDTH * gui->ef_width; -+ size_hints.min_width = MIN_WIN_WIDTH * win->ef_width; -+ size_hints.max_width = MAX_WIN_WIDTH * win->ef_width; - size_hints.min_height = win->height; - size_hints.max_height = size_hints.min_height; -- size_hints.width_inc = gui->ef_width * 2; -+ size_hints.width_inc = win->ef_width * 2; - size_hints.height_inc = 0; - if (negative_x) - size_hints.win_gravity = -@@ -464,7 +467,7 @@ - xmw.gce = XCreateGC(gui->display, window, 0, NULL); - XSetForeground(gui->display, xmw.gce, gui->fg_color); - XSetBackground(gui->display, xmw.gce, gui->bg_color); -- XSetFont(gui->display, xmw.gce, gui->indexfont->fid); -+ XSetFont(gui->display, xmw.gce, xmw.indexfont->fid); - - xmw.gcm = XCreateGC(gui->display, window, 0, NULL); - XSetForeground(gui->display, xmw.gcm, gui->mfg_color); -@@ -486,6 +489,7 @@ - winlist_t *win; - Bool negative_x=0, negative_y=0; - -+/* Initially Setup */ - xmw.inpn_english = strdup(xc->inpn_english); - xmw.inpn_sbyte = strdup(xc->inpn_sbyte); - xmw.inpn_2bytes = strdup(xc->inpn_2bytes); -@@ -495,7 +499,21 @@ - win->imid = 0; - win->reqid = 0; - win->winmap = (ubyte_t)0; -+ -+/* Create Font & FontSet */ -+ win->fontset = gui_create_fontset(gui, xc->fontset, &(win->ef_width), -+ &(win->ef_height), &(win->ef_ascent), 1); -+ if (! win->fontset) -+ perr(XCINMSG_ERROR, "fontset setting error.\n"); -+ if (! (xmw.indexfont = XLoadQueryFont(gui->display, xc->indexfont))) -+ perr(XCINMSG_ERROR, "invalid INDEX_FONT: %s\n", xc->indexfont); -+ -+/* Window Geometry */ -+ win->c_height = 2; -+ win->height = 2 * win->ef_height + 5; - x_set_geometry(gui, win, xc->geometry, &negative_x, &negative_y); -+ -+/* Winlist Setup */ - win->window = XCreateSimpleWindow(gui->display, gui->root, - win->pos_x, win->pos_y, win->width, win->height, 1, - gui->fg_color, gui->bg_color); -@@ -505,6 +523,7 @@ - win->win_destroy_func = xcin_mainwin_destroy; - win->next = NULL; - -+/* Window Manager Property Setup */ - set_wm_property(gui, win, negative_x, negative_y); - set_GC(gui, win->window); - XSelectInput(gui->display, win->window, (ExposureMask|StructureNotifyMask)); -@@ -515,5 +534,4 @@ - gui_winmap_change(gui, win, 1); - return win; - } -- - ---- src/gui_menusel.c.orig Wed Feb 23 09:47:57 2000 -+++ src/gui_menusel.c Mon Mar 6 08:48:05 2000 -@@ -85,13 +85,13 @@ - for (i=0, h1=info->head_item; - i<win->c_height && h1<=info->n_item; i++, h1++) { - wchs_to_mbs(buf, info->item[h1-1].title, 256); -- len = XmbTextEscapement(gui->fontset, buf, strlen(buf)); -+ len = XmbTextEscapement(win->fontset, buf, strlen(buf)); - if (max_len < len) - max_len = len; - -- y = i*(gui->ef_height+LINE_STEP) + gui->ef_ascent + LINE_STEP/2; -+ y = i*(win->ef_height+LINE_STEP) + win->ef_ascent + LINE_STEP/2; - gc = (h1 == info->focus_item) ? msw.gcm : msw.gc; -- XmbDrawImageString(gui->display, win->window, gui->fontset, -+ XmbDrawImageString(gui->display, win->window, win->fontset, - gc, FIELD_STEP, y, buf, strlen(buf)); - } - -@@ -99,7 +99,7 @@ - * Draw the grid lines. - */ - for (i=1; i<win->c_height; i++) { -- y = i * (gui->ef_height+LINE_STEP); -+ y = i * (win->ef_height+LINE_STEP); - XDrawLine(gui->display, win->window, msw.gcline, 1, y, win->width, y); - } - x = max_len + FIELD_STEP*2; -@@ -124,7 +124,7 @@ - - if (! info->item[h1-1].elements) - continue; -- y = i*(gui->ef_height+LINE_STEP) + gui->ef_ascent + LINE_STEP/2; -+ y = i*(win->ef_height+LINE_STEP) + win->ef_ascent + LINE_STEP/2; - n_elem = (info->item[h1-1].elem_group) ? - info->item[h1-1].elem_group[0] : info->item[h1-1].n_elem; - -@@ -139,15 +139,15 @@ - get_elem(buf, 256, h2, info->item[h1-1].elements, - info->item[h1-1].elem_group, selkeys); - len = strlen(buf); -- max_len = XmbTextEscapement(gui->fontset, selkeys+j, 1); -- max_len2 = XmbTextEscapement(gui->fontset, buf, len); -+ max_len = XmbTextEscapement(win->fontset, selkeys+j, 1); -+ max_len2 = XmbTextEscapement(win->fontset, buf, len); - if (xx+max_len+max_len2+FIELD_STEP > win->width) - break; - -- XmbDrawImageString(gui->display, win->window, gui->fontset, -+ XmbDrawImageString(gui->display, win->window, win->fontset, - gc_sel, xx, y, selkeys+j, 1); - xx += (max_len + FIELD_STEP); -- XmbDrawImageString(gui->display, win->window, gui->fontset, -+ XmbDrawImageString(gui->display, win->window, win->fontset, - gc, xx, y, buf, len); - xx += (max_len2 + FIELD_STEP*2); - } -@@ -176,7 +176,7 @@ - XConfigureEvent *event, int keep_flag) - { - win->width = event->width; -- win->c_width = win->width / gui->ef_width; -+ win->c_width = win->width / win->ef_width; - } - - static void -@@ -196,11 +196,11 @@ - size_hints.y = win->pos_y; - size_hints.width = win->width; - size_hints.height = win->height; -- size_hints.min_width = MIN_WIN_WIDTH * gui->ef_width; -- size_hints.max_width = MAX_WIN_WIDTH * gui->ef_width; -+ size_hints.min_width = MIN_WIN_WIDTH * win->ef_width; -+ size_hints.max_width = MAX_WIN_WIDTH * win->ef_width; - size_hints.min_height = win->height; - size_hints.max_height = win->height; -- size_hints.width_inc = gui->ef_width; -+ size_hints.width_inc = win->ef_width; - size_hints.height_inc = 0; - - wm_hints.flags = InputHint | StateHint; -@@ -224,10 +224,14 @@ - win->reqid = greqd->reqid; - win->winmap = (ubyte_t)0; - -+ win->fontset = main_win->fontset; -+ win->ef_width = main_win->ef_width; -+ win->ef_height = main_win->ef_height; -+ win->ef_ascent = main_win->ef_ascent; - win->c_width = main_win->c_width; - win->c_height = (info->n_item<=MENUSEL_NROW) ? info->n_item : MENUSEL_NROW; - win->width = main_win->width; -- win->height = win->c_height * (gui->ef_height + LINE_STEP); -+ win->height = win->c_height * (win->ef_height + LINE_STEP); - win->pos_x = main_win->pos_x; - win->pos_y = main_win->pos_y - win->height - 10*FIELD_STEP; - if (win->pos_y <= 0) -@@ -246,18 +250,21 @@ - XSetWMProtocols(gui->display, win->window, &(gui->wm_del_win), 1); - - /* Setup GC */ -- msw.gc = XCreateGC(gui->display, win->window, 0, NULL); -- XSetForeground(gui->display, msw.gc, gui->fg_color); -- XSetBackground(gui->display, msw.gc, gui->bg_color); -- -- msw.gcm = XCreateGC(gui->display, win->window, 0, NULL); -- XSetForeground(gui->display, msw.gcm, gui->fg_color); -- XSetBackground(gui->display, msw.gcm, gui->mbg_color); -- -- msw.gcline = XCreateGC(gui->display, win->window, 0, NULL); -- XSetForeground(gui->display, msw.gcline, gui->grid_color); -- XSetBackground(gui->display, msw.gcline, gui->bg_color); -- -+ if (msw.gc == (GC)0) { -+ msw.gc = XCreateGC(gui->display, win->window, 0, NULL); -+ XSetForeground(gui->display, msw.gc, gui->fg_color); -+ XSetBackground(gui->display, msw.gc, gui->bg_color); -+ } -+ if (msw.gcm == (GC)0) { -+ msw.gcm = XCreateGC(gui->display, win->window, 0, NULL); -+ XSetForeground(gui->display, msw.gcm, gui->fg_color); -+ XSetBackground(gui->display, msw.gcm, gui->mbg_color); -+ } -+ if (msw.gcline == (GC)0) { -+ msw.gcline = XCreateGC(gui->display, win->window, 0, NULL); -+ XSetForeground(gui->display, msw.gcline, gui->grid_color); -+ XSetBackground(gui->display, msw.gcline, gui->bg_color); -+ } - gui_winmap_change(gui, win, 1); - gui_menusel_draw(gui, win); - return win; ---- src/gui_overspot.c.orig Wed Feb 23 09:47:57 2000 -+++ src/gui_overspot.c Mon Mar 6 08:48:05 2000 -@@ -32,6 +32,7 @@ - GC gc; /* Window fg_color, bg_color */ - GC gcs; /* For multi-cch selection key */ - GC gcm; /* For spot mark: mfg_color, mbg_color */ -+ ubyte_t display_area3; - } overspot_win_t; - - static overspot_win_t osw; -@@ -44,37 +45,40 @@ - - static void - overspot_location(gui_t *gui, winlist_t *win, -- IM_Context_t *imc, int *pos_x, int *pos_y) -+ ic_rec_t *ic_rec, int *pos_x, int *pos_y) - { - int new_x, new_y; -+ Window junkwin; - -- new_x = imc->pre_attr->spot_location.x + imc->pre_attr->area.x; -- new_y = imc->pre_attr->spot_location.y + imc->pre_attr->area.y + 15; -- if (new_x + win->width > gui->display_width) -- new_x = gui->display_width - win->width; -- if (new_y + win->height > gui->display_height) -- new_y = gui->display_height - win->height; -- -- *pos_x = new_x; -- *pos_y = new_y; -+ new_x = ic_rec->pre_attr.spot_location.x + ic_rec->pre_attr.area.x; -+ new_y = ic_rec->pre_attr.spot_location.y + ic_rec->pre_attr.area.y + 15; -+ XTranslateCoordinates(gui->display, ic_rec->focus_win, gui->root, -+ new_x, new_y, pos_x, pos_y, &junkwin); -+ -+ if (*pos_x + win->width > gui->display_width) -+ *pos_x = gui->display_width - win->width; -+ if (*pos_y + win->height > gui->display_height) -+ *pos_y = *pos_y - 40 - win->height; - } - - static void --overspot_win_location(gui_t *gui, winlist_t *win, IM_Context_t *imc) -+overspot_win_adjust(gui_t *gui, winlist_t *win, ic_rec_t *ic_rec, int winlen) - { - int new_x, new_y; - -- overspot_location(gui, win, imc, &new_x, &new_y); -- if (new_x != win->pos_x || new_y != win->pos_y) { -+ overspot_location(gui, win, ic_rec, &new_x, &new_y); -+ if (new_x != win->pos_x || new_y != win->pos_y || winlen != win->width) { - win->pos_x = new_x; - win->pos_y = new_y; -- XMoveWindow(gui->display, win->window, win->pos_x, win->pos_y); -+ win->width = winlen; -+ XMoveResizeWindow(gui->display, win->window, -+ win->pos_x, win->pos_y, win->width, win->height); - XRaiseWindow(gui->display, win->window); - } - } - --static void --overspot_draw_multich(gui_t *gui, Window window, int x, inpinfo_t *inpinfo) -+static int -+overspot_draw_multich(gui_t *gui, winlist_t *win, int x, inpinfo_t *inpinfo) - { - int i, j, n_groups, n, y, len=0; - byte_t toggle_flag; -@@ -83,8 +87,8 @@ - GC spot_gc; - - if ((cch = inpinfo->mcch) == NULL) -- return; -- y = gui->ef_ascent; -+ return 0; -+ y = win->ef_ascent; - selkey = inpinfo->s_selkey; - spot_gc = ((inpinfo->guimode & GUIMOD_SELKEYSPOT)) ? osw.gcm : osw.gcs; - if (! inpinfo->mcch_grouping || inpinfo->mcch_grouping[0]==0) { -@@ -99,18 +103,18 @@ - for (i=0; i<n_groups && toggle_flag!=-1; i++, selkey++) { - n = (toggle_flag > 0) ? inpinfo->mcch_grouping[i+1] : 1; - if ((len = strlen(selkey->s))) { -- XmbDrawImageString(gui->display, window, -- gui->fontset, spot_gc, x, y, selkey->s, len); -- x += (XmbTextEscapement(gui->fontset, selkey->s, len) + 2); -+ XmbDrawImageString(gui->display, win->window, -+ win->fontset, spot_gc, x, y, selkey->s, len); -+ x += (XmbTextEscapement(win->fontset, selkey->s, len) + 2); - } - for (j=0; j<n; j++, cch++) { - if (! (len = strlen(cch->s))) { - toggle_flag = -1; - break; - } -- XmbDrawImageString(gui->display, window, -- gui->fontset, osw.gc, x, y, cch->s, len); -- x += XmbTextEscapement(gui->fontset, cch->s, len); -+ XmbDrawImageString(gui->display, win->window, -+ win->fontset, osw.gc, x, y, cch->s, len); -+ x += XmbTextEscapement(win->fontset, cch->s, len); - } - x += FIELD_STEP; - } -@@ -132,54 +136,59 @@ - pgstate = NULL; - break; - } -- if (pgstate) -- XmbDrawImageString(gui->display, window, -- gui->fontset, osw.gc, x, y, pgstate, len); -+ if (pgstate) { -+ XmbDrawImageString(gui->display, win->window, -+ win->fontset, osw.gc, x, y, pgstate, len); -+ x += XmbTextEscapement(win->fontset, pgstate, len); -+ } -+ return x; - } - --static void -+static int - overspot_win_draw(gui_t *gui, winlist_t *win, IM_Context_t *imc) - { -+ int x; - - if ((gui->winchange & WIN_CHANGE_IM)) - XClearWindow(gui->display, win->window); - - if ((imc->inpinfo.guimode & GUIMOD_SELKEYSPOT)) -- overspot_draw_multich(gui,win->window, FIELD_STEP,&(imc->inpinfo)); -+ x = overspot_draw_multich(gui, win, FIELD_STEP, &(imc->inpinfo)); - else { -- int x, y, len; -+ int y, len; - char buf[256]; - - x = FIELD_STEP; -- y = gui->ef_ascent; -- wchs_to_mbs(buf, imc->inpinfo.s_keystroke, 256); -- len = strlen(buf); -- XmbDrawImageString(gui->display, win->window, -- gui->fontset, osw.gc, x, y, buf, len); -- -- if (imc->inpinfo.n_mcch > 0) { -- x += (2*FIELD_STEP + XmbTextEscapement(gui->fontset, buf, len)); -- overspot_draw_multich(gui, win->window, x, &(imc->inpinfo)); -+ y = win->ef_ascent; -+ if (osw.display_area3) { -+ wchs_to_mbs(buf, imc->inpinfo.s_keystroke, 256); -+ len = strlen(buf); -+ XmbDrawImageString(gui->display, win->window, -+ win->fontset, osw.gc, x, y, buf, len); -+ x += (2*FIELD_STEP + XmbTextEscapement(win->fontset, buf, len)); - } -+ if (imc->inpinfo.n_mcch > 0) -+ x = overspot_draw_multich(gui, win, x, &(imc->inpinfo)); - } -+ return x; - } - - static void - gui_overspot_draw(gui_t *gui, winlist_t *win) - { - IM_Context_t *imc = (IM_Context_t *)win->data; -+ int x; - - if (win->winmap == (byte_t)-1) - return; - - if ((imc->inp_state & IM_XIMFOCUS) && (imc->inp_state & IM_CINPUT) && -- (imc->inpinfo.n_mcch > 0 || -- (imc->inpinfo.s_keystroke && imc->inpinfo.s_keystroke[0].wch))) { -- if (! win->winmap) -- XRaiseWindow(gui->display, win->window); -- overspot_win_location(gui, win, imc); -+ (imc->inpinfo.n_mcch > 0 || (osw.display_area3 && -+ imc->inpinfo.s_keystroke && imc->inpinfo.s_keystroke[0].wch))) { -+ XRaiseWindow(gui->display, win->window); - gui_winmap_change(gui, win, 1); -- overspot_win_draw(gui, win, imc); -+ x = overspot_win_draw(gui, win, imc); -+ overspot_win_adjust(gui, win, imc->ic_rec, x+FIELD_STEP*2); - } - else - gui_winmap_change(gui, win, 0); -@@ -192,28 +201,51 @@ - - ----------------------------------------------------------------------------*/ - -+static void -+overspot_destroy(gui_t *gui, winlist_t *win) -+{ -+ IM_Context_t *imc = (IM_Context_t *)win->data; -+ PreeditAttributes *pre_attr = &(imc->ic_rec->pre_attr); -+ -+ if (pre_attr->base_font) -+ XFreeFontSet(gui->display, win->fontset); -+} -+ - winlist_t * --gui_overspot_init(gui_t *gui, winlist_t *main_win, IM_Context_t *imc) -+gui_overspot_init(gui_t *gui, winlist_t *main_win, IM_Context_t *imc, int flag) - { - winlist_t *win=NULL; - XSetWindowAttributes win_attr; - -+ osw.display_area3 = (flag) ? (ubyte_t)1 : (ubyte_t)0; - win = malloc(sizeof(winlist_t)); - win->wid = WID_OVERSPOT; - win->imid = imc->id; - win->reqid = 0; - win->winmap = (ubyte_t)0; - -- win->c_width = main_win->c_width * 4/5; -+ if (imc->ic_rec->pre_attr.base_font) -+ win->fontset = gui_create_fontset(gui, imc->ic_rec->pre_attr.base_font, -+ &(win->ef_width), &(win->ef_height), &(win->ef_ascent), 0); -+ else -+ win->fontset = (XFontSet)NULL; -+ if (! win->fontset) { -+ win->fontset = main_win->fontset; -+ win->ef_width = main_win->ef_width; -+ win->ef_height = main_win->ef_height; -+ win->ef_ascent = main_win->ef_ascent; -+ } -+ -+ win->c_width = 1; - win->c_height = 1; -- win->width = win->c_width * gui->ef_width; -- win->height = win->c_height * gui->ef_height + 3; -- overspot_location(gui, win, imc, &(win->pos_x), &(win->pos_y)); -+ win->width = win->c_width * win->ef_width; -+ win->height = win->c_height * win->ef_height + 3; -+ overspot_location(gui, win, imc->ic_rec, &(win->pos_x), &(win->pos_y)); - - win->data = (void *)imc; - win->win_draw_func = gui_overspot_draw; - win->win_attrib_func = NULL; -- win->win_destroy_func = NULL; -+ win->win_destroy_func = overspot_destroy; - win->next = NULL; - - win->window = XCreateSimpleWindow(gui->display, gui->root, -@@ -225,17 +257,21 @@ - XSelectInput(gui->display, win->window, (ExposureMask|StructureNotifyMask)); - - /* Setup GC */ -- osw.gc = XCreateGC(gui->display, win->window, 0, NULL); -- XSetForeground(gui->display, osw.gc, gui->fg_color); -- XSetBackground(gui->display, osw.gc, gui->bg_color); -- -- osw.gcs = XCreateGC(gui->display, win->window, 0, NULL); -- XSetForeground(gui->display, osw.gcs, gui->fg_color); -- XSetBackground(gui->display, osw.gcs, gui->mbg_color); -- -- osw.gcm = XCreateGC(gui->display, win->window, 0, NULL); -- XSetForeground(gui->display, osw.gcm, gui->mfg_color); -- XSetBackground(gui->display, osw.gcm, gui->mbg_color); -+ if (osw.gc == (GC)0) { -+ osw.gc = XCreateGC(gui->display, win->window, 0, NULL); -+ XSetForeground(gui->display, osw.gc, gui->fg_color); -+ XSetBackground(gui->display, osw.gc, gui->bg_color); -+ } -+ if (osw.gcs == (GC)0) { -+ osw.gcs = XCreateGC(gui->display, win->window, 0, NULL); -+ XSetForeground(gui->display, osw.gcs, gui->fg_color); -+ XSetBackground(gui->display, osw.gcs, gui->mbg_color); -+ } -+ if (osw.gcm == (GC)0) { -+ osw.gcm = XCreateGC(gui->display, win->window, 0, NULL); -+ XSetForeground(gui->display, osw.gcm, gui->mfg_color); -+ XSetBackground(gui->display, osw.gcm, gui->mbg_color); -+ } - - gui_overspot_draw(gui, win); - return win; ---- src/include/IC.h.orig Wed Feb 23 09:47:57 2000 -+++ src/include/IC.h Mon Mar 6 08:48:06 2000 -@@ -36,17 +36,20 @@ - - typedef struct { - XRectangle area; /* area */ -- XRectangle area_needed; /* area needed */ - XPoint spot_location; /* spot location */ -+ char *base_font; /* base font of fontset */ -+#ifdef XIM_COMPLETE -+ XRectangle area_needed; /* area needed */ - Colormap cmap; /* colormap */ - CARD32 foreground; /* foreground */ - CARD32 background; /* background */ - Pixmap bg_pixmap; /* background pixmap */ -- char *base_font; /* base font of fontset */ - CARD32 line_space; /* line spacing */ - Cursor cursor; /* cursor */ -+#endif - } PreeditAttributes; - -+#ifdef XIM_COMPLETE - typedef struct { - XRectangle area; /* area */ - XRectangle area_needed; /* area needed */ -@@ -58,22 +61,19 @@ - CARD32 line_space; /* line spacing */ - Cursor cursor; /* cursor */ - } StatusAttributes; -+#endif - --enum { -- SPELLING_INCOMPLETE, -- SPELLING_COMPLETE, /* just before posting selection */ --}; --enum { -- PREEDIT_EDITING, -- PREEDIT_SELECTION --}; -- --enum { -- SEL_LEFT, -- SEL_MID, -- SEL_RIGHT --}; -- -+typedef struct { -+ INT32 input_style; /* input style */ -+ Window client_win; /* client window */ -+ Window focus_win; /* focus window */ -+ PreeditAttributes pre_attr; /* preedit attributes */ -+#ifdef XIM_COMPLETE -+ StatusAttributes sts_attr; /* status attributes */ -+ char *resource_name; /* resource name */ -+ char *resource_class; /* resource class */ -+#endif -+} ic_rec_t; - - /* - * Flags for inp_state of each IC. -@@ -91,8 +91,10 @@ - } greq_win_t; - - typedef struct { -- unsigned short id; -- unsigned int icid; -+ unsigned short id; /* id of this IMC */ -+ unsigned int icid; /* id of the current attached IC */ -+ ic_rec_t *ic_rec; /* point to the current IC resource */ -+ - inp_state_t inp_state; /* ic cinput state */ - inp_state_t inp_num; /* ic cinput num */ - inp_state_t sinp_num; /* ic cinput num (sinmd) */ -@@ -104,9 +106,6 @@ - unsigned int cch_size; /* cch buf size. */ - char *cch; /* composed char for commit. */ - greq_win_t gwin; /* IM GUI request window recorder. */ -- -- PreeditAttributes *pre_attr; /* preedit attributes */ -- StatusAttributes *sts_attr; /* status attributes */ - } IM_Context_t; - - #define IC_NEWIC 0x01 -@@ -118,26 +117,15 @@ - #define XIMSTY_OffSpot (XIMPreeditArea|XIMStatusArea) - #define XIMSTY_OnSpot (XIMPreeditCallbacks|XIMStatusCallbacks) - --typedef struct _IC IC; /* forward declaration */ -+typedef struct _IC IC; - struct _IC { - CARD16 id; /* ic id */ - CARD16 connect_id; /* id of connected client */ - time_t exec_time; /* recent excution time */ - xmode_t ic_state; /* status of the IC */ -+ ic_rec_t ic_rec; /* the IC resource setting by client */ -+ IM_Context_t *imc; /* the IM Context */ - struct _IC *next; -- IM_Context_t *imc; -- --/* -- * Set from: XICAttribute *ic_attr, *pre_attr, *sts_attr; -- * ic_set_value_by_name(); -- */ -- INT32 input_style; /* input style */ -- Window client_win; /* client window */ -- Window focus_win; /* focus window */ -- char *resource_name; /* resource name */ -- char *resource_class; /* resource class */ -- PreeditAttributes pre_attr; /* preedit attributes */ -- StatusAttributes sts_attr; /* status attributes */ - }; - - #endif /* _IC_H */ ---- src/include/gui.h.orig Wed Feb 23 09:47:57 2000 -+++ src/include/gui.h Mon Mar 6 08:48:06 2000 -@@ -30,6 +30,7 @@ - */ - #define WIN_CHANGE_IM_CONTENT 0x0001 - #define WIN_CHANGE_IM 0x00ff -+#define WIN_CHANGE_FOCUS 0x0100 - - /* - * Window Identifier. -@@ -43,21 +44,19 @@ - */ - typedef struct { - Display *display; -- int screen; - int display_width, display_height; -+ int screen; -+ int argc; -+ char **argv; -+ - Window root; - Atom wm_del_win; -- -- XFontSet fontset; -- XFontStruct *indexfont; -- int ef_width, ef_height, ef_ascent, if_descent; - Colormap colormap; -- unsigned long fg_color, bg_color, mfg_color, mbg_color, uline_color, -- grid_color; -+ unsigned long fg_color, bg_color; -+ unsigned long mfg_color, mbg_color; -+ unsigned long uline_color, grid_color; - - xmode_t winchange; -- int argc; -- char **argv; - } gui_t; - - /* -@@ -70,8 +69,9 @@ - byte_t winmap; - - int pos_x, pos_y; -- unsigned int width, height; -- unsigned int c_width, c_height; -+ unsigned int width, height, c_width, c_height; -+ XFontSet fontset; -+ int ef_width, ef_height, ef_ascent; - - void *data; - void (*win_draw_func)(gui_t *, winlist_t *); ---- src/include/xcin_core.h.orig Wed Feb 23 09:47:57 2000 -+++ src/include/xcin_core.h Mon Mar 6 08:48:06 2000 -@@ -38,6 +38,7 @@ - #define XCIN_ICCHECK_OFF 0x00000010 /* disable IC check */ - #define XCIN_SINGLE_IMC 0x00000020 /* single inpinfo for all IC */ - #define XCIN_KEEP_POSITION 0x00000040 /* keep position enable */ -+#define XCIN_OVERSPOT_AREA3 0x00000080 /* draw area3 in cand_win */ - #define XCIN_RUN_FIRSTIM 0x00010000 /* before first IM switch in */ - #define XCIN_RUN_IM_FOCUS 0x00020000 /* run time IM focus on */ - #define XCIN_RUN_2B_FOCUS 0x00040000 /* run time 2B focus on */ -@@ -75,6 +76,7 @@ - uline_color[64], grid_color[64], label_color[64]; - char geometry[64]; - char xim_name[64]; -+ char input_styles[1024]; - - char inpn_english[64]; - char inpn_sbyte[64]; -@@ -88,7 +90,7 @@ - - /* XIM & Input Method configuration. */ - XIMS ims; -- IC *ic; -+ IC *ic, *icp; - xmode_t xcin_mode; - inp_state_t default_im; - inp_state_t default_im_sinmd; -@@ -96,17 +98,18 @@ - - /* The following are for common IM Context */ - IM_Context_t *imc; -+ XIMStyles input_styles; - } core_config_t; - - --extern void gui_init(core_config_t *xccore, inner_rc_t *xc); -+extern void gui_init(core_config_t *xccore, inner_rc_t *inner_rc); - extern void gui_loop(void); -+extern XFontSet gui_create_fontset(gui_t *gui, char *base_font, int *ef_width, -+ int *ef_height, int *ef_ascent, int verbose); - extern void gui_freewin(Window window); - extern void gui_update_winlist(void); - extern void gui_winmap_change(gui_t *gui, winlist_t *win, int state); --extern void gui_greq_winmap_change(gui_t *gui, greq_win_t *greqw, int state); - extern void gui_greq_win_destroy(greq_win_t *greqw); --extern void gui_overspot_winmap_change(gui_t *gui, int imid, int state); - extern void gui_overspot_destroy(int imid); - - extern winlist_t *xcin_mainwin_init(gui_t *gui, inner_rc_t *xc, -@@ -114,9 +117,9 @@ - extern winlist_t *gui_menusel_init(gui_t *gui, winlist_t *main_win, - int imid, greq_t *greqd); - extern winlist_t *gui_overspot_init(gui_t *gui, winlist_t *main_win, -- IM_Context_t *imc); -+ IM_Context_t *imc, int flag); - --extern void xim_init(core_config_t *core, xcin_rc_t *xc, char *server_name); -+extern void xim_init(core_config_t *core, xcin_rc_t *xc, inner_rc_t *inner_rc); - extern void xim_close(void); - extern void call_xim_init(IC *ic, int reset_inpinfo); - extern void call_xim_end(IC *ic, int ic_delete, int reset_inpinfo); -@@ -129,8 +132,9 @@ - core_config_t *xccore); - extern int ic_destroy(XIMS ims, IMDestroyICStruct *call_data, - core_config_t *xccore); --extern int ic_clean_all(CARD16 connect_id, int clear); --extern void ic_get_values(IC *ic, IMChangeICStruct *call_data); -+extern int ic_clean_all(CARD16 connect_id, core_config_t *xccore); -+extern void ic_get_values(IC *ic, IMChangeICStruct *call_data, -+ core_config_t *xccore); - extern void ic_set_values(IC *ic, IMChangeICStruct *call_data, - core_config_t *xccore); - extern void check_ic_exist(int icid, core_config_t *xccore); ---- src/util/testprog/testprog.c.orig Wed Feb 23 09:47:57 2000 -+++ src/util/testprog/testprog.c Mon Mar 6 08:48:06 2000 -@@ -126,6 +126,7 @@ - - XVaNestedList preedit_attr = NULL; - XPoint spot; -+ XRectangle local_win_rect; - - /* - * Open connection to IM server. -@@ -205,8 +206,12 @@ - if (style == (XIMPreeditPosition | XIMStatusNothing)) { - spot.x = 5; - spot.y = 2*ef_height + 3*(ef_ascent+5); -+ local_win_rect.x = 1; -+ local_win_rect.y = 1; -+ local_win_rect.width = win_rect.width; -+ local_win_rect.height = win_rect.height; - preedit_attr = XVaCreateNestedList(0, -- XNArea, &win_rect, -+ XNArea, &local_win_rect, - XNSpotLocation, &spot, - XNFontSet, fontset, - NULL); -@@ -254,8 +259,7 @@ - - spot.x = XwcTextEscapement(fontset, input_buf, idx) + 5; - spot.y = 2*ef_height + 3*(ef_ascent+5); -- preedit_attr = XVaCreateNestedList(0, XNArea, &win_rect, -- XNSpotLocation, &spot, NULL); -+ preedit_attr = XVaCreateNestedList(0, XNSpotLocation, &spot, NULL); - XSetICValues(ic, XNPreeditAttributes, preedit_attr, NULL); - XFree(preedit_attr); - } -@@ -520,8 +524,6 @@ - win_rect.y = event->y; - win_rect.width = event->width; - win_rect.height = event->height; -- -- send_spot_loc(); - } - - /*-------------------------------------------------------------------------- ---- src/xcin_main.c.orig Wed Feb 23 09:47:57 2000 -+++ src/xcin_main.c Mon Mar 6 08:48:06 2000 -@@ -184,57 +184,57 @@ - */ - cmd[0] = "INDEX_FONT"; - if (get_resource(cmd, value, 256, 1)) -- set_data(inner_rc->indexfont, RC_STRARR, value, 0, -+ set_data(inner_rc->indexfont, RC_STRARR, value, 0, - sizeof(inner_rc->indexfont)); - else - perr(XCINMSG_ERROR, "%s: %s: value not specified.\n", - xcin_rc.rcfile, cmd[0]); - cmd[0] = "FG_COLOR"; - if (get_resource(cmd, value, 256, 1)) -- set_data(inner_rc->fg_color, RC_STRARR, value, 0, -+ set_data(inner_rc->fg_color, RC_STRARR, value, 0, - sizeof(inner_rc->fg_color)); - cmd[0] = "BG_COLOR"; - if (get_resource(cmd, value, 256, 1)) -- set_data(inner_rc->bg_color, RC_STRARR, value, 0, -+ set_data(inner_rc->bg_color, RC_STRARR, value, 0, - sizeof(inner_rc->bg_color)); - cmd[0] = "M_FG_COLOR"; - if (get_resource(cmd, value, 256, 1)) -- set_data(inner_rc->mfg_color, RC_STRARR, value, 0, -+ set_data(inner_rc->mfg_color, RC_STRARR, value, 0, - sizeof(inner_rc->mfg_color)); - cmd[0] = "M_BG_COLOR"; - if (get_resource(cmd, value, 256, 1)) -- set_data(inner_rc->mbg_color, RC_STRARR, value, 0, -+ set_data(inner_rc->mbg_color, RC_STRARR, value, 0, - sizeof(inner_rc->mbg_color)); - cmd[0] = "ULINE_COLOR"; - if (get_resource(cmd, value, 256, 1)) -- set_data(inner_rc->uline_color, RC_STRARR, value, 0, -+ set_data(inner_rc->uline_color, RC_STRARR, value, 0, - sizeof(inner_rc->uline_color)); - cmd[0] = "GRID_COLOR"; - if (get_resource(cmd, value, 256, 1)) -- set_data(inner_rc->grid_color, RC_STRARR, value, 0, -+ set_data(inner_rc->grid_color, RC_STRARR, value, 0, - sizeof(inner_rc->grid_color)); - cmd[0] = "XCIN_HIDE"; - if (get_resource(cmd, value, 256, 1)) -- set_data(&(xcin_core.xcin_mode), RC_IFLAG, value, XCIN_MODE_HIDE, 0); -+ set_data(&(xcin_core.xcin_mode), RC_IFLAG, value, XCIN_MODE_HIDE, 0); - cmd[0] = "X_GEOMETRY"; - if (get_resource(cmd, value, 256, 1)) -- set_data(inner_rc->geometry, RC_STRARR, value, 0, -+ set_data(inner_rc->geometry, RC_STRARR, value, 0, - sizeof(inner_rc->geometry)); - cmd[0] = "XKILL_DISABLE"; - if (get_resource(cmd, value, 256, 1)) -- set_data(&(xcin_core.xcin_mode), RC_IFLAG, value, XCIN_XKILL_OFF, 0); -+ set_data(&(xcin_core.xcin_mode), RC_IFLAG, value, XCIN_XKILL_OFF, 0); - cmd[0] = "ICCHECK_DISABLE"; - if (get_resource(cmd, value, 256, 1)) -- set_data(&(xcin_core.xcin_mode), RC_IFLAG, value, XCIN_ICCHECK_OFF, 0); -+ set_data(&(xcin_core.xcin_mode), RC_IFLAG, value, XCIN_ICCHECK_OFF, 0); - cmd[0] = "SINGLE_IM_CONTEXT"; - if (get_resource(cmd, value, 256, 1)) -- set_data(&(xcin_core.xcin_mode), RC_IFLAG, value, XCIN_SINGLE_IMC, 0); -+ set_data(&(xcin_core.xcin_mode), RC_IFLAG, value, XCIN_SINGLE_IMC, 0); - cmd[0] = "IM_FOCUS_ON"; - if (get_resource(cmd, value, 256, 1)) -- set_data(&(xcin_core.xcin_mode), RC_IFLAG, value, XCIN_IM_FOCUS, 0); -+ set_data(&(xcin_core.xcin_mode), RC_IFLAG, value, XCIN_IM_FOCUS, 0); - cmd[0] = "KEEP_POSITION_ON"; - if (get_resource(cmd, value, 256, 1)) -- set_data(&(xcin_core.xcin_mode), RC_IFLAG, value, XCIN_KEEP_POSITION,0); -+ set_data(&(xcin_core.xcin_mode), RC_IFLAG, value, XCIN_KEEP_POSITION,0); - - cmd[0] = "FKEY_ZHEN"; - if (get_resource(cmd, value, 256, 1)) -@@ -264,6 +264,14 @@ - if (get_resource(cmd, value, 256, 1)) - set_funckey(FKEY_QPHRASE, value); - check_funckey(); -+ -+ cmd[0] = "INPUT_STYLE"; -+ if (get_resource(cmd, value, 256, 1)) -+ set_data(inner_rc->input_styles, RC_STRARR, value, 0, -+ sizeof(inner_rc->input_styles)); -+ cmd[0] = "OVERSPOT_DRAW_AREA3"; -+ if (get_resource(cmd, value, 256, 1)) -+ set_data(&(xcin_core.xcin_mode), RC_IFLAG, value,XCIN_OVERSPOT_AREA3,0); - } - - static void -@@ -426,7 +434,7 @@ - free_cinput(cp); - } - else { -- xcin_core.default_im = (inp_state_t)idx; -+ xcin_core.im_focus = xcin_core.default_im = (inp_state_t)idx; - return; - } - } -@@ -447,7 +455,7 @@ - else { - strncpy(inner_rc->default_im_name, cp->objname, - sizeof(inner_rc->default_im_name)); -- xcin_core.default_im = (inp_state_t)idx; -+ xcin_core.im_focus = xcin_core.default_im = (inp_state_t)idx; - break; - } - } -@@ -503,7 +511,7 @@ - load_default_sinmd(); - qphrase_init(inner_rc->phrase_fn); - gui_init(&xcin_core, inner_rc); -- xim_init(&xcin_core, &xcin_rc, inner_rc->xim_name); -+ xim_init(&xcin_core, &xcin_rc, inner_rc); - free(inner_rc); - - gui_loop(); ---- src/xcinrc.in.orig Mon Mar 6 08:47:32 2000 -+++ src/xcinrc.in Mon Mar 6 08:48:06 2000 -@@ -30,6 +30,7 @@ - (define IM_FOCUS_ON "NO") - (define KEEP_POSITION_ON "NO") - (define INPUT_STYLE '(Root)) -+(define OVERSPOT_DRAW_AREA3 "YES") - - ;(define FKEY_ZHEN "ctrl space") - ;(define FKEY_2BSB "shift space") ---- src/xim.c.orig Wed Feb 23 09:47:57 2000 -+++ src/xim.c Mon Mar 6 08:48:06 2000 -@@ -165,12 +165,11 @@ - - if (imc->icid != ic->id) - return; -- xccore->ic = ic; - if ((imc->inp_state & IM_CINPUT)) { - imc->inp_state |= IM_XIMFOCUS; - xccore->gui.winchange |= WIN_CHANGE_IM; - } -- else if (imc->inp_state & IM_2BYTES) -+ else if ((imc->inp_state & IM_2BYTES)) - xccore->gui.winchange |= WIN_CHANGE_IM; - } - -@@ -411,9 +410,8 @@ - xim_close_handler(XIMS ims, IMCloseStruct *call_data) - { - DebugLog("XIM_CLOSE\n"); -- ic_clean_all(call_data->connect_id, !(xccore->xcin_mode & XCIN_SINGLE_IMC)); -+ ic_clean_all(call_data->connect_id, xccore); - xccore->gui.winchange |= WIN_CHANGE_IM; -- xccore->ic = NULL; - return True; - } - -@@ -460,6 +458,7 @@ - ic->imc->icid = ic->id; - call_switch_in(ic); - ic->ic_state |= IC_FOCUS; -+ xccore->ic = ic; - - if ((ic->ic_state & IC_NEWIC)) { - if ((xccore->xcin_mode & XCIN_RUN_IM_FOCUS) || -@@ -479,28 +478,11 @@ - xim_connect(xccore->ims, ic); - else - xim_disconnect(ic); -- if (ic->input_style == XIMSTY_OverSpot) { -- ic->imc->pre_attr = &(ic->pre_attr); -- ic->imc->sts_attr = &(ic->sts_attr); -- } -- } -- else { --/* -- * For XCIN_SINGLE_IMC off, we should change the GUI-request windows' mapping -- * state everytime when changing the IC focus, since the focus status in this -- * mode is definite, and each IC is completely independent to the others, so -- * we should handle them independently. -- * -- * But for XCIN_SINGLE_IMC mode, the focus state of IMC might be ambiguous, -- * as described on the above, so we will change the GUI-request windows' -- * mapping state after all the focus status are determined, i.e., in the -- * update_gui_request() in gui.c. This way can also improve the graphical -- * performance. -- */ -- gui_greq_winmap_change(&(xccore->gui), &(ic->imc->gwin), 1); -- if (ic->input_style == XIMSTY_OverSpot) -- gui_overspot_winmap_change(&(xccore->gui), ic->imc->id, 1); -+ if (ic->ic_rec.input_style == XIMSTY_OverSpot) -+ ic->imc->ic_rec = &(ic->ic_rec); - } -+ else -+ xccore->gui.winchange |= WIN_CHANGE_FOCUS; - return True; - } - -@@ -517,12 +499,10 @@ - return False; - - call_switch_out(ic); -+ xccore->icp = ic; - ic->ic_state &= ~(IC_FOCUS); -- if (! (xccore->xcin_mode & XCIN_SINGLE_IMC)) { -- gui_greq_winmap_change(&(xccore->gui), &(ic->imc->gwin), 0); -- if (ic->input_style == XIMSTY_OverSpot) -- gui_overspot_winmap_change(&(xccore->gui), ic->imc->id, 0); -- } -+ if (! (xccore->xcin_mode & XCIN_SINGLE_IMC)) -+ xccore->gui.winchange |= WIN_CHANGE_FOCUS; - return True; - } - -@@ -537,6 +517,10 @@ - *icid = call_data->icid; - if (! (ic = ic_find(call_data->icid))) - return False; -+ -+ xccore->icp = xccore->ic; -+ xccore->ic = ic; -+ ic->imc->icid = ic->id; - if (call_data->flag == 0) { /* on key */ - /* - * Here, the start of preediting is notified from -@@ -722,7 +706,7 @@ - - if (! (ic = ic_find(call_data->icid))) - return False; -- ic_get_values(ic, call_data); -+ ic_get_values(ic, call_data, xccore); - return True; - } - -@@ -796,7 +780,6 @@ - ret = False; - break; - } -- - if (! (xccore->xcin_mode & XCIN_ICCHECK_OFF)) - check_ic_exist(icid, xccore); - gui_update_winlist(); -@@ -855,18 +838,18 @@ - } - - static void --setup_input_styles(XIMStyles *input_styles, XIMStyle *defaultStyles, int n) -+setup_input_styles(char *style_list, XIMStyles *input_styles) - { -- char *cmd[1], value[256]; -+ static XIMStyle defaultStyles[10]; -+ int n = sizeof(defaultStyles); - -- cmd[0] = "INPUT_STYLE"; -- if (! get_resource(cmd, value, 256, 1)) { -+ if (style_list[0] == '\0') { - defaultStyles[0] = toggle_im_styles("Root"); - input_styles->count_styles = 1; - input_styles->supported_styles = defaultStyles; - } - else { -- char *s=value, word[256]; -+ char *s=style_list, word[256]; - int n_set=0; - - while (get_word(&s, word, 256, NULL)) { -@@ -884,12 +867,10 @@ - } - - void --xim_init(core_config_t *core, xcin_rc_t *xc, char *server_name) -+xim_init(core_config_t *core, xcin_rc_t *xc, inner_rc_t *inner_rc) - { - char transport[128], xim_name[128]; - unsigned int transport_type; -- XIMStyles input_styles; -- XIMStyle defaultStyles[10]; - XIMTriggerKeys on_keys; - XIMEncodings encodings; - -@@ -912,27 +893,29 @@ - else - strcpy(transport, "X/"); - -- setup_input_styles(&input_styles, defaultStyles, sizeof(defaultStyles)); -- -+ setup_input_styles(inner_rc->input_styles, &(xccore->input_styles)); - encodings.count_encodings = sizeof(zhEncodings)/sizeof(XIMEncoding) - 1; - encodings.supported_encodings = zhEncodings; - make_trigger_keys(&on_keys); - -- if (server_name[0] == '\0') { -+ if (inner_rc->xim_name[0] == '\0') { - if (strcasecmp("zh_TW.Big5", xc->locale.lc_ctype)) - sprintf(xim_name, "%s-%s", DEFAULT_XIMNAME, xc->locale.lc_ctype); - else - strncpy(xim_name, DEFAULT_XIMNAME, sizeof(xim_name)); - } -+ else -+ strncpy(xim_name, inner_rc->xim_name, sizeof(xim_name)); -+ - if ((xccore->xcin_mode & XCIN_SINGLE_IMC)) -- xccore->imc = new_IMC(1); -+ xccore->imc = new_IMC(0); - xccore->ims = IMOpenIM(xccore->gui.display, - IMServerWindow, xccore->win->window, - IMModifiers, "Xi18n", - IMServerName, xim_name, - IMLocale, xc->locale.lc_ctype, - IMServerTransport, transport, -- IMInputStyles, &input_styles, -+ IMInputStyles, &(xccore->input_styles), - IMEncodingList, &encodings, - IMProtocolHandler, im_protocol_handler, - IMFilterEventMask, KeyPressMask, -@@ -962,12 +945,15 @@ - { - IMSyncXlibStruct pass_data; - -- xim_disconnect(xccore->ic); - xccore->xcin_mode |= (XCIN_RUN_EXIT | XCIN_ICCHECK_OFF); -- -- pass_data.major_code = XIM_SYNC; -- pass_data.minor_code = 0; -- pass_data.connect_id = xccore->ic->connect_id; -- pass_data.icid = xccore->ic->id; -- IMSyncXlib(xccore->ims, (XPointer)&pass_data); -+ if (xccore->ic) { -+ xim_disconnect(xccore->ic); -+ pass_data.major_code = XIM_SYNC; -+ pass_data.minor_code = 0; -+ pass_data.connect_id = xccore->ic->connect_id; -+ pass_data.icid = xccore->ic->id; -+ IMSyncXlib(xccore->ims, (XPointer)&pass_data); -+ } -+ else -+ exit(0); - } ---- src/xim_IC.c.orig Wed Feb 23 09:47:57 2000 -+++ src/xim_IC.c Mon Mar 6 08:48:06 2000 -@@ -96,8 +96,11 @@ - } - - static void --delete_IC(IC *ic, IC *last, int clear) -+delete_IC(IC *ic, IC *last, core_config_t *xccore) - { -+ int clear = ((xccore->xcin_mode & XCIN_SINGLE_IMC)) ? 0 : 1; -+ ic_rec_t *ic_rec = &(ic->ic_rec); -+ - if (last != NULL) - last->next = ic->next; - else -@@ -105,43 +108,39 @@ - ic->next = free_list; - free_list = ic; - -+ if (xccore->ic == ic) -+ xccore->ic = NULL; -+ if (xccore->icp == ic) -+ xccore->icp = NULL; - /* - * The IC is eventually being deleted, so don't process any IMKEY send back. - */ - call_switch_out(ic); - call_xim_end(ic, 1, clear); -- gui_update_winlist(); -- if (ic->resource_name) -- free(ic->resource_name); -- if (ic->resource_class) -- free(ic->resource_class); -+ xccore->gui.winchange |= WIN_CHANGE_IM; -+ -+ if (ic_rec->pre_attr.base_font) -+ free(ic_rec->pre_attr.base_font); -+#ifdef XIM_COMPLETE -+ if (ic_rec->sts_attr.base_font) -+ free(ic_rec->sts_attr.base_font); -+ if (ic_rec->resource_name) -+ free(ic_rec->resource_name); -+ if (ic_rec->resource_class) -+ free(ic_rec->resource_class); -+#endif -+ - if (clear) { - if (ic->imc->cch) - free(ic->imc->cch); - if (ic->imc->sinmd_keystroke) - free(ic->imc->sinmd_keystroke); -- if (ic->input_style == XIMSTY_OverSpot) -+ if (ic_rec->input_style == XIMSTY_OverSpot) - gui_overspot_destroy(ic->imc->id); - free(ic->imc); - } - } - --static void --check_focus(IC *ic, core_config_t *core) --{ -- Window focus_return; -- int revert_to_return; -- static ubyte_t gotit=0; -- -- if (gotit) -- return; -- XGetInputFocus(core->gui.display, &focus_return, &revert_to_return); -- if (focus_return == ic->focus_win) { -- gotit = 1; -- core->ic = ic; -- } --} -- - - /*---------------------------------------------------------------------------- - -@@ -181,7 +180,6 @@ - ic->imc->inp_num = xccore->default_im; - ic->ic_state |= IC_NEWIC; - ic->imc->inpinfo.imid = (int)(ic->imc->id); -- ic->imc->icid = ic->id; - - ic_set_values(ic, call_data, xccore); - return True; -@@ -194,8 +192,7 @@ - - for (ic=ic_list; ic!=NULL; last=ic, ic=ic->next) { - if (ic->id == call_data->icid) { -- delete_IC(ic, last, !(xccore->xcin_mode & XCIN_SINGLE_IMC)); -- xccore->ic = NULL; -+ delete_IC(ic, last, xccore); - return True; - } - } -@@ -203,14 +200,14 @@ - } - - int --ic_clean_all(CARD16 connect_id, int clear) -+ic_clean_all(CARD16 connect_id, core_config_t *xccore) - { - IC *ic=ic_list, *last=NULL; - int clean_count=0; - - while (ic != NULL) { - if (ic->connect_id == connect_id) { -- delete_IC(ic, last, clear); -+ delete_IC(ic, last, xccore); - ic = (last) ? last->next : ic_list; - clean_count ++; - } -@@ -223,23 +220,26 @@ - } - - void --ic_get_values(IC *ic, IMChangeICStruct *call_data) -+ic_get_values(IC *ic, IMChangeICStruct *call_data, core_config_t *xccore) - { -- XICAttribute *ic_attr = call_data->ic_attr; -+ XICAttribute *ic_attr = call_data->ic_attr; - XICAttribute *pre_attr = call_data->preedit_attr; -+#ifdef XIM_COMPLETE - XICAttribute *sts_attr = call_data->status_attr; -- register int i; -+#endif -+ ic_rec_t *ic_rec = &(ic->ic_rec); -+ register int i; - - for (i=0; i < (int)call_data->ic_attr_num; i++, ic_attr++) { -- if (match (XNFilterEvents, ic_attr)) { /* hardwired XNFilterEvents */ -+ if (match (XNFilterEvents, ic_attr)) { - ic_attr->value = (void *)malloc(sizeof(CARD32)); - ic_attr->value_length = sizeof(CARD32); -- *(CARD32*)ic_attr->value = KeyPressMask|KeyReleaseMask; -+ *(CARD32*)ic_attr->value = KeyPressMask; - } - else if (match (XNInputStyle, ic_attr)) { - ic_attr->value = (void *)malloc(sizeof(INT32)); - ic_attr->value_length = sizeof(INT32); -- *(INT32*)ic_attr->value = ic->input_style; -+ *(INT32*)ic_attr->value = ic_rec->input_style; - } - else if (match (XNSeparatorofNestedList, ic_attr)) { - ic_attr->value = (void *)malloc(sizeof(CARD16)); -@@ -249,29 +249,22 @@ - else { - perr(XCINMSG_WARNING, - "ic_get: unknown IC attr: %s\n", ic_attr->name); -- return; - } - } - -- /* preedit attributes */ - for (i=0; i < (int)call_data->preedit_attr_num; i++, pre_attr++) { - if (match (XNArea, pre_attr)) { - pre_attr->value = (void *)malloc(sizeof(XRectangle)); -- *(XRectangle*)pre_attr->value = ic->pre_attr.area; -+ *(XRectangle*)pre_attr->value = ic_rec->pre_attr.area; - pre_attr->value_length = sizeof(XRectangle); - } -- else if (match (XNAreaNeeded, pre_attr)) { -- pre_attr->value = (void *)malloc(sizeof(XRectangle)); -- *(XRectangle*)pre_attr->value = ic->pre_attr.area_needed; -- pre_attr->value_length = sizeof(XRectangle); -- } - else if (match (XNSpotLocation, pre_attr)) { - pre_attr->value = (void *)malloc(sizeof(XPoint)); -- *(XPoint*)pre_attr->value = ic->pre_attr.spot_location; -+ *(XPoint*)pre_attr->value = ic_rec->pre_attr.spot_location; - pre_attr->value_length = sizeof(XPoint); - } - else if (match (XNFontSet, pre_attr)) { -- CARD16 base_len = (CARD16)strlen(ic->pre_attr.base_font); -+ CARD16 base_len = (CARD16)strlen(ic_rec->pre_attr.base_font); - int total_len = sizeof(CARD16) + (CARD16)base_len; - char *p; - -@@ -279,35 +272,39 @@ - p = (char *)pre_attr->value; - memmove(p, &base_len, sizeof(CARD16)); - p += sizeof(CARD16); -- strncpy(p, ic->pre_attr.base_font, base_len); -+ strncpy(p, ic_rec->pre_attr.base_font, base_len); - pre_attr->value_length = total_len; - } - else if (match (XNForeground, pre_attr)) { - pre_attr->value = (void *)malloc(sizeof(long)); -- *(long*)pre_attr->value = ic->pre_attr.foreground; -+ *(long*)pre_attr->value = xccore->gui.fg_color; - pre_attr->value_length = sizeof(long); - } - else if (match (XNBackground, pre_attr)) { - pre_attr->value = (void *)malloc(sizeof(long)); -- *(long*)pre_attr->value = ic->pre_attr.background; -+ *(long*)pre_attr->value = xccore->gui.bg_color; - pre_attr->value_length = sizeof(long); - } -+ -+#ifdef XIM_COMPLETE -+ else if (match (XNAreaNeeded, pre_attr)) { -+ pre_attr->value = (void *)malloc(sizeof(XRectangle)); -+ *(XRectangle*)pre_attr->value = ic_rec->pre_attr.area_needed; -+ pre_attr->value_length = sizeof(XRectangle); -+ } - else if (match (XNLineSpace, pre_attr)) { - pre_attr->value = (void *)malloc(sizeof(long)); --/* - *(long*)pre_attr->value = ic->pre_attr.line_space; --*/ -- *(long*)pre_attr->value = 18; - pre_attr->value_length = sizeof(long); - } -+#endif - else { - perr(XCINMSG_WARNING, - "ic_get: unknown IC pre_attr: %s\n", ic_attr->name); -- return; - } - } - -- /* status attributes */ -+#ifdef XIM_COMPLETE - for (i = 0; i < (int)call_data->status_attr_num; i++, sts_attr++) { - if (match (XNArea, sts_attr)) { - sts_attr->value = (void *)malloc(sizeof(XRectangle)); -@@ -343,18 +340,15 @@ - } - else if (match (XNLineSpace, sts_attr)) { - sts_attr->value = (void *)malloc(sizeof(long)); --/* - *(long*)sts_attr->value = ic->sts_attr.line_space; --*/ -- *(long*)sts_attr->value = 18; - sts_attr->value_length = sizeof(long); - } - else { - perr(XCINMSG_WARNING, - "ic_get: unknown IC sts_attr: %s\n", ic_attr->name); -- return; - } - } -+#endif - return; - } - -@@ -362,51 +356,57 @@ - ic_set_values(IC *ic, IMChangeICStruct *call_data, core_config_t *xccore) - /* For details, see Xlib Ref, Chap 11.6 */ - { -- XICAttribute *ic_attr = call_data->ic_attr; -+ XICAttribute *ic_attr = call_data->ic_attr; - XICAttribute *pre_attr = call_data->preedit_attr; -+#ifdef XIM_COMPLETE - XICAttribute *sts_attr = call_data->status_attr; -- register int i; -+#endif -+ ic_rec_t *ic_rec = &(ic->ic_rec); -+ register int i; - - for (i=0; i < (int)(call_data->ic_attr_num); i++, ic_attr++) { - if (match (XNInputStyle, ic_attr)) { -- ic->input_style = *((INT32 *)ic_attr->value); --/* -- if (ic->input_style != (XIMPreeditNothing|XIMStatusNothing)) { -+ int j; -+ ic_rec->input_style = *((INT32 *)ic_attr->value); -+ -+ for (j=0; j < xccore->input_styles.count_styles && -+ ic_rec->input_style != -+ xccore->input_styles.supported_styles[j]; j++); -+ if (j >= xccore->input_styles.count_styles) { - perr(XCINMSG_WARNING, -- "XNInputStyle: only PreeditNothing|XIMStatusNothing " -- "mode implemented.\n"); -- ic->input_style = XIMPreeditNothing|XIMStatusNothing; -- } --*/ -+ "client input style not enabled, set to \"Root\".\n"); -+ ic_rec->input_style = XIMSTY_Root; -+ } - } - else if (match (XNClientWindow, ic_attr)) -- ic->client_win = *(Window *)ic_attr->value; -- else if (match (XNFocusWindow, ic_attr)) { -- ic->focus_win = *(Window *)ic_attr->value; -- check_focus(ic, xccore); -- } -+ ic_rec->client_win = *(Window *)ic_attr->value; -+ else if (match (XNFocusWindow, ic_attr)) -+ ic_rec->focus_win = *(Window *)ic_attr->value; -+#ifdef XIM_COMPLETE - else if (match (XNResourceName, ic_attr)) - ic->resource_name = strdup((char *)ic_attr->value); - else if (match (XNResourceClass, ic_attr)) - ic->resource_class = strdup((char *)ic_attr->value); -+#endif - else - perr(XCINMSG_WARNING, - "ic_set: unknown IC attr: %s\n", ic_attr->name); - } - - for (i=0; i < (int)(call_data->preedit_attr_num); i++, pre_attr++) { -- if (match (XNArea, pre_attr)) { -- ic->pre_attr.area.x = (*(XRectangle *)pre_attr->value).x; -- ic->pre_attr.area.y = (*(XRectangle *)pre_attr->value).y; -- ic->pre_attr.area.width = (*(XRectangle *)pre_attr->value).width; -- ic->pre_attr.area.height = (*(XRectangle *)pre_attr->value).height; -- } -+ if (match (XNArea, pre_attr)) -+ ic_rec->pre_attr.area = *(XRectangle *)pre_attr->value; -+ else if (match (XNSpotLocation, pre_attr)) -+ ic_rec->pre_attr.spot_location = *(XPoint *)pre_attr->value; -+ else if (match (XNFontSet, pre_attr)) { -+ if (ic_rec->pre_attr.base_font != NULL) -+ XFree(ic_rec->pre_attr.base_font); -+ ic_rec->pre_attr.base_font = strdup(pre_attr->value); -+ } -+ -+#ifdef XIM_COMPLETE - else if (match (XNAreaNeeded, pre_attr)) - ic->pre_attr.area_needed = *(XRectangle *)pre_attr->value; -- else if (match (XNSpotLocation, pre_attr)) { -- ic->pre_attr.spot_location.x = (*(XPoint *)pre_attr->value).x; -- ic->pre_attr.spot_location.y = (*(XPoint *)pre_attr->value).y; -- } - else if (match (XNColormap, pre_attr)) - ic->pre_attr.cmap = *(Colormap *)pre_attr->value; - else if (match (XNStdColormap, pre_attr)) -@@ -417,23 +417,17 @@ - ic->pre_attr.background = *(CARD32 *)pre_attr->value; - else if (match (XNBackgroundPixmap, pre_attr)) - ic->pre_attr.bg_pixmap = *(Pixmap *)pre_attr->value; -- else if (match (XNFontSet, pre_attr)) { -- if (ic->pre_attr.base_font != NULL) { -- if (match (ic->pre_attr.base_font, pre_attr)) -- continue; -- XFree(ic->pre_attr.base_font); -- } -- ic->pre_attr.base_font = strdup(pre_attr->value); -- } - else if (match (XNLineSpace, pre_attr)) - ic->pre_attr.line_space = *(CARD32 *)pre_attr->value; - else if (match (XNCursor, pre_attr)) - ic->pre_attr.cursor = *(Cursor *)pre_attr->value; - else - perr(XCINMSG_WARNING, -- "ic_set: unknown IC pre_attr: %s\n", ic_attr->name); -+ "ic_set: unknown IC pre_attr: %s\n", pre_attr->name); -+#endif - } -- -+ -+#ifdef XIM_COMPLETE - for (i=0; i < (int)(call_data->status_attr_num); i++, sts_attr++) { - if (match (XNArea, sts_attr)) - ic->sts_attr.area = *(XRectangle *)sts_attr->value; -@@ -464,8 +458,9 @@ - ic->sts_attr.cursor = *(Cursor *)sts_attr->value; - else - perr(XCINMSG_WARNING, -- "ic_set: unknown IC sts_attr: %s\n", ic_attr->name); -+ "ic_set: unknown IC sts_attr: %s\n", sts_attr->name); - } -+#endif - } - - /*--------------------------------------------------------------------------- -@@ -519,22 +514,24 @@ - - if (ic == ref_ic) - ic->exec_time = current_time; -- else if (ic->focus_win && ic->focus_win == ref_ic->focus_win) -+ else if (ic->ic_rec.focus_win && -+ ic->ic_rec.focus_win == ref_ic->ic_rec.focus_win) - delete = 1; - else if (current_time - ic->exec_time > IC_IDLE_TIME && -- ic->client_win != 0) { -+ ic->ic_rec.client_win != 0) { - DebugLog("Check IC: id=%d, window=0x%x, exec_time=%d.\n", - ic->id, (unsigned int)ic->client_win, (int)ic->exec_time); - ic->exec_time = current_time; -- XGetGeometry(xccore->gui.display, ic->client_win, -+ XGetGeometry(xccore->gui.display, ic->ic_rec.client_win, - &root, &x, &y, &width, &height, &bw, &depth); - XSync(xccore->gui.display, False); - } - - if (delete) { - DebugLog("Delete IC: id=%d, window=0x%x, exec_time=%d.\n", -- ic->id, (unsigned int)ic->client_win, (int)ic->exec_time); -- delete_IC(ic, last, !(xccore->xcin_mode & XCIN_SINGLE_IMC)); -+ ic->id, (unsigned int)ic->ic_rec.client_win, -+ (int)ic->exec_time); -+ delete_IC(ic, last, xccore); - ic = (last) ? last->next : ic_list; - } - else { diff --git a/chinese/xcin25/pkg-plist b/chinese/xcin25/pkg-plist index c1156b7..f1ce175 100644 --- a/chinese/xcin25/pkg-plist +++ b/chinese/xcin25/pkg-plist @@ -28,6 +28,8 @@ lib/X11/xcin25/doc/modules/im_comm lib/X11/xcin25/doc/modules/zh_hex lib/X11/xcin25/tab/zh_TW.Big5/array30.cin lib/X11/xcin25/tab/zh_TW.Big5/array30.tab +lib/X11/xcin25/tab/zh_TW.Big5/bims_pinyin.cin +lib/X11/xcin25/tab/zh_TW.Big5/bims_pinyin.tab lib/X11/xcin25/tab/zh_TW.Big5/cantonese.cin lib/X11/xcin25/tab/zh_TW.Big5/cantonese.tab lib/X11/xcin25/tab/zh_TW.Big5/cj.cin |