Newsgroup: it.comp.os.linux.development
Titolo: esempi gtk: dove?

E' gia' stata spesso posta la domanda a proposito del reperimento di
qualche manuale per GTK, ma come risposte si ottengono sempre le stesse:
gtk.org
developer.gnome.org
Il problema della (comunque buona) documentazione che si trova presso tali
siti e' che sono un po' carenti di esempi: nel momento in cui si vuol fare
qualcosa di un poco piu' complesso degli esercizi puramente didattici non
si sa da che parte girarsi...
Qualcuno mi puo' segnalare una buona raccolta di codici di esempio
(possibilmente in C, non C++, ma mi posso pure accontentare :-) )?
Per risolvere alcuni dubbi mi son messo pure ad osservare i sorgenti di
gedit, ma e' ovvio che non ci si puo' mettere a studiare su un progetto
gia' cosi' maturo :-)
Grazie per ogni segnalazione :-)
-- 
Roberto "MadBob" Guido
ICQ #226260259
mail madbobC...@CANCELLAk.st
web 
http://madbob.homelinux.com/

 si sa da che parte girarsi...
"Esempi" è difficile trovarne. Quello che hai fatto tu (scaricare i
sorgenti di ${GTK_PROGRAM} e cominciare a tampinarci dentro) è IMHO
l'approccio corretto.
Invece di partire da gEdit[1], ti consiglierei di studiarti qualche
applicazione più semplice; uno dei giochi per GNOME, ad esempio. O,
anche, una delle utility di sistema.
Oppure, imparare le GTK+ usando uno dei binding a disposizione (per
esempio Perl[2] e Python[3]), dove la codebase sarà pure minore, ma
la leggibilità del codice sicuramente maggiore.
+++
[1] gEdit, tuttavia, va bene per imparare ad usare gtksourceview.
[2] 
http://gtk2-perl.sourceforge.net
[2] 
http://www.pygtk.org
Ciao,
 Emmanuele.
-- 
Emmanuele Bassi (Zefram)                 [ 
http://www.emmanuelebassi.net
 ]
GnuPG Key fingerprint = 4DD0 C90D 4070 F071 5738  08BD 8ECC DB8F A432 0FF4

 
Bene, allora modifico la domanda: da quale applicazione si potrebbe
partire per capire un po' come gestire diverse finestre o per rendere
input testuale da una entry?
Lo so, me lo potrei benissimo cercar da solo, ma sentire anche l'opinione
di altri che ci son gia' passati non fa mai male :-)


 input testuale da una entry?
Gestire varie finestre /as in/ avere un'interfaccia documento-centrica
(ogni istanza dell'UI è associata ad un documento)?
Beh, ognuno la implementa un po' come vuole.
Una buona idea sarebbe usare una GHashTable, usare un identificativo
univoco per ogni finestra per associarvi una struct che contenga, tra le
altre cose, il puntatore alla GtkWindow.
Esempio:
	typedef struct _DocumentWindow	DocumentWindow;
	struct _DocumentWindow {
		GtkWidget *window;
		guint32 id;
 
		/* ... */
	};
A questo punto, crei un "metodo" document_window_new(), in cui allochi
spazio per la struttura, e dentro assegni l'id tramite g_random_int()
(o, se vuoi una funzione monotona strettamente crescente, usi time()).
L'hashtable la puoi usare così:
	GHashTable *window_list = NULL;
	/* ... */
 
	/* crea la hashtable, usando un direct_hash, dato che
	 * g_random_int() restituisce un intero della dimensione giusta,
	 * e un g_direct_equal, dato che stiamo usando interi.
	 * document_window_free è una funzione che libera la memoria
	 * occupata dalla DocumentWindow, e torna comoda dato che, per
	 * distruggere tutte le finestre, ci basterà invocare
	 * g_hash_table_destroy() sulla window_list
	 */
	window_list = g_hash_table_new_full (
			g_direct_hash,
			g_direct_equal,
			NULL,
			(GDestroyNotify) document_window_free);
	/* ... */
 
	/* inserisci la DocumentWindow nello slot dell'hashtable - il
	 * codice per evitare ripetizioni della chiave random lo lascio
	 * come esercitazione per lo studente. ;-)
	 */
	if (! g_hash_table_lookup (window_list, id))
		g_hash_table_insert (window_list, id, doc_window);
 
Ma, ripeto, è solo un modo come un altro; potresti usare un semplice
array
Personalmente, l'ho usato in Python e in Perl con ottimi risultati.
Puoi vedere come fa AbiWord, ad esempio; la sezione di codice delegata
per questa funzione è sufficientemente confinata.
