Newsgroup: it.comp.os.linux.development
Titolo: gtk+

Hi,
da  un  po'  di tempo  uso  le  GTK+  per  lo sviluppo  di  semplici
applicazioni,  sento però  la mancanza  di un  newsgroup dove  poter
leggere, rispondere e ovviamente porre domande.
Sapete  se esiste  un ng  del genere?  Per ora  mi sono  iscritto ad
alcune mailing  list che parlano  di GTK,  solo che odio  le mailing
list, o  meglio, odio usare  mutt :) Una  volta imparato slrn  si fa
fatica ad usare altri strumenti (lo so che potrei scaricare la posta
in formato MH e leggerla con slrn, ma non è una soluzione elegante).
Ed ora posto la domanda vera  e propria: dove posso trovare semplici
esempi sull'uso dei thread con le  librerie glib? In rete ho trovato
la  documentazione  ufficiale sulle  varie  API,  ma nessun  esempio
pratico (ho sguinzagliato google ma è stato inutile :-\ ).
In  particolare  sono poi  interessato  all'uso  dei thread  tramite
glib+gtk (e qui non ho trovato davvero quasi nulla)... postate tutti
i link che avete al riguardo :)
byeZ!
-- 
Vanni Brutto
| email 
za...@nofesso.libero.it
      |
| irc nick VanniB   |   ICQ 18526701 |
--- rimuovi nofesso per rispondere ---
---PC powered by Linux kernel 2.4.14vb
Gli  uomini   desidererebbero  sposare
una  donna bella,  ricca, intelligente
e  comprensiva.   Purtroppo  la  legge
proibisce la poligamia.

 pratico (ho sguinzagliato google ma è stato inutile :-\ ).
...
Da quello che ne so io le glib 1.2 prevedono primitive dedicate per alcuni
costrutti di sincronizzazione come mutex e condvar. Ma per quanto riguarda
la creazione dei thread vai sempre con i pthreads. Sempre che tu parli di
kernel thread. Sostanzialmente non vedo particolari motivi per voler usare
le facility thread delle glib, allo stato attuale.
--
  Giuseppe "Cowo" Corbelli \/\ My software: 
http://yoda.ing.unibs.it/~cowo
    **ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
  -<! Take It All, Our Gold, Our Homes, Our Life, 
  		But We Didn't Kill Your Christ! !>-
  			Blind Guardian - The Script For My Requiem

 ... 
Probabilmente ne  saprai più di me,  quindi proverò a postare  qui i
miei dubbi (aggiungo  il tag [GTK+] in modo da  poter dare uno score
maggiore a questi thread :)) ).
Sto cercando di aggiugere un popup menu (quelli che si aprono con il
tasto destro del mouse per intenderci) sul widget GtkDrawingArea. Se
tento di usare  il codice solito per aprire un  popupmenu non sembra
funzionare,  indagando  più  a fondo  (praticamente  aggiungendo  un
printf ;))  sono giunto alla conclusione  che il problema è dato dal
fatto che  GtkDrawingArea non  emette il signal  /event/, la  cosa è
piuttosto strana, dato che GtkDrawingArea  è derivato da GtkWidget e
quindi dovrebbe rispondere al signal event
Ho  provato  diversi signal  inutilmente  e  non so  come  risolvere
l'inghippo :(
Qui  sotto ti  allego una  versione  modificata al  volo del  sample
menu.c (uno degli esempi forniti con  i sorgente di GTK+), come puoi
vedere il codice funziona sul  pulsante ma non sulla drawingarea. E'
un po' lunghetto perché ho preferito mandarti un codice completo, in
modo da evitarti la rottura  di scrivere un'applicazione per provare
il tutto. Suggerimenti?
#v+
---cut here---cut here---cut here---cut here---cut here---cut here--
#include <gtk/gtk.h>
#include <stdio.h>
static gint button_press (GtkWidget *, GdkEvent *);
static void menuitem_response (GtkWidget *widget);
int main( int   argc,
          char *argv[] )
{
    GtkWidget *window;
    GtkWidget *menu;
    GtkWidget *menu_items;
    GtkWidget *vbox;
    GtkWidget *button;
    GtkWidget *drawingarea;
    char buf[128];
    gtk_init (&argc, &argv);
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_widget_set_usize (GTK_WIDGET (window), 200, 100);
    gtk_window_set_title (GTK_WINDOW (window), "GTK Menu Test");
    gtk_signal_connect (GTK_OBJECT (window), "delete_event",
                        (GtkSignalFunc) gtk_main_quit, NULL);
    /* creazione menu */
    menu = gtk_menu_new ();
    sprintf (buf, "Test-undermenu");
    menu_items = gtk_menu_item_new_with_label (buf);
    gtk_menu_append (GTK_MENU (menu), menu_items);
    gtk_signal_connect_object (GTK_OBJECT (menu_items), "activate",
        GTK_SIGNAL_FUNC (menuitem_response), (gpointer) menu_items);
    gtk_widget_show (menu_items);
    /* vbox */
    vbox = gtk_vbox_new (FALSE, 0);
    gtk_widget_show (vbox);
    gtk_container_add (GTK_CONTAINER (window), vbox);
    /* Create a button to which to attach menu as a popup */
    button = gtk_button_new_with_label ("right click me!");
    gtk_signal_connect_object (GTK_OBJECT (button), "event",
	GTK_SIGNAL_FUNC (button_press), GTK_OBJECT (menu));
    gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
    gtk_widget_show (button);
    /* Crea una drawingarea che aprirà il popup*/
    drawingarea = gtk_drawing_area_new();
    gtk_widget_set_usize(drawingarea, 100, 100);
    gtk_signal_connect_object (GTK_OBJECT (drawingarea), "event",
	GTK_SIGNAL_FUNC (button_press), GTK_OBJECT (menu));
    gtk_box_pack_start (GTK_BOX (vbox), drawingarea, TRUE, TRUE, 0);
    gtk_widget_show (drawingarea);
    gtk_widget_show (window);
    gtk_main ();
    return 0;
}
static gint button_press( GtkWidget *widget,
                          GdkEvent *event )
{
    if (event->type == GDK_BUTTON_PRESS) {
        GdkEventButton *bevent = (GdkEventButton *) event; 
	switch (bevent->button)
	{
	    case 2:
		g_print("haha\n");
		break;
	    case 3:
		gtk_menu_popup (GTK_MENU (widget), NULL, NULL, NULL, NULL,
				bevent->button, bevent->time);
        	return TRUE;
	    default:
		g_print("pulsante: %d\n", bevent->button);
		break;
	}
    }
    return FALSE;
}
static void menuitem_response(GtkWidget *widget)
{
	GtkWidget *label;
	gchar *string;
	label = GTK_BIN (widget)->child;
	gtk_label_get (GTK_LABEL(label), &string);
	g_print ("%s\n", string);
}
---cut here---cut here---cut here---cut here---cut here---cut here--
#v-
-- 
Vanni Brutto
| email 
za...@nofesso.libero.it
      |
