[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[debian-devel:09978] Re: XIM segv err (Re: 3.3.4 ready)
佐野@浜松です。
XFree86 の ML に真鍋さんが投げたパッチの件で、しばらく真鍋さんと
私信でメールのやり取りをしていたのですが、例の
> 例えば XMODIFIERS="@im=kinput2" emacs & とすると、 Shift-Space で kinput2 の
> 変換窓が開いてしまい、そのウィンドウをマウスで閉じて kinput2 を終了させると
> mule or emacs も落ちる、という現象が起きるのですが、これは Emacs/Mule のほう
> の問題なのかもしれません。なお skkinput でも同様のようです。
という問題について、解決のヒントを頂いたのでこちらにも回覧します。
なお真鍋さんから回覧の了解は頂いてます。ただし、
「ただ、quick hack なので、「それは違う」とかっていじめられると困りますが ^_^;」
ということなんで、御了承ください。
# 誰かパッチ書いてテストしてくれる人がいることを期待しつつ、、、
In <19990731181658O.manabe@xxxxxxxxx>,
at Date: Sat, 31 Jul 1999 18:16:58 +0900,
on Subject: Re: XIM segv err (Re: 3.3.4 ready),
manabe@xxxxxxxxx writes:
> こんにちは、真鍋@浦安です。
>
> From: manabe@xxxxxxxxx
> Subject: Re: XIM segv err (Re: 3.3.4 ready)
> Date: Thu, 29 Jul 1999 08:51:25 +0900
>
> > 確認しました。emacs 側の実装不足の可能性もあります。以前に
> > XIM クライアントになるようなプログラムを書いた時にサーバの
> > 有無のチェックを怠るとこうなりました。
>
> XOpenIM, XCreateIC の戻り値(im, ic)を管理するのは
> アプリケーションですが、kinput2 が終了させられると
> Xlib 内で勝手に im, ic を片付けてしまう(つまり、im, ic
> の領域を free してしまう)のです。
>
> アプリケーションはそうとは知らずに im, ic を使おうとして
> free した領域にアクセスして...
>
> XIM 側の仕様(?)に従うならば、
>
> アプリケーションが XOpenIM, XCreateIC の際に必ず
> destroy callback を用意する
>
> ことにより回避できると思います。例えば、xterm ならば、
> 以下のパッチがあれば segv を回避できます:
>
> - - -
> diff -u xterm/charproc.c xterm/charproc.c
> --- xterm/charproc.c Sat Jul 31 10:07:48 1999
> +++ xterm/charproc.c Sat Jul 31 18:06:40 1999
> @@ -4110,6 +4110,11 @@
> }
>
> #if OPT_I18N_SUPPORT && OPT_INPUT_METHOD
> +static void DestroyCallback(XIC ic, XPointer client_data, XPointer call_data)
> +{
> + term->screen.xic = NULL;
> +}
> +
> static void VTInitI18N(void)
> {
> unsigned i;
> @@ -4122,6 +4127,7 @@
> XIM xim = (XIM) NULL;
> XIMStyles *xim_styles;
> XIMStyle input_style = 0;
> + XICCallback xic_callback;
> Boolean found;
>
> term->screen.xic = NULL;
> @@ -4223,9 +4229,12 @@
> return;
> }
>
> + xic_callback.client_data = 0;
> + xic_callback.callback = DestroyCallback;
> term->screen.xic = XCreateIC(xim, XNInputStyle, input_style,
> XNClientWindow, term->core.window,
> XNFocusWindow, term->core.window,
> + XNDestroyCallback, &xic_callback,
> NULL);
>
> if (!term->screen.xic) {
> - - -
>
> emacs でも同じようなコードがあると思います。
> ----- manabe@xxxxxxxxxx
--
Taketoshi Sano: <kgh12351@xxxxxxxxxxx>,<sano@debian.or.jp>