summaryrefslogtreecommitdiff
path: root/chinese/xcin25
diff options
context:
space:
mode:
authorVanilla I. Shu <vanilla@FreeBSD.org>2000-04-24 06:25:50 +0000
committerVanilla I. Shu <vanilla@FreeBSD.org>2000-04-24 06:25:50 +0000
commitbaa192293d33bc99d05be5429cf233c321770ec7 (patch)
treef48933e64190613e0648d538331bc8396a37b1ff /chinese/xcin25
parentAdd p5-Net-ext, a set of Perl5 modules for using sockets with. (diff)
Upgrade to 2.5.2p3
Submitted by: maintainer
Notes
Notes: svn path=/head/; revision=27946
Diffstat (limited to 'chinese/xcin25')
-rw-r--r--chinese/xcin25/Makefile8
-rw-r--r--chinese/xcin25/distinfo2
-rw-r--r--chinese/xcin25/files/patch-af2156
-rw-r--r--chinese/xcin25/pkg-plist2
4 files changed, 8 insertions, 2160 deletions
diff --git a/chinese/xcin25/Makefile b/chinese/xcin25/Makefile
index 81e92c8bfeee..f07ec39a29e9 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 273d9dd460c8..e2939418d981 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 108e6a6aab47..000000000000
--- 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 c1156b78fc65..f1ce1752a5e3 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