                             Let 'em Fly!
                             ------------

                     (Flying Dials and more ...)

                            Version V1.02
                              Juli 1991

                     (c) 7/1991 by Oliver Scheel
                        Freaky Deaky Software

                           (it's Freeware)


                              Einleitung
                              ==========

Tjaaa,  eigentlich  wollte ich nur mal sehen wie schnell das  VDI  des 
Atari ST sein kann, doch daraus ist dann wohl etwas mehr geworden ...

Jeder drfte inzwischen fliegende Dialogboxen kennen. Sie sind z.B. in 
Gemini  (dem  Shareware  Alternativ-Desktop)  oder  in  Rufus   (einem 
Terminalprogramm)  eingebaut.  Zudem sind diese Dialogboxen auch  ber 
die  Tastatur  bedienbar  und hufig bleibt  einem  so  der  fliegende 
Wechsel  zwischen  Tastatur  und  Maus  erspart.   Leider  sind  diese 
Dialogboxen nur innerhalb dieser Programme aktiv und sobald man  diese 
verlassen hat,  steht man wieder ohne da.  Und hier setzt Let 'em Fly! 
an,  und  viele  'normale'  Dialogboxen sind  jetzt  auch  mit  diesen 
Features ausgestattet.

Features
--------

 - Fliegende Dialoge:
     Viele  Dialoge  werden  flugfhig  gemacht.   Hiermit  kann   man 
     Verdecktes  sichtbar machen.  Auch die Alert-Boxen  knnen  jetzt 
     fliegen.
     Durch  einen  ausgeklgeltes Verfahren sind die Boxen  auch  ohne 
     Blitter   beim   Verschieben  ertrglich  schnell   und   optisch 
     optimiert.   Zudem  luft  die  ganze  Geschichte  speicherplatz-
     optimiert ab,  d.h.  auch wenn wenig Speicher vorhanden ist,  ist 
     es in einigen Fllen noch mglich die Boxen zu verschieben.

 - Tastaturbedienbarkeit von Dialogen:
     Ebenso  viele Dialoge kann man jetzt ber die Tastatur  bedienen. 
     Bei  ganz bestimmten Mustern werden auch die Sondertasten  [HELP] 
     und [UNDO] belegt.

 - Zustzliche Editierfunktionen:
     Sind  in  einem Dialog editierbare  Eingabefelder  vorhanden,  so 
     werden  zustzliche  Editierfunktionen   bereitgestellt.   Einige 
     Editierfunktionen  knnen  auch  in  Programmen  Wirkung   zeigen 
     welche eigene Routinen zur Dialogverarbeitung benutzen.

 - Grow-/Shrinkboxen abschaltbar:
     Es lassen sich auch die Grow- und Shrinkboxen abschalten,  um  so 
     einen  Geschwindigkeitsgewinn beim Zeichnen von Dialogboxen  u.a. 
     Dingen zu erzielen.

 - Kein Flugschein erforderlich!
     Ja,  Sie  haben richtig gelesen.  Fr Let 'em Fly!  brauchen  Sie 
     keinen   Flugschein.   Grundkenntnisse  in  der   Bedienung   des 
     Steueraggregats sollten aber trotzdem vorhanden sein.

Das  Programm  sollte auf allen ST/TT Rechnern  in  allen  Auflsungen 
laufen. Falls es trotzdem Probleme gibt, bitte ich um Kontaktierung.

Das  Programm  ist Freeware,  d.h.  es darf frei kopiert  und  benutzt 
werden.  Davon ausgeschlossen ist die gewerbliche Nutzung.  Diese  ist 
nur    mit   schriftlicher(!)   Genehmigung    meinerseits    mglich, 
eingeschlossen  davon sind PD-Versande!  Die Rechte bleiben  in  allen 
Fllen bei mir. Zuwiderhandlungen werde ich strafrechtlich verfolgen.

Zu Let 'em Fly! gehren folgende Dateien:

     - LETEMFLY.PRG           Das eigentliche Programm
     - LETLIGHT.PRG           Die 'Light'-Version von Let 'em Fly!
     - LET_CONF.PRG/ACC       Das Konfigurationsprogramm
     - LET_CONF.CPX           Das Ganze als CPX-Modul

     - DI_FLY.C               Ein    Binding   zur    Benutzung    der 
                              Flugroutine
     - DI_FLY.H               Die Definitions dazu

     - LETEMFLY.TXT           Diese Anleitung
     - READ_ME                Eine kurze Info

Let 'em Fly!  darf  nur  komplett  mit  diesen  Dateien  weitergegeben 
werden.

Ich  erhebe  mit dieser Anleitung keinen Anspruch  darauf,  da  jeder 
alles versteht,  was zur normalen Benutzung auch nicht notwendig  ist. 
Das ist in diesem Fall prinzipbedingt,  da das Programm in die  Tiefen 
des Betriebssystem eintaucht und um alles zu verstehen,  mu man  auch 
dieses ensprechend genau kennen.


                             Installation
                             ============

Das eigentliche Programm LETEMFLY.PRG lt sich sowohl vom Desktop aus 
starten als auch aus dem AUTO-Ordner heraus.  Im zweiten Fall mu  man 
das Programm in den AUTO-Ordner des Boot-Laufwerks kopieren.  Nach dem 
nchsten Reset ist es dann automatisch installiert.
Es gibt auch noch das Programm LETLIGHT.PRG.  Hier handelt es sich  um 
eine  abgespeckte Version von Let 'em Fly!,  und verbraucht etwa  halb 
so  viel  Speicherplatz.  Genaueres zu dieser Version steht  in  einem 
extra Kapitelchen.
Daneben gibt es auch noch ein Konfigurationsprogramm LET_CONF.PRG/ACC. 
Mit  diesem Programm ist es mglich Let 'em Fly!  an die  persnlichen 
Bedrfnisse  anzupassen.  Es kann entweder vom Desktop  aus  gestartet 
werden oder als Accessory installiert werden.  Im zweiten Fall mu die 
Endung  auf  'ACC' lauten und das Programm  im  Wurzelverzeichnis  des 
Boot-Laufwerks  stehen.   Nach  einem  Reset  ist  es  dann  ber  die 
Accessory-Leiste aus jedem (echten) GEM-Programm heraus ansprechbar.
Das   Konfigurationsprogramm  gibt's  auch  als  CPX  fr   das   neue 
Kontrollfeld von Atari. Es heit LET_CONF.CPX.


                              Bedienung
                              =========

Grundstzliches
---------------
Nicht alle Dialogboxen werden von Let 'em Fly!  untersttzt, da einige 
Leute eigene Routinen zur Dialogverarbeitung programmiert haben.  Hier 
kann  Let 'em Fly!  garnicht  oder nur teilweise  seine  Features  zur 
Verfgung  stellen.   Alle  Programmierer,  die  Let 'em Fly!  optimal 
ausnutzen wollen, bitte ich den Teil 'Internes' zu studieren!
Auch die Dialoge im Desktop werden nicht untersttzt,  da hier das TOS 
seine Routinen direkt anspringt.
Falls irgendetwas nicht funktionieren sollte,  dann bitte ich erst die 
Einstellungen mit dem Konfigurationsprogramm zu prfen!

Let 'em Fly!
------------
In  einer  Dialogbox  gibt es in erster  Linie  anwhlbare  und  nicht 
anwhlbare  Objekte.  Falls man jetzt ein nicht anwhlbares Objekt  in 
einem  Dialog  mit  der linken Maustaste anklickt  und  die  Maustaste 
festhlt,   so  sollte  sich  der  Mauszeiger  in  eine  Flache   Hand 
verwandeln.  Bewegt  man jetzt die Maus,  so verschiebt sich die  Box, 
bzw.  ein Geisterrahmen erscheint und beim Loslassen der Maus wird die 
Box  dann  an  die  entsprechende  Stelle  verschoben.   Die  Art  des 
Verschiebens  hngt  von  der  Einstellung  im  Konfigurationsmen  ab 
(Solid/Hollow  Flights).  Falls man beim Anklicken der Box  zustzlich 
die  linke Maustaste gedrckt hlt,  so verschwindet die Box  und  ein 
Geisterrahmen  erscheint.  Somit ist es jetzt mglich 'durch' die  Box 
zu schauen,  falls diese etwas verdeckt.  Der Geisterrahmen lt  sich 
natrlich auch verschieben.  Beim Loslassen der Maustaste(n) erscheint 
die Box wieder auf dem Bildschirm. Falls die Box sich zwar noch normal 
verschieben lt,  nicht aber durchsichtig gemacht werden  kann,  dann 
steht  nicht  genug  Speicher zur Verfgung um die  komplette  Box  zu 
sichern.  Der erste Modus zerlegt bei nicht ausreichendem Speicher die 
Flugbahn  in  entsprechend viele Einzelschritte und fhrt  diese  dann 
aus, daher hat man hier mehr Chancen.

Bemerkung:     Nicht  alle Boxen knnen fliegen!  Es mu  a)  gengend 
               Speicher  vorhanden  sein  und  b)  die   entsprechende 
               Betriebssystemfunktion vom Programm aufgerufen werden.
               Manchmal  ist es zwar mglich die Box  zu  verschieben, 
               aber sie lt sich nicht mehr durchsichtig  machen.  In 
               diesem Fall steht nicht mehr gengend Speicherplatz fr 
               die Bufferung der kompletten Box zur Verfgung.

