[Risolto] Gtk e selezione di File: errori in compilazione

In questi giorni sto dando un’occhiata alle gtk: siccome mi interessava la finestra per la selezione di un file o di una cartella, ho provato http://www.fifi.org/doc/libgtk1.2-doc/gtk-tutorial-it-html/gtk_tut_it-7.html#ss7.10 esempio:

#include <gtk/gtk.h>

/* Recupera il nome di file selezionato e stampalo a console */
void file_ok_sel(GtkWidget *w,GtkFileSelection *fs)
 {g_print("%s\n",gtk_file_selection_get_filename(GTK_FILE_SELECTION(fs)));}

void destroy(GtkWidget *widget,gpointer data)
 {gtk_main_quit();}

int main(int argc,char *argv])
 {
  GtkWidget *filew;
  gtk_init(&argc,&argv);
/* Crea un nuovo widget di selezione file */
  filew=gtk_file_selection_new("File selection");
  gtk_signal_connect(GTK_OBJECT(filew),"destroy",(GtkSignalFunc)destroy,&filew);
/* Connette ok_button alla funzione file_ok_sel */
  gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filew)->ok_button),"clicked",(GtkSignalFunc)file_ok_sel,filew);
/* Connette cancel_button alla funzione di distruzione del widget */
  gtk_signal_connect_object(GTK_OBJECT(GTK_FILE_SELECTION(filew)->cancel_button),"clicked",(GtkSignalFunc)gtk_widget_destroy,GTK_OBJECT(filew));
/* Preassegnamo un nome di file, come se stessimo dando un valore per difetto in dialogo di tipo `` salva con nome '' */
  gtk_file_selection_set_filename(GTK_FILE_SELECTION(filew),"penguin.png");
  gtk_widget_show(filew);
  gtk_main();
  return 0;
 }

Per compilarlo, ho seguito le indicazioni di http://developer.gnome.org/gtk3/3.0/gtk-getting-started.html pagina:

gcc `pkg-config --cflags gtk+-3.0` -o selectFile selectFile.c `pkg-config --libs gtk+-3.0`
selectFile.c:4:31: error: unknown type name ‘GtkFileSelection’
selectFile.c: In function ‘main’:
selectFile.c:15:8: warning: assignment makes pointer from integer without a cast [enabled by default]
selectFile.c:16:51: error: ‘GtkSignalFunc’ undeclared (first use in this function)
selectFile.c:16:51: note: each undeclared identifier is reported only once for each function it appears in
selectFile.c:16:65: error: expected ‘)’ before ‘destroy’
selectFile.c:18:58: error: invalid type argument of ‘->’ (have ‘int’)
selectFile.c:18:96: error: expected ‘)’ before ‘file_ok_sel’
selectFile.c:20:65: error: invalid type argument of ‘->’ (have ‘int’)
selectFile.c:20:107: error: expected ‘)’ before ‘gtk_widget_destroy’

Come vedete, però, ottengo una serie di errori.
Dove sbaglio? Scusate, ma vengo da java e non sono ancora molto pratico di c…

Aggiornamento: sembra che GtkFileSelection sia stato sostituito da GtkFileChooser, e ho trovato http://developer.gnome.org/gtk/2.24/GtkFileChooserDialog.html#gtkfilechooser-typical-usage un esempio che sono riuscito a fare funzionare.

domanda: la routine è inclusa in una applicazione oppure fa parte di uno script bash ?

No, niente script bash. Stavo solo “giocando” con python, c e gtk. Comunque alla fine ho visto che in python viene molto più semplice (senza contare che imparare a integrare c e python sarebbe stata un’ulteriore complicazione), per cui ho abbandonato la versione in c. In ogni caso la versione funzionante in c (che in realtà seleziona una cartella, e non un file, ma se serve selezionare un file basta sostituire GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER con GTK_FILE_CHOOSER_ACTION_OPEN) è questa:

cat selectDir.c
#include <gtk/gtk.h>

char *filename;

int main(int argc,char *argv])
 {
  GtkWidget *dialog;
  gtk_init(&argc,&argv);
  dialog=gtk_file_chooser_dialog_new("Select a file",NULL,GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,GTK_STOCK_OPEN,GTK_RESPONSE_ACCEPT,NULL);
  if (gtk_dialog_run(GTK_DIALOG(dialog))==GTK_RESPONSE_ACCEPT)
   {
    filename=gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
    g_print(filename);
   }
  else
   {
    filename=NULL;
    g_print("Scelta non effettuata");
   }
  g_print("\n");
  gtk_widget_destroy(dialog);
  return 0;
 }

Si compila con

gcc `pkg-config --cflags gtk+-3.0` -o selectDir selectDir.c  `pkg-config --libs gtk+-3.0`

bene.
grazie per le preziose informazioni.