1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
23 #include "gtkcolorsel.h"
27 * If you change the way the color values are stored,
28 * please make sure to update the drag & drop support so it sends
29 * across all the color info (currently RGBA). - Elliot
33 #define M_PI 3.14159265358979323846
36 #define DEGTORAD(a) (2.0*M_PI*a/360.0)
39 #define TIMER_DELAY 300
41 #define CIRCLE_RADIUS 65
43 #define WHEEL_WIDTH 2*CIRCLE_RADIUS+2
44 #define WHEEL_HEIGHT 2*CIRCLE_RADIUS+2
46 #define VALUE_WIDTH 32
47 #define VALUE_HEIGHT WHEEL_HEIGHT
49 #define SAMPLE_WIDTH WHEEL_WIDTH+VALUE_WIDTH+5
50 #define SAMPLE_HEIGHT 28
52 static void gtk_color_selection_class_init (GtkColorSelectionClass *klass);
53 static void gtk_color_selection_init (GtkColorSelection *colorsel);
54 static void gtk_color_selection_dialog_class_init(GtkColorSelectionDialogClass *klass);
55 static void gtk_color_selection_dialog_init(GtkColorSelectionDialog *colorseldiag);
67 OPACITY_INPUTS = 1 << 2
92 gfloat lower, upper, step_inc, page_inc;
93 GtkSignalFunc updater;
97 #define HSV_TO_RGB() gtk_color_selection_hsv_to_rgb( \
98 colorsel->values[HUE], \
99 colorsel->values[SATURATION], \
100 colorsel->values[VALUE], \
101 &colorsel->values[RED], \
102 &colorsel->values[GREEN], \
103 &colorsel->values[BLUE])
105 #define RGB_TO_HSV() gtk_color_selection_rgb_to_hsv( \
106 colorsel->values[RED], \
107 colorsel->values[GREEN], \
108 colorsel->values[BLUE], \
109 &colorsel->values[HUE], \
110 &colorsel->values[SATURATION], \
111 &colorsel->values[VALUE])
114 static void gtk_color_selection_hsv_updater (GtkWidget *widget,
116 static void gtk_color_selection_rgb_updater (GtkWidget *widget,
118 static void gtk_color_selection_opacity_updater (GtkWidget *widget,
120 static void gtk_color_selection_realize (GtkWidget *widget);
121 static void gtk_color_selection_unrealize (GtkWidget *widget);
122 static void gtk_color_selection_finalize (GtkObject *object);
123 static void gtk_color_selection_color_changed (GtkColorSelection *colorsel);
124 static void gtk_color_selection_update_input (GtkWidget *scale,
127 static void gtk_color_selection_update_inputs (GtkColorSelection *colorsel,
130 static void gtk_color_selection_update_value (GtkColorSelection *colorsel,
132 static void gtk_color_selection_update_wheel (GtkColorSelection *colorsel,
135 static void gtk_color_selection_value_resize (GtkWidget *widget,
137 static gint gtk_color_selection_value_events (GtkWidget *area,
139 static gint gtk_color_selection_value_timeout (GtkColorSelection *colorsel);
140 static void gtk_color_selection_wheel_resize (GtkWidget *widget,
142 static gint gtk_color_selection_wheel_events (GtkWidget *area,
144 static gint gtk_color_selection_wheel_timeout (GtkColorSelection *colorsel);
145 static void gtk_color_selection_sample_resize (GtkWidget *widget,
147 static void gtk_color_selection_drop_handle (GtkWidget *widget,
149 GtkWidget *theclorsel);
150 static void gtk_color_selection_drag_handle (GtkWidget *widget,
152 GtkWidget *thecolorsel);
153 static void gtk_color_selection_draw_wheel_marker (GtkColorSelection *colorsel);
154 static void gtk_color_selection_draw_wheel_frame (GtkColorSelection *colorsel);
155 static void gtk_color_selection_draw_value_marker (GtkColorSelection *colorsel);
156 static void gtk_color_selection_draw_value_bar (GtkColorSelection *colorsel,
158 static void gtk_color_selection_draw_wheel (GtkColorSelection *colorsel,
160 static void gtk_color_selection_draw_sample (GtkColorSelection *colorsel,
163 static gint gtk_color_selection_eval_wheel (gint x, gint y,
164 gdouble cx, gdouble cy,
165 gdouble *h, gdouble *s);
167 static void gtk_color_selection_hsv_to_rgb (gdouble h, gdouble s, gdouble v,
168 gdouble *r, gdouble *g, gdouble *b);
169 static void gtk_color_selection_rgb_to_hsv (gdouble r, gdouble g, gdouble b,
170 gdouble *h, gdouble *s, gdouble *v);
173 static GtkVBoxClass *color_selection_parent_class = NULL;
174 static GtkWindowClass *color_selection_dialog_parent_class = NULL;
177 static guint color_selection_signals[LAST_SIGNAL] = {0};
179 static const gchar *value_index_key = "gtk-value-index";
182 #define SF GtkSignalFunc
185 scale_val_type scale_vals[NUM_CHANNELS] =
187 {"Hue:", 0.0, 360.0, 1.00, 10.00, (SF) gtk_color_selection_hsv_updater},
188 {"Saturation:", 0.0, 1.0, 0.01, 0.01, (SF) gtk_color_selection_hsv_updater},
189 {"Value:", 0.0, 1.0, 0.01, 0.01, (SF) gtk_color_selection_hsv_updater},
190 {"Red:", 0.0, 1.0, 0.01, 0.01, (SF) gtk_color_selection_rgb_updater},
191 {"Green:", 0.0, 1.0, 0.01, 0.01, (SF) gtk_color_selection_rgb_updater},
192 {"Blue:", 0.0, 1.0, 0.01, 0.01, (SF) gtk_color_selection_rgb_updater},
193 {"Opacity:", 0.0, 1.0, 0.01, 0.01, (SF) gtk_color_selection_opacity_updater}
197 gtk_color_selection_get_type (void)
199 static guint color_selection_type = 0;
201 if (!color_selection_type)
203 GtkTypeInfo colorsel_info =
206 sizeof (GtkColorSelection),
207 sizeof (GtkColorSelectionClass),
208 (GtkClassInitFunc) gtk_color_selection_class_init,
209 (GtkObjectInitFunc) gtk_color_selection_init,
210 /* reversed_1 */ NULL,
211 /* reversed_2 */ NULL,
212 (GtkClassInitFunc) NULL,
215 color_selection_type = gtk_type_unique (gtk_vbox_get_type (), &colorsel_info);
218 return color_selection_type;
222 gtk_color_selection_class_init (GtkColorSelectionClass *klass)
224 GtkObjectClass *object_class;
225 GtkWidgetClass *widget_class;
226 GtkContainerClass *container_class;
228 object_class = (GtkObjectClass*) klass;
229 widget_class = (GtkWidgetClass*) klass;
230 container_class = (GtkContainerClass*) klass;
232 color_selection_parent_class = gtk_type_class (gtk_vbox_get_type ());
234 color_selection_signals[COLOR_CHANGED] =
235 gtk_signal_new ("color_changed",
238 GTK_SIGNAL_OFFSET (GtkColorSelectionClass, color_changed),
239 gtk_signal_default_marshaller, GTK_TYPE_NONE, 0);
241 gtk_object_class_add_signals (object_class, color_selection_signals, LAST_SIGNAL);
243 object_class->finalize = gtk_color_selection_finalize;
245 widget_class->realize = gtk_color_selection_realize;
246 widget_class->unrealize = gtk_color_selection_unrealize;
250 gtk_color_selection_init (GtkColorSelection *colorsel)
252 GtkWidget *frame, *hbox, *vbox, *hbox2, *label, *table;
257 for (n = RED; n <= OPACITY; n++)
258 colorsel->values[n] = 1.0;
262 for (n = HUE; n <= OPACITY; n++)
263 colorsel->old_values[n] = colorsel->values[n];
265 colorsel->wheel_gc = NULL;
266 colorsel->value_gc = NULL;
267 colorsel->sample_gc = NULL;
268 colorsel->wheel_buf = NULL;
269 colorsel->value_buf = NULL;
270 colorsel->sample_buf = NULL;
272 colorsel->use_opacity = FALSE;
273 colorsel->timer_active = FALSE;
274 colorsel->policy = GTK_UPDATE_CONTINUOUS;
276 hbox = gtk_hbox_new (FALSE, 5);
277 gtk_container_border_width (GTK_CONTAINER (hbox), 5);
278 gtk_container_add (GTK_CONTAINER (colorsel), hbox);
280 vbox = gtk_vbox_new (FALSE, 5);
281 gtk_container_add (GTK_CONTAINER (hbox), vbox);
282 gtk_widget_show (vbox);
284 hbox2 = gtk_hbox_new (FALSE, 5);
285 gtk_container_add (GTK_CONTAINER (vbox), hbox2);
286 gtk_widget_show (hbox2);
288 colorsel->wheel_area = gtk_preview_new (GTK_PREVIEW_COLOR);
289 old_mask = gtk_widget_get_events(colorsel->wheel_area);
290 gtk_widget_set_events (colorsel->wheel_area,
292 GDK_BUTTON_PRESS_MASK |
293 GDK_BUTTON_RELEASE_MASK |
294 GDK_BUTTON_MOTION_MASK |
295 GDK_POINTER_MOTION_HINT_MASK);
296 gtk_preview_size (GTK_PREVIEW (colorsel->wheel_area), WHEEL_WIDTH, WHEEL_HEIGHT);
297 gtk_preview_set_expand (GTK_PREVIEW (colorsel->wheel_area), TRUE);
298 gtk_container_add (GTK_CONTAINER (hbox2), colorsel->wheel_area);
299 gtk_widget_show (colorsel->wheel_area);
301 old_mask = gtk_widget_get_events (colorsel->wheel_area);
303 gtk_signal_connect (GTK_OBJECT (colorsel->wheel_area), "event",
304 (SF) gtk_color_selection_wheel_events, (gpointer) colorsel->wheel_area);
305 gtk_signal_connect_after (GTK_OBJECT (colorsel->wheel_area), "expose_event",
306 (SF) gtk_color_selection_wheel_events, (gpointer) colorsel->wheel_area);
307 gtk_signal_connect_after (GTK_OBJECT (colorsel->wheel_area), "size_allocate",
308 (SF) gtk_color_selection_wheel_resize, (gpointer) colorsel->wheel_area);
309 gtk_object_set_data (GTK_OBJECT (colorsel->wheel_area), "_GtkColorSelection", (gpointer) colorsel);
311 frame = gtk_frame_new (NULL);
312 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
313 gtk_container_border_width (GTK_CONTAINER (frame), 0);
314 gtk_box_pack_start (GTK_BOX (hbox2), frame, FALSE, TRUE, 0);
315 gtk_widget_show (frame);
317 colorsel->value_area = gtk_preview_new (GTK_PREVIEW_COLOR);
318 gtk_preview_size (GTK_PREVIEW (colorsel->value_area), VALUE_WIDTH, VALUE_HEIGHT);
319 gtk_preview_set_expand (GTK_PREVIEW (colorsel->value_area), TRUE);
320 gtk_container_add (GTK_CONTAINER (frame), colorsel->value_area);
321 gtk_widget_show (colorsel->value_area);
323 old_mask = gtk_widget_get_events (colorsel->value_area);
324 gtk_widget_set_events (colorsel->value_area,
326 GDK_BUTTON_PRESS_MASK |
327 GDK_BUTTON_RELEASE_MASK |
328 GDK_BUTTON_MOTION_MASK |
329 GDK_POINTER_MOTION_HINT_MASK);
331 gtk_signal_connect_after (GTK_OBJECT (colorsel->value_area), "expose_event",
332 (SF) gtk_color_selection_value_events, (gpointer) colorsel->value_area);
333 gtk_signal_connect_after (GTK_OBJECT (colorsel->value_area), "size_allocate",
334 (SF) gtk_color_selection_value_resize, (gpointer) colorsel->value_area);
335 gtk_signal_connect (GTK_OBJECT (colorsel->value_area), "event",
336 (SF) gtk_color_selection_value_events, (gpointer) colorsel->value_area);
337 gtk_object_set_data (GTK_OBJECT (colorsel->value_area), "_GtkColorSelection", (gpointer) colorsel);
339 /* New/old color samples */
340 /* ===================== */
342 frame = gtk_frame_new (NULL);
343 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
344 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
345 gtk_widget_show (frame);
347 /* colorsel->sample_area_eb = gtk_button_new ();
348 gtk_container_add (GTK_CONTAINER (frame), colorsel->sample_area_eb);
349 gtk_widget_show (colorsel->sample_area_eb); */
351 colorsel->sample_area = gtk_preview_new (GTK_PREVIEW_COLOR);
352 gtk_preview_size (GTK_PREVIEW (colorsel->sample_area), SAMPLE_WIDTH, SAMPLE_HEIGHT);
353 gtk_preview_set_expand (GTK_PREVIEW (colorsel->sample_area), TRUE);
354 gtk_container_add (GTK_CONTAINER (frame),
355 colorsel->sample_area);
356 gtk_widget_set_events(colorsel->sample_area,
357 gtk_widget_get_events(colorsel->sample_area)
358 | GDK_BUTTON_MOTION_MASK
359 | GDK_BUTTON_PRESS_MASK
360 | GDK_BUTTON_RELEASE_MASK
361 | GDK_ENTER_NOTIFY_MASK
362 | GDK_LEAVE_NOTIFY_MASK);
363 gtk_widget_show (colorsel->sample_area);
365 gtk_signal_connect_after (GTK_OBJECT (colorsel->sample_area),
367 GTK_SIGNAL_FUNC (gtk_color_selection_sample_resize),
368 colorsel->sample_area);
369 gtk_object_set_data (GTK_OBJECT (colorsel->sample_area), "_GtkColorSelection", (gpointer) colorsel);
371 table = gtk_table_new (NUM_CHANNELS, 3, FALSE);
372 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
373 gtk_box_pack_start (GTK_BOX (hbox), table, FALSE, TRUE, 0);
375 for (n = HUE; n <= OPACITY; n++)
377 label = gtk_label_new (scale_vals[n].label);
378 gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
379 gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, n, n + 1);
381 adj = gtk_adjustment_new (colorsel->values[n], scale_vals[n].lower,
382 scale_vals[n].upper, scale_vals[n].step_inc,
383 scale_vals[n].page_inc, 0.0);
384 colorsel->scales[n] = gtk_hscale_new (GTK_ADJUSTMENT (adj));
385 gtk_widget_set_usize (colorsel->scales[n], 128, 0);
386 gtk_scale_set_value_pos (GTK_SCALE (colorsel->scales[n]), GTK_POS_TOP);
388 gtk_range_set_update_policy (GTK_RANGE (colorsel->scales[n]), colorsel->policy);
389 gtk_scale_set_draw_value (GTK_SCALE (colorsel->scales[n]), FALSE);
390 gtk_scale_set_digits (GTK_SCALE (colorsel->scales[n]), 2);
391 gtk_table_attach_defaults (GTK_TABLE (table), colorsel->scales[n], 1, 2, n, n + 1);
393 colorsel->entries[n] = gtk_entry_new ();
394 gtk_widget_set_usize (colorsel->entries[n], 40, 0);
395 sprintf (txt, "%.2f", colorsel->values[n]);
396 gtk_entry_set_text (GTK_ENTRY (colorsel->entries[n]), txt);
397 gtk_table_attach_defaults (GTK_TABLE (table), colorsel->entries[n], 2, 3, n, n + 1);
401 gtk_widget_show (label);
402 gtk_widget_show (colorsel->scales[n]);
403 gtk_widget_show (colorsel->entries[n]);
406 gtk_signal_connect_object (GTK_OBJECT (adj), "value_changed",
407 scale_vals[n].updater, (gpointer) colorsel->scales[n]);
408 gtk_object_set_data (GTK_OBJECT (colorsel->scales[n]), "_GtkColorSelection", (gpointer) colorsel);
409 gtk_object_set_data (GTK_OBJECT (colorsel->scales[n]), value_index_key, GINT_TO_POINTER (n));
410 gtk_signal_connect_object (GTK_OBJECT (colorsel->entries[n]), "changed",
411 scale_vals[n].updater, (gpointer) colorsel->entries[n]);
412 gtk_object_set_data (GTK_OBJECT (colorsel->entries[n]), "_GtkColorSelection", (gpointer) colorsel);
413 gtk_object_set_data (GTK_OBJECT (colorsel->entries[n]), value_index_key, GINT_TO_POINTER (n));
416 colorsel->opacity_label = label;
418 gtk_widget_show (table);
419 gtk_widget_show (hbox);
423 gtk_color_selection_new (void)
425 GtkColorSelection *colorsel;
427 colorsel = gtk_type_new (gtk_color_selection_get_type ());
429 return GTK_WIDGET (colorsel);
433 gtk_color_selection_set_update_policy (GtkColorSelection *colorsel,
434 GtkUpdateType policy)
438 g_return_if_fail (colorsel != NULL);
440 if (policy != colorsel->policy)
442 colorsel->policy = policy;
444 for (n = 0; n < NUM_CHANNELS; n++)
445 gtk_range_set_update_policy (GTK_RANGE (colorsel->scales[n]), policy);
451 gtk_color_selection_set_color (GtkColorSelection *colorsel,
456 g_return_if_fail (colorsel != NULL);
457 g_return_if_fail (GTK_IS_COLOR_SELECTION (colorsel));
459 if (GTK_WIDGET_DRAWABLE (GTK_WIDGET (colorsel)))
460 gtk_color_selection_draw_wheel_marker (colorsel);
462 for (n = RED; n <= BLUE; n++)
464 colorsel->old_values[n] = colorsel->values[n];
465 colorsel->values[n] = color[i++];
468 if (colorsel->use_opacity == TRUE)
470 colorsel->old_values[OPACITY] = colorsel->values[OPACITY];
471 colorsel->values[OPACITY] = color[i];
476 gtk_color_selection_update_inputs (colorsel, RGB_INPUTS | HSV_INPUTS | OPACITY_INPUTS, BOTH);
478 if (GTK_WIDGET_DRAWABLE (GTK_WIDGET (colorsel)))
480 gtk_color_selection_draw_value_bar (colorsel, FALSE);
481 gtk_color_selection_draw_sample (colorsel, FALSE);
482 gtk_color_selection_draw_wheel_marker (colorsel);
487 gtk_color_selection_get_color (GtkColorSelection *colorsel,
492 g_return_if_fail (colorsel != NULL);
493 g_return_if_fail (GTK_IS_COLOR_SELECTION (colorsel));
495 for (n = RED; n <= BLUE; n++)
496 color[i++] = colorsel->values[n];
497 if (colorsel->use_opacity == TRUE)
498 color[i] = colorsel->values[OPACITY];
502 gtk_color_selection_realize (GtkWidget *widget)
504 GtkColorSelection *colorsel;
505 gchar *type_accept_list[] = {"application/x-color"};
507 g_return_if_fail (widget != NULL);
508 g_return_if_fail (GTK_IS_COLOR_SELECTION (widget));
510 colorsel = GTK_COLOR_SELECTION (widget);
512 if (GTK_WIDGET_CLASS (color_selection_parent_class)->realize)
513 (*GTK_WIDGET_CLASS (color_selection_parent_class)->realize) (widget);
515 gtk_widget_dnd_drag_set (colorsel->sample_area,
516 1, type_accept_list, 1);
517 gtk_widget_dnd_drop_set (colorsel->sample_area,
518 1, type_accept_list, 1, 0);
519 gtk_signal_connect_after (GTK_OBJECT (colorsel->sample_area),
520 "drop_data_available_event",
521 GTK_SIGNAL_FUNC (gtk_color_selection_drop_handle),
523 gtk_signal_connect_after (GTK_OBJECT (colorsel->sample_area),
524 "drag_request_event",
525 GTK_SIGNAL_FUNC (gtk_color_selection_drag_handle),
530 gtk_color_selection_unrealize (GtkWidget *widget)
532 GtkColorSelection *colorsel;
534 g_return_if_fail (widget != NULL);
535 g_return_if_fail (GTK_IS_COLOR_SELECTION (widget));
537 colorsel = GTK_COLOR_SELECTION (widget);
539 if (colorsel->value_gc != NULL)
541 gdk_gc_unref (colorsel->value_gc);
542 colorsel->value_gc = NULL;
544 if (colorsel->wheel_gc != NULL)
546 gdk_gc_unref (colorsel->wheel_gc);
547 colorsel->wheel_gc = NULL;
549 if (colorsel->sample_gc != NULL)
551 gdk_gc_unref (colorsel->sample_gc);
552 colorsel->sample_gc = NULL;
555 (* GTK_WIDGET_CLASS (color_selection_parent_class)->unrealize) (widget);
559 gtk_color_selection_finalize (GtkObject *object)
561 GtkColorSelection *colorsel;
563 g_return_if_fail (object != NULL);
564 g_return_if_fail (GTK_IS_COLOR_SELECTION (object));
566 colorsel = GTK_COLOR_SELECTION (object);
568 if (colorsel->wheel_buf != NULL)
569 g_free (colorsel->wheel_buf);
570 if (colorsel->value_buf != NULL)
571 g_free (colorsel->value_buf);
572 if (colorsel->sample_buf != NULL)
573 g_free (colorsel->sample_buf);
575 (*GTK_OBJECT_CLASS (color_selection_parent_class)->finalize) (object);
579 gtk_color_selection_color_changed (GtkColorSelection *colorsel)
581 gtk_signal_emit (GTK_OBJECT (colorsel), color_selection_signals[COLOR_CHANGED]);
585 gtk_color_selection_update_input (GtkWidget *scale,
594 adj = gtk_range_get_adjustment (GTK_RANGE (scale));
595 adj->value = (gfloat) value;
596 gtk_signal_handler_block_by_data (GTK_OBJECT (adj), (gpointer) scale);
597 gtk_signal_emit_by_name (GTK_OBJECT (adj), "value_changed");
598 gtk_range_slider_update (GTK_RANGE (scale));
599 gtk_signal_handler_unblock_by_data (GTK_OBJECT (adj), (gpointer) scale);
604 gtk_signal_handler_block_by_data (GTK_OBJECT (entry), (gpointer) entry);
605 sprintf (txt, "%.2f", value);
606 gtk_entry_set_text (GTK_ENTRY (entry), txt);
607 gtk_signal_handler_unblock_by_data (GTK_OBJECT (entry), (gpointer) entry);
612 gtk_color_selection_update_inputs (GtkColorSelection *colorsel,
621 if ((inputs & RGB_INPUTS) != 0)
622 for (n = RED; n <= BLUE; n++)
623 gtk_color_selection_update_input (colorsel->scales[n], NULL,
624 colorsel->values[n]);
625 if ((inputs & HSV_INPUTS) != 0)
626 for (n = HUE; n <= VALUE; n++)
627 gtk_color_selection_update_input (colorsel->scales[n], NULL,
628 colorsel->values[n]);
629 if ((inputs & OPACITY_INPUTS) != 0)
630 gtk_color_selection_update_input(colorsel->scales[OPACITY], NULL,
631 colorsel->values[OPACITY]);
634 if ((inputs & RGB_INPUTS) != 0)
635 for (n = RED; n <= BLUE; n++)
636 gtk_color_selection_update_input (NULL, colorsel->entries[n], colorsel->values[n]);
637 if ((inputs & HSV_INPUTS) != 0)
638 for (n = HUE; n <= VALUE; n++)
639 gtk_color_selection_update_input (NULL, colorsel->entries[n], colorsel->values[n]);
640 if ((inputs & OPACITY_INPUTS) != 0)
641 gtk_color_selection_update_input(NULL, colorsel->entries[OPACITY], colorsel->values[OPACITY]);
644 if ((inputs & RGB_INPUTS) != 0)
645 for (n = RED; n <= BLUE; n++)
646 gtk_color_selection_update_input (colorsel->scales[n], colorsel->entries[n],
647 colorsel->values[n]);
648 if ((inputs & HSV_INPUTS) != 0)
649 for (n = HUE; n <= VALUE; n++)
650 gtk_color_selection_update_input (colorsel->scales[n], colorsel->entries[n],
651 colorsel->values[n]);
652 if ((inputs & OPACITY_INPUTS) != 0)
653 gtk_color_selection_update_input(colorsel->scales[OPACITY], colorsel->entries[OPACITY],
654 colorsel->values[OPACITY]);
660 gtk_color_selection_hsv_updater (GtkWidget *widget,
663 GtkColorSelection *colorsel;
666 gint i, which = SCALE;
668 if (GTK_WIDGET_DRAWABLE (GTK_WIDGET (widget)))
670 colorsel = (GtkColorSelection*) gtk_object_get_data (GTK_OBJECT (widget), "_GtkColorSelection");
671 i = GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (widget), value_index_key));
673 if (GTK_IS_SCALE (widget))
675 adj = gtk_range_get_adjustment (GTK_RANGE (GTK_SCALE (widget)));
676 newvalue = (gdouble) adj->value;
680 newvalue = (gdouble) atof (gtk_entry_get_text (GTK_ENTRY (widget)));
684 gtk_color_selection_draw_value_marker (colorsel);
685 colorsel->values[i] = newvalue;
689 gtk_color_selection_draw_value_marker (colorsel);
693 gtk_color_selection_draw_wheel_marker (colorsel);
694 colorsel->values[i] = newvalue;
698 gtk_color_selection_draw_wheel_marker (colorsel);
699 gtk_color_selection_draw_value_bar (colorsel, FALSE);
702 gtk_color_selection_draw_sample (colorsel, FALSE);
703 gtk_color_selection_color_changed (colorsel);
704 gtk_color_selection_update_inputs (colorsel, HSV_INPUTS, which);
705 gtk_color_selection_update_inputs (colorsel, RGB_INPUTS, BOTH);
710 gtk_color_selection_rgb_updater (GtkWidget *widget,
713 GtkColorSelection *colorsel;
716 gint i, which = SCALE;
718 if (GTK_WIDGET_DRAWABLE (GTK_WIDGET (widget)))
720 colorsel = (GtkColorSelection*) gtk_object_get_data (GTK_OBJECT (widget), "_GtkColorSelection");
721 i = GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (widget), value_index_key));
723 if (GTK_IS_SCALE (widget))
725 adj = gtk_range_get_adjustment (GTK_RANGE (GTK_SCALE (widget)));
726 newvalue = (gdouble) adj->value;
730 newvalue = (gdouble) atof (gtk_entry_get_text (GTK_ENTRY (widget)));
732 gtk_color_selection_draw_wheel_marker (colorsel);
734 colorsel->values[i] = newvalue;
737 gtk_color_selection_draw_wheel_marker (colorsel);
738 gtk_color_selection_draw_value_bar (colorsel, FALSE);
739 gtk_color_selection_draw_sample (colorsel, FALSE);
740 gtk_color_selection_color_changed (colorsel);
741 gtk_color_selection_update_inputs (colorsel, RGB_INPUTS, which);
742 gtk_color_selection_update_inputs (colorsel, HSV_INPUTS, BOTH);
747 gtk_color_selection_opacity_updater (GtkWidget *widget,
750 GtkColorSelection *colorsel;
753 colorsel = (GtkColorSelection*) gtk_object_get_data (GTK_OBJECT (widget), "_GtkColorSelection");
755 if (GTK_IS_SCALE (widget))
757 adj = gtk_range_get_adjustment (GTK_RANGE (widget));
758 colorsel->values[OPACITY] = (gdouble) adj->value;
759 gtk_color_selection_update_input (NULL, colorsel->entries[OPACITY], colorsel->values[OPACITY]);
763 colorsel->values[OPACITY] = (gdouble) atof (gtk_entry_get_text (GTK_ENTRY (widget)));
764 gtk_color_selection_update_input (colorsel->scales[OPACITY], NULL, colorsel->values[OPACITY]);
767 gtk_color_selection_draw_sample (colorsel, FALSE);
768 gtk_color_selection_color_changed (colorsel);
772 gtk_color_selection_set_opacity (GtkColorSelection *colorsel,
775 g_return_if_fail (colorsel != NULL);
777 colorsel->use_opacity = use_opacity;
779 if (use_opacity == FALSE && GTK_WIDGET_VISIBLE (colorsel->scales[OPACITY]))
781 gtk_widget_hide (colorsel->opacity_label);
782 gtk_widget_hide (colorsel->scales[OPACITY]);
783 gtk_widget_hide (colorsel->entries[OPACITY]);
785 else if (use_opacity == TRUE && !GTK_WIDGET_VISIBLE (colorsel->scales[OPACITY]))
787 gtk_widget_show (colorsel->opacity_label);
788 gtk_widget_show (colorsel->scales[OPACITY]);
789 gtk_widget_show (colorsel->entries[OPACITY]);
792 if (GTK_WIDGET_DRAWABLE (colorsel->sample_area))
793 gtk_color_selection_draw_sample (colorsel, FALSE);
797 gtk_color_selection_value_resize (GtkWidget *widget,
800 GtkColorSelection *colorsel;
802 colorsel = (GtkColorSelection*) gtk_object_get_data (GTK_OBJECT (widget), "_GtkColorSelection");
803 gtk_color_selection_draw_value_bar (colorsel, TRUE);
807 gtk_color_selection_wheel_resize (GtkWidget *widget,
810 GtkColorSelection *colorsel;
812 colorsel = (GtkColorSelection*) gtk_object_get_data (GTK_OBJECT (widget), "_GtkColorSelection");
813 gtk_color_selection_draw_wheel (colorsel, TRUE);
817 gtk_color_selection_sample_resize (GtkWidget *widget,
820 GtkColorSelection *colorsel;
822 colorsel = (GtkColorSelection*) gtk_object_get_data (GTK_OBJECT (widget), "_GtkColorSelection");
823 gtk_color_selection_draw_sample (colorsel, TRUE);
827 gtk_color_selection_drop_handle (GtkWidget *widget, GdkEvent *event,
828 GtkWidget *thecolorsel)
830 /* This is currently a gdouble array of the format (I think):
837 gdouble *v = event->dropdataavailable.data;
838 gtk_color_selection_set_opacity(GTK_COLOR_SELECTION(thecolorsel),
839 (v[0]==1.0)?TRUE:FALSE);
840 gtk_color_selection_set_color(GTK_COLOR_SELECTION(thecolorsel),
842 g_free(event->dropdataavailable.data);
843 g_free(event->dropdataavailable.data_type);
847 gtk_color_selection_drag_handle (GtkWidget *widget, GdkEvent *event,
848 GtkWidget *thecolorsel)
850 gdouble sendvals[(BLUE - RED + 1) + 3];
852 sendvals[0] = (GTK_COLOR_SELECTION(thecolorsel)->use_opacity)?1.0:0.0;
853 gtk_color_selection_get_color(GTK_COLOR_SELECTION(thecolorsel),
856 gtk_widget_dnd_data_set(widget,
863 gtk_color_selection_draw_wheel_marker (GtkColorSelection *colorsel)
867 gdk_gc_set_function (colorsel->wheel_gc, GDK_INVERT);
869 xpos = (gint) ((-(gdouble) (colorsel->wheel_area->allocation.width) / 2.0) *
870 colorsel->values[SATURATION] * cos (DEGTORAD ((colorsel->values[HUE] - 90)))) +
871 (colorsel->wheel_area->allocation.width >> 1) - 4;
872 ypos = (gint) (((gdouble) (colorsel->wheel_area->allocation.height) / 2.0) *
873 colorsel->values[SATURATION] * sin (DEGTORAD ((colorsel->values[HUE] - 90)))) +
874 (colorsel->wheel_area->allocation.height >> 1) - 4;
876 gdk_draw_arc (colorsel->wheel_area->window, colorsel->wheel_gc, FALSE, xpos, ypos, 8, 8, 0, 360 * 64);
880 gtk_color_selection_draw_value_marker (GtkColorSelection *colorsel)
884 gdk_gc_set_function (colorsel->value_gc, GDK_INVERT);
886 y = (gint) ((gdouble) (colorsel->value_area->allocation.height) * (1.0 - colorsel->values[VALUE]));
887 gdk_draw_line (colorsel->value_area->window, colorsel->value_gc,
888 0, y, colorsel->value_area->allocation.width, y);
892 gtk_color_selection_update_value (GtkColorSelection *colorsel,
895 gtk_color_selection_draw_value_marker (colorsel);
899 else if (y > colorsel->value_area->allocation.height - 1)
900 y = colorsel->value_area->allocation.height - 1;
902 colorsel->values[VALUE] = 1.0 - (gdouble) y / (gdouble) (colorsel->value_area->allocation.height);
906 gtk_color_selection_draw_value_marker (colorsel);
907 gtk_color_selection_draw_sample (colorsel, FALSE);
908 gtk_color_selection_update_input (colorsel->scales[VALUE], colorsel->entries[VALUE],
909 colorsel->values[VALUE]);
910 gtk_color_selection_update_inputs (colorsel, RGB_INPUTS, BOTH);
914 gtk_color_selection_update_wheel (GtkColorSelection *colorsel,
921 gtk_color_selection_draw_wheel_marker (colorsel);
923 wid = (gdouble) (colorsel->wheel_area->allocation.width) / 2.0;
924 heig = (gdouble) (colorsel->wheel_area->allocation.height) / 2.0;
926 res = gtk_color_selection_eval_wheel (x, y, wid, heig, &colorsel->values[HUE],
927 &colorsel->values[SATURATION]);
931 gtk_color_selection_draw_wheel_marker (colorsel);
932 gtk_color_selection_draw_value_bar (colorsel, FALSE);
933 gtk_color_selection_draw_sample (colorsel, FALSE);
934 gtk_color_selection_update_inputs (colorsel, RGB_INPUTS | HSV_INPUTS, BOTH);
938 gtk_color_selection_value_timeout (GtkColorSelection *colorsel)
942 gdk_window_get_pointer (colorsel->value_area->window, &x, &y, NULL);
943 gtk_color_selection_update_value (colorsel, y);
944 gtk_color_selection_color_changed (colorsel);
950 gtk_color_selection_value_events (GtkWidget *area,
953 GtkColorSelection *colorsel;
956 colorsel = (GtkColorSelection*) gtk_object_get_data (GTK_OBJECT (area), "_GtkColorSelection");
961 gtk_color_selection_draw_value_marker (colorsel);
964 if (colorsel->value_gc == NULL)
965 colorsel->value_gc = gdk_gc_new (colorsel->value_area->window);
966 gtk_color_selection_draw_value_marker (colorsel);
968 case GDK_BUTTON_PRESS:
970 gtk_color_selection_update_value (colorsel, event->button.y);
971 gtk_color_selection_color_changed (colorsel);
973 case GDK_BUTTON_RELEASE:
974 gtk_grab_remove (area);
975 if (colorsel->timer_active == TRUE)
976 gtk_timeout_remove (colorsel->timer_tag);
977 colorsel->timer_active = FALSE;
980 if (event->button.window != area->window)
981 gdk_window_get_pointer (area->window, NULL, &y, NULL);
983 gtk_color_selection_update_value (colorsel, y);
984 gtk_color_selection_color_changed (colorsel);
986 case GDK_MOTION_NOTIFY:
989 if (event->motion.is_hint || (event->motion.window != area->window))
990 gdk_window_get_pointer (area->window, NULL, &y, NULL);
992 switch (colorsel->policy)
994 case GTK_UPDATE_CONTINUOUS:
995 gtk_color_selection_update_value (colorsel, y);
996 gtk_color_selection_color_changed (colorsel);
998 case GTK_UPDATE_DELAYED:
999 if (colorsel->timer_active == TRUE)
1000 gtk_timeout_remove (colorsel->timer_tag);
1002 colorsel->timer_tag = gtk_timeout_add (TIMER_DELAY,
1003 (GtkFunction) gtk_color_selection_value_timeout,
1004 (gpointer) colorsel);
1005 colorsel->timer_active = TRUE;
1019 gtk_color_selection_wheel_timeout (GtkColorSelection *colorsel)
1023 gdk_window_get_pointer (colorsel->wheel_area->window, &x, &y, NULL);
1024 gtk_color_selection_update_wheel (colorsel, x, y);
1025 gtk_color_selection_color_changed (colorsel);
1031 gtk_color_selection_wheel_events (GtkWidget *area,
1034 GtkColorSelection *colorsel;
1037 colorsel = (GtkColorSelection*) gtk_object_get_data (GTK_OBJECT (area), "_GtkColorSelection");
1039 switch (event->type)
1042 gtk_color_selection_draw_wheel (colorsel, TRUE);
1043 gtk_color_selection_draw_wheel_marker (colorsel);
1044 gtk_color_selection_draw_sample (colorsel, TRUE);
1047 if (colorsel->wheel_gc == NULL)
1048 colorsel->wheel_gc = gdk_gc_new (colorsel->wheel_area->window);
1049 if (colorsel->sample_gc == NULL)
1050 colorsel->sample_gc = gdk_gc_new (colorsel->sample_area->window);
1051 if (colorsel->value_gc == NULL)
1052 colorsel->value_gc = gdk_gc_new (colorsel->value_area->window);
1053 gtk_color_selection_draw_wheel_marker (colorsel);
1054 gtk_color_selection_draw_wheel_frame (colorsel);
1056 case GDK_BUTTON_PRESS:
1057 gtk_grab_add (area);
1058 gtk_color_selection_update_wheel (colorsel, event->button.x, event->button.y);
1059 gtk_color_selection_color_changed (colorsel);
1061 case GDK_BUTTON_RELEASE:
1062 gtk_grab_remove (area);
1063 if (colorsel->timer_active == TRUE)
1064 gtk_timeout_remove (colorsel->timer_tag);
1065 colorsel->timer_active = FALSE;
1067 x = event->button.x;
1068 y = event->button.y;
1070 if (event->button.window != area->window)
1071 gdk_window_get_pointer (area->window, &x, &y, NULL);
1073 gtk_color_selection_update_wheel (colorsel, x, y);
1074 gtk_color_selection_color_changed (colorsel);
1076 case GDK_MOTION_NOTIFY:
1077 x = event->motion.x;
1078 y = event->motion.y;
1080 if (event->motion.is_hint || (event->motion.window != area->window))
1081 gdk_window_get_pointer (area->window, &x, &y, NULL);
1083 switch (colorsel->policy)
1085 case GTK_UPDATE_CONTINUOUS:
1086 gtk_color_selection_update_wheel (colorsel, x, y);
1087 gtk_color_selection_color_changed (colorsel);
1089 case GTK_UPDATE_DELAYED:
1090 if (colorsel->timer_active == TRUE)
1091 gtk_timeout_remove (colorsel->timer_tag);
1092 colorsel->timer_tag = gtk_timeout_add (TIMER_DELAY,
1093 (GtkFunction) gtk_color_selection_wheel_timeout,
1094 (gpointer) colorsel);
1095 colorsel->timer_active = TRUE;
1109 gtk_color_selection_draw_value_bar (GtkColorSelection *colorsel,
1112 gint x, y, i, wid, heig, n;
1113 gdouble sv, v, c[3];
1116 wid = colorsel->value_area->allocation.width;
1117 heig = colorsel->value_area->allocation.height;
1121 if (colorsel->value_buf != NULL)
1122 g_free (colorsel->value_buf);
1124 colorsel->value_buf = g_new(guchar, 3 * wid);
1128 sv = 1.0 / (gdouble) (heig - 1);
1130 for (y = 0; y < heig; y++)
1134 gtk_color_selection_hsv_to_rgb (colorsel->values[HUE],colorsel->values[SATURATION],v,
1135 &c[0], &c[1], &c[2]);
1137 for (n = 0; n < 3; n++)
1138 rc[n] = (guchar) (255.0 * c[n]);
1140 for (x = 0; x < wid; x++)
1142 for (n = 0; n < 3; n++)
1143 colorsel->value_buf[i++] = rc[n];
1146 gtk_preview_draw_row (GTK_PREVIEW (colorsel->value_area), colorsel->value_buf, 0, y, wid);
1150 gtk_widget_draw (colorsel->value_area, NULL);
1154 gtk_color_selection_draw_wheel_frame (GtkColorSelection *colorsel)
1159 style = gtk_widget_get_style (colorsel->wheel_area);
1161 w = colorsel->wheel_area->allocation.width;
1162 h = colorsel->wheel_area->allocation.height;
1164 gdk_draw_arc (colorsel->wheel_area->window, style->black_gc,
1165 FALSE, 1, 1, w - 1, h - 1, 30 * 64, 180 * 64);
1166 gdk_draw_arc (colorsel->wheel_area->window, style->mid_gc[GTK_STATE_NORMAL],
1167 FALSE, 0, 0, w, h, 30 * 64, 180 * 64);
1169 gdk_draw_arc (colorsel->wheel_area->window, style->bg_gc[GTK_STATE_NORMAL],
1170 FALSE, 1, 1, w - 1, h - 1, 210 * 64, 180 * 64);
1171 gdk_draw_arc (colorsel->wheel_area->window, style->light_gc[GTK_STATE_NORMAL],
1172 FALSE, 0, 0, w, h, 210 * 64, 180 * 64);
1176 gtk_color_selection_draw_wheel (GtkColorSelection *colorsel,
1179 gint x, y, i, wid, heig, n;
1180 gdouble cx, cy, h, s, c[3];
1182 GtkStyle *style = gtk_widget_get_style (colorsel->wheel_area);
1184 wid = colorsel->wheel_area->allocation.width;
1185 heig = colorsel->wheel_area->allocation.height;
1189 if (colorsel->wheel_buf != NULL)
1190 g_free (colorsel->wheel_buf);
1192 colorsel->wheel_buf = g_new(guchar, 3 * wid);
1195 cx = (gdouble) (wid) / 2.0;
1196 cy = (gdouble) (heig) / 2.0;
1198 bg[0] = style->bg[GTK_STATE_NORMAL].red >> 8;
1199 bg[1] = style->bg[GTK_STATE_NORMAL].green >> 8;
1200 bg[2] = style->bg[GTK_STATE_NORMAL].blue >> 8;
1202 for (y = 0; y < heig; y++)
1205 for (x = 0; x < wid; x++)
1207 if (gtk_color_selection_eval_wheel (x, y, cx, cy, &h, &s) == TRUE)
1209 for (n = 0; n < 3; n++)
1210 colorsel->wheel_buf[i++] = bg[n];
1214 gtk_color_selection_hsv_to_rgb (h, s, 1.0, &c[0], &c[1], &c[2]);
1215 for (n = 0; n < 3; n++)
1216 colorsel->wheel_buf[i++] = (guchar) (255.0 * c[n]);
1220 gtk_preview_draw_row (GTK_PREVIEW (colorsel->wheel_area), colorsel->wheel_buf, 0, y, wid);
1223 gtk_widget_draw (colorsel->wheel_area, NULL);
1227 gtk_color_selection_draw_sample (GtkColorSelection *colorsel,
1230 gint x, y, i, wid, heig, f, half, n;
1231 guchar c[3 * 2], cc[3 * 4], *cp = c;
1234 wid = colorsel->sample_area->allocation.width;
1235 heig = colorsel->sample_area->allocation.height;
1240 if (colorsel->sample_buf != NULL)
1241 g_free (colorsel->sample_buf);
1243 colorsel->sample_buf = g_new(guchar, 3 * wid);
1247 for (n = 0; n < 3; n++)
1249 c[n] = (guchar) (255.0 * colorsel->old_values[i]);
1250 c[n + 3] = (guchar) (255.0 * colorsel->values[i++]);
1253 if (colorsel->use_opacity == TRUE)
1255 o = colorsel->values[OPACITY];
1256 oldo = colorsel->old_values[OPACITY];
1258 for (n = 0; n < 3; n++)
1260 cc[n] = (guchar) ((1.0 - oldo) * 192 + (oldo * (gdouble) c[n]));
1261 cc[n + 3] = (guchar) ((1.0 - oldo) * 128 + (oldo * (gdouble) c[n]));
1262 cc[n + 6] = (guchar) ((1.0 - o) * 192 + (o * (gdouble) c[n + 3]));
1263 cc[n + 9] = (guchar) ((1.0 - o) * 128 + (o * (gdouble) c[n + 3]));
1268 for (y = 0; y < heig; y++)
1271 for (x = 0; x < wid; x++)
1273 if (colorsel->use_opacity)
1275 f = 3 * (((x % 32) < 16) ^ ((y % 32) < 16));
1276 f += (x > half) * 6;
1281 for (n = 0; n < 3; n++)
1282 colorsel->sample_buf[i++] = cp[n + f];
1285 gtk_preview_draw_row (GTK_PREVIEW (colorsel->sample_area), colorsel->sample_buf, 0, y, wid);
1288 gtk_widget_draw (colorsel->sample_area, NULL);
1292 gtk_color_selection_eval_wheel (gint x, gint y,
1293 gdouble cx, gdouble cy,
1294 gdouble *h, gdouble *s)
1296 gdouble d, r, rx, ry, l;
1298 rx = (gdouble) x - cx;
1299 ry = (gdouble) y - cy;
1301 d = (SQR (cy) * SQR (rx) + SQR (cx) * SQR (ry) - SQR (cx) * SQR (cy));
1303 r = sqrt (SQR (rx) + SQR (ry));
1306 *h = atan2 (rx / r, ry / r);
1310 l = sqrt (SQR ((cx * cos (*h + 0.5 * M_PI))) + SQR ((cy * sin (*h + 0.5 * M_PI))));
1312 *h = 360.0 * (*h) / (2.0 * M_PI) + 180;
1323 gtk_color_selection_hsv_to_rgb (gdouble h, gdouble s, gdouble v,
1324 gdouble *r, gdouble *g, gdouble *b)
1346 q = v * (1.0 - (s * f));
1347 t = v * (1.0 - (s * (1.0 - f)));
1386 gtk_color_selection_rgb_to_hsv (gdouble r, gdouble g, gdouble b,
1387 gdouble *h, gdouble *s, gdouble *v)
1389 double max, min, delta;
1406 *s = (max - min) / max;
1417 *h = (g - b) / delta;
1419 *h = 2.0 + (b - r) / delta;
1421 *h = 4.0 + (r - g) / delta;
1430 /***************************/
1431 /* GtkColorSelectionDialog */
1432 /***************************/
1435 gtk_color_selection_dialog_get_type (void)
1437 static guint color_selection_dialog_type = 0;
1439 if (!color_selection_dialog_type)
1441 GtkTypeInfo colorsel_diag_info =
1443 "GtkColorSelectionDialog",
1444 sizeof (GtkColorSelectionDialog),
1445 sizeof (GtkColorSelectionDialogClass),
1446 (GtkClassInitFunc) gtk_color_selection_dialog_class_init,
1447 (GtkObjectInitFunc) gtk_color_selection_dialog_init,
1448 /* reversed_1 */ NULL,
1449 /* reversed_2 */ NULL,
1450 (GtkClassInitFunc) NULL,
1453 color_selection_dialog_type = gtk_type_unique (gtk_window_get_type (), &colorsel_diag_info);
1456 return color_selection_dialog_type;
1460 gtk_color_selection_dialog_class_init (GtkColorSelectionDialogClass *klass)
1462 GtkObjectClass *object_class;
1464 object_class = (GtkObjectClass*) klass;
1466 color_selection_dialog_parent_class = gtk_type_class (gtk_window_get_type ());
1470 gtk_color_selection_dialog_init (GtkColorSelectionDialog *colorseldiag)
1472 GtkWidget *action_area, *frame;
1474 colorseldiag->main_vbox = gtk_vbox_new (FALSE, 10);
1475 gtk_container_border_width (GTK_CONTAINER (colorseldiag), 10);
1476 gtk_container_add (GTK_CONTAINER (colorseldiag), colorseldiag->main_vbox);
1477 gtk_widget_show (colorseldiag->main_vbox);
1479 frame = gtk_frame_new (NULL);
1480 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
1481 gtk_container_add (GTK_CONTAINER (colorseldiag->main_vbox), frame);
1482 gtk_widget_show (frame);
1484 colorseldiag->colorsel = gtk_color_selection_new ();
1485 gtk_container_add (GTK_CONTAINER (frame), colorseldiag->colorsel);
1486 gtk_widget_show (colorseldiag->colorsel);
1488 action_area = gtk_hbutton_box_new ();
1489 gtk_button_box_set_layout(GTK_BUTTON_BOX(action_area), GTK_BUTTONBOX_END);
1490 gtk_button_box_set_spacing(GTK_BUTTON_BOX(action_area), 5);
1491 gtk_box_pack_end (GTK_BOX (colorseldiag->main_vbox), action_area, FALSE, FALSE, 0);
1492 gtk_widget_show (action_area);
1494 colorseldiag->ok_button = gtk_button_new_with_label ("OK");
1495 GTK_WIDGET_SET_FLAGS (colorseldiag->ok_button, GTK_CAN_DEFAULT);
1496 gtk_box_pack_start (GTK_BOX (action_area), colorseldiag->ok_button, TRUE, TRUE, 0);
1497 gtk_widget_grab_default (colorseldiag->ok_button);
1498 gtk_widget_show (colorseldiag->ok_button);
1500 colorseldiag->cancel_button = gtk_button_new_with_label ("Cancel");
1501 GTK_WIDGET_SET_FLAGS (colorseldiag->cancel_button, GTK_CAN_DEFAULT);
1502 gtk_box_pack_start (GTK_BOX (action_area), colorseldiag->cancel_button, TRUE, TRUE, 0);
1503 gtk_widget_show (colorseldiag->cancel_button);
1505 colorseldiag->help_button = gtk_button_new_with_label ("Help");
1506 GTK_WIDGET_SET_FLAGS (colorseldiag->help_button, GTK_CAN_DEFAULT);
1507 gtk_box_pack_start (GTK_BOX (action_area), colorseldiag->help_button, TRUE, TRUE, 0);
1508 gtk_widget_show (colorseldiag->help_button);
1512 gtk_color_selection_dialog_new (const gchar *title)
1514 GtkColorSelectionDialog *colorseldiag;
1516 colorseldiag = gtk_type_new (gtk_color_selection_dialog_get_type ());
1517 gtk_window_set_title (GTK_WINDOW (colorseldiag), title);
1519 return GTK_WIDGET (colorseldiag);