Key Dials
---------
Viele  Dialoge lassen sich ab sofort auch ber die Tastatur  bedienen. 
Das  sieht  man daran,  da in/neben den Buttons unter  dem  Text  ein 
Buchstabe  bzw.   eine  Zahl  unterstrichen  ist.  Drckt  man  diesen 
Buchstaben bzw.  diese Zahl in Verbindung mit der ALTERNATE-Taste,  so 
wird  das entsprechende Objekt angewhlt.  Das entspricht  dann  einem 
einfachen Mausklick auf das Objekt.

Zudem  werden  je nach Mglichkeit auch die Tasten [UNDO]  und  [HELP] 
belegt:

[HELP] sucht nach der Zeichenfolge      'Help'

[UNDO] sucht nach den Zeichenfolgen     'abbruch',
                                        'abbrechen',
                                        'nein',
                                        'quit',
                                        'cancel',
                                        'abort',
                                        'no',
                                        'exit'

Gro-  und  Kleinschreibung wird nicht  bercksichtigt.  Beim  Drcken 
einer dieser Tasten wird dann das jeweilige Objekt angewhlt.
Insgesamt  werden 38 Tasten (A-Z,  0-9,  HELP,  UNDO)  verwaltet.  Das 
Default-Objekt  (wird beim Drcken von RETURN angewhlt und  ist  dick 
umrandet),  sowie  das  UNDO-Objekt ist zudem (fast)  immer  ber  den 
ersten  Buchstaben im jeweiligen Text zu  erreichen.  D.h.  'Ok'  ber 
ALT+'O', 'Abbruch' ber ALT+'A' u.s.w..

