REM >Director:Menus.DoClose

ON ERROR: ON ERROR OFF: ERROR ERR,REPORT$+" at "+STR$ ERL

buffer_size%=1023
DIM buffer% buffer_size%
SYS "OS_GetEnv" TO comm%
SYS "OS_ReadArgs",",quit,do/a/k,window,",comm%,buffer%,1023
do$=FNlcase(FNstring(buffer%!8))
arg$=FNlcase(FNstring(buffer%!12))

REM Read in the Window and Icon handles from the environment
window%=FNreadeval("Director$Window")
icon%=FNreadeval("Director$Icon")

a%=INSTR(do$,"#")
IF a%>0 THEN
  window%=VAL(MID$(do$,a%+1))
  do$=LEFT$(do$,a%-1)
  CASE do$ OF
    WHEN "Win": do$="Top"
  ENDCASE
ENDIF

IF arg$<>"" THEN window%=EVAL(arg$)


SYS "Wimp_Initialise",310,&4B534154,"Temp" TO ,handle%
CASE do$ OF
  WHEN "pin":          PROCpin
  WHEN "close":        PROCclose
  WHEN "closeall":     PROCclose_all
  WHEN "closealltask": PROCclose_all_task
  WHEN "iconise":      PROCiconise
  WHEN "top", "win":   PROCtop
  WHEN "topall":       PROCtop_all
  WHEN "bottom":       PROCbottom
  OTHERWISE:           ERROR 1,"Unknown operation '"+do$+"'"
ENDCASE
SYS "Wimp_CloseDown"
END

DEF PROCpin
LOCAL path$,test%
path$=FNgetwindowtitle(window%)
SYS"OS_File",17,path$ TO test%
!buffer%=window%
SYS"XWimp_GetWindowOutline",,buffer% TO ;flags%
IF (flags% AND 1)=1 THEN END
x%=buffer%!4:y%=buffer%!16

IF test%=0 THEN
  PROCiconise
ELSE
  OSCLI"Pin "+path$+" "+STR$(x%+30)+" "+STR$(y%-90)
  PROCclose
ENDIF
ENDPROC

DEF PROCclose
  buffer%!0 = window%
  SYS "XWimp_SendMessage",3,buffer%,window%,icon%
ENDPROC

DEF PROCclose_all
  buffer%!0 = 20
  buffer%!12 = 0
  buffer%!16 = 0
  SYS "XWimp_SendMessage",19,buffer%,window%,0 TO ,,parent_task_handle%;flags%
IF (flags% AND 1)=1 THEN END
  PROCwindow_iter_init
  PROCwindow_iter
  WHILE (win_next%<>-1)
    IF thandle%<>0 AND thandle% = parent_task_handle% THEN
      buffer%!0=win_curr%
      SYS "Wimp_GetWindowState",,buffer%
      SYS "Wimp_SendMessage",3,buffer%,win_curr%,icon%
    ENDIF
    PROCwindow_iter
  ENDWHILE
ENDPROC

DEF PROCclose_all_task
  parent_task_handle%=0:taskp%=0
  REPEAT
    SYS "TaskManager_EnumerateTasks",taskp%,buffer%,16 TO taskp%
    IF FNlcase(FNstring(buffer%!4))=arg$ parent_task_handle%=!buffer%
  UNTIL taskp%<0 OR parent_task_handle%<>0
  IF parent_task_handle%=0 THEN ENDPROC
  PROCwindow_iter_init
  WHILE win_next%<>-1
    PROCwindow_iter
    IF thandle%<>0 AND thandle% = parent_task_handle% THEN
      buffer%!0=win_curr%
      SYS "Wimp_GetWindowState",,buffer%
      SYS "Wimp_SendMessage",3,buffer%,thandle%
    ENDIF
  ENDWHILE
ENDPROC

DEF PROCtop
  buffer%!0=window%
  SYS "XWimp_GetWindowInfo",,buffer% OR 1 TO ;flags%
  buffer%!28=-1
  IF (flags% AND 1)=0 SYS "Wimp_SendMessage",2,buffer%,window%,icon%
ENDPROC

DEF PROCbottom
  buffer%!0= window%
  SYS "Wimp_GetWindowInfo",,buffer% OR 1 TO ;flags%
  buffer%!28=-2
  IF (flags% AND 1)=0 SYS "Wimp_SendMessage",2,buffer%,window%,icon%
