[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 メーリングリストの案内