Eigener Desktop in Pascal plus

Jeder kennt inzwischen das Einheitsgrau des Desktops von ATARI. Mit den zwei folgenden Prozeduren kann sich jeder ST Pascal Plus User ein eigenes Desktop in seinen Programmen erstellen.

Mit dem Pascal-Compiler ST Pascal plus von CCD hat man ein gutes, einfach zu bedienendes Programmierwerkzeug zur Hand. Besonders die GEM-Bibliothek ist den Machern gut gelungen. Die einfache Handhabung macht das Umgehen mit GEM und mit seinen Oberflächen zum Kinderspiel. Doch wie jedes Ding hat ST Pascal plus auch seine Schattenseiten. Eine davon ist das Erzeugen und Verwalten eines eigenen DESKTOPS.

Installation des Desktops

Zuerst baue man einen Dialog auf (via New_dialog) und lege das Aussehen seiner Einträge fest (Zeile 86-94). Da die Menüzeile ausgespart wird, ist es ratsam, den Wert 1 als y-Koordinate der Prozedur New_dialog zu übergeben. Will man seinen DESKTOP mit einer Rasterung unterlegen, so addiere man als erstes einen Eintrag vom Typ G_BOX (hier: Unterlage Zeile 89) hinzu. Bei Unterlassung erhält man eine weiße Fläche als Hintergrund. Danach kann ganz normal der Dialog aufgebaut werden. Allerdings sollten nur folgende Typen verwendet werden: G_BOX, G_TEXT, G_BOXTEXT, G_IMAGE, G_USERDEF, G_STRING, G_ICON.

Ist der Aufbau erledigt, schlägt die Prozedur EIGENES_DESKTOP zu, der nur der Zeiger auf den Dialog übergeben werden muß (Zeile 20). GEM erkennt ein neues Desktop an der Kennung DESKTOP=0 (Zeile 21) und an dem Parameter WF_NEWDESKTOP=14, die der Prozedur Wind_set übergeben werden. Diese Prozedur kann zum Glück verwendet werden. Die Compilerprogrammierer haben sie so übernommen, wie es im GEM vorgesehen ist, das heißt: Nach dem Parameter WF_NEWDESKTOP erwartet GEM eine Adresse (4 Byte) - aufgespalten in high und low (je 2 Bytes) - auf eine Objektstruktur. Da Pascal aber nur mit Zeigern arbeitet, muß man ein wenig tricksen, um an diese Adresse heranzukommen. Die Varianten Records helfen dabei (Zeile 40). Man übergebe adresse.z den Wert aus dia - intern ist ein Zeiger nichts anderes als eine Adresse (=long_integer) - und in adresse.l steht nun die tatsächliche Adresse. Die Aufspaltung in low und high habe ich wieder über einen Varianten Record vorgenommen (Achtung: In Version 2.0 muß die Compileroption I- gesetzt sein); es geht natürlich auch anders. Somit sind alle Werte für die Wind_set-Prozedur vorhanden. Nach dem Aufruf weiß GEM: ‘Jetzt wird ein neues Desktop installiert’. Über die FORM_DIAL-Routine (AES-Nr. 51) wird dieses auf den Bildschirm gebracht (Zeile 42-45). Fertig ist unser Desktop. Die Verwaltung übernimmt jetzt GEM. Man kann sich mehrere Desktops erschaffen und diese abwechselnd auf die eben beschrieben Weise auf den Bildschirm bringen. Jeweils der letzte so übergebene Dialog wird als DESKTOP verwaltet.

Ändern

Manchmal ist es notwendig, Teile des Desktops zu verändern (Status, Text). Genau das macht die Prozedur DESKTOP_AENDERN (Zeile 47). Die Schwierigkeit dabei ist, daß auch zurZeit durch Fenster etc. verdeckte Einträge geändert werden müssen, ohne daß diese Änderung sofort auf dem Bildschirm sichtbar ist. Doch dazu gleich. Erst zu den Übergabeparametern: Übergeben werden Desktopdialogzeiger; Kennung des zu ändernden Eintrags; der (evtl. leere) Text; Schriftart; Ausrichtung; ein bool’scher Wert, der angibt, ob Text geändert werden soll; Breite und Höhe des Eintrags in Pixel. Über First_rect und Next_rect werden die sichtbaren Rechtecke des Desktops (Parameter 0) ermittelt, über Obj_offset (AES-Nr. 44) die x-/y-Koordinaten des zu ändernden Eintrags, über Rect_intersect die Schnittmenge der beiden Flächen (hier sind die Höhe und die Breite des Eintrags wichtig). Diese Schnittmenge wird als Ausgabebereich definiert [Set_clip (Zeile 76)], und dann wird mit Obj_draw (AES-Nr. 42) neu gezeichnet. Der Set_clip-Aufruf in Zeile 76 verhindert, daß ein Eintrag gezeichnet wird, der gerade verdeckt ist. Damit GEM aber von der Veränderung etwas mitbekommt, muß auf jeden fall der AES-Aufruf gemacht werden. Mit Set_clip(0,0,640,400) (Zeile 78) wird als Ausgabebereich der ganze Bildschirm wieder freigegeben. Jetzt steht dem eigenen Desktop hoffentlich nichts mehr im Wege. Viel Spaß bei der Programmiererei.

{---------------------------------------------------}
{----- Erstellen eines selbstdefinierten DESKTOP ---}
{---------------------------------------------------}
{----- Geschrieben von:                        -----}
{---------------------------------------------------}
{----- WOLFRAM PÜCHERT                         -----}
{----- 6570 Kaiserslautern                     -----}
{----- Wilhelm - Raabe - Straße 26             -----} 
{---------------------------------------------------}
{----- 2.12.1987 ST Pascal plus 1.2/2.0        -----}
{----- (c) MAXON Computer GmbH                 -----}
{---------------------------------------------------}

