KIO's Maustreiber vs. 1.2 copyright Anno Domono -1987- ------------------------------------------------------ (c) by KIO; und KIO ist: Günter Woigk Gabelsbergerstr. 5 D8520 Erlangen c/o KIO-Box Erlangen Tel. (09131) 20 7996 Par. 300 Baud -8-N-1- Grüße an: AXN, SCI, C.Persson, W.Gerth, K.Koerth, Gommel, Rose, Otzi, Oskar, Punx, Felix, Muftix, Lord, PHR, Tires, TCC, OELI, Tiger und noch ein paar, die ich jetzt leider vergessen habe. Hardware-Voraussetzungen: ------------------------- KIO's Maustreiber vs. 1.2 läuft auf allen Atari STs mit monochromem Monitor. Betriebssystem: --------------- RTOS vs. 2.0 Beschreibung: ------------- KIO's Maustreiber ist kein eigenständiges Programm, sondern wird zu einem anderen 'Hauptprogramm' beim Laden dazugebunden. Der Maustreiber unterstützt dabei (logischerweise, nomen est omen) die Arbeit mit der Maus. Programme, die sich dieses Maustreibers bedienen, benötigen keinen Zugang zum Gerät A1. (bzw. B1. oder C1.), sie können ganz so geschrieben werden, daß sie ganz auf einem Grafik-Bildschirm arbeiten und Eingaben ausschließlich mit Hilfe der Maus gemacht werden ! Dadurch stören sie andere Programme, die über die Terminal-Emulation kommunizieren überhaupt nicht und werden auch vom Aufrufen des Bedien-Interpreters nicht gestört. Programm-Umfang: ---------------- KIO's Maustreiber vs. 1.2 umfaßt die Dateien SI und SIA (Quellcodes) bzw. SR und SRA (S-Records). Dazu kommen SIT bzw. SRT (Testprogramm) und DOCO (Dokumentation). Die Dokumentation erhebt keinen Anspruch auf vollständigkeit. Laden des Testprogramms mit: LOAD SR*SRA*SRT Public Domain: -------------- KIO's Maustreiber vs. 1.2 ist Public Domain ! Das heißt, er darf von jedem jederzeit weitergegeben werden, wenn dabei kein Gewinn erziehlt wird ! Dabei muß aber der vollständige Programm-Umfang incl. aller Dokumentation und meiner Copyright- und Public-Domain-Hinweise mitkopiert werden ! Also mindestens SI, SIA, SIT und DOCO. Da KIO's Maustreiber kein eigenständiges Programm ist, sondern erst mit einem anderen Hauptprogramm zum Leben erwacht, sind noch folgende Hinweise dazu nötig: Die mit Hilfe von KIO's Maustreiber erstellten Programme müssen: - Selbst wieder Public Domain Programme sein, d.h., sie müssen einem Public-Domain-Pool zur Verfügung gestellt werden. - Diese Programme müssen an gut sichtbarer Stelle meine Copyright- Prozedur (MAUSCOPYRIGHT) aufrufen bzw. aufrufbar machen (z.B. durch Anklicken eines Buttons). - Ich möchte von jedem Programm gerne ein Dokumentations-Exemplar auf 3.5"-Diskette haben. Bei Bedarf revanchiere ich mich dann mit einer gut gefüllten PD-Disk. Sollte tatsächlich der unwahrscheinliche Glücksfall eintreten, daß dieser Maustreiber in einem komerziellen Programm Anwendung finden sollte, so bitte ich vorher um gesonderte Rücksprache. Probleme: --------- Vor allem mit älteren RTOS-vs.2.0-Versionen (jaja, 2 Eier mögen zwar gleich aussehen, aber ...) tritt das folgende Problem auf: Wird die Maus bewegt, während RTOS auf Diskette zugreift, verhaut's ihm wohl irgendein Bit in der Interrupt-Struktur für den Tastatur-Prozessor und es kommen keine Meldungen mehr von diesem durch. Effekt: Tastatur und Maus spielen sehr erfolgreich 'Toter Mann'. Abhilfe: Ich hatte Erfolge, wenn ich Daten über die RS232 ausgeben konnte. Wenn meine Mailbox aktiviert war, brauchte ich 'nur' einen Anruf zu simulieren, und sobald die Box ihren Begrüßungstext hervorsprudelte, war wieder alles in Ordnung. Bei allen Versionen erscheint sporadisch die Fehlermeldung: >> TEST:INTRPT NOT SUSPENDED (CONTINUE). Diese kann glücklicherweise ignoriert werden, vor allem, weil sie ja 'nur' auf dem Hauptbildschirm erscheint und weil ich die Priorität der Mausverfolgungs-Task so erhöht habe, daß sie höher als die der Fehlerausgabe ist ! Aufgrund eines Fehlers in der Einbaufunktion SPRITL kam es bei mir regelmäßig zu System-Crashs. Der Fehler wurde dadurch umgangen, daß ich hinter alle BIT(16)-Felder Dummy-Arrays angelegt habe. Das muß immer gemacht werden, solange keine fehlerfreie SPRITL-Funktion zur Verfügung steht ! Weitere Dokumentation: ---------------------- Die neueste Version des Maustreibers und eine ausführliche Dokumentation aller globalen Prozeduren und Variablen erhält man gegen einen Ukb von 20 DM an meine oben angegebene Adresse. Diese vollständige Dokumentation ist nicht public domain ! Wer Fehler findet soll mich bitte sofort darüber informieren. Wer dabei eine Diskette und Rückporto beilegt, kriegt dann auch gleich (gleich ? - oder später ...) die bereinigte Version. Einführende Dokumentation: ========================== Wichtige Variablentypen: ------------------------ TYPE BTN STRUCT (/ (L,R,O,U)FIX /) definieren Buttons oder Fenster im Bildschirm. L, R, O und U stehen für die linke, rechte, obere und untere Grenze des gewählten Bildschirm- Ausschnitts. TYPE STR STRUCT (/ LEN FIX, TXT CHAR(80) /) Textstring mit Längenangabe. TYPE BTX BIT(16) In Felder dieses Typs werden verdeckte Bildschirm-Ausschnitte gerettet. TYPE BTZ BIT(32) Mit einem Feld dieses Typs definiert man ein neues Icon für den Mauszeiger. Globale Variablen: ------------------ DCL MSEM SEM GLOBAL Semaphore, um Zugriff auf globale Variablen abzublocken. DCL GANZERSCREEN BTN GLOBAL Ein Button, der den gesamten Bildschirm umfaßt. DCL MAUSF BIT GLOBAL Flag zeigt an, ob der Mauszeiger dargestellt ist. DCL BUTTON(64) BTN GLOBAL Hierein kommen alle Buttons, die angeklickt werden können. Normalerweise über die Funktion ADDBUTTON. Die Plätze müssen von vorne konsekutiv besetzt sein. Hinter den letzten Button trägt man idealerweise noch einen Dummy-Button = GANZERSCREEN ein. DCL (LMT,RMT) BIT GLOBAL Zustand der linken und rechten Maustaste. DCL (MX,MY) FIX GLOBAL Position der Maus. DCL (TX,TY) FIX GLOBAL Exakte Position, wo zuletzt eine Maustaste gedrückt wurde. DCL TASTE FIX GLOBAL Nummer des Buttons, in den geklickt wurde. Die rechte Taste erhält ein negatives Vorzeichen. Globale Prozeduren: ------------------- SHOWMAUS:PROC GLOBAL Mauszeiger darstellen. HIDEMAUS:PROC GLOBAL; Mauszeiger nicht mehr darstellen. Die Maus wird aber noch weiter verfolgt. Anwendung: Z.B., um auf dem Bildschirm etwas auszugeben. STARTMAUS: PROC GLOBAL; Mausverfolgung starten. Der Mauszeiger wird noch nicht dargestellt. STOPMAUS: PROC GLOBAL; Mausverfolgung beenden. Falls nötig wird der Mauszeiger noch vom Bildschirm entfernt. WARTE: PROC REENT GLOBAL; Warte auf den nächsten Klick des Anwenders. Danach befindet sich in TASTE die Nummer des angeklickten Buttons. PAUSE:PROC REENT GLOBAL; Mausprogramm kurz deaktivieren und den Hauptbildschirm anzeigen. Z.B. um ein Kommando einzugeben. Sobald die Maus einmal geklickt wird, geht's weiter. ADDBUTTON: PROC((N,X,Y) FIX,S CHAR(16)) REENT GLOBAL; Einen Button mit dem Text S an der Position X/Y mit der Nummer N eintragen und auf dem Bildschirm zeichnen. CLEARWINDOW: PROC(E BTN) REENT GLOBAL; Fenster löschen. FRAMEWINDOW: PROC(E BTN) REENT GLOBAL; Fenster umrahmen. OPENWINDOW: PROC(E BTN,F(,)BTX IDENT) REENT GLOBAL; Hintergrund nach F retten (Dummy-Array hinter F nicht vergessen !!), Fenster löschen und umrahmen. CLOSEWINDOW: PROC(E BTN,F(,)BTX IDENT) REENT GLOBAL; Hintergrund aus F restaurieren. CENTERWINDOW: PROC(E BTN IDENT,F(,)BTX IDENT) GLOBAL; E entsprechend der durch F vorgegebenen Größe in die Mitte des Bildschirms legen. TEXTCENTERED: PROC(S()CHAR(80)IDENT,E BTN) REENT GLOBAL; Text S im Fenster zentriert ausgeben. INFOFENSTER:PROC(S()CHAR(80)IDENT,F(,)BTX IDENT) REENT GLOBAL; Info-Fenster eröffnen, Info-Text S ausgeben, Mauszeiger auf Standard stellen und anzeigen, auf Klick warten und alles wieder restaurieren. AUSWAEHLEN: PROC (S()CHAR(80)IDENT,F(,)BTX IDENT,B()CHAR(16)IDENT) REENT GLOBAL; Fenster mit Text S eröffnen, Auswahlbuttons B hineinzeichnen, darauf warten, daß einer angeklickt wird und alles wieder löschen. Die letzten beiden Zeilen in S müssen leer sein. Die Buttons müssen nebeneinander in's Fenster passen. Die Wahl ist hinterher in TASTE gespeichert. BESTAETIGUNG: PROC(S()CHAR(80)IDENT,F(,)BTX IDENT) GLOBAL; Wie AUSWAEHLEN, nur daß die zwei Buttons 'JA' und 'NEIN' vorgegeben werden. INPUT: PROC(S()CHAR(80)IDENT,F(,)BTX IDENT,Z STR IDENT) REENT GLOBAL; Komfortables String-Input-Gadget. Ein Fenster mit dem Info-Text S wird eröffnet und danach kann der String Z editiert bzw. eingegeben werden. Z muß in das Fenster passen. Die letzten beiden Zeilen in S werden für die Anzeige gelöscht. Ihr Ihnalt wird als Tastenübersetzung für die Buttons im Input-Gadget benutzt. Sind sie leer, wird die Standard- Übersetzung benutzt. MAUSCOPYRIGHT:PROC GLOBAL; Infofenster mit meiner Copyright-Meldung ausgeben. Muß in jedem Programm aufgerufen werden ! MAUSGRENZEN: PROC(E BTN) REENT GLOBAL; Bewegungsgrenzen für die Maus festlegen. Dieses Fenster gibt an, in welchem Bereich der Mauszeiger dargestellt werden darf. Auf Grund der Möglichkeit, die aktive Spitze (Hot Spot) in einem Maus-Icon und auch dessen Größe zu wählen, ist der real ansprechbare Bereich kleiner und kann zwischen verschiedenen Icons variieren ! Außerhalb dieses Fensters wird kein Bit durch den Mauszeiger geändert. Hier muß also für Textausgaben o.Ä. der Mauszeiger nicht kurzzeitig abgeschaltet werden ! BOXSIZER: PROC(E BTN) REENT GLOBAL; Aufruf, die Maus für einen Box-Sizer zu benutzen. Die Startgröße und Position sind in E angegeben. Nachdem der Benutzer das gewünschte Maß eingestellt hat, klickt er eine Taste (-> WAIT aufrufen) und die Endposition der linken unteren Ecke kann aus TX und TY bestimmt werden. Soll die Box nur in bestimmten Grenzen verändert werden dürfen, kann man vorher mit MAUSGRENZEN den Bewegungsspielraum einengen. BOXMOVER: PROC(E BTN) REENT GLOBAL; Ähnlich dem Sizer kann man mit dem Box-Mover eine Box im Bildschirm verschieben. MAUSZEIGERAENDERN: PROC(M()BTZ IDENT,(A,B,C,D)FIX) REENT GLOBAL; Ein neues Icon als Mauszeiger definieren. Die Bitmatrix ist in M. Hot Spot und Abmessungen werden durch A, B, C und D angegeben. (A,B) relative Lage der Spitze zur linken oberen Ecke des Icons (C,D) Breite und Hoehe des Icons. Das Icon sollte so definiert werden, daß rechts, links, oben und unten jeweils eine Zeile (Spalte) frei bleibt. Das wird für eine optimale Hintergrund-Maske benötigt. Sprites, die maximal 16 Pixel breit sind, sind erheblich flackerärmer als solche, die 17 und mehr Pixel breit sind. MAUSPFEIL: PROC REENT GLOBAL; Den Standard-Mauszeiger des Systems benutzen. INITMAUS: PROC (S CHAR(5)) GLOBAL; Initialisierung des Maustreibers. S ist der Name des zu benutzenden Grafik-Bildschirms. Es wird auf den Monochrom-Monitor getestet. EXITMAUS: PROC GLOBAL; Maustreiber komplett stoppen. Der Grafikbildschirm wird freigegeben und alle Tasks ausgeplant.