' Iconify.LST von Sandro Paolini
'                 Freiligrathstr. 79
'                 W-5600 Wuppertal 2
'                 Tel.: 0202 / 62 88 66
'                 Z-Netz: S_PAOLINI@AWORLD.ZER
'
' Iconify.LST ist Freeware! Es darf also nicht ohne meine Genehmigung in
' FD-Serien übernommen oder sonst irgendwo abgedruckt werden!!!
' Wer diese Routine verwendet muß in der Anleitung zum Programm erwähnen, daß
' diese von Mir stammt. Diese Routine darf nicht ohne meine Genehmigung in
' kommerziellen Programmen verwendet werden.
'
'
' Wer in sein Programm eine Iconifyfunktion einbauen will, kann sich die
' Programmierung dieser Routine jetzt sparen. Die folgende Procedure ver-
' braucht KEINE Rechenzeit, merkt sich die Windowposition des Iconify-Windows
' und müßte nach den Commodorerichtlinien programmiert sein.
'
' Um diese Routine in sein Programm einzubauen, muß man diese nur ein wenig an
' sein Programm anpassen und eine "wiederaufbau"-Procedure (siehe unten)
' schreiben.
'
PROCEDURE iconify
  LOCAL class%,window%,userport%,imsg%
  '
  ' Dies sind die Variablen, die diese Routine benötigt.
  '
  ' Hier müssen nun die Befehle zum schließen aller Screens/Windows (also
  ' "CLOSEW #1/CLOSES 1") eingefügt. ACHTUNG!!! Falls man den Screenpointer ver-
  ' bogen hat (damit AmigaDOS-Requester auf dem eigenen Screen erscheinen), muß
  ' dieser vor dem Schließen des Screens wieder restauriert werden!!!
  '
  '    task%=FindTask(0)             ! Task finden
  '    LONG{task%+184}=oldpointer%   ! Screenpointer wieder restaurieren
  '    CLOSEW #1                     ! Window schließen
  '    CLOSES 1                      ! Screen schließen
  '
  OPENW #2,iconx%,icony%,184,10,0,65550 ! Form  = RmbTrap+Windowclose+Windowdeep
  '
  ' iconx% und icony% sind die X- und Y-Koordinaten des Windows. Beim ersten
  ' Aufruf dieser Procedure sind diese gleich 0. Da sich die Procedure die
  ' Position des Iconify-Windows aber merkt (siehe unten), wird beim nächsten
  ' Aufruf dieser Procedure, daß Window an der Stelle erscheinen, an der es
  ' zuletzt war.
  '
  ~ModifyIDCMP(WINDOW(2),520)           ! IDCMP = Closegadget+Mousebuttons
  '
  ' Da die IDCMP-Flags nur fehlerhaft übergeben werden, müssen diese auf diese
  ' Weise übergeben werden. Dieser Tip stammt von Christian Krapp.
  '
  TITLEW #2,"Programmname"
  '
  ' Windowtitel des Iconify-Fensters
  '
  ' Es folgt nun die eigentliche Routine, die dafür sorgt, daß Gfa-Basic
  ' während Iconify KEINE Rechenzeit verbraucht. Wer mit Xoper nachsieht, wird
  ' feststellen, daß das Programm auf "wait" gesetzt ist und 0.0% Rechenpower
  ' verbraucht. Die Routine stammt von Falk Brockerhoffs "WaitMSG.LST" von
  ' AGFA #3.
  '
  window%=WINDOW(2)                ! Windowadresse besorgen
  userport%=LPEEK(window%+86)      ! Userportadresse besorgen
  ~GetMsg(userport%)               ! Msg empfangen
  REPEAT
    REPEAT
      ~WaitPort(userport%)         ! Auf Msg warten
      imsg%=GetMsg(userport%)      ! Msg holen
      code&=DPEEK(imsg%+24)        ! entspricht MENU(2)
      class%=LPEEK(imsg%+20)       ! MsgTyp, entspricht MENU(1)
      ~ReplyMsg(imsg%)             ! Msg beantworten (WICHTIG!!!)
    UNTIL LPEEK(imsg%+44)=window%  ! Message für mich? (Mein Window?) Ja! Raus
    '
    ' Ist das Programm hier angekommen, wurde das Closegadget des Iconify-
    ' Windows, oder die rechte Maustaste in dem Iconifywindow betätigt.
    '
    IF class%=512                  ! Closegadget
      '
      ' Jedes Gfa-Programm sollte am Anfang:
      '
      '     task%=FindTask(0)
      '     oldpri&=SetTaskPri(task%,-40)
      '
      ' stehen haben, damit es den Amiga nicht alzu stark bremst.
      ' Die folgenden Zeilen gehen davon aus, daß die TaskPri geändert wurde
      ' und, daß die alte Taskpri in der Variable oldpri& gespeichert wurde.
      '
      task%=FindTask(0)
      IF change!=FALSE
        '
        ' change! ist eine Variable aus meinem Programm. Ist change!=FALSE,
        ' so wurden keine Veränderungen gemacht. Das Programm kann also ohne
        ' Abfrage verlassen werden.
        '
        task%=FindTask(0)
        ~SetTaskPri(task%,oldpri&) ! TaskPri restaurieren und Ente
        CLOSEW #2                  ! Iconify-Window schließen
        '
        ' Vor Beendigung des Programms sollte man nicht vergessen allocierten
        ' Speicher wieder freizugeben, Locks wieder zu lösen, Librarys wieder
        ' zu schließen, usw.
        '
        EDIT
      ELSE
        ALERT 0,"Warning!|Your changes will be lost!",2,"So what?|Cancel",cho|
        IF cho|=1
          '
          ' für Bemerkungen siehe oben
          '
          task%=FindTask(0)
          ~SetTaskPri(task%,oldpri&)
          CLOSEW #2
          EDIT
        ENDIF
      ENDIF
    ENDIF
  UNTIL class%=8 AND code&=105   ! Mousebuttons & Rechte Maustaste
  '
  ' Ist Gfa-Basic hier angekommen wurde die rechte Maustaste betätigt.
  ' Das Iconify-Fenster wird also wieder geschlossen und der Screen wieder
  ' aufgebaut.
  '
  task%=WINDOW(2)
  iconx%=CARD{task%+4}
  icony%=CARD{task%+6}
  '
  ' Hier merkt sich die Procedure die aktuelle Windowposition des Iconify-
  ' fensters, so daß beim nächsten Aufruf das Iconify-Fenster wieder an der-
  ' selben Stelle erscheint, an der es auch geschlossen wurde.
  '
  CLOSEW #2
  @wiederaufbau
  '
  ' Die Procedure wiederaufbau mußt Du nun noch selber programmieren. In ihr
  ' sollte der Programmscreen wieder so aufgebaut werden, wie er vor Iconify
  ' war. (Der Screenpointer muß nun auch wieder neu verbogen werden.)
  '
RETURN
