mirror of
https://git.FreeBSD.org/ports.git
synced 2024-11-04 22:33:27 +00:00
2157 lines
71 KiB
Plaintext
2157 lines
71 KiB
Plaintext
--- 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 {
|