# compiler son widget #makefile # # Variables: # CC=gcc BIN=gtk_led SRC=main.c gtkled.c OBJ=main.o gtkled.o # # Flags du preprocesseur: # CPPFLAGS=-Wall -W -ansi -pedantic -O2 `pkg-config --cflags gtk+-2.0` # # Flags pour l'editeur de liens: # LDFLAGS=`pkg-config --libs gtk+-2.0` # # Construction du programme: # all: $(BIN) $(BIN): $(SRC) $(CC) $(CPPFLAGS) -c $(SRC) $(CC) $(LDFLAGS) -o $(BIN) $(OBJ) # # Nettoyage: # clean: rm -f *.o *~ core $(BIN) #================================ # fichier main.c #include #include #include #include "gtkled.h" static void cb_switch (GtkWidget * widget, gpointer data) { GtkWidget * led = (GtkWidget *) data; gtk_led_set_state (GTK_LED (led), ! gtk_led_get_state (GTK_LED (led))); } int main (int argc, char ** argv) { GtkWidget * win; GtkWidget * hbox; GtkWidget * btn; GtkWidget * led; gtk_init (& argc, & argv); /* * Creation de la fenetre principale et ajout d'un container. */ win = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (win), "Test de GtkLed"); gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER); gtk_window_set_default_size (GTK_WINDOW (win), 250, 50); g_signal_connect ( G_OBJECT (win), "destroy", G_CALLBACK (gtk_main_quit), NULL ); hbox = gtk_hbox_new (0, FALSE); gtk_container_set_border_width (GTK_CONTAINER (hbox), 5); gtk_container_add (GTK_CONTAINER (win), hbox); /* * Creation d'un bouton et d'un GtkLed. */ btn = gtk_button_new_with_label ("Switch led state"); gtk_box_pack_start (GTK_BOX (hbox), btn, TRUE, TRUE, 0); led = gtk_led_new ("led_on.png", "led_off.png", TRUE); if (led == NULL) { printf ("Impossible de créer le widget GtkLed !\n"); } else { gtk_box_pack_start (GTK_BOX (hbox), led, TRUE, TRUE, 0); g_signal_connect ( G_OBJECT (btn), "clicked", G_CALLBACK (cb_switch), (gpointer) led ); } gtk_widget_show_all (win); gtk_main (); return EXIT_SUCCESS; } #====================================== #fichier /* gtkled.c */ #include "gtkled.h" static void gtk_led_class_init (GtkLedClass * klass); static void gtk_led_init (GtkLed * led); static void gtk_led_load_image (GtkLed * led); static void gtk_led_size_request (GtkWidget * widget, GtkRequisition * requisition); static void gtk_led_size_allocate (GtkWidget * widget, GtkAllocation * allocation); static void gtk_led_realize (GtkWidget * widget); static gboolean gtk_led_expose (GtkWidget * widget, GdkEventExpose * event); static void gtk_led_paint (GtkWidget * widget); static void gtk_led_destroy (GtkObject * object); GtkType gtk_led_get_type (void) { static GtkType gtk_led_type = 0; if (! gtk_led_type) { static const GtkTypeInfo gtk_led_info = { "GtkLed", sizeof (GtkLed), sizeof (GtkLedClass), (GtkClassInitFunc) gtk_led_class_init, (GtkObjectInitFunc) gtk_led_init, NULL, NULL, (GtkClassInitFunc) NULL }; gtk_led_type = gtk_type_unique (GTK_TYPE_WIDGET, >k_led_info); } return gtk_led_type; } gboolean gtk_led_get_state (GtkLed * led) { return led->state; } void gtk_led_set_state (GtkLed * led, gboolean state) { led->state = state; gtk_led_paint (GTK_WIDGET (led)); } GtkWidget * gtk_led_new (const gchar * on_image, const gchar * off_image, gboolean state) { GtkLed * led = NULL; if (on_image != NULL && off_image != NULL) { led = gtk_type_new (gtk_led_get_type ()); if (led != NULL) { led->on_image = on_image; led->off_image = off_image; led->state = state; gtk_led_load_image (led); } } return GTK_WIDGET (led); } static void gtk_led_class_init (GtkLedClass * klass) { GtkWidgetClass * widget_class; GtkObjectClass * object_class; widget_class = (GtkWidgetClass *) klass; object_class = (GtkObjectClass *) klass; widget_class->realize = gtk_led_realize; widget_class->size_request = gtk_led_size_request; widget_class->size_allocate = gtk_led_size_allocate; widget_class->expose_event = gtk_led_expose; object_class->destroy = gtk_led_destroy; } static void gtk_led_init (GtkLed * led) { led->on_image = NULL; led->off_image = NULL; led->on_pixbuf = NULL; led->off_pixbuf = NULL; led->width = 0; led->height = 0; led->state = FALSE; } static void gtk_led_load_image (GtkLed * led) { led->on_pixbuf = gdk_pixbuf_new_from_file (led->on_image, NULL); led->off_pixbuf = gdk_pixbuf_new_from_file (led->off_image, NULL); led->width = gdk_pixbuf_get_width (led->on_pixbuf); led->height = gdk_pixbuf_get_height (led->on_pixbuf); } static void gtk_led_size_request (GtkWidget * widget, GtkRequisition * requisition) { g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_LED (widget)); g_return_if_fail (requisition != NULL); requisition->width = GTK_LED (widget)->width; requisition->height = GTK_LED (widget)->height; } static void gtk_led_size_allocate (GtkWidget * widget, GtkAllocation * allocation) { g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_LED (widget)); g_return_if_fail (allocation != NULL); widget->allocation = *allocation; if (GTK_WIDGET_REALIZED (widget)) { gdk_window_move_resize ( widget->window, allocation->x, allocation->y, allocation->width, allocation->height ); } } static void gtk_led_realize (GtkWidget * widget) { GdkWindowAttr attributes; guint attributes_mask; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_LED (widget)); GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); attributes.window_type = GDK_WINDOW_CHILD; attributes.x = widget->allocation.x; attributes.y = widget->allocation.y; attributes.width = widget->allocation.width; attributes.height = widget->allocation.height; attributes.wclass = GDK_INPUT_OUTPUT; attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK; attributes_mask = GDK_WA_X | GDK_WA_Y; widget->window = gdk_window_new ( gtk_widget_get_parent_window (widget), & attributes, attributes_mask ); gdk_window_set_user_data (widget->window, widget); widget->style = gtk_style_attach (widget->style, widget->window); gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL); } static gboolean gtk_led_expose (GtkWidget * widget, GdkEventExpose * event) { g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_LED (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); gtk_led_paint (widget); return FALSE; } static void gtk_led_paint (GtkWidget * widget) { GdkPixbuf * pixbuf = NULL; gint center_x = 0; gint center_y = 0; gdk_window_clear_area ( widget->window, 0, 0, widget->allocation.width, widget->allocation.height ); center_x = (widget->allocation.width / 2) - (GTK_LED (widget)->width / 2); center_y = (widget->allocation.height / 2) - (GTK_LED (widget)->height / 2); if (GTK_LED (widget)->state) pixbuf = GTK_LED (widget)->on_pixbuf; else pixbuf = GTK_LED (widget)->off_pixbuf; gdk_pixbuf_render_to_drawable ( pixbuf, GDK_DRAWABLE (widget->window), NULL, 0, 0, center_x, center_y, GTK_LED (widget)->width, GTK_LED (widget)->height, GDK_RGB_DITHER_NORMAL, 1, 1 ); } static void gtk_led_destroy (GtkObject * object) { GtkLed * led; GtkLedClass * klass; g_return_if_fail (object != NULL); g_return_if_fail (GTK_IS_LED (object)); led = GTK_LED (object); if (led->on_pixbuf != NULL && led->off_pixbuf != NULL) { gdk_pixbuf_unref (led->on_pixbuf); gdk_pixbuf_unref (led->off_pixbuf); led->on_pixbuf = NULL; led->off_pixbuf = NULL; } klass = gtk_type_class (gtk_widget_get_type ()); if (GTK_OBJECT_CLASS (klass)->destroy) { (* GTK_OBJECT_CLASS (klass)->destroy) (object); } } erreur renvoiyée: line 6: gtkled.c: command not found line 7: gtkled.o: command not found Package gtk+-2.0 was not found in the pkg-config search path. Perhaps you should add the directory containing `gtk+-2.0.pc' to the PKG_CONFIG_PATH environment variable No package 'gtk+-2.0' found line 13: -W: command not found Package gtk+-2.0 was not found in the pkg-config search path. Perhaps you should add the directory containing `gtk+-2.0.pc' to the PKG_CONFIG_PATH environment variable No package 'gtk+-2.0' found ect ect