/* color picker */ #include GtkWidget *makeColorBox(); void showColorsel(GtkWidget *widget, gpointer data); void changeColor(GtkWidget *widget, GtkColorSelection *colorSel); void destroyColorsel(GtkWidget *widget, gpointer data); void helpColorsel(GtkWidget *widget, gpointer data); gint eventDelete(GtkWidget *widget, GdkEvent *event, gpointer data); gint eventDestroy(GtkWidget *widget, GdkEvent *event, gpointer data); static GtkWidget *csDialog = NULL; static GtkWidget *area; GdkGC *gc = NULL; GdkColormap *colormap = NULL; int main(int argc, char **argv) { GtkWidget *app; GtkWidget *colorBox; gnome_init("selection", "1.0", argc, argv); app = gnome_app_new("selection", "Color Selection"); gtk_signal_connect(GTK_OBJECT(app), "delete_event", GTK_SIGNAL_FUNC(eventDelete), NULL); gtk_signal_connect(GTK_OBJECT(app), "destroy", GTK_SIGNAL_FUNC(eventDestroy), NULL); colorBox = makeColorBox(); gnome_app_set_contents(GNOME_APP(app), colorBox); gtk_widget_show_all(app); gtk_main(); exit(0); } GtkWidget *makeColorBox() { GtkWidget *colorbox; GtkWidget *button; colorbox = gtk_vbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(colorbox), 10); area = gtk_drawing_area_new(); gtk_widget_set_usize(area, 300, 200); gtk_box_pack_start(GTK_BOX(colorbox), area, FALSE, FALSE, 0); button = gtk_button_new_with_label("Select"); gtk_box_pack_start(GTK_BOX(colorbox), button, FALSE, FALSE, 0); gtk_signal_connect(GTK_OBJECT(button),"clicked", GTK_SIGNAL_FUNC(showColorsel), NULL); return colorbox; } void showColorsel(GtkWidget *widget, gpointer data) { GtkWidget *colorSel; GtkWidget *button; if (csDialog == NULL) { csDialog = gtk_color_selection_dialog_new("Selected color fills the rectangle"); gtk_signal_connect(GTK_OBJECT(csDialog), "destroy", GTK_SIGNAL_FUNC(destroyColorsel), NULL); colorSel = GTK_COLOR_SELECTION_DIALOG(csDialog)->colorsel; gtk_signal_connect(GTK_OBJECT(colorSel), "color_changed", GTK_SIGNAL_FUNC(changeColor), colorSel); button = GTK_COLOR_SELECTION_DIALOG(csDialog)->ok_button; gtk_signal_connect(GTK_OBJECT(button),"clicked", GTK_SIGNAL_FUNC(destroyColorsel), NULL); button = GTK_COLOR_SELECTION_DIALOG(csDialog)->cancel_button; gtk_signal_connect(GTK_OBJECT(button),"clicked", GTK_SIGNAL_FUNC(destroyColorsel), NULL); button = GTK_COLOR_SELECTION_DIALOG(csDialog)->help_button; gtk_signal_connect(GTK_OBJECT(button),"clicked", GTK_SIGNAL_FUNC(helpColorsel), NULL); } gtk_widget_show(csDialog); } void changeColor(GtkWidget *widget, GtkColorSelection *colorSel) { gdouble colorArray[4]; GdkColor color; if (colormap == NULL) { colormap = gdk_colormap_get_system(); gc = gdk_gc_new(area->window); } gtk_color_selection_get_color(colorSel, colorArray); color.red = (gushort)(0xFFFF * colorArray[0]); color.green = (gushort)(0xFFFF * colorArray[1]); color.blue = (gushort)(0xFFFF * colorArray[2]); gdk_color_alloc(colormap, &color); gdk_window_set_background(area->window, &color); gdk_window_clear(area->window); } void destroyColorsel(GtkWidget *widget, gpointer data) { if (csDialog != NULL) { gtk_widget_destroy(csDialog); csDialog = NULL; } } void helpColorsel(GtkWidget *widget, gpointer data) { gnome_ok_dialog("Sorry.\nNo help available"); } // Callback function for the exit button on the top-right of the // window. gint eventDelete(GtkWidget *widget, GdkEvent *event, gpointer data) { gtk_main_quit(); return(0); } // Callback function for the explicit exit called by the user from the // File menu. gint eventDestroy(GtkWidget *widget, GdkEvent *event, gpointer data) { gtk_main_quit(); return(0); }