Next Previous Contents

2. "Example", un programma di esempio

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.

2.1 Creare l'interfaccia con FLUID

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:

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".

2.2 Il Main del programma.

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".

2.3 Il makefile.

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.

2.4 Compilare

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.

2.5 Il Risultato

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.


Next Previous Contents