In einigen Fällen kann es sinnvoll sein, aus eigenen Programmen heraus auf die Daten der Desktop-Info zuzugreifen. Wie man dies bewerkstelligen und welche Effekte man so erzielen kann, soll uns an dieser Stelle beschäftigen.
Befindet sich beim Bootvorgang eine Datei mit dem Namen “DESKTOP.INF” auf dem Bootlaufwerk, werden die Daten in dieser Datei vom GEM dazu verwendet, das Aussehen des Desktops und diverse Voreinstellungen festzulegen. Diese Daten bleiben solange gültig, bis sie vom Anwender verändert werden oder ein Reset ausgelöst wird. Welche Informationen die “DESKTOP.INF”-Datei enthält und wie diese organisiert sind, wurde bereits von Oliver Dietz in der ST-Computer 10/86 ausführlich behandelt. Da sich der Leserkreis inzwischen sicher vergrößert hat, möchte ich das Wichtigste hier noch einmal zusammenfassen. Anschließend sehen wir uns an, wie man diese Informationen vom GEM erfragen und verändern kann.
Die Datei “DESKTOP.INF” enthält Angaben über die RS232-Parameter, Druckerkonfiguration, Bildschirmauflösung und -farben, Kontrollfeldparameter, Namen der angemeldeten Anwendungen sowie Fenster- und Icon-Positionen. Diejenigen Parameter, die die Schnittstellen sowie Auflösung und Farben betreffen, können über diverse Betriebssystemaufrufe ermittelt und verändert werden. Die restlichen Angaben, die das GEM betreffen, sind jedoch über das Betriebssystem nicht ohne weiteres erreichbar. Es gibt jedoch Situationen, in denen es nötig ist, auf das Aussehen des Desktops Einfluß zu nehmen, bevor man durch das Beenden eines Programms in dieses zurückkehrt. So kann es eine Festplatte übelnehmen, wenn das Desktop versucht, ein Festplatten-Window zu öffnen, nachdem die Platte geparkt worden ist. Aus diesem Grund kann man solche Parkprogramme nicht von der Festplatte starten, wenn man nach dem Parkvorgang wieder zum Desktop zurückkehren möchte. Schließlich muß man in diesem Fall ein Festplatten-Window geöffnet haben, um das Parkprogramm zu starten. Das heißt jedoch, daß das Desktop versucht, dieses Window nach dem Verlassen des Programms erneut zu öffnen. Wie man dieses Problem lösen kann, soll Gegenstand der nächsten Zeilen sein. Ein kleines Assembler-Programm mit dem Namen CLOSE soll die Vorgehensweise beim Manipulieren der Desktop-Daten verdeutlichen und als Anschauungsmaterial für eigene Anwendungen dienen.
Die Daten der “DESKTOP.INF’-Datei werden nach einem Systemstart nicht nur vom GEM interpretiert, sondern die Datei wird in einem speziellen AES-Puffer gespeichert. Jede Änderung auf dem Desktop, die vom Anwender durchgeführt wird, wird sofort in diesem Puffer vermerkt. Der Menüpunkt Arbeit sichern schreibt den Inhalt des Puffers auf die Disk zurück. Ändern Sie die Anga-
[....]
gesamten 1024 Bytes zu kopieren, da ja im voraus nicht bekannt ist, wie umfangreich die Daten der Desktop-Info sind.
Nachdem die Daten erfolgreich im eigenen Puffer gelandet sind, können sie nach Herzenslust manipuliert werden. Im einfachsten Fall liest man nur ein paar Informationen aus, z.B. um festzustellen, welche Voreinstellungen über das Desktop vorgenommen wurden. Solche Angaben können auch für eigene Programme relevant sein. Denkbar wäre auch, die Daten zu erweitern, um eine weitere Anwendung anzumelden. In unserem Fall geht es jedoch darum, die Fensterdaten zu ändern. Zielsetzung soll es sein, alle Windows bis auf die der Laufwerke A und B zu schließen. So kann man sichergehen, daß bei der Rückkehr ins Desktop die Festplatte nicht mehr angesprochen wird. Gleiches gilt dann allerdings auch für RAM-Disks, da diese die gleichen Laufwerkskennungen wie Festplatten-Partitionen besitzen können. Die Unterscheidung zwischen Festplatten und RAM-Disks ist zwar programmtechnisch möglich, würde hier jedoch den Rahmen sprengen. Zurück also zur eigentlichen Aufgabe. Um die gewünschten Windows zu schließen, muß geprüft werden, ob die offenen Windows für die Floppies oder für die Festplatte zuständig sind. Da der erste Buchstabe des Window-Namens die Laufwerkskennung darstellt, ist dies keine Kunst. Handelt es sich um ein A oder ein B, braucht das zugehörige Window nicht geschlossen zu werden. Andernfalls wird ein “@” an die erste Stelle des Namens geschrieben. Wie bereits erwähnt, gelten solche Windows für das Desktop als geschlossen.
Hat man die gesamten Desktop-Daten, die mit einem CTRL-Z abgeschlossen sind, durchgearbeitet, müssen diese wieder in den AES-Puffer geschrieben werden. Hierzu bedient man sich des SHEL_PUT-Aufrufs, der die gleichen Parameter erhält wie SHEL_GET. Nachdem die Daten zurückgeschrieben worden sind, kann man getrost in Desktop zurückkehren. Die einzigen Windows, die nun geöffnet werden, beziehen sich auf die Floppies A und B, und die Festplatte hat ihre Ruhe.
GEMDOS = 1
SETBLOCK= $4a
text
move.l sp,a0
lea stack+200,sp ;Stackpointer initialisieren
move.l 4(a0),a0
move.l 12(a0),a1
add.l 20(a0),a1
add.l 28(a0),a1
lea $100(a1),a1
move.l a1,-(sp)
move.l a0,-(sp)
clr -(sp)
move #SETBLOCK,-(sp)
trap #GEMDOS ;überzähligen Speicher frei
lea 12 (sp),sp
tst.l d0 ;alles klar?
bne error ;leider nein-
lea intin,a5 ;Pointer auf INTIN-Array
lea intout,a6 ;Pointer auf INTOUT-Array
moveq #10,d0 ;appl_init
move.l #$00010000,d1
bsr.s aes
tst (a6) ;Fehler?
bmi.s error ;ja-
lea deskinf,a4 ;Puffer für Desktop-Info
moveq #122,d0 ;shel_get
move.l #$01010100,d1
move #1024,(a5) ;1024 Bytes kopieren
move.l a4,addrin ;Pufferadresse eintragen
bsr.s aes ;AES-Puffer auslesen
loop: move.b (a4)+,d0
beq.s einfo
cmp.b #26,d0 ;CTRL-Z?
beq.s einfo ;ja-
cmp.b #'#',d0
bne loop
cmp.b #'W',(a4) ;folgen Fensterdaten?
bne loop ;nein-
lea 23(a4),a4 ;Pointer auf Fensternamen
move.b (a4),d0
cmp.b #'@',d0 ;Fenster offen?
beq loop ;nein-
cmp.b #'C',d0 ;Floppy-Fenster?
bcs loop ;ja-
move.b #'@',(a4) ;Fenster desaktivieren
bra loop
einfo: moveq #123,d0 ;shel_put
move.l #$01010100,d1
move #1024,(a5) ;1024 Bytes schreiben
move.l #deskinf,addrin
bsr.s aes ;neuen Pufferinhalt zurück
moveq #19,d0 ;appl_exit
move.l #$00010000,d1
bsr.s aes
error: clr -(sp)
trap #GEMDOS ;das war's
*AES-Aufruf
*Funktionsnummer in D0, Parameter in D1
aes:
lea contrl,a0
move d0,(a0)
movep.l d1,3(a0) ;4 Parameter übertragen
move.l #aespb,d1
move #$c8,d0
trap #2
rts
data
*Pointer auf AES-Arrays
aespb: dc.l contrl,global,intin,intout,addrin,addrout
bss
*Definitionen der AES-Arrays
contrl: ds.w 11
global: ds.w 15
intin: ds.w 64
intout: ds.w 64
addrin: ds.w 64
addrout:ds.w 64
deskinf:ds.b 1024 ;Puffer für Desktop-Daten
stack: ds.l 50 ;sollte für Stack reichen