#include "acidlaunch.h"
/* expose event - redraw the image's drawing area */
static void expose(GtkWidget *drawing_area, GdkEventExpose *event, gpointer data)
{
GdkPixbuf *pixbuf;
pixbuf = (GdkPixbuf *)gtk_object_get_data(GTK_OBJECT(drawing_area), "pixbuf");
if (gdk_pixbuf_get_has_alpha (pixbuf)) {
gdk_draw_rgb_32_image (drawing_area->window,
drawing_area->style->black_gc,
event->area.x, event->area.y,
event->area.width,
event->area.height,
GDK_RGB_DITHER_MAX,
gdk_pixbuf_get_pixels(pixbuf)
+ (event->area.y * gdk_pixbuf_get_rowstride(pixbuf))
+ (event->area.x * gdk_pixbuf_get_n_channels(pixbuf)),
gdk_pixbuf_get_rowstride(pixbuf));
} else {
gdk_draw_rgb_image(drawing_area->window,
drawing_area->style->white_gc,
event->area.x, event->area.y,
event->area.width,
event->area.height,
GDK_RGB_DITHER_NORMAL,
gdk_pixbuf_get_pixels(pixbuf)
+ (event->area.y * gdk_pixbuf_get_rowstride(pixbuf))
+ (event->area.x * gdk_pixbuf_get_n_channels(pixbuf)),
gdk_pixbuf_get_rowstride(pixbuf));
}
}
static void button_clicked(GtkWidget *widget, gpointer data )
{
ImageButton* button = (ImageButton*) data;
button->clicked();
}
void ImageButton::clicked()
{
cout << "default click method\n";
}
/* create a button from an image file */
ImageButton::ImageButton(const char* filename, int xsize, int ysize, int bgcolor)
{
GdkPixbuf* pic;
/* load the image file */
if(!(pic = gdk_pixbuf_new_from_file(filename)))
{
cerr << "Error loading image file " << filename << endl;
filename = prefsFileName("default.png");
pic = gdk_pixbuf_new_from_file(filename);
delete[] filename;
}
/* scale and composite image */
image = gdk_pixbuf_composite_color_simple(pic,
xsize, ysize,
GDK_INTERP_BILINEAR,
255,
2,
bgcolor, bgcolor);
gdk_pixbuf_unref(pic);
w = gdk_pixbuf_get_width(image);
h = gdk_pixbuf_get_height(image);
fixed = gtk_fixed_new();
drawing_area = gtk_drawing_area_new();
gtk_object_set_data (GTK_OBJECT(drawing_area), "pixbuf", image);
gtk_drawing_area_size (GTK_DRAWING_AREA(drawing_area), w, h);
gtk_signal_connect(GTK_OBJECT(drawing_area), "expose_event",
GTK_SIGNAL_FUNC(expose), this);
gtk_widget_show(drawing_area);
gtk_widget_set_usize( fixed, w, h );
gtk_fixed_put( GTK_FIXED(fixed), drawing_area, 0, 0 );
gtk_widget_show(fixed);
button = gtk_button_new();
gtk_object_set_data(GTK_OBJECT(button), "imagebutton", this);
gtk_container_add( GTK_CONTAINER(button), fixed );
gtk_signal_connect( GTK_OBJECT(button), "clicked",
GTK_SIGNAL_FUNC(button_clicked), this );
gtk_widget_show(button);
}
ImageButton::~ImageButton()
{
gtk_widget_destroy(drawing_area);
gtk_widget_destroy(fixed);
gtk_widget_destroy(button);
gdk_pixbuf_unref(image);
}
syntax highlighted by Code2HTML, v. 0.9.1