| irc nick VanniB   |   ICQ 18526701 |
--- rimuovi nofesso per rispondere ---
---PC powered by Linux kernel 2.4.17za
Il  bacio  sulla  bocca  è  di  grande
importanza nella vita:  è l'unica cosa
che fa stare zitta una donna. 

 quindi dovrebbe rispondere al signal event
Ok, ho provato un poco il codice e la cosa e' diversa: il widget non butta
fuori tutti i segnali. Almeno gli eventi dei pulsanti non sono usati, o io
non sono riuscito a farli andare. 
Ho connesso il segnale in questo modo:
gtk_signal_connect (GTK_OBJECT (drawingarea), "event", GTK_SIGNAL_FUNC
  (button_press), NULL);
E gli eventi tipo quando resizi la finestra, dai/togli il focus ecc. vengono
intercettati. Ma per quelli dei pulsanti non c'e' stato verso. E si' che con
signal_connect dovrebbe fare l'overriding dell'handler di default...
--
  Giuseppe "Cowo" Corbelli \/\ My software: 
http://yoda.ing.unibs.it/~cowo
    **ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
  -<! *Real* programmers use cat > a.out! No way, /real/ ones
        use zcat > a.out 'cause you can type faster that way. !>-
                -- from a Slashdot discussion

 signal_connect dovrebbe fare l'overriding dell'handler di default...
Beh, grazie ugualmente... mi sa che dovrò studiare i sorgenti di
drawingarea :)
Ad ogni modo Buon Natale :) :)
-- 
Vanni Brutto
| email 
za...@nofesso.libero.it
      |
| irc nick VanniB   |   ICQ 18526701 |
--- rimuovi nofesso per rispondere ---
---PC powered by Linux kernel 2.4.17za
Penso   che  Salomone   dovesse  avere
l'uccello  rapace,   come  direbbe  un
naturalista,    infatti   sposò    700
principesse straniere e 300 concubine.
(I° Re Cap XXI) 

 drawingarea :)
E guarda caso i sorgenti mi sono stati di aliuto! ;)
Il   trucchetto  sta   nel  connettere   il  signal   e  poi   usare
gtk_widget_set_events  per  tutti  quei  segnali  che  si  intendono
ricevere. Sinceramente non ho  ancora approfondito sull'uso dell'API
gtk_widget_set_events, visto  che nel  momento in cui  sto scrivendo
questo  messaggio  sono  offline,  cmq nel  momento  in  cui  questo
messaggio sarà inoltrato andrò a spulciarmi la documentazione online
di GTK+ :) :)
gtk_signal_connect_object (GTK_OBJECT (drawingarea), "button_press_event",
			   GTK_SIGNAL_FUNC (button_press), GTK_OBJECT (menu));
gtk_widget_set_events (drawingarea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
Come al solito "open source ruleZ!" :-D
Dimenticavo:
printf("%s\n", "buon Santo Stefano");
byeZ!
-- 
Vanni Brutto
| email 
za...@nofesso.libero.it
      |
| irc nick VanniB   |   ICQ 18526701 |
--- rimuovi nofesso per rispondere ---
---PC powered by Linux kernel 2.4.17za
Gesu':   "y=ax2+bx+c".  I   discepoli:
"Uffa, un'altra parabola!".