/* demo6g.c : demos de EZ-Draw reecrits en gtk+ 2.x * * Edouard.Thiel@lif.univ-mrs.fr - 13/05/2009 - version 0.9 * * Compilation sous Unix : * gcc -Wall demo6g.c ez-gtk.c -o demo6g `pkg-config gtk+-2.0 --cflags --libs` * * This program is free software under the terms of the * GNU Lesser General Public License (LGPL) version 2.1. */ #include "ez-gtk.h" /* En global */ GtkWidget *win1, *area1, *win2, *area2, *win3 = NULL, *area3; int show2 = 1; /* * Appele'e par gtk_main lorsqu'il faut tout redessiner. */ gint area1_onExpose (GtkWidget *widget, GdkEventExpose *ev) { GdkGC *gc = ezg_get_gc (widget); ezg_area_clear (widget); ezg_draw_text (widget, gc, NULL, EZG_TL, 10, 10, "Cliquez dans cette fenetre (pour donner le focus clavier),\n" "puis tapez :\n" " - sur 'm' pour montrer ou cacher la fenetre 2 ;\n" " - sur 'c' pour creer ou detruire la fenetre 3 ;\n" " - sur 'q' pour quitter.\n" "\n" "Si vous fermez cette fenetre, le programme se terminera."); return TRUE; /* L'evenement a ete traite' */ } /* * Appele'e par gtk_main lorsqu'il faut tout redessiner. */ gint area2_onExpose (GtkWidget *widget, GdkEventExpose *ev) { GdkGC *gc = ezg_get_gc (widget); ezg_draw_text (widget, gc, NULL, EZG_TL, 10, 10, "Si vous fermez cette fenetre, elle sera simplement cachee."); return TRUE; /* L'evenement a ete traite' */ } /* * Appele'e par gtk_main lorsqu'il faut tout redessiner. */ gint area3_onExpose (GtkWidget *widget, GdkEventExpose *ev) { GdkGC *gc = ezg_get_gc (widget); ezg_draw_text (widget, gc, NULL, EZG_TL, 10, 10, "Si vous fermez cette fenetre, elle sera detruite."); return TRUE; /* L'evenement a ete traite' */ } /* * Appele'e par gtk_main lorsque l'icone de fermeture de fenetre est enfonce' */ gint win2_onDelete (GtkWidget *widget, GdkEventKey *ev) { show2 = 0; gtk_widget_hide_all (win2); return TRUE; /* Intercepte l'evenement "fermeture de fenetre" */ } /* * Appele'e par gtk_main lorsque la fenetre est detruite */ gint win3_onDestroy (GtkWidget *widget, GdkEventKey *ev) { win3 = NULL; return TRUE; /* L'evenement a ete traite' */ } /* * Appele'e par gtk_main lorsqu'une touche a ete presse'e. */ gint area1_onKeyPress (GtkWidget *widget, GdkEventKey *ev) { /* ev->keyval contient le symbole de la touche pressee */ switch (ev->keyval) { case GDK_q : gtk_main_quit (); break; /* touche 'q' */ case GDK_m : show2 = !show2; /* on affiche ou on cache la fenetre */ if (show2) gtk_widget_show_all (win2); else gtk_widget_hide_all (win2); break; case GDK_c : if (win3 == NULL) { /* la fenetre 3 n'existe pas, on la cree */ win3 = ezg_window_create (380, 220, "Fenetre 3"); area3 = ezg_area_create (win3); /* On autorise certains evenements */ gtk_widget_set_events (area3, GDK_EXPOSURE_MASK); /* On attache des callbacks pour gerer certains evenements */ g_signal_connect (G_OBJECT (area3), "expose_event" , G_CALLBACK (area3_onExpose) , NULL); g_signal_connect (G_OBJECT (win3) , "destroy" , G_CALLBACK (win3_onDestroy) , NULL); /* Rend visibles la fenetre et son contenu */ gtk_widget_show_all (win3); } else { gtk_widget_destroy (win3); win3 = NULL; } break; } return TRUE; /* L'evenement a ete traite' */ } int main (int argc, char *argv[]) { /* Initialise gtk et analyse la ligne de commande */ gtk_init (&argc, &argv); win1 = ezg_window_create (400, 300, "Demo 6g : plusieurs fenetres"); area1 = ezg_area_create (win1); /* On autorise certains evenements */ GTK_WIDGET_SET_FLAGS (area1, GTK_CAN_FOCUS); gtk_widget_set_events (area1, GDK_EXPOSURE_MASK | GDK_KEY_PRESS_MASK); /* On attache des callbacks pour gerer certains evenements */ g_signal_connect (G_OBJECT (area1), "expose_event" , G_CALLBACK (area1_onExpose) , NULL); g_signal_connect (G_OBJECT (area1), "key_press_event", G_CALLBACK (area1_onKeyPress), NULL); g_signal_connect (G_OBJECT (win1) , "destroy" , G_CALLBACK (gtk_main_quit) , NULL); /* Rend visibles la fenetre et son contenu */ gtk_widget_show_all (win1); win2 = ezg_window_create (400, 200, "Fenetre 2"); area2 = ezg_area_create (win2); /* On autorise certains evenements */ gtk_widget_set_events (area2, GDK_EXPOSURE_MASK); /* On attache des callbacks pour gerer certains evenements */ g_signal_connect (G_OBJECT (area2), "expose_event" , G_CALLBACK (area2_onExpose) , NULL); g_signal_connect (G_OBJECT (win2) , "delete_event" , G_CALLBACK (win2_onDelete) , NULL); /* Rend visibles la fenetre et son contenu */ gtk_widget_show_all (win2); /* Boucle d'evenements qui fait "vivre" la fenetre */ gtk_main (); exit (0); }