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 Lesser 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 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser 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.
21 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
22 * file for a list of people on the GTK+ Team. See the ChangeLog
23 * files for a list of changes. These files are distributed with
24 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
44 #include "gdk/gdkkeysyms.h"
47 #define sleep(n) _sleep(n)
50 #include "prop-editor.h"
55 file_exists (const char *filename)
59 return stat (filename, &statbuf) == 0;
63 shape_create_icon (GdkScreen *screen,
72 build_option_menu (gchar *items[],
75 void (*func) (GtkWidget *widget, gpointer data),
78 /* macro, structure and variables used by tree window demos */
79 #define DEFAULT_NUMBER_OF_ITEM 3
80 #define DEFAULT_RECURSION_LEVEL 3
83 GSList* selection_mode_group;
84 GtkWidget* single_button;
85 GtkWidget* browse_button;
86 GtkWidget* multiple_button;
87 GtkWidget* draw_line_button;
88 GtkWidget* view_line_button;
89 GtkWidget* no_root_item_button;
90 GtkWidget* nb_item_spinner;
91 GtkWidget* recursion_spinner;
92 } sTreeSampleSelection;
94 typedef struct sTreeButtons {
96 GtkWidget* add_button;
97 GtkWidget* remove_button;
98 GtkWidget* subtree_button;
100 /* end of tree section */
103 build_option_menu (gchar *items[],
106 void (*func)(GtkWidget *widget, gpointer data),
112 omenu = gtk_combo_box_text_new ();
113 g_signal_connect (omenu, "changed",
114 G_CALLBACK (func), data);
116 for (i = 0; i < num_items; i++)
117 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (omenu), items[i]);
119 gtk_combo_box_set_active (GTK_COMBO_BOX (omenu), history);
125 * Windows with an alpha channel
130 on_alpha_window_draw (GtkWidget *widget,
133 cairo_pattern_t *pattern;
134 int radius, width, height;
136 width = gtk_widget_get_allocated_width (widget);
137 height = gtk_widget_get_allocated_height (widget);
138 radius = MIN (width, height) / 2;
139 pattern = cairo_pattern_create_radial (width / 2,
146 if (gdk_screen_get_rgba_visual (gtk_widget_get_screen (widget)) &&
147 gtk_widget_is_composited (widget))
148 cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.0); /* transparent */
150 cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* opaque white */
152 cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
155 cairo_pattern_add_color_stop_rgba (pattern, 0.0,
156 1.0, 0.75, 0.0, 1.0); /* solid orange */
157 cairo_pattern_add_color_stop_rgba (pattern, 1.0,
158 1.0, 0.75, 0.0, 0.0); /* transparent orange */
160 cairo_set_source (cr, pattern);
161 cairo_pattern_destroy (pattern);
163 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
170 build_alpha_widgets (void)
173 GtkWidget *radio_button;
174 GtkWidget *check_button;
179 grid = gtk_grid_new ();
181 radio_button = gtk_radio_button_new_with_label (NULL, "Red");
182 gtk_widget_set_hexpand (radio_button, TRUE);
183 gtk_grid_attach (GTK_GRID (grid), radio_button, 0, 0, 1, 1);
185 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Green");
186 gtk_widget_set_hexpand (radio_button, TRUE);
187 gtk_grid_attach (GTK_GRID (grid), radio_button, 0, 1, 1, 1);
189 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Blue"),
190 gtk_widget_set_hexpand (radio_button, TRUE);
191 gtk_grid_attach (GTK_GRID (grid), radio_button, 0, 2, 1, 1);
193 check_button = gtk_check_button_new_with_label ("Sedentary"),
194 gtk_widget_set_hexpand (check_button, TRUE);
195 gtk_grid_attach (GTK_GRID (grid), check_button, 1, 0, 1, 1);
197 check_button = gtk_check_button_new_with_label ("Nocturnal"),
198 gtk_widget_set_hexpand (check_button, TRUE);
199 gtk_grid_attach (GTK_GRID (grid), check_button, 1, 1, 1, 1);
201 check_button = gtk_check_button_new_with_label ("Compulsive"),
202 gtk_widget_set_hexpand (check_button, TRUE);
203 gtk_grid_attach (GTK_GRID (grid), check_button, 1, 2, 1, 1);
205 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
206 label = gtk_label_new (NULL);
207 gtk_label_set_markup (GTK_LABEL (label), "<i>Entry: </i>");
208 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
209 entry = gtk_entry_new ();
210 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
211 gtk_widget_set_hexpand (hbox, TRUE);
212 gtk_grid_attach (GTK_GRID (grid), hbox, 0, 3, 2, 1);
218 on_alpha_screen_changed (GtkWindow *window,
219 GdkScreen *old_screen,
222 GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (window));
223 GdkVisual *visual = gdk_screen_get_rgba_visual (screen);
227 visual = gdk_screen_get_system_visual (screen);
228 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen doesn't support alpha</b>");
232 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen supports alpha</b>");
235 gtk_widget_set_visual (GTK_WIDGET (window), visual);
239 on_composited_changed (GtkWidget *window,
242 gboolean is_composited = gtk_widget_is_composited (window);
245 gtk_label_set_text (label, "Composited");
247 gtk_label_set_text (label, "Not composited");
251 create_alpha_window (GtkWidget *widget)
253 static GtkWidget *window;
257 GtkWidget *content_area;
261 window = gtk_dialog_new_with_buttons ("Alpha Window",
262 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
266 gtk_widget_set_app_paintable (window, TRUE);
267 g_signal_connect (window, "draw",
268 G_CALLBACK (on_alpha_window_draw), NULL);
270 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
272 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
273 gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
274 gtk_box_pack_start (GTK_BOX (content_area), vbox,
277 label = gtk_label_new (NULL);
278 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
279 on_alpha_screen_changed (GTK_WINDOW (window), NULL, label);
280 g_signal_connect (window, "screen-changed",
281 G_CALLBACK (on_alpha_screen_changed), label);
283 label = gtk_label_new (NULL);
284 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
285 on_composited_changed (window, GTK_LABEL (label));
286 g_signal_connect (window, "composited_changed", G_CALLBACK (on_composited_changed), label);
288 gtk_box_pack_start (GTK_BOX (vbox), build_alpha_widgets (), TRUE, TRUE, 0);
290 g_signal_connect (window, "destroy",
291 G_CALLBACK (gtk_widget_destroyed),
294 g_signal_connect (window, "response",
295 G_CALLBACK (gtk_widget_destroy),
299 if (!gtk_widget_get_visible (window))
300 gtk_widget_show_all (window);
302 gtk_widget_destroy (window);
306 * Composited non-toplevel window
309 /* The draw event handler for the event box.
311 * This function simply draws a transparency onto a widget on the area
312 * for which it receives expose events. This is intended to give the
313 * event box a "transparent" background.
315 * In order for this to work properly, the widget must have an RGBA
316 * colourmap. The widget should also be set as app-paintable since it
317 * doesn't make sense for GTK to draw a background if we are drawing it
318 * (and because GTK might actually replace our transparency with its
319 * default background colour).
322 transparent_draw (GtkWidget *widget,
325 cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
331 /* The expose event handler for the window.
333 * This function performs the actual compositing of the event box onto
334 * the already-existing background of the window at 50% normal opacity.
336 * In this case we do not want app-paintable to be set on the widget
337 * since we want it to draw its own (red) background. Because of this,
338 * however, we must ensure that we use g_signal_register_after so that
339 * this handler is called after the red has been drawn. If it was
340 * called before then GTK would just blindly paint over our work.
343 window_draw (GtkWidget *widget,
346 GtkAllocation allocation;
349 /* get our child (in this case, the event box) */
350 child = gtk_bin_get_child (GTK_BIN (widget));
352 gtk_widget_get_allocation (child, &allocation);
354 /* the source data is the (composited) event box */
355 gdk_cairo_set_source_window (cr, gtk_widget_get_window (child),
359 /* composite, with a 50% opacity */
360 cairo_paint_with_alpha (cr, 0.5);
366 create_composited_window (GtkWidget *widget)
368 static GtkWidget *window;
372 GtkWidget *event, *button;
375 /* make the widgets */
376 button = gtk_button_new_with_label ("A Button");
377 event = gtk_event_box_new ();
378 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
380 g_signal_connect (window, "destroy",
381 G_CALLBACK (gtk_widget_destroyed),
384 /* put a red background on the window */
385 gdk_rgba_parse (&red, "red");
386 gtk_widget_override_background_color (window, 0, &red);
388 /* set our event box to have a fully-transparent background
389 * drawn on it. currently there is no way to simply tell gtk
390 * that "transparency" is the background colour for a widget.
392 gtk_widget_set_app_paintable (GTK_WIDGET (event), TRUE);
393 g_signal_connect (event, "draw",
394 G_CALLBACK (transparent_draw), NULL);
396 /* put them inside one another */
397 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
398 gtk_container_add (GTK_CONTAINER (window), event);
399 gtk_container_add (GTK_CONTAINER (event), button);
401 /* realise and show everything */
402 gtk_widget_realize (button);
404 /* set the event box GdkWindow to be composited.
405 * obviously must be performed after event box is realised.
407 gdk_window_set_composited (gtk_widget_get_window (event),
410 /* set up the compositing handler.
411 * note that we do _after so that the normal (red) background is drawn
412 * by gtk before our compositing occurs.
414 g_signal_connect_after (window, "draw",
415 G_CALLBACK (window_draw), NULL);
418 if (!gtk_widget_get_visible (window))
419 gtk_widget_show_all (window);
421 gtk_widget_destroy (window);
425 * Big windows and guffaw scrolling
429 pattern_set_bg (GtkWidget *widget,
433 static const GdkColor colors[] = {
434 { 0, 0x4444, 0x4444, 0xffff },
435 { 0, 0x8888, 0x8888, 0xffff },
436 { 0, 0xaaaa, 0xaaaa, 0xffff }
439 gdk_window_set_user_data (child, widget);
440 gdk_window_set_background (child, &colors[level]);
444 create_pattern (GtkWidget *widget,
455 while (2 * h <= height)
460 while (2 * w <= width)
462 if ((i + j) % 2 == 0)
467 GdkWindowAttr attributes;
469 attributes.window_type = GDK_WINDOW_CHILD;
472 attributes.width = w;
473 attributes.height = h;
474 attributes.wclass = GDK_INPUT_OUTPUT;
475 attributes.event_mask = GDK_EXPOSURE_MASK;
476 attributes.visual = gtk_widget_get_visual (widget);
478 child = gdk_window_new (parent, &attributes,
479 GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL);
481 pattern_set_bg (widget, child, level);
484 create_pattern (widget, child, level + 1, w, h);
486 gdk_window_show (child);
496 #define PATTERN_SIZE (1 << 18)
499 pattern_hadj_changed (GtkAdjustment *adjustment,
502 gint *old_value = g_object_get_data (G_OBJECT (adjustment), "old-value");
503 gint new_value = gtk_adjustment_get_value (adjustment);
505 if (gtk_widget_get_realized (darea))
507 gdk_window_scroll (gtk_widget_get_window (darea),
508 *old_value - new_value, 0);
509 *old_value = new_value;
514 pattern_vadj_changed (GtkAdjustment *adjustment,
517 gint *old_value = g_object_get_data (G_OBJECT (adjustment), "old-value");
518 gint new_value = gtk_adjustment_get_value (adjustment);
520 if (gtk_widget_get_realized (darea))
522 gdk_window_scroll (gtk_widget_get_window (darea),
523 0, *old_value - new_value);
524 *old_value = new_value;
529 pattern_realize (GtkWidget *widget,
534 window = gtk_widget_get_window (widget);
535 pattern_set_bg (widget, window, 0);
536 create_pattern (widget, window, 1, PATTERN_SIZE, PATTERN_SIZE);
540 create_big_windows (GtkWidget *widget)
542 static GtkWidget *window = NULL;
543 GtkWidget *content_area;
544 GtkWidget *darea, *grid, *scrollbar;
546 GtkAdjustment *hadjustment;
547 GtkAdjustment *vadjustment;
548 static gint current_x;
549 static gint current_y;
556 window = gtk_dialog_new_with_buttons ("Big Windows",
562 gtk_window_set_screen (GTK_WINDOW (window),
563 gtk_widget_get_screen (widget));
565 gtk_window_set_default_size (GTK_WINDOW (window), 200, 300);
567 g_signal_connect (window, "destroy",
568 G_CALLBACK (gtk_widget_destroyed),
571 g_signal_connect (window, "response",
572 G_CALLBACK (gtk_widget_destroy),
575 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
577 grid = gtk_grid_new ();
578 gtk_box_pack_start (GTK_BOX (content_area), grid, TRUE, TRUE, 0);
580 darea = gtk_drawing_area_new ();
582 hadjustment = gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
583 g_signal_connect (hadjustment, "value_changed",
584 G_CALLBACK (pattern_hadj_changed), darea);
585 g_object_set_data (G_OBJECT (hadjustment), "old-value", ¤t_x);
587 vadjustment = gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
588 g_signal_connect (vadjustment, "value_changed",
589 G_CALLBACK (pattern_vadj_changed), darea);
590 g_object_set_data (G_OBJECT (vadjustment), "old-value", ¤t_y);
592 g_signal_connect (darea, "realize",
593 G_CALLBACK (pattern_realize),
596 eventbox = gtk_event_box_new ();
597 gtk_widget_set_hexpand (eventbox, TRUE);
598 gtk_widget_set_vexpand (eventbox, TRUE);
599 gtk_grid_attach (GTK_GRID (grid), eventbox, 0, 0, 1, 1);
601 gtk_container_add (GTK_CONTAINER (eventbox), darea);
603 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, hadjustment);
604 gtk_widget_set_hexpand (scrollbar, TRUE);
605 gtk_grid_attach (GTK_GRID (grid), scrollbar, 0, 1, 1, 1);
607 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, vadjustment);
608 gtk_widget_set_vexpand (scrollbar, TRUE);
609 gtk_grid_attach (GTK_GRID (grid), scrollbar, 1, 0, 1, 1);
612 if (!gtk_widget_get_visible (window))
613 gtk_widget_show_all (window);
615 gtk_widget_hide (window);
623 button_window (GtkWidget *widget,
626 if (!gtk_widget_get_visible (button))
627 gtk_widget_show (button);
629 gtk_widget_hide (button);
633 create_buttons (GtkWidget *widget)
635 static GtkWidget *window = NULL;
639 GtkWidget *button[10];
640 GtkWidget *separator;
644 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
645 gtk_window_set_screen (GTK_WINDOW (window),
646 gtk_widget_get_screen (widget));
648 g_signal_connect (window, "destroy",
649 G_CALLBACK (gtk_widget_destroyed),
652 gtk_window_set_title (GTK_WINDOW (window), "GtkButton");
653 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
655 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
656 gtk_container_add (GTK_CONTAINER (window), box1);
658 table = gtk_table_new (3, 3, FALSE);
659 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
660 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
661 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
662 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
664 button[0] = gtk_button_new_with_label ("button1");
665 button[1] = gtk_button_new_with_mnemonic ("_button2");
666 button[2] = gtk_button_new_with_mnemonic ("_button3");
667 button[3] = gtk_button_new_from_stock (GTK_STOCK_OK);
668 button[4] = gtk_button_new_with_label ("button5");
669 button[5] = gtk_button_new_with_label ("button6");
670 button[6] = gtk_button_new_with_label ("button7");
671 button[7] = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
672 button[8] = gtk_button_new_with_label ("button9");
674 g_signal_connect (button[0], "clicked",
675 G_CALLBACK (button_window),
678 gtk_table_attach (GTK_TABLE (table), button[0], 0, 1, 0, 1,
679 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
681 g_signal_connect (button[1], "clicked",
682 G_CALLBACK (button_window),
685 gtk_table_attach (GTK_TABLE (table), button[1], 1, 2, 1, 2,
686 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
688 g_signal_connect (button[2], "clicked",
689 G_CALLBACK (button_window),
691 gtk_table_attach (GTK_TABLE (table), button[2], 2, 3, 2, 3,
692 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
694 g_signal_connect (button[3], "clicked",
695 G_CALLBACK (button_window),
697 gtk_table_attach (GTK_TABLE (table), button[3], 0, 1, 2, 3,
698 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
700 g_signal_connect (button[4], "clicked",
701 G_CALLBACK (button_window),
703 gtk_table_attach (GTK_TABLE (table), button[4], 2, 3, 0, 1,
704 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
706 g_signal_connect (button[5], "clicked",
707 G_CALLBACK (button_window),
709 gtk_table_attach (GTK_TABLE (table), button[5], 1, 2, 2, 3,
710 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
712 g_signal_connect (button[6], "clicked",
713 G_CALLBACK (button_window),
715 gtk_table_attach (GTK_TABLE (table), button[6], 1, 2, 0, 1,
716 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
718 g_signal_connect (button[7], "clicked",
719 G_CALLBACK (button_window),
721 gtk_table_attach (GTK_TABLE (table), button[7], 2, 3, 1, 2,
722 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
724 g_signal_connect (button[8], "clicked",
725 G_CALLBACK (button_window),
727 gtk_table_attach (GTK_TABLE (table), button[8], 0, 1, 1, 2,
728 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
730 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
731 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
733 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
734 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
735 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
737 button[9] = gtk_button_new_with_label ("close");
738 g_signal_connect_swapped (button[9], "clicked",
739 G_CALLBACK (gtk_widget_destroy),
741 gtk_box_pack_start (GTK_BOX (box2), button[9], TRUE, TRUE, 0);
742 gtk_widget_set_can_default (button[9], TRUE);
743 gtk_widget_grab_default (button[9]);
746 if (!gtk_widget_get_visible (window))
747 gtk_widget_show_all (window);
749 gtk_widget_destroy (window);
757 create_toggle_buttons (GtkWidget *widget)
759 static GtkWidget *window = NULL;
763 GtkWidget *separator;
767 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
768 gtk_window_set_screen (GTK_WINDOW (window),
769 gtk_widget_get_screen (widget));
771 g_signal_connect (window, "destroy",
772 G_CALLBACK (gtk_widget_destroyed),
775 gtk_window_set_title (GTK_WINDOW (window), "GtkToggleButton");
776 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
778 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
779 gtk_container_add (GTK_CONTAINER (window), box1);
781 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
782 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
783 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
785 button = gtk_toggle_button_new_with_label ("button1");
786 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
788 button = gtk_toggle_button_new_with_label ("button2");
789 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
791 button = gtk_toggle_button_new_with_label ("button3");
792 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
794 button = gtk_toggle_button_new_with_label ("inconsistent");
795 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
796 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
798 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
799 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
801 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
802 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
803 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
805 button = gtk_button_new_with_label ("close");
806 g_signal_connect_swapped (button, "clicked",
807 G_CALLBACK (gtk_widget_destroy),
809 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
810 gtk_widget_set_can_default (button, TRUE);
811 gtk_widget_grab_default (button);
814 if (!gtk_widget_get_visible (window))
815 gtk_widget_show_all (window);
817 gtk_widget_destroy (window);
821 create_widget_grid (GType widget_type)
824 GtkWidget *group_widget = NULL;
827 table = gtk_table_new (FALSE, 3, 3);
829 for (i = 0; i < 5; i++)
831 for (j = 0; j < 5; j++)
836 if (i == 0 && j == 0)
842 tmp = g_strdup_printf ("%d", j);
843 widget = gtk_label_new (tmp);
848 tmp = g_strdup_printf ("%c", 'A' + i - 1);
849 widget = gtk_label_new (tmp);
854 widget = g_object_new (widget_type, NULL);
856 if (g_type_is_a (widget_type, GTK_TYPE_RADIO_BUTTON))
859 group_widget = widget;
861 g_object_set (widget, "group", group_widget, NULL);
866 gtk_table_attach (GTK_TABLE (table), widget,
881 create_check_buttons (GtkWidget *widget)
883 static GtkWidget *window = NULL;
887 GtkWidget *separator;
892 window = gtk_dialog_new_with_buttons ("Check Buttons",
898 gtk_window_set_screen (GTK_WINDOW (window),
899 gtk_widget_get_screen (widget));
901 g_signal_connect (window, "destroy",
902 G_CALLBACK (gtk_widget_destroyed),
904 g_signal_connect (window, "response",
905 G_CALLBACK (gtk_widget_destroy),
908 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
910 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
911 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
912 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
914 button = gtk_check_button_new_with_mnemonic ("_button1");
915 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
917 button = gtk_check_button_new_with_label ("button2");
918 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
920 button = gtk_check_button_new_with_label ("button3");
921 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
923 button = gtk_check_button_new_with_label ("inconsistent");
924 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
925 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
927 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
928 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
930 table = create_widget_grid (GTK_TYPE_CHECK_BUTTON);
931 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
932 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
935 if (!gtk_widget_get_visible (window))
936 gtk_widget_show_all (window);
938 gtk_widget_destroy (window);
946 create_radio_buttons (GtkWidget *widget)
948 static GtkWidget *window = NULL;
952 GtkWidget *separator;
957 window = gtk_dialog_new_with_buttons ("Radio Buttons",
963 gtk_window_set_screen (GTK_WINDOW (window),
964 gtk_widget_get_screen (widget));
966 g_signal_connect (window, "destroy",
967 G_CALLBACK (gtk_widget_destroyed),
969 g_signal_connect (window, "response",
970 G_CALLBACK (gtk_widget_destroy),
973 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
975 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
976 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
977 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
979 button = gtk_radio_button_new_with_label (NULL, "button1");
980 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
982 button = gtk_radio_button_new_with_label (
983 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
985 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
986 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
988 button = gtk_radio_button_new_with_label (
989 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
991 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
993 button = gtk_radio_button_new_with_label (
994 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
996 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
997 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
999 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1000 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1002 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1003 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1004 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1006 button = gtk_radio_button_new_with_label (NULL, "button4");
1007 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1008 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1010 button = gtk_radio_button_new_with_label (
1011 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1013 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
1014 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1015 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1017 button = gtk_radio_button_new_with_label (
1018 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1020 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1021 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1023 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1024 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1026 table = create_widget_grid (GTK_TYPE_RADIO_BUTTON);
1027 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
1028 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
1031 if (!gtk_widget_get_visible (window))
1032 gtk_widget_show_all (window);
1034 gtk_widget_destroy (window);
1042 create_bbox (gint horizontal,
1053 frame = gtk_frame_new (title);
1056 bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
1058 bbox = gtk_button_box_new (GTK_ORIENTATION_VERTICAL);
1060 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
1061 gtk_container_add (GTK_CONTAINER (frame), bbox);
1063 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), layout);
1064 gtk_box_set_spacing (GTK_BOX (bbox), spacing);
1066 button = gtk_button_new_with_label ("OK");
1067 gtk_container_add (GTK_CONTAINER (bbox), button);
1069 button = gtk_button_new_with_label ("Cancel");
1070 gtk_container_add (GTK_CONTAINER (bbox), button);
1072 button = gtk_button_new_with_label ("Help");
1073 gtk_container_add (GTK_CONTAINER (bbox), button);
1079 create_button_box (GtkWidget *widget)
1081 static GtkWidget* window = NULL;
1082 GtkWidget *main_vbox;
1085 GtkWidget *frame_horz;
1086 GtkWidget *frame_vert;
1090 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1091 gtk_window_set_screen (GTK_WINDOW (window), gtk_widget_get_screen (widget));
1092 gtk_window_set_title (GTK_WINDOW (window), "Button Boxes");
1094 g_signal_connect (window, "destroy",
1095 G_CALLBACK (gtk_widget_destroyed),
1098 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
1100 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1101 gtk_container_add (GTK_CONTAINER (window), main_vbox);
1103 frame_horz = gtk_frame_new ("Horizontal Button Boxes");
1104 gtk_box_pack_start (GTK_BOX (main_vbox), frame_horz, TRUE, TRUE, 10);
1106 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1107 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
1108 gtk_container_add (GTK_CONTAINER (frame_horz), vbox);
1110 gtk_box_pack_start (GTK_BOX (vbox),
1111 create_bbox (TRUE, "Spread", 40, 85, 20, GTK_BUTTONBOX_SPREAD),
1114 gtk_box_pack_start (GTK_BOX (vbox),
1115 create_bbox (TRUE, "Edge", 40, 85, 20, GTK_BUTTONBOX_EDGE),
1118 gtk_box_pack_start (GTK_BOX (vbox),
1119 create_bbox (TRUE, "Start", 40, 85, 20, GTK_BUTTONBOX_START),
1122 gtk_box_pack_start (GTK_BOX (vbox),
1123 create_bbox (TRUE, "End", 40, 85, 20, GTK_BUTTONBOX_END),
1126 gtk_box_pack_start (GTK_BOX (vbox),
1127 create_bbox (TRUE, "Center", 40, 85, 20, GTK_BUTTONBOX_CENTER),
1130 frame_vert = gtk_frame_new ("Vertical Button Boxes");
1131 gtk_box_pack_start (GTK_BOX (main_vbox), frame_vert, TRUE, TRUE, 10);
1133 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
1134 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
1135 gtk_container_add (GTK_CONTAINER (frame_vert), hbox);
1137 gtk_box_pack_start (GTK_BOX (hbox),
1138 create_bbox (FALSE, "Spread", 30, 85, 20, GTK_BUTTONBOX_SPREAD),
1141 gtk_box_pack_start (GTK_BOX (hbox),
1142 create_bbox (FALSE, "Edge", 30, 85, 20, GTK_BUTTONBOX_EDGE),
1145 gtk_box_pack_start (GTK_BOX (hbox),
1146 create_bbox (FALSE, "Start", 30, 85, 20, GTK_BUTTONBOX_START),
1149 gtk_box_pack_start (GTK_BOX (hbox),
1150 create_bbox (FALSE, "End", 30, 85, 20, GTK_BUTTONBOX_END),
1153 gtk_box_pack_start (GTK_BOX (hbox),
1154 create_bbox (FALSE, "Center", 30, 85, 20, GTK_BUTTONBOX_CENTER),
1158 if (!gtk_widget_get_visible (window))
1159 gtk_widget_show_all (window);
1161 gtk_widget_destroy (window);
1169 new_pixbuf (char *filename,
1175 if (strcmp (filename, "test.xpm") == 0)
1178 pixbuf = gdk_pixbuf_new_from_file (filename, NULL);
1181 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
1183 widget = gtk_image_new_from_pixbuf (pixbuf);
1185 g_object_unref (pixbuf);
1192 set_toolbar_small_stock (GtkWidget *widget,
1195 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_SMALL_TOOLBAR);
1199 set_toolbar_large_stock (GtkWidget *widget,
1202 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_LARGE_TOOLBAR);
1206 set_toolbar_horizontal (GtkWidget *widget,
1209 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_HORIZONTAL);
1213 set_toolbar_vertical (GtkWidget *widget,
1216 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_VERTICAL);
1220 set_toolbar_icons (GtkWidget *widget,
1223 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_ICONS);
1227 set_toolbar_text (GtkWidget *widget,
1230 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_TEXT);
1234 set_toolbar_both (GtkWidget *widget,
1237 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH);
1241 set_toolbar_both_horiz (GtkWidget *widget,
1244 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH_HORIZ);
1248 set_toolbar_enable (GtkWidget *widget,
1251 GtkSettings *settings = gtk_widget_get_settings (widget);
1252 g_object_set (settings, "gtk-enable-tooltips", TRUE, NULL);
1256 set_toolbar_disable (GtkWidget *widget,
1259 GtkSettings *settings = gtk_widget_get_settings (widget);
1260 g_object_set (settings, "gtk-enable-tooltips", FALSE, NULL);
1263 static GtkActionEntry create_toolbar_items[] = {
1264 { NULL, GTK_STOCK_NEW, NULL, NULL, "Stock icon: New",
1265 G_CALLBACK (set_toolbar_small_stock) },
1266 { NULL, GTK_STOCK_OPEN, NULL, NULL, "Stock icon: Open",
1267 G_CALLBACK (set_toolbar_large_stock) },
1268 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1269 G_CALLBACK (set_toolbar_horizontal) },
1270 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1271 G_CALLBACK (set_toolbar_vertical) },
1273 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1274 G_CALLBACK (set_toolbar_icons) },
1275 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1276 G_CALLBACK (set_toolbar_text) },
1277 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1278 G_CALLBACK (set_toolbar_both) },
1279 { NULL, NULL, "Both (horizontal)", NULL, "Show toolbar icons and text in a horizontal fashion",
1280 G_CALLBACK (set_toolbar_both_horiz) },
1282 { "entry", NULL, NULL, "This is an unusable GtkEntry ;)",
1286 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1287 G_CALLBACK (set_toolbar_enable) },
1288 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1289 G_CALLBACK (set_toolbar_disable) },
1291 { NULL, NULL, "Frobate", NULL, "Frobate tooltip",
1293 { NULL, NULL, "Baz", NULL, "Baz tooltip",
1296 { NULL, NULL, "Blah", NULL, "Blash tooltip",
1298 { NULL, NULL, "Bar", NULL, "Bar tooltip",
1303 create_toolbar (GtkWidget *widget)
1305 static GtkWidget *window = NULL;
1312 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1313 gtk_window_set_screen (GTK_WINDOW (window),
1314 gtk_widget_get_screen (widget));
1316 gtk_window_set_title (GTK_WINDOW (window), "Toolbar test");
1318 g_signal_connect (window, "destroy",
1319 G_CALLBACK (gtk_widget_destroyed),
1322 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1323 gtk_widget_realize (window);
1325 toolbar = gtk_toolbar_new ();
1326 for (i = 0; i < G_N_ELEMENTS (create_toolbar_items); i++)
1328 GtkToolItem *toolitem;
1330 if (create_toolbar_items[i].tooltip == NULL)
1331 toolitem = gtk_separator_tool_item_new ();
1332 else if (g_strcmp0 (create_toolbar_items[i].name, "entry") == 0)
1336 toolitem = gtk_tool_item_new ();
1337 entry = gtk_entry_new ();
1338 gtk_container_add (GTK_CONTAINER (toolitem), entry);
1340 else if (create_toolbar_items[i].stock_id)
1341 toolitem = gtk_tool_button_new_from_stock (create_toolbar_items[i].stock_id);
1346 icon = new_pixbuf ("test.xpm", gtk_widget_get_window (window));
1347 toolitem = gtk_tool_button_new (icon, create_toolbar_items[i].label);
1349 if (create_toolbar_items[i].callback)
1350 g_signal_connect (toolitem, "clicked",
1351 create_toolbar_items[i].callback, toolbar);
1352 gtk_tool_item_set_tooltip_text (toolitem, create_toolbar_items[i].tooltip);
1353 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1356 gtk_container_add (GTK_CONTAINER (window), toolbar);
1358 gtk_widget_set_size_request (toolbar, 200, -1);
1361 if (!gtk_widget_get_visible (window))
1362 gtk_widget_show_all (window);
1364 gtk_widget_destroy (window);
1367 static GtkActionEntry make_toolbar_items[] = {
1368 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1369 G_CALLBACK (set_toolbar_horizontal) },
1370 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1371 G_CALLBACK (set_toolbar_vertical) },
1373 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1374 G_CALLBACK (set_toolbar_icons) },
1375 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1376 G_CALLBACK (set_toolbar_text) },
1377 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1378 G_CALLBACK (set_toolbar_both) },
1380 { NULL, NULL, "Woot", NULL, "Woot woot woot",
1382 { NULL, NULL, "Blah", NULL, "Blah blah blah",
1385 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1386 G_CALLBACK (set_toolbar_enable) },
1387 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1388 G_CALLBACK (set_toolbar_disable) },
1390 { NULL, NULL, "Hoo", NULL, "Hoo tooltip",
1392 { NULL, NULL, "Woo", NULL, "Woo tooltip",
1397 make_toolbar (GtkWidget *window)
1402 if (!gtk_widget_get_realized (window))
1403 gtk_widget_realize (window);
1405 toolbar = gtk_toolbar_new ();
1406 for (i = 0; i < G_N_ELEMENTS (make_toolbar_items); i++)
1409 GtkToolItem *toolitem;
1411 if (make_toolbar_items[i].label == NULL)
1413 toolitem = gtk_separator_tool_item_new ();
1417 icon = new_pixbuf ("test.xpm", gtk_widget_get_window (window));
1418 toolitem = gtk_tool_button_new (icon, make_toolbar_items[i].label);
1419 gtk_tool_item_set_tooltip_text (toolitem, make_toolbar_items[i].tooltip);
1420 if (make_toolbar_items[i].callback != NULL)
1421 g_signal_connect (toolitem, "clicked", make_toolbar_items[i].callback, toolbar);
1423 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1433 static guint statusbar_counter = 1;
1436 statusbar_push (GtkWidget *button,
1437 GtkStatusbar *statusbar)
1441 sprintf (text, "something %d", statusbar_counter++);
1443 gtk_statusbar_push (statusbar, 1, text);
1447 statusbar_push_long (GtkWidget *button,
1448 GtkStatusbar *statusbar)
1452 sprintf (text, "Just because a system has menu choices written with English words, phrases or sentences, that is no guarantee, that it is comprehensible. Individual words may not be familiar to some users (for example, \"repaginate\"), and two menu items may appear to satisfy the users's needs, whereas only one does (for example, \"put away\" or \"eject\").");
1454 gtk_statusbar_push (statusbar, 1, text);
1458 statusbar_pop (GtkWidget *button,
1459 GtkStatusbar *statusbar)
1461 gtk_statusbar_pop (statusbar, 1);
1465 statusbar_steal (GtkWidget *button,
1466 GtkStatusbar *statusbar)
1468 gtk_statusbar_remove (statusbar, 1, 4);
1472 statusbar_popped (GtkStatusbar *statusbar,
1477 statusbar_counter = 1;
1481 statusbar_contexts (GtkStatusbar *statusbar)
1485 string = "any context";
1486 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1488 gtk_statusbar_get_context_id (statusbar, string));
1490 string = "idle messages";
1491 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1493 gtk_statusbar_get_context_id (statusbar, string));
1495 string = "some text";
1496 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1498 gtk_statusbar_get_context_id (statusbar, string));
1500 string = "hit the mouse";
1501 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1503 gtk_statusbar_get_context_id (statusbar, string));
1505 string = "hit the mouse2";
1506 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1508 gtk_statusbar_get_context_id (statusbar, string));
1512 create_statusbar (GtkWidget *widget)
1514 static GtkWidget *window = NULL;
1518 GtkWidget *separator;
1519 GtkWidget *statusbar;
1523 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1524 gtk_window_set_screen (GTK_WINDOW (window),
1525 gtk_widget_get_screen (widget));
1527 g_signal_connect (window, "destroy",
1528 G_CALLBACK (gtk_widget_destroyed),
1531 gtk_window_set_title (GTK_WINDOW (window), "statusbar");
1532 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1534 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1535 gtk_container_add (GTK_CONTAINER (window), box1);
1537 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1538 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1539 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1541 statusbar = gtk_statusbar_new ();
1542 gtk_box_pack_end (GTK_BOX (box1), statusbar, TRUE, TRUE, 0);
1543 g_signal_connect (statusbar,
1545 G_CALLBACK (statusbar_popped),
1548 button = g_object_new (gtk_button_get_type (),
1549 "label", "push something",
1553 g_object_connect (button,
1554 "signal::clicked", statusbar_push, statusbar,
1557 button = g_object_connect (g_object_new (gtk_button_get_type (),
1562 "signal_after::clicked", statusbar_pop, statusbar,
1565 button = g_object_connect (g_object_new (gtk_button_get_type (),
1566 "label", "steal #4",
1570 "signal_after::clicked", statusbar_steal, statusbar,
1573 button = g_object_connect (g_object_new (gtk_button_get_type (),
1574 "label", "test contexts",
1578 "swapped_signal_after::clicked", statusbar_contexts, statusbar,
1581 button = g_object_connect (g_object_new (gtk_button_get_type (),
1582 "label", "push something long",
1586 "signal_after::clicked", statusbar_push_long, statusbar,
1589 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1590 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1592 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1593 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1594 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
1596 button = gtk_button_new_with_label ("close");
1597 g_signal_connect_swapped (button, "clicked",
1598 G_CALLBACK (gtk_widget_destroy),
1600 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1601 gtk_widget_set_can_default (button, TRUE);
1602 gtk_widget_grab_default (button);
1605 if (!gtk_widget_get_visible (window))
1606 gtk_widget_show_all (window);
1608 gtk_widget_destroy (window);
1616 handle_box_child_signal (GtkHandleBox *hb,
1618 const gchar *action)
1620 printf ("%s: child <%s> %sed\n",
1621 g_type_name (G_OBJECT_TYPE (hb)),
1622 g_type_name (G_OBJECT_TYPE (child)),
1627 create_handle_box (GtkWidget *widget)
1629 static GtkWidget* window = NULL;
1630 GtkWidget *handle_box;
1631 GtkWidget *handle_box2;
1636 GtkWidget *separator;
1640 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1642 gtk_window_set_screen (GTK_WINDOW (window),
1643 gtk_widget_get_screen (widget));
1644 gtk_window_set_modal (GTK_WINDOW (window), FALSE);
1645 gtk_window_set_title (GTK_WINDOW (window),
1647 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
1649 g_signal_connect (window, "destroy",
1650 G_CALLBACK (gtk_widget_destroyed),
1653 gtk_container_set_border_width (GTK_CONTAINER (window), 20);
1655 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1656 gtk_container_add (GTK_CONTAINER (window), vbox);
1657 gtk_widget_show (vbox);
1659 label = gtk_label_new ("Above");
1660 gtk_container_add (GTK_CONTAINER (vbox), label);
1661 gtk_widget_show (label);
1663 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1664 gtk_container_add (GTK_CONTAINER (vbox), separator);
1665 gtk_widget_show (separator);
1667 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
1668 gtk_container_add (GTK_CONTAINER (vbox), hbox);
1669 gtk_widget_show (hbox);
1671 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1672 gtk_container_add (GTK_CONTAINER (vbox), separator);
1673 gtk_widget_show (separator);
1675 label = gtk_label_new ("Below");
1676 gtk_container_add (GTK_CONTAINER (vbox), label);
1677 gtk_widget_show (label);
1679 handle_box = gtk_handle_box_new ();
1680 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1681 g_signal_connect (handle_box,
1683 G_CALLBACK (handle_box_child_signal),
1685 g_signal_connect (handle_box,
1687 G_CALLBACK (handle_box_child_signal),
1689 gtk_widget_show (handle_box);
1691 toolbar = make_toolbar (window);
1693 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
1694 gtk_widget_show (toolbar);
1696 handle_box = gtk_handle_box_new ();
1697 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1698 g_signal_connect (handle_box,
1700 G_CALLBACK (handle_box_child_signal),
1702 g_signal_connect (handle_box,
1704 G_CALLBACK (handle_box_child_signal),
1706 gtk_widget_show (handle_box);
1708 handle_box2 = gtk_handle_box_new ();
1709 gtk_container_add (GTK_CONTAINER (handle_box), handle_box2);
1710 g_signal_connect (handle_box2,
1712 G_CALLBACK (handle_box_child_signal),
1714 g_signal_connect (handle_box2,
1716 G_CALLBACK (handle_box_child_signal),
1718 gtk_widget_show (handle_box2);
1720 hbox = g_object_new (GTK_TYPE_BOX, "visible", 1, "parent", handle_box2, NULL);
1721 label = gtk_label_new ("Fooo!");
1722 gtk_container_add (GTK_CONTAINER (hbox), label);
1723 gtk_widget_show (label);
1724 g_object_new (GTK_TYPE_ARROW, "visible", 1, "parent", hbox, NULL);
1727 if (!gtk_widget_get_visible (window))
1728 gtk_widget_show (window);
1730 gtk_widget_destroy (window);
1737 sensitivity_toggled (GtkWidget *toggle,
1740 gtk_widget_set_sensitive (widget,
1741 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle)));
1745 create_sensitivity_control (GtkWidget *widget)
1749 button = gtk_toggle_button_new_with_label ("Sensitive");
1751 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
1752 gtk_widget_is_sensitive (widget));
1754 g_signal_connect (button,
1756 G_CALLBACK (sensitivity_toggled),
1759 gtk_widget_show_all (button);
1765 set_selectable_recursive (GtkWidget *widget,
1768 if (GTK_IS_CONTAINER (widget))
1773 children = gtk_container_get_children (GTK_CONTAINER (widget));
1777 set_selectable_recursive (tmp->data, setting);
1781 g_list_free (children);
1783 else if (GTK_IS_LABEL (widget))
1785 gtk_label_set_selectable (GTK_LABEL (widget), setting);
1790 selectable_toggled (GtkWidget *toggle,
1793 set_selectable_recursive (widget,
1794 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle)));
1798 create_selectable_control (GtkWidget *widget)
1802 button = gtk_toggle_button_new_with_label ("Selectable");
1804 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
1807 g_signal_connect (button,
1809 G_CALLBACK (selectable_toggled),
1812 gtk_widget_show_all (button);
1818 dialog_response (GtkWidget *dialog, gint response_id, GtkLabel *label)
1822 gtk_widget_destroy (dialog);
1824 text = "Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
1825 "as hyperlinks, which can be clicked\n"
1826 "or activated via <a href=\"keynav\">keynav</a>.\n"
1827 "The links remain the same.";
1828 gtk_label_set_markup (label, text);
1832 activate_link (GtkWidget *label, const gchar *uri, gpointer data)
1834 if (g_strcmp0 (uri, "keynav") == 0)
1838 dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (gtk_widget_get_toplevel (label)),
1839 GTK_DIALOG_DESTROY_WITH_PARENT,
1842 "The term <i>keynav</i> is a shorthand for "
1843 "keyboard navigation and refers to the process of using a program "
1844 "(exclusively) via keyboard input.");
1846 gtk_window_present (GTK_WINDOW (dialog));
1848 g_signal_connect (dialog, "response", G_CALLBACK (dialog_response), label);
1856 void create_labels (GtkWidget *widget)
1858 static GtkWidget *window = NULL;
1867 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1869 gtk_window_set_screen (GTK_WINDOW (window),
1870 gtk_widget_get_screen (widget));
1872 g_signal_connect (window, "destroy",
1873 G_CALLBACK (gtk_widget_destroyed),
1876 gtk_window_set_title (GTK_WINDOW (window), "Label");
1878 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1880 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
1881 gtk_container_add (GTK_CONTAINER (window), vbox);
1883 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
1885 button = create_sensitivity_control (hbox);
1887 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
1889 button = create_selectable_control (hbox);
1891 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
1893 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1895 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
1896 gtk_container_set_border_width (GTK_CONTAINER (window), 5);
1898 frame = gtk_frame_new ("Normal Label");
1899 label = gtk_label_new ("This is a Normal label");
1900 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
1901 gtk_container_add (GTK_CONTAINER (frame), label);
1902 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1904 frame = gtk_frame_new ("Multi-line Label");
1905 label = gtk_label_new ("This is a Multi-line label.\nSecond line\nThird line");
1906 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
1907 gtk_container_add (GTK_CONTAINER (frame), label);
1908 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1910 frame = gtk_frame_new ("Left Justified Label");
1911 label = gtk_label_new ("This is a Left-Justified\nMulti-line label.\nThird line");
1912 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_MIDDLE);
1913 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1914 gtk_container_add (GTK_CONTAINER (frame), label);
1915 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1917 frame = gtk_frame_new ("Right Justified Label");
1918 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
1919 label = gtk_label_new ("This is a Right-Justified\nMulti-line label.\nFourth line, (j/k)");
1920 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1921 gtk_container_add (GTK_CONTAINER (frame), label);
1922 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1924 frame = gtk_frame_new ("Internationalized Label");
1925 label = gtk_label_new (NULL);
1926 gtk_label_set_markup (GTK_LABEL (label),
1927 "French (Fran\303\247ais) Bonjour, Salut\n"
1928 "Korean (\355\225\234\352\270\200) \354\225\210\353\205\225\355\225\230\354\204\270\354\232\224, \354\225\210\353\205\225\355\225\230\354\213\255\353\213\210\352\271\214\n"
1929 "Russian (\320\240\321\203\321\201\321\201\320\272\320\270\320\271) \320\227\320\264\321\200\320\260\320\262\321\201\321\202\320\262\321\203\320\271\321\202\320\265!\n"
1930 "Chinese (Simplified) <span lang=\"zh-cn\">\345\205\203\346\260\224 \345\274\200\345\217\221</span>\n"
1931 "Chinese (Traditional) <span lang=\"zh-tw\">\345\205\203\346\260\243 \351\226\213\347\231\274</span>\n"
1932 "Japanese <span lang=\"ja\">\345\205\203\346\260\227 \351\226\213\347\231\272</span>");
1933 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1934 gtk_container_add (GTK_CONTAINER (frame), label);
1935 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1937 frame = gtk_frame_new ("Bidirection Label");
1938 label = gtk_label_new ("\342\200\217Arabic \330\247\331\204\330\263\331\204\330\247\331\205 \330\271\331\204\331\212\331\203\331\205\n"
1939 "\342\200\217Hebrew \327\251\327\234\327\225\327\235");
1940 gtk_container_add (GTK_CONTAINER (frame), label);
1941 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1943 frame = gtk_frame_new ("Links in a label");
1944 label = gtk_label_new ("Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
1945 "as hyperlinks, which can be clicked\n"
1946 "or activated via <a href=\"keynav\">keynav</a>");
1947 gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
1948 gtk_container_add (GTK_CONTAINER (frame), label);
1949 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1950 g_signal_connect (label, "activate-link", G_CALLBACK (activate_link), NULL);
1952 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1953 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
1954 frame = gtk_frame_new ("Line wrapped label");
1955 label = gtk_label_new ("This is an example of a line-wrapped label. It should not be taking "\
1956 "up the entire "/* big space to test spacing */\
1957 "width allocated to it, but automatically wraps the words to fit. "\
1958 "The time has come, for all good men, to come to the aid of their party. "\
1959 "The sixth sheik's six sheep's sick.\n"\
1960 " It supports multiple paragraphs correctly, and correctly adds "\
1961 "many extra spaces. ");
1963 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
1964 gtk_container_add (GTK_CONTAINER (frame), label);
1965 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1967 frame = gtk_frame_new ("Filled, wrapped label");
1968 label = gtk_label_new ("This is an example of a line-wrapped, filled label. It should be taking "\
1969 "up the entire width allocated to it. Here is a seneance to prove "\
1970 "my point. Here is another sentence. "\
1971 "Here comes the sun, do de do de do.\n"\
1972 " This is a new paragraph.\n"\
1973 " This is another newer, longer, better paragraph. It is coming to an end, "\
1975 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_FILL);
1976 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
1977 gtk_container_add (GTK_CONTAINER (frame), label);
1978 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1980 frame = gtk_frame_new ("Underlined label");
1981 label = gtk_label_new ("This label is underlined!\n"
1982 "This one is underlined (\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257) in quite a funky fashion");
1983 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1984 gtk_label_set_pattern (GTK_LABEL (label), "_________________________ _ _________ _ _____ _ __ __ ___ ____ _____");
1985 gtk_container_add (GTK_CONTAINER (frame), label);
1986 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1988 frame = gtk_frame_new ("Markup label");
1989 label = gtk_label_new (NULL);
1991 /* There's also a gtk_label_set_markup() without accel if you
1992 * don't have an accelerator key
1994 gtk_label_set_markup_with_mnemonic (GTK_LABEL (label),
1995 "This <span foreground=\"blue\" background=\"orange\">label</span> has "
1996 "<b>markup</b> _such as "
1997 "<big><i>Big Italics</i></big>\n"
1998 "<tt>Monospace font</tt>\n"
1999 "<u>Underline!</u>\n"
2001 "<span foreground=\"green\" background=\"red\">Ugly colors</span>\n"
2002 "and nothing on this line,\n"
2005 "or even on this one\n"
2006 "la <big>la <big>la <big>la <big>la</big></big></big></big>\n"
2007 "but this _word is <span foreground=\"purple\"><big>purple</big></span>\n"
2008 "<span underline=\"double\">We like <sup>superscript</sup> and <sub>subscript</sub> too</span>");
2010 g_assert (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)) == GDK_KEY_s);
2012 gtk_container_add (GTK_CONTAINER (frame), label);
2013 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2016 if (!gtk_widget_get_visible (window))
2017 gtk_widget_show_all (window);
2019 gtk_widget_destroy (window);
2023 on_angle_scale_changed (GtkRange *range,
2026 gtk_label_set_angle (GTK_LABEL (label), gtk_range_get_value (range));
2030 create_rotated_label (GtkWidget *widget)
2032 static GtkWidget *window = NULL;
2033 GtkWidget *content_area;
2037 GtkWidget *scale_label;
2038 GtkWidget *scale_hbox;
2042 window = gtk_dialog_new_with_buttons ("Rotated Label",
2043 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2044 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2047 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2049 gtk_window_set_screen (GTK_WINDOW (window),
2050 gtk_widget_get_screen (widget));
2052 g_signal_connect (window, "response",
2053 G_CALLBACK (gtk_widget_destroy), NULL);
2054 g_signal_connect (window, "destroy",
2055 G_CALLBACK (gtk_widget_destroyed), &window);
2057 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2059 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2060 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
2061 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
2063 label = gtk_label_new (NULL);
2064 gtk_label_set_markup (GTK_LABEL (label), "Hello World\n<i>Rotate</i> <span underline='single' foreground='blue'>me</span>");
2065 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
2067 scale_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2068 gtk_box_pack_start (GTK_BOX (vbox), scale_hbox, FALSE, FALSE, 0);
2070 scale_label = gtk_label_new (NULL);
2071 gtk_label_set_markup (GTK_LABEL (scale_label), "<i>Angle: </i>");
2072 gtk_box_pack_start (GTK_BOX (scale_hbox), scale_label, FALSE, FALSE, 0);
2074 hscale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL,
2076 g_signal_connect (hscale, "value-changed",
2077 G_CALLBACK (on_angle_scale_changed), label);
2079 gtk_range_set_value (GTK_RANGE (hscale), 45);
2080 gtk_widget_set_size_request (hscale, 200, -1);
2081 gtk_box_pack_start (GTK_BOX (scale_hbox), hscale, TRUE, TRUE, 0);
2084 if (!gtk_widget_get_visible (window))
2085 gtk_widget_show_all (window);
2087 gtk_widget_destroy (window);
2090 #define DEFAULT_TEXT_RADIUS 200
2093 on_rotated_text_unrealize (GtkWidget *widget)
2095 g_object_set_data (G_OBJECT (widget), "text-gc", NULL);
2099 on_rotated_text_draw (GtkWidget *widget,
2101 GdkPixbuf *tile_pixbuf)
2103 static const gchar *words[] = { "The", "grand", "old", "Duke", "of", "York",
2104 "had", "10,000", "men" };
2109 PangoLayout *layout;
2110 PangoContext *context;
2111 PangoFontDescription *desc;
2115 gdk_cairo_set_source_pixbuf (cr, tile_pixbuf, 0, 0);
2116 cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT);
2119 cairo_set_source_rgb (cr, 0, 0, 0);
2121 width = gtk_widget_get_allocated_width (widget);
2122 height = gtk_widget_get_allocated_height (widget);
2123 radius = MIN (width, height) / 2.;
2125 cairo_translate (cr,
2126 radius + (width - 2 * radius) / 2,
2127 radius + (height - 2 * radius) / 2);
2128 cairo_scale (cr, radius / DEFAULT_TEXT_RADIUS, radius / DEFAULT_TEXT_RADIUS);
2130 context = gtk_widget_get_pango_context (widget);
2131 layout = pango_layout_new (context);
2132 desc = pango_font_description_from_string ("Sans Bold 30");
2133 pango_layout_set_font_description (layout, desc);
2134 pango_font_description_free (desc);
2136 n_words = G_N_ELEMENTS (words);
2137 for (i = 0; i < n_words; i++)
2143 cairo_rotate (cr, 2 * G_PI * i / n_words);
2144 pango_cairo_update_layout (cr, layout);
2146 pango_layout_set_text (layout, words[i], -1);
2147 pango_layout_get_size (layout, &width, &height);
2149 cairo_move_to (cr, - width / 2 / PANGO_SCALE, - DEFAULT_TEXT_RADIUS);
2150 pango_cairo_show_layout (cr, layout);
2155 g_object_unref (layout);
2161 create_rotated_text (GtkWidget *widget)
2163 static GtkWidget *window = NULL;
2167 const GdkRGBA white = { 1.0, 1.0, 1.0, 1.0 };
2168 GtkRequisition requisition;
2169 GtkWidget *content_area;
2170 GtkWidget *drawing_area;
2171 GdkPixbuf *tile_pixbuf;
2173 window = gtk_dialog_new_with_buttons ("Rotated Text",
2174 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2175 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2178 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2180 gtk_window_set_screen (GTK_WINDOW (window),
2181 gtk_widget_get_screen (widget));
2183 g_signal_connect (window, "response",
2184 G_CALLBACK (gtk_widget_destroy), NULL);
2185 g_signal_connect (window, "destroy",
2186 G_CALLBACK (gtk_widget_destroyed), &window);
2188 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2190 drawing_area = gtk_drawing_area_new ();
2191 gtk_box_pack_start (GTK_BOX (content_area), drawing_area, TRUE, TRUE, 0);
2192 gtk_widget_override_background_color (drawing_area, 0, &white);
2194 tile_pixbuf = gdk_pixbuf_new_from_file ("marble.xpm", NULL);
2196 g_signal_connect (drawing_area, "draw",
2197 G_CALLBACK (on_rotated_text_draw), tile_pixbuf);
2198 g_signal_connect (drawing_area, "unrealize",
2199 G_CALLBACK (on_rotated_text_unrealize), NULL);
2201 gtk_widget_show_all (gtk_bin_get_child (GTK_BIN (window)));
2203 gtk_widget_set_size_request (drawing_area, DEFAULT_TEXT_RADIUS * 2, DEFAULT_TEXT_RADIUS * 2);
2204 gtk_widget_get_preferred_size ( (window),
2205 &requisition, NULL);
2206 gtk_widget_set_size_request (drawing_area, -1, -1);
2207 gtk_window_resize (GTK_WINDOW (window), requisition.width, requisition.height);
2210 if (!gtk_widget_get_visible (window))
2211 gtk_widget_show (window);
2213 gtk_widget_destroy (window);
2221 reparent_label (GtkWidget *widget,
2222 GtkWidget *new_parent)
2226 label = g_object_get_data (G_OBJECT (widget), "user_data");
2228 gtk_widget_reparent (label, new_parent);
2232 set_parent_signal (GtkWidget *child,
2233 GtkWidget *old_parent,
2238 parent = gtk_widget_get_parent (child);
2239 g_message ("set_parent for \"%s\": new parent: \"%s\", old parent: \"%s\", data: %d\n",
2240 g_type_name (G_OBJECT_TYPE (child)),
2241 parent ? g_type_name (G_OBJECT_TYPE (parent)) : "NULL",
2242 old_parent ? g_type_name (G_OBJECT_TYPE (old_parent)) : "NULL",
2243 GPOINTER_TO_INT (func_data));
2247 create_reparent (GtkWidget *widget)
2249 static GtkWidget *window = NULL;
2256 GtkWidget *separator;
2257 GtkWidget *event_box;
2261 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2263 gtk_window_set_screen (GTK_WINDOW (window),
2264 gtk_widget_get_screen (widget));
2266 g_signal_connect (window, "destroy",
2267 G_CALLBACK (gtk_widget_destroyed),
2270 gtk_window_set_title (GTK_WINDOW (window), "reparent");
2271 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2273 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2274 gtk_container_add (GTK_CONTAINER (window), box1);
2276 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
2277 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2278 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2280 label = gtk_label_new ("Hello World");
2282 frame = gtk_frame_new ("Frame 1");
2283 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2285 box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2286 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2287 gtk_container_add (GTK_CONTAINER (frame), box3);
2289 button = gtk_button_new_with_label ("switch");
2290 g_object_set_data (G_OBJECT (button), "user_data", label);
2291 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2293 event_box = gtk_event_box_new ();
2294 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2295 gtk_container_add (GTK_CONTAINER (event_box), label);
2297 g_signal_connect (button, "clicked",
2298 G_CALLBACK (reparent_label),
2301 g_signal_connect (label, "parent_set",
2302 G_CALLBACK (set_parent_signal),
2303 GINT_TO_POINTER (42));
2305 frame = gtk_frame_new ("Frame 2");
2306 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2308 box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2309 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2310 gtk_container_add (GTK_CONTAINER (frame), box3);
2312 button = gtk_button_new_with_label ("switch");
2313 g_object_set_data (G_OBJECT (button), "user_data", label);
2314 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2316 event_box = gtk_event_box_new ();
2317 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2319 g_signal_connect (button, "clicked",
2320 G_CALLBACK (reparent_label),
2323 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2324 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2326 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2327 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2328 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2330 button = gtk_button_new_with_label ("close");
2331 g_signal_connect_swapped (button, "clicked",
2332 G_CALLBACK (gtk_widget_destroy), window);
2333 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2334 gtk_widget_set_can_default (button, TRUE);
2335 gtk_widget_grab_default (button);
2338 if (!gtk_widget_get_visible (window))
2339 gtk_widget_show_all (window);
2341 gtk_widget_destroy (window);
2348 grippy_button_press (GtkWidget *area, GdkEventButton *event, GdkWindowEdge edge)
2350 if (event->type == GDK_BUTTON_PRESS)
2352 if (event->button == 1)
2353 gtk_window_begin_resize_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)), edge,
2354 event->button, event->x_root, event->y_root,
2356 else if (event->button == 2)
2357 gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)),
2358 event->button, event->x_root, event->y_root,
2365 grippy_draw (GtkWidget *area, cairo_t *cr, GdkWindowEdge edge)
2367 GtkStyleContext *context;
2368 GtkJunctionSides sides;
2372 case GDK_WINDOW_EDGE_NORTH_WEST:
2373 sides = GTK_JUNCTION_CORNER_TOPLEFT;
2375 case GDK_WINDOW_EDGE_NORTH:
2376 sides = GTK_JUNCTION_TOP;
2378 case GDK_WINDOW_EDGE_NORTH_EAST:
2379 sides = GTK_JUNCTION_CORNER_TOPRIGHT;
2381 case GDK_WINDOW_EDGE_WEST:
2382 sides = GTK_JUNCTION_LEFT;
2384 case GDK_WINDOW_EDGE_EAST:
2385 sides = GTK_JUNCTION_RIGHT;
2387 case GDK_WINDOW_EDGE_SOUTH_WEST:
2388 sides = GTK_JUNCTION_CORNER_BOTTOMLEFT;
2390 case GDK_WINDOW_EDGE_SOUTH:
2391 sides = GTK_JUNCTION_BOTTOM;
2393 case GDK_WINDOW_EDGE_SOUTH_EAST:
2394 sides = GTK_JUNCTION_CORNER_BOTTOMRIGHT;
2397 g_assert_not_reached();
2400 context = gtk_widget_get_style_context (area);
2401 gtk_style_context_save (context);
2402 gtk_style_context_add_class (context, "grip");
2403 gtk_style_context_set_junction_sides (context, sides);
2404 gtk_render_handle (context, cr,
2406 gtk_widget_get_allocated_width (area),
2407 gtk_widget_get_allocated_height (area));
2409 gtk_style_context_restore (context);
2415 create_resize_grips (GtkWidget *widget)
2417 static GtkWidget *window = NULL;
2419 GtkWidget *hbox, *vbox;
2422 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2424 gtk_window_set_screen (GTK_WINDOW (window),
2425 gtk_widget_get_screen (widget));
2427 gtk_window_set_title (GTK_WINDOW (window), "resize grips");
2429 g_signal_connect (window, "destroy",
2430 G_CALLBACK (gtk_widget_destroyed),
2433 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2434 gtk_container_add (GTK_CONTAINER (window), vbox);
2436 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2437 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2440 area = gtk_drawing_area_new ();
2441 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2442 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2443 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2444 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2445 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2446 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2449 area = gtk_drawing_area_new ();
2450 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2451 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2452 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2453 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2454 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2455 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2458 area = gtk_drawing_area_new ();
2459 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2460 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2461 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2462 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2463 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2464 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2466 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2467 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2470 area = gtk_drawing_area_new ();
2471 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2472 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2473 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2474 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2475 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2476 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2479 area = gtk_drawing_area_new ();
2480 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2483 area = gtk_drawing_area_new ();
2484 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2485 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2486 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2487 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2488 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2489 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2492 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2493 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2496 area = gtk_drawing_area_new ();
2497 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2498 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2499 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2500 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2501 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2502 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2504 area = gtk_drawing_area_new ();
2505 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2506 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2507 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2508 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2509 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2510 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2513 area = gtk_drawing_area_new ();
2514 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2515 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2516 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2517 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2518 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2519 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2522 if (!gtk_widget_get_visible (window))
2523 gtk_widget_show_all (window);
2525 gtk_widget_destroy (window);
2531 gint upositionx = 0;
2532 gint upositiony = 0;
2535 uposition_configure (GtkWidget *window)
2541 lx = g_object_get_data (G_OBJECT (window), "x");
2542 ly = g_object_get_data (G_OBJECT (window), "y");
2544 gdk_window_get_root_origin (gtk_widget_get_window (window),
2545 &upositionx, &upositiony);
2546 sprintf (buffer, "%d", upositionx);
2547 gtk_label_set_text (lx, buffer);
2548 sprintf (buffer, "%d", upositiony);
2549 gtk_label_set_text (ly, buffer);
2555 uposition_stop_configure (GtkToggleButton *toggle,
2558 if (gtk_toggle_button_get_active (toggle))
2559 g_signal_handlers_block_by_func (window, G_CALLBACK (uposition_configure), NULL);
2561 g_signal_handlers_unblock_by_func (window, G_CALLBACK (uposition_configure), NULL);
2565 create_saved_position (GtkWidget *widget)
2567 static GtkWidget *window = NULL;
2572 GtkWidget *main_vbox;
2580 window = g_object_connect (g_object_new (GTK_TYPE_WINDOW,
2581 "type", GTK_WINDOW_TOPLEVEL,
2582 "title", "Saved Position",
2584 "signal::configure_event", uposition_configure, NULL,
2587 gtk_window_move (GTK_WINDOW (window), upositionx, upositiony);
2589 gtk_window_set_screen (GTK_WINDOW (window),
2590 gtk_widget_get_screen (widget));
2593 g_signal_connect (window, "destroy",
2594 G_CALLBACK (gtk_widget_destroyed),
2597 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2598 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
2599 gtk_container_add (GTK_CONTAINER (window), main_vbox);
2602 g_object_new (GTK_TYPE_BOX,
2603 "orientation", GTK_ORIENTATION_VERTICAL,
2604 "GtkBox::homogeneous", FALSE,
2605 "GtkBox::spacing", 5,
2606 "GtkContainer::border_width", 10,
2607 "GtkWidget::parent", main_vbox,
2608 "GtkWidget::visible", TRUE,
2609 "child", g_object_connect (g_object_new (GTK_TYPE_TOGGLE_BUTTON,
2610 "label", "Stop Events",
2614 "signal::clicked", uposition_stop_configure, window,
2618 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2619 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2620 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2622 label = gtk_label_new ("X Origin : ");
2623 gtk_widget_set_halign (label, GTK_ALIGN_START);
2624 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
2625 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
2627 x_label = gtk_label_new ("");
2628 gtk_box_pack_start (GTK_BOX (hbox), x_label, TRUE, TRUE, 0);
2629 g_object_set_data (G_OBJECT (window), "x", x_label);
2631 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2632 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2633 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2635 label = gtk_label_new ("Y Origin : ");
2636 gtk_widget_set_halign (label, GTK_ALIGN_START);
2637 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
2638 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
2640 y_label = gtk_label_new ("");
2641 gtk_box_pack_start (GTK_BOX (hbox), y_label, TRUE, TRUE, 0);
2642 g_object_set_data (G_OBJECT (window), "y", y_label);
2645 g_object_new (gtk_separator_get_type (),
2646 "GtkWidget::visible", TRUE,
2648 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
2650 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2651 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
2652 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
2654 button = gtk_button_new_with_label ("Close");
2655 g_signal_connect_swapped (button, "clicked",
2656 G_CALLBACK (gtk_widget_destroy),
2658 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
2659 gtk_widget_set_can_default (button, TRUE);
2660 gtk_widget_grab_default (button);
2662 gtk_widget_show_all (window);
2665 gtk_widget_destroy (window);
2673 create_pixbuf (GtkWidget *widget)
2675 static GtkWidget *window = NULL;
2681 GtkWidget *separator;
2682 GtkWidget *pixbufwid;
2683 GdkWindow *gdk_window;
2687 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2689 gtk_window_set_screen (GTK_WINDOW (window),
2690 gtk_widget_get_screen (widget));
2692 g_signal_connect (window, "destroy",
2693 G_CALLBACK (gtk_widget_destroyed),
2696 gtk_window_set_title (GTK_WINDOW (window), "GtkPixmap");
2697 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2698 gtk_widget_realize(window);
2700 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2701 gtk_container_add (GTK_CONTAINER (window), box1);
2703 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2704 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2705 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2707 button = gtk_button_new ();
2708 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
2710 gdk_window = gtk_widget_get_window (window);
2712 pixbufwid = new_pixbuf ("test.xpm", gdk_window);
2714 label = gtk_label_new ("Pixbuf\ntest");
2715 box3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2716 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
2717 gtk_container_add (GTK_CONTAINER (box3), pixbufwid);
2718 gtk_container_add (GTK_CONTAINER (box3), label);
2719 gtk_container_add (GTK_CONTAINER (button), box3);
2721 button = gtk_button_new ();
2722 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
2724 pixbufwid = new_pixbuf ("test.xpm", gdk_window);
2726 label = gtk_label_new ("Pixbuf\ntest");
2727 box3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2728 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
2729 gtk_container_add (GTK_CONTAINER (box3), pixbufwid);
2730 gtk_container_add (GTK_CONTAINER (box3), label);
2731 gtk_container_add (GTK_CONTAINER (button), box3);
2733 gtk_widget_set_sensitive (button, FALSE);
2735 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2736 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2738 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2739 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2740 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2742 button = gtk_button_new_with_label ("close");
2743 g_signal_connect_swapped (button, "clicked",
2744 G_CALLBACK (gtk_widget_destroy),
2746 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2747 gtk_widget_set_can_default (button, TRUE);
2748 gtk_widget_grab_default (button);
2751 if (!gtk_widget_get_visible (window))
2752 gtk_widget_show_all (window);
2754 gtk_widget_destroy (window);
2758 create_tooltips (GtkWidget *widget)
2760 static GtkWidget *window = NULL;
2767 GtkWidget *separator;
2772 g_object_new (gtk_window_get_type (),
2773 "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
2774 "GtkContainer::border_width", 0,
2775 "GtkWindow::title", "Tooltips",
2776 "GtkWindow::resizable", FALSE,
2779 gtk_window_set_screen (GTK_WINDOW (window),
2780 gtk_widget_get_screen (widget));
2782 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2783 gtk_container_add (GTK_CONTAINER (window), box1);
2785 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2786 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2787 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2789 button = gtk_toggle_button_new_with_label ("button1");
2790 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2792 gtk_widget_set_tooltip_text (button, "This is button 1");
2794 button = gtk_toggle_button_new_with_label ("button2");
2795 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2797 gtk_widget_set_tooltip_text (button,
2798 "This is button 2. This is also a really long tooltip which probably "
2799 "won't fit on a single line and will therefore need to be wrapped. "
2800 "Hopefully the wrapping will work correctly.");
2802 toggle = gtk_toggle_button_new_with_label ("Override TipsQuery Label");
2803 gtk_box_pack_start (GTK_BOX (box2), toggle, TRUE, TRUE, 0);
2805 gtk_widget_set_tooltip_text (toggle, "Toggle TipsQuery view.");
2808 g_object_new (GTK_TYPE_BOX,
2809 "orientation", GTK_ORIENTATION_VERTICAL,
2810 "homogeneous", FALSE,
2817 g_object_new (gtk_button_get_type (),
2822 gtk_box_set_child_packing (GTK_BOX (box3), button, FALSE, FALSE, 0, GTK_PACK_START);
2823 gtk_widget_set_tooltip_text (button, "Start the Tooltips Inspector");
2825 frame = g_object_new (gtk_frame_get_type (),
2826 "label", "ToolTips Inspector",
2827 "label_xalign", (double) 0.5,
2833 gtk_box_set_child_packing (GTK_BOX (box2), frame, TRUE, TRUE, 10, GTK_PACK_START);
2835 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2836 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2838 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2839 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2840 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2842 button = gtk_button_new_with_label ("close");
2843 g_signal_connect_swapped (button, "clicked",
2844 G_CALLBACK (gtk_widget_destroy),
2846 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2847 gtk_widget_set_can_default (button, TRUE);
2848 gtk_widget_grab_default (button);
2850 gtk_widget_set_tooltip_text (button, "Push this button to close window");
2853 if (!gtk_widget_get_visible (window))
2854 gtk_widget_show_all (window);
2856 gtk_widget_destroy (window);
2864 pack_image (GtkWidget *box,
2868 gtk_box_pack_start (GTK_BOX (box),
2869 gtk_label_new (text),
2872 gtk_box_pack_start (GTK_BOX (box),
2878 create_image (GtkWidget *widget)
2880 static GtkWidget *window = NULL;
2887 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2889 gtk_window_set_screen (GTK_WINDOW (window),
2890 gtk_widget_get_screen (widget));
2892 /* this is bogus for testing drawing when allocation < request,
2893 * don't copy into real code
2895 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2897 g_signal_connect (window, "destroy",
2898 G_CALLBACK (gtk_widget_destroyed),
2901 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2903 gtk_container_add (GTK_CONTAINER (window), vbox);
2905 pack_image (vbox, "Stock Warning Dialog",
2906 gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
2907 GTK_ICON_SIZE_DIALOG));
2909 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
2911 pack_image (vbox, "Pixbuf",
2912 gtk_image_new_from_pixbuf (pixbuf));
2914 g_object_unref (pixbuf);
2917 if (!gtk_widget_get_visible (window))
2918 gtk_widget_show_all (window);
2920 gtk_widget_destroy (window);
2928 create_menu (GdkScreen *screen, gint depth, gint length, gboolean tearoff)
2931 GtkWidget *menuitem;
2940 menu = gtk_menu_new ();
2941 gtk_menu_set_screen (GTK_MENU (menu), screen);
2947 menuitem = gtk_tearoff_menu_item_new ();
2948 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2949 gtk_widget_show (menuitem);
2952 image = gtk_image_new_from_stock (GTK_STOCK_OPEN,
2953 GTK_ICON_SIZE_MENU);
2954 gtk_widget_show (image);
2955 menuitem = gtk_image_menu_item_new_with_label ("Image item");
2956 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
2957 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2958 gtk_widget_show (menuitem);
2960 for (i = 0, j = 1; i < length; i++, j++)
2962 sprintf (buf, "item %2d - %d", depth, j);
2964 menuitem = gtk_radio_menu_item_new_with_label (group, buf);
2965 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
2967 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2968 gtk_widget_show (menuitem);
2970 gtk_widget_set_sensitive (menuitem, FALSE);
2973 gtk_check_menu_item_set_inconsistent (GTK_CHECK_MENU_ITEM (menuitem),
2977 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem),
2978 create_menu (screen, depth - 1, 5, TRUE));
2985 create_table_menu (GdkScreen *screen, gint cols, gint rows, gboolean tearoff)
2988 GtkWidget *menuitem;
2994 menu = gtk_menu_new ();
2995 gtk_menu_set_screen (GTK_MENU (menu), screen);
3000 menuitem = gtk_tearoff_menu_item_new ();
3001 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3002 gtk_widget_show (menuitem);
3006 menuitem = gtk_menu_item_new_with_label ("items");
3007 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3009 submenu = gtk_menu_new ();
3010 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3011 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3012 gtk_widget_show (menuitem);
3015 /* now fill the items submenu */
3016 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3017 GTK_ICON_SIZE_MENU);
3018 gtk_widget_show (image);
3019 menuitem = gtk_image_menu_item_new_with_label ("Image");
3020 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3021 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3022 gtk_widget_show (menuitem);
3024 menuitem = gtk_menu_item_new_with_label ("x");
3025 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 0, 1);
3026 gtk_widget_show (menuitem);
3028 menuitem = gtk_menu_item_new_with_label ("x");
3029 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 2);
3030 gtk_widget_show (menuitem);
3032 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3033 GTK_ICON_SIZE_MENU);
3034 gtk_widget_show (image);
3035 menuitem = gtk_image_menu_item_new_with_label ("Image");
3036 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3037 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3038 gtk_widget_show (menuitem);
3040 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3041 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 2, 3);
3042 gtk_widget_show (menuitem);
3044 menuitem = gtk_menu_item_new_with_label ("x");
3045 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 2, 3);
3046 gtk_widget_show (menuitem);
3048 menuitem = gtk_menu_item_new_with_label ("x");
3049 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 3, 4);
3050 gtk_widget_show (menuitem);
3052 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3053 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 3, 4);
3054 gtk_widget_show (menuitem);
3056 menuitem = gtk_check_menu_item_new_with_label ("Check");
3057 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 4, 5);
3058 gtk_widget_show (menuitem);
3060 menuitem = gtk_menu_item_new_with_label ("x");
3061 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 4, 5);
3062 gtk_widget_show (menuitem);
3064 menuitem = gtk_menu_item_new_with_label ("x");
3065 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 5, 6);
3066 gtk_widget_show (menuitem);
3068 menuitem = gtk_check_menu_item_new_with_label ("Check");
3069 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 5, 6);
3070 gtk_widget_show (menuitem);
3072 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3073 gtk_widget_show (menuitem);
3074 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 8);
3076 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3077 gtk_widget_show (menuitem);
3078 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 2);
3080 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3081 gtk_widget_show (menuitem);
3082 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 0);
3084 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3085 gtk_widget_show (menuitem);
3086 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, -1);
3088 /* end of items submenu */
3090 menuitem = gtk_menu_item_new_with_label ("spanning");
3091 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3093 submenu = gtk_menu_new ();
3094 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3095 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3096 gtk_widget_show (menuitem);
3099 /* now fill the spanning submenu */
3100 menuitem = gtk_menu_item_new_with_label ("a");
3101 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 2, 0, 1);
3102 gtk_widget_show (menuitem);
3104 menuitem = gtk_menu_item_new_with_label ("b");
3105 gtk_menu_attach (GTK_MENU (submenu), menuitem, 2, 3, 0, 2);
3106 gtk_widget_show (menuitem);
3108 menuitem = gtk_menu_item_new_with_label ("c");
3109 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 3);
3110 gtk_widget_show (menuitem);
3112 menuitem = gtk_menu_item_new_with_label ("d");
3113 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3114 gtk_widget_show (menuitem);
3116 menuitem = gtk_menu_item_new_with_label ("e");
3117 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 3, 2, 3);
3118 gtk_widget_show (menuitem);
3119 /* end of spanning submenu */
3121 menuitem = gtk_menu_item_new_with_label ("left");
3122 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, 1, j, j + 1);
3123 submenu = gtk_menu_new ();
3124 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3125 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3126 gtk_widget_show (menuitem);
3128 menuitem = gtk_menu_item_new_with_label ("Empty");
3129 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3130 submenu = gtk_menu_new ();
3131 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3132 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3133 gtk_widget_show (menuitem);
3135 menuitem = gtk_menu_item_new_with_label ("right");
3136 gtk_menu_attach (GTK_MENU (menu), menuitem, 1, 2, j, j + 1);
3137 submenu = gtk_menu_new ();
3138 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3139 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3140 gtk_widget_show (menuitem);
3142 menuitem = gtk_menu_item_new_with_label ("Empty");
3143 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3144 gtk_widget_show (menuitem);
3148 for (; j < rows; j++)
3149 for (i = 0; i < cols; i++)
3151 sprintf (buf, "(%d %d)", i, j);
3152 menuitem = gtk_menu_item_new_with_label (buf);
3153 gtk_menu_attach (GTK_MENU (menu), menuitem, i, i + 1, j, j + 1);
3154 gtk_widget_show (menuitem);
3157 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3158 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 8);
3159 gtk_widget_show (menuitem);
3160 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3161 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 2);
3162 gtk_widget_show (menuitem);
3163 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3164 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 0);
3165 gtk_widget_show (menuitem);
3166 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3167 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, -1);
3168 gtk_widget_show (menuitem);
3174 create_menus (GtkWidget *widget)
3176 static GtkWidget *window = NULL;
3180 GtkWidget *optionmenu;
3181 GtkWidget *separator;
3187 GtkWidget *menuitem;
3188 GtkAccelGroup *accel_group;
3190 GdkScreen *screen = gtk_widget_get_screen (widget);
3192 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3194 gtk_window_set_screen (GTK_WINDOW (window), screen);
3196 g_signal_connect (window, "destroy",
3197 G_CALLBACK (gtk_widget_destroyed),
3199 g_signal_connect (window, "delete-event",
3200 G_CALLBACK (gtk_true),
3203 accel_group = gtk_accel_group_new ();
3204 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3206 gtk_window_set_title (GTK_WINDOW (window), "menus");
3207 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3210 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
3211 gtk_container_add (GTK_CONTAINER (window), box1);
3212 gtk_widget_show (box1);
3214 menubar = gtk_menu_bar_new ();
3215 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3216 gtk_widget_show (menubar);
3218 menu = create_menu (screen, 2, 50, TRUE);
3220 menuitem = gtk_menu_item_new_with_label ("test\nline2");
3221 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3222 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3223 gtk_widget_show (menuitem);
3225 menu = create_table_menu (screen, 2, 50, TRUE);
3227 menuitem = gtk_menu_item_new_with_label ("table");
3228 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3229 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3230 gtk_widget_show (menuitem);
3232 menuitem = gtk_menu_item_new_with_label ("foo");
3233 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5, TRUE));
3234 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3235 gtk_widget_show (menuitem);
3237 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3238 GTK_ICON_SIZE_MENU);
3239 gtk_widget_show (image);
3240 menuitem = gtk_image_menu_item_new_with_label ("Help");
3241 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3242 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 4, 5, TRUE));
3243 gtk_widget_set_hexpand (menuitem, TRUE);
3244 gtk_widget_set_halign (menuitem, GTK_ALIGN_END);
3245 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3246 gtk_widget_show (menuitem);
3248 menubar = gtk_menu_bar_new ();
3249 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3250 gtk_widget_show (menubar);
3252 menu = create_menu (screen, 2, 10, TRUE);
3254 menuitem = gtk_menu_item_new_with_label ("Second menu bar");
3255 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3256 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3257 gtk_widget_show (menuitem);
3259 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3260 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3261 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3262 gtk_widget_show (box2);
3264 menu = create_menu (screen, 1, 5, FALSE);
3265 gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
3267 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
3268 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3269 gtk_widget_show (menuitem);
3271 menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
3272 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3273 gtk_widget_show (menuitem);
3274 gtk_widget_add_accelerator (menuitem,
3280 menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
3281 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3282 gtk_widget_show (menuitem);
3283 gtk_widget_add_accelerator (menuitem,
3288 GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3289 menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
3290 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3291 gtk_widget_show (menuitem);
3292 gtk_widget_add_accelerator (menuitem,
3298 gtk_widget_add_accelerator (menuitem,
3305 optionmenu = gtk_combo_box_text_new ();
3306 gtk_combo_box_set_active (GTK_COMBO_BOX (optionmenu), 3);
3307 gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
3308 gtk_widget_show (optionmenu);
3310 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
3311 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3312 gtk_widget_show (separator);
3314 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3315 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3316 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3317 gtk_widget_show (box2);
3319 button = gtk_button_new_with_label ("close");
3320 g_signal_connect_swapped (button, "clicked",
3321 G_CALLBACK (gtk_widget_destroy),
3323 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3324 gtk_widget_set_can_default (button, TRUE);
3325 gtk_widget_grab_default (button);
3326 gtk_widget_show (button);
3329 if (!gtk_widget_get_visible (window))
3330 gtk_widget_show (window);
3332 gtk_widget_destroy (window);
3335 /* GdkPixbuf RGBA C-Source image dump */
3337 static const guint8 apple[] =
3339 /* Pixbuf magic (0x47646b50) */
3341 /* length: header (24) + pixel_data (2304) */
3343 /* pixdata_type (0x1010002) */
3345 /* rowstride (96) */
3352 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3353 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3354 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3355 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3356 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3357 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3358 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\26\24"
3359 "\17\11\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3360 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`m"
3361 "[pn{a\344hv_\345_k[`\0\0\0\0\0\0\0\0\0\0\0\0D>/\305\0\0\0_\0\0\0\0\0"
3362 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3363 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`l[Blza\373s\202d\354w\206g\372p~c"
3364 "\374`l[y\0\0\0\0[S\77/\27\25\17\335\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0"
3365 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3366 "\0\0\0\0\0\0`l\\\20iw_\356y\211h\373x\207g\364~\216i\364u\204e\366gt"
3367 "_\374^jX\241A;-_\0\0\0~\0\0\0\0SM4)SM21B9&\22\320\270\204\1\320\270\204"
3368 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0eq"
3369 "]\212r\200c\366v\205f\371jx_\323_kY\232_kZH^jY\26]iW\211@G9\272:6%j\220"
3370 "\211]\320\221\211`\377\212\203Z\377~xP\377mkE\331]^;|/0\37\21\0\0\0\0"
3371 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0ly`\40p~b\360lz`\353^kY\246["
3372 "eT<\216\200Z\203\227\211_\354\234\217c\377\232\217b\362\232\220c\337"
3373 "\243\233k\377\252\241p\377\250\236p\377\241\225h\377\231\214_\377\210"
3374 "\202U\377srI\377[]:\355KO0U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0i"
3375 "v^\200`lY\211^jY\"\0\0\0\0\221\204\\\273\250\233r\377\302\267\224\377"
3376 "\311\300\237\377\272\256\204\377\271\256\177\377\271\257\200\377\267"
3377 "\260\177\377\260\251x\377\250\236l\377\242\225e\377\226\213]\377~zP\377"
3378 "ff@\377QT5\377LR2d\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0]iW(\0\0\0\0\0\0\0"
3379 "\0\213\203[v\253\240t\377\334\326\301\377\344\340\317\377\321\312\253"
3380 "\377\303\271\217\377\300\270\213\377\277\267\210\377\272\264\203\377"
3381 "\261\255z\377\250\242n\377\243\232h\377\232\220`\377\210\202V\377nnE"
3382 "\377SW6\377RX6\364Za<\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0b]@\20"
3383 "\234\222e\362\304\274\232\377\337\333\306\377\332\325\273\377\311\302"
3384 "\232\377\312\303\236\377\301\273\216\377\300\271\212\377\270\264\200"
3385 "\377\256\253v\377\246\243n\377\236\232h\377\230\220`\377\213\203V\377"
3386 "wvL\377X]:\377KR0\377NU5v\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\212"
3387 "\203Zl\242\234l\377\321\315\260\377\331\324\271\377\320\313\251\377\307"
3388 "\301\232\377\303\276\224\377\300\272\214\377\274\267\206\377\264\260"
3389 "|\377\253\251s\377\244\243n\377\232\230e\377\223\216^\377\207\200U\377"
3390 "ttJ\377[_<\377HO/\377GN0\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3391 "\210\204Y\240\245\237o\377\316\310\253\377\310\303\237\377\304\300\230"
3392 "\377\303\277\225\377\277\272\216\377\274\270\210\377\266\263\200\377"
3393 "\256\254v\377\247\246p\377\237\236j\377\227\226d\377\215\212[\377\203"
3394 "\177T\377qsH\377X]8\377FN.\377DK-\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3395 "\0\0\0\0\207\204X\257\244\240o\377\300\275\231\377\301\275\226\377\274"
3396 "\270\213\377\274\270\214\377\267\264\205\377\264\262\200\377\260\256"
3397 "z\377\251\251s\377\243\244n\377\231\232g\377\220\222`\377\210\211Y\377"
3398 "|}Q\377hlC\377PU3\377CK,\377DL/Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3399 "\0\0\205\204X\220\232\230h\377\261\260\204\377\266\264\212\377\261\260"
3400 "\201\377\263\260\200\377\260\257}\377\256\256x\377\253\254t\377\244\246"
3401 "o\377\233\236i\377\221\224b\377\211\214\\\377\202\204V\377txM\377]b>"
3402 "\377HP0\377@H+\373CJ-\25\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0xxO>"
3403 "\215\215_\377\237\237r\377\247\247x\377\247\247t\377\252\252w\377\252"
3404 "\252u\377\252\253t\377\243\246o\377\235\240j\377\223\230c\377\213\217"
3405 "]\377\201\206V\377x}P\377gkD\377RY5\377BI,\377AI,\262\0\0\0\0\0\0\0\0"
3406 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\202\205W\312\216\220`\377\230"
3407 "\232g\377\234\236i\377\236\241l\377\241\244n\377\240\244m\377\232\237"
3408 "i\377\223\230c\377\212\221]\377\200\210W\377v|P\377jnG\377Za>\377HP2"
3409 "\377=D)\377HQ1:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3410 "\0wzQ6\177\201U\371\206\211Z\377\216\222`\377\220\225a\377\220\225b\377"
3411 "\220\226a\377\213\221_\377\204\213Z\377{\203R\377ryN\377iqH\377^fA\377"
3412 "R[;\377BJ-\3778@'\317\0\0\0>\0\0\0\36\0\0\0\7\0\0\0\0\0\0\0\0\0\0\0\0"
3413 "\0\0\0\0\0\0\0\0\0\0\0\0ptJTw|Q\371z\177R\377}\202T\377|\203T\377z\200"
3414 "R\377v|O\377pwL\377jpF\377dlB\377`hB\377Yb@\377LT6\377<C*\377\11\12\6"
3415 "\376\0\0\0\347\0\0\0\262\0\0\0Y\0\0\0\32\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3416 "\0\0\0\0\0\0\0\0\0\0\\`=UgnE\370hnG\377gmE\377djB\377]d>\377[c<\377Y"
3417 "b<\377Zc>\377V_>\377OW8\377BK/\377\16\20\12\377\0\0\0\377\0\0\0\377\0"
3418 "\0\0\374\0\0\0\320\0\0\0I\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3419 "\0\1\0\0\0\40\22\24\15\260@D+\377W`;\377OV5\377.3\36\377.3\37\377IP0"
3420 "\377RZ7\377PZ8\3776=&\377\14\15\10\377\0\0\0\377\0\0\0\377\0\0\0\377"
3421 "\0\0\0\347\0\0\0\217\0\0\0""4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3422 "\0\0\0\0\0\0\0\20\0\0\0P\0\0\0\252\7\10\5\346\7\7\5\375\0\0\0\377\0\0"
3423 "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\374\0"
3424 "\0\0\336\0\0\0\254\0\0\0i\0\0\0""2\0\0\0\10\0\0\0\0\0\0\0\0\0\0\0\0\0"
3425 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\0\0\0\40\0\0\0D\0\0\0m\0\0\0"
3426 "\226\0\0\0\234\0\0\0\234\0\0\0\244\0\0\0\246\0\0\0\232\0\0\0\202\0\0"
3427 "\0i\0\0\0T\0\0\0,\0\0\0\15\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3428 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\6\0\0\0"
3429 "\16\0\0\0\22\0\0\0\24\0\0\0\23\0\0\0\17\0\0\0\14\0\0\0\13\0\0\0\10\0"
3430 "\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
3434 accel_button_new (GtkAccelGroup *accel_group,
3439 GdkModifierType modifiers;
3443 gtk_accelerator_parse (accel, &keyval, &modifiers);
3446 button = gtk_button_new ();
3447 gtk_widget_add_accelerator (button, "activate", accel_group,
3448 keyval, modifiers, GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3450 label = gtk_accel_label_new (text);
3451 gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), button);
3452 gtk_widget_show (label);
3454 gtk_container_add (GTK_CONTAINER (button), label);
3460 create_key_lookup (GtkWidget *widget)
3462 static GtkWidget *window = NULL;
3463 gpointer window_ptr;
3467 GtkAccelGroup *accel_group = gtk_accel_group_new ();
3469 GtkWidget *content_area;
3471 window = gtk_dialog_new_with_buttons ("Key Lookup", NULL, 0,
3472 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
3475 gtk_window_set_screen (GTK_WINDOW (window),
3476 gtk_widget_get_screen (widget));
3478 /* We have to expand it so the accel labels will draw their labels
3480 gtk_window_set_default_size (GTK_WINDOW (window), 300, -1);
3482 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3484 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
3486 button = gtk_button_new_with_mnemonic ("Button 1 (_a)");
3487 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3488 button = gtk_button_new_with_mnemonic ("Button 2 (_A)");
3489 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3490 button = gtk_button_new_with_mnemonic ("Button 3 (_\321\204)");
3491 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3492 button = gtk_button_new_with_mnemonic ("Button 4 (_\320\244)");
3493 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3494 button = gtk_button_new_with_mnemonic ("Button 6 (_b)");
3495 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3496 button = accel_button_new (accel_group, "Button 7", "<Alt><Shift>b");
3497 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3498 button = accel_button_new (accel_group, "Button 8", "<Alt>d");
3499 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3500 button = accel_button_new (accel_group, "Button 9", "<Alt>Cyrillic_ve");
3501 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3502 button = gtk_button_new_with_mnemonic ("Button 10 (_1)");
3503 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3504 button = gtk_button_new_with_mnemonic ("Button 11 (_!)");
3505 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3506 button = accel_button_new (accel_group, "Button 12", "<Super>a");
3507 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3508 button = accel_button_new (accel_group, "Button 13", "<Hyper>a");
3509 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3510 button = accel_button_new (accel_group, "Button 14", "<Meta>a");
3511 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3512 button = accel_button_new (accel_group, "Button 15", "<Shift><Mod4>b");
3513 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3515 window_ptr = &window;
3516 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
3517 g_signal_connect (window, "response", G_CALLBACK (gtk_widget_destroy), NULL);
3519 gtk_widget_show_all (window);
3522 gtk_widget_destroy (window);
3531 cmw_destroy_cb(GtkWidget *widget)
3533 /* This is needed to get out of gtk_main */
3540 cmw_color (GtkWidget *widget, GtkWidget *parent)
3543 GtkWidget *colorsel;
3544 GtkWidget *ok_button, *cancel_button;
3546 csd = gtk_color_selection_dialog_new ("This is a modal color selection dialog");
3548 gtk_window_set_screen (GTK_WINDOW (csd), gtk_widget_get_screen (parent));
3550 colorsel = gtk_color_selection_dialog_get_color_selection (GTK_COLOR_SELECTION_DIALOG (csd));
3551 gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (colorsel),
3555 gtk_window_set_modal (GTK_WINDOW(csd),TRUE);
3557 /* And mark it as a transient dialog */
3558 gtk_window_set_transient_for (GTK_WINDOW (csd), GTK_WINDOW (parent));
3560 g_signal_connect (csd, "destroy",
3561 G_CALLBACK (cmw_destroy_cb), NULL);
3564 "ok-button", &ok_button,
3565 "cancel-button", &cancel_button,
3568 g_signal_connect_swapped (ok_button,
3569 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
3570 g_signal_connect_swapped (cancel_button,
3571 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
3573 /* wait until destroy calls gtk_main_quit */
3574 gtk_widget_show (csd);
3579 cmw_file (GtkWidget *widget, GtkWidget *parent)
3583 fs = gtk_file_chooser_dialog_new ("This is a modal file selection dialog",
3584 GTK_WINDOW (parent), GTK_FILE_CHOOSER_ACTION_OPEN,
3585 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
3586 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
3588 gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent));
3589 gtk_window_set_modal (GTK_WINDOW (fs), TRUE);
3591 g_signal_connect (fs, "destroy",
3592 G_CALLBACK (cmw_destroy_cb), NULL);
3593 g_signal_connect_swapped (fs, "response",
3594 G_CALLBACK (gtk_widget_destroy), fs);
3596 /* wait until destroy calls gtk_main_quit */
3597 gtk_widget_show (fs);
3603 create_modal_window (GtkWidget *widget)
3605 GtkWidget *window = NULL;
3606 GtkWidget *box1,*box2;
3608 GtkWidget *btnColor,*btnFile,*btnClose;
3610 /* Create modal window (Here you can use any window descendent )*/
3611 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3612 gtk_window_set_screen (GTK_WINDOW (window),
3613 gtk_widget_get_screen (widget));
3615 gtk_window_set_title (GTK_WINDOW(window),"This window is modal");
3617 /* Set window as modal */
3618 gtk_window_set_modal (GTK_WINDOW(window),TRUE);
3620 /* Create widgets */
3621 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
3622 frame1 = gtk_frame_new ("Standard dialogs in modal form");
3623 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
3624 gtk_box_set_homogeneous (GTK_BOX (box2), TRUE);
3625 btnColor = gtk_button_new_with_label ("Color");
3626 btnFile = gtk_button_new_with_label ("File Selection");
3627 btnClose = gtk_button_new_with_label ("Close");
3630 gtk_container_set_border_width (GTK_CONTAINER (box1), 3);
3631 gtk_container_set_border_width (GTK_CONTAINER (box2), 3);
3634 gtk_container_add (GTK_CONTAINER (window), box1);
3635 gtk_box_pack_start (GTK_BOX (box1), frame1, TRUE, TRUE, 4);
3636 gtk_container_add (GTK_CONTAINER (frame1), box2);
3637 gtk_box_pack_start (GTK_BOX (box2), btnColor, FALSE, FALSE, 4);
3638 gtk_box_pack_start (GTK_BOX (box2), btnFile, FALSE, FALSE, 4);
3639 gtk_box_pack_start (GTK_BOX (box1), gtk_separator_new (GTK_ORIENTATION_HORIZONTAL), FALSE, FALSE, 4);
3640 gtk_box_pack_start (GTK_BOX (box1), btnClose, FALSE, FALSE, 4);
3642 /* connect signals */
3643 g_signal_connect_swapped (btnClose, "clicked",
3644 G_CALLBACK (gtk_widget_destroy), window);
3646 g_signal_connect (window, "destroy",
3647 G_CALLBACK (cmw_destroy_cb), NULL);
3649 g_signal_connect (btnColor, "clicked",
3650 G_CALLBACK (cmw_color), window);
3651 g_signal_connect (btnFile, "clicked",
3652 G_CALLBACK (cmw_file), window);
3655 gtk_widget_show_all (window);
3657 /* wait until dialog get destroyed */
3666 make_message_dialog (GdkScreen *screen,
3668 GtkMessageType type,
3669 GtkButtonsType buttons,
3670 guint default_response)
3674 gtk_widget_destroy (*dialog);
3679 *dialog = gtk_message_dialog_new (NULL, 0, type, buttons,
3680 "This is a message dialog; it can wrap long lines. This is a long line. La la la. Look this line is wrapped. Blah blah blah blah blah blah. (Note: testgtk has a nonstandard gtkrc that changes some of the message dialog icons.)");
3682 gtk_window_set_screen (GTK_WINDOW (*dialog), screen);
3684 g_signal_connect_swapped (*dialog,
3686 G_CALLBACK (gtk_widget_destroy),
3689 g_signal_connect (*dialog,
3691 G_CALLBACK (gtk_widget_destroyed),
3694 gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
3696 gtk_widget_show (*dialog);
3700 create_message_dialog (GtkWidget *widget)
3702 static GtkWidget *info = NULL;
3703 static GtkWidget *warning = NULL;
3704 static GtkWidget *error = NULL;
3705 static GtkWidget *question = NULL;
3706 GdkScreen *screen = gtk_widget_get_screen (widget);
3708 make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK);
3709 make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE);
3710 make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK);
3711 make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_NO);
3718 static GtkWidget *sw_parent = NULL;
3719 static GtkWidget *sw_float_parent;
3720 static gulong sw_destroyed_handler = 0;
3723 scrolled_windows_delete_cb (GtkWidget *widget, GdkEventAny *event, GtkWidget *scrollwin)
3725 gtk_widget_reparent (scrollwin, sw_parent);
3727 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
3728 sw_float_parent = NULL;
3730 sw_destroyed_handler = 0;
3736 scrolled_windows_destroy_cb (GtkWidget *widget, GtkWidget *scrollwin)
3738 gtk_widget_destroy (sw_float_parent);
3740 sw_float_parent = NULL;
3742 sw_destroyed_handler = 0;
3746 scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
3750 gtk_widget_reparent (scrollwin, sw_parent);
3751 gtk_widget_destroy (sw_float_parent);
3753 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
3754 sw_float_parent = NULL;
3756 sw_destroyed_handler = 0;
3760 sw_parent = gtk_widget_get_parent (scrollwin);
3761 sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3762 gtk_window_set_screen (GTK_WINDOW (sw_float_parent),
3763 gtk_widget_get_screen (widget));
3765 gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200);
3767 gtk_widget_reparent (scrollwin, sw_float_parent);
3768 gtk_widget_show (sw_float_parent);
3770 sw_destroyed_handler =
3771 g_signal_connect (sw_parent, "destroy",
3772 G_CALLBACK (scrolled_windows_destroy_cb), scrollwin);
3773 g_signal_connect (sw_float_parent, "delete_event",
3774 G_CALLBACK (scrolled_windows_delete_cb), scrollwin);
3779 create_scrolled_windows (GtkWidget *widget)
3781 static GtkWidget *window;
3782 GtkWidget *content_area, *action_area;
3783 GtkWidget *scrolled_window;
3791 window = gtk_dialog_new ();
3793 gtk_window_set_screen (GTK_WINDOW (window),
3794 gtk_widget_get_screen (widget));
3796 g_signal_connect (window, "destroy",
3797 G_CALLBACK (gtk_widget_destroyed),
3800 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
3801 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
3803 gtk_window_set_title (GTK_WINDOW (window), "dialog");
3804 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3806 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
3807 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
3808 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
3809 GTK_POLICY_AUTOMATIC,
3810 GTK_POLICY_AUTOMATIC);
3811 gtk_box_pack_start (GTK_BOX (content_area), scrolled_window, TRUE, TRUE, 0);
3812 gtk_widget_show (scrolled_window);
3814 table = gtk_table_new (20, 20, FALSE);
3815 gtk_table_set_row_spacings (GTK_TABLE (table), 10);
3816 gtk_table_set_col_spacings (GTK_TABLE (table), 10);
3817 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
3818 gtk_container_set_focus_hadjustment (GTK_CONTAINER (table),
3819 gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
3820 gtk_container_set_focus_vadjustment (GTK_CONTAINER (table),
3821 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
3822 gtk_widget_show (table);
3824 for (i = 0; i < 20; i++)
3825 for (j = 0; j < 20; j++)
3827 sprintf (buffer, "button (%d,%d)\n", i, j);
3828 button = gtk_toggle_button_new_with_label (buffer);
3829 gtk_table_attach_defaults (GTK_TABLE (table), button,
3831 gtk_widget_show (button);
3835 button = gtk_button_new_with_label ("Close");
3836 g_signal_connect_swapped (button, "clicked",
3837 G_CALLBACK (gtk_widget_destroy),
3839 gtk_widget_set_can_default (button, TRUE);
3840 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
3841 gtk_widget_grab_default (button);
3842 gtk_widget_show (button);
3844 button = gtk_button_new_with_label ("Reparent Out");
3845 g_signal_connect (button, "clicked",
3846 G_CALLBACK (scrolled_windows_remove),
3848 gtk_widget_set_can_default (button, TRUE);
3849 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
3850 gtk_widget_grab_default (button);
3851 gtk_widget_show (button);
3853 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
3856 if (!gtk_widget_get_visible (window))
3857 gtk_widget_show (window);
3859 gtk_widget_destroy (window);
3867 entry_toggle_frame (GtkWidget *checkbutton,
3870 gtk_entry_set_has_frame (GTK_ENTRY(entry),
3871 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
3875 entry_toggle_sensitive (GtkWidget *checkbutton,
3878 gtk_widget_set_sensitive (entry,
3879 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(checkbutton)));
3883 entry_progress_timeout (gpointer data)
3885 if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (data), "progress-pulse")))
3887 gtk_entry_progress_pulse (GTK_ENTRY (data));
3893 fraction = gtk_entry_get_progress_fraction (GTK_ENTRY (data));
3896 if (fraction > 1.0001)
3899 gtk_entry_set_progress_fraction (GTK_ENTRY (data), fraction);
3906 entry_remove_timeout (gpointer data)
3908 g_source_remove (GPOINTER_TO_UINT (data));
3912 entry_toggle_progress (GtkWidget *checkbutton,
3915 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)))
3917 guint timeout = gdk_threads_add_timeout (100,
3918 entry_progress_timeout,
3920 g_object_set_data_full (G_OBJECT (entry), "timeout-id",
3921 GUINT_TO_POINTER (timeout),
3922 entry_remove_timeout);
3926 g_object_set_data (G_OBJECT (entry), "timeout-id",
3927 GUINT_TO_POINTER (0));
3929 gtk_entry_set_progress_fraction (GTK_ENTRY (entry), 0.0);
3934 entry_toggle_pulse (GtkWidget *checkbutton,
3937 g_object_set_data (G_OBJECT (entry), "progress-pulse",
3938 GUINT_TO_POINTER ((guint) gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton))));
3942 props_clicked (GtkWidget *button,
3945 GtkWidget *window = create_prop_editor (object, 0);
3947 gtk_window_set_title (GTK_WINDOW (window), "Object Properties");
3951 create_entry (GtkWidget *widget)
3953 static GtkWidget *window = NULL;
3957 GtkWidget *has_frame_check;
3958 GtkWidget *sensitive_check;
3959 GtkWidget *progress_check;
3961 GtkComboBoxText *cb;
3962 GtkWidget *cb_entry;
3964 GtkWidget *separator;
3968 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3969 gtk_window_set_screen (GTK_WINDOW (window),
3970 gtk_widget_get_screen (widget));
3972 g_signal_connect (window, "destroy",
3973 G_CALLBACK (gtk_widget_destroyed),
3976 gtk_window_set_title (GTK_WINDOW (window), "entry");
3977 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3980 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
3981 gtk_container_add (GTK_CONTAINER (window), box1);
3984 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3985 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3986 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3988 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
3989 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
3991 entry = gtk_entry_new ();
3992 gtk_entry_set_text (GTK_ENTRY (entry), "hello world \330\247\331\204\330\263\331\204\330\247\331\205 \330\271\331\204\331\212\331\203\331\205");
3993 gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5);
3994 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
3996 button = gtk_button_new_with_mnemonic ("_Props");
3997 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
3998 g_signal_connect (button, "clicked",
3999 G_CALLBACK (props_clicked),
4002 cb = GTK_COMBO_BOX_TEXT (gtk_combo_box_text_new_with_entry ());
4004 gtk_combo_box_text_append_text (cb, "item0");
4005 gtk_combo_box_text_append_text (cb, "item0");
4006 gtk_combo_box_text_append_text (cb, "item1 item1");
4007 gtk_combo_box_text_append_text (cb, "item2 item2 item2");
4008 gtk_combo_box_text_append_text (cb, "item3 item3 item3 item3");
4009 gtk_combo_box_text_append_text (cb, "item4 item4 item4 item4 item4");
4010 gtk_combo_box_text_append_text (cb, "item5 item5 item5 item5 item5 item5");
4011 gtk_combo_box_text_append_text (cb, "item6 item6 item6 item6 item6");
4012 gtk_combo_box_text_append_text (cb, "item7 item7 item7 item7");
4013 gtk_combo_box_text_append_text (cb, "item8 item8 item8");
4014 gtk_combo_box_text_append_text (cb, "item9 item9");
4016 cb_entry = gtk_bin_get_child (GTK_BIN (cb));
4017 gtk_entry_set_text (GTK_ENTRY (cb_entry), "hello world \n\n\n foo");
4018 gtk_editable_select_region (GTK_EDITABLE (cb_entry), 0, -1);
4019 gtk_box_pack_start (GTK_BOX (box2), GTK_WIDGET (cb), TRUE, TRUE, 0);
4021 sensitive_check = gtk_check_button_new_with_label("Sensitive");
4022 gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0);
4023 g_signal_connect (sensitive_check, "toggled",
4024 G_CALLBACK (entry_toggle_sensitive), entry);
4025 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sensitive_check), TRUE);
4027 has_frame_check = gtk_check_button_new_with_label("Has Frame");
4028 gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0);
4029 g_signal_connect (has_frame_check, "toggled",
4030 G_CALLBACK (entry_toggle_frame), entry);
4031 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
4033 progress_check = gtk_check_button_new_with_label("Show Progress");
4034 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4035 g_signal_connect (progress_check, "toggled",
4036 G_CALLBACK (entry_toggle_progress), entry);
4038 progress_check = gtk_check_button_new_with_label("Pulse Progress");
4039 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4040 g_signal_connect (progress_check, "toggled",
4041 G_CALLBACK (entry_toggle_pulse), entry);
4043 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
4044 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4046 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
4047 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4048 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4050 button = gtk_button_new_with_label ("close");
4051 g_signal_connect_swapped (button, "clicked",
4052 G_CALLBACK (gtk_widget_destroy),
4054 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4055 gtk_widget_set_can_default (button, TRUE);
4056 gtk_widget_grab_default (button);
4059 if (!gtk_widget_get_visible (window))
4060 gtk_widget_show_all (window);
4062 gtk_widget_destroy (window);
4066 create_expander (GtkWidget *widget)
4069 GtkWidget *expander;
4071 static GtkWidget *window = NULL;
4075 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4076 gtk_window_set_screen (GTK_WINDOW (window),
4077 gtk_widget_get_screen (widget));
4079 g_signal_connect (window, "destroy",
4080 G_CALLBACK (gtk_widget_destroyed),
4083 gtk_window_set_title (GTK_WINDOW (window), "expander");
4084 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4086 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4087 gtk_container_add (GTK_CONTAINER (window), box1);
4089 expander = gtk_expander_new ("The Hidden");
4091 gtk_box_pack_start (GTK_BOX (box1), expander, TRUE, TRUE, 0);
4093 hidden = gtk_label_new ("Revealed!");
4095 gtk_container_add (GTK_CONTAINER (expander), hidden);
4098 if (!gtk_widget_get_visible (window))
4099 gtk_widget_show_all (window);
4101 gtk_widget_destroy (window);
4109 event_box_label_pressed (GtkWidget *widget,
4110 GdkEventButton *event,
4113 g_print ("clicked on event box\n");
4117 event_box_button_clicked (GtkWidget *widget,
4121 g_print ("pushed button\n");
4125 event_box_toggle_visible_window (GtkWidget *checkbutton,
4126 GtkEventBox *event_box)
4128 gtk_event_box_set_visible_window (event_box,
4129 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
4133 event_box_toggle_above_child (GtkWidget *checkbutton,
4134 GtkEventBox *event_box)
4136 gtk_event_box_set_above_child (event_box,
4137 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
4141 create_event_box (GtkWidget *widget)
4143 static GtkWidget *window = NULL;
4149 GtkWidget *separator;
4150 GtkWidget *event_box;
4152 GtkWidget *visible_window_check;
4153 GtkWidget *above_child_check;
4163 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4164 gtk_window_set_screen (GTK_WINDOW (window),
4165 gtk_widget_get_screen (widget));
4167 g_signal_connect (window, "destroy",
4168 G_CALLBACK (gtk_widget_destroyed),
4171 gtk_window_set_title (GTK_WINDOW (window), "event box");
4172 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4174 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4175 gtk_container_add (GTK_CONTAINER (window), box1);
4176 gtk_widget_override_background_color (window, 0, &color);
4178 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4179 gtk_box_pack_start (GTK_BOX (box1), hbox, TRUE, FALSE, 0);
4181 event_box = gtk_event_box_new ();
4182 gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, FALSE, 0);
4184 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4185 gtk_container_add (GTK_CONTAINER (event_box), vbox);
4186 g_signal_connect (event_box, "button_press_event",
4187 G_CALLBACK (event_box_label_pressed),
4190 label = gtk_label_new ("Click on this label");
4191 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
4193 button = gtk_button_new_with_label ("button in eventbox");
4194 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, FALSE, 0);
4195 g_signal_connect (button, "clicked",
4196 G_CALLBACK (event_box_button_clicked),
4200 visible_window_check = gtk_check_button_new_with_label("Visible Window");
4201 gtk_box_pack_start (GTK_BOX (box1), visible_window_check, FALSE, TRUE, 0);
4202 g_signal_connect (visible_window_check, "toggled",
4203 G_CALLBACK (event_box_toggle_visible_window), event_box);
4204 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (visible_window_check), FALSE);
4206 above_child_check = gtk_check_button_new_with_label("Above Child");
4207 gtk_box_pack_start (GTK_BOX (box1), above_child_check, FALSE, TRUE, 0);
4208 g_signal_connect (above_child_check, "toggled",
4209 G_CALLBACK (event_box_toggle_above_child), event_box);
4210 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (above_child_check), FALSE);
4212 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
4213 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4215 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
4216 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4217 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4219 button = gtk_button_new_with_label ("close");
4220 g_signal_connect_swapped (button, "clicked",
4221 G_CALLBACK (gtk_widget_destroy),
4223 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4224 gtk_widget_set_can_default (button, TRUE);
4225 gtk_widget_grab_default (button);
4228 if (!gtk_widget_get_visible (window))
4229 gtk_widget_show_all (window);
4231 gtk_widget_destroy (window);
4239 #define SIZE_GROUP_INITIAL_SIZE 50
4242 size_group_hsize_changed (GtkSpinButton *spin_button,
4245 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4246 gtk_spin_button_get_value_as_int (spin_button),
4251 size_group_vsize_changed (GtkSpinButton *spin_button,
4254 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4256 gtk_spin_button_get_value_as_int (spin_button));
4260 create_size_group_window (GdkScreen *screen,
4261 GtkSizeGroup *master_size_group)
4263 GtkWidget *content_area;
4266 GtkWidget *main_button;
4268 GtkWidget *spin_button;
4270 GtkSizeGroup *hgroup1;
4271 GtkSizeGroup *hgroup2;
4272 GtkSizeGroup *vgroup1;
4273 GtkSizeGroup *vgroup2;
4275 window = gtk_dialog_new_with_buttons ("GtkSizeGroup",
4281 gtk_window_set_screen (GTK_WINDOW (window), screen);
4283 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
4285 g_signal_connect (window, "response",
4286 G_CALLBACK (gtk_widget_destroy),
4289 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
4291 table = gtk_table_new (2, 2, FALSE);
4292 gtk_box_pack_start (GTK_BOX (content_area), table, TRUE, TRUE, 0);
4294 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
4295 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
4296 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
4297 gtk_widget_set_size_request (table, 250, 250);
4299 hgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4300 hgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4301 vgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4302 vgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4304 main_button = gtk_button_new_with_label ("X");
4306 gtk_table_attach (GTK_TABLE (table), main_button,
4308 GTK_EXPAND, GTK_EXPAND,
4310 gtk_size_group_add_widget (master_size_group, main_button);
4311 gtk_size_group_add_widget (hgroup1, main_button);
4312 gtk_size_group_add_widget (vgroup1, main_button);
4313 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (main_button)),
4314 SIZE_GROUP_INITIAL_SIZE,
4315 SIZE_GROUP_INITIAL_SIZE);
4317 button = gtk_button_new ();
4318 gtk_table_attach (GTK_TABLE (table), button,
4320 GTK_EXPAND, GTK_EXPAND,
4322 gtk_size_group_add_widget (vgroup1, button);
4323 gtk_size_group_add_widget (vgroup2, button);
4325 button = gtk_button_new ();
4326 gtk_table_attach (GTK_TABLE (table), button,
4328 GTK_EXPAND, GTK_EXPAND,
4330 gtk_size_group_add_widget (hgroup1, button);
4331 gtk_size_group_add_widget (hgroup2, button);
4333 button = gtk_button_new ();
4334 gtk_table_attach (GTK_TABLE (table), button,
4336 GTK_EXPAND, GTK_EXPAND,
4338 gtk_size_group_add_widget (hgroup2, button);
4339 gtk_size_group_add_widget (vgroup2, button);
4341 g_object_unref (hgroup1);
4342 g_object_unref (hgroup2);
4343 g_object_unref (vgroup1);
4344 g_object_unref (vgroup2);
4346 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
4347 gtk_box_pack_start (GTK_BOX (content_area), hbox, FALSE, FALSE, 0);
4349 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4350 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4351 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4352 g_signal_connect (spin_button, "value_changed",
4353 G_CALLBACK (size_group_hsize_changed), main_button);
4355 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4356 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4357 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4358 g_signal_connect (spin_button, "value_changed",
4359 G_CALLBACK (size_group_vsize_changed), main_button);
4365 create_size_groups (GtkWidget *widget)
4367 static GtkWidget *window1 = NULL;
4368 static GtkWidget *window2 = NULL;
4369 static GtkSizeGroup *master_size_group;
4371 if (!master_size_group)
4372 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
4376 window1 = create_size_group_window (gtk_widget_get_screen (widget),
4379 g_signal_connect (window1, "destroy",
4380 G_CALLBACK (gtk_widget_destroyed),
4386 window2 = create_size_group_window (gtk_widget_get_screen (widget),
4389 g_signal_connect (window2, "destroy",
4390 G_CALLBACK (gtk_widget_destroyed),
4394 if (gtk_widget_get_visible (window1) && gtk_widget_get_visible (window2))
4396 gtk_widget_destroy (window1);
4397 gtk_widget_destroy (window2);
4401 if (!gtk_widget_get_visible (window1))
4402 gtk_widget_show_all (window1);
4403 if (!gtk_widget_get_visible (window2))
4404 gtk_widget_show_all (window2);
4412 static GtkWidget *spinner1;
4415 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
4417 gtk_spin_button_set_snap_to_ticks (spin,
4418 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
4422 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
4424 gtk_spin_button_set_numeric (spin,
4425 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
4429 change_digits (GtkWidget *widget, GtkSpinButton *spin)
4431 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
4432 gtk_spin_button_get_value_as_int (spin));
4436 get_value (GtkWidget *widget, gpointer data)
4440 GtkSpinButton *spin;
4442 spin = GTK_SPIN_BUTTON (spinner1);
4443 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
4444 if (GPOINTER_TO_INT (data) == 1)
4445 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
4447 sprintf (buf, "%0.*f",
4448 gtk_spin_button_get_digits (spin),
4449 gtk_spin_button_get_value (spin));
4451 gtk_label_set_text (label, buf);
4455 get_spin_value (GtkWidget *widget, gpointer data)
4459 GtkSpinButton *spin;
4461 spin = GTK_SPIN_BUTTON (widget);
4462 label = GTK_LABEL (data);
4464 buffer = g_strdup_printf ("%0.*f",
4465 gtk_spin_button_get_digits (spin),
4466 gtk_spin_button_get_value (spin));
4467 gtk_label_set_text (label, buffer);
4473 spin_button_time_output_func (GtkSpinButton *spin_button)
4475 GtkAdjustment *adjustment;
4476 static gchar buf[6];
4480 adjustment = gtk_spin_button_get_adjustment (spin_button);
4481 hours = gtk_adjustment_get_value (adjustment) / 60.0;
4482 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
4483 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
4484 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4485 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4490 spin_button_month_input_func (GtkSpinButton *spin_button,
4494 static gchar *month[12] = { "January", "February", "March", "April",
4495 "May", "June", "July", "August",
4496 "September", "October", "November", "December" };
4498 gboolean found = FALSE;
4500 for (i = 1; i <= 12; i++)
4502 tmp1 = g_ascii_strup (month[i - 1], -1);
4503 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
4504 if (strstr (tmp1, tmp2) == tmp1)
4514 return GTK_INPUT_ERROR;
4516 *new_val = (gdouble) i;
4521 spin_button_month_output_func (GtkSpinButton *spin_button)
4523 GtkAdjustment *adjustment;
4526 static gchar *month[12] = { "January", "February", "March", "April",
4527 "May", "June", "July", "August", "September",
4528 "October", "November", "December" };
4530 adjustment = gtk_spin_button_get_adjustment (spin_button);
4531 value = gtk_adjustment_get_value (adjustment);
4532 for (i = 1; i <= 12; i++)
4533 if (fabs (value - (double)i) < 1e-5)
4535 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
4536 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
4542 spin_button_hex_input_func (GtkSpinButton *spin_button,
4549 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
4550 res = strtol(buf, &err, 16);
4553 return GTK_INPUT_ERROR;
4559 spin_button_hex_output_func (GtkSpinButton *spin_button)
4561 GtkAdjustment *adjustment;
4562 static gchar buf[7];
4565 adjustment = gtk_spin_button_get_adjustment (spin_button);
4566 val = (gint) gtk_adjustment_get_value (adjustment);
4567 if (fabs (val) < 1e-5)
4568 sprintf (buf, "0x00");
4570 sprintf (buf, "0x%.2X", val);
4571 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4572 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4577 create_spins (GtkWidget *widget)
4579 static GtkWidget *window = NULL;
4582 GtkWidget *main_vbox;
4585 GtkWidget *spinner2;
4589 GtkWidget *val_label;
4590 GtkAdjustment *adjustment;
4594 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4595 gtk_window_set_screen (GTK_WINDOW (window),
4596 gtk_widget_get_screen (widget));
4598 g_signal_connect (window, "destroy",
4599 G_CALLBACK (gtk_widget_destroyed),
4602 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
4604 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
4605 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
4606 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4608 frame = gtk_frame_new ("Not accelerated");
4609 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4611 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4612 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4613 gtk_container_add (GTK_CONTAINER (frame), vbox);
4615 /* Time, month, hex spinners */
4617 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4618 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
4620 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4621 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4623 label = gtk_label_new ("Time :");
4624 gtk_widget_set_halign (label, GTK_ALIGN_START);
4625 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4626 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4628 adjustment = gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
4629 spinner = gtk_spin_button_new (adjustment, 0, 0);
4630 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
4631 g_signal_connect (spinner,
4633 G_CALLBACK (spin_button_time_output_func),
4635 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4636 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 5);
4637 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4639 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4640 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4642 label = gtk_label_new ("Month :");
4643 gtk_widget_set_halign (label, GTK_ALIGN_START);
4644 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4645 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4647 adjustment = gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
4649 spinner = gtk_spin_button_new (adjustment, 0, 0);
4650 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
4651 GTK_UPDATE_IF_VALID);
4652 g_signal_connect (spinner,
4654 G_CALLBACK (spin_button_month_input_func),
4656 g_signal_connect (spinner,
4658 G_CALLBACK (spin_button_month_output_func),
4660 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4661 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 9);
4662 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4664 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4665 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4667 label = gtk_label_new ("Hex :");
4668 gtk_widget_set_halign (label, GTK_ALIGN_START);
4669 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4670 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4672 adjustment = gtk_adjustment_new (0, 0, 255, 1, 16, 0);
4673 spinner = gtk_spin_button_new (adjustment, 0, 0);
4674 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
4675 g_signal_connect (spinner,
4677 G_CALLBACK (spin_button_hex_input_func),
4679 g_signal_connect (spinner,
4681 G_CALLBACK (spin_button_hex_output_func),
4683 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4684 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 4);
4685 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4687 frame = gtk_frame_new ("Accelerated");
4688 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4690 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4691 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4692 gtk_container_add (GTK_CONTAINER (frame), vbox);
4694 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4695 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4697 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4698 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4700 label = gtk_label_new ("Value :");
4701 gtk_widget_set_halign (label, GTK_ALIGN_START);
4702 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4703 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4705 adjustment = gtk_adjustment_new (0.0, -10000.0, 10000.0,
4707 spinner1 = gtk_spin_button_new (adjustment, 1.0, 2);
4708 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
4709 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
4711 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4712 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4714 label = gtk_label_new ("Digits :");
4715 gtk_widget_set_halign (label, GTK_ALIGN_START);
4716 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4717 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4719 adjustment = gtk_adjustment_new (2, 1, 15, 1, 1, 0);
4720 spinner2 = gtk_spin_button_new (adjustment, 0.0, 0);
4721 g_signal_connect (adjustment, "value_changed",
4722 G_CALLBACK (change_digits),
4724 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
4726 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4727 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
4729 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
4730 g_signal_connect (button, "clicked",
4731 G_CALLBACK (toggle_snap),
4733 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4734 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4736 button = gtk_check_button_new_with_label ("Numeric only input mode");
4737 g_signal_connect (button, "clicked",
4738 G_CALLBACK (toggle_numeric),
4740 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4741 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4743 val_label = gtk_label_new ("");
4745 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4746 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4748 button = gtk_button_new_with_label ("Value as Int");
4749 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4750 g_signal_connect (button, "clicked",
4751 G_CALLBACK (get_value),
4752 GINT_TO_POINTER (1));
4753 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4755 button = gtk_button_new_with_label ("Value as Float");
4756 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4757 g_signal_connect (button, "clicked",
4758 G_CALLBACK (get_value),
4759 GINT_TO_POINTER (2));
4760 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4762 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
4763 gtk_label_set_text (GTK_LABEL (val_label), "0");
4765 frame = gtk_frame_new ("Using Convenience Constructor");
4766 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4768 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4769 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4770 gtk_container_add (GTK_CONTAINER (frame), hbox);
4772 val_label = gtk_label_new ("0.0");
4774 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
4775 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
4776 g_signal_connect (spinner, "value_changed",
4777 G_CALLBACK (get_spin_value), val_label);
4778 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
4779 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
4781 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4782 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
4784 button = gtk_button_new_with_label ("Close");
4785 g_signal_connect_swapped (button, "clicked",
4786 G_CALLBACK (gtk_widget_destroy),
4788 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4791 if (!gtk_widget_get_visible (window))
4792 gtk_widget_show_all (window);
4794 gtk_widget_destroy (window);
4803 cursor_draw (GtkWidget *widget,
4808 GtkStyleContext *context;
4811 width = gtk_widget_get_allocated_width (widget);
4812 height = gtk_widget_get_allocated_height (widget);
4814 cairo_set_source_rgb (cr, 1, 1, 1);
4815 cairo_rectangle (cr, 0, 0, width, height / 2);
4818 cairo_set_source_rgb (cr, 0, 0, 0);
4819 cairo_rectangle (cr, 0, height / 2, width, height / 2);
4822 context = gtk_widget_get_style_context (widget);
4823 gtk_style_context_get_background_color (context, GTK_STATE_FLAG_NORMAL, &bg);
4824 gdk_cairo_set_source_rgba (cr, &bg);
4825 cairo_rectangle (cr, width / 3, height / 3, width / 3, height / 3);
4832 set_cursor (GtkWidget *spinner,
4841 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
4844 label = g_object_get_data (G_OBJECT (spinner), "user_data");
4846 class = g_type_class_ref (GDK_TYPE_CURSOR_TYPE);
4847 vals = class->values;
4849 while (vals && vals->value != c)
4852 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
4854 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
4856 g_type_class_unref (class);
4858 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
4859 gdk_window_set_cursor (gtk_widget_get_window (widget),
4861 g_object_unref (cursor);
4865 cursor_event (GtkWidget *widget,
4867 GtkSpinButton *spinner)
4869 if ((event->type == GDK_BUTTON_PRESS) &&
4870 ((event->button.button == 1) ||
4871 (event->button.button == 3)))
4873 gtk_spin_button_spin (spinner, event->button.button == 1 ?
4874 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
4881 #ifdef GDK_WINDOWING_X11
4882 #include "x11/gdkx.h"
4885 change_cursor_theme (GtkWidget *widget,
4892 children = gtk_container_get_children (GTK_CONTAINER (data));
4894 theme = gtk_entry_get_text (GTK_ENTRY (children->next->data));
4895 size = (gint) gtk_spin_button_get_value (GTK_SPIN_BUTTON (children->next->next->data));
4897 g_list_free (children);
4899 gdk_x11_display_set_cursor_theme (gtk_widget_get_display (widget),
4906 create_cursors (GtkWidget *widget)
4908 static GtkWidget *window = NULL;
4911 GtkWidget *main_vbox;
4918 GtkAdjustment *adjustment;
4924 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4925 gtk_window_set_screen (GTK_WINDOW (window),
4926 gtk_widget_get_screen (widget));
4928 g_signal_connect (window, "destroy",
4929 G_CALLBACK (gtk_widget_destroyed),
4932 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
4934 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
4935 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
4936 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4939 g_object_new (GTK_TYPE_BOX,
4940 "orientation", GTK_ORIENTATION_VERTICAL,
4941 "GtkBox::homogeneous", FALSE,
4942 "GtkBox::spacing", 5,
4943 "GtkContainer::border_width", 10,
4944 "GtkWidget::parent", main_vbox,
4945 "GtkWidget::visible", TRUE,
4948 #ifdef GDK_WINDOWING_X11
4949 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4950 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4951 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
4953 label = gtk_label_new ("Cursor Theme : ");
4954 gtk_widget_set_halign (label, GTK_ALIGN_START);
4955 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4956 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
4958 entry = gtk_entry_new ();
4959 gtk_entry_set_text (GTK_ENTRY (entry), "default");
4960 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, TRUE, 0);
4962 size = gtk_spin_button_new_with_range (1.0, 64.0, 1.0);
4963 gtk_spin_button_set_value (GTK_SPIN_BUTTON (size), 24.0);
4964 gtk_box_pack_start (GTK_BOX (hbox), size, TRUE, TRUE, 0);
4966 g_signal_connect (entry, "changed",
4967 G_CALLBACK (change_cursor_theme), hbox);
4968 g_signal_connect (size, "changed",
4969 G_CALLBACK (change_cursor_theme), hbox);
4972 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4973 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4974 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
4976 label = gtk_label_new ("Cursor Value : ");
4977 gtk_widget_set_halign (label, GTK_ALIGN_START);
4978 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4979 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
4981 adjustment = gtk_adjustment_new (0,
4985 spinner = gtk_spin_button_new (adjustment, 0, 0);
4986 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
4989 g_object_new (gtk_frame_get_type (),
4990 "GtkFrame::label_xalign", 0.5,
4991 "GtkFrame::label", "Cursor Area",
4992 "GtkContainer::border_width", 10,
4993 "GtkWidget::parent", vbox,
4994 "GtkWidget::visible", TRUE,
4997 darea = gtk_drawing_area_new ();
4998 gtk_widget_set_size_request (darea, 80, 80);
4999 gtk_container_add (GTK_CONTAINER (frame), darea);
5000 g_signal_connect (darea,
5002 G_CALLBACK (cursor_draw),
5004 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
5005 g_signal_connect (darea,
5006 "button_press_event",
5007 G_CALLBACK (cursor_event),
5009 gtk_widget_show (darea);
5011 g_signal_connect (spinner, "changed",
5012 G_CALLBACK (set_cursor),
5015 label = g_object_new (GTK_TYPE_LABEL,
5020 gtk_container_child_set (GTK_CONTAINER (vbox), label,
5023 g_object_set_data (G_OBJECT (spinner), "user_data", label);
5025 any = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
5026 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
5028 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
5029 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
5030 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5032 button = gtk_button_new_with_label ("Close");
5033 g_signal_connect_swapped (button, "clicked",
5034 G_CALLBACK (gtk_widget_destroy),
5036 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5038 gtk_widget_show_all (window);
5040 set_cursor (spinner, darea);
5043 gtk_widget_destroy (window);
5051 color_selection_ok (GtkWidget *w,
5052 GtkColorSelectionDialog *cs)
5054 GtkWidget *colorsel;
5057 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5059 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5060 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5064 color_selection_changed (GtkWidget *w,
5065 GtkColorSelectionDialog *cs)
5067 GtkWidget *colorsel;
5070 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5071 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5072 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5077 opacity_toggled_cb (GtkWidget *w,
5078 GtkColorSelectionDialog *cs)
5080 GtkColorSelection *colorsel;
5082 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5083 gtk_color_selection_set_has_opacity_control (colorsel,
5084 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5088 palette_toggled_cb (GtkWidget *w,
5089 GtkColorSelectionDialog *cs)
5091 GtkColorSelection *colorsel;
5093 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5094 gtk_color_selection_set_has_palette (colorsel,
5095 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5100 create_color_selection (GtkWidget *widget)
5102 static GtkWidget *window = NULL;
5111 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5112 gtk_window_set_screen (GTK_WINDOW (window),
5113 gtk_widget_get_screen (widget));
5115 g_signal_connect (window, "destroy",
5116 G_CALLBACK (gtk_widget_destroyed),
5119 gtk_window_set_title (GTK_WINDOW (window), "GtkColorButton");
5120 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5122 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
5123 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5124 gtk_container_add (GTK_CONTAINER (window), hbox);
5126 label = gtk_label_new ("Pick a color");
5127 gtk_container_add (GTK_CONTAINER (hbox), label);
5129 picker = gtk_color_button_new ();
5130 gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (picker), TRUE);
5131 gtk_container_add (GTK_CONTAINER (hbox), picker);
5133 button = gtk_button_new_with_mnemonic ("_Props");
5134 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
5135 g_signal_connect (button, "clicked",
5136 G_CALLBACK (props_clicked),
5140 if (!gtk_widget_get_visible (window))
5141 gtk_widget_show_all (window);
5143 gtk_widget_destroy (window);
5147 flipping_toggled_cb (GtkWidget *widget, gpointer data)
5149 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
5150 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
5152 gtk_widget_set_default_direction (new_direction);
5156 orientable_toggle_orientation (GtkOrientable *orientable)
5158 GtkOrientation orientation;
5160 orientation = gtk_orientable_get_orientation (orientable);
5161 gtk_orientable_set_orientation (orientable,
5162 orientation == GTK_ORIENTATION_HORIZONTAL ?
5163 GTK_ORIENTATION_VERTICAL :
5164 GTK_ORIENTATION_HORIZONTAL);
5166 if (GTK_IS_CONTAINER (orientable))
5171 children = gtk_container_get_children (GTK_CONTAINER (orientable));
5173 for (child = children; child; child = child->next)
5175 if (GTK_IS_ORIENTABLE (child->data))
5176 orientable_toggle_orientation (child->data);
5179 g_list_free (children);
5184 flipping_orientation_toggled_cb (GtkWidget *widget, gpointer data)
5186 GtkWidget *content_area;
5187 GtkWidget *toplevel;
5189 toplevel = gtk_widget_get_toplevel (widget);
5190 content_area = gtk_dialog_get_content_area (GTK_DIALOG (toplevel));
5191 orientable_toggle_orientation (GTK_ORIENTABLE (content_area));
5195 set_direction_recurse (GtkWidget *widget,
5198 GtkTextDirection *dir = data;
5200 gtk_widget_set_direction (widget, *dir);
5201 if (GTK_IS_CONTAINER (widget))
5202 gtk_container_foreach (GTK_CONTAINER (widget),
5203 set_direction_recurse,
5208 create_forward_back (const char *title,
5209 GtkTextDirection text_dir)
5211 GtkWidget *frame = gtk_frame_new (title);
5212 GtkWidget *bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
5213 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
5214 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
5216 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
5218 gtk_container_add (GTK_CONTAINER (frame), bbox);
5219 gtk_container_add (GTK_CONTAINER (bbox), back_button);
5220 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
5222 set_direction_recurse (frame, &text_dir);
5228 create_flipping (GtkWidget *widget)
5230 static GtkWidget *window = NULL;
5231 GtkWidget *check_button, *button;
5232 GtkWidget *action_area, *content_area;
5236 window = gtk_dialog_new ();
5238 gtk_window_set_screen (GTK_WINDOW (window),
5239 gtk_widget_get_screen (widget));
5241 g_signal_connect (window, "destroy",
5242 G_CALLBACK (gtk_widget_destroyed),
5245 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5246 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
5248 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
5250 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
5251 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5252 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5254 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
5255 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
5257 g_signal_connect (check_button, "toggled",
5258 G_CALLBACK (flipping_toggled_cb), NULL);
5260 check_button = gtk_check_button_new_with_label ("Toggle orientation of all boxes");
5261 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5262 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5264 g_signal_connect (check_button, "toggled",
5265 G_CALLBACK (flipping_orientation_toggled_cb), NULL);
5267 gtk_box_pack_start (GTK_BOX (content_area),
5268 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
5271 gtk_box_pack_start (GTK_BOX (content_area),
5272 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
5275 gtk_box_pack_start (GTK_BOX (content_area),
5276 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
5279 button = gtk_button_new_with_label ("Close");
5280 g_signal_connect_swapped (button, "clicked",
5281 G_CALLBACK (gtk_widget_destroy), window);
5282 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5285 if (!gtk_widget_get_visible (window))
5286 gtk_widget_show_all (window);
5288 gtk_widget_destroy (window);
5296 make_focus_table (GList **list)
5301 table = gtk_table_new (5, 5, FALSE);
5314 widget = gtk_entry_new ();
5316 widget = gtk_button_new_with_label ("Foo");
5318 *list = g_list_prepend (*list, widget);
5320 gtk_table_attach (GTK_TABLE (table),
5324 GTK_EXPAND | GTK_FILL,
5325 GTK_EXPAND | GTK_FILL,
5334 *list = g_list_reverse (*list);
5340 create_focus (GtkWidget *widget)
5342 static GtkWidget *window = NULL;
5346 GtkWidget *content_area;
5351 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
5357 gtk_window_set_screen (GTK_WINDOW (window),
5358 gtk_widget_get_screen (widget));
5360 g_signal_connect (window, "destroy",
5361 G_CALLBACK (gtk_widget_destroyed),
5364 g_signal_connect (window, "response",
5365 G_CALLBACK (gtk_widget_destroy),
5368 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5370 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
5372 frame = gtk_frame_new ("Weird tab focus chain");
5374 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5376 table = make_focus_table (&list);
5378 gtk_container_add (GTK_CONTAINER (frame), table);
5380 gtk_container_set_focus_chain (GTK_CONTAINER (table),
5385 frame = gtk_frame_new ("Default tab focus chain");
5387 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5390 table = make_focus_table (&list);
5394 gtk_container_add (GTK_CONTAINER (frame), table);
5397 if (!gtk_widget_get_visible (window))
5398 gtk_widget_show_all (window);
5400 gtk_widget_destroy (window);
5408 create_font_selection (GtkWidget *widget)
5410 static GtkWidget *window = NULL;
5418 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5419 gtk_window_set_screen (GTK_WINDOW (window),
5420 gtk_widget_get_screen (widget));
5422 g_signal_connect (window, "destroy",
5423 G_CALLBACK (gtk_widget_destroyed),
5426 gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
5427 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5429 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
5430 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5431 gtk_container_add (GTK_CONTAINER (window), hbox);
5433 label = gtk_label_new ("Pick a font");
5434 gtk_container_add (GTK_CONTAINER (hbox), label);
5436 picker = gtk_font_button_new ();
5437 gtk_font_button_set_use_font (GTK_FONT_BUTTON (picker), TRUE);
5438 gtk_container_add (GTK_CONTAINER (hbox), picker);
5441 if (!gtk_widget_get_visible (window))
5442 gtk_widget_show_all (window);
5444 gtk_widget_destroy (window);
5451 static GtkWidget *dialog_window = NULL;
5454 label_toggle (GtkWidget *widget,
5459 *label = gtk_label_new ("Dialog Test");
5460 g_signal_connect (*label,
5462 G_CALLBACK (gtk_widget_destroyed),
5464 g_object_set (*label, "margin", 10, NULL);
5465 gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog_window))),
5466 *label, TRUE, TRUE, 0);
5467 gtk_widget_show (*label);
5470 gtk_widget_destroy (*label);
5474 create_dialog (GtkWidget *widget)
5476 static GtkWidget *label;
5477 GtkWidget *action_area;
5482 /* This is a terrible example; it's much simpler to create
5483 * dialogs than this. Don't use testgtk for example code,
5487 dialog_window = gtk_dialog_new ();
5488 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5489 gtk_widget_get_screen (widget));
5491 g_signal_connect (dialog_window, "destroy",
5492 G_CALLBACK (gtk_widget_destroyed),
5495 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5497 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
5498 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5500 button = gtk_button_new_with_label ("OK");
5501 gtk_widget_set_can_default (button, TRUE);
5502 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5503 gtk_widget_grab_default (button);
5504 gtk_widget_show (button);
5506 button = gtk_button_new_with_label ("Toggle");
5507 g_signal_connect (button, "clicked",
5508 G_CALLBACK (label_toggle),
5510 gtk_widget_set_can_default (button, TRUE);
5511 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5512 gtk_widget_show (button);
5517 if (!gtk_widget_get_visible (dialog_window))
5518 gtk_widget_show (dialog_window);
5520 gtk_widget_destroy (dialog_window);
5523 /* Display & Screen test
5530 GtkWidget *radio_dpy;
5531 GtkWidget *toplevel;
5532 GtkWidget *dialog_window;
5533 } ScreenDisplaySelection;
5536 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
5538 const gchar *display_name;
5539 GdkDisplay *display = gtk_widget_get_display (widget);
5541 GdkScreen *new_screen = NULL;
5542 GdkScreen *current_screen = gtk_widget_get_screen (widget);
5544 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
5546 display_name = gtk_entry_get_text (GTK_ENTRY (data->entry));
5547 display = gdk_display_open (display_name);
5551 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
5552 GTK_DIALOG_DESTROY_WITH_PARENT,
5555 "The display :\n%s\ncannot be opened",
5557 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
5558 gtk_widget_show (dialog);
5559 g_signal_connect (dialog, "response",
5560 G_CALLBACK (gtk_widget_destroy),
5565 GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (data->combo));
5568 gboolean found = FALSE;
5569 while (gtk_tree_model_iter_nth_child (model, &iter, NULL, i++))
5572 gtk_tree_model_get (model, &iter, 0, &name, -1);
5573 found = !g_ascii_strcasecmp (display_name, name);
5580 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (data->combo), display_name);
5581 new_screen = gdk_display_get_default_screen (display);
5586 gint number_of_screens = gdk_display_get_n_screens (display);
5587 gint screen_num = gdk_screen_get_number (current_screen);
5588 if ((screen_num +1) < number_of_screens)
5589 new_screen = gdk_display_get_screen (display, screen_num + 1);
5591 new_screen = gdk_display_get_screen (display, 0);
5596 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
5597 gtk_widget_destroy (data->dialog_window);
5602 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
5604 gtk_widget_destroy (data);
5608 create_display_screen (GtkWidget *widget)
5610 GtkWidget *table, *frame, *window, *combo_dpy, *vbox;
5611 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
5613 ScreenDisplaySelection *scr_dpy_data;
5614 GdkScreen *screen = gtk_widget_get_screen (widget);
5615 GdkDisplay *display = gdk_screen_get_display (screen);
5617 window = g_object_new (gtk_window_get_type (),
5620 "type", GTK_WINDOW_TOPLEVEL,
5622 "Screen or Display selection",
5623 "border_width", 10, NULL);
5624 g_signal_connect (window, "destroy",
5625 G_CALLBACK (gtk_widget_destroy), NULL);
5627 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
5628 gtk_container_add (GTK_CONTAINER (window), vbox);
5630 frame = gtk_frame_new ("Select screen or display");
5631 gtk_container_add (GTK_CONTAINER (vbox), frame);
5633 table = gtk_table_new (2, 2, TRUE);
5634 gtk_table_set_row_spacings (GTK_TABLE (table), 3);
5635 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
5637 gtk_container_add (GTK_CONTAINER (frame), table);
5639 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
5640 if (gdk_display_get_n_screens(display) > 1)
5641 radio_scr = gtk_radio_button_new_with_label
5642 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
5645 radio_scr = gtk_radio_button_new_with_label
5646 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
5647 "only one screen on the current display");
5648 gtk_widget_set_sensitive (radio_scr, FALSE);
5650 combo_dpy = gtk_combo_box_text_new_with_entry ();
5651 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_dpy), "diabolo:0.0");
5652 gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (combo_dpy))),
5653 "<hostname>:<X Server Num>.<Screen Num>");
5655 gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1);
5656 gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2);
5657 gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1);
5659 bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
5660 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
5661 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
5663 gtk_container_add (GTK_CONTAINER (vbox), bbox);
5665 gtk_container_add (GTK_CONTAINER (bbox), applyb);
5666 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
5668 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
5670 scr_dpy_data->entry = gtk_bin_get_child (GTK_BIN (combo_dpy));
5671 scr_dpy_data->radio_dpy = radio_dpy;
5672 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
5673 scr_dpy_data->dialog_window = window;
5675 g_signal_connect (cancelb, "clicked",
5676 G_CALLBACK (screen_display_destroy_diag), window);
5677 g_signal_connect (applyb, "clicked",
5678 G_CALLBACK (screen_display_check), scr_dpy_data);
5679 gtk_widget_show_all (window);
5684 static gulong event_watcher_enter_id = 0;
5685 static gulong event_watcher_leave_id = 0;
5688 event_watcher (GSignalInvocationHint *ihint,
5689 guint n_param_values,
5690 const GValue *param_values,
5693 g_print ("Watch: \"%s\" emitted for %s\n",
5694 g_signal_name (ihint->signal_id),
5695 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
5701 event_watcher_down (void)
5703 if (event_watcher_enter_id)
5707 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5708 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
5709 event_watcher_enter_id = 0;
5710 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5711 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
5712 event_watcher_leave_id = 0;
5717 event_watcher_toggle (void)
5719 if (event_watcher_enter_id)
5720 event_watcher_down ();
5725 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5726 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5727 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5728 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5733 create_event_watcher (GtkWidget *widget)
5735 GtkWidget *action_area, *content_area;
5740 dialog_window = gtk_dialog_new ();
5741 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5742 gtk_widget_get_screen (widget));
5744 g_signal_connect (dialog_window, "destroy",
5745 G_CALLBACK (gtk_widget_destroyed),
5747 g_signal_connect (dialog_window, "destroy",
5748 G_CALLBACK (event_watcher_down),
5751 content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog_window));
5752 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5754 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
5755 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5756 gtk_widget_set_size_request (dialog_window, 200, 110);
5758 button = gtk_toggle_button_new_with_label ("Activate Watch");
5759 g_signal_connect (button, "clicked",
5760 G_CALLBACK (event_watcher_toggle),
5762 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
5763 gtk_box_pack_start (GTK_BOX (content_area), button, TRUE, TRUE, 0);
5764 gtk_widget_show (button);
5766 button = gtk_button_new_with_label ("Close");
5767 g_signal_connect_swapped (button, "clicked",
5768 G_CALLBACK (gtk_widget_destroy),
5770 gtk_widget_set_can_default (button, TRUE);
5771 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5772 gtk_widget_grab_default (button);
5773 gtk_widget_show (button);
5776 if (!gtk_widget_get_visible (dialog_window))
5777 gtk_widget_show (dialog_window);
5779 gtk_widget_destroy (dialog_window);
5787 reformat_value (GtkScale *scale,
5790 return g_strdup_printf ("-->%0.*g<--",
5791 gtk_scale_get_digits (scale), value);
5795 create_range_controls (GtkWidget *widget)
5797 static GtkWidget *window = NULL;
5801 GtkWidget *scrollbar;
5803 GtkWidget *separator;
5804 GtkAdjustment *adjustment;
5809 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5811 gtk_window_set_screen (GTK_WINDOW (window),
5812 gtk_widget_get_screen (widget));
5814 g_signal_connect (window, "destroy",
5815 G_CALLBACK (gtk_widget_destroyed),
5818 gtk_window_set_title (GTK_WINDOW (window), "range controls");
5819 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5822 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
5823 gtk_container_add (GTK_CONTAINER (window), box1);
5824 gtk_widget_show (box1);
5827 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
5828 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5829 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
5830 gtk_widget_show (box2);
5833 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
5835 scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5836 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
5837 gtk_scale_set_digits (GTK_SCALE (scale), 1);
5838 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5839 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
5840 gtk_widget_show (scale);
5842 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5843 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
5844 gtk_widget_show (scrollbar);
5846 scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5847 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5848 g_signal_connect (scale,
5850 G_CALLBACK (reformat_value),
5852 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
5853 gtk_widget_show (scale);
5855 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
5857 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5858 gtk_widget_set_size_request (scale, -1, 200);
5859 gtk_scale_set_digits (GTK_SCALE (scale), 2);
5860 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5861 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5862 gtk_widget_show (scale);
5864 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5865 gtk_widget_set_size_request (scale, -1, 200);
5866 gtk_scale_set_digits (GTK_SCALE (scale), 2);
5867 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5868 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
5869 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5870 gtk_widget_show (scale);
5872 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5873 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5874 g_signal_connect (scale,
5876 G_CALLBACK (reformat_value),
5878 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5879 gtk_widget_show (scale);
5882 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
5883 gtk_widget_show (hbox);
5885 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
5886 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
5887 gtk_widget_show (separator);
5890 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
5891 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5892 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
5893 gtk_widget_show (box2);
5896 button = gtk_button_new_with_label ("close");
5897 g_signal_connect_swapped (button, "clicked",
5898 G_CALLBACK (gtk_widget_destroy),
5900 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
5901 gtk_widget_set_can_default (button, TRUE);
5902 gtk_widget_grab_default (button);
5903 gtk_widget_show (button);
5906 if (!gtk_widget_get_visible (window))
5907 gtk_widget_show (window);
5909 gtk_widget_destroy (window);
5916 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
5917 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
5918 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
5919 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
5920 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
5921 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
5922 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
5923 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
5926 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
5932 static const char * book_open_xpm[] = {
5955 static const char * book_closed_xpm[] = {
5980 GdkPixbuf *book_open;
5981 GdkPixbuf *book_closed;
5982 GtkWidget *sample_notebook;
5985 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
5987 GtkWidget *page_widget;
5990 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
5992 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
5993 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
5995 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
5996 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6000 page_switch (GtkWidget *widget, gpointer *page, gint page_num)
6002 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
6003 gint old_page_num = gtk_notebook_get_current_page (notebook);
6005 if (page_num == old_page_num)
6008 set_page_image (notebook, page_num, book_open);
6010 if (old_page_num != -1)
6011 set_page_image (notebook, old_page_num, book_closed);
6015 tab_fill (GtkToggleButton *button, GtkWidget *child)
6017 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
6018 "tab-fill", gtk_toggle_button_get_active (button),
6023 tab_expand (GtkToggleButton *button, GtkWidget *child)
6025 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
6026 "tab-expand", gtk_toggle_button_get_active (button),
6031 create_pages (GtkNotebook *notebook, gint start, gint end)
6033 GtkWidget *child = NULL;
6038 GtkWidget *label_box;
6039 GtkWidget *menu_box;
6043 char accel_buffer[32];
6045 for (i = start; i <= end; i++)
6047 sprintf (buffer, "Page %d", i);
6048 sprintf (accel_buffer, "Page _%d", i);
6050 child = gtk_frame_new (buffer);
6051 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
6053 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6054 gtk_box_set_homogeneous (GTK_BOX (vbox), TRUE);
6055 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
6056 gtk_container_add (GTK_CONTAINER (child), vbox);
6058 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6059 gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE);
6060 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
6062 button = gtk_check_button_new_with_label ("Fill Tab");
6063 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6064 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
6065 g_signal_connect (button, "toggled",
6066 G_CALLBACK (tab_fill), child);
6068 button = gtk_check_button_new_with_label ("Expand Tab");
6069 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6070 g_signal_connect (button, "toggled",
6071 G_CALLBACK (tab_expand), child);
6073 button = gtk_button_new_with_label ("Hide Page");
6074 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
6075 g_signal_connect_swapped (button, "clicked",
6076 G_CALLBACK (gtk_widget_hide),
6079 gtk_widget_show_all (child);
6081 label_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6082 pixwid = gtk_image_new_from_pixbuf (book_closed);
6083 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
6085 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
6086 gtk_widget_set_margin_left (pixwid, 3);
6087 gtk_widget_set_margin_right (pixwid, 3);
6088 gtk_widget_set_margin_bottom (pixwid, 1);
6089 gtk_widget_set_margin_top (pixwid, 1);
6090 label = gtk_label_new_with_mnemonic (accel_buffer);
6091 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
6092 gtk_widget_show_all (label_box);
6095 menu_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6096 pixwid = gtk_image_new_from_pixbuf (book_closed);
6097 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
6099 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
6100 gtk_widget_set_margin_left (pixwid, 3);
6101 gtk_widget_set_margin_right (pixwid, 3);
6102 gtk_widget_set_margin_bottom (pixwid, 1);
6103 gtk_widget_set_margin_top (pixwid, 1);
6104 label = gtk_label_new (buffer);
6105 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
6106 gtk_widget_show_all (menu_box);
6108 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
6113 rotate_notebook (GtkButton *button,
6114 GtkNotebook *notebook)
6116 gtk_notebook_set_tab_pos (notebook, (gtk_notebook_get_tab_pos (notebook) + 1) % 4);
6120 show_all_pages (GtkButton *button,
6121 GtkNotebook *notebook)
6123 gtk_container_foreach (GTK_CONTAINER (notebook),
6124 (GtkCallback) gtk_widget_show, NULL);
6128 notebook_type_changed (GtkWidget *optionmenu,
6131 GtkNotebook *notebook;
6141 notebook = GTK_NOTEBOOK (data);
6143 c = gtk_combo_box_get_active (GTK_COMBO_BOX (optionmenu));
6148 /* standard notebook */
6149 gtk_notebook_set_show_tabs (notebook, TRUE);
6150 gtk_notebook_set_show_border (notebook, TRUE);
6151 gtk_notebook_set_scrollable (notebook, FALSE);
6155 /* notabs notebook */
6156 gtk_notebook_set_show_tabs (notebook, FALSE);
6157 gtk_notebook_set_show_border (notebook, TRUE);
6162 gtk_notebook_set_show_tabs (notebook, FALSE);
6163 gtk_notebook_set_show_border (notebook, FALSE);
6168 gtk_notebook_set_show_tabs (notebook, TRUE);
6169 gtk_notebook_set_show_border (notebook, TRUE);
6170 gtk_notebook_set_scrollable (notebook, TRUE);
6171 if (gtk_notebook_get_n_pages (notebook) == 5)
6172 create_pages (notebook, 6, 15);
6178 if (gtk_notebook_get_n_pages (notebook) == 15)
6179 for (i = 0; i < 10; i++)
6180 gtk_notebook_remove_page (notebook, 5);
6184 notebook_popup (GtkToggleButton *button,
6185 GtkNotebook *notebook)
6187 if (gtk_toggle_button_get_active (button))
6188 gtk_notebook_popup_enable (notebook);
6190 gtk_notebook_popup_disable (notebook);
6194 create_notebook (GtkWidget *widget)
6196 static GtkWidget *window = NULL;
6200 GtkWidget *separator;
6204 static gchar *items[] =
6214 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6215 gtk_window_set_screen (GTK_WINDOW (window),
6216 gtk_widget_get_screen (widget));
6218 g_signal_connect (window, "destroy",
6219 G_CALLBACK (gtk_widget_destroyed),
6222 gtk_window_set_title (GTK_WINDOW (window), "notebook");
6223 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6225 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6226 gtk_container_add (GTK_CONTAINER (window), box1);
6228 sample_notebook = gtk_notebook_new ();
6229 g_signal_connect (sample_notebook, "switch_page",
6230 G_CALLBACK (page_switch), NULL);
6231 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
6232 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
6233 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
6235 gtk_widget_realize (sample_notebook);
6238 book_open = gdk_pixbuf_new_from_xpm_data (book_open_xpm);
6241 book_closed = gdk_pixbuf_new_from_xpm_data (book_closed_xpm);
6243 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
6245 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
6246 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
6248 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
6249 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6250 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6252 button = gtk_check_button_new_with_label ("popup menu");
6253 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
6254 g_signal_connect (button, "clicked",
6255 G_CALLBACK (notebook_popup),
6258 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
6259 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6260 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6262 label = gtk_label_new ("Notebook Style :");
6263 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
6265 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
6266 notebook_type_changed,
6268 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
6270 button = gtk_button_new_with_label ("Show all Pages");
6271 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
6272 g_signal_connect (button, "clicked",
6273 G_CALLBACK (show_all_pages), sample_notebook);
6275 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
6276 gtk_box_set_homogeneous (GTK_BOX (box2), TRUE);
6277 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6278 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6280 button = gtk_button_new_with_label ("prev");
6281 g_signal_connect_swapped (button, "clicked",
6282 G_CALLBACK (gtk_notebook_prev_page),
6284 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6286 button = gtk_button_new_with_label ("next");
6287 g_signal_connect_swapped (button, "clicked",
6288 G_CALLBACK (gtk_notebook_next_page),
6290 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6292 button = gtk_button_new_with_label ("rotate");
6293 g_signal_connect (button, "clicked",
6294 G_CALLBACK (rotate_notebook), sample_notebook);
6295 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6297 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
6298 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
6300 button = gtk_button_new_with_label ("close");
6301 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
6302 g_signal_connect_swapped (button, "clicked",
6303 G_CALLBACK (gtk_widget_destroy),
6305 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
6306 gtk_widget_set_can_default (button, TRUE);
6307 gtk_widget_grab_default (button);
6310 if (!gtk_widget_get_visible (window))
6311 gtk_widget_show_all (window);
6313 gtk_widget_destroy (window);
6321 toggle_resize (GtkWidget *widget, GtkWidget *child)
6323 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6324 GValue value = { 0, };
6325 g_value_init (&value, G_TYPE_BOOLEAN);
6326 gtk_container_child_get_property (container, child, "resize", &value);
6327 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6328 gtk_container_child_set_property (container, child, "resize", &value);
6332 toggle_shrink (GtkWidget *widget, GtkWidget *child)
6334 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6335 GValue value = { 0, };
6336 g_value_init (&value, G_TYPE_BOOLEAN);
6337 gtk_container_child_get_property (container, child, "shrink", &value);
6338 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6339 gtk_container_child_set_property (container, child, "shrink", &value);
6343 paned_props_clicked (GtkWidget *button,
6346 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
6348 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
6352 create_pane_options (GtkPaned *paned,
6353 const gchar *frame_label,
6354 const gchar *label1,
6355 const gchar *label2)
6357 GtkWidget *child1, *child2;
6362 GtkWidget *check_button;
6364 child1 = gtk_paned_get_child1 (paned);
6365 child2 = gtk_paned_get_child2 (paned);
6367 frame = gtk_frame_new (frame_label);
6368 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
6370 table = gtk_table_new (4, 2, 4);
6371 gtk_container_add (GTK_CONTAINER (frame), table);
6373 label = gtk_label_new (label1);
6374 gtk_table_attach_defaults (GTK_TABLE (table), label,
6377 check_button = gtk_check_button_new_with_label ("Resize");
6378 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6380 g_signal_connect (check_button, "toggled",
6381 G_CALLBACK (toggle_resize),
6384 check_button = gtk_check_button_new_with_label ("Shrink");
6385 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6387 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6389 g_signal_connect (check_button, "toggled",
6390 G_CALLBACK (toggle_shrink),
6393 label = gtk_label_new (label2);
6394 gtk_table_attach_defaults (GTK_TABLE (table), label,
6397 check_button = gtk_check_button_new_with_label ("Resize");
6398 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6400 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6402 g_signal_connect (check_button, "toggled",
6403 G_CALLBACK (toggle_resize),
6406 check_button = gtk_check_button_new_with_label ("Shrink");
6407 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6409 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6411 g_signal_connect (check_button, "toggled",
6412 G_CALLBACK (toggle_shrink),
6415 button = gtk_button_new_with_mnemonic ("_Properties");
6416 gtk_table_attach_defaults (GTK_TABLE (table), button,
6418 g_signal_connect (button, "clicked",
6419 G_CALLBACK (paned_props_clicked),
6426 create_panes (GtkWidget *widget)
6428 static GtkWidget *window = NULL;
6437 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6439 gtk_window_set_screen (GTK_WINDOW (window),
6440 gtk_widget_get_screen (widget));
6442 g_signal_connect (window, "destroy",
6443 G_CALLBACK (gtk_widget_destroyed),
6446 gtk_window_set_title (GTK_WINDOW (window), "Panes");
6447 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6449 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6450 gtk_container_add (GTK_CONTAINER (window), vbox);
6452 vpaned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6453 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
6454 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
6456 hpaned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6457 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
6459 frame = gtk_frame_new (NULL);
6460 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6461 gtk_widget_set_size_request (frame, 60, 60);
6462 gtk_paned_add1 (GTK_PANED (hpaned), frame);
6464 button = gtk_button_new_with_label ("Hi there");
6465 gtk_container_add (GTK_CONTAINER(frame), button);
6467 frame = gtk_frame_new (NULL);
6468 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6469 gtk_widget_set_size_request (frame, 80, 60);
6470 gtk_paned_add2 (GTK_PANED (hpaned), frame);
6472 frame = gtk_frame_new (NULL);
6473 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6474 gtk_widget_set_size_request (frame, 60, 80);
6475 gtk_paned_add2 (GTK_PANED (vpaned), frame);
6477 /* Now create toggle buttons to control sizing */
6479 gtk_box_pack_start (GTK_BOX (vbox),
6480 create_pane_options (GTK_PANED (hpaned),
6486 gtk_box_pack_start (GTK_BOX (vbox),
6487 create_pane_options (GTK_PANED (vpaned),
6493 gtk_widget_show_all (vbox);
6496 if (!gtk_widget_get_visible (window))
6497 gtk_widget_show (window);
6499 gtk_widget_destroy (window);
6503 * Paned keyboard navigation
6507 paned_keyboard_window1 (GtkWidget *widget)
6530 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6531 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
6532 gtk_window_set_screen (GTK_WINDOW (window1),
6533 gtk_widget_get_screen (widget));
6535 hpaned1 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6536 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
6538 frame1 = gtk_frame_new (NULL);
6539 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
6540 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
6542 vbox1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6543 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
6545 button7 = gtk_button_new_with_label ("button7");
6546 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
6548 button8 = gtk_button_new_with_label ("button8");
6549 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
6551 button9 = gtk_button_new_with_label ("button9");
6552 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
6554 vpaned1 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6555 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
6557 frame2 = gtk_frame_new (NULL);
6558 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
6559 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
6561 frame5 = gtk_frame_new (NULL);
6562 gtk_container_add (GTK_CONTAINER (frame2), frame5);
6564 hbox1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6565 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
6567 button5 = gtk_button_new_with_label ("button5");
6568 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
6570 button6 = gtk_button_new_with_label ("button6");
6571 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
6573 frame3 = gtk_frame_new (NULL);
6574 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
6575 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
6577 frame4 = gtk_frame_new ("Buttons");
6578 gtk_container_add (GTK_CONTAINER (frame3), frame4);
6579 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
6581 table1 = gtk_table_new (2, 2, FALSE);
6582 gtk_container_add (GTK_CONTAINER (frame4), table1);
6583 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
6585 button1 = gtk_button_new_with_label ("button1");
6586 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
6587 (GtkAttachOptions) (GTK_FILL),
6588 (GtkAttachOptions) (0), 0, 0);
6590 button2 = gtk_button_new_with_label ("button2");
6591 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
6592 (GtkAttachOptions) (GTK_FILL),
6593 (GtkAttachOptions) (0), 0, 0);
6595 button3 = gtk_button_new_with_label ("button3");
6596 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
6597 (GtkAttachOptions) (GTK_FILL),
6598 (GtkAttachOptions) (0), 0, 0);
6600 button4 = gtk_button_new_with_label ("button4");
6601 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
6602 (GtkAttachOptions) (GTK_FILL),
6603 (GtkAttachOptions) (0), 0, 0);
6609 paned_keyboard_window2 (GtkWidget *widget)
6614 GtkWidget *button13;
6618 GtkWidget *button12;
6620 GtkWidget *button11;
6621 GtkWidget *button10;
6623 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6624 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
6626 gtk_window_set_screen (GTK_WINDOW (window2),
6627 gtk_widget_get_screen (widget));
6629 hpaned2 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6630 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
6632 frame6 = gtk_frame_new (NULL);
6633 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
6634 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
6636 button13 = gtk_button_new_with_label ("button13");
6637 gtk_container_add (GTK_CONTAINER (frame6), button13);
6639 hbox2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6640 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
6642 vpaned2 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6643 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
6645 frame7 = gtk_frame_new (NULL);
6646 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
6647 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
6649 button12 = gtk_button_new_with_label ("button12");
6650 gtk_container_add (GTK_CONTAINER (frame7), button12);
6652 frame8 = gtk_frame_new (NULL);
6653 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
6654 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
6656 button11 = gtk_button_new_with_label ("button11");
6657 gtk_container_add (GTK_CONTAINER (frame8), button11);
6659 button10 = gtk_button_new_with_label ("button10");
6660 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
6666 paned_keyboard_window3 (GtkWidget *widget)
6673 GtkWidget *button14;
6676 GtkWidget *button15;
6679 GtkWidget *button16;
6681 GtkWidget *button17;
6683 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6684 g_object_set_data (G_OBJECT (window3), "window3", window3);
6685 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
6687 gtk_window_set_screen (GTK_WINDOW (window3),
6688 gtk_widget_get_screen (widget));
6691 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6692 gtk_container_add (GTK_CONTAINER (window3), vbox2);
6694 label1 = gtk_label_new ("Three panes nested inside each other");
6695 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
6697 hpaned3 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6698 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
6700 frame9 = gtk_frame_new (NULL);
6701 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
6702 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
6704 button14 = gtk_button_new_with_label ("button14");
6705 gtk_container_add (GTK_CONTAINER (frame9), button14);
6707 hpaned4 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6708 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
6710 frame10 = gtk_frame_new (NULL);
6711 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
6712 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
6714 button15 = gtk_button_new_with_label ("button15");
6715 gtk_container_add (GTK_CONTAINER (frame10), button15);
6717 hpaned5 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6718 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
6720 frame11 = gtk_frame_new (NULL);
6721 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
6722 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
6724 button16 = gtk_button_new_with_label ("button16");
6725 gtk_container_add (GTK_CONTAINER (frame11), button16);
6727 frame12 = gtk_frame_new (NULL);
6728 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
6729 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
6731 button17 = gtk_button_new_with_label ("button17");
6732 gtk_container_add (GTK_CONTAINER (frame12), button17);
6738 paned_keyboard_window4 (GtkWidget *widget)
6745 GtkWidget *button19;
6746 GtkWidget *button18;
6749 GtkWidget *button21;
6750 GtkWidget *button20;
6752 GtkWidget *button23;
6753 GtkWidget *button22;
6755 GtkWidget *button25;
6756 GtkWidget *button24;
6758 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6759 g_object_set_data (G_OBJECT (window4), "window4", window4);
6760 gtk_window_set_title (GTK_WINDOW (window4), "window4");
6762 gtk_window_set_screen (GTK_WINDOW (window4),
6763 gtk_widget_get_screen (widget));
6765 vbox3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6766 gtk_container_add (GTK_CONTAINER (window4), vbox3);
6768 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
6769 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
6770 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
6772 hpaned6 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6773 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
6775 vpaned3 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6776 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
6778 button19 = gtk_button_new_with_label ("button19");
6779 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
6781 button18 = gtk_button_new_with_label ("button18");
6782 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
6784 hbox3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6785 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
6787 vpaned4 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6788 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
6790 button21 = gtk_button_new_with_label ("button21");
6791 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
6793 button20 = gtk_button_new_with_label ("button20");
6794 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
6796 vpaned5 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6797 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
6799 button23 = gtk_button_new_with_label ("button23");
6800 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
6802 button22 = gtk_button_new_with_label ("button22");
6803 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
6805 vpaned6 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6806 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
6808 button25 = gtk_button_new_with_label ("button25");
6809 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
6811 button24 = gtk_button_new_with_label ("button24");
6812 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
6818 create_paned_keyboard_navigation (GtkWidget *widget)
6820 static GtkWidget *window1 = NULL;
6821 static GtkWidget *window2 = NULL;
6822 static GtkWidget *window3 = NULL;
6823 static GtkWidget *window4 = NULL;
6826 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
6828 gtk_widget_destroy (window1);
6829 gtk_widget_destroy (window2);
6830 gtk_widget_destroy (window3);
6831 gtk_widget_destroy (window4);
6836 window1 = paned_keyboard_window1 (widget);
6837 g_signal_connect (window1, "destroy",
6838 G_CALLBACK (gtk_widget_destroyed),
6844 window2 = paned_keyboard_window2 (widget);
6845 g_signal_connect (window2, "destroy",
6846 G_CALLBACK (gtk_widget_destroyed),
6852 window3 = paned_keyboard_window3 (widget);
6853 g_signal_connect (window3, "destroy",
6854 G_CALLBACK (gtk_widget_destroyed),
6860 window4 = paned_keyboard_window4 (widget);
6861 g_signal_connect (window4, "destroy",
6862 G_CALLBACK (gtk_widget_destroyed),
6866 if (gtk_widget_get_visible (window1))
6867 gtk_widget_destroy (GTK_WIDGET (window1));
6869 gtk_widget_show_all (GTK_WIDGET (window1));
6871 if (gtk_widget_get_visible (window2))
6872 gtk_widget_destroy (GTK_WIDGET (window2));
6874 gtk_widget_show_all (GTK_WIDGET (window2));
6876 if (gtk_widget_get_visible (window3))
6877 gtk_widget_destroy (GTK_WIDGET (window3));
6879 gtk_widget_show_all (GTK_WIDGET (window3));
6881 if (gtk_widget_get_visible (window4))
6882 gtk_widget_destroy (GTK_WIDGET (window4));
6884 gtk_widget_show_all (GTK_WIDGET (window4));
6892 typedef struct _cursoroffset {gint x,y;} CursorOffset;
6895 shape_pressed (GtkWidget *widget, GdkEventButton *event)
6899 /* ignore double and triple click */
6900 if (event->type != GDK_BUTTON_PRESS)
6903 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
6904 p->x = (int) event->x;
6905 p->y = (int) event->y;
6907 gtk_grab_add (widget);
6908 gdk_device_grab (gdk_event_get_device ((GdkEvent*)event),
6909 gtk_widget_get_window (widget),
6912 GDK_BUTTON_RELEASE_MASK |
6913 GDK_BUTTON_MOTION_MASK |
6914 GDK_POINTER_MOTION_HINT_MASK,
6920 shape_released (GtkWidget *widget,
6921 GdkEventButton *event)
6923 gtk_grab_remove (widget);
6924 gdk_device_ungrab (gdk_event_get_device ((GdkEvent*)event), event->time);
6928 shape_motion (GtkWidget *widget,
6929 GdkEventMotion *event)
6933 GdkModifierType mask;
6935 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
6938 * Can't use event->x / event->y here
6939 * because I need absolute coordinates.
6941 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
6942 gtk_window_move (GTK_WINDOW (widget), xp - p->x, yp - p->y);
6946 shape_create_icon (GdkScreen *screen,
6957 CursorOffset* icon_pos;
6958 cairo_surface_t *mask;
6959 cairo_region_t *mask_region;
6964 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
6966 window = gtk_window_new (window_type);
6967 gtk_window_set_screen (GTK_WINDOW (window), screen);
6969 fixed = gtk_fixed_new ();
6970 gtk_widget_set_size_request (fixed, 100, 100);
6971 gtk_container_add (GTK_CONTAINER (window), fixed);
6972 gtk_widget_show (fixed);
6974 gtk_widget_set_events (window,
6975 gtk_widget_get_events (window) |
6976 GDK_BUTTON_MOTION_MASK |
6977 GDK_POINTER_MOTION_HINT_MASK |
6978 GDK_BUTTON_PRESS_MASK);
6980 gtk_widget_realize (window);
6982 pixbuf = gdk_pixbuf_new_from_file (xpm_file, NULL);
6983 g_assert (pixbuf); /* FIXME: error handling */
6985 mask = cairo_image_surface_create (CAIRO_FORMAT_A1,
6986 gdk_pixbuf_get_width (pixbuf),
6987 gdk_pixbuf_get_height (pixbuf));
6988 cr = cairo_create (mask);
6989 gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
6993 mask_region = gdk_cairo_region_create_from_surface (mask);
6995 cairo_region_translate (mask_region, px, py);
6997 image = gtk_image_new_from_pixbuf (pixbuf);
6998 gtk_fixed_put (GTK_FIXED (fixed), image, px,py);
6999 gtk_widget_show (image);
7001 gtk_widget_shape_combine_region (window, mask_region);
7003 cairo_region_destroy (mask_region);
7004 cairo_surface_destroy (mask);
7005 g_object_unref (pixbuf);
7007 g_signal_connect (window, "button_press_event",
7008 G_CALLBACK (shape_pressed), NULL);
7009 g_signal_connect (window, "button_release_event",
7010 G_CALLBACK (shape_released), NULL);
7011 g_signal_connect (window, "motion_notify_event",
7012 G_CALLBACK (shape_motion), NULL);
7014 icon_pos = g_new (CursorOffset, 1);
7015 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
7017 gtk_window_move (GTK_WINDOW (window), x, y);
7018 gtk_widget_show (window);
7024 create_shapes (GtkWidget *widget)
7026 /* Variables used by the Drag/Drop and Shape Window demos */
7027 static GtkWidget *modeller = NULL;
7028 static GtkWidget *sheets = NULL;
7029 static GtkWidget *rings = NULL;
7030 static GtkWidget *with_region = NULL;
7031 GdkScreen *screen = gtk_widget_get_screen (widget);
7033 if (!(file_exists ("Modeller.xpm") &&
7034 file_exists ("FilesQueue.xpm") &&
7035 file_exists ("3DRings.xpm")))
7041 modeller = shape_create_icon (screen, "Modeller.xpm",
7042 440, 140, 0,0, GTK_WINDOW_POPUP);
7044 g_signal_connect (modeller, "destroy",
7045 G_CALLBACK (gtk_widget_destroyed),
7049 gtk_widget_destroy (modeller);
7053 sheets = shape_create_icon (screen, "FilesQueue.xpm",
7054 580, 170, 0,0, GTK_WINDOW_POPUP);
7056 g_signal_connect (sheets, "destroy",
7057 G_CALLBACK (gtk_widget_destroyed),
7062 gtk_widget_destroy (sheets);
7066 rings = shape_create_icon (screen, "3DRings.xpm",
7067 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7069 g_signal_connect (rings, "destroy",
7070 G_CALLBACK (gtk_widget_destroyed),
7074 gtk_widget_destroy (rings);
7078 cairo_region_t *region;
7081 with_region = shape_create_icon (screen, "3DRings.xpm",
7082 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7084 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
7086 g_signal_connect (with_region, "destroy",
7087 G_CALLBACK (gtk_widget_destroyed),
7090 /* reset shape from mask to a region */
7093 region = cairo_region_create ();
7105 cairo_region_union_rectangle (region, &rect);
7113 gdk_window_shape_combine_region (gtk_widget_get_window (with_region),
7118 gtk_widget_destroy (with_region);
7126 create_wmhints (GtkWidget *widget)
7128 static GtkWidget *window = NULL;
7130 GtkWidget *separator;
7134 GdkWindow *gdk_window;
7140 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7142 gtk_window_set_screen (GTK_WINDOW (window),
7143 gtk_widget_get_screen (widget));
7145 g_signal_connect (window, "destroy",
7146 G_CALLBACK (gtk_widget_destroyed),
7149 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
7150 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7152 gtk_widget_realize (window);
7154 gdk_window = gtk_widget_get_window (window);
7156 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
7157 list = g_list_prepend (NULL, pixbuf);
7159 gdk_window_set_icon_list (gdk_window, list);
7162 g_object_unref (pixbuf);
7164 gdk_window_set_icon_name (gdk_window, "WMHints Test Icon");
7166 gdk_window_set_decorations (gdk_window, GDK_DECOR_ALL | GDK_DECOR_MENU);
7167 gdk_window_set_functions (gdk_window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
7169 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7170 gtk_container_add (GTK_CONTAINER (window), box1);
7171 gtk_widget_show (box1);
7173 label = gtk_label_new ("Try iconizing me!");
7174 gtk_widget_set_size_request (label, 150, 50);
7175 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
7176 gtk_widget_show (label);
7179 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
7180 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
7181 gtk_widget_show (separator);
7184 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
7185 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7186 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7187 gtk_widget_show (box2);
7190 button = gtk_button_new_with_label ("close");
7192 g_signal_connect_swapped (button, "clicked",
7193 G_CALLBACK (gtk_widget_destroy),
7196 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7197 gtk_widget_set_can_default (button, TRUE);
7198 gtk_widget_grab_default (button);
7199 gtk_widget_show (button);
7202 if (!gtk_widget_get_visible (window))
7203 gtk_widget_show (window);
7205 gtk_widget_destroy (window);
7210 * Window state tracking
7214 window_state_callback (GtkWidget *widget,
7215 GdkEventWindowState *event,
7218 GtkWidget *label = data;
7221 msg = g_strconcat (gtk_window_get_title (GTK_WINDOW (widget)), ": ",
7222 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
7223 "withdrawn" : "not withdrawn", ", ",
7224 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
7225 "iconified" : "not iconified", ", ",
7226 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
7227 "sticky" : "not sticky", ", ",
7228 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
7229 "maximized" : "not maximized", ", ",
7230 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
7231 "fullscreen" : "not fullscreen",
7232 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
7233 "above" : "not above", ", ",
7234 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
7235 "below" : "not below", ", ",
7238 gtk_label_set_text (GTK_LABEL (label), msg);
7246 tracking_label (GtkWidget *window)
7252 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
7254 g_signal_connect_object (hbox,
7256 G_CALLBACK (gtk_widget_destroy),
7260 label = gtk_label_new ("<no window state events received>");
7261 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
7262 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
7264 g_signal_connect (window,
7265 "window_state_event",
7266 G_CALLBACK (window_state_callback),
7269 button = gtk_button_new_with_label ("Deiconify");
7270 g_signal_connect_object (button,
7272 G_CALLBACK (gtk_window_deiconify),
7275 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7277 button = gtk_button_new_with_label ("Iconify");
7278 g_signal_connect_object (button,
7280 G_CALLBACK (gtk_window_iconify),
7283 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7285 button = gtk_button_new_with_label ("Fullscreen");
7286 g_signal_connect_object (button,
7288 G_CALLBACK (gtk_window_fullscreen),
7291 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7293 button = gtk_button_new_with_label ("Unfullscreen");
7294 g_signal_connect_object (button,
7296 G_CALLBACK (gtk_window_unfullscreen),
7299 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7301 button = gtk_button_new_with_label ("Present");
7302 g_signal_connect_object (button,
7304 G_CALLBACK (gtk_window_present),
7307 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7309 button = gtk_button_new_with_label ("Show");
7310 g_signal_connect_object (button,
7312 G_CALLBACK (gtk_widget_show),
7315 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7317 gtk_widget_show_all (hbox);
7323 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
7325 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7327 gtk_window_set_keep_above (GTK_WINDOW (data),
7328 gtk_toggle_button_get_active (togglebutton));
7330 if (gtk_toggle_button_get_active (togglebutton))
7331 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7335 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
7337 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7339 gtk_window_set_keep_below (GTK_WINDOW (data),
7340 gtk_toggle_button_get_active (togglebutton));
7342 if (gtk_toggle_button_get_active (togglebutton))
7343 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7348 get_state_controls (GtkWidget *window)
7352 GtkWidget *button_above;
7353 GtkWidget *button_below;
7355 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7357 button = gtk_button_new_with_label ("Stick");
7358 g_signal_connect_object (button,
7360 G_CALLBACK (gtk_window_stick),
7363 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7365 button = gtk_button_new_with_label ("Unstick");
7366 g_signal_connect_object (button,
7368 G_CALLBACK (gtk_window_unstick),
7371 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7373 button = gtk_button_new_with_label ("Maximize");
7374 g_signal_connect_object (button,
7376 G_CALLBACK (gtk_window_maximize),
7379 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7381 button = gtk_button_new_with_label ("Unmaximize");
7382 g_signal_connect_object (button,
7384 G_CALLBACK (gtk_window_unmaximize),
7387 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7389 button = gtk_button_new_with_label ("Iconify");
7390 g_signal_connect_object (button,
7392 G_CALLBACK (gtk_window_iconify),
7395 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7397 button = gtk_button_new_with_label ("Fullscreen");
7398 g_signal_connect_object (button,
7400 G_CALLBACK (gtk_window_fullscreen),
7403 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7405 button = gtk_button_new_with_label ("Unfullscreen");
7406 g_signal_connect_object (button,
7408 G_CALLBACK (gtk_window_unfullscreen),
7411 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7413 button_above = gtk_toggle_button_new_with_label ("Keep above");
7414 g_signal_connect (button_above,
7416 G_CALLBACK (keep_window_above),
7418 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
7420 button_below = gtk_toggle_button_new_with_label ("Keep below");
7421 g_signal_connect (button_below,
7423 G_CALLBACK (keep_window_below),
7425 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
7427 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
7428 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
7430 button = gtk_button_new_with_label ("Hide (withdraw)");
7431 g_signal_connect_object (button,
7433 G_CALLBACK (gtk_widget_hide),
7436 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7438 gtk_widget_show_all (vbox);
7444 create_window_states (GtkWidget *widget)
7446 static GtkWidget *window = NULL;
7449 GtkWidget *iconified;
7451 GtkWidget *controls;
7455 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7456 gtk_window_set_screen (GTK_WINDOW (window),
7457 gtk_widget_get_screen (widget));
7459 g_signal_connect (window, "destroy",
7460 G_CALLBACK (gtk_widget_destroyed),
7463 gtk_window_set_title (GTK_WINDOW (window), "Window states");
7465 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7466 gtk_container_add (GTK_CONTAINER (window), box1);
7468 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7470 gtk_window_set_screen (GTK_WINDOW (iconified),
7471 gtk_widget_get_screen (widget));
7473 g_signal_connect_object (iconified, "destroy",
7474 G_CALLBACK (gtk_widget_destroy),
7477 gtk_window_iconify (GTK_WINDOW (iconified));
7478 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
7479 controls = get_state_controls (iconified);
7480 gtk_container_add (GTK_CONTAINER (iconified), controls);
7482 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7484 gtk_window_set_screen (GTK_WINDOW (normal),
7485 gtk_widget_get_screen (widget));
7487 g_signal_connect_object (normal, "destroy",
7488 G_CALLBACK (gtk_widget_destroy),
7492 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
7493 controls = get_state_controls (normal);
7494 gtk_container_add (GTK_CONTAINER (normal), controls);
7496 label = tracking_label (iconified);
7497 gtk_container_add (GTK_CONTAINER (box1), label);
7499 label = tracking_label (normal);
7500 gtk_container_add (GTK_CONTAINER (box1), label);
7502 gtk_widget_show_all (iconified);
7503 gtk_widget_show_all (normal);
7504 gtk_widget_show_all (box1);
7507 if (!gtk_widget_get_visible (window))
7508 gtk_widget_show (window);
7510 gtk_widget_destroy (window);
7518 configure_event_callback (GtkWidget *widget,
7519 GdkEventConfigure *event,
7522 GtkWidget *label = data;
7526 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
7528 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
7530 event->x, event->y, event->width, event->height,
7533 gtk_label_set_text (GTK_LABEL (label), msg);
7541 get_ints (GtkWidget *window,
7548 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
7549 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
7551 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
7552 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
7556 set_size_callback (GtkWidget *widget,
7561 get_ints (data, &w, &h);
7563 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
7567 unset_default_size_callback (GtkWidget *widget,
7570 gtk_window_set_default_size (g_object_get_data (data, "target"),
7575 set_default_size_callback (GtkWidget *widget,
7580 get_ints (data, &w, &h);
7582 gtk_window_set_default_size (g_object_get_data (data, "target"),
7587 unset_size_request_callback (GtkWidget *widget,
7590 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7595 set_size_request_callback (GtkWidget *widget,
7600 get_ints (data, &w, &h);
7602 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7607 set_location_callback (GtkWidget *widget,
7612 get_ints (data, &x, &y);
7614 gtk_window_move (g_object_get_data (data, "target"), x, y);
7618 move_to_position_callback (GtkWidget *widget,
7624 window = g_object_get_data (data, "target");
7626 gtk_window_get_position (window, &x, &y);
7628 gtk_window_move (window, x, y);
7632 set_geometry_callback (GtkWidget *entry,
7638 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
7640 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
7642 if (!gtk_window_parse_geometry (target, text))
7643 g_print ("Bad geometry string '%s'\n", text);
7649 resizable_callback (GtkWidget *widget,
7652 g_object_set (g_object_get_data (data, "target"),
7653 "resizable", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)),
7658 gravity_selected (GtkWidget *widget,
7661 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
7662 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GDK_GRAVITY_NORTH_WEST);
7666 pos_selected (GtkWidget *widget,
7669 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
7670 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GTK_WIN_POS_NONE);
7674 move_gravity_window_to_current_position (GtkWidget *widget,
7680 window = GTK_WINDOW (data);
7682 gtk_window_get_position (window, &x, &y);
7684 gtk_window_move (window, x, y);
7688 get_screen_corner (GtkWindow *window,
7693 GdkScreen * screen = gtk_window_get_screen (window);
7695 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
7697 switch (gtk_window_get_gravity (window))
7699 case GDK_GRAVITY_SOUTH_EAST:
7700 *x = gdk_screen_get_width (screen) - w;
7701 *y = gdk_screen_get_height (screen) - h;
7704 case GDK_GRAVITY_NORTH_EAST:
7705 *x = gdk_screen_get_width (screen) - w;
7709 case GDK_GRAVITY_SOUTH_WEST:
7711 *y = gdk_screen_get_height (screen) - h;
7714 case GDK_GRAVITY_NORTH_WEST:
7719 case GDK_GRAVITY_SOUTH:
7720 *x = (gdk_screen_get_width (screen) - w) / 2;
7721 *y = gdk_screen_get_height (screen) - h;
7724 case GDK_GRAVITY_NORTH:
7725 *x = (gdk_screen_get_width (screen) - w) / 2;
7729 case GDK_GRAVITY_WEST:
7731 *y = (gdk_screen_get_height (screen) - h) / 2;
7734 case GDK_GRAVITY_EAST:
7735 *x = gdk_screen_get_width (screen) - w;
7736 *y = (gdk_screen_get_height (screen) - h) / 2;
7739 case GDK_GRAVITY_CENTER:
7740 *x = (gdk_screen_get_width (screen) - w) / 2;
7741 *y = (gdk_screen_get_height (screen) - h) / 2;
7744 case GDK_GRAVITY_STATIC:
7745 /* pick some random numbers */
7751 g_assert_not_reached ();
7757 move_gravity_window_to_starting_position (GtkWidget *widget,
7763 window = GTK_WINDOW (data);
7765 get_screen_corner (window,
7768 gtk_window_move (window, x, y);
7772 make_gravity_window (GtkWidget *destroy_with,
7781 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7783 gtk_window_set_screen (GTK_WINDOW (window),
7784 gtk_widget_get_screen (destroy_with));
7786 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7787 gtk_widget_show (vbox);
7789 gtk_container_add (GTK_CONTAINER (window), vbox);
7790 gtk_window_set_title (GTK_WINDOW (window), title);
7791 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
7793 g_signal_connect_object (destroy_with,
7795 G_CALLBACK (gtk_widget_destroy),
7800 button = gtk_button_new_with_mnemonic ("_Move to current position");
7802 g_signal_connect (button, "clicked",
7803 G_CALLBACK (move_gravity_window_to_current_position),
7806 gtk_container_add (GTK_CONTAINER (vbox), button);
7807 gtk_widget_show (button);
7809 button = gtk_button_new_with_mnemonic ("Move to _starting position");
7811 g_signal_connect (button, "clicked",
7812 G_CALLBACK (move_gravity_window_to_starting_position),
7815 gtk_container_add (GTK_CONTAINER (vbox), button);
7816 gtk_widget_show (button);
7818 /* Pretend this is the result of --geometry.
7819 * DO NOT COPY THIS CODE unless you are setting --geometry results,
7820 * and in that case you probably should just use gtk_window_parse_geometry().
7821 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
7822 * you are parsing --geometry or equivalent.
7824 gtk_window_set_geometry_hints (GTK_WINDOW (window),
7828 gtk_window_set_default_size (GTK_WINDOW (window),
7831 get_screen_corner (GTK_WINDOW (window), &x, &y);
7833 gtk_window_move (GTK_WINDOW (window),
7840 do_gravity_test (GtkWidget *widget,
7843 GtkWidget *destroy_with = data;
7846 /* We put a window at each gravity point on the screen. */
7847 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
7849 gtk_widget_show (window);
7851 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
7853 gtk_widget_show (window);
7855 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
7857 gtk_widget_show (window);
7859 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
7861 gtk_widget_show (window);
7863 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
7865 gtk_widget_show (window);
7867 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
7869 gtk_widget_show (window);
7872 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
7874 gtk_widget_show (window);
7877 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
7879 gtk_widget_show (window);
7881 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
7883 gtk_widget_show (window);
7885 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
7887 gtk_widget_show (window);
7891 window_controls (GtkWidget *window)
7893 GtkWidget *control_window;
7898 GtkAdjustment *adjustment;
7903 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7905 gtk_window_set_screen (GTK_WINDOW (control_window),
7906 gtk_widget_get_screen (window));
7908 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
7910 g_object_set_data (G_OBJECT (control_window),
7914 g_signal_connect_object (control_window,
7916 G_CALLBACK (gtk_widget_destroy),
7920 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
7922 gtk_container_add (GTK_CONTAINER (control_window), vbox);
7924 label = gtk_label_new ("<no configure events>");
7925 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
7927 g_signal_connect (window,
7929 G_CALLBACK (configure_event_callback),
7932 adjustment = gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0, 5.0, 0.0);
7933 spin = gtk_spin_button_new (adjustment, 0, 0);
7935 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
7937 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
7939 adjustment = gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0, 5.0, 0.0);
7940 spin = gtk_spin_button_new (adjustment, 0, 0);
7942 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
7944 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
7946 entry = gtk_entry_new ();
7947 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
7949 g_signal_connect (entry, "changed",
7950 G_CALLBACK (set_geometry_callback),
7953 button = gtk_button_new_with_label ("Show gravity test windows");
7954 g_signal_connect_swapped (button,
7956 G_CALLBACK (do_gravity_test),
7958 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7960 button = gtk_button_new_with_label ("Reshow with initial size");
7961 g_signal_connect_object (button,
7963 G_CALLBACK (gtk_window_reshow_with_initial_size),
7966 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7968 button = gtk_button_new_with_label ("Queue resize");
7969 g_signal_connect_object (button,
7971 G_CALLBACK (gtk_widget_queue_resize),
7974 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7976 button = gtk_button_new_with_label ("Resize");
7977 g_signal_connect (button,
7979 G_CALLBACK (set_size_callback),
7981 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7983 button = gtk_button_new_with_label ("Set default size");
7984 g_signal_connect (button,
7986 G_CALLBACK (set_default_size_callback),
7988 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7990 button = gtk_button_new_with_label ("Unset default size");
7991 g_signal_connect (button,
7993 G_CALLBACK (unset_default_size_callback),
7995 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7997 button = gtk_button_new_with_label ("Set size request");
7998 g_signal_connect (button,
8000 G_CALLBACK (set_size_request_callback),
8002 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8004 button = gtk_button_new_with_label ("Unset size request");
8005 g_signal_connect (button,
8007 G_CALLBACK (unset_size_request_callback),
8009 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8011 button = gtk_button_new_with_label ("Move");
8012 g_signal_connect (button,
8014 G_CALLBACK (set_location_callback),
8016 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8018 button = gtk_button_new_with_label ("Move to current position");
8019 g_signal_connect (button,
8021 G_CALLBACK (move_to_position_callback),
8023 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8025 button = gtk_check_button_new_with_label ("Allow resize");
8026 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
8027 g_signal_connect (button,
8029 G_CALLBACK (resizable_callback),
8031 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8033 button = gtk_button_new_with_mnemonic ("_Show");
8034 g_signal_connect_object (button,
8036 G_CALLBACK (gtk_widget_show),
8039 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8041 button = gtk_button_new_with_mnemonic ("_Hide");
8042 g_signal_connect_object (button,
8044 G_CALLBACK (gtk_widget_hide),
8047 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8049 om = gtk_combo_box_text_new ();
8053 static gchar *names[] = {
8054 "GDK_GRAVITY_NORTH_WEST",
8055 "GDK_GRAVITY_NORTH",
8056 "GDK_GRAVITY_NORTH_EAST",
8058 "GDK_GRAVITY_CENTER",
8060 "GDK_GRAVITY_SOUTH_WEST",
8061 "GDK_GRAVITY_SOUTH",
8062 "GDK_GRAVITY_SOUTH_EAST",
8063 "GDK_GRAVITY_STATIC",
8067 g_assert (names[i]);
8068 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (om), names[i]);
8073 g_signal_connect (om,
8075 G_CALLBACK (gravity_selected),
8078 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8081 om = gtk_combo_box_text_new ();
8085 static gchar *names[] = {
8087 "GTK_WIN_POS_CENTER",
8088 "GTK_WIN_POS_MOUSE",
8089 "GTK_WIN_POS_CENTER_ALWAYS",
8090 "GTK_WIN_POS_CENTER_ON_PARENT",
8094 g_assert (names[i]);
8095 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (om), names[i]);
8100 g_signal_connect (om,
8102 G_CALLBACK (pos_selected),
8105 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8107 gtk_widget_show_all (vbox);
8109 return control_window;
8113 create_window_sizing (GtkWidget *widget)
8115 static GtkWidget *window = NULL;
8116 static GtkWidget *target_window = NULL;
8122 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8123 gtk_window_set_screen (GTK_WINDOW (target_window),
8124 gtk_widget_get_screen (widget));
8125 label = gtk_label_new (NULL);
8126 gtk_label_set_markup (GTK_LABEL (label), "<span foreground=\"purple\"><big>Window being resized</big></span>\nBlah blah blah blah\nblah blah blah\nblah blah blah blah blah");
8127 gtk_container_add (GTK_CONTAINER (target_window), label);
8128 gtk_widget_show (label);
8130 g_signal_connect (target_window, "destroy",
8131 G_CALLBACK (gtk_widget_destroyed),
8134 window = window_controls (target_window);
8136 g_signal_connect (window, "destroy",
8137 G_CALLBACK (gtk_widget_destroyed),
8140 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
8143 /* don't show target window by default, we want to allow testing
8144 * of behavior on first show.
8147 if (!gtk_widget_get_visible (window))
8148 gtk_widget_show (window);
8150 gtk_widget_destroy (window);
8157 typedef struct _ProgressData {
8160 GtkWidget *block_spin;
8161 GtkWidget *x_align_spin;
8162 GtkWidget *y_align_spin;
8163 GtkWidget *step_spin;
8164 GtkWidget *act_blocks_spin;
8175 progress_timeout (gpointer data)
8177 ProgressData *pdata = data;
8181 if (pdata->activity)
8183 gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar));
8185 text = g_strdup_printf ("%s", "???");
8189 new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;
8192 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);
8194 text = g_strdup_printf ("%.0f%%", 100 * new_val);
8197 gtk_label_set_text (GTK_LABEL (pdata->label), text);
8204 destroy_progress (GtkWidget *widget,
8205 ProgressData **pdata)
8207 if ((*pdata)->timer)
8209 g_source_remove ((*pdata)->timer);
8210 (*pdata)->timer = 0;
8212 (*pdata)->window = NULL;
8218 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
8220 ProgressData *pdata;
8223 pdata = (ProgressData *) data;
8225 if (!gtk_widget_get_mapped (widget))
8228 i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8230 if (i == 0 || i == 1)
8231 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_HORIZONTAL);
8233 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_VERTICAL);
8235 if (i == 1 || i == 2)
8236 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), TRUE);
8238 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), FALSE);
8242 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
8246 active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8247 gtk_progress_bar_set_show_text (GTK_PROGRESS_BAR (pdata->pbar), active);
8251 progressbar_toggle_ellipsize (GtkWidget *widget,
8254 ProgressData *pdata = data;
8255 if (gtk_widget_is_drawable (widget))
8257 gint i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8258 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar), i);
8263 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
8265 pdata->activity = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8269 toggle_running (GtkWidget *widget, ProgressData *pdata)
8271 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
8273 if (pdata->timer == 0)
8274 pdata->timer = g_timeout_add (100, (GSourceFunc)progress_timeout, pdata);
8278 if (pdata->timer != 0)
8280 g_source_remove (pdata->timer);
8287 entry_changed (GtkWidget *widget, ProgressData *pdata)
8289 gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar),
8290 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
8294 create_progress_bar (GtkWidget *widget)
8296 GtkWidget *action_area, *content_area;
8306 static ProgressData *pdata = NULL;
8308 static gchar *items1[] =
8316 static char *ellipsize_items[] = {
8317 "None", // PANGO_ELLIPSIZE_NONE,
8318 "Start", // PANGO_ELLIPSIZE_START,
8319 "Middle", // PANGO_ELLIPSIZE_MIDDLE,
8320 "End", // PANGO_ELLIPSIZE_END
8324 pdata = g_new0 (ProgressData, 1);
8328 pdata->window = gtk_dialog_new ();
8330 gtk_window_set_screen (GTK_WINDOW (pdata->window),
8331 gtk_widget_get_screen (widget));
8333 gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);
8335 g_signal_connect (pdata->window, "destroy",
8336 G_CALLBACK (destroy_progress),
8340 content_area = gtk_dialog_get_content_area (GTK_DIALOG (pdata->window));
8341 action_area = gtk_dialog_get_action_area (GTK_DIALOG (pdata->window));
8343 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
8344 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
8346 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8347 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
8348 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, TRUE, 0);
8350 frame = gtk_frame_new ("Progress");
8351 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8353 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8354 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8356 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8357 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8359 pdata->pbar = gtk_progress_bar_new ();
8360 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar),
8361 PANGO_ELLIPSIZE_MIDDLE);
8363 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
8365 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8366 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8368 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
8369 gtk_container_add (GTK_CONTAINER (align), hbox);
8370 label = gtk_label_new ("Label updated by user :");
8371 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8372 pdata->label = gtk_label_new ("");
8373 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
8375 frame = gtk_frame_new ("Options");
8376 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8378 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8379 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8381 tab = gtk_table_new (7, 2, FALSE);
8382 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
8384 label = gtk_label_new ("Orientation :");
8385 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
8386 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8388 gtk_widget_set_halign (label, GTK_ALIGN_START);
8389 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
8391 pdata->omenu1 = build_option_menu (items1, 4, 0,
8392 progressbar_toggle_orientation,
8394 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8395 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
8396 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8398 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
8400 check = gtk_check_button_new_with_label ("Running");
8401 g_signal_connect (check, "toggled",
8402 G_CALLBACK (toggle_running),
8404 gtk_table_attach (GTK_TABLE (tab), check, 0, 2, 1, 2,
8405 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8407 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
8409 check = gtk_check_button_new_with_label ("Show text");
8410 g_signal_connect (check, "clicked",
8411 G_CALLBACK (toggle_show_text),
8413 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 2, 3,
8414 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8417 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8418 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 2, 3,
8419 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8422 label = gtk_label_new ("Text: ");
8423 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8425 pdata->entry = gtk_entry_new ();
8426 g_signal_connect (pdata->entry, "changed",
8427 G_CALLBACK (entry_changed),
8429 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
8430 gtk_widget_set_size_request (pdata->entry, 100, -1);
8432 label = gtk_label_new ("Ellipsize text :");
8433 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 10, 11,
8434 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8436 gtk_widget_set_halign (label, GTK_ALIGN_START);
8437 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
8438 pdata->elmenu = build_option_menu (ellipsize_items,
8439 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
8440 2, // PANGO_ELLIPSIZE_MIDDLE
8441 progressbar_toggle_ellipsize,
8443 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8444 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 10, 11,
8445 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8447 gtk_box_pack_start (GTK_BOX (hbox), pdata->elmenu, TRUE, TRUE, 0);
8449 check = gtk_check_button_new_with_label ("Activity mode");
8450 g_signal_connect (check, "clicked",
8451 G_CALLBACK (toggle_activity_mode), pdata);
8452 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 15, 16,
8453 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8456 button = gtk_button_new_with_label ("close");
8457 g_signal_connect_swapped (button, "clicked",
8458 G_CALLBACK (gtk_widget_destroy),
8460 gtk_widget_set_can_default (button, TRUE);
8461 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
8462 gtk_widget_grab_default (button);
8465 if (!gtk_widget_get_visible (pdata->window))
8466 gtk_widget_show_all (pdata->window);
8468 gtk_widget_destroy (pdata->window);
8480 GtkWidget *res_widget;
8484 find_widget (GtkWidget *widget, FindWidgetData *data)
8486 GtkAllocation new_allocation;
8490 gtk_widget_get_allocation (widget, &new_allocation);
8492 if (data->found || !gtk_widget_get_mapped (widget))
8495 /* Note that in the following code, we only count the
8496 * position as being inside a WINDOW widget if it is inside
8497 * widget->window; points that are outside of widget->window
8498 * but within the allocation are not counted. This is consistent
8499 * with the way we highlight drag targets.
8501 if (gtk_widget_get_has_window (widget))
8503 new_allocation.x = 0;
8504 new_allocation.y = 0;
8507 if (gtk_widget_get_parent (widget) && !data->first)
8509 GdkWindow *window = gtk_widget_get_window (widget);
8510 while (window != gtk_widget_get_window (gtk_widget_get_parent (widget)))
8512 gint tx, ty, twidth, theight;
8514 twidth = gdk_window_get_width (window);
8515 theight = gdk_window_get_height (window);
8517 if (new_allocation.x < 0)
8519 new_allocation.width += new_allocation.x;
8520 new_allocation.x = 0;
8522 if (new_allocation.y < 0)
8524 new_allocation.height += new_allocation.y;
8525 new_allocation.y = 0;
8527 if (new_allocation.x + new_allocation.width > twidth)
8528 new_allocation.width = twidth - new_allocation.x;
8529 if (new_allocation.y + new_allocation.height > theight)
8530 new_allocation.height = theight - new_allocation.y;
8532 gdk_window_get_position (window, &tx, &ty);
8533 new_allocation.x += tx;
8535 new_allocation.y += ty;
8538 window = gdk_window_get_parent (window);
8542 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
8543 (data->x < new_allocation.x + new_allocation.width) &&
8544 (data->y < new_allocation.y + new_allocation.height))
8546 /* First, check if the drag is in a valid drop site in
8547 * one of our children
8549 if (GTK_IS_CONTAINER (widget))
8551 FindWidgetData new_data = *data;
8553 new_data.x -= x_offset;
8554 new_data.y -= y_offset;
8555 new_data.found = FALSE;
8556 new_data.first = FALSE;
8558 gtk_container_forall (GTK_CONTAINER (widget),
8559 (GtkCallback)find_widget,
8562 data->found = new_data.found;
8564 data->res_widget = new_data.res_widget;
8567 /* If not, and this widget is registered as a drop site, check to
8568 * emit "drag_motion" to check if we are actually in
8574 data->res_widget = widget;
8580 find_widget_at_pointer (GdkDevice *device)
8582 GtkWidget *widget = NULL;
8583 GdkWindow *pointer_window;
8585 FindWidgetData data;
8587 pointer_window = gdk_device_get_window_at_position (device, NULL, NULL);
8591 gpointer widget_ptr;
8593 gdk_window_get_user_data (pointer_window, &widget_ptr);
8594 widget = widget_ptr;
8599 gdk_window_get_pointer (gtk_widget_get_window (widget),
8607 find_widget (widget, &data);
8609 return data.res_widget;
8615 struct PropertiesData {
8623 destroy_properties (GtkWidget *widget,
8624 struct PropertiesData *data)
8628 *data->window = NULL;
8629 data->window = NULL;
8634 g_object_unref (data->cursor);
8635 data->cursor = NULL;
8640 g_signal_handler_disconnect (widget, data->handler);
8648 property_query_event (GtkWidget *widget,
8650 struct PropertiesData *data)
8652 GtkWidget *res_widget = NULL;
8654 if (!data->in_query)
8657 if (event->type == GDK_BUTTON_RELEASE)
8659 gtk_grab_remove (widget);
8660 gdk_device_ungrab (gdk_event_get_device (event), GDK_CURRENT_TIME);
8662 res_widget = find_widget_at_pointer (gdk_event_get_device (event));
8665 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
8666 gtk_widget_get_screen (widget));
8667 create_prop_editor (G_OBJECT (res_widget), 0);
8670 data->in_query = FALSE;
8677 query_properties (GtkButton *button,
8678 struct PropertiesData *data)
8680 GtkWidget *widget = GTK_WIDGET (button);
8681 GdkDisplay *display;
8682 GdkDeviceManager *device_manager;
8685 g_signal_connect (button, "event",
8686 G_CALLBACK (property_query_event), data);
8688 display = gtk_widget_get_display (widget);
8691 data->cursor = gdk_cursor_new_for_display (display, GDK_TARGET);
8693 device_manager = gdk_display_get_device_manager (display);
8694 device = gdk_device_manager_get_client_pointer (device_manager);
8695 gdk_device_grab (device,
8696 gtk_widget_get_window (widget),
8699 GDK_BUTTON_RELEASE_MASK,
8702 gtk_grab_add (widget);
8704 data->in_query = TRUE;
8708 create_properties (GtkWidget *widget)
8710 static GtkWidget *window = NULL;
8714 struct PropertiesData *data;
8716 data = g_new (struct PropertiesData, 1);
8717 data->window = &window;
8718 data->in_query = FALSE;
8719 data->cursor = NULL;
8724 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8726 gtk_window_set_screen (GTK_WINDOW (window),
8727 gtk_widget_get_screen (widget));
8729 data->handler = g_signal_connect (window, "destroy",
8730 G_CALLBACK (destroy_properties),
8733 gtk_window_set_title (GTK_WINDOW (window), "test properties");
8734 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
8736 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1);
8737 gtk_container_add (GTK_CONTAINER (window), vbox);
8739 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
8740 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
8742 button = gtk_button_new_with_label ("Query properties");
8743 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8744 g_signal_connect (button, "clicked",
8745 G_CALLBACK (query_properties),
8749 if (!gtk_widget_get_visible (window))
8750 gtk_widget_show_all (window);
8752 gtk_widget_destroy (window);
8756 struct SnapshotData {
8757 GtkWidget *toplevel_button;
8761 gboolean is_toplevel;
8766 destroy_snapshot_data (GtkWidget *widget,
8767 struct SnapshotData *data)
8770 *data->window = NULL;
8774 g_object_unref (data->cursor);
8775 data->cursor = NULL;
8780 g_signal_handler_disconnect (widget, data->handler);
8788 snapshot_widget_event (GtkWidget *widget,
8790 struct SnapshotData *data)
8792 GtkWidget *res_widget = NULL;
8794 if (!data->in_query)
8797 if (event->type == GDK_BUTTON_RELEASE)
8799 gtk_grab_remove (widget);
8800 gdk_device_ungrab (gdk_event_get_device (event),
8803 res_widget = find_widget_at_pointer (gdk_event_get_device (event));
8804 if (data->is_toplevel && res_widget)
8805 res_widget = gtk_widget_get_toplevel (res_widget);
8808 cairo_surface_t *surface;
8809 GtkWidget *window, *image;
8814 width = gtk_widget_get_allocated_width (res_widget);
8815 height = gtk_widget_get_allocated_height (res_widget);
8817 surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
8819 cr = cairo_create (surface);
8820 gtk_widget_draw (res_widget, cr);
8823 pixbuf = gdk_pixbuf_get_from_surface (surface,
8826 cairo_surface_destroy (surface);
8828 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8829 image = gtk_image_new_from_pixbuf (pixbuf);
8830 g_object_unref (pixbuf);
8832 gtk_container_add (GTK_CONTAINER (window), image);
8833 gtk_widget_show_all (window);
8836 data->in_query = FALSE;
8843 snapshot_widget (GtkButton *button,
8844 struct SnapshotData *data)
8846 GtkWidget *widget = GTK_WIDGET (button);
8849 device = gtk_get_current_event_device ();
8853 if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
8854 device = gdk_device_get_associated_device (device);
8856 data->is_toplevel = widget == data->toplevel_button;
8859 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget),
8862 gdk_device_grab (device,
8863 gtk_widget_get_window (widget),
8864 GDK_OWNERSHIP_APPLICATION,
8866 GDK_BUTTON_RELEASE_MASK,
8870 g_signal_connect (button, "event",
8871 G_CALLBACK (snapshot_widget_event), data);
8873 gtk_grab_add (widget);
8875 data->in_query = TRUE;
8879 create_snapshot (GtkWidget *widget)
8881 static GtkWidget *window = NULL;
8884 struct SnapshotData *data;
8886 data = g_new (struct SnapshotData, 1);
8887 data->window = &window;
8888 data->in_query = FALSE;
8889 data->cursor = NULL;
8894 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8896 gtk_window_set_screen (GTK_WINDOW (window),
8897 gtk_widget_get_screen (widget));
8899 data->handler = g_signal_connect (window, "destroy",
8900 G_CALLBACK (destroy_snapshot_data),
8903 gtk_window_set_title (GTK_WINDOW (window), "test snapshot");
8904 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
8906 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1);
8907 gtk_container_add (GTK_CONTAINER (window), vbox);
8909 button = gtk_button_new_with_label ("Snapshot widget");
8910 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8911 g_signal_connect (button, "clicked",
8912 G_CALLBACK (snapshot_widget),
8915 button = gtk_button_new_with_label ("Snapshot toplevel");
8916 data->toplevel_button = button;
8917 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8918 g_signal_connect (button, "clicked",
8919 G_CALLBACK (snapshot_widget),
8923 if (!gtk_widget_get_visible (window))
8924 gtk_widget_show_all (window);
8926 gtk_widget_destroy (window);
8935 selection_test_received (GtkWidget *tree_view,
8936 GtkSelectionData *selection_data)
8938 GtkTreeModel *model;
8939 GtkListStore *store;
8943 if (gtk_selection_data_get_length (selection_data) < 0)
8945 g_print ("Selection retrieval failed\n");
8948 if (gtk_selection_data_get_data_type (selection_data) != GDK_SELECTION_TYPE_ATOM)
8950 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
8954 /* Clear out any current list items */
8956 model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
8957 store = GTK_LIST_STORE (model);
8958 gtk_list_store_clear (store);
8960 /* Add new items to list */
8962 gtk_selection_data_get_targets (selection_data,
8965 for (i = 0; i < l; i++)
8970 name = gdk_atom_name (atoms[i]);
8973 gtk_list_store_insert_with_values (store, &iter, i, 0, name, -1);
8977 gtk_list_store_insert_with_values (store, &iter, i, 0, "(bad atom)", -1);
8984 selection_test_get_targets (GtkWidget *widget, GtkWidget *tree_view)
8986 static GdkAtom targets_atom = GDK_NONE;
8988 if (targets_atom == GDK_NONE)
8989 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
8991 gtk_selection_convert (tree_view, GDK_SELECTION_PRIMARY, targets_atom,
8996 create_selection_test (GtkWidget *widget)
8998 static GtkWidget *window = NULL;
8999 GtkWidget *action_area, *content_area;
9002 GtkWidget *scrolled_win;
9003 GtkListStore* store;
9004 GtkWidget *tree_view;
9005 GtkTreeViewColumn *column;
9006 GtkCellRenderer *renderer;
9011 window = gtk_dialog_new ();
9013 gtk_window_set_screen (GTK_WINDOW (window),
9014 gtk_widget_get_screen (widget));
9016 g_signal_connect (window, "destroy",
9017 G_CALLBACK (gtk_widget_destroyed),
9020 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9021 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9023 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
9024 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9026 /* Create the list */
9028 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
9029 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9030 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
9032 label = gtk_label_new ("Gets available targets for current selection");
9033 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9035 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
9036 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
9037 GTK_POLICY_AUTOMATIC,
9038 GTK_POLICY_AUTOMATIC);
9039 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
9040 gtk_widget_set_size_request (scrolled_win, 100, 200);
9042 store = gtk_list_store_new (1, G_TYPE_STRING);
9043 tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
9044 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), tree_view);
9046 renderer = gtk_cell_renderer_text_new ();
9047 column = gtk_tree_view_column_new_with_attributes ("Target", renderer,
9049 gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
9051 g_signal_connect (tree_view, "selection_received",
9052 G_CALLBACK (selection_test_received), NULL);
9054 /* .. And create some buttons */
9055 button = gtk_button_new_with_label ("Get Targets");
9056 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9058 g_signal_connect (button, "clicked",
9059 G_CALLBACK (selection_test_get_targets), tree_view);
9061 button = gtk_button_new_with_label ("Quit");
9062 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9064 g_signal_connect_swapped (button, "clicked",
9065 G_CALLBACK (gtk_widget_destroy),
9069 if (!gtk_widget_get_visible (window))
9070 gtk_widget_show_all (window);
9072 gtk_widget_destroy (window);
9079 static int scroll_test_pos = 0.0;
9082 scroll_test_draw (GtkWidget *widget,
9084 GtkAdjustment *adjustment)
9087 gint imin, imax, jmin, jmax;
9090 gdk_cairo_get_clip_rectangle (cr, &clip);
9092 imin = (clip.x) / 10;
9093 imax = (clip.x + clip.width + 9) / 10;
9095 jmin = ((int)gtk_adjustment_get_value (adjustment) + clip.y) / 10;
9096 jmax = ((int)gtk_adjustment_get_value (adjustment) + clip.y + clip.height + 9) / 10;
9098 for (i=imin; i<imax; i++)
9099 for (j=jmin; j<jmax; j++)
9101 cairo_rectangle (cr, 10*i, 10*j - (int)gtk_adjustment_get_value (adjustment), 1+i%10, 1+j%10);
9109 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
9110 GtkAdjustment *adjustment)
9112 gdouble new_value = gtk_adjustment_get_value (adjustment) + ((event->direction == GDK_SCROLL_UP) ?
9113 -gtk_adjustment_get_page_increment (adjustment) / 2:
9114 gtk_adjustment_get_page_increment (adjustment) / 2);
9115 new_value = CLAMP (new_value, gtk_adjustment_get_lower (adjustment), gtk_adjustment_get_upper (adjustment) - gtk_adjustment_get_page_size (adjustment));
9116 gtk_adjustment_set_value (adjustment, new_value);
9122 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
9123 GtkAdjustment *adjustment)
9125 GtkAllocation allocation;
9127 gtk_widget_get_allocation (widget, &allocation);
9128 gtk_adjustment_configure (adjustment,
9129 gtk_adjustment_get_value (adjustment),
9130 gtk_adjustment_get_lower (adjustment),
9131 gtk_adjustment_get_upper (adjustment),
9132 0.1 * allocation.height,
9133 0.9 * allocation.height,
9138 scroll_test_adjustment_changed (GtkAdjustment *adjustment, GtkWidget *widget)
9143 dy = scroll_test_pos - (int)gtk_adjustment_get_value (adjustment);
9144 scroll_test_pos = gtk_adjustment_get_value (adjustment);
9146 if (!gtk_widget_is_drawable (widget))
9149 window = gtk_widget_get_window (widget);
9150 gdk_window_scroll (window, 0, dy);
9151 gdk_window_process_updates (window, FALSE);
9156 create_scroll_test (GtkWidget *widget)
9158 static GtkWidget *window = NULL;
9159 GtkWidget *action_area, *content_area;
9161 GtkWidget *drawing_area;
9162 GtkWidget *scrollbar;
9164 GtkAdjustment *adjustment;
9165 GdkGeometry geometry;
9166 GdkWindowHints geometry_mask;
9170 window = gtk_dialog_new ();
9172 gtk_window_set_screen (GTK_WINDOW (window),
9173 gtk_widget_get_screen (widget));
9175 g_signal_connect (window, "destroy",
9176 G_CALLBACK (gtk_widget_destroyed),
9179 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9180 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9182 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
9183 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9185 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
9186 gtk_box_pack_start (GTK_BOX (content_area), hbox, TRUE, TRUE, 0);
9187 gtk_widget_show (hbox);
9189 drawing_area = gtk_drawing_area_new ();
9190 gtk_widget_set_size_request (drawing_area, 200, 200);
9191 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
9192 gtk_widget_show (drawing_area);
9194 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
9196 adjustment = gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0);
9197 scroll_test_pos = 0.0;
9199 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, adjustment);
9200 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
9201 gtk_widget_show (scrollbar);
9203 g_signal_connect (drawing_area, "draw",
9204 G_CALLBACK (scroll_test_draw), adjustment);
9205 g_signal_connect (drawing_area, "configure_event",
9206 G_CALLBACK (scroll_test_configure), adjustment);
9207 g_signal_connect (drawing_area, "scroll_event",
9208 G_CALLBACK (scroll_test_scroll), adjustment);
9210 g_signal_connect (adjustment, "value_changed",
9211 G_CALLBACK (scroll_test_adjustment_changed),
9214 /* .. And create some buttons */
9216 button = gtk_button_new_with_label ("Quit");
9217 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9219 g_signal_connect_swapped (button, "clicked",
9220 G_CALLBACK (gtk_widget_destroy),
9222 gtk_widget_show (button);
9224 /* Set up gridded geometry */
9226 geometry_mask = GDK_HINT_MIN_SIZE |
9227 GDK_HINT_BASE_SIZE |
9228 GDK_HINT_RESIZE_INC;
9230 geometry.min_width = 20;
9231 geometry.min_height = 20;
9232 geometry.base_width = 0;
9233 geometry.base_height = 0;
9234 geometry.width_inc = 10;
9235 geometry.height_inc = 10;
9237 gtk_window_set_geometry_hints (GTK_WINDOW (window),
9238 drawing_area, &geometry, geometry_mask);
9241 if (!gtk_widget_get_visible (window))
9242 gtk_widget_show (window);
9244 gtk_widget_destroy (window);
9251 static int timer = 0;
9254 timeout_test (GtkWidget *label)
9256 static int count = 0;
9257 static char buffer[32];
9259 sprintf (buffer, "count: %d", ++count);
9260 gtk_label_set_text (GTK_LABEL (label), buffer);
9266 start_timeout_test (GtkWidget *widget,
9271 timer = g_timeout_add (100, (GSourceFunc)timeout_test, label);
9276 stop_timeout_test (GtkWidget *widget,
9281 g_source_remove (timer);
9287 destroy_timeout_test (GtkWidget *widget,
9290 stop_timeout_test (NULL, NULL);
9296 create_timeout_test (GtkWidget *widget)
9298 static GtkWidget *window = NULL;
9299 GtkWidget *action_area, *content_area;
9305 window = gtk_dialog_new ();
9307 gtk_window_set_screen (GTK_WINDOW (window),
9308 gtk_widget_get_screen (widget));
9310 g_signal_connect (window, "destroy",
9311 G_CALLBACK (destroy_timeout_test),
9314 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9315 action_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9317 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
9318 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9320 label = gtk_label_new ("count: 0");
9321 g_object_set (label, "margin", 10, NULL);
9322 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9323 gtk_widget_show (label);
9325 button = gtk_button_new_with_label ("close");
9326 g_signal_connect_swapped (button, "clicked",
9327 G_CALLBACK (gtk_widget_destroy),
9329 gtk_widget_set_can_default (button, TRUE);
9330 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9331 gtk_widget_grab_default (button);
9332 gtk_widget_show (button);
9334 button = gtk_button_new_with_label ("start");
9335 g_signal_connect (button, "clicked",
9336 G_CALLBACK(start_timeout_test),
9338 gtk_widget_set_can_default (button, TRUE);
9339 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9340 gtk_widget_show (button);
9342 button = gtk_button_new_with_label ("stop");
9343 g_signal_connect (button, "clicked",
9344 G_CALLBACK (stop_timeout_test),
9346 gtk_widget_set_can_default (button, TRUE);
9347 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9348 gtk_widget_show (button);
9351 if (!gtk_widget_get_visible (window))
9352 gtk_widget_show (window);
9354 gtk_widget_destroy (window);
9361 static int idle_id = 0;
9364 idle_test (GtkWidget *label)
9366 static int count = 0;
9367 static char buffer[32];
9369 sprintf (buffer, "count: %d", ++count);
9370 gtk_label_set_text (GTK_LABEL (label), buffer);
9376 start_idle_test (GtkWidget *widget,
9381 idle_id = g_idle_add ((GSourceFunc) idle_test, label);
9386 stop_idle_test (GtkWidget *widget,
9391 g_source_remove (idle_id);
9397 destroy_idle_test (GtkWidget *widget,
9400 stop_idle_test (NULL, NULL);
9406 toggle_idle_container (GObject *button,
9407 GtkContainer *container)
9409 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
9413 create_idle_test (GtkWidget *widget)
9415 static GtkWidget *window = NULL;
9418 GtkWidget *container;
9422 GtkWidget *action_area, *content_area;
9427 window = gtk_dialog_new ();
9429 gtk_window_set_screen (GTK_WINDOW (window),
9430 gtk_widget_get_screen (widget));
9432 g_signal_connect (window, "destroy",
9433 G_CALLBACK (destroy_idle_test),
9436 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9437 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9439 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
9440 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9442 label = gtk_label_new ("count: 0");
9443 g_object_set (label, "margin", 10, NULL);
9444 gtk_widget_show (label);
9447 g_object_new (GTK_TYPE_BOX,
9449 /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
9450 * "GtkWidget::visible", TRUE,
9455 gtk_box_pack_start (GTK_BOX (content_area), container, TRUE, TRUE, 0);
9458 g_object_new (GTK_TYPE_FRAME,
9460 "label", "Label Container",
9462 "parent", content_area,
9465 g_object_new (GTK_TYPE_BOX,
9468 "orientation", GTK_ORIENTATION_VERTICAL,
9471 g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
9472 "label", "Resize-Parent",
9473 "user_data", (void*)GTK_RESIZE_PARENT,
9477 "signal::clicked", toggle_idle_container, container,
9479 button = g_object_new (GTK_TYPE_RADIO_BUTTON,
9480 "label", "Resize-Queue",
9481 "user_data", (void*)GTK_RESIZE_QUEUE,
9486 g_object_connect (button,
9487 "signal::clicked", toggle_idle_container, container,
9489 button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
9490 "label", "Resize-Immediate",
9491 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
9493 g_object_connect (button2,
9494 "signal::clicked", toggle_idle_container, container,
9496 g_object_set (button2,
9502 button = gtk_button_new_with_label ("close");
9503 g_signal_connect_swapped (button, "clicked",
9504 G_CALLBACK (gtk_widget_destroy),
9506 gtk_widget_set_can_default (button, TRUE);
9507 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9508 gtk_widget_grab_default (button);
9509 gtk_widget_show (button);
9511 button = gtk_button_new_with_label ("start");
9512 g_signal_connect (button, "clicked",
9513 G_CALLBACK (start_idle_test),
9515 gtk_widget_set_can_default (button, TRUE);
9516 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9517 gtk_widget_show (button);
9519 button = gtk_button_new_with_label ("stop");
9520 g_signal_connect (button, "clicked",
9521 G_CALLBACK (stop_idle_test),
9523 gtk_widget_set_can_default (button, TRUE);
9524 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9525 gtk_widget_show (button);
9528 if (!gtk_widget_get_visible (window))
9529 gtk_widget_show (window);
9531 gtk_widget_destroy (window);
9539 create_rc_file (GtkWidget *widget)
9541 static GtkWidget *window = NULL;
9542 GtkWidget *action_area, *content_area;
9550 window = gtk_dialog_new ();
9552 gtk_window_set_screen (GTK_WINDOW (window),
9553 gtk_widget_get_screen (widget));
9555 g_signal_connect (window, "destroy",
9556 G_CALLBACK (gtk_widget_destroyed),
9559 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9560 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9562 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
9563 gtk_box_pack_start (GTK_BOX (content_area), frame, FALSE, FALSE, 0);
9565 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
9566 gtk_container_add (GTK_CONTAINER (frame), vbox);
9568 label = gtk_label_new ("This label should be red");
9569 gtk_widget_set_name (label, "testgtk-red-label");
9570 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9572 label = gtk_label_new ("This label should be green");
9573 gtk_widget_set_name (label, "testgtk-green-label");
9574 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9576 label = gtk_label_new ("This label should be blue");
9577 gtk_widget_set_name (label, "testgtk-blue-label");
9578 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9580 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
9581 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9583 button = gtk_button_new_with_label ("Reload");
9584 g_signal_connect_swapped (button, "clicked",
9585 G_CALLBACK (gtk_style_context_reset_widgets),
9586 gtk_widget_get_screen (button));
9587 gtk_widget_set_can_default (button, TRUE);
9588 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9589 gtk_widget_grab_default (button);
9591 button = gtk_button_new_with_label ("Close");
9592 g_signal_connect_swapped (button, "clicked",
9593 G_CALLBACK (gtk_widget_destroy),
9595 gtk_widget_set_can_default (button, TRUE);
9596 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9599 if (!gtk_widget_get_visible (window))
9600 gtk_widget_show_all (window);
9602 gtk_widget_destroy (window);
9606 * Test of recursive mainloop
9610 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
9617 create_mainloop (GtkWidget *widget)
9619 static GtkWidget *window = NULL;
9620 GtkWidget *action_area, *content_area;
9626 window = gtk_dialog_new ();
9628 gtk_window_set_screen (GTK_WINDOW (window),
9629 gtk_widget_get_screen (widget));
9631 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
9633 g_signal_connect (window, "destroy",
9634 G_CALLBACK (mainloop_destroyed),
9637 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9638 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9640 label = gtk_label_new ("In recursive main loop...");
9641 g_object_set (label, "margin", 20, NULL);
9643 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9644 gtk_widget_show (label);
9646 button = gtk_button_new_with_label ("Leave");
9647 gtk_box_pack_start (GTK_BOX (action_area), button, FALSE, TRUE, 0);
9649 g_signal_connect_swapped (button, "clicked",
9650 G_CALLBACK (gtk_widget_destroy),
9653 gtk_widget_set_can_default (button, TRUE);
9654 gtk_widget_grab_default (button);
9656 gtk_widget_show (button);
9659 if (!gtk_widget_get_visible (window))
9661 gtk_widget_show (window);
9663 g_print ("create_mainloop: start\n");
9665 g_print ("create_mainloop: done\n");
9668 gtk_widget_destroy (window);
9672 layout_draw_handler (GtkWidget *widget, cairo_t *cr)
9675 GdkWindow *bin_window;
9678 gint imin, imax, jmin, jmax;
9680 layout = GTK_LAYOUT (widget);
9681 bin_window = gtk_layout_get_bin_window (layout);
9683 if (!gtk_cairo_should_draw_window (cr, bin_window))
9686 gdk_window_get_position (bin_window, &x, &y);
9687 cairo_translate (cr, x, y);
9689 gdk_cairo_get_clip_rectangle (cr, &clip);
9691 imin = (clip.x) / 10;
9692 imax = (clip.x + clip.width + 9) / 10;
9694 jmin = (clip.y) / 10;
9695 jmax = (clip.y + clip.height + 9) / 10;
9697 for (i=imin; i<imax; i++)
9698 for (j=jmin; j<jmax; j++)
9700 cairo_rectangle (cr,
9709 void create_layout (GtkWidget *widget)
9711 GtkAdjustment *hadjustment, *vadjustment;
9713 static GtkWidget *window = NULL;
9714 GtkWidget *layout_widget;
9715 GtkWidget *scrolledwindow;
9724 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9725 gtk_window_set_screen (GTK_WINDOW (window),
9726 gtk_widget_get_screen (widget));
9728 g_signal_connect (window, "destroy",
9729 G_CALLBACK (gtk_widget_destroyed),
9732 gtk_window_set_title (GTK_WINDOW (window), "Layout");
9733 gtk_widget_set_size_request (window, 200, 200);
9735 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
9736 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
9738 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
9739 GTK_CORNER_TOP_RIGHT);
9741 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
9743 layout_widget = gtk_layout_new (NULL, NULL);
9744 layout = GTK_LAYOUT (layout_widget);
9745 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout_widget);
9747 /* We set step sizes here since GtkLayout does not set
9750 hadjustment = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (layout));
9751 vadjustment = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (layout));
9752 gtk_adjustment_set_step_increment (hadjustment, 10.0);
9753 gtk_adjustment_set_step_increment (vadjustment, 10.0);
9754 gtk_scrollable_set_hadjustment (GTK_SCROLLABLE (layout), hadjustment);
9755 gtk_scrollable_set_vadjustment (GTK_SCROLLABLE (layout), vadjustment);
9757 gtk_widget_set_events (layout_widget, GDK_EXPOSURE_MASK);
9758 g_signal_connect (layout, "draw",
9759 G_CALLBACK (layout_draw_handler), NULL);
9761 gtk_layout_set_size (layout, 1600, 128000);
9763 for (i=0 ; i < 16 ; i++)
9764 for (j=0 ; j < 16 ; j++)
9766 sprintf(buf, "Button %d, %d", i, j);
9768 button = gtk_button_new_with_label (buf);
9770 button = gtk_label_new (buf);
9772 gtk_layout_put (layout, button, j*100, i*100);
9775 for (i=16; i < 1280; i++)
9777 sprintf(buf, "Button %d, %d", i, 0);
9779 button = gtk_button_new_with_label (buf);
9781 button = gtk_label_new (buf);
9783 gtk_layout_put (layout, button, 0, i*100);
9787 if (!gtk_widget_get_visible (window))
9788 gtk_widget_show_all (window);
9790 gtk_widget_destroy (window);
9794 /* FIXME: need to completely redo this for GtkStyleContext */
9796 create_styles (GtkWidget *widget)
9798 static GtkWidget *window = NULL;
9799 GtkWidget *content_area, *action_area;
9804 static GdkRGBA red = { 1,0,0,1 };
9805 static GdkRGBA green = { 0,1,0,1 };
9806 static GdkRGBA blue = { 0,0,1,1 };
9807 static GdkRGBA yellow = { 1,1,0,1 };
9808 static GdkRGBA cyan = { 0,1,1,1 };
9809 PangoFontDescription *font_desc;
9811 GtkRcStyle *rc_style;
9815 window = gtk_dialog_new ();
9816 gtk_window_set_screen (GTK_WINDOW (window),
9817 gtk_widget_get_screen (widget));
9819 g_signal_connect (window, "destroy",
9820 G_CALLBACK (gtk_widget_destroyed),
9823 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9824 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9826 button = gtk_button_new_with_label ("Close");
9827 g_signal_connect_swapped (button, "clicked",
9828 G_CALLBACK (gtk_widget_destroy),
9830 gtk_widget_set_can_default (button, TRUE);
9831 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9832 gtk_widget_show (button);
9834 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
9835 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9836 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, FALSE, 0);
9838 label = gtk_label_new ("Font:");
9839 gtk_widget_set_halign (label, GTK_ALIGN_START);
9840 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9841 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9843 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
9845 button = gtk_button_new_with_label ("Some Text");
9846 gtk_widget_override_font (gtk_bin_get_child (GTK_BIN (button)), font_desc);
9847 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9849 label = gtk_label_new ("Foreground:");
9850 gtk_widget_set_halign (label, GTK_ALIGN_START);
9851 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9852 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9854 button = gtk_button_new_with_label ("Some Text");
9855 gtk_widget_override_color (gtk_bin_get_child (GTK_BIN (button)), 0, &red);
9856 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9858 label = gtk_label_new ("Background:");
9859 gtk_widget_set_halign (label, GTK_ALIGN_START);
9860 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9861 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9863 button = gtk_button_new_with_label ("Some Text");
9864 gtk_widget_override_background_color (button, 0, &green);
9865 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9867 label = gtk_label_new ("Text:");
9868 gtk_widget_set_halign (label, GTK_ALIGN_START);
9869 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9870 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9872 entry = gtk_entry_new ();
9873 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9874 gtk_widget_override_color (entry, 0, &blue);
9875 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9877 label = gtk_label_new ("Base:");
9878 gtk_widget_set_halign (label, GTK_ALIGN_START);
9879 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9880 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9882 entry = gtk_entry_new ();
9883 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9884 gtk_widget_override_background_color (entry, 0, &yellow);
9885 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9887 label = gtk_label_new ("Cursor:");
9888 gtk_widget_set_halign (label, GTK_ALIGN_START);
9889 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9890 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9892 entry = gtk_entry_new ();
9893 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9894 gtk_widget_modify_cursor (entry, &red, &red);
9895 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9897 label = gtk_label_new ("Multiple:");
9898 gtk_widget_set_halign (label, GTK_ALIGN_START);
9899 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9900 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9902 button = gtk_button_new_with_label ("Some Text");
9904 rc_style = gtk_rc_style_new ();
9906 rc_style->font_desc = pango_font_description_copy (font_desc);
9907 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
9908 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
9909 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
9910 rc_style->fg[GTK_STATE_NORMAL] = yellow;
9911 rc_style->bg[GTK_STATE_NORMAL] = blue;
9912 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
9913 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
9914 rc_style->fg[GTK_STATE_ACTIVE] = red;
9915 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
9916 rc_style->xthickness = 5;
9917 rc_style->ythickness = 5;
9919 gtk_widget_modify_style (button, rc_style);
9920 gtk_widget_modify_style (gtk_bin_get_child (GTK_BIN (button)), rc_style);
9922 g_object_unref (rc_style);
9924 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9927 if (!gtk_widget_get_visible (window))
9928 gtk_widget_show_all (window);
9930 gtk_widget_destroy (window);
9935 * Main Window and Exit
9939 do_exit (GtkWidget *widget, GtkWidget *window)
9941 gtk_widget_destroy (window);
9947 void (*func) (GtkWidget *widget);
9948 gboolean do_not_benchmark;
9951 { "alpha window", create_alpha_window },
9952 { "big windows", create_big_windows },
9953 { "button box", create_button_box },
9954 { "buttons", create_buttons },
9955 { "check buttons", create_check_buttons },
9956 { "color selection", create_color_selection },
9957 { "composited window", create_composited_window },
9958 { "cursors", create_cursors },
9959 { "dialog", create_dialog },
9960 { "display & screen", create_display_screen, TRUE },
9961 { "entry", create_entry },
9962 { "event box", create_event_box },
9963 { "event watcher", create_event_watcher },
9964 { "expander", create_expander },
9965 { "flipping", create_flipping },
9966 { "focus", create_focus },
9967 { "font selection", create_font_selection },
9968 { "handle box", create_handle_box },
9969 { "image", create_image },
9970 { "key lookup", create_key_lookup },
9971 { "labels", create_labels },
9972 { "layout", create_layout },
9973 { "menus", create_menus },
9974 { "message dialog", create_message_dialog },
9975 { "modal window", create_modal_window, TRUE },
9976 { "notebook", create_notebook },
9977 { "panes", create_panes },
9978 { "paned keyboard", create_paned_keyboard_navigation },
9979 { "pixbuf", create_pixbuf },
9980 { "progress bar", create_progress_bar },
9981 { "properties", create_properties },
9982 { "radio buttons", create_radio_buttons },
9983 { "range controls", create_range_controls },
9984 { "rc file", create_rc_file },
9985 { "reparent", create_reparent },
9986 { "resize grips", create_resize_grips },
9987 { "rotated label", create_rotated_label },
9988 { "rotated text", create_rotated_text },
9989 { "saved position", create_saved_position },
9990 { "scrolled windows", create_scrolled_windows },
9991 { "shapes", create_shapes },
9992 { "size groups", create_size_groups },
9993 { "snapshot", create_snapshot },
9994 { "spinbutton", create_spins },
9995 { "statusbar", create_statusbar },
9997 { "styles", create_styles },
9999 { "test idle", create_idle_test },
10000 { "test mainloop", create_mainloop, TRUE },
10001 { "test scrolling", create_scroll_test },
10002 { "test selection", create_selection_test },
10003 { "test timeout", create_timeout_test },
10004 { "toggle buttons", create_toggle_buttons },
10005 { "toolbar", create_toolbar },
10006 { "tooltips", create_tooltips },
10007 { "WM hints", create_wmhints },
10008 { "window sizing", create_window_sizing },
10009 { "window states", create_window_states }
10011 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
10014 create_main_window (void)
10019 GtkWidget *scrolled_window;
10023 GtkWidget *separator;
10024 GdkGeometry geometry;
10027 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10028 gtk_widget_set_name (window, "main_window");
10029 gtk_window_move (GTK_WINDOW (window), 50, 20);
10030 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
10032 geometry.min_width = -1;
10033 geometry.min_height = -1;
10034 geometry.max_width = -1;
10035 geometry.max_height = G_MAXSHORT;
10036 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
10038 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
10040 g_signal_connect (window, "destroy",
10041 G_CALLBACK (gtk_main_quit),
10043 g_signal_connect (window, "delete-event",
10044 G_CALLBACK (gtk_false),
10047 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
10048 gtk_container_add (GTK_CONTAINER (window), box1);
10050 if (gtk_micro_version > 0)
10053 gtk_get_major_version (),
10054 gtk_get_minor_version (),
10055 gtk_get_micro_version ());
10059 gtk_get_major_version (),
10060 gtk_get_minor_version ());
10062 label = gtk_label_new (buffer);
10063 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
10064 gtk_widget_set_name (label, "testgtk-version-label");
10066 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
10067 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
10068 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
10070 GTK_POLICY_AUTOMATIC);
10071 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
10073 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
10074 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10075 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
10076 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
10077 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
10078 gtk_widget_show (box2);
10080 for (i = 0; i < nbuttons; i++)
10082 button = gtk_button_new_with_label (buttons[i].label);
10083 if (buttons[i].func)
10084 g_signal_connect (button,
10086 G_CALLBACK(buttons[i].func),
10089 gtk_widget_set_sensitive (button, FALSE);
10090 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10093 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
10094 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
10096 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
10097 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10098 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
10100 button = gtk_button_new_with_mnemonic ("_Close");
10101 g_signal_connect (button, "clicked",
10102 G_CALLBACK (do_exit),
10104 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10105 gtk_widget_set_can_default (button, TRUE);
10106 gtk_widget_grab_default (button);
10108 gtk_widget_show_all (window);
10114 if (g_file_test ("../modules/input/immodules.cache", G_FILE_TEST_EXISTS))
10115 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/immodules.cache", TRUE);
10119 pad (const char *str, int to)
10121 static char buf[256];
10122 int len = strlen (str);
10125 for (i = 0; i < to; i++)
10130 memcpy (buf, str, len);
10136 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
10138 fn (widget); /* on */
10139 while (g_main_context_iteration (NULL, FALSE));
10140 fn (widget); /* off */
10141 while (g_main_context_iteration (NULL, FALSE));
10145 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
10151 static gboolean printed_headers = FALSE;
10153 if (!printed_headers) {
10154 g_print ("Test Iters First Other\n");
10155 g_print ("-------------------- ----- ---------- ----------\n");
10156 printed_headers = TRUE;
10159 g_get_current_time (&tv0);
10160 bench_iteration (widget, fn);
10161 g_get_current_time (&tv1);
10163 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10164 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10166 g_get_current_time (&tv0);
10167 for (n = 0; n < num - 1; n++)
10168 bench_iteration (widget, fn);
10169 g_get_current_time (&tv1);
10170 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10171 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10173 g_print ("%s %5d ", pad (name, 20), num);
10175 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
10177 g_print ("%10.1f\n", dt_first);
10181 do_bench (char* what, int num)
10185 void (* fn) (GtkWidget *widget);
10187 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10189 if (g_ascii_strcasecmp (what, "ALL") == 0)
10191 for (i = 0; i < nbuttons; i++)
10193 if (!buttons[i].do_not_benchmark)
10194 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
10201 for (i = 0; i < nbuttons; i++)
10203 if (strcmp (buttons[i].label, what) == 0)
10205 fn = buttons[i].func;
10211 g_print ("Can't bench: \"%s\" not found.\n", what);
10213 do_real_bench (widget, fn, buttons[i].label, num);
10220 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
10225 main (int argc, char *argv[])
10227 GtkCssProvider *provider, *memory_provider;
10228 GdkDisplay *display;
10230 GtkBindingSet *binding_set;
10232 gboolean done_benchmarks = FALSE;
10234 srand (time (NULL));
10238 g_set_application_name ("GTK+ Test Program");
10240 gtk_init (&argc, &argv);
10242 provider = gtk_css_provider_new ();
10244 /* Check to see if we are being run from the correct
10247 if (file_exists ("testgtk.css"))
10248 gtk_css_provider_load_from_path (provider, "testgtk.css", NULL);
10249 else if (file_exists ("tests/testgtk.css"))
10250 gtk_css_provider_load_from_path (provider, "tests/testgtk.css", NULL);
10252 g_warning ("Couldn't find file \"testgtk.css\".");
10254 display = gdk_display_get_default ();
10255 screen = gdk_display_get_default_screen (display);
10257 gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (provider),
10258 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
10259 g_object_unref (provider);
10261 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
10270 for (i = 1; i < argc; i++)
10272 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
10279 nextarg = strchr (argv[i], '=');
10290 count = strchr (nextarg, ':');
10293 what = g_strndup (nextarg, count - nextarg);
10295 num = atoi (count);
10300 what = g_strdup (nextarg);
10302 do_bench (what, num ? num : 1);
10303 done_benchmarks = TRUE;
10308 if (done_benchmarks)
10313 binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
10314 gtk_binding_entry_add_signal (binding_set,
10315 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
10318 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
10320 memory_provider = gtk_css_provider_new ();
10321 gtk_css_provider_load_from_data (memory_provider,
10322 "#testgtk-version-label {\n"
10324 " font: Sans 18;\n"
10327 gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (memory_provider),
10328 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION + 1);
10330 create_main_window ();
10336 while (g_main_context_pending (NULL))
10337 g_main_context_iteration (NULL, FALSE);
10340 while (g_main_context_pending (NULL))
10341 g_main_context_iteration (NULL, FALSE);