ENDPROC
:
DEF PROCiconise
  title$=FNgetwindowtitle(window%)
  WHILE LEFT$(title$,1)=" "
    title$=MID$(title$,2)
  ENDWHILE

  a%=INSTR(title$," ")
  IF a% THEN title$=LEFT$(title$,a%-1)

  REPEAT
    a%=INSTR(title$,".")
    IF a% THEN title$=MID$(title$,a%+1)
  UNTIL a%=0

  buffer%!0 = 48
  buffer%!4 = handle%
  buffer%!8 = 1
  buffer%!12 = 0
  buffer%!16 = &400CA
  buffer%!20 = window%
  buffer%!24 = task_handle%
  $(buffer%+28) = RIGHT$(title$,19)+CHR$0

  REM R1+20 window handle
  REM R1+24 task handle for task which owns the window
  REM R1+28 20 Bytes of title string (last part of first word)
  REM R1+48

  SYS "Wimp_SendMessage",17,buffer%,0,0
ENDPROC

:

DEF PROCwindow_iter_init
win_back% = FNcreate_back_window
buffer%!0=win_back%
SYS "Wimp_GetWindowState",,buffer%
win_next%=buffer%!28
ENDPROC

DEF PROCwindow_iter
  win_curr%=win_next%
  buffer%!0=win_curr%
  SYS "Wimp_GetWindowState",,buffer%
  win_next%=buffer%!28
  REM what task does it belong to ?
  buffer%!0 = 20
  buffer%!12 = 0
  buffer%!16 = 0
  SYS "Wimp_SendMessage",19,buffer%,win_curr% TO ,,thandle%
ENDPROC

DEF FNread(a$)
  ?buffer%=13
  SYS "XOS_ReadVarVal",a$,buffer%,buffer_size%,0,3 TO ,,read%
  buffer%?read%=13
=$buffer%

DEF FNreadeval(_A$)
  _V$=FNread(_A$)
  IF _V$="" _V%=0 ELSE _V%=EVAL(_V$)
=_V%

DEF FNswi_number(name$)
  SYS "OS_SWINumberFromString",,name$ TO A%
=A%

DEF FN0(a%)
s$=""
WHILE ?a%>=32
 s$+=CHR$?a%
 a%+=1
ENDWHILE
=s$

DEF FNgetwindowtitle(win%)
LOCAL s$
task_handle%=FNgettaskhandle(win%)

  buffer%!0=win%
  SYS "Wimp_GetWindowInfo",,buffer% OR 1

    REM obtain window title
    a%=(buffer%!60) AND &100: REM title direct/indirect ?

    IF a% THEN
      SYS "Wimp_TransferBlock",task_handle%,buffer%!76,handle%,buffer%,256
      s$ = FN0(buffer%)
    ELSE
      s$ = FN0(buffer%+76)
    ENDIF
=s$

DEF FNgettaskhandle(win%)
LOCAL task%
REM what task does it belong to ?
buffer%!0 = 20
buffer%!4 = handle%
buffer%!8 = 0
buffer%!12 = 0
buffer%!16 = 0
SYS "Wimp_SendMessage",19,buffer%,win%,0 TO ,,task%
=task%

DEF FNlcase(text$)
LOCAL Loop%,text2$
text2$=""
FOR Loop%=1 TO LEN(text$)
  chr%=ASC(MID$(text$,Loop%,1))
  IF chr%>64 AND chr%<91 chr%=chr%+32
  text2$+=CHR$(chr%)
NEXT
=text2$

DEF FNstring(ptr%):LOCAL a$:a$=""
WHILE ?ptr%>31
  a$+=CHR$(?ptr%):ptr%+=1
ENDWHILE:=a$

DEF FNcreate_back_window
  LOCAL handle%
  DIM block% 256

  RESTORE +0
  DATA &00000190, &000002E0, &0000022C, &000002E4
  DATA &00000000, &00000000, &FFFFFFFE, &84001852
  DATA &01070207, &000C0103, &00000000, &FFFFFC00
  DATA &00000500, &00000000, &2700003D, &00003000
  DATA &00000001, &00000001, &6B636142, &0000000D
  DATA &00000000, &00000000

  FOR i%=block%+4 TO block%+4+22*4-1 STEP 4
    READ !i%
  NEXT i%
  SYS "Wimp_CreateWindow",,block%+4 TO handle%
  !block%=handle%
  SYS "Wimp_OpenWindow",,block%
=handle%

