]> Pileus Git - ~andy/gtk/blob - tests/testoffscreen.c
Remove some GTK_DISABLE_DEPRECATED and ENABLE_BROKEN guards
[~andy/gtk] / tests / testoffscreen.c
1 /*
2  * testoffscreen.c
3  */
4
5 #include <math.h>
6 #include <gtk/gtk.h>
7 #include "gtkoffscreenbox.h"
8
9
10 static void
11 combo_changed_cb (GtkWidget *combo,
12                   gpointer   data)
13 {
14   GtkWidget *label = GTK_WIDGET (data);
15   gint active;
16
17   active = gtk_combo_box_get_active (GTK_COMBO_BOX (combo));
18
19   gtk_label_set_ellipsize (GTK_LABEL (label), (PangoEllipsizeMode)active);
20 }
21
22 static gboolean
23 layout_expose_handler (GtkWidget      *widget,
24                        GdkEventExpose *event)
25 {
26   GtkLayout *layout = GTK_LAYOUT (widget);
27
28   gint i,j;
29   gint imin, imax, jmin, jmax;
30
31   if (event->window != layout->bin_window)
32     return FALSE;
33
34   imin = (event->area.x) / 10;
35   imax = (event->area.x + event->area.width + 9) / 10;
36
37   jmin = (event->area.y) / 10;
38   jmax = (event->area.y + event->area.height + 9) / 10;
39
40   for (i = imin; i < imax; i++)
41     for (j = jmin; j < jmax; j++)
42       if ((i + j) % 2)
43         gdk_draw_rectangle (layout->bin_window,
44                             widget->style->black_gc,
45                             TRUE,
46                             10 * i, 10 * j,
47                             1 + i % 10, 1 + j % 10);
48
49   return FALSE;
50 }
51
52 static gboolean
53 scroll_layout (gpointer data)
54 {
55   GtkWidget *layout = data;
56   GtkAdjustment *adj;
57
58   adj = gtk_layout_get_hadjustment (GTK_LAYOUT (layout));
59   gtk_adjustment_set_value (adj,
60                             gtk_adjustment_get_value (adj) + 5.0);
61   return TRUE;
62 }
63
64 static guint layout_timeout;
65
66 static void
67 create_layout (GtkWidget *vbox)
68 {
69   GtkWidget *layout;
70   GtkWidget *scrolledwindow;
71   GtkWidget *button;
72   gchar buf[16];
73   gint i, j;
74
75   scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
76   gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
77                                        GTK_SHADOW_IN);
78   gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
79                                      GTK_CORNER_TOP_RIGHT);
80
81   gtk_box_pack_start (GTK_BOX (vbox), scrolledwindow, TRUE, TRUE, 0);
82
83   layout = gtk_layout_new (NULL, NULL);
84   gtk_container_add (GTK_CONTAINER (scrolledwindow), layout);
85
86   /* We set step sizes here since GtkLayout does not set
87    * them itself.
88    */
89   GTK_LAYOUT (layout)->hadjustment->step_increment = 10.0;
90   GTK_LAYOUT (layout)->vadjustment->step_increment = 10.0;
91
92   gtk_widget_set_events (layout, GDK_EXPOSURE_MASK);
93   g_signal_connect (layout, "expose_event",
94                     G_CALLBACK (layout_expose_handler),
95                     NULL);
96
97   gtk_layout_set_size (GTK_LAYOUT (layout), 1600, 128000);
98
99   for (i = 0 ; i < 16 ; i++)
100     for (j = 0 ; j < 16 ; j++)
101       {
102         g_snprintf (buf, sizeof (buf), "Button %d, %d", i, j);
103
104         if ((i + j) % 2)
105           button = gtk_button_new_with_label (buf);
106         else
107           button = gtk_label_new (buf);
108
109         gtk_layout_put (GTK_LAYOUT (layout), button,
110                         j * 100, i * 100);
111       }
112
113   for (i = 16; i < 1280; i++)
114     {
115       g_snprintf (buf, sizeof (buf), "Button %d, %d", i, 0);
116
117       if (i % 2)
118         button = gtk_button_new_with_label (buf);
119       else
120         button = gtk_label_new (buf);
121
122       gtk_layout_put (GTK_LAYOUT (layout), button,
123                       0, i * 100);
124     }
125
126   layout_timeout = g_timeout_add (1000, scroll_layout, layout);
127 }
128
129 static void
130 create_treeview (GtkWidget *vbox)
131 {
132   GtkWidget *scrolledwindow;
133   GtkListStore *store;
134   GtkWidget *tree_view;
135   GSList *stock_ids;
136   GSList *list;
137
138   scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
139   gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
140                                        GTK_SHADOW_IN);
141
142   gtk_box_pack_start (GTK_BOX (vbox), scrolledwindow, TRUE, TRUE, 0);
143
144   store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
145   tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
146   g_object_unref (store);
147
148   gtk_container_add (GTK_CONTAINER (scrolledwindow), tree_view);
149
150   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view), -1,
151                                                "Icon",
152                                                gtk_cell_renderer_pixbuf_new (),
153                                                "stock-id", 0,
154                                                NULL);
155   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view), -1,
156                                                "Label",
157                                                gtk_cell_renderer_text_new (),
158                                                "text", 1,
159                                                NULL);
160
161   stock_ids = gtk_stock_list_ids ();
162
163   for (list = stock_ids; list; list = g_slist_next (list))
164     {
165       const gchar *stock_id = list->data;
166       GtkStockItem item;
167
168       if (gtk_stock_lookup (stock_id, &item))
169         {
170           gtk_list_store_insert_with_values (store, NULL, -1,
171                                              0, item.stock_id,
172                                              1, item.label,
173                                              -1);
174         }
175     }
176
177   g_slist_foreach (stock_ids, (GFunc) g_free, NULL);
178   g_slist_free (stock_ids);
179 }
180
181 static GtkWidget *
182 create_widgets (void)
183 {
184   GtkWidget *main_hbox, *main_vbox;
185   GtkWidget *vbox, *hbox, *label, *combo, *entry, *button, *cb;
186   GtkWidget *sw, *text_view;
187
188   main_vbox = gtk_vbox_new (0, FALSE);
189
190   main_hbox = gtk_hbox_new (0, FALSE);
191   gtk_box_pack_start (GTK_BOX (main_vbox), main_hbox, TRUE, TRUE, 0);
192
193   vbox = gtk_vbox_new (0, FALSE);
194   gtk_box_pack_start (GTK_BOX (main_hbox), vbox, TRUE, TRUE, 0);
195
196   hbox = gtk_hbox_new (0, FALSE);
197   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
198
199   label = gtk_label_new ("This label may be ellipsized\nto make it fit.");
200   gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
201
202   combo = gtk_combo_box_new_text ();
203   gtk_combo_box_append_text (GTK_COMBO_BOX (combo), "NONE");
204   gtk_combo_box_append_text (GTK_COMBO_BOX (combo), "START");
205   gtk_combo_box_append_text (GTK_COMBO_BOX (combo), "MIDDLE");
206   gtk_combo_box_append_text (GTK_COMBO_BOX (combo), "END");
207   gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
208   gtk_box_pack_start (GTK_BOX (hbox), combo, TRUE, TRUE, 0);
209
210   g_signal_connect (combo, "changed",
211                     G_CALLBACK (combo_changed_cb),
212                     label);
213
214   entry = gtk_entry_new ();
215   gtk_entry_set_text (GTK_ENTRY (entry), "an entry - lots of text.... lots of text.... lots of text.... lots of text.... ");
216   gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
217
218   label = gtk_label_new ("Label after entry.");
219   gtk_label_set_selectable (GTK_LABEL (label), TRUE);
220   gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
221
222   button = gtk_button_new_with_label ("Button");
223   gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
224
225   button = gtk_check_button_new_with_mnemonic ("_Check button");
226   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
227
228   cb = gtk_combo_box_new_text ();
229   entry = gtk_entry_new ();
230   gtk_widget_show (entry);
231   gtk_container_add (GTK_CONTAINER (cb), entry);
232
233   gtk_combo_box_append_text (GTK_COMBO_BOX (cb), "item0");
234   gtk_combo_box_append_text (GTK_COMBO_BOX (cb), "item1");
235   gtk_combo_box_append_text (GTK_COMBO_BOX (cb), "item1");
236   gtk_combo_box_append_text (GTK_COMBO_BOX (cb), "item2");
237   gtk_combo_box_append_text (GTK_COMBO_BOX (cb), "item2");
238   gtk_combo_box_append_text (GTK_COMBO_BOX (cb), "item2");
239   gtk_entry_set_text (GTK_ENTRY (entry), "hello world ♥ foo");
240   gtk_editable_select_region (GTK_EDITABLE (entry), 0, -1);
241   gtk_box_pack_start (GTK_BOX (vbox), cb, TRUE, TRUE, 0);
242
243   sw = gtk_scrolled_window_new (NULL, NULL);
244   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
245                                   GTK_POLICY_AUTOMATIC,
246                                   GTK_POLICY_AUTOMATIC);
247   text_view = gtk_text_view_new ();
248   gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
249   gtk_container_add (GTK_CONTAINER (sw), text_view);
250
251   create_layout (vbox);
252
253   create_treeview (main_hbox);
254
255   return main_vbox;
256 }
257
258
259 static void
260 scale_changed (GtkRange        *range,
261                GtkOffscreenBox *offscreen_box)
262 {
263   gtk_offscreen_box_set_angle (offscreen_box, gtk_range_get_value (range));
264 }
265
266 static GtkWidget *scale = NULL;
267
268 static void
269 remove_clicked (GtkButton *button,
270                 GtkWidget *widget)
271 {
272   gtk_widget_destroy (widget);
273   g_source_remove (layout_timeout);
274
275   gtk_widget_set_sensitive (GTK_WIDGET (button), FALSE);
276   gtk_widget_set_sensitive (scale, FALSE);
277 }
278
279 int
280 main (int   argc,
281       char *argv[])
282 {
283   GtkWidget *window, *widget, *vbox, *button;
284   GtkWidget *offscreen = NULL;
285   gboolean use_offscreen;
286
287   gtk_init (&argc, &argv);
288
289   use_offscreen = argc == 1;
290
291   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
292   gtk_window_set_default_size (GTK_WINDOW (window), 300,300);
293
294   g_signal_connect (window, "destroy",
295                     G_CALLBACK (gtk_main_quit),
296                     NULL);
297
298   vbox = gtk_vbox_new (0, FALSE);
299   gtk_container_add (GTK_CONTAINER (window), vbox);
300
301   scale = gtk_hscale_new_with_range (0,
302                                      G_PI * 2,
303                                      0.01);
304   gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, FALSE, 0);
305
306   button = gtk_button_new_with_label ("Remove child 2");
307   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
308
309   if (use_offscreen)
310     {
311       offscreen = gtk_offscreen_box_new ();
312
313       g_signal_connect (scale, "value_changed",
314                         G_CALLBACK (scale_changed),
315                         offscreen);
316     }
317   else
318     {
319       offscreen = gtk_vpaned_new ();
320     }
321
322   gtk_box_pack_start (GTK_BOX (vbox), offscreen, TRUE, TRUE, 0);
323
324   widget = create_widgets ();
325   if (use_offscreen)
326     gtk_offscreen_box_add1 (GTK_OFFSCREEN_BOX (offscreen),
327                             widget);
328   else
329     gtk_paned_add1 (GTK_PANED (offscreen), widget);
330
331   widget = create_widgets ();
332   if (1)
333     {
334       GtkWidget *widget2, *box2, *offscreen2;
335
336       offscreen2 = gtk_offscreen_box_new ();
337       gtk_box_pack_start (GTK_BOX (widget), offscreen2, FALSE, FALSE, 0);
338
339       g_signal_connect (scale, "value_changed",
340                         G_CALLBACK (scale_changed),
341                         offscreen2);
342
343       box2 = gtk_vbox_new (FALSE, 0);
344       gtk_offscreen_box_add2 (GTK_OFFSCREEN_BOX (offscreen2), box2);
345
346       widget2 = gtk_button_new_with_label ("Offscreen in offscreen");
347       gtk_box_pack_start (GTK_BOX (box2), widget2, FALSE, FALSE, 0);
348
349       widget2 = gtk_entry_new ();
350       gtk_entry_set_text (GTK_ENTRY (widget2), "Offscreen in offscreen");
351       gtk_box_pack_start (GTK_BOX (box2), widget2, FALSE, FALSE, 0);
352     }
353
354   if (use_offscreen)
355     gtk_offscreen_box_add2 (GTK_OFFSCREEN_BOX (offscreen), widget);
356   else
357     gtk_paned_add2 (GTK_PANED (offscreen), widget);
358
359   gtk_widget_show_all (window);
360
361   g_signal_connect (G_OBJECT (button), "clicked",
362                     G_CALLBACK (remove_clicked),
363                     widget);
364
365   /* redirect */
366   if (0)
367     {
368       GtkWidget *redirect_win;
369
370       redirect_win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
371       gtk_window_set_default_size (GTK_WINDOW (redirect_win), 400,400);
372       gtk_widget_show (redirect_win);
373       gtk_widget_realize (redirect_win);
374       gtk_widget_realize (window);
375       gdk_window_redirect_to_drawable (window->window,
376                                        GDK_DRAWABLE (redirect_win->window),
377                                        0, 0, 0, 0, -1, -1);
378     }
379
380   gtk_main ();
381
382   return 0;
383 }