ber  [SHIFT]+[HELP] wird innerhalb eines Dialogs eine Copyright  Info 
angezeigt. Bei Alert/Error-Boxen ist diese Funktion ausgeschaltet.

Extended Editor
---------------
Sind in einer Dialogbox editierbare Eingabefelder vorhanden, so werden 
von  Let 'em Fly!  auch  zustzliche Editierfunktionen  zur  Verfgung 
gestellt.

Neben den schon im Betriebssystem fest eingebauten ...

[Cursor Up]         Ein Eingabefeld zurck.
[Cursor Down]       Ein Eingabefeld vor.
[Cursor Left]       Ein Zeichen nach links.
[Cursor Right]      Ein Zeichen nach rechts.
[TAB]               Ein Eingabefeld vor.
[RETURN]            Beendet den Dialog.

... gibt es jetzt noch viel mehr ...

[RETURN]            Falls kein Default-Objekt vorhanden ist,  wird zum 
                    nchsten Eingabefeld gesprungen.
[SHIFT]+[RETURN]    Springt  zum nchsten Eingabefeld (auch  wenn  ein 
                    Default-Objekt vorhanden ist).
[SHIFT]+[TAB]       Ein Eingabefeld zurck.
[SHIFT]+[Csr Left]  Springt an den Anfang des Eingabefeldes.
[SHIFT]+[Csr Right] Springt an das Ende des Eingabefeldes.
[CTRL]+[Csr Left]   Springt wortweise nach links.
[CTRL]+[Csr Right]  Springt wortweise nach rechts.
[Home]              Springt zum ersten Eingabefeld im Formular.
[SHIFT]+[Home]      Springt zum letzten Eingabefeld im Formular.
[CTRL]+[Delete]     Lscht alle Zeichen rechts vom Cursor.

Zudem  besitzen  die Tasten [Cursor Up] und [Cursor  Down]  sogenannte 
'Turn-Around'  Funktionen,  d.h.  ist  man im ersten  Eingabefeld  und 
drckt  [Cursor  Up],  so  gelangt man  ins  letzte  Eingabefeld.  Fr 
[Cursor Down] gilt das Umgekehrte.
Weiterhin  wird  auch die direkte  Cursor-Positionierung  innerhalb(!) 
des Edit-Feldes durch die Maus untersttzt.  Das Betriebssystem  setzt 
normalerweise  den Cursor beim Anwhlen eines Eingabefeldes  immer  an 
das Ende.

Viele der zustzlichen Editierfunktionen (auer die Mausuntersttzung) 
sind auch in Dialogen mit fremden Routinen ansprechbar.  Hier heit es 
dann:   Ausprobieren!   Die  MagicDials  von  Peter  Hellinger  werden 
brigens optimal von Let 'em Fly! untersttzt.


Das Konfigurationsprogramm
--------------------------
Nach  dem  Start des Programms (LET_CONF.PRG/ACC) gelangt man  in  ein 
(groes) Men ...

