#include static void color_changed (GObject *o, GParamSpec *pspect, gpointer data) { GdkRGBA color; gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (o), &color); g_print ("color changed: %g %g %g %g\n", color.red, color.green, color.blue, color.alpha); } static gboolean done = FALSE; static void dialog_response (GtkDialog *dialog, gint response) { GdkRGBA color; switch (response) { case GTK_RESPONSE_OK: gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (dialog), &color); g_print ("color accepted: %g %g %g %g\n", color.red, color.green, color.blue, color.alpha); break; default: g_print ("canceled\n"); break; } done = TRUE; g_main_context_wakeup (NULL); } int main (int argc, char *argv[]) { GtkWidget *dialog; gint i; gtk_init (); dialog = gtk_color_chooser_dialog_new ("Select a color", NULL); for (i = 1; i < argc; i++) { if (g_strcmp0 (argv[i], "--no-alpha") == 0) { g_print ("turning alpha off\n"); gtk_color_chooser_set_use_alpha (GTK_COLOR_CHOOSER (dialog), FALSE); } else if (g_strcmp0 (argv[i], "--edit") == 0) { g_print ("starting in edit mode\n"); g_object_set (dialog, "show-editor", TRUE, NULL); } else if (g_strcmp0 (argv[i], "--palette") == 0) { const gchar *c[9] = { "red", "maroon", "yellow", "green", "blue", "magenta", "DarkOliveGreen4", "khaki2", "thistle1" }; GdkRGBA color; GdkRGBA colors[9*9]; gint k,j; gdouble f[5] = { 0.2, 0.35, 0.5, 0.65, 0.8 }; g_print ("setting custom palette\n"); for (k = 0; k < 9; k++) { gdk_rgba_parse (&color, c[k]); for (j = 0; j < 5; j++) { colors[i*9 + j].red = f[j]*color.red; colors[i*9 + j].green = f[j]*color.green; colors[i*9 + j].blue = f[j]*color.blue; colors[i*9 + j].alpha = 1; } for (j = 5; j < 9; j++) { colors[i*9 + j].red = f[9-j]*color.red + (1-f[9-j]); colors[i*9 + j].green = f[9-j]*color.green + (1-f[9-j]); colors[i*9 + j].blue = f[9-j]*color.blue + (1-f[9-j]); colors[i*9 + j].alpha = 1; } } gtk_color_chooser_add_palette (GTK_COLOR_CHOOSER (dialog), GTK_ORIENTATION_VERTICAL, 9, 9*9, colors); } else if (g_strcmp0 (argv[i], "--no-palette") == 0) { gtk_color_chooser_add_palette (GTK_COLOR_CHOOSER (dialog), GTK_ORIENTATION_VERTICAL, 0, 0, NULL); } } g_signal_connect (dialog, "notify::color", G_CALLBACK (color_changed), NULL); g_signal_connect (dialog, "response", G_CALLBACK (dialog_response), NULL); gtk_widget_show (dialog); while (!done) g_main_context_iteration (NULL, TRUE); return 0; }