Wrapper's voor GraphApp

Inhoud


Inleiding

GraphApp is een bibliotheek voor window toepassingen . Gemaakt door  :

L. Patrick

Basser Department of Computer Science
School of Information Technologies
University of Sydney 2006
Australia

http://enchantia.com/software/graphapp/

Het heet eenvoudig te gebruiken  en na enig gepuzzel valt het inderdaad wel mee .

Het voordeel van deze bibliotheek is dat het redelijk klein is (ongeveer 800k) .
En zowel werkt onder X11(Linux/Unix) als een .so bestand  als onder MSWindows (98/XP) als een .dll bestand .
Het bevat naast een mogelijk Menu's temaken over de nodige LijstSelectie alsmeede RadioKnoppen , PopUp menus's e.d.
Ook zijn een aantal Dialogen aanwezig zoals FileOpen FileSave en een Messagebox met verschillend antwoord mogelijkheden .
Ook is het mogelijk drie soorten plaatjes te gebruiken te weten .gif , .png , .jpg . (Soms wel een beetje erg veel om te onthouden)

Graph Appl vertalen

Vertaald met de mingw (mswindows) en linux .

Mingwin .

Om de mingw DLL telaten maken moet de volgende opdracht aan de make file worden toegevoegd .

MAKE_DYNAMIC_LIB = gcc -shared -o

DLL           = graphapp.dll
dynamic:    apptypes.h $(DLL)
$(DLL):    $(OBJECTS) $(HEADERS)
    $(exist $(DLL), del $(DLL))
    $(MAKE_DYNAMIC_LIB) $(DLL) win32/*.o utility/*.o gui/*.o imgfmt/*.o libgif/*.o \
        libjpeg/*.o libpng/*.o libz/*.o -mwindows -Wl,--out-implib,libgraphapp.a

Zover ik het begrepen heb -mwindows zorgt ervoor dat er geen Console box (DOS box) worden opgestart .
 -Wl,--out-implib,libgraphapp.a haalt uit de lib de symbolreferentie voor de DLL .
(wil je referentie's uit andere DLL gebruiken geeft dan -Bdynamic plus de gewenste lib's mee.)

Linux (GCC)

De linux versie kun je met de meegegeven Makefile gebruiken . Zorg wel dat je een aantal header files uit de X11 hebt .

Wrapper voor Peu / Euphoria

De wrapper voor Peu en Euphoria is geschreven door Matt Arriola .
De wrap file graphapp.eu is oorsprongkelijk voor Linux gemaakt maar werk ook in MSWindows als je maar even de DLL toevoegd .
Deze bevat een include bestand file.e welke call's naar een pipe bevat , verwijder deze als je in MSWindows werkt . (voorbeeld ex05 werkt niet meer)
Verwijder de dubbele declaratie get_image_area . Wijzig get_window_area , parameters zijn onjuist .
Verander app_fil_rect in app_window_fill_app (en verwijder euapp_fill_rext)
Voorbeeld EX04 is uitgebreid met de benodigde edit-actie zoals copy/paste .
Voorbeeld TRY2 is aan aanzet voor een equivalend voor Xdailog (wat zover ik weet alleen voor Linux/Unix beschikbaar is)

Peu en Euphoria werken hoofdzakelijk met een CallBack functie . Het is echter ook mogelijk deze omtezetten in een scanner functie .
Inplaats van main_loop() welke uitgaat van CallBack's gebruik dan next_event() welke een pointer terug geeft van de structuur welke is aangeroepen . (zie EX02A)  . Hiertoe zijn alle hook in de bibliotheek gewijzigd door centrale hook omzetter ( get_hook(hook)) met -1 niets , 0 event_scanner anders callbackfunc() .

Wrapper voor Fortran (G77)

De wrapper is nog lang niet af ! Maar is bedoeld omtezien of het wel mogelijk is .
Bijvoorbaad twee wetenswaardigheden :
Parameter worden gegeven als call by reference , oftewel als pointers . Indien CHAR parameter worden gebruikt wordt de lengte van deze als laatste parameter als call by value meegegeven .
 ( call proc(charstring,integer)  geeft in C  void proc_(char *txt, int *i, int length_txt)
   result=char function(parameter) geeft in C void proc_( char *result , int len_result , int *parameter)  )
Characterstring van Fortran naar C moeten voorzien worden van een laatste teken '\0' en eventueel moeten de leading spaces gestripd worden .
Characterstring van C naar Fortran moet gekopierd worden totaan '\0' en opgevult worden met spatie's tot de door Fortran gegeven textlengte .
Event Scanning (voorbeeld)
Er is gekozen voor een scanning techiek t.b.v de event afhandeling (zie ook JAPI) . Dit betekend dat de aanroep van next_event() een pointer terug geeft welke indentiek is aan een der gemaakte var=GraphApp_functie() of 1 als er geen callback is of het is 0 wat aangeeft dat alle windows gesloten zijn . Dit geeft de mogelijkheid is geheel anders te doen tussen twee event's .

Je kunt het voorbeeld zowel in Linux als in MSWindows vertalen .
Linux   : g77 -o test grapappg77.f graphappg77.c ./libapp.so
Mingw : g77 -o test grapappg77.f graphappg77.c graphapp.dll -mwindows
Hoe je foutlose typcasting krijgt ontgaat mij nog steeds , maar het blijven waarschuwingen en het werkt er wel om , alleen niet netjes .

CallBack (voorbeeld)
Bij deze methode roept een event een functie aan welke direct wordt uitgevoerd . In de huidige wrapper worden nu alle event afgehandeld door main_loop() . Als alle windows gesloten zijn is de procedure beeindigd . Dit betekend in Fortran dat de CallBack's moeten worden gedeclareerd alszijnde een external function .  De parameters van de CallBack functie zijn pointers d.w.z. om de pointer waarde te krijgen moet je de parameter door de functie %loc halen . V.b. parameter is I (dat geeft de waarde van het eerste element van de Graph Structuur weer )  , het adres van de structuur wordt verkregen door adresStruct = %loc(I) . De CallBack van MenuItem geeft als waarde zijn ouder maar door nu %loc te gebruiken krijg je het adres van MenuItem (zie struct MenuItem in app.h) .

Je kunt het voorbeeld zowel in Linux als in MSWindows vertalen .
Linux   : g77 -o test grapappcb.f graphappg77.c ./libapp.so
Mingw : g77 -o test grapappcb.f graphappg77.c graphapp.dll -mwindows

Dialogs (voorbeeld)

In dit voorbeeld wordt het gebruik van alle Dialogs getoond . De declaratie logical mag ook vervangen worden door integer alleen eist Fortran dan dat je de conditie in het if statement ook als een vergelijking op geeft . Daar een aantal Dialog alleen een vorm van oke/cancel geven heb ik deze gedeclareerd als logical .
Voor File dialog geldt dat de waarde welke de functie terug geeft ok of cancel is . De file naam (+pad) staat in de laatste parameter .

Je kunt het voorbeeld zowel in Linux als in MSWindows vertalen .
Linux   : g77 -o test dialog.f graphappg77.c ./libapp.so
            Start dit vanuit een console anders kun je de antwoorden niet lezen .
Mingw : g77 -o test dialog.f graphappg77.c graphapp.dll
            Vertaal deze zonder -mwindows anders kun je de antwoorden niet lezen .

Broncode downloading


Uitleiding

Naast GraphApp zijn er mij nog twee systemen bekend die zowel in Linux/unix als in MSWondows werken .
Heb je hierwat aan gehad mail mij dan maar eens .