
MODULE 'afc/tasker',
       'afc/explain_exception',
       'intuition/intuition',
       'exec/ports',
       'exec/memory',
       'exec/nodes',
       'graphics/rastport'


OBJECT mymsg
  mnode:mn
  cod:LONG
  num:LONG
ENDOBJECT

ENUM COD_MYMSG, COD_REPLYMYMSG

DEF dsquare:PTR TO tasker, dcircle:PTR TO tasker, dcwin:PTR TO window

PROC drawsquare() HANDLE
  DEF win=NIL:PTR TO window, rp:PTR TO rastport, col=0, mysig, sigs
  DEF quit=FALSE, msg=NIL:PTR TO mymsg, pp:PTR TO mp
  DEF x,y,w,h

  geta4()

  dsquare.buildport()
  win:=OpenWindowTagList(NIL,[WA_TOP,0,
                              WA_LEFT,0,
                              WA_WIDTH,320,
                              WA_HEIGHT,200,
                              WA_TITLE,'Draw rectangles',
                              WA_FLAGS,WFLG_DRAGBAR OR WFLG_DEPTHGADGET,
                              NIL,NIL])
  IF win=NIL THEN Raise("WIN")
  rp:=win.rport
  pp:=dsquare.port()
  mysig:=Shl(1,pp.sigbit)

  REPEAT
    sigs:=SetSignal(0,mysig)
    IF (sigs AND mysig)
      WHILE (msg:=GetMsg(dsquare.port()))<>NIL
        IF msg.cod=COD_MYMSG
          IF msg.num=-1 THEN quit:=TRUE
          msg.cod:=COD_REPLYMYMSG
        ENDIF
        ReplyMsg(msg)
      ENDWHILE
    ENDIF

    x:=Rnd(290)+10
    y:=Rnd(140)+12
    w:=Rnd(100)
    h:=Rnd(100)
    col:=Rnd(8)
    IF (x+w)>310 THEN w:=310-x
    IF (y+h)>190 THEN h:=190-y
    SetAPen(rp,col)
    RectFill(rp,x,y,x+w,y+h)
  UNTIL quit=TRUE

EXCEPT DO
  IF win THEN CloseWindow(win)
  dsquare.endport()
ENDPROC

PROC drawcircle()
  DEF rp:PTR TO rastport
  DEF x,y,r,col

  geta4()

  dcwin:=OpenWindowTagList(NIL,[WA_TOP,0,
                                WA_LEFT,320,
                                WA_WIDTH,320,
                                WA_HEIGHT,200,
                                WA_TITLE,'Draw circles',
                                WA_FLAGS,WFLG_DRAGBAR OR WFLG_DEPTHGADGET,
                                NIL,NIL])
  IF dcwin=NIL THEN Raise("WIN")
  rp:=dcwin.rport

  LOOP
    x:=Rnd(290)+10
    y:=Rnd(140)+32
    r:=Rnd(20)
    col:=Rnd(8)
    SetAPen(rp,col)
    DrawEllipse(rp,x,y,r,r)
  ENDLOOP
ENDPROC


PROC main() HANDLE
  DEF quit=0, msg=NIL:PTR TO mymsg, mainport=NIL:PTR TO mp
  DEF mainw=NIL:PTR TO window, mes=NIL:PTR TO mymsg, up:PTR TO mp
  DEF upsig, msig, ssig, imsg:PTR TO intuimessage

  storea4()

  mainw:=OpenWindowTagList(NIL,[WA_TOP,200,
                                WA_LEFT,0,
                                WA_WIDTH,640,
                                WA_HEIGHT,56,
                                WA_TITLE,'Tasker tutorial: press close gadget TO quit',
                                WA_FLAGS,WFLG_DRAGBAR OR WFLG_DEPTHGADGET OR WFLG_CLOSEGADGET OR WFLG_ACTIVATE,
                                WA_IDCMP,IDCMP_CLOSEWINDOW,
                                NIL,NIL])
  IF mainw=NIL THEN Raise("WIN")
  up:=mainw.userport
  upsig:=Shl(1,up.sigbit)

  NEW dsquare.tasker('DrawSquare',FALSE)
  dsquare.code({drawsquare})
  NEW dcircle.tasker('DrawCircle')
  dcircle.code({drawcircle})

  mainport:=buildPort()
  IF mainport=NIL THEN Raise("PORT")
  msig:=Shl(1,mainport.sigbit)

  dsquare.start()
  dcircle.start()

  NEW mes
  setupMsg(mes, SIZEOF mymsg, mainport)

  REPEAT
    ssig:=Wait(upsig OR msig)
    IF (ssig AND upsig)
      WHILE (imsg:=GetMsg(up))<>NIL
        IF imsg.class=IDCMP_CLOSEWINDOW
          mes.cod:=COD_MYMSG
          mes.num:=-1
          dsquare.send(mes)
        ENDIF
        ReplyMsg(imsg)
      ENDWHILE
    ELSE
      WHILE (msg:=GetMsg(mainport))<>NIL
        IF msg.cod=COD_REPLYMYMSG
          IF msg.num=-1 THEN quit:=TRUE
        ELSE
          ReplyMsg(msg)
        ENDIF
      ENDWHILE
    ENDIF
  UNTIL quit=TRUE

EXCEPT DO
  IF mainport THEN endPort(mainport)
  IF dcwin THEN CloseWindow(dcwin)
  IF mainw THEN CloseWindow(mainw)
  IF dsquare THEN END dsquare
  IF dcircle THEN END dcircle
  IF mes THEN END mes
  explain_exception()
ENDPROC

