/* demo5g.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 demo5g.c ez-gtk.c -o demo5g `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" /* Coordonnees et bouton souris */ int ax, ay, ab = 0; /* * 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_set_color (gc, EZG_BLACK); ezg_draw_text (widget, gc, NULL, EZG_TL, 10, 10, "Cliquez et bougez la souris dans la fenetre pour dessiner.\n" "Tapez sur espace pour vider la fenetre, 'q' pour quitter."); /* Il faudrait memoriser le dessin pour pouvoir le refaire ici */ 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 : /* touche 'q' */ gtk_main_quit (); break; case GDK_space : ezg_area_expose (widget); break; } return TRUE; /* L'evenement a ete traite' */ } /* * Appele'e par gtk_main lorsqu'un bouton de la souris est enfonce' */ gint area1_onButtonPress (GtkWidget *widget, GdkEventButton *ev) { GdkGC *gc = ezg_get_gc (widget); ab = ev->button; ezg_set_color (gc, EZG_GREY); gdk_draw_point (widget->window, gc, ev->x, ev->y); ax = ev->x; ay = ev->y; ezg_set_color (gc, EZG_GREEN); ezg_draw_text (widget, gc, NULL, EZG_BC, ev->x, ev->y, "Clic %d,%d", (int) ev->x, (int) ev->y); return TRUE; /* L'evenement a ete traite' */ } /* * Appele'e par gtk_main lorsqu'un bouton de la souris est relache' */ gint area1_onButtonRelease (GtkWidget *widget, GdkEventButton *ev) { ab = 0; return TRUE; /* L'evenement a ete traite' */ } /* * Appele'e par gtk_main lorsque la souris est bouge'e */ gint area1_onMotionNotify (GtkWidget *widget, GdkEventMotion *ev) { GdkGC *gc = ezg_get_gc (widget); if (ab == 0) return TRUE; ezg_set_color (gc, EZG_GREY); gdk_draw_line (widget->window, gc, ev->x, ev->y, ax, ay); ax = ev->x; ay = ev->y; return TRUE; /* L'evenement a ete traite' */ } int main (int argc, char *argv[]) { GtkWidget *win1, *area1; /* Initialise gtk et analyse la ligne de commande */ gtk_init (&argc, &argv); /* Cree une fenetre, donne un titre et une taille */ win1 = ezg_window_create (400, 300, "Demo 5 : dessin a la souris"); /* La destruction de la fenetre fera sortir de gtk_main */ g_signal_connect (G_OBJECT (win1), "destroy", gtk_main_quit, NULL); /* On cree une zone de dessin, qui prend toute la place dans la fenetre */ 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 | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_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 (area1), "button_press_event" , G_CALLBACK (area1_onButtonPress) , NULL); g_signal_connect (G_OBJECT (area1), "button_release_event", G_CALLBACK (area1_onButtonRelease), NULL); g_signal_connect (G_OBJECT (area1), "motion_notify_event" , G_CALLBACK (area1_onMotionNotify) , NULL); /* Rend visibles la fenetre et son contenu */ gtk_widget_show_all (win1); /* Boucle d'evenements qui fait "vivre" la fenetre */ gtk_main (); exit (0); }