Global Settings:
----------------
   - Let 'em Fly! ON/OFF      ber    diesen   Schalter   lt    sich 
                              Let' em Fly!    ein-   bzw.   (komplett) 
                              ausschalten.        Die       restlichen 
                              Einstellungen sind damit ohne Wirkung.
   - Alert-/Error-Boxes       Hier  lassen sich die neuen  Alert-  und 
                              Error-Boxen ein-/ausschalten.
   - Extended Editor          Dieser Schalter ist fr die zustzlichen 
                              Editierfunktionen da.
   - Key Dials                Aktiviert/Deaktiviert  die   Tastaturbe-
                              dienbarkeit der Dialogboxen.
   - Form Dial Grow/Shrink    Schaltet   die  Grow-/Shrinkboxen   beim 
                              Zeichnen von Dialogboxen ein bzw. aus.
   - Graf Grow/Shrink         Schaltet   auch  die  restlichen   Grow-
                              und Shrinkboxen aus.

Flying Dials:
-------------
   - Flying ON/OFF            Mit    diesem   Schalter   werden    die 
                              Flugroutinen  aktiviert.   Die   Dialoge 
                              knnen jetzt fliegen.  'Save Background' 
                              mu jedoch aktiviert sein!
   - Solid/Hollow Flights     Hier  wird  bestimmt,   wie  die   Boxen 
                              fliegen:
                              Solid:  in Echtzeit, d.h. sie folgen der 
                              Mausbewegung.   Ohne  Blitter  und  ohne 
                              Bildschirmbeschleuniger    ist     diese 
                              Version etwas trge.
                              Hollow:     Hier    wird    mit    einem 
                              Geisterrahmen gearbeitet.
   - Send Redraw              Bei manchen Programmen gibt es  Probleme 
                              nach dem lschen der Dialogbox, d.h. der 
                              Hintergrund  wird nicht  wieder  richtig 
                              hergestellt (z.B.  TC-Fileselector). Ist 
                              diese  Funktion eingeschaltet,  so  wird 
                              beim letzten  form_dial(FMD_FINISH, ...)  
                              ein  Redraw auf den entsprechenden  Teil 
                              gesendet.  Das Hauptprogramm wei  somit 
                              welcher   Bildschirmausschnitt    wieder 
                              herzustellen ist.

- Info         Zeigt eine Copyright-Information an.

- Save         Speichert    die   Einstellungen   in   dem    Programm 
               LETEMFLY.PRG ab.  Hierzu erscheint eine Dateiauswahlbox 
               mit der man das Programm anwhlen kann.

- Cancel       Hier  wird das Konfigurationsprogramm  verlassen,  ohne 
               die genderten Einstellungen zu bernehmen.

- OK           Die Einstellungen werden bernommen,  aber nicht(!)  im 
               Programm selber abgespeichert.  D.h. bei einem Neustart 
               gehen  die  genderten  Einstellungen  verloren.  (s.a. 
               'Save')

Die CPX-Version ist hnlich aufgebaut.


Die light-Version
-----------------
Halb  soviel Speicherkalorien mit  Let 'em Fly! light.

Andere  light-Hersteller werben noch mit 'doppelt  soviel  Geschmack', 
was  aber  berhaupt  nicht  stimmt.  Daher  ist  meine  light-Version 
realistischer, da sie auch weniger leistet.

In der light-Version fehlen zwei groe Teile:

   - Die  Alert-/Error-Boxen  muten  weichen,   da  sie  die   grte 
     Speichereinsparung brachten.
   - Der   leistungsfhige   Teil  der  Flugroutinen   ist   ebenfalls 
     herausgeflogen.  In der light-Version ist nur noch der  Flugmodus 
     enthalten,   der   beim  Gedrckthalten  der  rechten   Maustaste 
     aktiviert wird.

Die Vollversion bentigt 35K,  die light-Version nur 17K.  Ich  hoffe, 
da jetzt auch die Leute mit nur 1MB ihre Freude haben.


            ----------------------------------------------


                               Internes
                               ========

Let 'em Fly! ersetzt bzw. erweitert die folgenden AES-Routinen:

form_do()      (komplett) Benutzt ein Programm diese Funktion,  so ist 
               der   komplette   Funktionsumfang   von    Let 'em Fly! 
               ansprechbar.  Fr die Flugroutinen mu der  Hintergrund 
               mit   form_dial(FMD_START, ...)   natrlich   gesichert 
               worden sein!

