[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[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: