Glade FAQ


Questo è un elenco delle più gettonate domande ricorrenti su Glade, il costruttore di interfaccie utente Gtk+/GNOME.

1. Generali
1.1. Quando aggiungo un widget ad una finestra, questo me la occupa interamente e non posso aggiungere nessun altro widget.
1.2. Quando salvo lo XML gli stili vengono scritti correttamente, ma se lo carico e compilo il codice sorgente essi spariscono.
1.3. Come aggiungo un disegno ad un pulsante?
1.4. Come faccio ad aggiungere più di un widget (dello stesso tipo) alla volta?
1.5. Tutte le volte che uso una finestra di scorrimento ottengo il seguente avvertimento: Gtk-WARNING **: gtk_scrolled_window_add(): cannot add non scrollable widget use gtk_scrolled_window_add_with_viewport() instead
2. Compilare il codice generato
2.1. Come faccio a compilare il codice generato da Glade?
2.2. Mi dà questo errore: aclocal: configure.in: 10: macro `AM_PATH_GTK' not found in library
2.3. Mi dà questo errore: ** CRITICAL **: file glade_gnome.c: line 939 (glade_gnome_write_menu_item_source): assertion `source_buffer != NULL' failed.
3. Usare il codice generato
3.1. Quali sono i file scritti da Glade?
3.2. Quali file possono essere modificati tranquillamente dallo sviluppatore e quali invece vengono sovrascritti?
3.3. Come faccio ad aggiungere al progetto i miei file sorgenti?
3.4. Come ottengo un puntatore ad un widget da dentro un gestore di segnale?
3.5. Come ottengo il valore di un GtkOptionMenu?
3.6. Come faccio a far chiamare una funzione a GtkOptionMenu quando cambia?
3.7. Come mi connetto ai segnali GtkAdjustment?

1. Generali

1.1. Quando aggiungo un widget ad una finestra, questo me la occupa interamente e non posso aggiungere nessun altro widget.

Non è un bug di Glade! In GTK+ si usano dei contenitori per disporre i widget. I contenitori più usati si trovano in fondo alla finestra principale della palette. Prova ad aggiungere alla finestra un riquadro verticale. Ora aggiungi una tabella in una delle divisioni del riquadro verticale. Adesso hai afferrato l'idea?

Se proprio vuoi posizionare i widget in specifiche coordinate prova il contenitore a Posizioni fisse. Però questa tecnica è sconsigliata perché le tue finestre (normali o di dialogo) non avranno un bel aspetto quando vengono ridimensionate; e se poi traduci il testo delle etichette e dei pulsanti in altre lingue, le scritte potrebbero non entrarci.

1.2. Quando salvo lo XML gli stili vengono scritti correttamente, ma se lo carico e compilo il codice sorgente essi spariscono.

Gli stili non sono ancora supportati. Tuttavia puoi usare i file rc GTK+ standard per impostare font e colori dei tuoi widget. Se in Glade abiliti l'opzione di progetto Imposta nomi dei widget ti si potrebbe facilitare il lavoro. Vedi la sezione Resource Files della documentazione in developer.gnome.org/doc/API/gtk/index.html.

(In effetti ho tolto il codice non completo sugli stili nella 0.5.2, quindi spero che nessuno me lo chiederà mai più!)

1.3. Come aggiungo un disegno ad un pulsante?

Crea un pulsante e seleziona Rimuovi etichetta dal menu a comparsa. Ora puoi aggiungere al pulsante qualsiasi widget tu voglia; ad es. un riquadro orizzontale con dentro un disegno e una etichetta (Glade in futuro potrebbe rendere questa operazione ancora più semplice).

1.4. Come faccio ad aggiungere più di un widget (dello stesso tipo) alla volta?

Tieni premuto il tasto 'Control' quando selezioni il widget nella Palette. Rimarrà selezionato finché non scegli un widget diverso oppure clicchi sul Selettore.

1.5. Tutte le volte che uso una finestra di scorrimento ottengo il seguente avvertimento: Gtk-WARNING **: gtk_scrolled_window_add(): cannot add non scrollable widget use gtk_scrolled_window_add_with_viewport() instead