form_dial()    (teilweise)  Hier wurden die Modi  FMD_START/FMD_FINISH 
               ersetzt,   sowie   die  Grow-/Shrinkboxen   abschaltbar 
               gemacht.    Bei    FMD_START   wird   der    bergebene 
               Bildschirmausschnitt    bei   ausreichendem    Speicher 
               gesichert. Steht nicht genug Speicher zur Verfgung, so 
               wird die Original-Routine angesprungen.  Mit FMD_FINISH 
               wird der Ausschnitt wieder hergestellt.
               Achtung:  Der Bildschirmausschnitt wird nur  gesichert, 
               wenn die Option 'Flying' eingeschaltet ist!
               Wichtig:  Es  sollte nicht mehr  Bildschirm  reserviert 
               werden,  als bentigt wird.  Die Funktion form_center() 
               liefert bei 'normalen' Boxen genaue Ergerbnisse.

form_alert()   (komplett)  Damit auch die Alert-Boxen fliegen  knnen, 
               mute  die  Routine komplett  neu  geschrieben  werden. 
               Zudem  gibt es keine Beschrnkung auf  die  Zeilenlnge 
               mehr,  jedoch  darf der Alert-String 255 Zeichen  nicht 
               berschreiten.
               Achtung:   Diese  Funktion  ist  nur  aktiv,  wenn  die 
               Option 'Alert-/Error-Boxes' eingeschaltet ist.

form_error()   (komplett)  Diese  Funktion basiert  auf  form_alert(), 
               daher  war es kein groer Zusatzaufwand,  dies noch  zu 
               implementieren.
               Achtung:  Diese Funktion ist natrlich nur dann  aktiv, 
               wenn 'Alert-/Error-Boxes' eingeschaltet ist.

form_keybd()   (komplett)  In dieser Funktion werden die  Tastendrcke 
               in  Dialogen verarbeitet,  um einerseits den Dialog  zu 
               verlassen (RETURN) und andererseits um die  Edit-Felder 
               zu wechseln.  Wird diese Funktion in eigenen  form_do() 
               Routinen  benutzt kommt man natrlich in den Genu  der 
               neuen  Funktionen (die MagicDials von  Peter  Hellinger 
               knnen da als Beispiel dienen).
               Achtung:   Die   Option  'Extended  Editor'  mu   hier 
               eingeschaltet sein.

objc_edit()    (erweitert)  Diese Funktion bearbeitet die Eingaben  in 
               ein Edit-Feld.  Let 'em Fly! stellt mit dieser Funktion 
               zustzlich  die  Funktionen zum Bewegen  innerhalb  der 
               Zeile zur Verfgung.
               Achtung:  Diese  Funktion ist von der Option  'Extended 
               Editor' abhngig.

appl_exit()    (erweitert)  Let 'em Fly!   gibt  hier  zustzlich  nur 
               nicht mehr benutzte Speicherbereiche frei.

Zudem wird eine neue Funktion bereitgestellt,  welche ber den Cookie-
Jar ansprechbar ist (s.u.):

     void di_fly(OBJECT *tree)

Die  Parameterbergabe erfolgt ber den Stack!  Damit kann  man  diese 
Routine   auch  aus  anderen  Programmiersprachen  als  C   problemlos 
aufrufen.

Wurde  der Bildschirmausschnitt vorher  mit  form_dial(FMD_START, ...) 
gesichert,  dann  kann  man ber diese Funktion  seine  Boxen  fliegen 
lassen.  Das  ist  dann  interessant,  wenn man  eigene  Routinen  zur 
Dialogverarbeitung  benutzt.   In  jedem  Fall  sollte  man  sich   am 
form_do() Source von D.R. orientieren!!!

Beispiel:

[...]

#include <di_fly.h>      /* di_fly.o mu mit dazugelinkt werden */

[...]

new_form_do(OBJECT *tree, ...)
{
     [...]

     if(exit_obj == FLYBUTTON)
          di_fly(tree);       /* bei Benutzung der original  form_do() 
                              Sourcen mu zustzlich noch das exit_obj 
                              bzw.   das  next_obj  auf  Null  gesetzt 
                              werden! */

     [...]
}

Benutzt   man  das  beigelegte  Binding,   dann  braucht   man   keine 
Vorbereitungen zum Aufruf von di_fly() treffen.  Die Routine sucht bei 
Bedarf automatisch den Cookie und die Adresse der Struktur.  Auch  ein 
nicht installiertes Let 'em Fly! wird erkannt.
Falls ein anderer Mauszeiger als ARROW benutzt wurde,  mu dieser nach 
der Flugstunde wieder hergestellt werden.


