]> Pileus Git - ~andy/gtk/blob - demos/gtk-demo/colorsel.c
stylecontext: Do invalidation on first resize container
[~andy/gtk] / demos / gtk-demo / colorsel.c
1 /* Color Chooser
2  *
3  * A GtkColorChooser lets the user choose a color. There are several
4  * implementations of the GtkColorChooser interface in GTK+. The
5  * GtkColorChooserDialog is a prebuilt dialog containing a
6  * GtkColorChooserWidget.
7  */
8
9 #include <gtk/gtk.h>
10
11 static GtkWidget *window = NULL;
12 static GtkWidget *da;
13 static GdkRGBA color;
14 static GtkWidget *frame;
15
16 /* draw callback for the drawing area
17  */
18 static gboolean
19 draw_callback (GtkWidget *widget,
20                cairo_t   *cr,
21                gpointer   data)
22 {
23   GtkStyleContext *context;
24   GdkRGBA rgba;
25
26   context = gtk_widget_get_style_context (widget);
27   gtk_style_context_get_background_color (context, GTK_STATE_FLAG_NORMAL, &rgba);
28   gdk_cairo_set_source_rgba (cr, &rgba);
29   cairo_paint (cr);
30
31   return TRUE;
32 }
33
34 static void
35 response_cb (GtkDialog *dialog,
36              gint       response_id,
37              gpointer   user_data)
38 {
39   if (response_id == GTK_RESPONSE_OK)
40     {
41       gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (dialog), &color);
42       gtk_widget_override_background_color (da, 0, &color);
43     }
44
45   gtk_widget_hide (GTK_WIDGET (dialog));
46 }
47
48 static void
49 change_color_callback (GtkWidget *button,
50                        gpointer   data)
51 {
52   GtkWidget *dialog;
53
54   dialog = gtk_color_chooser_dialog_new ("Changing color", GTK_WINDOW (window));
55   gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (dialog), &color);
56
57   g_signal_connect (dialog,
58                     "response",
59                     G_CALLBACK (response_cb),
60                     NULL);
61
62   gtk_widget_show_all (dialog);
63 }
64
65 GtkWidget *
66 do_colorsel (GtkWidget *do_widget)
67 {
68   GtkWidget *vbox;
69   GtkWidget *button;
70
71   if (!window)
72     {
73       color.red = 0;
74       color.blue = 1;
75       color.green = 0;
76       color.alpha = 1;
77
78       window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
79       gtk_window_set_screen (GTK_WINDOW (window),
80                              gtk_widget_get_screen (do_widget));
81       gtk_window_set_title (GTK_WINDOW (window), "Color Chooser");
82
83       g_signal_connect (window, "destroy",
84                         G_CALLBACK (gtk_widget_destroyed), &window);
85
86       gtk_container_set_border_width (GTK_CONTAINER (window), 8);
87
88       vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
89       gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
90       gtk_container_add (GTK_CONTAINER (window), vbox);
91
92       /*
93        * Create the color swatch area
94        */
95
96
97       frame = gtk_frame_new (NULL);
98       gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
99       gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0);
100
101       da = gtk_drawing_area_new ();
102
103       g_signal_connect (da, "draw", G_CALLBACK (draw_callback), NULL);
104
105       /* set a minimum size */
106       gtk_widget_set_size_request (da, 200, 200);
107       /* set the color */
108       gtk_widget_override_background_color (da, 0, &color);
109
110       gtk_container_add (GTK_CONTAINER (frame), da);
111
112       button = gtk_button_new_with_mnemonic ("_Change the above color");
113       gtk_widget_set_halign (button, GTK_ALIGN_END);
114       gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
115
116       gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
117
118       g_signal_connect (button, "clicked",
119                         G_CALLBACK (change_color_callback), NULL);
120     }
121
122   if (!gtk_widget_get_visible (window))
123     {
124       gtk_widget_show_all (window);
125     }
126   else
127     {
128       gtk_widget_destroy (window);
129       window = NULL;
130     }
131
132   return window;
133 }