Auch unter GEM gibt es Clipboards, die den Bedienungskomfort erhöhen
Über manche Themen kann man nicht genug schreiben. Diesen Monat nehme ich mich erneut [1] eines Aspekts des Betriebssystems an, der mit beängstigender Regelmäßigkeit falsch dokumentiert und benutzt wird: das Scrap-Directory, auch Zwischenablage oder Clipboard genannt.
Auf die Gefahr hin, Bekanntes zu wiederholen, hier kurz eine Zusammenfassung der (beabsichtigten) Funktion der Zwischenablage. Ein Clipboard gestattet es verschiedenen Programmen, untereinander auf standardisierte Art und Weise Daten auszutauschen. Beispielsweise sollte eine Textverarbeitung einen Textblock auf die Zwischenablage ablegen und von ihr einlesen können. Von einem Malprogramm erwartet man, daß es dasselbe mit Bildausschnitten erledigt. Stellt ein Programm schon beim Start fest, daß auf der Zwischenablage Daten zur Verfügung stehen, sollte es den Benutzer darüber auch informieren — beispielsweise durch Invertieren eines Icons (Bild 1).
Anders als beim Macintosh, bei dem der Datenaustausch tatsächlich über den Hauptspeicher stattfindet, hat es sich Digital Research relativ einfach gemacht [2]: Über zwei AES-Funktionen fragt man lediglich den Namen eines Directory für die Clipboard-Dateien ab beziehungsweise setzt ihn. Das vermindert allerdings die Leistungsfähigkeit dieses Verfahrens nicht.
Bevor wir uns nun die Funktionsweise der Zwischenablage genau anschauen, stelle ich Folgendes klar: Selbst wenn zur Zeit leider nur sehr wenige Programme die Zwischenablage nutzen, ist dies noch lange kein Grund, die Scrap-Funktionen für andere Zwecke zu mißbrauchen. So verhindert man nämlich die reibungslose Verwendung der Zwischenablage durch andere Programme. Wenn heutzutage Programmierer die Zwischenablage für eigene Zwecke verwenden, dürfte die Schuld in erster Linie bei zwei Büchern liegen ([3],[4]), die dies ausdrücklich vorschlagen. Dies ist nicht Sinn und Zweck einer Betriebssystem-Dokumentation!
Die Zwischenablage nimmt nach Konvention jeweils genau ein Objekt eines bestimmten Typs auf. Daher gehören zum Standard-Pfad nicht nur Laufwerk und Ordnername, sondern auch der Dateiname. Nur die Namenserweiterung ist variabel. Daher sieht ein beispielhafter und so auch von Digital Research angegebener Scrap-Pfad folgendermaßen aus:
C:\SCRAPDIR\SCRAP.*
Und mit genau diesem Pfad als Parameter sollte man dann auch die GEMDOS-Funktionen »Fsfirst()« oder »Fsnext()« aufrufen, um Dateien auf der Zwischenablage zu finden.
Digital Research hat auch einige Standard-Extensions vorgeschlagen: »TXT« für einfache Textdateien, »DIF« für Daten von Tabellenkalkulationen, »CSV« für durch Kommata getrennte Zahlenwerte, »GEM« für Meta- und »IMG« für die Standard-IMG-Dateien. Als Erweiterung bieten sich noch die »IFF«-Dateien an, die sich lobenswerterweise auch auf dem ST inzwischen größerer Beliebtheit erfreuen.
Damit hätten wir schon das nötige Rüstzeug, um benutzer-freundliche Programme mit Unterstützung der Zwischenablage zu schreiben. Beginnen wir mit dem Programmstart. Leider muß man davon ausgehen, daß noch kein Programm das Scrap-Directory gesetzt hat. Daher ist zunächst zu testen, ob »scrp_read()« eine leere Zeichenkette ergibt. Ist dies der Fall, sollte man selbst dafür sorgen, daß ein vernünftiges Directory gesetzt wird. Das darf prinzipiell überall sein, besonders sinnvoll wäre es jedoch, den Ordner »SCRAPDIR« im Wurzelverzeichnis des Bootlaufwerks zu wählen — ganz einfach weil auch das Konvention unter GEM-Anwendungen ist. Also: Nur die Namenserweiterung ist variabel! Falls ein solcher Ordner nicht existiert, legen Sie ihn selbst an. Auf jeden Fall sollte der eingestellte Pfad sich an das von Digital Research vorgeschlagene Format halten.
Anschließend sollten Sie testen, ob sich auf der Zwischenablage Dateien befinden, die das Programm weiterverarbeiten kann. Fast alle Anwendungen finden zum Beispiel für einfache Textdateien Verwendung. Auch sollte man den Benutzer darauf aufmerksam machen, daß sich Daten in der Zwischenablage befinden. Wie das genau geschieht (beispielsweise durch Invertieren eines Icons) ist unerheblich.
Damit faßt die Zwischenablage jeweils ein Objekt eines Dateityps. Macintosh- und Aladin-erfahrenen Programmierern ist bestimmt schon aufgefallen, daß die Verwaltung der Zwischenablage auf dem Mac noch ein Stück flexibler ist. Dort kennen sie ein Accessory — das »Album« — mit dem sie auch mehrere Objekte verwalten. Auch dies ließe sich leicht auf dem ST verwirklichen: Mehr als das passende Umbenennen der Dateien und einer Anzeigemöglichkeit ist nicht nötig!
Erster prominenter Bewerber um die Zwischenablage ist die neueste Version von »1st Word Plus« (3.11), die als Puffer-Kommandos auch die Zwischenablage nutzt (Bild 2). Bei den Namenskonventionen liegt 1st Word Plus richtig: Es speichert Textausschnitte unter »SCRAP.TXT« (ASCII-Text) und »SCRAP.1WP« (Text im 1st Word Plus-Format). Der Haken: Das Programm hält sich beim Anlegen des Scrap-Pfades nicht an die Digital-Research-Konvention und kommt auch nicht mit einem bereits vorher eingestellten korrekten Scrap-Pfad zurecht. Diese Tatsache ist GST bekannt — hoffen wir, daß die Programmierer sich vor der endgültigen Version eines Besseren besinnen. Eine andere unangenehme Marotte der neuen 1st Word Plus-Version ist, daß sie Parameter in der Kommandozeile nicht mehr auswertet. Pech für alle Command-Line-Shell-Fans. Der Textverarbeiter erkennt nur noch die über die Shell-Routinen des AES übergebenen Parameter.
Zur Demonstration der Scrap-Funktionen und als kleines Hilfsmittel beim Programmieren finden Sie im abgedruckten Listing ein einfaches Turbo-C-Programm zum Auslesen und Setzen des Scrap-Pfades. Es läßt sich mit geringem Aufwand an andere C-Compiler, und andere Programmiersprachen anpassen. (uh)
Quellennachweis:
[1] Julian Reschke: »Bedienungskomfort — kein Privileg des Macintosh«, 68000er, 2/1988
[2] Digital Research: »GEM AES Reference Guide«, Second Edition, June 1986
[3] Abraham/Englisch/Gilnther/Szczepanowski: »GEM«, Data Becker, 1986, ISBN 3-89011-251-X
[4] Brückmann/Englisch/Gerrits: »Atari ST Intern«, 4. Auflage, Data Becker, 1988, ISBN 3-890I1-I19-X
/*
SetScrap
Copyright (c) Julian F. Reschke 1989
Setzt AES-Clipboard-Directory
Compiler: Turbo C 1.0
*/
#include <aes.h>
TEDINFO rs_tedinfo[] = {
"",
"__________________________________________________________",
"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",
3, 6, 0, 0x1180, 0x0, -1, 66,66,
"(C) 1989 J. RESCHKE & ST-MAGAZIN".
"",
"",
5, 6, 1, 0x1180, 0x0, -1, 36,1};
OBJECT rs_object[] = {
-1, 1, 5, G_BOX, NONE, OUTLINED, (void *)0x21100L, 1,1. 69,7,
2. -1, -1, G_STRING, NONE, NORMAL,"- Set Scrap -", 2,1, 13,1,
3. -1, -1, G_FTEXT, EDITABLE. NORMAL,&(rs_tedinfo(0]), 2,3, 65,1,
4. -1. -1, G_TEXT, NONE, NORMAL, &(rs_tedinfo[1]), 32,1, 35,1,
5. -1, -1, G_BUTTON, SELECTABLE|EXIT, NORMAL, "Abbruch",49,8,1,
0, -1, -1, G_BUTTON, SELECTABLE 10x26, NORMAL, "OK”, 59,5, 8,};
int main ( void )
{
register int i;
int x,y,w,h;
char buffer[80];
if(appl_init()!=(-1))
{
graf_mouse(ARROW,0L);
for(i=0;i<6;i++)
rsrc_obfix(rs_object,i);
form_center(rs_object,&x,&y,&w,&h);
x-=4; y-=4; w+=8; h+=8;
scrp_read(buffer);
rs_tedinfo[0].te_ptext = buffer;
form_dial(FMD_START,x,y,w,h,x,y,w,h);
objc_draw(rs_object,0,4,x,y,w,h);
i = (form_do(rs_object,2)&0xff);
if(i==5)
scrp_write(rs_tedinfo[0].te_ptext);
form_dial(FMD_FINISH,x,y,w,h,x,y,w,h);
}
appl_exit();
return 0;
}
Listing. Mit wenigen Zeilen setzen oder lesen Sie den Scarp-Pfad