Puoi tranquillamente ignorarlo. È emesso da GTK+ per ricordare ai programmatori di aggiornare il proprio codice; ciò perché il comportamento delle finestre di scorrimento è cambiato abbastanza fra GTK+ 1.0 e GTK+ 1.2. Ma il codice di Glade è a posto. L'avvertimento non dovrebbe apparire nella tua applicazione finale.

2. Compilare il codice generato

2.1. Come faccio a compilare il codice generato da Glade?

Per compilare il codice C generato da Glade ti servono automake >= 1.4 e autoconf >= 2.13. Se hai attivato il supporto per gettext allora ti serve anche gettext >= 0.10.35. Per dei riferimenti sull'argomento vedi la sezione Requirements nel file README.

Lancia ./autogen.sh nella directory base del progetto per eseguire automake, autoconf e le relative utilità per generare i Makefile. Passagli tutte le opzioni che vuoi siano passate al configure; ad es. dài ./autogen.sh --prefix /usr/local/gnome.

Poi lancia il make per compilare l'applicazione.

Nota che per le applicazioni GNOME devi dare anche un make install di modo che i pixmap vengano installati appropriatamente. Se non lo fai l'applicazione funzionerà lo stesso, ma non vedrai i pixmap.

2.2. Mi dà questo errore: aclocal: configure.in: 10: macro `AM_PATH_GTK' not found in library

Significa che non è possibile trovare il file gtk.m4 (gtk.m4 è un insieme di macro m4 che vengono installate come parte di GTK+ e sono usate per compilare i programmi che usano GTK+). aclocal (che fa parte di automake) ricerca queste macro per aggiungerle ad aclocal.m4 nella directory principale del tuo programma.

Per scoprire dove è stato installato GTK+ lancia gtk-config --prefix. Il file gtk.m4 dovrebbe trovarsi nella sottodirectory share/aclocal. Per sapere qual è la directory che sta usando aclocal lancia aclocal --print-ac-dir.

Dovresti aggiungere la directory in cui sono installati i file GTK+ m4 alla variabile d'ambiente ACLOCAL_FLAGS; cioè se i file GTK+ m4 si trovano in /usr/local/share/aclocal, allora aggiungi export ACLOCAL_FLAGS="-I /usr/local/share/aclocal/" al tuo $HOME/.profile.

2.3. Mi dà questo errore: ** CRITICAL **: file glade_gnome.c: line 939 (glade_gnome_write_menu_item_source): assertion `source_buffer != NULL' failed.

Stai tentando di usare i menu di Gnome in una applicazione che è solo GTK+. Edita tutti i menu del tuo progetto ed assicurati che la proprietà "Oggetto Stock" sia impostata a "Nessuno" in tutte le voci di menu.

3. Usare il codice generato

3.1. Quali sono i file scritti da Glade?

Ecco un elenco dei file che vengono scritti di solito; se hai cambiato le opzioni del progetto alcuni nomi potrebbero essere diversi.

autogen.sh . Uno script che lancia nel giusto ordine automake, autoconf e i programmi correlati, facilitando enormemente la compilazione dell'applicazione. Devi passargli tutti gli argomenti che vuoi siano passati a configure. Dopo averlo eseguito puoi dare make per compilare l'applicazione.

configure.in . È lo script standard passato ad autoconf per generare lo script di configurazione.

Makefile.am . Contiene le direttive standard di compilazione, passate ad automake per generare il Makefile.in, che lo script configure trasforma nel Makefile.

