/* demo1g.c : demos de EZ-Draw reecrits en gtk+ 2.x * * Edouard.Thiel@lif.univ-mrs.fr - 23/03/2010 - version 0.9 * * Compilation sous Unix : * gcc -Wall demo1g.c -o demo1g `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 #include #include #include #include /* * Dessine un texte s avec x,y en Middle Center */ void draw_text_MC (GdkWindow *win, GdkGC *gc, PangoLayout *layout, int x, int y, char *s) { PangoRectangle extents; /* On donne la chaine a afficher */ pango_layout_set_text (layout, s, strlen(s)); /* On recupere les dimensions */ pango_layout_get_pixel_extents (layout, &extents, NULL); /* On affiche le texte grace a ce layout */ pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER); gdk_draw_layout (win, gc, x - extents.x - extents.width/2, y - extents.y - extents.height/2, layout); } /* * Appele'e par gtk_main lorsqu'il faut tout redessiner. */ gint area1_onExpose (GtkWidget *widget, GdkEventExpose *ev) { /* On recupere le contexte graphique associe' au widget */ GdkGC *gc = widget->style->fg_gc[GTK_WIDGET_STATE (widget)]; /* On cree un layout pour dessiner du texte */ PangoLayout *layout = gtk_widget_create_pango_layout (widget, NULL); draw_text_MC (widget->window, gc, layout, 200, 150, "Pour quitter, tapez sur la touche 'q', ou\n" "cliquez sur l'icone fermeture de la fenetre"); /* Libere la memoire */ g_object_unref (G_OBJECT (layout)); 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' */ } return TRUE; /* L'evenement a ete traite' */ } int main (int argc, char *argv[]) { GtkWidget *win1, *align1, *area1; /* Initialise gtk et analyse la ligne de commande */ gtk_init (&argc, &argv); /* Cree une fenetre, donne un titre et une taille */ win1 = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (win1), "Demo 1g : fenetre et evenements"); gtk_window_set_default_size (GTK_WINDOW (win1), 400, 300); /* La destruction de la fenetre fera sortir de gtk_main */ g_signal_connect (G_OBJECT (win1), "destroy", gtk_main_quit, NULL); /* On cree un conteneur qui prend toute la place dans la fenetre */ align1 = gtk_alignment_new (0, 0, 1, 1); gtk_container_add (GTK_CONTAINER (win1), align1); /* On cree une zone de dessin, qui prend toute la place grace au conteneur */ area1 = gtk_drawing_area_new (); gtk_container_add (GTK_CONTAINER (align1), area1); /* 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); /* Rend visibles la fenetre et son contenu */ gtk_widget_show_all (win1); /* Boucle d'evenements qui fait "vivre" la fenetre */ gtk_main (); exit (0); }