1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
| #include <gtk/gtk.h>
#include <gdk/gdk.h>
static gboolean expose_event_handler (GtkWidget *widget, GdkEventExpose *event);
static void motion_event_handler (GtkWidget *widget, GdkEventMotion *event);
/* Coordonées de la souris */
static gint mouse_x = 0, mouse_y = 0;
int
main (int argc,
char *argv[])
{
GtkWidget *window = NULL;
GtkWidget *draw = NULL;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size (GTK_WINDOW(window), 320, 200);
g_signal_connect (window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
draw = gtk_drawing_area_new ();
/* Exposition de la zone de dessin au signal émis par
* le déplacement du pointeur de la souris
*/
gtk_widget_set_events (draw,
gtk_widget_get_events (draw)
| GDK_POINTER_MOTION_MASK);
gtk_container_add (GTK_CONTAINER(window), draw);
g_signal_connect (draw, "expose-event", G_CALLBACK(expose_event_handler), NULL);
g_signal_connect (draw, "motion-notify-event", G_CALLBACK(motion_event_handler), NULL);
gtk_widget_show_all (window);
gtk_main ();
return 0;
}
static gboolean
expose_event_handler (GtkWidget *widget, GdkEventExpose *event)
{
/* Le contexte graphique, il contient les données nécessaire
* pour dessiner (épaisseur des tracés, couleurs des lignes,
* etc...)
*/
GdkGC *gc = gdk_gc_new (widget->window);
GError *error = NULL;
GdkPixbuf *background = NULL; /* Le pixbuf de fond */
GdkPixbuf *foot = NULL;
GdkPixbuf *foot_scaled = NULL;
/* On cache le curseur de la souris. (C'est pour faire
* plus joli :) )
*/
gdk_window_set_cursor (widget->window,
gdk_cursor_new_for_display (
gdk_display_get_default(), GDK_BLANK_CURSOR));
/* On charge les pixbuf à partir des fichiers */
background = gdk_pixbuf_new_from_file ("background.jpg", &error);
if (error) {
g_warning ("%s", error->message);
g_error_free (error);
error = NULL;
}
foot = gdk_pixbuf_new_from_file ("gnome-foot.png", &error);
if (error) {
g_warning ("%s", error->message);
g_error_free (error);
error = NULL;
}
/* On mets le pied dans le bon sens :p */
gdk_pixbuf_flip (foot, FALSE);
foot_scaled = gdk_pixbuf_rotate_simple (foot, GDK_PIXBUF_ROTATE_CLOCKWISE);
g_object_unref (foot);
foot = NULL;
/* Effet composite entre les pixbuf */
gdk_pixbuf_composite (foot_scaled, background,
0, 0,
gdk_pixbuf_get_width (background),
gdk_pixbuf_get_height (background),
mouse_x, mouse_y, 1, 1,
GDK_INTERP_HYPER,
100);
g_object_unref (foot_scaled);
foot_scaled = NULL;
/* On dessine le pixbuf */
gdk_draw_pixbuf (widget->window, gc, background,
0, 0, 0, 0, -1, -1,
GDK_RGB_DITHER_MAX,
0, 0);
g_object_unref (gc);
g_object_unref (background);
return FALSE;
}
static void
motion_event_handler (GtkWidget *widget, GdkEventMotion *event)
{
/* Mise à jour des coordonées de la souris */
mouse_x = event->x;
mouse_y = event->y;
/* Mise à jour de la zone de dessin */
gtk_widget_queue_draw (widget);
} |