#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); }