Programmierrichtlinien ... oder: wie arbeitet Let 'em Fly!?
-----------------------------------------------------------
a) Fliegende Dialoge:
     Let 'em Fly!      sichert      bei     einem      Aufruf      von 
     form_dial(FMD_START, ...)           den            entsprechenden 
     Bildschirmausschnitt.  Dieser Bildschirmausschnitt wird dann  zum 
     Fliegen  bentigt.  Daher sollten die Koordinaten  bei  FMD_START 
     einigermaen  genau angegeben werden.  Die Routine  form_center() 
     spuckt  bei  'normalen'  Dialogboxen  die  richtigen  Werte  aus. 
     Sollten  die Dialogboxen z.B.  SHADOWED sein,  dann mu  man  die 
     Werte   korrigieren.   Zeichnet   man  nun  die   Dialogbox   mit 
     objc_draw()  und  springt die 'original'  form_do()  Routine  an, 
     dann testet Let 'em Fly!  bei einem Mausklick u.a.,  ob sich  das 
     unter  der  Maus  befindende Objekt  keine  Flags  besitzt  (also 
     ob_flags  ==  NONE).  In diesem Fall wird  die  Routine  di_fly() 
     aufgerufen,  und  der  Dialog  fngt an  zu  fliegen.  Wird  nach 
     Abarbeitung  des Dialogs  form_dial(FMD_FINISH, ...)  aufgerufen, 
     dann  wird  der  Bildschirmausschnitt  wieder  hergestellt.   Die 
     Koordinaten bei FMD_FINISH sind fr  Let 'em Fly!  uninteressant, 
     aber trotzdem sollte man sie auf jedem Fall korrekt  angeben,  da 
     Let 'em Fly!  bei  nicht  ausreichendem Speicher  den  Ausschnitt 
     bekanntlich  nicht  sichert.   Andere  (oder  sogar  das  eigene) 
     Programme knnten so bei einem Redraw Probleme bekommen.
     Man  sollte bei jedem Dialog nur einmal FMD_START am  Anfang  und 
     nur  einmal FMD_FINISH am Ende benutzen.  Andernfalls knnte  der 
     Bildschirmaufbau   nicht  mehr  stimmen.   Die   FMD_STARTs   und 
     FMD_FINISHs   sind  gegen  die  obere  (6x)  und  untere   Grenze 
     abgesichert.
     GEM-Anwendungen  sollten  immer  appl_init/appl_exit  benutzen!!! 
     Wird appl_exit() aufgerufen,  so schliet Let 'em Fly! seine VDI-
     Workstation und gibt nicht mehr benutzte Speicherbereiche frei.

b) Key Dials:
     Wird form_do() aufgerufen,  dann geht Let 'em Fly!  alle  Objekte 
     durch  und  guckt  nach,  ob sie mit einer  Taste  belegt  werden 
     knnen.  Das Objekt mu entweder SELECTABLE,  EXIT oder TOUCHEXIT 
     sein  und  darf nicht DISABLED oder geHIDETREEd  sein  (alle  von 
     D.R. nicht definierten Flags/Stati werden korrekt behandelt). Ist 
     der  Parent geHIDETREEd,  so wird in den Childs  ebenfalls  nicht 
     gesucht.  Jetzt  wird  geprft,  ob sich ein Text in  dem  Objekt 
     befindet  (aus  dem Text wird nur das  erste,  durch  Leerzeichen 
     getrennte,  Token  bercksichtigt).  Falls ja,  dann wird  dieser 
     Text nach einer freien Tastenkombination abgesucht.  Falls nicht, 
     dann  schaut  Let 'em Fly!  nach,  ob das nchste Objekt  in  der 
     Liste(!)  einen Text enthlt und dieses Objekt nicht  SELECTABLE, 
     EXIT,  TOUCHEXIT, DISABLED oder geHIDETREEd ist. Dieser Text wird 
     dann  zur  Zuweisung  der  Tastenkombination  benutzt.   Die   Y-
     Koordinate    des   Ersatzobjektes   mu   auf   +/-   3    Pixel 
     bereinstimmen.  Daher  ist darauf zu achten,  da die  Dialogbox 
     richtig sortiert ist.  Der Text des 'Abbruch'-Buttons sollte  mit 
     einem  der oben schon aufgefhrten  bereinstimmen.  Zu  beachten 
     ist, da es auch eine HELP-Taste geben kann.

c) Extended Editor:
     Dieser Teil ist nur fr die Leute interessant, welche eine eigene 
     form_do() Routine schreiben wollen. Weiterhin gehe ich davon aus, 
     da die original form_do() Sourcen bekannt sind.
     Let 'em Fly!   erweitert  bzw.  erstetzt  die  beiden  Funktionen 
     form_keybd()  und objc_edit().  In eigenen Routinen sollte  daher 
     von diesen Funktionen auch Gebrauch gemacht werden. Auch wenn man 
     selbst Tastendrcke verwalten will,  sollte man diese  Funktionen 
     aufrufen.


