All pastes #752392 Raw Edit

Something

public text v1 · immutable
#752392 ·published 2007-10-28 11:39 UTC
rendered paste body
# 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 <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>

#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, &gtk_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