acconfig.h . Contiene alcune macro che vengono impostate dallo script configure e aggiunte al file header config.h (che deve essere il primo file di cui si fa #include in tutti i tuoi file sorgenti). La maggior parte di queste macro servono per il supporto a gettext (ENABLE_NLS, HAVE_CATGETS, HAVE_GETTEXT, HAVE_LC_MESSAGES, HAVE_STPCPY), HAVE_LIBSM serve a Gnome (ma non danneggia le applicazioni GTK+) e solo alcune sono aggiunte da Glade (PACKAGE_LOCALE_DIR, PACKAGE_DATA_DIR, PACKAGE_SOURCE_DIR).

stamp-h.in . Usata come timestamp (data/ora) da automake, per ricompilare alcuni dei file generati.

AUTHORS, ChangeLog, NEWS, README . Questi file sono tutti inizialmente vuoti, vengono creati solo per aderire alle convenzioni GNU.

src/Makefile.am . Il file standard di make.

src/main.c . Contiene la funzione main() che creerà per te tutte le finestre (normali e di dialogo).

src/interface.h . Dichiarazioni delle funzioni che puoi chiamare per creare le finestre (normali e di dialogo) che sono state preparate in Glade.

src/interface.c . Il codice per creare le finestre (normali e di dialogo) e tutti i widget.

src/callbacks.h . Dichiarazioni delle funzioni di callback e dei gestori di segnale che scriverai.

src/callbacks.c . Le funzioni di callback e i gestori di segnale.

src/support.h . Dichiarazioni di alcune funzioni di supporto, compresa lookup_widget() che puoi usare per ottenere dei puntatori ai widget.

src/support.c .

Se è abilitato il supporto per gettext viene creata la directory po con un POTFILES.in ed un ChangeLog separati. POTFILES.in elenca i file sorgenti che contengono delle stringhe traducibili e dovresti aggiungere qui tutti i file sorgente che crei.

Per i progetti GNOME viene aggiunta anche la directory macros, che contiene tutte le macro m4 usate per compilare il progetto (veramente queste avrebbero dovuto essere installate come parte di GNOME, ma sfortunatamente ciò non è stato fatto in GNOME 1.0.x; si spera che questa cosa venga corretta in una futura versione di GNOME, al che questa directory non sarà più necessaria).

NoteCambiare le opzioni di supporto per GNOME e gettext
 

Dopo aver compilato il progetto, se cambi le opzioni Supporto per Gnome o Supporto per gettext, allora dovrai aggiornare alcuni dei file compilati, come configure.in e Makefile.am. La soluzione migliore probabilmente è di cambiare la directory del progetto nella finestra di dialogo Opzioni del progetto e ricompilare il progetto da zero. Tuttavia così facendo dovrai ricopiare tutto il codice che avevi, eventualmente, aggiunto per gestire i segnali. Un'alternativa è quella di cancellare autogen.sh, configure.in, Makefile.am, src/Makefile.am, src/main.c e ricrearli usando Glade. Ma se avevi fatto dei cambiamenti in tali file allora dovrai rifarli (si spera che in futuro Glade gestisca meglio questo problema).

3.2. Quali file possono essere modificati tranquillamente dallo sviluppatore e quali invece vengono sovrascritti?

Glade non sovrascrive quasi nessuno dei file. Esso ricreerà i file necessari per la compilazione, se non esistono già (e di conseguenza verrà abilitata la corrispondente opzione del progetto).

I file che Glade sovrascrive sono: interface.h, interface.c, support.h e support.c (sebbene, nel tuo progetto, potresti averli chiamati diversamente, cambiandoli nella finestra di dialogo Opzioni del progetto).

Tali file hanno tutti un avvertimento in cima che dice "DO NOT EDIT" (NON MODIFICARE).

Se hai aggiunto, o aggiornato, un qualunque gestore di segnale, esso verrà accodato nei file callbacks.h e callbacks.c. In questo modo qualunque codice di callback tu avessi già aggiunto è completamente al sicuro! Se hai cambiato nome ad una funzione di gestione di segnale allora sta a te cancellare la vecchia versione e copiare il codice in quella nuova.

3.3. Come faccio ad aggiungere al progetto i miei file sorgenti?

Aggiungili, compresi i file header, in src/Makefile.am, nella variabile project1_SOURCES (dove project1 è il nome del tuo progetto).

Se usi gettext probabilmente vorrai aggiungere i file sorgente anche in po/POTFILES.in; di modo che le stringhe possano essere tradotte.

3.4. Come ottengo un puntatore ad un widget da dentro un gestore di segnale?

Usa la funzione lookup_widget() (la puoi trovare in support.c).

Gli passi un puntatore ad un qualsiasi widget di una finestra e il nome del widget che vuoi ottenere. Di solito, da dentro i gestori di segnale, puoi usare il primo argomento del gestore di segnale come primo parametro di lookup_widget(); ad es:

void
on_button1_clicked                     (GtkButton       *button,
                                        gpointer         user_data)
{
  GtkWidget *entry1;

  entry1 = lookup_widget (GTK_WIDGET (button), "entry1");

  ...
}
      

Nota che ciò non funzionerà se stai usando libglade. Il codice corrispondente per libglade è:


void
on_button1_clicked                     (GtkButton       *button,
                                        gpointer         user_data)
{
  GladeXML* xml;
  GtkWidget* entry1;

  xml = glade_get_widget_tree (GTK_WIDGET (button1));
  entry1 = glade_xml_get_widget (xml, "entry1");

  ...
}
      

3.5. Come ottengo il valore di un GtkOptionMenu?

Per ottenere la voce di menu correntemente selezionata, chiama gtk_menu_get_active() con il menu GtkOptionMenu. Per trovare il suo indice nel menu puoi usare g_list_index():

void
on_button1_clicked                     (GtkButton       *button,
                                        gpointer         user_data)
{
  GtkWidget *option_menu, *menu, *active_item;
  gint active_index;

  option_menu = lookup_widget (GTK_WIDGET (button), "optionmenu1");
  menu = GTK_OPTION_MENU (option_menu)->menu;
  active_item = gtk_menu_get_active (GTK_MENU (menu));
  active_index = g_list_index (GTK_MENU_SHELL (menu)->children, active_item);

  g_print ("Active index: %i\n", active_index);
}
      

3.6. Come faccio a far chiamare una funzione a GtkOptionMenu quando cambia?

Al momento Glade non ha un modo per aiutarti a farlo, ma puoi farlo manualmente.

Quando crei la finestra prendi il menu opzioni e connettilo al segnale "deactivate" emesso dal suo menu:

  window1 = create_window1 ();
  option_menu = lookup_widget (window1, "optionmenu1");
  gtk_signal_connect (GTK_OBJECT (GTK_OPTION_MENU (option_menu)->menu),
                      "deactivate", GTK_SIGNAL_FUNC (on_option_selected),
                      NULL);
      

Poi aggiungi un gestore in callbacks.c. Puoi ottenere l'indice della voce selezionata nel modo spiegato nella domanda precedente:

static void
on_option_selected (GtkMenuShell *menu_shell,
                    gpointer data)
{
  GtkWidget *active_item;
  gint item_index;

  active_item = gtk_menu_get_active (GTK_MENU (menu_shell));
  item_index = g_list_index (menu_shell->children, active_item);

  g_print ("In on_option_selected active: %i\n", item_index);
}
      

3.7. Come mi connetto ai segnali GtkAdjustment?

Al momento Glade non lo supporta; ma puoi farlo manualmente, in modo simile a quanto visto nella domanda 3.6.

Quando crei la finestra prendi un puntatore al widget che contiene l'adattamento e connettilo al segnale "changed" o "value_changed":

  window1 = create_window1 ();
  hscale = lookup_widget (window1, "hscale1");
  gtk_signal_connect (GTK_OBJECT (GTK_RANGE (hscale)->adjustment),
                      "changed", GTK_SIGNAL_FUNC (on_adjustment_changed),
                      NULL);
      

Questa FAQ è stata scritta da Damon Chaplin (). Per favore, invia commenti e suggerimenti riguardanti questo manuale all'autore. Per maggiori informazioni su Glade, o sulle mailing list riguardanti Glade, visita la pagina web di Glade.

Traduzione italiana di Fabrizio Stefani (). Per favore, inviare commenti e suggerimenti riguardanti questa traduzione al suddetto indirizzo.