Nachdem  Karsten  Isakovic  (Overscan and more)  schon  einen  kleinen 
Artikel  ber  die auflsungsunabhngige Programmierung  verfat  hat, 
konnte  ich  mich mal wieder nicht zurckhalten  ...  hier  kommt  der 
'Artikel' zur ...

Positionsunabhngige(n) Programmierung
--------------------------------------
Beim Testen von Let 'em Fly! ist mir aufgefallen, da einige Programme 
Probleme bekamen, nachdem die Dialogbox verschoben wurde (z.B. Edison-
Utilities). Deshalb sollte man auf Folgendes achten:

Nach  jedem  form_do()  bzw.  di_fly()  kann  sich  die  Position  der 
Dialogbox   gendert  haben!   Falls  man  sich  nur  am  Anfang   die 
Koordinaten  der  Box  bzw.  der Objekte gemerkt  hat,  kann  man  bei 
Let 'em Fly!  eine  Bruchlandung  damit erleben.  Oft  wird  mit  VDI-
Routinen  in  die Dialogbox gemalt,  was ja auch nicht  verboten  oder 
'unsauber'  ist,  jedoch sollte man vorher ein objc_offset()  auf  das 
entsprechende Objekt machen.  Das TOS macht es ja genauso (sonst wrde 
es auch kein Let 'em Fly! geben).
Weiterhin  sollte  man  vor jedem Neuzeichnen (gemeint  ist  hier  das 
Zeichnen  beim Aufrufen der Dialogbox,  nicht das  sog.  Redraw!)  ein 
form_center() machen,  und die Ergebnisse dann auch wirklich benutzen. 
Es kann sonst Probleme beim Clipping im objc_draw()  geben,  d.h.  die 
Dialogbox  wird nicht komplett gezeichnet (z.B.  die  Koordinaten  der 
Dialogbox  sind im Objektbaum eingetragen (wird ja  von  form_center() 
gemacht),  jedoch die Koordinaten vom Clipping-Rectangle sind noch vom 
letzten  Aufruf und damit nicht mehr aktuell).  In spteren  Versionen 
ist auch ein Ersetzen der form_center() Routine geplant.  Damit drfte 
es mglich sein,  da die letzte Position der Box gespeichert wird und 
auch bei erneutem Aufruf benutzt wird.  Weiterhin wird diese  Funktion 
dann die echten(!) Aumae der Box zurckliefern.


Trappelshouting
---------------
Let 'em Fly!  klinkt  sich in den TRAP #2 (AES/VDI) und den  TRAP  #13 
(BIOS)  ein und benutzt dazu die XBRA-Kennung 'LTMF'.  Zudem wird  ein 
sog.  Cookie-Jar installiert (benutzt auch die Kennung 'LTMF'). Dieser 
zeigt auf die folgende Struktur:

typedef struct
{
        unsigned int    version;        /* Version im BCD-Format*/
        struct
        {
                unsigned light  : 1;    /* light vers. (rd only)*/
                unsigned        : 5;    /* reserved             */
                unsigned keys   : 1;    /* key handling         */
                unsigned edit   : 1;    /* extended editor      */
                unsigned redraw : 1;    /* send redraw message  */
                unsigned flytyp : 1;    /* solid/hollow fly     */
                unsigned fly    : 1;    /* flying on/off        */
                unsigned alert  : 1;    /* Alerts/Errors on/off */
                unsigned v_mem  : 1;    /* use virtual memory   */
                unsigned f_grow : 1;    /* grow/shrink boxes    */
                unsigned g_grow : 1;
                unsigned bypass : 1;    /* ON/OFF (highest prio)*/
        } config;
        char    *vpath;                 /* path for v-mem       */
        void    cdecl   (*di_fly)(OBJECT *tree); /* fly routine */
} LTMFLY;

Ich weise hiermit auch auf das beigelegte Binding fr Turbo-C hin.

'bypass'  entspricht  Bit-No.  0.  Einige C Compiler  legen  Bitfelder 
anders   als  Turbo-C  ab.   'cdecl'  heit  in   Turbo-C,   da   die 
Parameterbergabe auf dem Stack erfolgt.  Eine Anpassung an andere  C-
Compiler sollte kein groes Problem darstellen.

'v_mem'  und '*vpath' ist noch nicht benutzt ('vpath' zeigt  zur  Zeit 
auf  einen String der Lnge Null),  'light' dient zum Feststellen  der 
Version und ist Read-Only!


                        Probleme & Known Bugs
                        =====================

   - Der  Sparmodus beim Verschieben der Dialoge (das  Zerstckeln  in 
     Einzelschritte)  ist noch nicht 100%ig.  Macht sich aber nur  bei 
     kleinen  Boxen und groen Distanzen bemerkbar.  Ist leider  nicht 
     ganz einfach.
   - Wurde  die Box durchsichtig gemacht und der ist  Speicher  knapp, 
     dann erscheint die Box nicht da,  wo man sie haben  wollte.  Tja, 
     anscheinend ist das GEMDOS nicht in der Lage einen Block mit  der 
     Lnge  X zu free-en und danach wieder einen Block mit gleichem  X 
     zu allozieren.
   - Dialoge,  die grer als der Bildschirm sind knnen u.U. Probleme 
     machen.  Es  wird zwar prinzipiell abgefangen,  aber wofr  haben 
     wir  Murphy.  Ist  eigentlich  nur  fr  die  niedrige  Auflsung 
     relevant.
   - Der  Universal  Item  Selector (UIS III)  mu  nach  Let 'em Fly! 
     gestartet werden, da er sonst wieder ausgeklinkt wird. Das drfte 
     fr alle Programme gelten, die kein XBRA benutzen.


                              Ausleitung
                              ==========

Wie  schon gesagt wollte ich nur sehen wie schnell das VDI  sein  kann 
und irgendwie ist dann dieses Programm entstanden.
Die  Flugroutinen waren eigentlich nur fr eigene  Programme  gedacht, 
aber in der ST-Computer 6/91 hat Robert Tolksdorf gezeigt,  da man so 
etwas prinzipiell auch resident installieren kann,  jedoch haben beide 
Programme  nichts  gemeinsam,  auer da wir beide auf  die  form_do() 
Sourcen von D.R. zurckgegriffen haben.
Der Rest ist eher aus der Not entstanden.  Dan Wilga hat ein  Programm 
mit  dem  Namen 'FormDoIt!' geschrieben,  welches  es  ermglicht  die 
Dialoge  auch mit der Tastatur zu bedienen und zustzlich noch  einige 
Editierfunktionen  bereitstellte.  Leider ist seine form_do()  Routine 
nicht 100% kompatibel zum Original und es gab besonders bei  TOUCHEXIT 
Objekten   Probleme.   Zudem  benutzt  er  die  Line-A  Routinen   zur 
Grafikausgabe,  welche in der heutigen Zeit nicht mehr benutzt  werden 
sollten,  da  sie  in  der Zukunft von Atari  nicht  mehr  untersttzt 
werden mssen.  Auch 'FormDoIt!' hat mit Let 'em Fly!  nur so viel  zu 
tun,  da  ich viele Funktionen und das Prinzip auch  in  Let 'em Fly! 
implementiert habe,  jedoch geht mein Programm wesentlich  weiter,  da 
es  a)  nicht nur form_do() ersetzt,  b) kein Line-A  benutzt  und  c) 
wesentlich 'intelligenter' ist.
Was noch zu sagen bleibt ist,  da sog. 'Schweineprogramme' nur bis zu 
einem  gewissen Grad untersttzt  werden.  Unter  'Schweineprogrammen' 
verstehe ich Programme,  die sich nicht an die Regeln des AES  halten. 
Beispielsweise  kennt  UnLZH  kein  appl_init/exit,   OBWOHL  es   AES 
Routinen benutzt.  Weiterhin gibt es immer noch Programme, welche kein 
XBRA  verwenden.  Das betrifft in erster Linie Programme aus den  USA. 
XBRA  ist inzwischen von Atari zum Standard erhoben worden und  sollte 
daher von JEDEM Programm benutzt werden, welches Vektoren verbiegt. 
In  Let  'em  Fly!   sind  zwar  ziemlich  viele   Sicherheitsabfragen 
enthalten, aber alles kann man nun auch nicht abfragen.


Geplant
-------
   - neue  form_center() Routine,  welche die echten Aumae  der  Box 
     zurckliefert.
   - Laden von Icons fr die Alert-Boxen.


Credits
-------
An  dieser Stelle will ich mich trotzdem bei den  beiden  o.g.  Leuten 
bedanken,  da sie gezeigt haben,  da solche Geschichten mglich sind. 
Zudem  geht ein Dankeschn (wie soll es anders sein) an Holger  Weets, 
da  ich  mit  seinem  Programm C_RSC  die  Resourcen  in  Let 'em Fly! 
eingebunden  habe.  Vergessen will ich hier mal auch nicht die  beiden 
Betatester (Thanx).


Meine Adresse ... oder Tomaten, Drohbriefe etc. bitte an:

Oliver Scheel
Rothehausstr. 28
W-5000 Kln 30

oder in der MAUS Kln (02203/12400) unter  Oliver Scheel @ K2

Let 'em Fly!     Man fliegt nicht mehr ohne ...

