Per facilitare la comprensione (comunque piuttosto semplice) di FLUID e dell'uso della libreria ho pensato di realizzare un piccolissimo programmino che permette di visualizzare files di testo; qui di seguito sono elencate le operazioni salienti che ho eseguito per farlo.
Come prima cosa consiglio la creazione di una directory apposita che
dovra' contenere i software realizzati con fltk, come ad esempio
~/src/fltk.
Fatto questo, aprire un terminale xterm e digitare i seguenti
comandi:
cd src/fltk
fluid
Se la procedura di installazione e' stata eseguita correttamente, si apre il programma FLUID; esso permette di gestire in maniera visuale i vari oggetti che compongono l'interfaccia del programma che si desidera realizzare.
Dunque, come prima cosa e' necessario creare la Finestra del programma; per fare questo e' necessario:
New \ code \ function/method " e premere OK nel Dialog-box che apparira'; quest'ultimo permette di scegliere il nome della funzione che dovra' essere invocata dal programma per creare la gerarchia di oggetti della quale e' a capo.New \ group \ Windows" ; nel dialog-box che si apre impostare i seguenti dati:
New \ text \ Output" ; nel dialog-box che si apre impostare i seguenti dati:
TextOutput appena creato in modo che occupi la parte superiore della finestra in quasi tutta la sua larghezza (in altezza lasciarlo possibilmente invariato).New \ group \ Group" ; nel dialog-box che si apre impostare i seguenti dati:
New \ buttons \ Button" ; nel dialog-box che si apre impostare i seguenti dati:
New \ other \ Browser" ; nel dialog-box che si apre impostare i seguenti dati:
New \ buttons \ Button" ; nel dialog-box che si apre impostare i seguenti dati:
A questo punto l'interfaccia del programma dovrebbe essere completa, quindi, non resta che configurare l'Estensione dei files sorgenti che fluid dovra' generare (cioe' .cpp anziche' .cxx) tramite il comando "Edit \ Preferences", salvare il tutto con il comando "File \ Save" sul file di nome fltk.fl ed uscire da FLUID con il comando "File \ Quit".
Il Main e le funzioni principali del programma sono rappresentate dal seguente codice sorgente:
fltkMain.cpp
// UDA'Software 2000
// File: fltkMain.cpp
// Version: 1.0 $Revision: 1.2 $
/*
Esempio di applicazione realizzata con la libreria fltk.
*/
/*
$Log: fltkMain.cpp,v $
Revision 1.2 2000/02/05 17:15:46 uda
add: Aggiunti Commenti alle varie operazioni svolte dal software.
bug: Il programma andava in crash a causa della mancanza di un
controllo nel caso in cui l'utente, dopo aver selezionato il Button
"Open File", prema "Cancel" nel Dialog-Box per selezionare un file.
*/
/*
Copyright (C) 1988 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 1, or (at your option)
any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
// //////////////////////////////////////////////////////////////////////////////////////////////////////////
// __________________________________________________________________________________________________________
// Include le Librerie necessari.
#include <FL/Fl.h>
#include <Fl/fl_ask.h>
#include <Fl/fl_file_chooser.H>
#include <string.h>
#include "fltk.h"
// //////////////////////////////////////////////////////////////////////////////////////////////////////////
// __________________________________________________________________________________________________________
#define MAXPATH 256
#define EXAMPLE_CPPSOURCE "fltkMain.cpp"
#define EXAMPLE_EXITCONFIRM "Vuoi uscire dal programma ?"
#define EXAMPLE_FILEOPENMSG "Selezionare il file che si desidera visualizzare"
// //////////////////////////////////////////////////////////////////////////////////////////////////////////
// __________________________________________________________________________________________________________
// Variabile globale.
char *psFileViewed; // Percorso del file che deve essere visualizzato dal programma.
// Il Main.
int main (int argc, char **argv) {
// Crea la Finestra 'w' di tipo 'Fl_Window' utilizzando la funzione 'make_window()'.
Fl_Window *w = make_window();
// Alloca memoria e inizializza la variabile contenente il nome del file da visualizzare.
psFileViewed = new char[MAXPATH];
strncpy(psFileViewed, EXAMPLE_CPPSOURCE, MAXPATH - 2);
psFileViewed[MAXPATH - 1] = 0;
// Termina la creazione della finestra e la visualizza.
w->end();
w->show();
// Apre il file da visualizzare e lo carica nell'oggetto 'Example_BrowserViewFile' di tipo 'Browser'.
Example_BrowserViewFile->load(psFileViewed);
// Imposta l'oggetto 'Example_OutputLabel' di tipo 'TextOutput' con il nome del file visualizzato.
Example_OutputLabel->value(psFileViewed);
// Manda in esecuzione il programma e ritorna il codice di uscita quando questo termina.
return Fl::run();
}
// //////////////////////////////////////////////////////////////////////////////////////////////////////////
// __________________________________________________________________________________________________________
// callback della finestra.
void
ExampleExit(Fl_Window *, void *) {
// Nel caso l'utente prema il tasto ESC , il programma gli chiede se e' sicuro di voler uscire.
if (fl_ask(EXAMPLE_EXITCONFIRM))
exit(0);
}
// //////////////////////////////////////////////////////////////////////////////////////////////////////////
// __________________________________________________________________________________________________________
// callback del Bottone "Open File".
void
ExampleButtonFileOpen(Fl_Button *, void *) {
// Apre il Dialog-Box appartenente alla libreria FLTK che permette di selezionare un file.
const char *cpsFileViewed = fl_file_chooser(EXAMPLE_FILEOPENMSG, "*", psFileViewed);
// Se il nome del file da visualizzare e' valido:
if (cpsFileViewed && strlen(cpsFileViewed)) {
// Copia il Nome del File selezionato nella variabile globale.
strncpy(psFileViewed, cpsFileViewed, MAXPATH - 2);
psFileViewed[MAXPATH - 1] = 0;
// Visualizza il file ed imposta il suo nome nell'apposito text output.
Example_BrowserViewFile->load(psFileViewed);
Example_OutputLabel->value(psFileViewed);
}
}
// //////////////////////////////////////////////////////////////////////////////////////////////////////////
// __________________________________________________________________________________________________________
// callback del Pulsante "Quit".
void
ExampleButtonQuit(Fl_Button *, void *) {
exit(0);
}
Il file e' stato creato utilizzando come editor
Emacs e sfruttando le utility RCS per il controllo
di versione dei sorgenti presenti nel menu "Tools \ Version
Control".
Per compilare il programma e' necessario affidarsi all'utility
make, la quale, necessita di un apposito file che gli dica
quali operazioni deve compiere; l'uso di questa utility e'
indispensabile nel caso in cui si intenda realizzare software di una
certa complessita' (ma anche per quelli piccoli) dato che permette di
automatizzare la procedura di compilazione in base ai sorgenti
modificati.
Un possibile makefile puo' essere il seguente:
makefile
# makefile
TARGET = fltk
LIB = -L/usr/X11R6/lib -lfltk -lXext -lX11 -lm
SOURCE = fltkMain.cpp
FLUID_SOURCE = fltk.cpp
FLUID_HEADER = fltk.h
FLUID = fltk.fl
$(TARGET): $(SOURCE) $(FLUID_SOURCE) $(FLUID_HEADER)
g++ -g -o $(TARGET) $(SOURCE) $(FLUID_SOURCE) $(LIB)
$(FLUID_SOURCE) $(FLUID_HEADER): $(FLUID)
fluid -c $(FLUID)
clean:
rm -f $(TARGET) $(FLUID_SOURCE) $(FLUID_HEADER) *.o *~ core
In pratica vengono definite della "Variabili" (TARGET, SOURCE .... utilizzate con $(TARGET), $(SOURCE)) e dei "Target" (che possono essere dei files o delle etichette) che Dipendono da altri "Target".
Ad esempio, sostituendo alle Variabili i Valori, otterremmo un makefile come il seguente (il quale, tra l'altro, funziona proprio come quello sopra):
fltk: fltkMain.cpp fltk.cpp fltk.h
g++ -g -o fltk fltkMain.cpp fltk.cpp -L/usr/X11R6/lib -lfltk -lXext -lX11 -lm
fltk.cpp fltk.h: fltk.fl
fluid -c fltk.fl
clean:
rm -f fltk fltk.cpp fltk.h *.o *~ core
In pratica si ottiene che il file fltk dipende da
fltkMain.cpp, fltk.cpp, fltk.h dove, gli ultimi due,
dipendono a loro volta da fltk.fl; una volta stabilita la
dipendenza, e' necessario specificare il comando da eseguire per
soddisfarla.
Sara' poi il make a preoccuparsi di eseguire i comandi
nell'ordine esatto rispettando le dipendenze; ad esempio, per
soddisfare il "Target" fltk e' necessario elaborare quello di
fltk.cpp fltk.h.
Per compilare e' sufficiente dare il comando make; se tutto
quello descritto precedentemente e' stato eseguito correttamente,
dovrebbe presentarsi un output di questo tipo:
[uda@udasoftware fltk]$ make
fluid -c fltk.fl
g++ -g -o fltk fltkMain.cpp fltk.cpp -L/usr/X11R6/lib -lfltk -lXext -lX11 -lm
A fine risulta presente il programma fltk che puo' essere
lanciato con il comando ./fltk.
Il risultato di tante fatiche e' un semplice programmino che visualizza il codice sorgente di se stesso (se presente), oppure, un file qualsiasi previa selezione da parte dell'utente tramite il bottone "File Open".
Uno Screenshot del programma e' disponibile qui:
screenshot.jpg; e' possibile scaricare i
sorgenti e questa documentazione contenuti nel file
udafltk.tar.gz cliccando qui:
udafltk.tar.gz.