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