2012-06-25 3 views
1

Gtk2Hs 바인딩을 사용하는 작은 Haskell 프로그램이 있습니다. 하나는 DrawingArea을 클릭하여 프로그램의 창에서 점 (작은 사각형)을 그릴 수 있습니다 :Gtk2H에서 EventM은 어떻게 작동합니까?

[...] 
    image <- builderGetObject gui castToDrawingArea "drawingarea" 
    p <- widgetGetDrawWindow image 
    gc <- gcNewWithValues p (newGCValues { foreground = Color 0 0 0, 
     function = Copy }) 
    on image buttonPressEvent (point p gc) 
    set image [ widgetCanFocus := True ] 
[...] 

point :: DrawWindow -> GC -> EventM EButton Bool 
point p gc = tryEvent $ do 
    (x', y') <- eventCoordinates 
    liftIO $ do 
     let x = round x' 
     let y = round y' 
     let relx = x `div` 4 
     let rely = y `div` 4 
     gcval <- gcGetValues gc 
     gcSetValues gc (newGCValues { function = Invert }) 
     drawRectangle p gc True (relx * 4) (rely * 4) 4 4 
     gcSetValues gc gcval 

시행 착오 방법을 통해 Hackage에서 문서를 읽은 후, 나는에 버튼을 눌러 이벤트를 추가 할 관리 그리기 영역은 위젯이 기본적으로이 이벤트에 대한 신호를 제공하지 않기 때문에 그러나 EventM의 정의와 사용법을 이해할 수 없으므로 새 이벤트를 위젯에 다시 추가해야하는 경우 EventM 모나드와 고민해야합니다. 나는 아직도 하스켈에서 충분히 능숙하지 못하다고 말한다. 나는 단순한 모나드가 작동하는 방법을 다소 이해하지만,이 하나의 "EventM t a = ReaderT (Ptr t) IO a"(Graphics.UI.Gtk.Gdk.EventM에 정의 됨)는 나에게 미스터 보인다.

제 질문은 : 누군가 EventM 모나드의 내부를 설명해 주시겠습니까? 예를 들어 "buttonPressEvent :: WidgetClass self => 신호 자체 (EventM EButton Bool)"의 경우입니다.

답변

1

비슷한 문제로 스택되어 있는데, EventM이 EBT를 읽고 Bool을 반환하는 ReadT 인 것처럼 보입니다.

+0

따라서 일부 상태는 ReaderT 모나드를 사용하여 암시 적으로 신호 처리기로 전달됩니다. 그렇습니까? 나는 이것을 이해하기 시작하고 있다고 생각합니다. Gtk2Hs 신호 처리 규칙이 일관성이없는 것 같습니다. –

+0

나는 이렇게 생각한다. "모든 사건은 EventM 모나드의 기능을 통해 접근 할 수있는 추가적인 정보를 담고있다." 그래서 저는 국가가 암묵적으로 전달 될 것이라고 생각합니다. EventM은 이벤트의 정보에 액세스하는 데 사용됩니다. – realli