Program Eigenes_Desktop_erstellen;
CONST   {$I GEMCONST}
TYPE    {$I GEMTYPE}
        DESKITEM        = RECORD
              unterlage : integer;
              texte     : ARRAY[1..10] of integer;
              kasten    : ARRAY[1..10] of integer;
                          END;
VAR     deskdia         : DIALOG_PTR;
        deskeintrag     : DESKITEM;
        i               : integer;

{$I GEMSUBS}
Procedure Status_aendern(VAR dia     : DIALOG_PTR
                             eintrag : TREE_INDEX; 
                             status  : integer);
BEGIN
Obj_setstate(dia,eintrag,NORMAL,true);
Obj_setstate(dia,eintrag,status,true)
END;                        {Prozedur Status_aendern}
Procedure Eigenes_desktop(VAR dia : DIALOG_PTR); 
CONST   DESKTOP         = 0;
        WF_NEWDESKTOP   = 14;
TYPE    ZEIGER_ADRESSE= RECORD
                        CASE boolean OF 
                            true : (z:^char);
                            false: (l:long_integer);
                        END;
        INTEGER_LONG  = RECORD
                        CASE boolean OF
                            false: (l:long_integer);
                            true : (i:PACKED ARRAY[1..2] of integer);
                        END;
VAR     adresse         : ZEIGER_ADRESSE;
        long_int        : INTEGER_LONG;
        int_in          : ARRAY[0..15] of integer;
        int_out         : ARRAY[0..45] of integer;
        addr_in         : ARRAY[0..1] of ^char;
        addr_out        : ARRAY[0..0] of ^char;
BEGIN
adresse.z := dia; long_int.l := adresse.l;
            {Arbeitsbereich für neues Desktop}
wind_set(DESKTOP,WF_NEWDESKTOP,long_int.i[1], long_int.i[2],0,0); 
int_in[0] := 3;
int_in[1] := 0;   int_in[2] := 0;
int_in[3] := 640; int_in[4] := 400; 
int_in[5] := 0;   int_in[6] := 0;
int_in[7] := 640; int_in[8] := 400; {Form_dial} 
Aes_call (51, int_in, int_out, addr_in, addr_out);
END;                    {Prozedur Eigenes_desktop}
Procedure Desktop_aendern (VAR dia : DIALOG_PTR;
                eintrag            : TREE_INDEX;
                neuer_text         : STRING;
                schrift            : integer;
                justierung         : TE_JUST;
                neuer_status       : integer;
                text_aendern       : boolean;
                ebreite, ehoehe    : integer);
VAR     x_koor, y_koor, breite, hoehe : integer;
        int_in          : ARRAY[0..15] of integer;
        int_out         : ARRAY[0..45] of integer;
        addr_in         : ARRAY[0..1] of ^char;
        addr_out        : ARRAY[0..0] of ^char;
        bool            : boolean;
BEGIN
Hide_mouse; Begin_update;
First_rect(0,x_koor,y_koor,breite,hoehe);
WHILE (breite<>0) AND (hoehe<>0) DO 
BEGIN
    IF text_aendern THEN
        Set_dtext(dia,eintrag,neuer_text,schrift,justierung);
    Status_aendern(dia,eintrag,neuer_status);{Koordinaten holen) 
    int_in[0] := eintrag; addr_in[0] := dia;
    Aes_call(44,int_in,int_out,addr_in,addr_out); 
    int_in[1] := 0;
    int_in[2] := int_out[1]; int_in[3] :=int_out[2];
    int_in[4] := ebreite; int_in[5] := ehoehe;{Rechteckausschnitt einschränken} 
    bool:= Rect_intersect(x_koor,y_koor,breite,hoehe, int_in[2],int_in[3],int_in[4],int_in[5]); 
    Set_clip(int_in[2],int_in[3],int_in[4],int_in[5]);
    Aes_call(42,int_in,int_out,addr_in,addr_out); 
    Set_clip(0,0,640,400);
    Next_rect(0,x_koor,y_koor,breite,hoehe);
END;        {Solange noch Rechtecke}
End_update; Show_mouse;
END;        {Desktop_aendern}
BEGIN
IF Init_gem>=0 THEN 
BEGIN
    deskdia := New_dialog(21,0,1,80,24);
    WITH deskeintrag DO 
    BEGIN
        unterlage := Add_ditem(deskdia,G_BOX,NONE,0,0,80,24,-1,4305); 
        texte[1]  := Add_ditem(deskdia,G_BOXTEXT,NONE,2,2,40,2,3,4480); 
        kasten[1] := Add_ditem(deskdia,G_BOX,NONE,2,10,10,3,-2,4257); {Es können weitere Einträge erfolgen}
        Set_dtext(deskdia,texte[1],' Desktop neu !!!',SYSTEM_FONT,TE_CENTER);
        Obj_setstate(deskdia,kasten[1],SHADOWED,false); 
    END;
    Eigenes_desktop(deskdia);
    i := Do_alert('[1][ Sieh es Dir an !! | |][ weiter ]',1);
    Desktop_aendern(deskdia,deskeintrag.texte[1],'Neuer Text !!',
                    SYSTEM_FONT,TE_CENTER,NORMAL, true,40*8,2*16); 
    i := Do_alert('[1][ Sieh es Dir an !! | |][ weiter ]',1);
    Exit_gem;
END;

Wolfram Püchert
Aus: ST-Computer 11 / 1989, Seite 91

Links

Copyright-Bestimmungen: siehe Über diese Seite