[thhsieh: IMdkit problem on OverTheSpot]
----- Forwarded message from thhsieh -----
Date: Tue, 1 Feb 2000 23:52:29 +0800
From: thhsieh
To: xcin@linux.org.tw
Subject: IMdkit problem on OverTheSpot
X-Mailer: Mutt 1.0pre3us
Hi, 各位:
几天前有一位 Peter Hung <peter@wahoo.com.tw> 网友告诉我说
IMdkit (或说 xcin-2.5) 在使用 OverTheSpot input style
(XIMPreeditPosition| XIMStatusNothing) 时会有问题。目前
xcin-2.5 是只有支援 Root input style
(XIMPreeditNothing | XIMStatusNothing), 但实际上 IMdkit
并没有这些限制,因此我稍微修改了 xcin-2.5 的程式,让它也
可以接受 OverTheSpot 来进行测试,结果发现真的有问题。
若有兴趣的朋友可以帮忙试看看,不过在试之前您需要修改一下
xcin-2.5 的原始码,我的修改如下:
1. xim.c: 找到 defaultStyles 的地方,改成这样:
static XIMStyle defaultStyles[] = {
XIMPreeditNothing|XIMStatusNothing, /* Root */
XIMPreeditPosition|XIMStatusNothing, /* Over-the-Spot */
0
};
2. xim_IC.c: 找到 ic_set_value_by_name() 内的 XNInputStyle 地方,
改成这样:
if (match (XNInputStyle, ic_attr)) {
rec->input_style = *((INT32 *)ic_attr->value);
/*
if (rec->input_style != (XIMPreeditNothing|XIMStatusNothing)) {
perr(XCINMSG_WARNING,
"XNInputStyle: only PreeditNothing|XIMStatusNothing "
"mode implemented.\n");
rec->input_style = XIMPreeditNothing|XIMStatusNothing;
}
*/
}
这样的改法可能不完整,但至少已能做出步的测试。您可以直接用 rxvt-2.7.2
来做测试,在执行 xcin 后,再执行 rxvt:
rxvt -pt Root -im xcin ..... (Root input style)
rxvt -pt OverTheSpot -im xcin ..... (OverTheSpot input style)
您会发现,只有 Root style 可以正常使用,而 OverTheSpot 则不行。我 trace
了部分的 IMdkit source, 在 i18nPtHdr.c, _Xi18nMessageHandler() 函式里,
正常情况下其 event flow 如下:
-- XIM_CONNECT
-- XIM_OPEN
-- XIM_QUERY_EXTENSION
-- XIM_ENCODING_NEGOTIATION
-- XIM_CLOSE
-- XIM_DISCONNECT
-- XIM_CONNECT
-- XIM_OPEN
-- XIM_QUERY_EXTENSION
-- XIM_ENCODING_NEGOTIATION
-- XIM_GET_IM_VALUES
-- XIM_CREATE_IC
但如果使用了 OverTheSpot style 时,上头的 flow 执行到了 XIM_GET_IM_VALUES
之后,就不再 XIM_CREATE_IC, 而直接到到 XIM_CLOSE, XIM_DISCONNECT 了。因此
连线就失败了。
再来看看 rxvt 的 source: command.c, IMInstantiateCallback():
/* try with no modifiers base */
if (xim == NULL && (p = XSetLocaleModifiers("@im=none")) != NULL && *p)
xim = XOpenIM(Xdisplay, NULL, NULL, NULL);
if (xim == NULL)
return;
XSetIMValues(xim, XNDestroyCallback, &ximcallback, NULL);
if (XGetIMValues(xim, XNQueryInputStyle, &xim_styles, NULL)
|| !xim_styles) {
print_error("input method doesn't support any style");
XCloseIM(xim);
return;
}
当它执行到 XGetIMValues 时,正是 IMdkit 执行到 XIM_GET_IM_VALUES 那边,
而接下来 rxvt 就会尝试 create IC:
Input_Context = XCreateIC(xim, XNInputStyle, input_style,
XNClientWindow, TermWin.parent[0],
XNFocusWindow, TermWin.parent[0],
XNDestroyCallback, &ximcallback,
preedit_attr ? XNPreeditAttributes : NULL,
preedit_attr,
status_attr ? XNStatusAttributes : NULL,
status_attr,
NULL);
如果 input_style 是 Root style 的话,就没问题,可以顺利执行下去。但如
果是 OverTheSpot, 结果是 IMdkit 那边会完全收不到来自 Xlib 的讯号,也
就无法进行 create IC 的动作,而在此同时, Xlib 直接传回 NULL 给 rxvt,
因此最后上头的 Input_Context 的结果就是 NULL, 于是 rxvt 接着就执行:
if (Input_Context == NULL) {
print_error("Failed to create input context");
XCloseIM(xim);
}
换句话说,当 input_style 不是 Root style 时,在 XCreateIC 的 Xlib 那
一关就挂了,问题有可能是出在 Xlib。
我是使用 XFree86-3.3.6 来做测试的。跟据 Peter Hung 的说明,在 3.3.5 也
有类似的问题,但在 3.9.X 上就没这问题了 (XFree86-3.3.X = X11R6.3,
XFree86-3.9.X = X11R6.4?)。但我很纳闷的是,我听说日本的朋友多半是使用
非 Root input-style 的,当然他们的 XIM server 并不是使用 IMdkit, 而且
他们似乎也还在使用 XFree86-3.X, 似乎也没听说有类似的问题,因此我在担心
这样的问题可能不单纯,说不定 IMdkit 也有 bug, 故在此 post 出来想与大家
讨论 (希望有人能与我讨论 :-))
如果这只是纯粹 Xlib 的问题,那也许我就暂时先不管了,反正就等着大家将
来换到 XFree86-4.0 以后,似乎就可以水到渠成了 :-))
T.H.Hsieh
----- End forwarded message -----
--
[ This mail was originally sent to debian-chinese@lists.debian.org ]
[ and was forwarded to this list automatically. Big5 characters are ]
[ also converted to GB at the same time, Please note that there may ]
[ be errors during the conversion as this is not done by a human! ]
Reply to: