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