[SML 7914] Re: Squeak/Pharoの低レベルGUIのしくみ?
Yoshiki Ohshima
yoshiki @ vpri.org
2011年 4月 15日 (金) 04:26:29 JST
At Thu, 14 Apr 2011 15:25:43 +0900,
Hiroki Horiuchi wrote:
>
> こんにちは。
>
> Squeak/Pharoの、低レベルGUIのしくみに興味があります。それで手持ちの環境(
> Pharo 1.2.1 + Debian GNU/Linux)でxtrace(1)を使って外から調べました。
>
> リクエストに関しては、最初の方でCreateWindowが2回だけ行われたあとは、
> PutImageが盛んに行われていることがわかりました。このPutImageがどういった
> 経緯で呼ばれているのかがわかれば、低レベルGUIの出力方面については、かな
> り調べられると思うのですが、その経緯の見当がまったくつきません。
>
> 一方、イベントについては、これらがどのように処理されているのか、まったく
> わかりません。
>
> これらの不明点について、ヒントをいただけませんか? よろしくお願いします。
> --
> 堀内寛己(ほりうちひろき)
面白いですね。ただ、xtraceでみるというのは、脳の高次機能を電極を指し
て局所的に見るようなもので、全体像はわかりにくいとは思います(私もその
手のことはよくしていたこともあります)。
走っているSmalltalk側から調べるのであれば、Pharoの場合"Settings" の
"Debugging"の中から、"Flash damaged morphic region"のフラグをオンにして
使ってみると、画面上で書き直しを必要とするリージョンがちかちかと反転し
て見えるようになります。基本的にはそこがそのままPutImageならPutImage の
呼び出しにつながります。
System Browserを開いてDisplayScreenの
#primShowRectLeft:right:top:bottom:メソッドを見ると、中に<primitive:
127>と書いてあって、このメソッドが呼ばれたときにはプリミティブ関数127
番が呼ばれることになっています。これが(生成されたコードの)
http://squeakvm.org/cgi-bin/viewcvs.cgi/trunk/platforms/unix/src/vm/interp.c?rev=2353&view=auto
にある void *primitiveTable[577]から検索されて、
primitiveShowDisplayRectが見つかり、その後いくつかの関数呼び出しを経て
http://squeakvm.org/cgi-bin/viewcvs.cgi/trunk/platforms/unix/vm-display-X11/sqUnixX11.c?rev=2375&view=auto
のdisplay_ioShowDisplay()にたどり着き、そこでPutImage()が呼ばれている
と思います。
ですが、鍵はioShowDisplay()はSmalltalk側の
#primShowRectLeft:right:top:bottom:(および
#primRetryShowRectLeft:right:top:bottom:)を渡ってきた引数ごと1対1 にサ
ポートするだけであって、#primShowRectLeft:right:top:bottom:の呼ばれるパ
ターンがわかればすべてがわかるということだと思います。たとえば、
xtraceが走っている状態で、
1 to: 10 do: [:i |
Display forceToScreen: (0 @ 0 corner: i @ i * 10)]
のような式をワークスペースで実行すると、(たぶん)10回のPutImage呼び出し
が観測されると思います。
そして、GUIフレームワークというのは
while (1) {
ユーザーのイベントを処理する();
タイミングに関係するイベントを処理する();
画面を書き換える();
}
というだけのことなのですが、WorldState>>doOneCycleNowFor:にまさにそれだけの
ことが書いてあります(#displayWorldSafely:からforceToScreen:にたどり着く
までにもまた少しいろいろと呼び出しはありますが)。
-- Yoshiki
SML メーリングリストの案内