やすしです。


From: Kazuhiro Yoshida <moriq.kazuhiro / nifty.ne.jp>
Subject: [ruby-ext:00736] Re: Xlib: expose event
Date: Thu, 16 Dec 1999 23:14:16 +0900

> >sample/diamond-event.rbを試しただけなんですが、closeすると coreを吐いた
> >り expose eventで、exposeされた領域以外が真っ黒になったりしてるのですが、
> >これってうちの環境のせいでしょうか?
> 
> ふむぅ。
> Xlib::Display.visuals の free で落ちてるわけですか。
> 困った。手元で再現できない。
> # お使いの Ruby/Xlib は ruby-xlib-0.6.8.tar.gz ですよね?

です。

> display.c:166 xlib_display_get_visuals() において
> --
>   t_visual *vinfa, vinfo;
>   ...
>   vinfa = XGetVisualInfo( ... );
>   ary = rb_ary_new2(num);
>   for (i=0; i<num; i++) {
>     visual = Data_Wrap_Struct(cXlib_visual, 0, xlib_visual_free,
>       &vinfa[i] );
>   }
> --
> というふうになってるんですが,この vinfa[i] は X によって
> 開放されないなずなんです。理由は man XGetVisualInfo(3X11) に
>   To free the data returned by this function, use XFree.
> って書いてあるから。

たぶん、XFree()に渡すのは、vinfa[i]じゃなくて、vinfaかと‥。
と、思って testしたら、xlib_visual_free()の 2回目で落ちます。

> expose event で expose された領域以外が真っ黒になるときの
> 領域以外というのはどの部分のことですか?

たとえば、diamond-event.rbで描画された windowの一部を他の windowで隠しま
すよね。で、diamond-event.rbの windowを 「上」に持ってくると expose
eventが起ると思います。このとき、他の windowに隠されていた部分だけが、元
通りに描画されて、隠れていなかった部分は黒く塗り潰されます。

> 黒くなるのは,expose されると window の全領域がWindow.background で指
> 定した色で clear されるからです。これは Xlib の仕様だと思われます。
> # だから Pixmap に描画して copy_area win しないといけない。

えっと、これは、expose eventを受けると一度 黒く塗り潰されてから
copy_areaするってことですか?

とすると、copy_areaのタイミングの問題?
# diamond-eventは、(exposed)と一度しか書かないから。
--
         yashi