// 15 may 2016 #include "uipriv_unix.h" struct uiColorButton { uiUnixControl c; GtkWidget *widget; GtkButton *button; GtkColorButton *cb; GtkColorChooser *cc; void (*onChanged)(uiColorButton *, void *); void *onChangedData; }; uiUnixControlAllDefaults(uiColorButton) static void onColorSet(GtkColorButton *button, gpointer data) { uiColorButton *b = uiColorButton(data); (*(b->onChanged))(b, b->onChangedData); } static void defaultOnChanged(uiColorButton *b, void *data) { // do nothing } void uiColorButtonColor(uiColorButton *b, double *r, double *g, double *bl, double *a) { GdkRGBA rgba; gtk_color_chooser_get_rgba(b->cc, &rgba); *r = rgba.red; *g = rgba.green; *bl = rgba.blue; *a = rgba.alpha; } void uiColorButtonSetColor(uiColorButton *b, double r, double g, double bl, double a) { GdkRGBA rgba; rgba.red = r; rgba.green = g; rgba.blue = bl; rgba.alpha = a; // no need to inhibit the signal; color-set is documented as only being sent when the user changes the color gtk_color_chooser_set_rgba(b->cc, &rgba); } void uiColorButtonOnChanged(uiColorButton *b, void (*f)(uiColorButton *, void *), void *data) { b->onChanged = f; b->onChangedData = data; } uiColorButton *uiNewColorButton(void) { uiColorButton *b; GdkRGBA black; uiUnixNewControl(uiColorButton, b); // I'm not sure what the initial color is; set up a real one black.red = 0.0; black.green = 0.0; black.blue = 0.0; black.alpha = 1.0; b->widget = gtk_color_button_new_with_rgba(&black); b->button = GTK_BUTTON(b->widget); b->cb = GTK_COLOR_BUTTON(b->widget); b->cc = GTK_COLOR_CHOOSER(b->widget); gtk_color_chooser_set_use_alpha(b->cc, TRUE); g_signal_connect(b->widget, "color-set", G_CALLBACK(onColorSet), b); uiColorButtonOnChanged(b, defaultOnChanged, NULL); return b; }