]> Pileus Git - ~andy/gtk/blob - tests/styleexamples.c
b66add59aca9545ad4b72c63284a68327a85302c
[~andy/gtk] / tests / styleexamples.c
1 #include <string.h>
2 #include <gtk/gtk.h>
3
4 static gboolean
5 draw_cb_checks (GtkWidget *widget, cairo_t *cr)
6 {
7   GtkStyleContext *context;
8
9   context = gtk_widget_get_style_context (widget);
10
11   gtk_style_context_save (context);
12
13   gtk_style_context_add_class (context, "check");
14   gtk_style_context_set_state (context, 0);
15   gtk_render_check (context, cr, 12, 12, 12, 12);
16   gtk_style_context_set_state (context, GTK_STATE_FLAG_ACTIVE);
17   gtk_render_check (context, cr, 36, 12, 12, 12);
18   gtk_style_context_set_state (context, GTK_STATE_FLAG_INCONSISTENT);
19   gtk_render_check (context, cr, 60, 12, 12, 12);
20   gtk_style_context_set_state (context, GTK_STATE_FLAG_INSENSITIVE);
21   gtk_render_check (context, cr, 84, 12, 12, 12);
22
23   gtk_style_context_restore (context);
24
25   return TRUE;
26 }
27
28
29 static gboolean
30 draw_cb_options (GtkWidget *widget, cairo_t *cr)
31 {
32   GtkStyleContext *context;
33
34   context = gtk_widget_get_style_context (widget);
35
36   gtk_style_context_save (context);
37
38   gtk_style_context_add_class (context, "radio");
39   gtk_style_context_set_state (context, 0);
40   gtk_render_option (context, cr, 12, 12, 12, 12);
41   gtk_style_context_set_state (context, GTK_STATE_FLAG_ACTIVE);
42   gtk_render_option (context, cr, 36, 12, 12, 12);
43   gtk_style_context_set_state (context, GTK_STATE_FLAG_INCONSISTENT);
44   gtk_render_option (context, cr, 60, 12, 12, 12);
45   gtk_style_context_set_state (context, GTK_STATE_FLAG_INSENSITIVE);
46   gtk_render_option (context, cr, 84, 12, 12, 12);
47
48   gtk_style_context_restore (context);
49
50   return TRUE;
51 }
52
53 static gboolean
54 draw_cb_arrows (GtkWidget *widget, cairo_t *cr)
55 {
56   GtkStyleContext *context;
57
58   context = gtk_widget_get_style_context (widget);
59
60   gtk_style_context_save (context);
61
62   gtk_style_context_set_state (context, 0);
63   gtk_render_arrow (context, cr, 0,        12, 12, 12);
64   gtk_render_arrow (context, cr, G_PI/2,   36, 12, 12);
65   gtk_render_arrow (context, cr, G_PI,     60, 12, 12);
66   gtk_render_arrow (context, cr, G_PI*3/2, 84, 12, 12);
67
68   gtk_style_context_restore (context);
69
70   return TRUE;
71 }
72
73 static gboolean
74 draw_cb_expanders (GtkWidget *widget, cairo_t *cr)
75 {
76   GtkStyleContext *context;
77
78   context = gtk_widget_get_style_context (widget);
79
80   gtk_style_context_save (context);
81
82   gtk_style_context_add_class (context, "expander");
83   gtk_style_context_set_state (context, 0);
84   gtk_render_expander (context, cr, 12, 12, 12, 12);
85   gtk_style_context_set_state (context, GTK_STATE_FLAG_PRELIGHT);
86   gtk_render_expander (context, cr, 36, 12, 12, 12);
87   gtk_style_context_set_state (context, GTK_STATE_FLAG_ACTIVE);
88   gtk_render_expander (context, cr, 60, 12, 12, 12);
89   gtk_style_context_set_state (context, GTK_STATE_FLAG_PRELIGHT | GTK_STATE_FLAG_ACTIVE);
90   gtk_render_expander (context, cr, 84, 12, 12, 12);
91
92   gtk_style_context_restore (context);
93
94   return TRUE;
95 }
96
97 static gboolean
98 draw_cb_background (GtkWidget *widget, cairo_t *cr)
99 {
100   GtkStyleProvider *provider;
101   GtkStyleContext *context;
102
103   context = gtk_widget_get_style_context (widget);
104
105   gtk_style_context_save (context);
106
107   provider = (GtkStyleProvider *)gtk_css_provider_new ();
108   gtk_css_provider_load_from_data (GTK_CSS_PROVIDER (provider),
109                                    "* {\n"
110                                    "   border-radius: 10;\n"
111                                    "   border-width: 0;\n"
112                                    "   background-image: -gtk-gradient (linear, left top, right bottom, from(#ff00ff), to(#aabbcc));\n"
113                                    "}\n", -1, NULL);
114   gtk_style_context_add_provider (context, provider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
115   gtk_style_context_set_junction_sides (context, 0);
116   gtk_render_background (context, cr, 12, 12, 100, 100);
117   gtk_style_context_remove_provider (context, provider);
118   gtk_style_context_restore (context);
119
120   return TRUE;
121 }
122
123 static gboolean
124 draw_cb_frame (GtkWidget *widget, cairo_t *cr)
125 {
126   GtkStyleProvider *provider;
127   GtkStyleContext *context;
128
129   context = gtk_widget_get_style_context (widget);
130
131   gtk_style_context_save (context);
132
133   provider = (GtkStyleProvider *)gtk_css_provider_new ();
134   gtk_css_provider_load_from_data (GTK_CSS_PROVIDER (provider),
135                                    ".frame1 {\n"
136                                    "   border-image: url('gradient1.png') 10 10 10 10 stretch;\n"
137                                    "}\n"
138                                    ".frame2 {\n"
139                                    "   border-style: solid;\n"
140                                    "   border-color: rgb(255,0,0);\n"
141                                    "   border-width: 10;\n"
142                                    "   border-radius: 10;\n"
143                                    "}\n"
144                                    ".frame3 {\n"
145                                    "   border-style: solid;\n"
146                                    "   border-color: rgb(0,0,0);\n"
147                                    "   border-width: 2;\n"
148                                    "   border-radius: 10;\n"
149                                    "}\n",
150                                    -1, NULL);
151   gtk_style_context_add_provider (context, provider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
152
153   gtk_style_context_add_class (context, "frame1");
154   gtk_style_context_set_junction_sides (context, 0);
155   gtk_render_frame (context, cr, 12, 12, 50, 50);
156   gtk_style_context_remove_class (context, "frame1");
157
158   gtk_style_context_add_class (context, "frame2");
159   gtk_render_frame (context, cr, 74, 12, 50, 50);
160   gtk_style_context_remove_class (context, "frame2");
161
162   gtk_style_context_add_class (context, "frame3");
163   gtk_style_context_set_junction_sides (context, GTK_JUNCTION_RIGHT);
164   gtk_render_frame (context, cr, 12, 74, 56, 50);
165   gtk_style_context_set_junction_sides (context, GTK_JUNCTION_LEFT);
166   gtk_render_frame (context, cr, 68, 74, 56, 50);
167   gtk_style_context_remove_class (context, "frame3");
168
169   gtk_style_context_remove_provider (context, provider);
170   gtk_style_context_restore (context);
171
172   return TRUE;
173 }
174
175 /* FIXME: this doesn't work */
176 static gboolean
177 draw_cb_activity (GtkWidget *widget, cairo_t *cr)
178 {
179   GtkStyleContext *context;
180   GtkWidgetPath *path;
181
182   context = gtk_widget_get_style_context (widget);
183   gtk_style_context_notify_state_change (context,
184                                          gtk_widget_get_window (widget),
185                                          NULL,
186                                          GTK_STATE_FLAG_ACTIVE,
187                                          TRUE);
188
189   gtk_style_context_save (context);
190
191   path = gtk_widget_path_new ();
192   gtk_widget_path_append_type (path, GTK_TYPE_SPINNER);
193   gtk_widget_path_iter_add_class (path, 0, "spinner");
194   gtk_style_context_set_path (context, path);
195   gtk_widget_path_free (path);
196
197   gtk_style_context_set_state (context, GTK_STATE_FLAG_ACTIVE);
198   gtk_render_activity (context, cr, 12, 12, 12, 12);
199
200   gtk_style_context_restore (context);
201
202   return TRUE;
203 }
204
205 static gboolean
206 draw_cb_slider (GtkWidget *widget, cairo_t *cr)
207 {
208   GtkStyleContext *context;
209   GtkWidgetPath *path;
210
211   context = gtk_widget_get_style_context (widget);
212   gtk_style_context_save (context);
213
214   path = gtk_widget_path_new ();
215   gtk_widget_path_append_type (path, GTK_TYPE_SCALE);
216   gtk_widget_path_iter_add_class (path, 0, "slider");
217   gtk_widget_path_iter_add_class (path, 0, "scale");
218   gtk_style_context_set_path (context, path);
219   gtk_widget_path_free (path);
220
221   gtk_render_slider (context, cr, 12, 22, 30, 10, GTK_ORIENTATION_HORIZONTAL);
222   gtk_render_slider (context, cr, 54, 12, 10, 30, GTK_ORIENTATION_VERTICAL);
223
224   gtk_style_context_restore (context);
225
226   return TRUE;
227 }
228
229
230
231 static char *what;
232
233 static gboolean
234 draw_cb (GtkWidget *widget, cairo_t *cr)
235 {
236   if (strcmp (what, "check") == 0)
237     return draw_cb_checks (widget, cr);
238   else if (strcmp (what, "option") == 0)
239     return draw_cb_options (widget, cr);
240   else if (strcmp (what, "arrow") == 0)
241     return draw_cb_arrows (widget, cr);
242   else if (strcmp (what, "expander") == 0)
243     return draw_cb_expanders (widget, cr);
244   else if (strcmp (what, "background") == 0)
245     return draw_cb_background (widget, cr);
246   else if (strcmp (what, "frame") == 0)
247     return draw_cb_frame (widget, cr);
248   else if (strcmp (what, "activity") == 0)
249     return draw_cb_activity (widget, cr);
250   else if (strcmp (what, "slider") == 0)
251     return draw_cb_slider (widget, cr);
252
253   return FALSE;
254 }
255
256 int main (int argc, char *argv[])
257 {
258   GtkWidget *window;
259   GtkWidget *ebox;
260
261   gtk_init (&argc, &argv);
262
263   if (argc > 1)
264     what = argv[1];
265   else
266     what = "check";
267
268   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
269   gtk_window_set_has_resize_grip (GTK_WINDOW (window), FALSE);
270   ebox = gtk_event_box_new ();
271   gtk_event_box_set_visible_window (GTK_EVENT_BOX (ebox), TRUE);
272   gtk_container_add (GTK_CONTAINER (window), ebox);
273   gtk_widget_set_name (ebox, "ebox");
274   g_signal_connect_after (ebox, "draw", G_CALLBACK (draw_cb), NULL);
275
276   gtk_widget_show_all (window);
277
278   gtk_main ();
279
280   return 0;
281 }
282