2008年4月22日火曜日

OnPaint on wxWidgets/wxPython その2

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
適当なページを見つけることに失敗したので、sourceを読むことにした。
ぜんぜんとり終わらないw。

documentのなかにあるページでは足りないのですよ。

あ、ちなみに環境はこうです。

wxMac on Mac OS X 10.5.2

wx.PlatfromInfo =
('__WXMAC__',
'wxMac',
'unicode',
'wx-assertions-on',
'SWIG-1.3.29',
'mac-cg',
'mac-native-tb')
Yakumo:~ nori$ uname -a
Darwin Yakumo 9.2.2 Darwin Kernel Version 9.2.2: Tue Mar 4 21:17:34 PST 2008; root:xnu-1228.4.31~1/RELEASE_I386 i386


wxGTK on Centos5.1

wx.PlatfromInfo
('__WXGTK__', 'wxGTK', 'unicode', 'gtk2', 'wx-assertions-on', 'SWIG-1.3.29')
[nori@Asama]~% uname -a
Linux Asama 2.6.18-53.1.4-eth-3w-dvd #5 SMP Fri Dec 21 19:15:40 JST 2007 x86_64 x86_64 x86_64 GNU/Linux


どう調べたか?
  • wxEventが interface/event.hで宣言定義されている。
  • wxPaintEvent, wxEraseEventが/src/common/event.cppで出現
  • src/mac/event.cppでmacのevent loopがwxのevent loopにmapされている。
    appleのドキュメント、Carbonのevent loopがRunApplicationEventLoopをgoogleすると引っかかる。

    で、CarbonのAPIを呼ぶこととwxEventLoopActivatorをスタック上に生成する以外はwxGUIEventLoop::Run()の中でやっていないので、wxEventLoopActivatorを探してみたがいまいち役に立たず。

  • void wxWindowMac::OnEraseBackground(wxEraseEvent& event) @ src/mac/carbon/window.cppを見るとMacのwindowとwxのwindowでeventのmappingをしているように読める。気づいてしまえばどうということはない。

  • bool wxWindowMac::MacDoRedraw( void* updatergnr , long time ) @ src/mac/carbon/window.cpp
    たぶんこれが本質。MacのDoRedrawはなにものか?

  • void wxWindowMac::OnPaint( wxPaintEvent & WXUNUSED(event) ) @ src/mac/carbon/window.cpp
    PlatformのPaintHanderを呼び出すコード。OnPaintがOverrideされなかった場合に実行される。あまり重要でない。

  • static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handler , EventRef event , void *data ) @ src/mac/carbon/window.cpp
    mappingをしている本体。case kEventControlDrawの部分を読み解けばCarbon Macのdraw要求がwxのPaintにどう変換されるわかるはず。この関数はDoRedrawをgrepして発見。
    あとはCarbonのAPIリファレンスかなんかを拾ってきてkEventControlDrawが飛んでくる条件がわかればよさげ。

    Carbon Event Manager Reference @ developer.apple.com、これですな。


    kEventControlDraw

    Sent when your control should draw itself. The event can optionally contain parameters indicating which port to draw into and which part to constrain drawing to. (Mac OS X only)

    Available in Mac OS X v10.0 and later.

    Declared in CarbonEvents.h

    だそうだ。
    HIViewも理解しないといけない。まあタスクレベルに落ちたのでハッピーですね。GTKでも同じ作業すれば終わり。まあソースでの位置を探すのは簡単だが。
  • 0 件のコメント: