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;
178 table = gtk_table_new (1, 1, FALSE);
180 radio_button = gtk_radio_button_new_with_label (NULL, "Red");
181 gtk_table_attach (GTK_TABLE (table),
184 GTK_EXPAND | GTK_FILL, 0,
187 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Green");
188 gtk_table_attach (GTK_TABLE (table),
191 GTK_EXPAND | GTK_FILL, 0,
194 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Blue"),
195 gtk_table_attach (GTK_TABLE (table),
198 GTK_EXPAND | GTK_FILL, 0,
201 gtk_table_attach (GTK_TABLE (table),
202 gtk_check_button_new_with_label ("Sedentary"),
204 GTK_EXPAND | GTK_FILL, 0,
206 gtk_table_attach (GTK_TABLE (table),
207 gtk_check_button_new_with_label ("Nocturnal"),
209 GTK_EXPAND | GTK_FILL, 0,
211 gtk_table_attach (GTK_TABLE (table),
212 gtk_check_button_new_with_label ("Compulsive"),
214 GTK_EXPAND | GTK_FILL, 0,
217 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Green");
218 gtk_table_attach (GTK_TABLE (table),
221 GTK_EXPAND | GTK_FILL, 0,
224 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Blue"),
225 gtk_table_attach (GTK_TABLE (table),
228 GTK_EXPAND | GTK_FILL, 0,
231 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
232 label = gtk_label_new (NULL);
233 gtk_label_set_markup (GTK_LABEL (label), "<i>Entry: </i>");
234 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
235 entry = gtk_entry_new ();
236 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
237 gtk_table_attach (GTK_TABLE (table),
240 GTK_EXPAND | GTK_FILL, 0,
247 on_alpha_screen_changed (GtkWindow *window,
248 GdkScreen *old_screen,
251 GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (window));
252 GdkVisual *visual = gdk_screen_get_rgba_visual (screen);
256 visual = gdk_screen_get_system_visual (screen);
257 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen doesn't support alpha</b>");
261 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen supports alpha</b>");
264 gtk_widget_set_visual (GTK_WIDGET (window), visual);
268 on_composited_changed (GtkWidget *window,
271 gboolean is_composited = gtk_widget_is_composited (window);
274 gtk_label_set_text (label, "Composited");
276 gtk_label_set_text (label, "Not composited");
280 create_alpha_window (GtkWidget *widget)
282 static GtkWidget *window;
286 GtkWidget *content_area;
290 window = gtk_dialog_new_with_buttons ("Alpha Window",
291 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
295 gtk_widget_set_app_paintable (window, TRUE);
296 g_signal_connect (window, "draw",
297 G_CALLBACK (on_alpha_window_draw), NULL);
299 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
301 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 8);
302 gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
303 gtk_box_pack_start (GTK_BOX (content_area), vbox,
306 label = gtk_label_new (NULL);
307 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
308 on_alpha_screen_changed (GTK_WINDOW (window), NULL, label);
309 g_signal_connect (window, "screen-changed",
310 G_CALLBACK (on_alpha_screen_changed), label);
312 label = gtk_label_new (NULL);
313 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
314 on_composited_changed (window, GTK_LABEL (label));
315 g_signal_connect (window, "composited_changed", G_CALLBACK (on_composited_changed), label);
317 gtk_box_pack_start (GTK_BOX (vbox), build_alpha_widgets (), TRUE, TRUE, 0);
319 g_signal_connect (window, "destroy",
320 G_CALLBACK (gtk_widget_destroyed),
323 g_signal_connect (window, "response",
324 G_CALLBACK (gtk_widget_destroy),
328 if (!gtk_widget_get_visible (window))
329 gtk_widget_show_all (window);
331 gtk_widget_destroy (window);
335 * Composited non-toplevel window
338 /* The draw event handler for the event box.
340 * This function simply draws a transparency onto a widget on the area
341 * for which it receives expose events. This is intended to give the
342 * event box a "transparent" background.
344 * In order for this to work properly, the widget must have an RGBA
345 * colourmap. The widget should also be set as app-paintable since it
346 * doesn't make sense for GTK to draw a background if we are drawing it
347 * (and because GTK might actually replace our transparency with its
348 * default background colour).
351 transparent_draw (GtkWidget *widget,
354 cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
360 /* The expose event handler for the window.
362 * This function performs the actual compositing of the event box onto
363 * the already-existing background of the window at 50% normal opacity.
365 * In this case we do not want app-paintable to be set on the widget
366 * since we want it to draw its own (red) background. Because of this,
367 * however, we must ensure that we use g_signal_register_after so that
368 * this handler is called after the red has been drawn. If it was
369 * called before then GTK would just blindly paint over our work.
372 window_draw (GtkWidget *widget,
375 GtkAllocation allocation;
378 /* get our child (in this case, the event box) */
379 child = gtk_bin_get_child (GTK_BIN (widget));
381 gtk_widget_get_allocation (child, &allocation);
383 /* the source data is the (composited) event box */
384 gdk_cairo_set_source_window (cr, gtk_widget_get_window (child),
388 /* composite, with a 50% opacity */
389 cairo_paint_with_alpha (cr, 0.5);
395 create_composited_window (GtkWidget *widget)
397 static GtkWidget *window;
401 GtkWidget *event, *button;
404 /* make the widgets */
405 button = gtk_button_new_with_label ("A Button");
406 event = gtk_event_box_new ();
407 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
409 g_signal_connect (window, "destroy",
410 G_CALLBACK (gtk_widget_destroyed),
413 /* put a red background on the window */
414 gdk_color_parse ("red", &red);
415 gtk_widget_modify_bg (window, GTK_STATE_NORMAL, &red);
417 /* set our event box to have a fully-transparent background
418 * drawn on it. currently there is no way to simply tell gtk
419 * that "transparency" is the background colour for a widget.
421 gtk_widget_set_app_paintable (GTK_WIDGET (event), TRUE);
422 g_signal_connect (event, "draw",
423 G_CALLBACK (transparent_draw), NULL);
425 /* put them inside one another */
426 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
427 gtk_container_add (GTK_CONTAINER (window), event);
428 gtk_container_add (GTK_CONTAINER (event), button);
430 /* realise and show everything */
431 gtk_widget_realize (button);
433 /* set the event box GdkWindow to be composited.
434 * obviously must be performed after event box is realised.
436 gdk_window_set_composited (gtk_widget_get_window (event),
439 /* set up the compositing handler.
440 * note that we do _after so that the normal (red) background is drawn
441 * by gtk before our compositing occurs.
443 g_signal_connect_after (window, "draw",
444 G_CALLBACK (window_draw), NULL);
447 if (!gtk_widget_get_visible (window))
448 gtk_widget_show_all (window);
450 gtk_widget_destroy (window);
454 * Big windows and guffaw scrolling
458 pattern_set_bg (GtkWidget *widget,
462 static const GdkColor colors[] = {
463 { 0, 0x4444, 0x4444, 0xffff },
464 { 0, 0x8888, 0x8888, 0xffff },
465 { 0, 0xaaaa, 0xaaaa, 0xffff }
468 gdk_window_set_user_data (child, widget);
469 gdk_window_set_background (child, &colors[level]);
473 create_pattern (GtkWidget *widget,
484 while (2 * h <= height)
489 while (2 * w <= width)
491 if ((i + j) % 2 == 0)
496 GdkWindowAttr attributes;
498 attributes.window_type = GDK_WINDOW_CHILD;
501 attributes.width = w;
502 attributes.height = h;
503 attributes.wclass = GDK_INPUT_OUTPUT;
504 attributes.event_mask = GDK_EXPOSURE_MASK;
505 attributes.visual = gtk_widget_get_visual (widget);
507 child = gdk_window_new (parent, &attributes,
508 GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL);
510 pattern_set_bg (widget, child, level);
513 create_pattern (widget, child, level + 1, w, h);
515 gdk_window_show (child);
525 #define PATTERN_SIZE (1 << 18)
528 pattern_hadj_changed (GtkAdjustment *adj,
531 gint *old_value = g_object_get_data (G_OBJECT (adj), "old-value");
532 gint new_value = adj->value;
534 if (gtk_widget_get_realized (darea))
536 gdk_window_scroll (gtk_widget_get_window (darea),
537 *old_value - new_value, 0);
538 *old_value = new_value;
543 pattern_vadj_changed (GtkAdjustment *adj,
546 gint *old_value = g_object_get_data (G_OBJECT (adj), "old-value");
547 gint new_value = adj->value;
549 if (gtk_widget_get_realized (darea))
551 gdk_window_scroll (gtk_widget_get_window (darea),
552 0, *old_value - new_value);
553 *old_value = new_value;
558 pattern_realize (GtkWidget *widget,
563 window = gtk_widget_get_window (widget);
564 pattern_set_bg (widget, window, 0);
565 create_pattern (widget, window, 1, PATTERN_SIZE, PATTERN_SIZE);
569 create_big_windows (GtkWidget *widget)
571 static GtkWidget *window = NULL;
572 GtkWidget *content_area;
573 GtkWidget *darea, *table, *scrollbar;
577 static gint current_x;
578 static gint current_y;
585 window = gtk_dialog_new_with_buttons ("Big Windows",
591 gtk_window_set_screen (GTK_WINDOW (window),
592 gtk_widget_get_screen (widget));
594 gtk_window_set_default_size (GTK_WINDOW (window), 200, 300);
596 g_signal_connect (window, "destroy",
597 G_CALLBACK (gtk_widget_destroyed),
600 g_signal_connect (window, "response",
601 G_CALLBACK (gtk_widget_destroy),
604 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
606 table = gtk_table_new (2, 2, FALSE);
607 gtk_box_pack_start (GTK_BOX (content_area), table, TRUE, TRUE, 0);
609 darea = gtk_drawing_area_new ();
611 hadj = gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
612 g_signal_connect (hadj, "value_changed",
613 G_CALLBACK (pattern_hadj_changed), darea);
614 g_object_set_data (G_OBJECT (hadj), "old-value", ¤t_x);
616 vadj = gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
617 g_signal_connect (vadj, "value_changed",
618 G_CALLBACK (pattern_vadj_changed), darea);
619 g_object_set_data (G_OBJECT (vadj), "old-value", ¤t_y);
621 g_signal_connect (darea, "realize",
622 G_CALLBACK (pattern_realize),
625 eventbox = gtk_event_box_new ();
626 gtk_table_attach (GTK_TABLE (table), eventbox,
628 GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND,
631 gtk_container_add (GTK_CONTAINER (eventbox), darea);
633 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, hadj);
634 gtk_table_attach (GTK_TABLE (table), scrollbar,
636 GTK_FILL | GTK_EXPAND, GTK_FILL,
639 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, vadj);
640 gtk_table_attach (GTK_TABLE (table), scrollbar,
642 GTK_FILL, GTK_EXPAND | GTK_FILL,
647 if (!gtk_widget_get_visible (window))
648 gtk_widget_show_all (window);
650 gtk_widget_hide (window);
658 button_window (GtkWidget *widget,
661 if (!gtk_widget_get_visible (button))
662 gtk_widget_show (button);
664 gtk_widget_hide (button);
668 create_buttons (GtkWidget *widget)
670 static GtkWidget *window = NULL;
674 GtkWidget *button[10];
675 GtkWidget *separator;
679 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
680 gtk_window_set_screen (GTK_WINDOW (window),
681 gtk_widget_get_screen (widget));
683 g_signal_connect (window, "destroy",
684 G_CALLBACK (gtk_widget_destroyed),
687 gtk_window_set_title (GTK_WINDOW (window), "GtkButton");
688 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
690 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
691 gtk_container_add (GTK_CONTAINER (window), box1);
693 table = gtk_table_new (3, 3, FALSE);
694 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
695 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
696 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
697 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
699 button[0] = gtk_button_new_with_label ("button1");
700 button[1] = gtk_button_new_with_mnemonic ("_button2");
701 button[2] = gtk_button_new_with_mnemonic ("_button3");
702 button[3] = gtk_button_new_from_stock (GTK_STOCK_OK);
703 button[4] = gtk_button_new_with_label ("button5");
704 button[5] = gtk_button_new_with_label ("button6");
705 button[6] = gtk_button_new_with_label ("button7");
706 button[7] = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
707 button[8] = gtk_button_new_with_label ("button9");
709 g_signal_connect (button[0], "clicked",
710 G_CALLBACK (button_window),
713 gtk_table_attach (GTK_TABLE (table), button[0], 0, 1, 0, 1,
714 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
716 g_signal_connect (button[1], "clicked",
717 G_CALLBACK (button_window),
720 gtk_table_attach (GTK_TABLE (table), button[1], 1, 2, 1, 2,
721 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
723 g_signal_connect (button[2], "clicked",
724 G_CALLBACK (button_window),
726 gtk_table_attach (GTK_TABLE (table), button[2], 2, 3, 2, 3,
727 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
729 g_signal_connect (button[3], "clicked",
730 G_CALLBACK (button_window),
732 gtk_table_attach (GTK_TABLE (table), button[3], 0, 1, 2, 3,
733 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
735 g_signal_connect (button[4], "clicked",
736 G_CALLBACK (button_window),
738 gtk_table_attach (GTK_TABLE (table), button[4], 2, 3, 0, 1,
739 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
741 g_signal_connect (button[5], "clicked",
742 G_CALLBACK (button_window),
744 gtk_table_attach (GTK_TABLE (table), button[5], 1, 2, 2, 3,
745 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
747 g_signal_connect (button[6], "clicked",
748 G_CALLBACK (button_window),
750 gtk_table_attach (GTK_TABLE (table), button[6], 1, 2, 0, 1,
751 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
753 g_signal_connect (button[7], "clicked",
754 G_CALLBACK (button_window),
756 gtk_table_attach (GTK_TABLE (table), button[7], 2, 3, 1, 2,
757 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
759 g_signal_connect (button[8], "clicked",
760 G_CALLBACK (button_window),
762 gtk_table_attach (GTK_TABLE (table), button[8], 0, 1, 1, 2,
763 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
765 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
766 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
768 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 10);
769 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
770 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
772 button[9] = gtk_button_new_with_label ("close");
773 g_signal_connect_swapped (button[9], "clicked",
774 G_CALLBACK (gtk_widget_destroy),
776 gtk_box_pack_start (GTK_BOX (box2), button[9], TRUE, TRUE, 0);
777 gtk_widget_set_can_default (button[9], TRUE);
778 gtk_widget_grab_default (button[9]);
781 if (!gtk_widget_get_visible (window))
782 gtk_widget_show_all (window);
784 gtk_widget_destroy (window);
792 create_toggle_buttons (GtkWidget *widget)
794 static GtkWidget *window = NULL;
798 GtkWidget *separator;
802 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
803 gtk_window_set_screen (GTK_WINDOW (window),
804 gtk_widget_get_screen (widget));
806 g_signal_connect (window, "destroy",
807 G_CALLBACK (gtk_widget_destroyed),
810 gtk_window_set_title (GTK_WINDOW (window), "GtkToggleButton");
811 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
813 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
814 gtk_container_add (GTK_CONTAINER (window), box1);
816 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 10);
817 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
818 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
820 button = gtk_toggle_button_new_with_label ("button1");
821 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
823 button = gtk_toggle_button_new_with_label ("button2");
824 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
826 button = gtk_toggle_button_new_with_label ("button3");
827 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
829 button = gtk_toggle_button_new_with_label ("inconsistent");
830 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
831 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
833 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
834 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
836 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 10);
837 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
838 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
840 button = gtk_button_new_with_label ("close");
841 g_signal_connect_swapped (button, "clicked",
842 G_CALLBACK (gtk_widget_destroy),
844 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
845 gtk_widget_set_can_default (button, TRUE);
846 gtk_widget_grab_default (button);
849 if (!gtk_widget_get_visible (window))
850 gtk_widget_show_all (window);
852 gtk_widget_destroy (window);
856 create_widget_grid (GType widget_type)
859 GtkWidget *group_widget = NULL;
862 table = gtk_table_new (FALSE, 3, 3);
864 for (i = 0; i < 5; i++)
866 for (j = 0; j < 5; j++)
871 if (i == 0 && j == 0)
877 tmp = g_strdup_printf ("%d", j);
878 widget = gtk_label_new (tmp);
883 tmp = g_strdup_printf ("%c", 'A' + i - 1);
884 widget = gtk_label_new (tmp);
889 widget = g_object_new (widget_type, NULL);
891 if (g_type_is_a (widget_type, GTK_TYPE_RADIO_BUTTON))
894 group_widget = widget;
896 g_object_set (widget, "group", group_widget, NULL);
901 gtk_table_attach (GTK_TABLE (table), widget,
916 create_check_buttons (GtkWidget *widget)
918 static GtkWidget *window = NULL;
922 GtkWidget *separator;
927 window = gtk_dialog_new_with_buttons ("Check Buttons",
933 gtk_window_set_screen (GTK_WINDOW (window),
934 gtk_widget_get_screen (widget));
936 g_signal_connect (window, "destroy",
937 G_CALLBACK (gtk_widget_destroyed),
939 g_signal_connect (window, "response",
940 G_CALLBACK (gtk_widget_destroy),
943 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
945 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 10);
946 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
947 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
949 button = gtk_check_button_new_with_mnemonic ("_button1");
950 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
952 button = gtk_check_button_new_with_label ("button2");
953 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
955 button = gtk_check_button_new_with_label ("button3");
956 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
958 button = gtk_check_button_new_with_label ("inconsistent");
959 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
960 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
962 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
963 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
965 table = create_widget_grid (GTK_TYPE_CHECK_BUTTON);
966 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
967 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
970 if (!gtk_widget_get_visible (window))
971 gtk_widget_show_all (window);
973 gtk_widget_destroy (window);
981 create_radio_buttons (GtkWidget *widget)
983 static GtkWidget *window = NULL;
987 GtkWidget *separator;
992 window = gtk_dialog_new_with_buttons ("Radio Buttons",
998 gtk_window_set_screen (GTK_WINDOW (window),
999 gtk_widget_get_screen (widget));
1001 g_signal_connect (window, "destroy",
1002 G_CALLBACK (gtk_widget_destroyed),
1004 g_signal_connect (window, "response",
1005 G_CALLBACK (gtk_widget_destroy),
1008 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
1010 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 10);
1011 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1012 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1014 button = gtk_radio_button_new_with_label (NULL, "button1");
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_active (GTK_TOGGLE_BUTTON (button), TRUE);
1021 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1023 button = gtk_radio_button_new_with_label (
1024 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1026 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1028 button = gtk_radio_button_new_with_label (
1029 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1031 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
1032 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1034 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1035 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1037 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 10);
1038 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1039 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1041 button = gtk_radio_button_new_with_label (NULL, "button4");
1042 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1043 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1045 button = gtk_radio_button_new_with_label (
1046 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1048 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
1049 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1050 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1052 button = gtk_radio_button_new_with_label (
1053 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1055 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1056 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1058 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1059 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1061 table = create_widget_grid (GTK_TYPE_RADIO_BUTTON);
1062 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
1063 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
1066 if (!gtk_widget_get_visible (window))
1067 gtk_widget_show_all (window);
1069 gtk_widget_destroy (window);
1077 create_bbox (gint horizontal,
1088 frame = gtk_frame_new (title);
1091 bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
1093 bbox = gtk_button_box_new (GTK_ORIENTATION_VERTICAL);
1095 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
1096 gtk_container_add (GTK_CONTAINER (frame), bbox);
1098 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), layout);
1099 gtk_box_set_spacing (GTK_BOX (bbox), spacing);
1101 button = gtk_button_new_with_label ("OK");
1102 gtk_container_add (GTK_CONTAINER (bbox), button);
1104 button = gtk_button_new_with_label ("Cancel");
1105 gtk_container_add (GTK_CONTAINER (bbox), button);
1107 button = gtk_button_new_with_label ("Help");
1108 gtk_container_add (GTK_CONTAINER (bbox), button);
1114 create_button_box (GtkWidget *widget)
1116 static GtkWidget* window = NULL;
1117 GtkWidget *main_vbox;
1120 GtkWidget *frame_horz;
1121 GtkWidget *frame_vert;
1125 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1126 gtk_window_set_screen (GTK_WINDOW (window), gtk_widget_get_screen (widget));
1127 gtk_window_set_title (GTK_WINDOW (window), "Button Boxes");
1129 g_signal_connect (window, "destroy",
1130 G_CALLBACK (gtk_widget_destroyed),
1133 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
1135 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
1136 gtk_container_add (GTK_CONTAINER (window), main_vbox);
1138 frame_horz = gtk_frame_new ("Horizontal Button Boxes");
1139 gtk_box_pack_start (GTK_BOX (main_vbox), frame_horz, TRUE, TRUE, 10);
1141 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
1142 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
1143 gtk_container_add (GTK_CONTAINER (frame_horz), vbox);
1145 gtk_box_pack_start (GTK_BOX (vbox),
1146 create_bbox (TRUE, "Spread", 40, 85, 20, GTK_BUTTONBOX_SPREAD),
1149 gtk_box_pack_start (GTK_BOX (vbox),
1150 create_bbox (TRUE, "Edge", 40, 85, 20, GTK_BUTTONBOX_EDGE),
1153 gtk_box_pack_start (GTK_BOX (vbox),
1154 create_bbox (TRUE, "Start", 40, 85, 20, GTK_BUTTONBOX_START),
1157 gtk_box_pack_start (GTK_BOX (vbox),
1158 create_bbox (TRUE, "End", 40, 85, 20, GTK_BUTTONBOX_END),
1161 gtk_box_pack_start (GTK_BOX (vbox),
1162 create_bbox (TRUE, "Center", 40, 85, 20, GTK_BUTTONBOX_CENTER),
1165 frame_vert = gtk_frame_new ("Vertical Button Boxes");
1166 gtk_box_pack_start (GTK_BOX (main_vbox), frame_vert, TRUE, TRUE, 10);
1168 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
1169 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
1170 gtk_container_add (GTK_CONTAINER (frame_vert), hbox);
1172 gtk_box_pack_start (GTK_BOX (hbox),
1173 create_bbox (FALSE, "Spread", 30, 85, 20, GTK_BUTTONBOX_SPREAD),
1176 gtk_box_pack_start (GTK_BOX (hbox),
1177 create_bbox (FALSE, "Edge", 30, 85, 20, GTK_BUTTONBOX_EDGE),
1180 gtk_box_pack_start (GTK_BOX (hbox),
1181 create_bbox (FALSE, "Start", 30, 85, 20, GTK_BUTTONBOX_START),
1184 gtk_box_pack_start (GTK_BOX (hbox),
1185 create_bbox (FALSE, "End", 30, 85, 20, GTK_BUTTONBOX_END),
1188 gtk_box_pack_start (GTK_BOX (hbox),
1189 create_bbox (FALSE, "Center", 30, 85, 20, GTK_BUTTONBOX_CENTER),
1193 if (!gtk_widget_get_visible (window))
1194 gtk_widget_show_all (window);
1196 gtk_widget_destroy (window);
1204 new_pixbuf (char *filename,
1206 GdkColor *background)
1211 if (strcmp (filename, "test.xpm") == 0)
1214 pixbuf = gdk_pixbuf_new_from_file (filename, NULL);
1217 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
1219 widget = gtk_image_new_from_pixbuf (pixbuf);
1221 g_object_unref (pixbuf);
1228 set_toolbar_small_stock (GtkWidget *widget,
1231 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_SMALL_TOOLBAR);
1235 set_toolbar_large_stock (GtkWidget *widget,
1238 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_LARGE_TOOLBAR);
1242 set_toolbar_horizontal (GtkWidget *widget,
1245 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_HORIZONTAL);
1249 set_toolbar_vertical (GtkWidget *widget,
1252 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_VERTICAL);
1256 set_toolbar_icons (GtkWidget *widget,
1259 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_ICONS);
1263 set_toolbar_text (GtkWidget *widget,
1266 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_TEXT);
1270 set_toolbar_both (GtkWidget *widget,
1273 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH);
1277 set_toolbar_both_horiz (GtkWidget *widget,
1280 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH_HORIZ);
1284 set_toolbar_enable (GtkWidget *widget,
1287 GtkSettings *settings = gtk_widget_get_settings (widget);
1288 g_object_set (settings, "gtk-enable-tooltips", TRUE, NULL);
1292 set_toolbar_disable (GtkWidget *widget,
1295 GtkSettings *settings = gtk_widget_get_settings (widget);
1296 g_object_set (settings, "gtk-enable-tooltips", FALSE, NULL);
1299 static GtkActionEntry create_toolbar_items[] = {
1300 { NULL, GTK_STOCK_NEW, NULL, NULL, "Stock icon: New",
1301 G_CALLBACK (set_toolbar_small_stock) },
1302 { NULL, GTK_STOCK_OPEN, NULL, NULL, "Stock icon: Open",
1303 G_CALLBACK (set_toolbar_large_stock) },
1304 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1305 G_CALLBACK (set_toolbar_horizontal) },
1306 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1307 G_CALLBACK (set_toolbar_vertical) },
1309 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1310 G_CALLBACK (set_toolbar_icons) },
1311 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1312 G_CALLBACK (set_toolbar_text) },
1313 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1314 G_CALLBACK (set_toolbar_both) },
1315 { NULL, NULL, "Both (horizontal)", NULL, "Show toolbar icons and text in a horizontal fashion",
1316 G_CALLBACK (set_toolbar_both_horiz) },
1318 { "entry", NULL, NULL, "This is an unusable GtkEntry ;)",
1322 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1323 G_CALLBACK (set_toolbar_enable) },
1324 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1325 G_CALLBACK (set_toolbar_disable) },
1327 { NULL, NULL, "Frobate", NULL, "Frobate tooltip",
1329 { NULL, NULL, "Baz", NULL, "Baz tooltip",
1332 { NULL, NULL, "Blah", NULL, "Blash tooltip",
1334 { NULL, NULL, "Bar", NULL, "Bar tooltip",
1339 create_toolbar (GtkWidget *widget)
1341 static GtkWidget *window = NULL;
1348 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1349 gtk_window_set_screen (GTK_WINDOW (window),
1350 gtk_widget_get_screen (widget));
1352 gtk_window_set_title (GTK_WINDOW (window), "Toolbar test");
1354 g_signal_connect (window, "destroy",
1355 G_CALLBACK (gtk_widget_destroyed),
1358 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1359 gtk_widget_realize (window);
1361 toolbar = gtk_toolbar_new ();
1362 for (i = 0; i < G_N_ELEMENTS (create_toolbar_items); i++)
1364 GtkToolItem *toolitem;
1366 if (create_toolbar_items[i].tooltip == NULL)
1367 toolitem = gtk_separator_tool_item_new ();
1368 else if (g_strcmp0 (create_toolbar_items[i].name, "entry") == 0)
1372 toolitem = gtk_tool_item_new ();
1373 entry = gtk_entry_new ();
1374 gtk_container_add (GTK_CONTAINER (toolitem), entry);
1376 else if (create_toolbar_items[i].stock_id)
1377 toolitem = gtk_tool_button_new_from_stock (create_toolbar_items[i].stock_id);
1382 icon = new_pixbuf ("test.xpm", gtk_widget_get_window (window),
1383 >k_widget_get_style (window)->bg[GTK_STATE_NORMAL]);
1384 toolitem = gtk_tool_button_new (icon, create_toolbar_items[i].label);
1386 if (create_toolbar_items[i].callback)
1387 g_signal_connect (toolitem, "clicked",
1388 create_toolbar_items[i].callback, toolbar);
1389 gtk_tool_item_set_tooltip_text (toolitem, create_toolbar_items[i].tooltip);
1390 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1393 gtk_container_add (GTK_CONTAINER (window), toolbar);
1395 gtk_widget_set_size_request (toolbar, 200, -1);
1398 if (!gtk_widget_get_visible (window))
1399 gtk_widget_show_all (window);
1401 gtk_widget_destroy (window);
1404 static GtkActionEntry make_toolbar_items[] = {
1405 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1406 G_CALLBACK (set_toolbar_horizontal) },
1407 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1408 G_CALLBACK (set_toolbar_vertical) },
1410 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1411 G_CALLBACK (set_toolbar_icons) },
1412 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1413 G_CALLBACK (set_toolbar_text) },
1414 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1415 G_CALLBACK (set_toolbar_both) },
1417 { NULL, NULL, "Woot", NULL, "Woot woot woot",
1419 { NULL, NULL, "Blah", NULL, "Blah blah blah",
1422 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1423 G_CALLBACK (set_toolbar_enable) },
1424 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1425 G_CALLBACK (set_toolbar_disable) },
1427 { NULL, NULL, "Hoo", NULL, "Hoo tooltip",
1429 { NULL, NULL, "Woo", NULL, "Woo tooltip",
1434 make_toolbar (GtkWidget *window)
1439 if (!gtk_widget_get_realized (window))
1440 gtk_widget_realize (window);
1442 toolbar = gtk_toolbar_new ();
1443 for (i = 0; i < G_N_ELEMENTS (make_toolbar_items); i++)
1446 GtkToolItem *toolitem;
1448 if (make_toolbar_items[i].label == NULL)
1450 toolitem = gtk_separator_tool_item_new ();
1453 icon = new_pixbuf ("test.xpm", gtk_widget_get_window (window),
1454 >k_widget_get_style (window)->bg[GTK_STATE_NORMAL]);
1455 toolitem = gtk_tool_button_new (icon, make_toolbar_items[i].label);
1456 gtk_tool_item_set_tooltip_text (toolitem, make_toolbar_items[i].tooltip);
1457 if (make_toolbar_items[i].callback != NULL)
1458 g_signal_connect (toolitem, "clicked", make_toolbar_items[i].callback, toolbar);
1459 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1469 static guint statusbar_counter = 1;
1472 statusbar_push (GtkWidget *button,
1473 GtkStatusbar *statusbar)
1477 sprintf (text, "something %d", statusbar_counter++);
1479 gtk_statusbar_push (statusbar, 1, text);
1483 statusbar_push_long (GtkWidget *button,
1484 GtkStatusbar *statusbar)
1488 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\").");
1490 gtk_statusbar_push (statusbar, 1, text);
1494 statusbar_pop (GtkWidget *button,
1495 GtkStatusbar *statusbar)
1497 gtk_statusbar_pop (statusbar, 1);
1501 statusbar_steal (GtkWidget *button,
1502 GtkStatusbar *statusbar)
1504 gtk_statusbar_remove (statusbar, 1, 4);
1508 statusbar_popped (GtkStatusbar *statusbar,
1513 statusbar_counter = 1;
1517 statusbar_contexts (GtkStatusbar *statusbar)
1521 string = "any context";
1522 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1524 gtk_statusbar_get_context_id (statusbar, string));
1526 string = "idle messages";
1527 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1529 gtk_statusbar_get_context_id (statusbar, string));
1531 string = "some text";
1532 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1534 gtk_statusbar_get_context_id (statusbar, string));
1536 string = "hit the mouse";
1537 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1539 gtk_statusbar_get_context_id (statusbar, string));
1541 string = "hit the mouse2";
1542 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1544 gtk_statusbar_get_context_id (statusbar, string));
1548 create_statusbar (GtkWidget *widget)
1550 static GtkWidget *window = NULL;
1554 GtkWidget *separator;
1555 GtkWidget *statusbar;
1559 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1560 gtk_window_set_screen (GTK_WINDOW (window),
1561 gtk_widget_get_screen (widget));
1563 g_signal_connect (window, "destroy",
1564 G_CALLBACK (gtk_widget_destroyed),
1567 gtk_window_set_title (GTK_WINDOW (window), "statusbar");
1568 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1570 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
1571 gtk_container_add (GTK_CONTAINER (window), box1);
1573 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 10);
1574 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1575 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1577 statusbar = gtk_statusbar_new ();
1578 gtk_box_pack_end (GTK_BOX (box1), statusbar, TRUE, TRUE, 0);
1579 g_signal_connect (statusbar,
1581 G_CALLBACK (statusbar_popped),
1584 button = g_object_new (gtk_button_get_type (),
1585 "label", "push something",
1589 g_object_connect (button,
1590 "signal::clicked", statusbar_push, statusbar,
1593 button = g_object_connect (g_object_new (gtk_button_get_type (),
1598 "signal_after::clicked", statusbar_pop, statusbar,
1601 button = g_object_connect (g_object_new (gtk_button_get_type (),
1602 "label", "steal #4",
1606 "signal_after::clicked", statusbar_steal, statusbar,
1609 button = g_object_connect (g_object_new (gtk_button_get_type (),
1610 "label", "test contexts",
1614 "swapped_signal_after::clicked", statusbar_contexts, statusbar,
1617 button = g_object_connect (g_object_new (gtk_button_get_type (),
1618 "label", "push something long",
1622 "signal_after::clicked", statusbar_push_long, statusbar,
1625 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1626 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1628 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 10);
1629 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1630 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
1632 button = gtk_button_new_with_label ("close");
1633 g_signal_connect_swapped (button, "clicked",
1634 G_CALLBACK (gtk_widget_destroy),
1636 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1637 gtk_widget_set_can_default (button, TRUE);
1638 gtk_widget_grab_default (button);
1641 if (!gtk_widget_get_visible (window))
1642 gtk_widget_show_all (window);
1644 gtk_widget_destroy (window);
1652 handle_box_child_signal (GtkHandleBox *hb,
1654 const gchar *action)
1656 printf ("%s: child <%s> %sed\n",
1657 g_type_name (G_OBJECT_TYPE (hb)),
1658 g_type_name (G_OBJECT_TYPE (child)),
1663 create_handle_box (GtkWidget *widget)
1665 static GtkWidget* window = NULL;
1666 GtkWidget *handle_box;
1667 GtkWidget *handle_box2;
1672 GtkWidget *separator;
1676 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1678 gtk_window_set_screen (GTK_WINDOW (window),
1679 gtk_widget_get_screen (widget));
1680 gtk_window_set_modal (GTK_WINDOW (window), FALSE);
1681 gtk_window_set_title (GTK_WINDOW (window),
1683 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
1685 g_signal_connect (window, "destroy",
1686 G_CALLBACK (gtk_widget_destroyed),
1689 gtk_container_set_border_width (GTK_CONTAINER (window), 20);
1691 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
1692 gtk_container_add (GTK_CONTAINER (window), vbox);
1693 gtk_widget_show (vbox);
1695 label = gtk_label_new ("Above");
1696 gtk_container_add (GTK_CONTAINER (vbox), label);
1697 gtk_widget_show (label);
1699 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1700 gtk_container_add (GTK_CONTAINER (vbox), separator);
1701 gtk_widget_show (separator);
1703 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 10);
1704 gtk_container_add (GTK_CONTAINER (vbox), hbox);
1705 gtk_widget_show (hbox);
1707 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1708 gtk_container_add (GTK_CONTAINER (vbox), separator);
1709 gtk_widget_show (separator);
1711 label = gtk_label_new ("Below");
1712 gtk_container_add (GTK_CONTAINER (vbox), label);
1713 gtk_widget_show (label);
1715 handle_box = gtk_handle_box_new ();
1716 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1717 g_signal_connect (handle_box,
1719 G_CALLBACK (handle_box_child_signal),
1721 g_signal_connect (handle_box,
1723 G_CALLBACK (handle_box_child_signal),
1725 gtk_widget_show (handle_box);
1727 toolbar = make_toolbar (window);
1729 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
1730 gtk_widget_show (toolbar);
1732 handle_box = gtk_handle_box_new ();
1733 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1734 g_signal_connect (handle_box,
1736 G_CALLBACK (handle_box_child_signal),
1738 g_signal_connect (handle_box,
1740 G_CALLBACK (handle_box_child_signal),
1742 gtk_widget_show (handle_box);
1744 handle_box2 = gtk_handle_box_new ();
1745 gtk_container_add (GTK_CONTAINER (handle_box), handle_box2);
1746 g_signal_connect (handle_box2,
1748 G_CALLBACK (handle_box_child_signal),
1750 g_signal_connect (handle_box2,
1752 G_CALLBACK (handle_box_child_signal),
1754 gtk_widget_show (handle_box2);
1756 hbox = g_object_new (GTK_TYPE_HBOX, "visible", 1, "parent", handle_box2, NULL);
1757 label = gtk_label_new ("Fooo!");
1758 gtk_container_add (GTK_CONTAINER (hbox), label);
1759 gtk_widget_show (label);
1760 g_object_new (GTK_TYPE_ARROW, "visible", 1, "parent", hbox, NULL);
1763 if (!gtk_widget_get_visible (window))
1764 gtk_widget_show (window);
1766 gtk_widget_destroy (window);
1773 sensitivity_toggled (GtkWidget *toggle,
1776 gtk_widget_set_sensitive (widget,
1777 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle)));
1781 create_sensitivity_control (GtkWidget *widget)
1785 button = gtk_toggle_button_new_with_label ("Sensitive");
1787 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
1788 gtk_widget_is_sensitive (widget));
1790 g_signal_connect (button,
1792 G_CALLBACK (sensitivity_toggled),
1795 gtk_widget_show_all (button);
1801 set_selectable_recursive (GtkWidget *widget,
1804 if (GTK_IS_CONTAINER (widget))
1809 children = gtk_container_get_children (GTK_CONTAINER (widget));
1813 set_selectable_recursive (tmp->data, setting);
1817 g_list_free (children);
1819 else if (GTK_IS_LABEL (widget))
1821 gtk_label_set_selectable (GTK_LABEL (widget), setting);
1826 selectable_toggled (GtkWidget *toggle,
1829 set_selectable_recursive (widget,
1830 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle)));
1834 create_selectable_control (GtkWidget *widget)
1838 button = gtk_toggle_button_new_with_label ("Selectable");
1840 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
1843 g_signal_connect (button,
1845 G_CALLBACK (selectable_toggled),
1848 gtk_widget_show_all (button);
1854 dialog_response (GtkWidget *dialog, gint response_id, GtkLabel *label)
1858 gtk_widget_destroy (dialog);
1860 text = "Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
1861 "as hyperlinks, which can be clicked\n"
1862 "or activated via <a href=\"keynav\">keynav</a>.\n"
1863 "The links remain the same.";
1864 gtk_label_set_markup (label, text);
1868 activate_link (GtkWidget *label, const gchar *uri, gpointer data)
1870 if (g_strcmp0 (uri, "keynav") == 0)
1874 dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (gtk_widget_get_toplevel (label)),
1875 GTK_DIALOG_DESTROY_WITH_PARENT,
1878 "The term <i>keynav</i> is a shorthand for "
1879 "keyboard navigation and refers to the process of using a program "
1880 "(exclusively) via keyboard input.");
1882 gtk_window_present (GTK_WINDOW (dialog));
1884 g_signal_connect (dialog, "response", G_CALLBACK (dialog_response), label);
1892 void create_labels (GtkWidget *widget)
1894 static GtkWidget *window = NULL;
1903 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1905 gtk_window_set_screen (GTK_WINDOW (window),
1906 gtk_widget_get_screen (widget));
1908 g_signal_connect (window, "destroy",
1909 G_CALLBACK (gtk_widget_destroyed),
1912 gtk_window_set_title (GTK_WINDOW (window), "Label");
1914 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 5);
1916 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 5);
1917 gtk_container_add (GTK_CONTAINER (window), vbox);
1919 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
1921 button = create_sensitivity_control (hbox);
1923 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
1925 button = create_selectable_control (hbox);
1927 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
1929 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 5);
1931 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
1932 gtk_container_set_border_width (GTK_CONTAINER (window), 5);
1934 frame = gtk_frame_new ("Normal Label");
1935 label = gtk_label_new ("This is a Normal label");
1936 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
1937 gtk_container_add (GTK_CONTAINER (frame), label);
1938 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1940 frame = gtk_frame_new ("Multi-line Label");
1941 label = gtk_label_new ("This is a Multi-line label.\nSecond line\nThird line");
1942 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
1943 gtk_container_add (GTK_CONTAINER (frame), label);
1944 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1946 frame = gtk_frame_new ("Left Justified Label");
1947 label = gtk_label_new ("This is a Left-Justified\nMulti-line label.\nThird line");
1948 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_MIDDLE);
1949 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1950 gtk_container_add (GTK_CONTAINER (frame), label);
1951 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1953 frame = gtk_frame_new ("Right Justified Label");
1954 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
1955 label = gtk_label_new ("This is a Right-Justified\nMulti-line label.\nFourth line, (j/k)");
1956 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1957 gtk_container_add (GTK_CONTAINER (frame), label);
1958 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1960 frame = gtk_frame_new ("Internationalized Label");
1961 label = gtk_label_new (NULL);
1962 gtk_label_set_markup (GTK_LABEL (label),
1963 "French (Fran\303\247ais) Bonjour, Salut\n"
1964 "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"
1965 "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"
1966 "Chinese (Simplified) <span lang=\"zh-cn\">\345\205\203\346\260\224 \345\274\200\345\217\221</span>\n"
1967 "Chinese (Traditional) <span lang=\"zh-tw\">\345\205\203\346\260\243 \351\226\213\347\231\274</span>\n"
1968 "Japanese <span lang=\"ja\">\345\205\203\346\260\227 \351\226\213\347\231\272</span>");
1969 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1970 gtk_container_add (GTK_CONTAINER (frame), label);
1971 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1973 frame = gtk_frame_new ("Bidirection Label");
1974 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"
1975 "\342\200\217Hebrew \327\251\327\234\327\225\327\235");
1976 gtk_container_add (GTK_CONTAINER (frame), label);
1977 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1979 frame = gtk_frame_new ("Links in a label");
1980 label = gtk_label_new ("Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
1981 "as hyperlinks, which can be clicked\n"
1982 "or activated via <a href=\"keynav\">keynav</a>");
1983 gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
1984 gtk_container_add (GTK_CONTAINER (frame), label);
1985 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1986 g_signal_connect (label, "activate-link", G_CALLBACK (activate_link), NULL);
1988 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 5);
1989 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
1990 frame = gtk_frame_new ("Line wrapped label");
1991 label = gtk_label_new ("This is an example of a line-wrapped label. It should not be taking "\
1992 "up the entire "/* big space to test spacing */\
1993 "width allocated to it, but automatically wraps the words to fit. "\
1994 "The time has come, for all good men, to come to the aid of their party. "\
1995 "The sixth sheik's six sheep's sick.\n"\
1996 " It supports multiple paragraphs correctly, and correctly adds "\
1997 "many extra spaces. ");
1999 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2000 gtk_container_add (GTK_CONTAINER (frame), label);
2001 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2003 frame = gtk_frame_new ("Filled, wrapped label");
2004 label = gtk_label_new ("This is an example of a line-wrapped, filled label. It should be taking "\
2005 "up the entire width allocated to it. Here is a seneance to prove "\
2006 "my point. Here is another sentence. "\
2007 "Here comes the sun, do de do de do.\n"\
2008 " This is a new paragraph.\n"\
2009 " This is another newer, longer, better paragraph. It is coming to an end, "\
2011 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_FILL);
2012 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2013 gtk_container_add (GTK_CONTAINER (frame), label);
2014 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2016 frame = gtk_frame_new ("Underlined label");
2017 label = gtk_label_new ("This label is underlined!\n"
2018 "This one is underlined (\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257) in quite a funky fashion");
2019 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2020 gtk_label_set_pattern (GTK_LABEL (label), "_________________________ _ _________ _ _____ _ __ __ ___ ____ _____");
2021 gtk_container_add (GTK_CONTAINER (frame), label);
2022 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2024 frame = gtk_frame_new ("Markup label");
2025 label = gtk_label_new (NULL);
2027 /* There's also a gtk_label_set_markup() without accel if you
2028 * don't have an accelerator key
2030 gtk_label_set_markup_with_mnemonic (GTK_LABEL (label),
2031 "This <span foreground=\"blue\" background=\"orange\">label</span> has "
2032 "<b>markup</b> _such as "
2033 "<big><i>Big Italics</i></big>\n"
2034 "<tt>Monospace font</tt>\n"
2035 "<u>Underline!</u>\n"
2037 "<span foreground=\"green\" background=\"red\">Ugly colors</span>\n"
2038 "and nothing on this line,\n"
2041 "or even on this one\n"
2042 "la <big>la <big>la <big>la <big>la</big></big></big></big>\n"
2043 "but this _word is <span foreground=\"purple\"><big>purple</big></span>\n"
2044 "<span underline=\"double\">We like <sup>superscript</sup> and <sub>subscript</sub> too</span>");
2046 g_assert (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)) == GDK_KEY_s);
2048 gtk_container_add (GTK_CONTAINER (frame), label);
2049 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2052 if (!gtk_widget_get_visible (window))
2053 gtk_widget_show_all (window);
2055 gtk_widget_destroy (window);
2059 on_angle_scale_changed (GtkRange *range,
2062 gtk_label_set_angle (GTK_LABEL (label), gtk_range_get_value (range));
2066 create_rotated_label (GtkWidget *widget)
2068 static GtkWidget *window = NULL;
2069 GtkWidget *content_area;
2073 GtkWidget *scale_label;
2074 GtkWidget *scale_hbox;
2078 window = gtk_dialog_new_with_buttons ("Rotated Label",
2079 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2080 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2083 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2085 gtk_window_set_screen (GTK_WINDOW (window),
2086 gtk_widget_get_screen (widget));
2088 g_signal_connect (window, "response",
2089 G_CALLBACK (gtk_widget_destroy), NULL);
2090 g_signal_connect (window, "destroy",
2091 G_CALLBACK (gtk_widget_destroyed), &window);
2093 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2095 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 5);
2096 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
2097 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
2099 label = gtk_label_new (NULL);
2100 gtk_label_set_markup (GTK_LABEL (label), "Hello World\n<i>Rotate</i> <span underline='single' foreground='blue'>me</span>");
2101 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
2103 scale_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
2104 gtk_box_pack_start (GTK_BOX (vbox), scale_hbox, FALSE, FALSE, 0);
2106 scale_label = gtk_label_new (NULL);
2107 gtk_label_set_markup (GTK_LABEL (scale_label), "<i>Angle: </i>");
2108 gtk_box_pack_start (GTK_BOX (scale_hbox), scale_label, FALSE, FALSE, 0);
2110 hscale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL,
2112 g_signal_connect (hscale, "value-changed",
2113 G_CALLBACK (on_angle_scale_changed), label);
2115 gtk_range_set_value (GTK_RANGE (hscale), 45);
2116 gtk_widget_set_size_request (hscale, 200, -1);
2117 gtk_box_pack_start (GTK_BOX (scale_hbox), hscale, TRUE, TRUE, 0);
2120 if (!gtk_widget_get_visible (window))
2121 gtk_widget_show_all (window);
2123 gtk_widget_destroy (window);
2126 #define DEFAULT_TEXT_RADIUS 200
2129 on_rotated_text_unrealize (GtkWidget *widget)
2131 g_object_set_data (G_OBJECT (widget), "text-gc", NULL);
2135 on_rotated_text_draw (GtkWidget *widget,
2137 GdkPixbuf *tile_pixbuf)
2139 static const gchar *words[] = { "The", "grand", "old", "Duke", "of", "York",
2140 "had", "10,000", "men" };
2145 PangoLayout *layout;
2146 PangoContext *context;
2147 PangoFontDescription *desc;
2151 gdk_cairo_set_source_pixbuf (cr, tile_pixbuf, 0, 0);
2152 cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT);
2155 cairo_set_source_rgb (cr, 0, 0, 0);
2157 width = gtk_widget_get_allocated_width (widget);
2158 height = gtk_widget_get_allocated_height (widget);
2159 radius = MIN (width, height) / 2.;
2161 cairo_translate (cr,
2162 radius + (width - 2 * radius) / 2,
2163 radius + (height - 2 * radius) / 2);
2164 cairo_scale (cr, radius / DEFAULT_TEXT_RADIUS, radius / DEFAULT_TEXT_RADIUS);
2166 context = gtk_widget_get_pango_context (widget);
2167 layout = pango_layout_new (context);
2168 desc = pango_font_description_from_string ("Sans Bold 30");
2169 pango_layout_set_font_description (layout, desc);
2170 pango_font_description_free (desc);
2172 n_words = G_N_ELEMENTS (words);
2173 for (i = 0; i < n_words; i++)
2179 cairo_rotate (cr, 2 * G_PI * i / n_words);
2180 pango_cairo_update_layout (cr, layout);
2182 pango_layout_set_text (layout, words[i], -1);
2183 pango_layout_get_size (layout, &width, &height);
2185 cairo_move_to (cr, - width / 2 / PANGO_SCALE, - DEFAULT_TEXT_RADIUS);
2186 pango_cairo_show_layout (cr, layout);
2191 g_object_unref (layout);
2197 create_rotated_text (GtkWidget *widget)
2199 static GtkWidget *window = NULL;
2203 const GdkColor white = { 0, 0xffff, 0xffff, 0xffff };
2204 GtkRequisition requisition;
2205 GtkWidget *content_area;
2206 GtkWidget *drawing_area;
2207 GdkPixbuf *tile_pixbuf;
2209 window = gtk_dialog_new_with_buttons ("Rotated Text",
2210 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2211 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2214 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2216 gtk_window_set_screen (GTK_WINDOW (window),
2217 gtk_widget_get_screen (widget));
2219 g_signal_connect (window, "response",
2220 G_CALLBACK (gtk_widget_destroy), NULL);
2221 g_signal_connect (window, "destroy",
2222 G_CALLBACK (gtk_widget_destroyed), &window);
2224 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2226 drawing_area = gtk_drawing_area_new ();
2227 gtk_box_pack_start (GTK_BOX (content_area), drawing_area, TRUE, TRUE, 0);
2228 gtk_widget_modify_bg (drawing_area, GTK_STATE_NORMAL, &white);
2230 tile_pixbuf = gdk_pixbuf_new_from_file ("marble.xpm", NULL);
2232 g_signal_connect (drawing_area, "draw",
2233 G_CALLBACK (on_rotated_text_draw), tile_pixbuf);
2234 g_signal_connect (drawing_area, "unrealize",
2235 G_CALLBACK (on_rotated_text_unrealize), NULL);
2237 gtk_widget_show_all (gtk_bin_get_child (GTK_BIN (window)));
2239 gtk_widget_set_size_request (drawing_area, DEFAULT_TEXT_RADIUS * 2, DEFAULT_TEXT_RADIUS * 2);
2240 gtk_widget_get_preferred_size ( (window),
2241 &requisition, NULL);
2242 gtk_widget_set_size_request (drawing_area, -1, -1);
2243 gtk_window_resize (GTK_WINDOW (window), requisition.width, requisition.height);
2246 if (!gtk_widget_get_visible (window))
2247 gtk_widget_show (window);
2249 gtk_widget_destroy (window);
2257 reparent_label (GtkWidget *widget,
2258 GtkWidget *new_parent)
2262 label = g_object_get_data (G_OBJECT (widget), "user_data");
2264 gtk_widget_reparent (label, new_parent);
2268 set_parent_signal (GtkWidget *child,
2269 GtkWidget *old_parent,
2274 parent = gtk_widget_get_parent (child);
2275 g_message ("set_parent for \"%s\": new parent: \"%s\", old parent: \"%s\", data: %d\n",
2276 g_type_name (G_OBJECT_TYPE (child)),
2277 parent ? g_type_name (G_OBJECT_TYPE (parent)) : "NULL",
2278 old_parent ? g_type_name (G_OBJECT_TYPE (old_parent)) : "NULL",
2279 GPOINTER_TO_INT (func_data));
2283 create_reparent (GtkWidget *widget)
2285 static GtkWidget *window = NULL;
2292 GtkWidget *separator;
2293 GtkWidget *event_box;
2297 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2299 gtk_window_set_screen (GTK_WINDOW (window),
2300 gtk_widget_get_screen (widget));
2302 g_signal_connect (window, "destroy",
2303 G_CALLBACK (gtk_widget_destroyed),
2306 gtk_window_set_title (GTK_WINDOW (window), "reparent");
2307 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2309 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
2310 gtk_container_add (GTK_CONTAINER (window), box1);
2312 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 5);
2313 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2314 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2316 label = gtk_label_new ("Hello World");
2318 frame = gtk_frame_new ("Frame 1");
2319 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2321 box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 5);
2322 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2323 gtk_container_add (GTK_CONTAINER (frame), box3);
2325 button = gtk_button_new_with_label ("switch");
2326 g_object_set_data (G_OBJECT (button), "user_data", label);
2327 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2329 event_box = gtk_event_box_new ();
2330 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2331 gtk_container_add (GTK_CONTAINER (event_box), label);
2333 g_signal_connect (button, "clicked",
2334 G_CALLBACK (reparent_label),
2337 g_signal_connect (label, "parent_set",
2338 G_CALLBACK (set_parent_signal),
2339 GINT_TO_POINTER (42));
2341 frame = gtk_frame_new ("Frame 2");
2342 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2344 box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 5);
2345 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2346 gtk_container_add (GTK_CONTAINER (frame), box3);
2348 button = gtk_button_new_with_label ("switch");
2349 g_object_set_data (G_OBJECT (button), "user_data", label);
2350 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2352 event_box = gtk_event_box_new ();
2353 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2355 g_signal_connect (button, "clicked",
2356 G_CALLBACK (reparent_label),
2359 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2360 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2362 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 10);
2363 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2364 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2366 button = gtk_button_new_with_label ("close");
2367 g_signal_connect_swapped (button, "clicked",
2368 G_CALLBACK (gtk_widget_destroy), window);
2369 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2370 gtk_widget_set_can_default (button, TRUE);
2371 gtk_widget_grab_default (button);
2374 if (!gtk_widget_get_visible (window))
2375 gtk_widget_show_all (window);
2377 gtk_widget_destroy (window);
2384 grippy_button_press (GtkWidget *area, GdkEventButton *event, GdkWindowEdge edge)
2386 if (event->type == GDK_BUTTON_PRESS)
2388 if (event->button == 1)
2389 gtk_window_begin_resize_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)), edge,
2390 event->button, event->x_root, event->y_root,
2392 else if (event->button == 2)
2393 gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)),
2394 event->button, event->x_root, event->y_root,
2401 grippy_draw (GtkWidget *area, cairo_t *cr, GdkWindowEdge edge)
2403 gtk_paint_resize_grip (gtk_widget_get_style (area),
2405 gtk_widget_get_state (area),
2410 gtk_widget_get_allocated_width (area),
2411 gtk_widget_get_allocated_height (area));
2417 create_resize_grips (GtkWidget *widget)
2419 static GtkWidget *window = NULL;
2421 GtkWidget *hbox, *vbox;
2424 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2426 gtk_window_set_screen (GTK_WINDOW (window),
2427 gtk_widget_get_screen (widget));
2429 gtk_window_set_title (GTK_WINDOW (window), "resize grips");
2431 g_signal_connect (window, "destroy",
2432 G_CALLBACK (gtk_widget_destroyed),
2435 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
2436 gtk_container_add (GTK_CONTAINER (window), vbox);
2438 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
2439 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2442 area = gtk_drawing_area_new ();
2443 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2444 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2445 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2446 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2447 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2448 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2451 area = gtk_drawing_area_new ();
2452 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2453 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2454 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2455 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2456 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2457 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2460 area = gtk_drawing_area_new ();
2461 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2462 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2463 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2464 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2465 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2466 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2468 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
2469 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2472 area = gtk_drawing_area_new ();
2473 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2474 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2475 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2476 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2477 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2478 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2481 area = gtk_drawing_area_new ();
2482 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2485 area = gtk_drawing_area_new ();
2486 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2487 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2488 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2489 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2490 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2491 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2494 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
2495 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2498 area = gtk_drawing_area_new ();
2499 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2500 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2501 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2502 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2503 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2504 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2506 area = gtk_drawing_area_new ();
2507 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2508 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2509 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2510 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2511 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2512 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2515 area = gtk_drawing_area_new ();
2516 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2517 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2518 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2519 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2520 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2521 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2524 if (!gtk_widget_get_visible (window))
2525 gtk_widget_show_all (window);
2527 gtk_widget_destroy (window);
2533 gint upositionx = 0;
2534 gint upositiony = 0;
2537 uposition_configure (GtkWidget *window)
2543 lx = g_object_get_data (G_OBJECT (window), "x");
2544 ly = g_object_get_data (G_OBJECT (window), "y");
2546 gdk_window_get_root_origin (gtk_widget_get_window (window),
2547 &upositionx, &upositiony);
2548 sprintf (buffer, "%d", upositionx);
2549 gtk_label_set_text (lx, buffer);
2550 sprintf (buffer, "%d", upositiony);
2551 gtk_label_set_text (ly, buffer);
2557 uposition_stop_configure (GtkToggleButton *toggle,
2560 if (gtk_toggle_button_get_active (toggle))
2561 g_signal_handlers_block_by_func (window, G_CALLBACK (uposition_configure), NULL);
2563 g_signal_handlers_unblock_by_func (window, G_CALLBACK (uposition_configure), NULL);
2567 create_saved_position (GtkWidget *widget)
2569 static GtkWidget *window = NULL;
2574 GtkWidget *main_vbox;
2582 window = g_object_connect (g_object_new (GTK_TYPE_WINDOW,
2583 "type", GTK_WINDOW_TOPLEVEL,
2584 "title", "Saved Position",
2586 "signal::configure_event", uposition_configure, NULL,
2589 gtk_window_move (GTK_WINDOW (window), upositionx, upositiony);
2591 gtk_window_set_screen (GTK_WINDOW (window),
2592 gtk_widget_get_screen (widget));
2595 g_signal_connect (window, "destroy",
2596 G_CALLBACK (gtk_widget_destroyed),
2599 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 5);
2600 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
2601 gtk_container_add (GTK_CONTAINER (window), main_vbox);
2604 g_object_new (gtk_vbox_get_type (),
2605 "GtkBox::homogeneous", FALSE,
2606 "GtkBox::spacing", 5,
2607 "GtkContainer::border_width", 10,
2608 "GtkWidget::parent", main_vbox,
2609 "GtkWidget::visible", TRUE,
2610 "child", g_object_connect (g_object_new (GTK_TYPE_TOGGLE_BUTTON,
2611 "label", "Stop Events",
2615 "signal::clicked", uposition_stop_configure, window,
2619 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
2620 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2621 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2623 label = gtk_label_new ("X Origin : ");
2624 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
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, FALSE, 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_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2637 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
2639 y_label = gtk_label_new ("");
2640 gtk_box_pack_start (GTK_BOX (hbox), y_label, TRUE, TRUE, 0);
2641 g_object_set_data (G_OBJECT (window), "y", y_label);
2644 g_object_new (gtk_hseparator_get_type (),
2645 "GtkWidget::visible", TRUE,
2647 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
2649 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
2650 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
2651 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
2653 button = gtk_button_new_with_label ("Close");
2654 g_signal_connect_swapped (button, "clicked",
2655 G_CALLBACK (gtk_widget_destroy),
2657 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
2658 gtk_widget_set_can_default (button, TRUE);
2659 gtk_widget_grab_default (button);
2661 gtk_widget_show_all (window);
2664 gtk_widget_destroy (window);
2672 create_pixbuf (GtkWidget *widget)
2674 static GtkWidget *window = NULL;
2680 GtkWidget *separator;
2681 GtkWidget *pixbufwid;
2682 GdkWindow *gdk_window;
2686 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2688 gtk_window_set_screen (GTK_WINDOW (window),
2689 gtk_widget_get_screen (widget));
2691 g_signal_connect (window, "destroy",
2692 G_CALLBACK (gtk_widget_destroyed),
2695 gtk_window_set_title (GTK_WINDOW (window), "GtkPixmap");
2696 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2697 gtk_widget_realize(window);
2699 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
2700 gtk_container_add (GTK_CONTAINER (window), box1);
2702 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 10);
2703 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2704 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2706 button = gtk_button_new ();
2707 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
2709 gdk_window = gtk_widget_get_window (window);
2711 pixbufwid = new_pixbuf ("test.xpm", gdk_window, NULL);
2713 label = gtk_label_new ("Pixbuf\ntest");
2714 box3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
2715 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
2716 gtk_container_add (GTK_CONTAINER (box3), pixbufwid);
2717 gtk_container_add (GTK_CONTAINER (box3), label);
2718 gtk_container_add (GTK_CONTAINER (button), box3);
2720 button = gtk_button_new ();
2721 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
2723 pixbufwid = new_pixbuf ("test.xpm", gdk_window, NULL);
2725 label = gtk_label_new ("Pixbuf\ntest");
2726 box3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
2727 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
2728 gtk_container_add (GTK_CONTAINER (box3), pixbufwid);
2729 gtk_container_add (GTK_CONTAINER (box3), label);
2730 gtk_container_add (GTK_CONTAINER (button), box3);
2732 gtk_widget_set_sensitive (button, FALSE);
2734 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2735 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2737 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 10);
2738 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2739 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2741 button = gtk_button_new_with_label ("close");
2742 g_signal_connect_swapped (button, "clicked",
2743 G_CALLBACK (gtk_widget_destroy),
2745 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2746 gtk_widget_set_can_default (button, TRUE);
2747 gtk_widget_grab_default (button);
2750 if (!gtk_widget_get_visible (window))
2751 gtk_widget_show_all (window);
2753 gtk_widget_destroy (window);
2757 create_tooltips (GtkWidget *widget)
2759 static GtkWidget *window = NULL;
2766 GtkWidget *separator;
2771 g_object_new (gtk_window_get_type (),
2772 "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
2773 "GtkContainer::border_width", 0,
2774 "GtkWindow::title", "Tooltips",
2775 "GtkWindow::resizable", FALSE,
2778 gtk_window_set_screen (GTK_WINDOW (window),
2779 gtk_widget_get_screen (widget));
2781 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
2782 gtk_container_add (GTK_CONTAINER (window), box1);
2784 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 10);
2785 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2786 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2788 button = gtk_toggle_button_new_with_label ("button1");
2789 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2791 gtk_widget_set_tooltip_text (button, "This is button 1");
2793 button = gtk_toggle_button_new_with_label ("button2");
2794 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2796 gtk_widget_set_tooltip_text (button,
2797 "This is button 2. This is also a really long tooltip which probably "
2798 "won't fit on a single line and will therefore need to be wrapped. "
2799 "Hopefully the wrapping will work correctly.");
2801 toggle = gtk_toggle_button_new_with_label ("Override TipsQuery Label");
2802 gtk_box_pack_start (GTK_BOX (box2), toggle, TRUE, TRUE, 0);
2804 gtk_widget_set_tooltip_text (toggle, "Toggle TipsQuery view.");
2807 g_object_new (gtk_vbox_get_type (),
2808 "homogeneous", FALSE,
2815 g_object_new (gtk_button_get_type (),
2820 gtk_box_set_child_packing (GTK_BOX (box3), button, FALSE, FALSE, 0, GTK_PACK_START);
2821 gtk_widget_set_tooltip_text (button, "Start the Tooltips Inspector");
2823 frame = g_object_new (gtk_frame_get_type (),
2824 "label", "ToolTips Inspector",
2825 "label_xalign", (double) 0.5,
2831 gtk_box_set_child_packing (GTK_BOX (box2), frame, TRUE, TRUE, 10, GTK_PACK_START);
2833 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2834 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2836 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 10);
2837 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2838 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2840 button = gtk_button_new_with_label ("close");
2841 g_signal_connect_swapped (button, "clicked",
2842 G_CALLBACK (gtk_widget_destroy),
2844 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2845 gtk_widget_set_can_default (button, TRUE);
2846 gtk_widget_grab_default (button);
2848 gtk_widget_set_tooltip_text (button, "Push this button to close window");
2851 if (!gtk_widget_get_visible (window))
2852 gtk_widget_show_all (window);
2854 gtk_widget_destroy (window);
2862 pack_image (GtkWidget *box,
2866 gtk_box_pack_start (GTK_BOX (box),
2867 gtk_label_new (text),
2870 gtk_box_pack_start (GTK_BOX (box),
2876 create_image (GtkWidget *widget)
2878 static GtkWidget *window = NULL;
2885 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2887 gtk_window_set_screen (GTK_WINDOW (window),
2888 gtk_widget_get_screen (widget));
2890 /* this is bogus for testing drawing when allocation < request,
2891 * don't copy into real code
2893 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2895 g_signal_connect (window, "destroy",
2896 G_CALLBACK (gtk_widget_destroyed),
2899 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 5);
2901 gtk_container_add (GTK_CONTAINER (window), vbox);
2903 pack_image (vbox, "Stock Warning Dialog",
2904 gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
2905 GTK_ICON_SIZE_DIALOG));
2907 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
2909 pack_image (vbox, "Pixbuf",
2910 gtk_image_new_from_pixbuf (pixbuf));
2912 g_object_unref (pixbuf);
2915 if (!gtk_widget_get_visible (window))
2916 gtk_widget_show_all (window);
2918 gtk_widget_destroy (window);
2926 create_menu (GdkScreen *screen, gint depth, gint length, gboolean tearoff)
2929 GtkWidget *menuitem;
2938 menu = gtk_menu_new ();
2939 gtk_menu_set_screen (GTK_MENU (menu), screen);
2945 menuitem = gtk_tearoff_menu_item_new ();
2946 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2947 gtk_widget_show (menuitem);
2950 image = gtk_image_new_from_stock (GTK_STOCK_OPEN,
2951 GTK_ICON_SIZE_MENU);
2952 gtk_widget_show (image);
2953 menuitem = gtk_image_menu_item_new_with_label ("Image item");
2954 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
2955 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2956 gtk_widget_show (menuitem);
2958 for (i = 0, j = 1; i < length; i++, j++)
2960 sprintf (buf, "item %2d - %d", depth, j);
2962 menuitem = gtk_radio_menu_item_new_with_label (group, buf);
2963 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
2965 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2966 gtk_widget_show (menuitem);
2968 gtk_widget_set_sensitive (menuitem, FALSE);
2971 gtk_check_menu_item_set_inconsistent (GTK_CHECK_MENU_ITEM (menuitem),
2975 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem),
2976 create_menu (screen, depth - 1, 5, TRUE));
2983 create_table_menu (GdkScreen *screen, gint cols, gint rows, gboolean tearoff)
2986 GtkWidget *menuitem;
2992 menu = gtk_menu_new ();
2993 gtk_menu_set_screen (GTK_MENU (menu), screen);
2998 menuitem = gtk_tearoff_menu_item_new ();
2999 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3000 gtk_widget_show (menuitem);
3004 menuitem = gtk_menu_item_new_with_label ("items");
3005 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3007 submenu = gtk_menu_new ();
3008 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3009 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3010 gtk_widget_show (menuitem);
3013 /* now fill the items submenu */
3014 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3015 GTK_ICON_SIZE_MENU);
3016 gtk_widget_show (image);
3017 menuitem = gtk_image_menu_item_new_with_label ("Image");
3018 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3019 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3020 gtk_widget_show (menuitem);
3022 menuitem = gtk_menu_item_new_with_label ("x");
3023 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 0, 1);
3024 gtk_widget_show (menuitem);
3026 menuitem = gtk_menu_item_new_with_label ("x");
3027 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 2);
3028 gtk_widget_show (menuitem);
3030 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3031 GTK_ICON_SIZE_MENU);
3032 gtk_widget_show (image);
3033 menuitem = gtk_image_menu_item_new_with_label ("Image");
3034 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3035 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3036 gtk_widget_show (menuitem);
3038 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3039 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 2, 3);
3040 gtk_widget_show (menuitem);
3042 menuitem = gtk_menu_item_new_with_label ("x");
3043 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 2, 3);
3044 gtk_widget_show (menuitem);
3046 menuitem = gtk_menu_item_new_with_label ("x");
3047 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 3, 4);
3048 gtk_widget_show (menuitem);
3050 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3051 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 3, 4);
3052 gtk_widget_show (menuitem);
3054 menuitem = gtk_check_menu_item_new_with_label ("Check");
3055 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 4, 5);
3056 gtk_widget_show (menuitem);
3058 menuitem = gtk_menu_item_new_with_label ("x");
3059 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 4, 5);
3060 gtk_widget_show (menuitem);
3062 menuitem = gtk_menu_item_new_with_label ("x");
3063 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 5, 6);
3064 gtk_widget_show (menuitem);
3066 menuitem = gtk_check_menu_item_new_with_label ("Check");
3067 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 5, 6);
3068 gtk_widget_show (menuitem);
3070 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3071 gtk_widget_show (menuitem);
3072 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 8);
3074 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3075 gtk_widget_show (menuitem);
3076 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 2);
3078 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3079 gtk_widget_show (menuitem);
3080 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 0);
3082 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3083 gtk_widget_show (menuitem);
3084 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, -1);
3086 /* end of items submenu */
3088 menuitem = gtk_menu_item_new_with_label ("spanning");
3089 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3091 submenu = gtk_menu_new ();
3092 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3093 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3094 gtk_widget_show (menuitem);
3097 /* now fill the spanning submenu */
3098 menuitem = gtk_menu_item_new_with_label ("a");
3099 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 2, 0, 1);
3100 gtk_widget_show (menuitem);
3102 menuitem = gtk_menu_item_new_with_label ("b");
3103 gtk_menu_attach (GTK_MENU (submenu), menuitem, 2, 3, 0, 2);
3104 gtk_widget_show (menuitem);
3106 menuitem = gtk_menu_item_new_with_label ("c");
3107 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 3);
3108 gtk_widget_show (menuitem);
3110 menuitem = gtk_menu_item_new_with_label ("d");
3111 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3112 gtk_widget_show (menuitem);
3114 menuitem = gtk_menu_item_new_with_label ("e");
3115 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 3, 2, 3);
3116 gtk_widget_show (menuitem);
3117 /* end of spanning submenu */
3119 menuitem = gtk_menu_item_new_with_label ("left");
3120 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, 1, j, j + 1);
3121 submenu = gtk_menu_new ();
3122 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3123 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3124 gtk_widget_show (menuitem);
3126 menuitem = gtk_menu_item_new_with_label ("Empty");
3127 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3128 submenu = gtk_menu_new ();
3129 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3130 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3131 gtk_widget_show (menuitem);
3133 menuitem = gtk_menu_item_new_with_label ("right");
3134 gtk_menu_attach (GTK_MENU (menu), menuitem, 1, 2, j, j + 1);
3135 submenu = gtk_menu_new ();
3136 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3137 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3138 gtk_widget_show (menuitem);
3140 menuitem = gtk_menu_item_new_with_label ("Empty");
3141 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3142 gtk_widget_show (menuitem);
3146 for (; j < rows; j++)
3147 for (i = 0; i < cols; i++)
3149 sprintf (buf, "(%d %d)", i, j);
3150 menuitem = gtk_menu_item_new_with_label (buf);
3151 gtk_menu_attach (GTK_MENU (menu), menuitem, i, i + 1, j, j + 1);
3152 gtk_widget_show (menuitem);
3155 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3156 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 8);
3157 gtk_widget_show (menuitem);
3158 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3159 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 2);
3160 gtk_widget_show (menuitem);
3161 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3162 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 0);
3163 gtk_widget_show (menuitem);
3164 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3165 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, -1);
3166 gtk_widget_show (menuitem);
3172 create_menus (GtkWidget *widget)
3174 static GtkWidget *window = NULL;
3178 GtkWidget *optionmenu;
3179 GtkWidget *separator;
3185 GtkWidget *menuitem;
3186 GtkAccelGroup *accel_group;
3188 GdkScreen *screen = gtk_widget_get_screen (widget);
3190 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3192 gtk_window_set_screen (GTK_WINDOW (window), screen);
3194 g_signal_connect (window, "destroy",
3195 G_CALLBACK (gtk_widget_destroyed),
3197 g_signal_connect (window, "delete-event",
3198 G_CALLBACK (gtk_true),
3201 accel_group = gtk_accel_group_new ();
3202 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3204 gtk_window_set_title (GTK_WINDOW (window), "menus");
3205 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3208 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
3209 gtk_container_add (GTK_CONTAINER (window), box1);
3210 gtk_widget_show (box1);
3212 menubar = gtk_menu_bar_new ();
3213 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3214 gtk_widget_show (menubar);
3216 menu = create_menu (screen, 2, 50, TRUE);
3218 menuitem = gtk_menu_item_new_with_label ("test\nline2");
3219 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3220 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3221 gtk_widget_show (menuitem);
3223 menu = create_table_menu (screen, 2, 50, TRUE);
3225 menuitem = gtk_menu_item_new_with_label ("table");
3226 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3227 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3228 gtk_widget_show (menuitem);
3230 menuitem = gtk_menu_item_new_with_label ("foo");
3231 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5, TRUE));
3232 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3233 gtk_widget_show (menuitem);
3235 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3236 GTK_ICON_SIZE_MENU);
3237 gtk_widget_show (image);
3238 menuitem = gtk_image_menu_item_new_with_label ("Help");
3239 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3240 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 4, 5, TRUE));
3241 gtk_menu_item_set_right_justified (GTK_MENU_ITEM (menuitem), TRUE);
3242 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3243 gtk_widget_show (menuitem);
3245 menubar = gtk_menu_bar_new ();
3246 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3247 gtk_widget_show (menubar);
3249 menu = create_menu (screen, 2, 10, TRUE);
3251 menuitem = gtk_menu_item_new_with_label ("Second menu bar");
3252 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3253 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3254 gtk_widget_show (menuitem);
3256 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 10);
3257 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3258 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3259 gtk_widget_show (box2);
3261 menu = create_menu (screen, 1, 5, FALSE);
3262 gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
3264 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
3265 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3266 gtk_widget_show (menuitem);
3268 menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
3269 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3270 gtk_widget_show (menuitem);
3271 gtk_widget_add_accelerator (menuitem,
3277 menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
3278 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3279 gtk_widget_show (menuitem);
3280 gtk_widget_add_accelerator (menuitem,
3285 GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3286 menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
3287 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3288 gtk_widget_show (menuitem);
3289 gtk_widget_add_accelerator (menuitem,
3295 gtk_widget_add_accelerator (menuitem,
3302 optionmenu = gtk_combo_box_text_new ();
3303 gtk_combo_box_set_active (GTK_COMBO_BOX (optionmenu), 3);
3304 gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
3305 gtk_widget_show (optionmenu);
3307 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
3308 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3309 gtk_widget_show (separator);
3311 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 10);
3312 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3313 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3314 gtk_widget_show (box2);
3316 button = gtk_button_new_with_label ("close");
3317 g_signal_connect_swapped (button, "clicked",
3318 G_CALLBACK (gtk_widget_destroy),
3320 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3321 gtk_widget_set_can_default (button, TRUE);
3322 gtk_widget_grab_default (button);
3323 gtk_widget_show (button);
3326 if (!gtk_widget_get_visible (window))
3327 gtk_widget_show (window);
3329 gtk_widget_destroy (window);
3332 /* GdkPixbuf RGBA C-Source image dump */
3334 static const guint8 apple[] =
3336 /* Pixbuf magic (0x47646b50) */
3338 /* length: header (24) + pixel_data (2304) */
3340 /* pixdata_type (0x1010002) */
3342 /* rowstride (96) */
3349 "\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"
3350 "\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"
3351 "\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"
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\26\24"
3356 "\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"
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`m"
3358 "[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"
3359 "\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"
3360 "\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"
3361 "\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"
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`l\\\20iw_\356y\211h\373x\207g\364~\216i\364u\204e\366gt"
3364 "_\374^jX\241A;-_\0\0\0~\0\0\0\0SM4)SM21B9&\22\320\270\204\1\320\270\204"
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\0eq"
3366 "]\212r\200c\366v\205f\371jx_\323_kY\232_kZH^jY\26]iW\211@G9\272:6%j\220"
3367 "\211]\320\221\211`\377\212\203Z\377~xP\377mkE\331]^;|/0\37\21\0\0\0\0"
3368 "\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["
3369 "eT<\216\200Z\203\227\211_\354\234\217c\377\232\217b\362\232\220c\337"
3370 "\243\233k\377\252\241p\377\250\236p\377\241\225h\377\231\214_\377\210"
3371 "\202U\377srI\377[]:\355KO0U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0i"
3372 "v^\200`lY\211^jY\"\0\0\0\0\221\204\\\273\250\233r\377\302\267\224\377"
3373 "\311\300\237\377\272\256\204\377\271\256\177\377\271\257\200\377\267"
3374 "\260\177\377\260\251x\377\250\236l\377\242\225e\377\226\213]\377~zP\377"
3375 "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"
3376 "\0\213\203[v\253\240t\377\334\326\301\377\344\340\317\377\321\312\253"
3377 "\377\303\271\217\377\300\270\213\377\277\267\210\377\272\264\203\377"
3378 "\261\255z\377\250\242n\377\243\232h\377\232\220`\377\210\202V\377nnE"
3379 "\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"
3380 "\234\222e\362\304\274\232\377\337\333\306\377\332\325\273\377\311\302"
3381 "\232\377\312\303\236\377\301\273\216\377\300\271\212\377\270\264\200"
3382 "\377\256\253v\377\246\243n\377\236\232h\377\230\220`\377\213\203V\377"
3383 "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"
3384 "\203Zl\242\234l\377\321\315\260\377\331\324\271\377\320\313\251\377\307"
3385 "\301\232\377\303\276\224\377\300\272\214\377\274\267\206\377\264\260"
3386 "|\377\253\251s\377\244\243n\377\232\230e\377\223\216^\377\207\200U\377"
3387 "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"
3388 "\210\204Y\240\245\237o\377\316\310\253\377\310\303\237\377\304\300\230"
3389 "\377\303\277\225\377\277\272\216\377\274\270\210\377\266\263\200\377"
3390 "\256\254v\377\247\246p\377\237\236j\377\227\226d\377\215\212[\377\203"
3391 "\177T\377qsH\377X]8\377FN.\377DK-\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3392 "\0\0\0\0\207\204X\257\244\240o\377\300\275\231\377\301\275\226\377\274"
3393 "\270\213\377\274\270\214\377\267\264\205\377\264\262\200\377\260\256"
3394 "z\377\251\251s\377\243\244n\377\231\232g\377\220\222`\377\210\211Y\377"
3395 "|}Q\377hlC\377PU3\377CK,\377DL/Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3396 "\0\0\205\204X\220\232\230h\377\261\260\204\377\266\264\212\377\261\260"
3397 "\201\377\263\260\200\377\260\257}\377\256\256x\377\253\254t\377\244\246"
3398 "o\377\233\236i\377\221\224b\377\211\214\\\377\202\204V\377txM\377]b>"
3399 "\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>"
3400 "\215\215_\377\237\237r\377\247\247x\377\247\247t\377\252\252w\377\252"
3401 "\252u\377\252\253t\377\243\246o\377\235\240j\377\223\230c\377\213\217"
3402 "]\377\201\206V\377x}P\377gkD\377RY5\377BI,\377AI,\262\0\0\0\0\0\0\0\0"
3403 "\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"
3404 "\232g\377\234\236i\377\236\241l\377\241\244n\377\240\244m\377\232\237"
3405 "i\377\223\230c\377\212\221]\377\200\210W\377v|P\377jnG\377Za>\377HP2"
3406 "\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"
3407 "\0wzQ6\177\201U\371\206\211Z\377\216\222`\377\220\225a\377\220\225b\377"
3408 "\220\226a\377\213\221_\377\204\213Z\377{\203R\377ryN\377iqH\377^fA\377"
3409 "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"
3410 "\0\0\0\0\0\0\0\0\0\0\0\0ptJTw|Q\371z\177R\377}\202T\377|\203T\377z\200"
3411 "R\377v|O\377pwL\377jpF\377dlB\377`hB\377Yb@\377LT6\377<C*\377\11\12\6"
3412 "\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"
3413 "\0\0\0\0\0\0\0\0\0\0\\`=UgnE\370hnG\377gmE\377djB\377]d>\377[c<\377Y"
3414 "b<\377Zc>\377V_>\377OW8\377BK/\377\16\20\12\377\0\0\0\377\0\0\0\377\0"
3415 "\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"
3416 "\0\1\0\0\0\40\22\24\15\260@D+\377W`;\377OV5\377.3\36\377.3\37\377IP0"
3417 "\377RZ7\377PZ8\3776=&\377\14\15\10\377\0\0\0\377\0\0\0\377\0\0\0\377"
3418 "\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"
3419 "\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"
3420 "\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"
3421 "\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"
3422 "\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"
3423 "\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"
3424 "\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"
3425 "\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"
3426 "\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"
3427 "\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
3431 accel_button_new (GtkAccelGroup *accel_group,
3436 GdkModifierType modifiers;
3440 gtk_accelerator_parse (accel, &keyval, &modifiers);
3443 button = gtk_button_new ();
3444 gtk_widget_add_accelerator (button, "activate", accel_group,
3445 keyval, modifiers, GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3447 label = gtk_accel_label_new (text);
3448 gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), button);
3449 gtk_widget_show (label);
3451 gtk_container_add (GTK_CONTAINER (button), label);
3457 create_key_lookup (GtkWidget *widget)
3459 static GtkWidget *window = NULL;
3460 gpointer window_ptr;
3464 GtkAccelGroup *accel_group = gtk_accel_group_new ();
3466 GtkWidget *content_area;
3468 window = gtk_dialog_new_with_buttons ("Key Lookup", NULL, 0,
3469 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
3472 gtk_window_set_screen (GTK_WINDOW (window),
3473 gtk_widget_get_screen (widget));
3475 /* We have to expand it so the accel labels will draw their labels
3477 gtk_window_set_default_size (GTK_WINDOW (window), 300, -1);
3479 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3481 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
3483 button = gtk_button_new_with_mnemonic ("Button 1 (_a)");
3484 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3485 button = gtk_button_new_with_mnemonic ("Button 2 (_A)");
3486 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3487 button = gtk_button_new_with_mnemonic ("Button 3 (_\321\204)");
3488 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3489 button = gtk_button_new_with_mnemonic ("Button 4 (_\320\244)");
3490 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3491 button = gtk_button_new_with_mnemonic ("Button 6 (_b)");
3492 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3493 button = accel_button_new (accel_group, "Button 7", "<Alt><Shift>b");
3494 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3495 button = accel_button_new (accel_group, "Button 8", "<Alt>d");
3496 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3497 button = accel_button_new (accel_group, "Button 9", "<Alt>Cyrillic_ve");
3498 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3499 button = gtk_button_new_with_mnemonic ("Button 10 (_1)");
3500 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3501 button = gtk_button_new_with_mnemonic ("Button 11 (_!)");
3502 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3503 button = accel_button_new (accel_group, "Button 12", "<Super>a");
3504 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3505 button = accel_button_new (accel_group, "Button 13", "<Hyper>a");
3506 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3507 button = accel_button_new (accel_group, "Button 14", "<Meta>a");
3508 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3509 button = accel_button_new (accel_group, "Button 15", "<Shift><Mod4>b");
3510 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3512 window_ptr = &window;
3513 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
3514 g_signal_connect (window, "response", G_CALLBACK (gtk_widget_destroy), NULL);
3516 gtk_widget_show_all (window);
3519 gtk_widget_destroy (window);
3528 cmw_destroy_cb(GtkWidget *widget)
3530 /* This is needed to get out of gtk_main */
3537 cmw_color (GtkWidget *widget, GtkWidget *parent)
3540 GtkWidget *colorsel;
3541 GtkWidget *ok_button, *cancel_button;
3543 csd = gtk_color_selection_dialog_new ("This is a modal color selection dialog");
3545 gtk_window_set_screen (GTK_WINDOW (csd), gtk_widget_get_screen (parent));
3547 colorsel = gtk_color_selection_dialog_get_color_selection (GTK_COLOR_SELECTION_DIALOG (csd));
3548 gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (colorsel),
3552 gtk_window_set_modal (GTK_WINDOW(csd),TRUE);
3554 /* And mark it as a transient dialog */
3555 gtk_window_set_transient_for (GTK_WINDOW (csd), GTK_WINDOW (parent));
3557 g_signal_connect (csd, "destroy",
3558 G_CALLBACK (cmw_destroy_cb), NULL);
3561 "ok-button", &ok_button,
3562 "cancel-button", &cancel_button,
3565 g_signal_connect_swapped (ok_button,
3566 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
3567 g_signal_connect_swapped (cancel_button,
3568 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
3570 /* wait until destroy calls gtk_main_quit */
3571 gtk_widget_show (csd);
3576 cmw_file (GtkWidget *widget, GtkWidget *parent)
3580 fs = gtk_file_chooser_dialog_new ("This is a modal file selection dialog",
3581 GTK_WINDOW (parent), GTK_FILE_CHOOSER_ACTION_OPEN,
3582 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
3583 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
3585 gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent));
3586 gtk_window_set_modal (GTK_WINDOW (fs), TRUE);
3588 g_signal_connect (fs, "destroy",
3589 G_CALLBACK (cmw_destroy_cb), NULL);
3590 g_signal_connect_swapped (fs, "response",
3591 G_CALLBACK (gtk_widget_destroy), fs);
3593 /* wait until destroy calls gtk_main_quit */
3594 gtk_widget_show (fs);
3600 create_modal_window (GtkWidget *widget)
3602 GtkWidget *window = NULL;
3603 GtkWidget *box1,*box2;
3605 GtkWidget *btnColor,*btnFile,*btnClose;
3607 /* Create modal window (Here you can use any window descendent )*/
3608 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3609 gtk_window_set_screen (GTK_WINDOW (window),
3610 gtk_widget_get_screen (widget));
3612 gtk_window_set_title (GTK_WINDOW(window),"This window is modal");
3614 /* Set window as modal */
3615 gtk_window_set_modal (GTK_WINDOW(window),TRUE);
3617 /* Create widgets */
3618 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE,5);
3619 frame1 = gtk_frame_new ("Standard dialogs in modal form");
3620 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, TRUE,5);
3621 btnColor = gtk_button_new_with_label ("Color");
3622 btnFile = gtk_button_new_with_label ("File Selection");
3623 btnClose = gtk_button_new_with_label ("Close");
3626 gtk_container_set_border_width (GTK_CONTAINER (box1), 3);
3627 gtk_container_set_border_width (GTK_CONTAINER (box2), 3);
3630 gtk_container_add (GTK_CONTAINER (window), box1);
3631 gtk_box_pack_start (GTK_BOX (box1), frame1, TRUE, TRUE, 4);
3632 gtk_container_add (GTK_CONTAINER (frame1), box2);
3633 gtk_box_pack_start (GTK_BOX (box2), btnColor, FALSE, FALSE, 4);
3634 gtk_box_pack_start (GTK_BOX (box2), btnFile, FALSE, FALSE, 4);
3635 gtk_box_pack_start (GTK_BOX (box1), gtk_separator_new (GTK_ORIENTATION_HORIZONTAL), FALSE, FALSE, 4);
3636 gtk_box_pack_start (GTK_BOX (box1), btnClose, FALSE, FALSE, 4);
3638 /* connect signals */
3639 g_signal_connect_swapped (btnClose, "clicked",
3640 G_CALLBACK (gtk_widget_destroy), window);
3642 g_signal_connect (window, "destroy",
3643 G_CALLBACK (cmw_destroy_cb), NULL);
3645 g_signal_connect (btnColor, "clicked",
3646 G_CALLBACK (cmw_color), window);
3647 g_signal_connect (btnFile, "clicked",
3648 G_CALLBACK (cmw_file), window);
3651 gtk_widget_show_all (window);
3653 /* wait until dialog get destroyed */
3662 make_message_dialog (GdkScreen *screen,
3664 GtkMessageType type,
3665 GtkButtonsType buttons,
3666 guint default_response)
3670 gtk_widget_destroy (*dialog);
3675 *dialog = gtk_message_dialog_new (NULL, 0, type, buttons,
3676 "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.)");
3678 gtk_window_set_screen (GTK_WINDOW (*dialog), screen);
3680 g_signal_connect_swapped (*dialog,
3682 G_CALLBACK (gtk_widget_destroy),
3685 g_signal_connect (*dialog,
3687 G_CALLBACK (gtk_widget_destroyed),
3690 gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
3692 gtk_widget_show (*dialog);
3696 create_message_dialog (GtkWidget *widget)
3698 static GtkWidget *info = NULL;
3699 static GtkWidget *warning = NULL;
3700 static GtkWidget *error = NULL;
3701 static GtkWidget *question = NULL;
3702 GdkScreen *screen = gtk_widget_get_screen (widget);
3704 make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK);
3705 make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE);
3706 make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK);
3707 make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_NO);
3714 static GtkWidget *sw_parent = NULL;
3715 static GtkWidget *sw_float_parent;
3716 static gulong sw_destroyed_handler = 0;
3719 scrolled_windows_delete_cb (GtkWidget *widget, GdkEventAny *event, GtkWidget *scrollwin)
3721 gtk_widget_reparent (scrollwin, sw_parent);
3723 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
3724 sw_float_parent = NULL;
3726 sw_destroyed_handler = 0;
3732 scrolled_windows_destroy_cb (GtkWidget *widget, GtkWidget *scrollwin)
3734 gtk_widget_destroy (sw_float_parent);
3736 sw_float_parent = NULL;
3738 sw_destroyed_handler = 0;
3742 scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
3746 gtk_widget_reparent (scrollwin, sw_parent);
3747 gtk_widget_destroy (sw_float_parent);
3749 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
3750 sw_float_parent = NULL;
3752 sw_destroyed_handler = 0;
3756 sw_parent = gtk_widget_get_parent (scrollwin);
3757 sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3758 gtk_window_set_screen (GTK_WINDOW (sw_float_parent),
3759 gtk_widget_get_screen (widget));
3761 gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200);
3763 gtk_widget_reparent (scrollwin, sw_float_parent);
3764 gtk_widget_show (sw_float_parent);
3766 sw_destroyed_handler =
3767 g_signal_connect (sw_parent, "destroy",
3768 G_CALLBACK (scrolled_windows_destroy_cb), scrollwin);
3769 g_signal_connect (sw_float_parent, "delete_event",
3770 G_CALLBACK (scrolled_windows_delete_cb), scrollwin);
3775 create_scrolled_windows (GtkWidget *widget)
3777 static GtkWidget *window;
3778 GtkWidget *content_area, *action_area;
3779 GtkWidget *scrolled_window;
3787 window = gtk_dialog_new ();
3789 gtk_window_set_screen (GTK_WINDOW (window),
3790 gtk_widget_get_screen (widget));
3792 g_signal_connect (window, "destroy",
3793 G_CALLBACK (gtk_widget_destroyed),
3796 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
3797 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
3799 gtk_window_set_title (GTK_WINDOW (window), "dialog");
3800 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3802 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
3803 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
3804 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
3805 GTK_POLICY_AUTOMATIC,
3806 GTK_POLICY_AUTOMATIC);
3807 gtk_box_pack_start (GTK_BOX (content_area), scrolled_window, TRUE, TRUE, 0);
3808 gtk_widget_show (scrolled_window);
3810 table = gtk_table_new (20, 20, FALSE);
3811 gtk_table_set_row_spacings (GTK_TABLE (table), 10);
3812 gtk_table_set_col_spacings (GTK_TABLE (table), 10);
3813 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
3814 gtk_container_set_focus_hadjustment (GTK_CONTAINER (table),
3815 gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
3816 gtk_container_set_focus_vadjustment (GTK_CONTAINER (table),
3817 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
3818 gtk_widget_show (table);
3820 for (i = 0; i < 20; i++)
3821 for (j = 0; j < 20; j++)
3823 sprintf (buffer, "button (%d,%d)\n", i, j);
3824 button = gtk_toggle_button_new_with_label (buffer);
3825 gtk_table_attach_defaults (GTK_TABLE (table), button,
3827 gtk_widget_show (button);
3831 button = gtk_button_new_with_label ("Close");
3832 g_signal_connect_swapped (button, "clicked",
3833 G_CALLBACK (gtk_widget_destroy),
3835 gtk_widget_set_can_default (button, TRUE);
3836 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
3837 gtk_widget_grab_default (button);
3838 gtk_widget_show (button);
3840 button = gtk_button_new_with_label ("Reparent Out");
3841 g_signal_connect (button, "clicked",
3842 G_CALLBACK (scrolled_windows_remove),
3844 gtk_widget_set_can_default (button, TRUE);
3845 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
3846 gtk_widget_grab_default (button);
3847 gtk_widget_show (button);
3849 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
3852 if (!gtk_widget_get_visible (window))
3853 gtk_widget_show (window);
3855 gtk_widget_destroy (window);
3863 entry_toggle_frame (GtkWidget *checkbutton,
3866 gtk_entry_set_has_frame (GTK_ENTRY(entry),
3867 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
3871 entry_toggle_sensitive (GtkWidget *checkbutton,
3874 gtk_widget_set_sensitive (entry,
3875 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(checkbutton)));
3879 entry_progress_timeout (gpointer data)
3881 if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (data), "progress-pulse")))
3883 gtk_entry_progress_pulse (GTK_ENTRY (data));
3889 fraction = gtk_entry_get_progress_fraction (GTK_ENTRY (data));
3892 if (fraction > 1.0001)
3895 gtk_entry_set_progress_fraction (GTK_ENTRY (data), fraction);
3902 entry_remove_timeout (gpointer data)
3904 g_source_remove (GPOINTER_TO_UINT (data));
3908 entry_toggle_progress (GtkWidget *checkbutton,
3911 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)))
3913 guint timeout = gdk_threads_add_timeout (100,
3914 entry_progress_timeout,
3916 g_object_set_data_full (G_OBJECT (entry), "timeout-id",
3917 GUINT_TO_POINTER (timeout),
3918 entry_remove_timeout);
3922 g_object_set_data (G_OBJECT (entry), "timeout-id",
3923 GUINT_TO_POINTER (0));
3925 gtk_entry_set_progress_fraction (GTK_ENTRY (entry), 0.0);
3930 entry_toggle_pulse (GtkWidget *checkbutton,
3933 g_object_set_data (G_OBJECT (entry), "progress-pulse",
3934 GUINT_TO_POINTER ((guint) gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton))));
3938 props_clicked (GtkWidget *button,
3941 GtkWidget *window = create_prop_editor (object, 0);
3943 gtk_window_set_title (GTK_WINDOW (window), "Object Properties");
3947 create_entry (GtkWidget *widget)
3949 static GtkWidget *window = NULL;
3953 GtkWidget *has_frame_check;
3954 GtkWidget *sensitive_check;
3955 GtkWidget *progress_check;
3957 GtkComboBoxText *cb;
3958 GtkWidget *cb_entry;
3960 GtkWidget *separator;
3964 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3965 gtk_window_set_screen (GTK_WINDOW (window),
3966 gtk_widget_get_screen (widget));
3968 g_signal_connect (window, "destroy",
3969 G_CALLBACK (gtk_widget_destroyed),
3972 gtk_window_set_title (GTK_WINDOW (window), "entry");
3973 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3976 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
3977 gtk_container_add (GTK_CONTAINER (window), box1);
3980 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 10);
3981 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3982 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3984 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 5);
3985 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
3987 entry = gtk_entry_new ();
3988 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");
3989 gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5);
3990 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
3992 button = gtk_button_new_with_mnemonic ("_Props");
3993 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
3994 g_signal_connect (button, "clicked",
3995 G_CALLBACK (props_clicked),
3998 cb = GTK_COMBO_BOX_TEXT (gtk_combo_box_text_new_with_entry ());
4000 gtk_combo_box_text_append_text (cb, "item0");
4001 gtk_combo_box_text_append_text (cb, "item0");
4002 gtk_combo_box_text_append_text (cb, "item1 item1");
4003 gtk_combo_box_text_append_text (cb, "item2 item2 item2");
4004 gtk_combo_box_text_append_text (cb, "item3 item3 item3 item3");
4005 gtk_combo_box_text_append_text (cb, "item4 item4 item4 item4 item4");
4006 gtk_combo_box_text_append_text (cb, "item5 item5 item5 item5 item5 item5");
4007 gtk_combo_box_text_append_text (cb, "item6 item6 item6 item6 item6");
4008 gtk_combo_box_text_append_text (cb, "item7 item7 item7 item7");
4009 gtk_combo_box_text_append_text (cb, "item8 item8 item8");
4010 gtk_combo_box_text_append_text (cb, "item9 item9");
4012 cb_entry = gtk_bin_get_child (GTK_BIN (cb));
4013 gtk_entry_set_text (GTK_ENTRY (cb_entry), "hello world \n\n\n foo");
4014 gtk_editable_select_region (GTK_EDITABLE (cb_entry), 0, -1);
4015 gtk_box_pack_start (GTK_BOX (box2), GTK_WIDGET (cb), TRUE, TRUE, 0);
4017 sensitive_check = gtk_check_button_new_with_label("Sensitive");
4018 gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0);
4019 g_signal_connect (sensitive_check, "toggled",
4020 G_CALLBACK (entry_toggle_sensitive), entry);
4021 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sensitive_check), TRUE);
4023 has_frame_check = gtk_check_button_new_with_label("Has Frame");
4024 gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0);
4025 g_signal_connect (has_frame_check, "toggled",
4026 G_CALLBACK (entry_toggle_frame), entry);
4027 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
4029 progress_check = gtk_check_button_new_with_label("Show Progress");
4030 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4031 g_signal_connect (progress_check, "toggled",
4032 G_CALLBACK (entry_toggle_progress), entry);
4034 progress_check = gtk_check_button_new_with_label("Pulse Progress");
4035 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4036 g_signal_connect (progress_check, "toggled",
4037 G_CALLBACK (entry_toggle_pulse), entry);
4039 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
4040 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4042 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 10);
4043 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4044 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4046 button = gtk_button_new_with_label ("close");
4047 g_signal_connect_swapped (button, "clicked",
4048 G_CALLBACK (gtk_widget_destroy),
4050 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4051 gtk_widget_set_can_default (button, TRUE);
4052 gtk_widget_grab_default (button);
4055 if (!gtk_widget_get_visible (window))
4056 gtk_widget_show_all (window);
4058 gtk_widget_destroy (window);
4062 create_expander (GtkWidget *widget)
4065 GtkWidget *expander;
4067 static GtkWidget *window = NULL;
4071 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4072 gtk_window_set_screen (GTK_WINDOW (window),
4073 gtk_widget_get_screen (widget));
4075 g_signal_connect (window, "destroy",
4076 G_CALLBACK (gtk_widget_destroyed),
4079 gtk_window_set_title (GTK_WINDOW (window), "expander");
4080 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4082 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
4083 gtk_container_add (GTK_CONTAINER (window), box1);
4085 expander = gtk_expander_new ("The Hidden");
4087 gtk_box_pack_start (GTK_BOX (box1), expander, TRUE, TRUE, 0);
4089 hidden = gtk_label_new ("Revealed!");
4091 gtk_container_add (GTK_CONTAINER (expander), hidden);
4094 if (!gtk_widget_get_visible (window))
4095 gtk_widget_show_all (window);
4097 gtk_widget_destroy (window);
4105 event_box_label_pressed (GtkWidget *widget,
4106 GdkEventButton *event,
4109 g_print ("clicked on event box\n");
4113 event_box_button_clicked (GtkWidget *widget,
4117 g_print ("pushed button\n");
4121 event_box_toggle_visible_window (GtkWidget *checkbutton,
4122 GtkEventBox *event_box)
4124 gtk_event_box_set_visible_window (event_box,
4125 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
4129 event_box_toggle_above_child (GtkWidget *checkbutton,
4130 GtkEventBox *event_box)
4132 gtk_event_box_set_above_child (event_box,
4133 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
4137 create_event_box (GtkWidget *widget)
4139 static GtkWidget *window = NULL;
4145 GtkWidget *separator;
4146 GtkWidget *event_box;
4148 GtkWidget *visible_window_check;
4149 GtkWidget *above_child_check;
4158 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4159 gtk_window_set_screen (GTK_WINDOW (window),
4160 gtk_widget_get_screen (widget));
4162 g_signal_connect (window, "destroy",
4163 G_CALLBACK (gtk_widget_destroyed),
4166 gtk_window_set_title (GTK_WINDOW (window), "event box");
4167 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4169 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
4170 gtk_container_add (GTK_CONTAINER (window), box1);
4171 gtk_widget_modify_bg (window, GTK_STATE_NORMAL, &color);
4173 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
4174 gtk_box_pack_start (GTK_BOX (box1), hbox, TRUE, FALSE, 0);
4176 event_box = gtk_event_box_new ();
4177 gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, FALSE, 0);
4179 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
4180 gtk_container_add (GTK_CONTAINER (event_box), vbox);
4181 g_signal_connect (event_box, "button_press_event",
4182 G_CALLBACK (event_box_label_pressed),
4185 label = gtk_label_new ("Click on this label");
4186 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
4188 button = gtk_button_new_with_label ("button in eventbox");
4189 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, FALSE, 0);
4190 g_signal_connect (button, "clicked",
4191 G_CALLBACK (event_box_button_clicked),
4195 visible_window_check = gtk_check_button_new_with_label("Visible Window");
4196 gtk_box_pack_start (GTK_BOX (box1), visible_window_check, FALSE, TRUE, 0);
4197 g_signal_connect (visible_window_check, "toggled",
4198 G_CALLBACK (event_box_toggle_visible_window), event_box);
4199 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (visible_window_check), FALSE);
4201 above_child_check = gtk_check_button_new_with_label("Above Child");
4202 gtk_box_pack_start (GTK_BOX (box1), above_child_check, FALSE, TRUE, 0);
4203 g_signal_connect (above_child_check, "toggled",
4204 G_CALLBACK (event_box_toggle_above_child), event_box);
4205 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (above_child_check), FALSE);
4207 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
4208 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4210 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 10);
4211 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4212 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4214 button = gtk_button_new_with_label ("close");
4215 g_signal_connect_swapped (button, "clicked",
4216 G_CALLBACK (gtk_widget_destroy),
4218 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4219 gtk_widget_set_can_default (button, TRUE);
4220 gtk_widget_grab_default (button);
4223 if (!gtk_widget_get_visible (window))
4224 gtk_widget_show_all (window);
4226 gtk_widget_destroy (window);
4234 #define SIZE_GROUP_INITIAL_SIZE 50
4237 size_group_hsize_changed (GtkSpinButton *spin_button,
4240 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4241 gtk_spin_button_get_value_as_int (spin_button),
4246 size_group_vsize_changed (GtkSpinButton *spin_button,
4249 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4251 gtk_spin_button_get_value_as_int (spin_button));
4255 create_size_group_window (GdkScreen *screen,
4256 GtkSizeGroup *master_size_group)
4258 GtkWidget *content_area;
4261 GtkWidget *main_button;
4263 GtkWidget *spin_button;
4265 GtkSizeGroup *hgroup1;
4266 GtkSizeGroup *hgroup2;
4267 GtkSizeGroup *vgroup1;
4268 GtkSizeGroup *vgroup2;
4270 window = gtk_dialog_new_with_buttons ("GtkSizeGroup",
4276 gtk_window_set_screen (GTK_WINDOW (window), screen);
4278 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
4280 g_signal_connect (window, "response",
4281 G_CALLBACK (gtk_widget_destroy),
4284 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
4286 table = gtk_table_new (2, 2, FALSE);
4287 gtk_box_pack_start (GTK_BOX (content_area), table, TRUE, TRUE, 0);
4289 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
4290 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
4291 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
4292 gtk_widget_set_size_request (table, 250, 250);
4294 hgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4295 hgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4296 vgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4297 vgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4299 main_button = gtk_button_new_with_label ("X");
4301 gtk_table_attach (GTK_TABLE (table), main_button,
4303 GTK_EXPAND, GTK_EXPAND,
4305 gtk_size_group_add_widget (master_size_group, main_button);
4306 gtk_size_group_add_widget (hgroup1, main_button);
4307 gtk_size_group_add_widget (vgroup1, main_button);
4308 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (main_button)),
4309 SIZE_GROUP_INITIAL_SIZE,
4310 SIZE_GROUP_INITIAL_SIZE);
4312 button = gtk_button_new ();
4313 gtk_table_attach (GTK_TABLE (table), button,
4315 GTK_EXPAND, GTK_EXPAND,
4317 gtk_size_group_add_widget (vgroup1, button);
4318 gtk_size_group_add_widget (vgroup2, button);
4320 button = gtk_button_new ();
4321 gtk_table_attach (GTK_TABLE (table), button,
4323 GTK_EXPAND, GTK_EXPAND,
4325 gtk_size_group_add_widget (hgroup1, button);
4326 gtk_size_group_add_widget (hgroup2, button);
4328 button = gtk_button_new ();
4329 gtk_table_attach (GTK_TABLE (table), button,
4331 GTK_EXPAND, GTK_EXPAND,
4333 gtk_size_group_add_widget (hgroup2, button);
4334 gtk_size_group_add_widget (vgroup2, button);
4336 g_object_unref (hgroup1);
4337 g_object_unref (hgroup2);
4338 g_object_unref (vgroup1);
4339 g_object_unref (vgroup2);
4341 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 5);
4342 gtk_box_pack_start (GTK_BOX (content_area), hbox, FALSE, FALSE, 0);
4344 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4345 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4346 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4347 g_signal_connect (spin_button, "value_changed",
4348 G_CALLBACK (size_group_hsize_changed), main_button);
4350 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4351 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4352 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4353 g_signal_connect (spin_button, "value_changed",
4354 G_CALLBACK (size_group_vsize_changed), main_button);
4360 create_size_groups (GtkWidget *widget)
4362 static GtkWidget *window1 = NULL;
4363 static GtkWidget *window2 = NULL;
4364 static GtkSizeGroup *master_size_group;
4366 if (!master_size_group)
4367 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
4371 window1 = create_size_group_window (gtk_widget_get_screen (widget),
4374 g_signal_connect (window1, "destroy",
4375 G_CALLBACK (gtk_widget_destroyed),
4381 window2 = create_size_group_window (gtk_widget_get_screen (widget),
4384 g_signal_connect (window2, "destroy",
4385 G_CALLBACK (gtk_widget_destroyed),
4389 if (gtk_widget_get_visible (window1) && gtk_widget_get_visible (window2))
4391 gtk_widget_destroy (window1);
4392 gtk_widget_destroy (window2);
4396 if (!gtk_widget_get_visible (window1))
4397 gtk_widget_show_all (window1);
4398 if (!gtk_widget_get_visible (window2))
4399 gtk_widget_show_all (window2);
4407 static GtkWidget *spinner1;
4410 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
4412 gtk_spin_button_set_snap_to_ticks (spin,
4413 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
4417 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
4419 gtk_spin_button_set_numeric (spin,
4420 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
4424 change_digits (GtkWidget *widget, GtkSpinButton *spin)
4426 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
4427 gtk_spin_button_get_value_as_int (spin));
4431 get_value (GtkWidget *widget, gpointer data)
4435 GtkSpinButton *spin;
4437 spin = GTK_SPIN_BUTTON (spinner1);
4438 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
4439 if (GPOINTER_TO_INT (data) == 1)
4440 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
4442 sprintf (buf, "%0.*f",
4443 gtk_spin_button_get_digits (spin),
4444 gtk_spin_button_get_value (spin));
4446 gtk_label_set_text (label, buf);
4450 get_spin_value (GtkWidget *widget, gpointer data)
4454 GtkSpinButton *spin;
4456 spin = GTK_SPIN_BUTTON (widget);
4457 label = GTK_LABEL (data);
4459 buffer = g_strdup_printf ("%0.*f",
4460 gtk_spin_button_get_digits (spin),
4461 gtk_spin_button_get_value (spin));
4462 gtk_label_set_text (label, buffer);
4468 spin_button_time_output_func (GtkSpinButton *spin_button)
4470 GtkAdjustment *adjustment;
4471 static gchar buf[6];
4475 adjustment = gtk_spin_button_get_adjustment (spin_button);
4476 hours = gtk_adjustment_get_value (adjustment) / 60.0;
4477 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
4478 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
4479 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4480 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4485 spin_button_month_input_func (GtkSpinButton *spin_button,
4489 static gchar *month[12] = { "January", "February", "March", "April",
4490 "May", "June", "July", "August",
4491 "September", "October", "November", "December" };
4493 gboolean found = FALSE;
4495 for (i = 1; i <= 12; i++)
4497 tmp1 = g_ascii_strup (month[i - 1], -1);
4498 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
4499 if (strstr (tmp1, tmp2) == tmp1)
4509 return GTK_INPUT_ERROR;
4511 *new_val = (gdouble) i;
4516 spin_button_month_output_func (GtkSpinButton *spin_button)
4518 GtkAdjustment *adjustment;
4521 static gchar *month[12] = { "January", "February", "March", "April",
4522 "May", "June", "July", "August", "September",
4523 "October", "November", "December" };
4525 adjustment = gtk_spin_button_get_adjustment (spin_button);
4526 value = gtk_adjustment_get_value (adjustment);
4527 for (i = 1; i <= 12; i++)
4528 if (fabs (value - (double)i) < 1e-5)
4530 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
4531 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
4537 spin_button_hex_input_func (GtkSpinButton *spin_button,
4544 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
4545 res = strtol(buf, &err, 16);
4548 return GTK_INPUT_ERROR;
4554 spin_button_hex_output_func (GtkSpinButton *spin_button)
4556 GtkAdjustment *adjustment;
4557 static gchar buf[7];
4560 adjustment = gtk_spin_button_get_adjustment (spin_button);
4561 val = (gint) gtk_adjustment_get_value (adjustment);
4562 if (fabs (val) < 1e-5)
4563 sprintf (buf, "0x00");
4565 sprintf (buf, "0x%.2X", val);
4566 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4567 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4572 create_spins (GtkWidget *widget)
4574 static GtkWidget *window = NULL;
4577 GtkWidget *main_vbox;
4580 GtkWidget *spinner2;
4584 GtkWidget *val_label;
4589 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4590 gtk_window_set_screen (GTK_WINDOW (window),
4591 gtk_widget_get_screen (widget));
4593 g_signal_connect (window, "destroy",
4594 G_CALLBACK (gtk_widget_destroyed),
4597 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
4599 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 5);
4600 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
4601 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4603 frame = gtk_frame_new ("Not accelerated");
4604 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4606 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
4607 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4608 gtk_container_add (GTK_CONTAINER (frame), vbox);
4610 /* Time, month, hex spinners */
4612 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
4613 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
4615 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
4616 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4618 label = gtk_label_new ("Time :");
4619 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4620 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4622 adj = gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
4623 spinner = gtk_spin_button_new (adj, 0, 0);
4624 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
4625 g_signal_connect (spinner,
4627 G_CALLBACK (spin_button_time_output_func),
4629 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4630 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 5);
4631 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4633 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
4634 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4636 label = gtk_label_new ("Month :");
4637 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4638 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4640 adj = gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
4642 spinner = gtk_spin_button_new (adj, 0, 0);
4643 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
4644 GTK_UPDATE_IF_VALID);
4645 g_signal_connect (spinner,
4647 G_CALLBACK (spin_button_month_input_func),
4649 g_signal_connect (spinner,
4651 G_CALLBACK (spin_button_month_output_func),
4653 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4654 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 9);
4655 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4657 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
4658 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4660 label = gtk_label_new ("Hex :");
4661 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4662 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4664 adj = gtk_adjustment_new (0, 0, 255, 1, 16, 0);
4665 spinner = gtk_spin_button_new (adj, 0, 0);
4666 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
4667 g_signal_connect (spinner,
4669 G_CALLBACK (spin_button_hex_input_func),
4671 g_signal_connect (spinner,
4673 G_CALLBACK (spin_button_hex_output_func),
4675 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4676 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 4);
4677 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4679 frame = gtk_frame_new ("Accelerated");
4680 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4682 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
4683 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4684 gtk_container_add (GTK_CONTAINER (frame), vbox);
4686 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
4687 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4689 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
4690 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4692 label = gtk_label_new ("Value :");
4693 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4694 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4696 adj = gtk_adjustment_new (0.0, -10000.0, 10000.0,
4698 spinner1 = gtk_spin_button_new (adj, 1.0, 2);
4699 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
4700 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
4702 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
4703 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4705 label = gtk_label_new ("Digits :");
4706 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4707 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4709 adj = gtk_adjustment_new (2, 1, 15, 1, 1, 0);
4710 spinner2 = gtk_spin_button_new (adj, 0.0, 0);
4711 g_signal_connect (adj, "value_changed",
4712 G_CALLBACK (change_digits),
4714 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
4716 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
4717 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
4719 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
4720 g_signal_connect (button, "clicked",
4721 G_CALLBACK (toggle_snap),
4723 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4724 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4726 button = gtk_check_button_new_with_label ("Numeric only input mode");
4727 g_signal_connect (button, "clicked",
4728 G_CALLBACK (toggle_numeric),
4730 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4731 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4733 val_label = gtk_label_new ("");
4735 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
4736 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4738 button = gtk_button_new_with_label ("Value as Int");
4739 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4740 g_signal_connect (button, "clicked",
4741 G_CALLBACK (get_value),
4742 GINT_TO_POINTER (1));
4743 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4745 button = gtk_button_new_with_label ("Value as Float");
4746 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4747 g_signal_connect (button, "clicked",
4748 G_CALLBACK (get_value),
4749 GINT_TO_POINTER (2));
4750 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4752 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
4753 gtk_label_set_text (GTK_LABEL (val_label), "0");
4755 frame = gtk_frame_new ("Using Convenience Constructor");
4756 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4758 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
4759 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4760 gtk_container_add (GTK_CONTAINER (frame), hbox);
4762 val_label = gtk_label_new ("0.0");
4764 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
4765 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
4766 g_signal_connect (spinner, "value_changed",
4767 G_CALLBACK (get_spin_value), val_label);
4768 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
4769 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
4771 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
4772 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
4774 button = gtk_button_new_with_label ("Close");
4775 g_signal_connect_swapped (button, "clicked",
4776 G_CALLBACK (gtk_widget_destroy),
4778 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4781 if (!gtk_widget_get_visible (window))
4782 gtk_widget_show_all (window);
4784 gtk_widget_destroy (window);
4793 cursor_draw (GtkWidget *widget,
4799 width = gtk_widget_get_allocated_width (widget);
4800 height = gtk_widget_get_allocated_height (widget);
4802 cairo_set_source_rgb (cr, 1, 1, 1);
4803 cairo_rectangle (cr, 0, 0, width, height / 2);
4806 cairo_set_source_rgb (cr, 0, 0, 0);
4807 cairo_rectangle (cr, 0, height / 2, width, height / 2);
4810 gdk_cairo_set_source_color (cr, >k_widget_get_style (widget)->bg[GTK_STATE_NORMAL]);
4811 cairo_rectangle (cr, width / 3, height / 3, width / 3, height / 3);
4818 set_cursor (GtkWidget *spinner,
4827 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
4830 label = g_object_get_data (G_OBJECT (spinner), "user_data");
4832 class = g_type_class_ref (GDK_TYPE_CURSOR_TYPE);
4833 vals = class->values;
4835 while (vals && vals->value != c)
4838 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
4840 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
4842 g_type_class_unref (class);
4844 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
4845 gdk_window_set_cursor (gtk_widget_get_window (widget),
4847 gdk_cursor_unref (cursor);
4851 cursor_event (GtkWidget *widget,
4853 GtkSpinButton *spinner)
4855 if ((event->type == GDK_BUTTON_PRESS) &&
4856 ((event->button.button == 1) ||
4857 (event->button.button == 3)))
4859 gtk_spin_button_spin (spinner, event->button.button == 1 ?
4860 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
4867 #ifdef GDK_WINDOWING_X11
4868 #include "x11/gdkx.h"
4871 change_cursor_theme (GtkWidget *widget,
4878 children = gtk_container_get_children (GTK_CONTAINER (data));
4880 theme = gtk_entry_get_text (GTK_ENTRY (children->next->data));
4881 size = (gint) gtk_spin_button_get_value (GTK_SPIN_BUTTON (children->next->next->data));
4883 g_list_free (children);
4885 gdk_x11_display_set_cursor_theme (gtk_widget_get_display (widget),
4892 create_cursors (GtkWidget *widget)
4894 static GtkWidget *window = NULL;
4897 GtkWidget *main_vbox;
4910 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4911 gtk_window_set_screen (GTK_WINDOW (window),
4912 gtk_widget_get_screen (widget));
4914 g_signal_connect (window, "destroy",
4915 G_CALLBACK (gtk_widget_destroyed),
4918 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
4920 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 5);
4921 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
4922 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4925 g_object_new (gtk_vbox_get_type (),
4926 "GtkBox::homogeneous", FALSE,
4927 "GtkBox::spacing", 5,
4928 "GtkContainer::border_width", 10,
4929 "GtkWidget::parent", main_vbox,
4930 "GtkWidget::visible", TRUE,
4933 #ifdef GDK_WINDOWING_X11
4934 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
4935 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4936 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
4938 label = gtk_label_new ("Cursor Theme : ");
4939 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4940 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
4942 entry = gtk_entry_new ();
4943 gtk_entry_set_text (GTK_ENTRY (entry), "default");
4944 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, TRUE, 0);
4946 size = gtk_spin_button_new_with_range (1.0, 64.0, 1.0);
4947 gtk_spin_button_set_value (GTK_SPIN_BUTTON (size), 24.0);
4948 gtk_box_pack_start (GTK_BOX (hbox), size, TRUE, TRUE, 0);
4950 g_signal_connect (entry, "changed",
4951 G_CALLBACK (change_cursor_theme), hbox);
4952 g_signal_connect (size, "changed",
4953 G_CALLBACK (change_cursor_theme), hbox);
4956 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
4957 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4958 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
4960 label = gtk_label_new ("Cursor Value : ");
4961 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4962 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
4964 adj = gtk_adjustment_new (0,
4968 spinner = gtk_spin_button_new (adj, 0, 0);
4969 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
4972 g_object_new (gtk_frame_get_type (),
4973 "GtkFrame::label_xalign", 0.5,
4974 "GtkFrame::label", "Cursor Area",
4975 "GtkContainer::border_width", 10,
4976 "GtkWidget::parent", vbox,
4977 "GtkWidget::visible", TRUE,
4980 darea = gtk_drawing_area_new ();
4981 gtk_widget_set_size_request (darea, 80, 80);
4982 gtk_container_add (GTK_CONTAINER (frame), darea);
4983 g_signal_connect (darea,
4985 G_CALLBACK (cursor_draw),
4987 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
4988 g_signal_connect (darea,
4989 "button_press_event",
4990 G_CALLBACK (cursor_event),
4992 gtk_widget_show (darea);
4994 g_signal_connect (spinner, "changed",
4995 G_CALLBACK (set_cursor),
4998 label = g_object_new (GTK_TYPE_LABEL,
5003 gtk_container_child_set (GTK_CONTAINER (vbox), label,
5006 g_object_set_data (G_OBJECT (spinner), "user_data", label);
5009 g_object_new (gtk_hseparator_get_type (),
5010 "GtkWidget::visible", TRUE,
5012 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
5014 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
5015 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
5016 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5018 button = gtk_button_new_with_label ("Close");
5019 g_signal_connect_swapped (button, "clicked",
5020 G_CALLBACK (gtk_widget_destroy),
5022 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5024 gtk_widget_show_all (window);
5026 set_cursor (spinner, darea);
5029 gtk_widget_destroy (window);
5037 color_selection_ok (GtkWidget *w,
5038 GtkColorSelectionDialog *cs)
5040 GtkWidget *colorsel;
5043 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5045 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5046 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5050 color_selection_changed (GtkWidget *w,
5051 GtkColorSelectionDialog *cs)
5053 GtkWidget *colorsel;
5056 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5057 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5058 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5063 opacity_toggled_cb (GtkWidget *w,
5064 GtkColorSelectionDialog *cs)
5066 GtkColorSelection *colorsel;
5068 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5069 gtk_color_selection_set_has_opacity_control (colorsel,
5070 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5074 palette_toggled_cb (GtkWidget *w,
5075 GtkColorSelectionDialog *cs)
5077 GtkColorSelection *colorsel;
5079 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5080 gtk_color_selection_set_has_palette (colorsel,
5081 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5086 create_color_selection (GtkWidget *widget)
5088 static GtkWidget *window = NULL;
5097 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5098 gtk_window_set_screen (GTK_WINDOW (window),
5099 gtk_widget_get_screen (widget));
5101 g_signal_connect (window, "destroy",
5102 G_CALLBACK (gtk_widget_destroyed),
5105 gtk_window_set_title (GTK_WINDOW (window), "GtkColorButton");
5106 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5108 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 8);
5109 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5110 gtk_container_add (GTK_CONTAINER (window), hbox);
5112 label = gtk_label_new ("Pick a color");
5113 gtk_container_add (GTK_CONTAINER (hbox), label);
5115 picker = gtk_color_button_new ();
5116 gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (picker), TRUE);
5117 gtk_container_add (GTK_CONTAINER (hbox), picker);
5119 button = gtk_button_new_with_mnemonic ("_Props");
5120 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
5121 g_signal_connect (button, "clicked",
5122 G_CALLBACK (props_clicked),
5126 if (!gtk_widget_get_visible (window))
5127 gtk_widget_show_all (window);
5129 gtk_widget_destroy (window);
5133 flipping_toggled_cb (GtkWidget *widget, gpointer data)
5135 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
5136 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
5138 gtk_widget_set_default_direction (new_direction);
5142 orientable_toggle_orientation (GtkOrientable *orientable)
5144 GtkOrientation orientation;
5146 orientation = gtk_orientable_get_orientation (orientable);
5147 gtk_orientable_set_orientation (orientable,
5148 orientation == GTK_ORIENTATION_HORIZONTAL ?
5149 GTK_ORIENTATION_VERTICAL :
5150 GTK_ORIENTATION_HORIZONTAL);
5152 if (GTK_IS_CONTAINER (orientable))
5157 children = gtk_container_get_children (GTK_CONTAINER (orientable));
5159 for (child = children; child; child = child->next)
5161 if (GTK_IS_ORIENTABLE (child->data))
5162 orientable_toggle_orientation (child->data);
5165 g_list_free (children);
5170 flipping_orientation_toggled_cb (GtkWidget *widget, gpointer data)
5172 GtkWidget *content_area;
5173 GtkWidget *toplevel;
5175 toplevel = gtk_widget_get_toplevel (widget);
5176 content_area = gtk_dialog_get_content_area (GTK_DIALOG (toplevel));
5177 orientable_toggle_orientation (GTK_ORIENTABLE (content_area));
5181 set_direction_recurse (GtkWidget *widget,
5184 GtkTextDirection *dir = data;
5186 gtk_widget_set_direction (widget, *dir);
5187 if (GTK_IS_CONTAINER (widget))
5188 gtk_container_foreach (GTK_CONTAINER (widget),
5189 set_direction_recurse,
5194 create_forward_back (const char *title,
5195 GtkTextDirection text_dir)
5197 GtkWidget *frame = gtk_frame_new (title);
5198 GtkWidget *bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
5199 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
5200 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
5202 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
5204 gtk_container_add (GTK_CONTAINER (frame), bbox);
5205 gtk_container_add (GTK_CONTAINER (bbox), back_button);
5206 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
5208 set_direction_recurse (frame, &text_dir);
5214 create_flipping (GtkWidget *widget)
5216 static GtkWidget *window = NULL;
5217 GtkWidget *check_button, *button;
5218 GtkWidget *action_area, *content_area;
5222 window = gtk_dialog_new ();
5224 gtk_window_set_screen (GTK_WINDOW (window),
5225 gtk_widget_get_screen (widget));
5227 g_signal_connect (window, "destroy",
5228 G_CALLBACK (gtk_widget_destroyed),
5231 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5232 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
5234 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
5236 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
5237 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5238 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5240 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
5241 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
5243 g_signal_connect (check_button, "toggled",
5244 G_CALLBACK (flipping_toggled_cb), NULL);
5246 check_button = gtk_check_button_new_with_label ("Toggle orientation of all boxes");
5247 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5248 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5250 g_signal_connect (check_button, "toggled",
5251 G_CALLBACK (flipping_orientation_toggled_cb), NULL);
5253 gtk_box_pack_start (GTK_BOX (content_area),
5254 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
5257 gtk_box_pack_start (GTK_BOX (content_area),
5258 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
5261 gtk_box_pack_start (GTK_BOX (content_area),
5262 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
5265 button = gtk_button_new_with_label ("Close");
5266 g_signal_connect_swapped (button, "clicked",
5267 G_CALLBACK (gtk_widget_destroy), window);
5268 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5271 if (!gtk_widget_get_visible (window))
5272 gtk_widget_show_all (window);
5274 gtk_widget_destroy (window);
5282 make_focus_table (GList **list)
5287 table = gtk_table_new (5, 5, FALSE);
5300 widget = gtk_entry_new ();
5302 widget = gtk_button_new_with_label ("Foo");
5304 *list = g_list_prepend (*list, widget);
5306 gtk_table_attach (GTK_TABLE (table),
5310 GTK_EXPAND | GTK_FILL,
5311 GTK_EXPAND | GTK_FILL,
5320 *list = g_list_reverse (*list);
5326 create_focus (GtkWidget *widget)
5328 static GtkWidget *window = NULL;
5332 GtkWidget *content_area;
5337 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
5343 gtk_window_set_screen (GTK_WINDOW (window),
5344 gtk_widget_get_screen (widget));
5346 g_signal_connect (window, "destroy",
5347 G_CALLBACK (gtk_widget_destroyed),
5350 g_signal_connect (window, "response",
5351 G_CALLBACK (gtk_widget_destroy),
5354 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5356 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
5358 frame = gtk_frame_new ("Weird tab focus chain");
5360 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5362 table = make_focus_table (&list);
5364 gtk_container_add (GTK_CONTAINER (frame), table);
5366 gtk_container_set_focus_chain (GTK_CONTAINER (table),
5371 frame = gtk_frame_new ("Default tab focus chain");
5373 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5376 table = make_focus_table (&list);
5380 gtk_container_add (GTK_CONTAINER (frame), table);
5383 if (!gtk_widget_get_visible (window))
5384 gtk_widget_show_all (window);
5386 gtk_widget_destroy (window);
5394 font_selection_ok (GtkWidget *w,
5395 GtkFontSelectionDialog *fs)
5397 gchar *s = gtk_font_selection_dialog_get_font_name (fs);
5399 g_print ("%s\n", s);
5401 gtk_widget_destroy (GTK_WIDGET (fs));
5405 create_font_selection (GtkWidget *widget)
5407 static GtkWidget *window = NULL;
5415 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5416 gtk_window_set_screen (GTK_WINDOW (window),
5417 gtk_widget_get_screen (widget));
5419 g_signal_connect (window, "destroy",
5420 G_CALLBACK (gtk_widget_destroyed),
5423 gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
5424 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5426 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 8);
5427 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5428 gtk_container_add (GTK_CONTAINER (window), hbox);
5430 label = gtk_label_new ("Pick a font");
5431 gtk_container_add (GTK_CONTAINER (hbox), label);
5433 picker = gtk_font_button_new ();
5434 gtk_font_button_set_use_font (GTK_FONT_BUTTON (picker), TRUE);
5435 gtk_container_add (GTK_CONTAINER (hbox), picker);
5438 if (!gtk_widget_get_visible (window))
5439 gtk_widget_show_all (window);
5441 gtk_widget_destroy (window);
5448 static GtkWidget *dialog_window = NULL;
5451 label_toggle (GtkWidget *widget,
5456 *label = gtk_label_new ("Dialog Test");
5457 g_signal_connect (*label,
5459 G_CALLBACK (gtk_widget_destroyed),
5461 gtk_misc_set_padding (GTK_MISC (*label), 10, 10);
5462 gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog_window))),
5463 *label, TRUE, TRUE, 0);
5464 gtk_widget_show (*label);
5467 gtk_widget_destroy (*label);
5471 create_dialog (GtkWidget *widget)
5473 static GtkWidget *label;
5474 GtkWidget *action_area;
5479 /* This is a terrible example; it's much simpler to create
5480 * dialogs than this. Don't use testgtk for example code,
5484 dialog_window = gtk_dialog_new ();
5485 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5486 gtk_widget_get_screen (widget));
5488 g_signal_connect (dialog_window, "destroy",
5489 G_CALLBACK (gtk_widget_destroyed),
5492 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5494 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
5495 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5497 button = gtk_button_new_with_label ("OK");
5498 gtk_widget_set_can_default (button, TRUE);
5499 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5500 gtk_widget_grab_default (button);
5501 gtk_widget_show (button);
5503 button = gtk_button_new_with_label ("Toggle");
5504 g_signal_connect (button, "clicked",
5505 G_CALLBACK (label_toggle),
5507 gtk_widget_set_can_default (button, TRUE);
5508 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5509 gtk_widget_show (button);
5514 if (!gtk_widget_get_visible (dialog_window))
5515 gtk_widget_show (dialog_window);
5517 gtk_widget_destroy (dialog_window);
5520 /* Display & Screen test
5527 GtkWidget *radio_dpy;
5528 GtkWidget *toplevel;
5529 GtkWidget *dialog_window;
5530 } ScreenDisplaySelection;
5533 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
5535 const gchar *display_name;
5536 GdkDisplay *display = gtk_widget_get_display (widget);
5538 GdkScreen *new_screen = NULL;
5539 GdkScreen *current_screen = gtk_widget_get_screen (widget);
5541 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
5543 display_name = gtk_entry_get_text (GTK_ENTRY (data->entry));
5544 display = gdk_display_open (display_name);
5548 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
5549 GTK_DIALOG_DESTROY_WITH_PARENT,
5552 "The display :\n%s\ncannot be opened",
5554 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
5555 gtk_widget_show (dialog);
5556 g_signal_connect (dialog, "response",
5557 G_CALLBACK (gtk_widget_destroy),
5562 GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (data->combo));
5565 gboolean found = FALSE;
5566 while (gtk_tree_model_iter_nth_child (model, &iter, NULL, i++))
5569 gtk_tree_model_get (model, &iter, 0, &name, -1);
5570 found = !g_ascii_strcasecmp (display_name, name);
5577 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (data->combo), display_name);
5578 new_screen = gdk_display_get_default_screen (display);
5583 gint number_of_screens = gdk_display_get_n_screens (display);
5584 gint screen_num = gdk_screen_get_number (current_screen);
5585 if ((screen_num +1) < number_of_screens)
5586 new_screen = gdk_display_get_screen (display, screen_num + 1);
5588 new_screen = gdk_display_get_screen (display, 0);
5593 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
5594 gtk_widget_destroy (data->dialog_window);
5599 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
5601 gtk_widget_destroy (data);
5605 create_display_screen (GtkWidget *widget)
5607 GtkWidget *table, *frame, *window, *combo_dpy, *vbox;
5608 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
5610 ScreenDisplaySelection *scr_dpy_data;
5611 GdkScreen *screen = gtk_widget_get_screen (widget);
5612 GdkDisplay *display = gdk_screen_get_display (screen);
5614 window = g_object_new (gtk_window_get_type (),
5617 "type", GTK_WINDOW_TOPLEVEL,
5619 "Screen or Display selection",
5620 "border_width", 10, NULL);
5621 g_signal_connect (window, "destroy",
5622 G_CALLBACK (gtk_widget_destroy), NULL);
5624 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 3);
5625 gtk_container_add (GTK_CONTAINER (window), vbox);
5627 frame = gtk_frame_new ("Select screen or display");
5628 gtk_container_add (GTK_CONTAINER (vbox), frame);
5630 table = gtk_table_new (2, 2, TRUE);
5631 gtk_table_set_row_spacings (GTK_TABLE (table), 3);
5632 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
5634 gtk_container_add (GTK_CONTAINER (frame), table);
5636 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
5637 if (gdk_display_get_n_screens(display) > 1)
5638 radio_scr = gtk_radio_button_new_with_label
5639 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
5642 radio_scr = gtk_radio_button_new_with_label
5643 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
5644 "only one screen on the current display");
5645 gtk_widget_set_sensitive (radio_scr, FALSE);
5647 combo_dpy = gtk_combo_box_text_new_with_entry ();
5648 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_dpy), "diabolo:0.0");
5649 gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (combo_dpy))),
5650 "<hostname>:<X Server Num>.<Screen Num>");
5652 gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1);
5653 gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2);
5654 gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1);
5656 bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
5657 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
5658 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
5660 gtk_container_add (GTK_CONTAINER (vbox), bbox);
5662 gtk_container_add (GTK_CONTAINER (bbox), applyb);
5663 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
5665 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
5667 scr_dpy_data->entry = gtk_bin_get_child (GTK_BIN (combo_dpy));
5668 scr_dpy_data->radio_dpy = radio_dpy;
5669 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
5670 scr_dpy_data->dialog_window = window;
5672 g_signal_connect (cancelb, "clicked",
5673 G_CALLBACK (screen_display_destroy_diag), window);
5674 g_signal_connect (applyb, "clicked",
5675 G_CALLBACK (screen_display_check), scr_dpy_data);
5676 gtk_widget_show_all (window);
5681 static gulong event_watcher_enter_id = 0;
5682 static gulong event_watcher_leave_id = 0;
5685 event_watcher (GSignalInvocationHint *ihint,
5686 guint n_param_values,
5687 const GValue *param_values,
5690 g_print ("Watch: \"%s\" emitted for %s\n",
5691 g_signal_name (ihint->signal_id),
5692 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
5698 event_watcher_down (void)
5700 if (event_watcher_enter_id)
5704 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5705 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
5706 event_watcher_enter_id = 0;
5707 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5708 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
5709 event_watcher_leave_id = 0;
5714 event_watcher_toggle (void)
5716 if (event_watcher_enter_id)
5717 event_watcher_down ();
5722 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5723 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5724 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5725 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5730 create_event_watcher (GtkWidget *widget)
5732 GtkWidget *action_area, *content_area;
5737 dialog_window = gtk_dialog_new ();
5738 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5739 gtk_widget_get_screen (widget));
5741 g_signal_connect (dialog_window, "destroy",
5742 G_CALLBACK (gtk_widget_destroyed),
5744 g_signal_connect (dialog_window, "destroy",
5745 G_CALLBACK (event_watcher_down),
5748 content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog_window));
5749 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5751 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
5752 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5753 gtk_widget_set_size_request (dialog_window, 200, 110);
5755 button = gtk_toggle_button_new_with_label ("Activate Watch");
5756 g_signal_connect (button, "clicked",
5757 G_CALLBACK (event_watcher_toggle),
5759 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
5760 gtk_box_pack_start (GTK_BOX (content_area), button, TRUE, TRUE, 0);
5761 gtk_widget_show (button);
5763 button = gtk_button_new_with_label ("Close");
5764 g_signal_connect_swapped (button, "clicked",
5765 G_CALLBACK (gtk_widget_destroy),
5767 gtk_widget_set_can_default (button, TRUE);
5768 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5769 gtk_widget_grab_default (button);
5770 gtk_widget_show (button);
5773 if (!gtk_widget_get_visible (dialog_window))
5774 gtk_widget_show (dialog_window);
5776 gtk_widget_destroy (dialog_window);
5784 reformat_value (GtkScale *scale,
5787 return g_strdup_printf ("-->%0.*g<--",
5788 gtk_scale_get_digits (scale), value);
5792 create_range_controls (GtkWidget *widget)
5794 static GtkWidget *window = NULL;
5798 GtkWidget *scrollbar;
5800 GtkWidget *separator;
5801 GtkAdjustment *adjustment;
5806 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5808 gtk_window_set_screen (GTK_WINDOW (window),
5809 gtk_widget_get_screen (widget));
5811 g_signal_connect (window, "destroy",
5812 G_CALLBACK (gtk_widget_destroyed),
5815 gtk_window_set_title (GTK_WINDOW (window), "range controls");
5816 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5819 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
5820 gtk_container_add (GTK_CONTAINER (window), box1);
5821 gtk_widget_show (box1);
5824 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 10);
5825 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5826 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
5827 gtk_widget_show (box2);
5830 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
5832 scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5833 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
5834 gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
5835 gtk_scale_set_digits (GTK_SCALE (scale), 1);
5836 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5837 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
5838 gtk_widget_show (scale);
5840 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5841 gtk_range_set_update_policy (GTK_RANGE (scrollbar),
5842 GTK_UPDATE_CONTINUOUS);
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, FALSE, 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, FALSE, 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);
5917 create_rulers (GtkWidget *widget)
5919 static GtkWidget *window = NULL;
5925 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5927 gtk_window_set_screen (GTK_WINDOW (window),
5928 gtk_widget_get_screen (widget));
5930 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
5932 g_signal_connect (window, "destroy",
5933 G_CALLBACK (gtk_widget_destroyed),
5936 gtk_window_set_title (GTK_WINDOW (window), "rulers");
5937 gtk_widget_set_size_request (window, 300, 300);
5938 gtk_widget_set_events (window,
5939 GDK_POINTER_MOTION_MASK
5940 | GDK_POINTER_MOTION_HINT_MASK);
5941 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5943 table = gtk_table_new (2, 2, FALSE);
5944 gtk_container_add (GTK_CONTAINER (window), table);
5945 gtk_widget_show (table);
5947 ruler = gtk_ruler_new (GTK_ORIENTATION_HORIZONTAL);
5948 gtk_ruler_set_metric (GTK_RULER (ruler), GTK_CENTIMETERS);
5949 gtk_ruler_set_range (GTK_RULER (ruler), 100, 0, 0, 20);
5951 g_signal_connect_swapped (window,
5952 "motion_notify_event",
5953 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
5956 gtk_table_attach (GTK_TABLE (table), ruler, 1, 2, 0, 1,
5957 GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
5958 gtk_widget_show (ruler);
5961 ruler = gtk_ruler_new (GTK_ORIENTATION_VERTICAL);
5962 gtk_ruler_set_range (GTK_RULER (ruler), 5, 15, 0, 20);
5964 g_signal_connect_swapped (window,
5965 "motion_notify_event",
5966 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
5969 gtk_table_attach (GTK_TABLE (table), ruler, 0, 1, 1, 2,
5970 GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
5971 gtk_widget_show (ruler);
5974 if (!gtk_widget_get_visible (window))
5975 gtk_widget_show (window);
5977 gtk_widget_destroy (window);
5984 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
5985 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
5986 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
5987 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
5988 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
5989 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
5990 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
5991 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
5994 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
6000 static const char * book_open_xpm[] = {
6023 static const char * book_closed_xpm[] = {
6048 GdkPixbuf *book_open;
6049 GdkPixbuf *book_closed;
6050 GtkWidget *sample_notebook;
6053 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
6055 GtkWidget *page_widget;
6058 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
6060 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
6061 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6063 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
6064 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6068 page_switch (GtkWidget *widget, gpointer *page, gint page_num)
6070 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
6071 gint old_page_num = gtk_notebook_get_current_page (notebook);
6073 if (page_num == old_page_num)
6076 set_page_image (notebook, page_num, book_open);
6078 if (old_page_num != -1)
6079 set_page_image (notebook, old_page_num, book_closed);
6083 tab_fill (GtkToggleButton *button, GtkWidget *child)
6085 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
6086 "tab-fill", gtk_toggle_button_get_active (button),
6091 tab_expand (GtkToggleButton *button, GtkWidget *child)
6093 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
6094 "tab-expand", gtk_toggle_button_get_active (button),
6099 create_pages (GtkNotebook *notebook, gint start, gint end)
6101 GtkWidget *child = NULL;
6106 GtkWidget *label_box;
6107 GtkWidget *menu_box;
6111 char accel_buffer[32];
6113 for (i = start; i <= end; i++)
6115 sprintf (buffer, "Page %d", i);
6116 sprintf (accel_buffer, "Page _%d", i);
6118 child = gtk_frame_new (buffer);
6119 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
6121 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, TRUE,0);
6122 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
6123 gtk_container_add (GTK_CONTAINER (child), vbox);
6125 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, TRUE,0);
6126 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
6128 button = gtk_check_button_new_with_label ("Fill Tab");
6129 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6130 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
6131 g_signal_connect (button, "toggled",
6132 G_CALLBACK (tab_fill), child);
6134 button = gtk_check_button_new_with_label ("Expand Tab");
6135 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6136 g_signal_connect (button, "toggled",
6137 G_CALLBACK (tab_expand), child);
6139 button = gtk_button_new_with_label ("Hide Page");
6140 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
6141 g_signal_connect_swapped (button, "clicked",
6142 G_CALLBACK (gtk_widget_hide),
6145 gtk_widget_show_all (child);
6147 label_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
6148 pixwid = gtk_image_new_from_pixbuf (book_closed);
6149 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
6151 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
6152 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6153 label = gtk_label_new_with_mnemonic (accel_buffer);
6154 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
6155 gtk_widget_show_all (label_box);
6158 menu_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
6159 pixwid = gtk_image_new_from_pixbuf (book_closed);
6160 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
6162 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
6163 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6164 label = gtk_label_new (buffer);
6165 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
6166 gtk_widget_show_all (menu_box);
6168 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
6173 rotate_notebook (GtkButton *button,
6174 GtkNotebook *notebook)
6176 gtk_notebook_set_tab_pos (notebook, (gtk_notebook_get_tab_pos (notebook) + 1) % 4);
6180 show_all_pages (GtkButton *button,
6181 GtkNotebook *notebook)
6183 gtk_container_foreach (GTK_CONTAINER (notebook),
6184 (GtkCallback) gtk_widget_show, NULL);
6188 notebook_type_changed (GtkWidget *optionmenu,
6191 GtkNotebook *notebook;
6201 notebook = GTK_NOTEBOOK (data);
6203 c = gtk_combo_box_get_active (GTK_COMBO_BOX (optionmenu));
6208 /* standard notebook */
6209 gtk_notebook_set_show_tabs (notebook, TRUE);
6210 gtk_notebook_set_show_border (notebook, TRUE);
6211 gtk_notebook_set_scrollable (notebook, FALSE);
6215 /* notabs notebook */
6216 gtk_notebook_set_show_tabs (notebook, FALSE);
6217 gtk_notebook_set_show_border (notebook, TRUE);
6222 gtk_notebook_set_show_tabs (notebook, FALSE);
6223 gtk_notebook_set_show_border (notebook, FALSE);
6228 gtk_notebook_set_show_tabs (notebook, TRUE);
6229 gtk_notebook_set_show_border (notebook, TRUE);
6230 gtk_notebook_set_scrollable (notebook, TRUE);
6231 if (gtk_notebook_get_n_pages (notebook) == 5)
6232 create_pages (notebook, 6, 15);
6238 if (gtk_notebook_get_n_pages (notebook) == 15)
6239 for (i = 0; i < 10; i++)
6240 gtk_notebook_remove_page (notebook, 5);
6244 notebook_popup (GtkToggleButton *button,
6245 GtkNotebook *notebook)
6247 if (gtk_toggle_button_get_active (button))
6248 gtk_notebook_popup_enable (notebook);
6250 gtk_notebook_popup_disable (notebook);
6254 create_notebook (GtkWidget *widget)
6256 static GtkWidget *window = NULL;
6260 GtkWidget *separator;
6264 static gchar *items[] =
6274 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6275 gtk_window_set_screen (GTK_WINDOW (window),
6276 gtk_widget_get_screen (widget));
6278 g_signal_connect (window, "destroy",
6279 G_CALLBACK (gtk_widget_destroyed),
6282 gtk_window_set_title (GTK_WINDOW (window), "notebook");
6283 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6285 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
6286 gtk_container_add (GTK_CONTAINER (window), box1);
6288 sample_notebook = gtk_notebook_new ();
6289 g_signal_connect (sample_notebook, "switch_page",
6290 G_CALLBACK (page_switch), NULL);
6291 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
6292 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
6293 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
6295 gtk_widget_realize (sample_notebook);
6298 book_open = gdk_pixbuf_new_from_xpm_data (book_open_xpm);
6301 book_closed = gdk_pixbuf_new_from_xpm_data (book_closed_xpm);
6303 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
6305 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
6306 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
6308 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 5);
6309 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6310 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6312 button = gtk_check_button_new_with_label ("popup menu");
6313 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
6314 g_signal_connect (button, "clicked",
6315 G_CALLBACK (notebook_popup),
6318 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 5);
6319 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6320 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6322 label = gtk_label_new ("Notebook Style :");
6323 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
6325 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
6326 notebook_type_changed,
6328 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
6330 button = gtk_button_new_with_label ("Show all Pages");
6331 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
6332 g_signal_connect (button, "clicked",
6333 G_CALLBACK (show_all_pages), sample_notebook);
6335 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, TRUE, 10);
6336 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6337 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6339 button = gtk_button_new_with_label ("prev");
6340 g_signal_connect_swapped (button, "clicked",
6341 G_CALLBACK (gtk_notebook_prev_page),
6343 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6345 button = gtk_button_new_with_label ("next");
6346 g_signal_connect_swapped (button, "clicked",
6347 G_CALLBACK (gtk_notebook_next_page),
6349 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6351 button = gtk_button_new_with_label ("rotate");
6352 g_signal_connect (button, "clicked",
6353 G_CALLBACK (rotate_notebook), sample_notebook);
6354 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6356 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
6357 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
6359 button = gtk_button_new_with_label ("close");
6360 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
6361 g_signal_connect_swapped (button, "clicked",
6362 G_CALLBACK (gtk_widget_destroy),
6364 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
6365 gtk_widget_set_can_default (button, TRUE);
6366 gtk_widget_grab_default (button);
6369 if (!gtk_widget_get_visible (window))
6370 gtk_widget_show_all (window);
6372 gtk_widget_destroy (window);
6380 toggle_resize (GtkWidget *widget, GtkWidget *child)
6382 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6383 GValue value = { 0, };
6384 g_value_init (&value, G_TYPE_BOOLEAN);
6385 gtk_container_child_get_property (container, child, "resize", &value);
6386 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6387 gtk_container_child_set_property (container, child, "resize", &value);
6391 toggle_shrink (GtkWidget *widget, GtkWidget *child)
6393 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6394 GValue value = { 0, };
6395 g_value_init (&value, G_TYPE_BOOLEAN);
6396 gtk_container_child_get_property (container, child, "shrink", &value);
6397 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6398 gtk_container_child_set_property (container, child, "shrink", &value);
6402 paned_props_clicked (GtkWidget *button,
6405 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
6407 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
6411 create_pane_options (GtkPaned *paned,
6412 const gchar *frame_label,
6413 const gchar *label1,
6414 const gchar *label2)
6416 GtkWidget *child1, *child2;
6421 GtkWidget *check_button;
6423 child1 = gtk_paned_get_child1 (paned);
6424 child2 = gtk_paned_get_child2 (paned);
6426 frame = gtk_frame_new (frame_label);
6427 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
6429 table = gtk_table_new (4, 2, 4);
6430 gtk_container_add (GTK_CONTAINER (frame), table);
6432 label = gtk_label_new (label1);
6433 gtk_table_attach_defaults (GTK_TABLE (table), label,
6436 check_button = gtk_check_button_new_with_label ("Resize");
6437 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6439 g_signal_connect (check_button, "toggled",
6440 G_CALLBACK (toggle_resize),
6443 check_button = gtk_check_button_new_with_label ("Shrink");
6444 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6446 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6448 g_signal_connect (check_button, "toggled",
6449 G_CALLBACK (toggle_shrink),
6452 label = gtk_label_new (label2);
6453 gtk_table_attach_defaults (GTK_TABLE (table), label,
6456 check_button = gtk_check_button_new_with_label ("Resize");
6457 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6459 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6461 g_signal_connect (check_button, "toggled",
6462 G_CALLBACK (toggle_resize),
6465 check_button = gtk_check_button_new_with_label ("Shrink");
6466 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6468 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6470 g_signal_connect (check_button, "toggled",
6471 G_CALLBACK (toggle_shrink),
6474 button = gtk_button_new_with_mnemonic ("_Properties");
6475 gtk_table_attach_defaults (GTK_TABLE (table), button,
6477 g_signal_connect (button, "clicked",
6478 G_CALLBACK (paned_props_clicked),
6485 create_panes (GtkWidget *widget)
6487 static GtkWidget *window = NULL;
6496 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6498 gtk_window_set_screen (GTK_WINDOW (window),
6499 gtk_widget_get_screen (widget));
6501 g_signal_connect (window, "destroy",
6502 G_CALLBACK (gtk_widget_destroyed),
6505 gtk_window_set_title (GTK_WINDOW (window), "Panes");
6506 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6508 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
6509 gtk_container_add (GTK_CONTAINER (window), vbox);
6511 vpaned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6512 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
6513 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
6515 hpaned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6516 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
6518 frame = gtk_frame_new (NULL);
6519 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6520 gtk_widget_set_size_request (frame, 60, 60);
6521 gtk_paned_add1 (GTK_PANED (hpaned), frame);
6523 button = gtk_button_new_with_label ("Hi there");
6524 gtk_container_add (GTK_CONTAINER(frame), button);
6526 frame = gtk_frame_new (NULL);
6527 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6528 gtk_widget_set_size_request (frame, 80, 60);
6529 gtk_paned_add2 (GTK_PANED (hpaned), frame);
6531 frame = gtk_frame_new (NULL);
6532 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6533 gtk_widget_set_size_request (frame, 60, 80);
6534 gtk_paned_add2 (GTK_PANED (vpaned), frame);
6536 /* Now create toggle buttons to control sizing */
6538 gtk_box_pack_start (GTK_BOX (vbox),
6539 create_pane_options (GTK_PANED (hpaned),
6545 gtk_box_pack_start (GTK_BOX (vbox),
6546 create_pane_options (GTK_PANED (vpaned),
6552 gtk_widget_show_all (vbox);
6555 if (!gtk_widget_get_visible (window))
6556 gtk_widget_show (window);
6558 gtk_widget_destroy (window);
6562 * Paned keyboard navigation
6566 paned_keyboard_window1 (GtkWidget *widget)
6589 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6590 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
6591 gtk_window_set_screen (GTK_WINDOW (window1),
6592 gtk_widget_get_screen (widget));
6594 hpaned1 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6595 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
6597 frame1 = gtk_frame_new (NULL);
6598 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
6599 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
6601 vbox1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
6602 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
6604 button7 = gtk_button_new_with_label ("button7");
6605 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
6607 button8 = gtk_button_new_with_label ("button8");
6608 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
6610 button9 = gtk_button_new_with_label ("button9");
6611 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
6613 vpaned1 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6614 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
6616 frame2 = gtk_frame_new (NULL);
6617 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
6618 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
6620 frame5 = gtk_frame_new (NULL);
6621 gtk_container_add (GTK_CONTAINER (frame2), frame5);
6623 hbox1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
6624 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
6626 button5 = gtk_button_new_with_label ("button5");
6627 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
6629 button6 = gtk_button_new_with_label ("button6");
6630 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
6632 frame3 = gtk_frame_new (NULL);
6633 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
6634 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
6636 frame4 = gtk_frame_new ("Buttons");
6637 gtk_container_add (GTK_CONTAINER (frame3), frame4);
6638 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
6640 table1 = gtk_table_new (2, 2, FALSE);
6641 gtk_container_add (GTK_CONTAINER (frame4), table1);
6642 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
6644 button1 = gtk_button_new_with_label ("button1");
6645 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
6646 (GtkAttachOptions) (GTK_FILL),
6647 (GtkAttachOptions) (0), 0, 0);
6649 button2 = gtk_button_new_with_label ("button2");
6650 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
6651 (GtkAttachOptions) (GTK_FILL),
6652 (GtkAttachOptions) (0), 0, 0);
6654 button3 = gtk_button_new_with_label ("button3");
6655 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
6656 (GtkAttachOptions) (GTK_FILL),
6657 (GtkAttachOptions) (0), 0, 0);
6659 button4 = gtk_button_new_with_label ("button4");
6660 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
6661 (GtkAttachOptions) (GTK_FILL),
6662 (GtkAttachOptions) (0), 0, 0);
6668 paned_keyboard_window2 (GtkWidget *widget)
6673 GtkWidget *button13;
6677 GtkWidget *button12;
6679 GtkWidget *button11;
6680 GtkWidget *button10;
6682 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6683 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
6685 gtk_window_set_screen (GTK_WINDOW (window2),
6686 gtk_widget_get_screen (widget));
6688 hpaned2 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6689 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
6691 frame6 = gtk_frame_new (NULL);
6692 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
6693 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
6695 button13 = gtk_button_new_with_label ("button13");
6696 gtk_container_add (GTK_CONTAINER (frame6), button13);
6698 hbox2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
6699 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
6701 vpaned2 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6702 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
6704 frame7 = gtk_frame_new (NULL);
6705 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
6706 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
6708 button12 = gtk_button_new_with_label ("button12");
6709 gtk_container_add (GTK_CONTAINER (frame7), button12);
6711 frame8 = gtk_frame_new (NULL);
6712 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
6713 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
6715 button11 = gtk_button_new_with_label ("button11");
6716 gtk_container_add (GTK_CONTAINER (frame8), button11);
6718 button10 = gtk_button_new_with_label ("button10");
6719 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
6725 paned_keyboard_window3 (GtkWidget *widget)
6732 GtkWidget *button14;
6735 GtkWidget *button15;
6738 GtkWidget *button16;
6740 GtkWidget *button17;
6742 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6743 g_object_set_data (G_OBJECT (window3), "window3", window3);
6744 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
6746 gtk_window_set_screen (GTK_WINDOW (window3),
6747 gtk_widget_get_screen (widget));
6750 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
6751 gtk_container_add (GTK_CONTAINER (window3), vbox2);
6753 label1 = gtk_label_new ("Three panes nested inside each other");
6754 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
6756 hpaned3 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6757 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
6759 frame9 = gtk_frame_new (NULL);
6760 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
6761 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
6763 button14 = gtk_button_new_with_label ("button14");
6764 gtk_container_add (GTK_CONTAINER (frame9), button14);
6766 hpaned4 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6767 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
6769 frame10 = gtk_frame_new (NULL);
6770 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
6771 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
6773 button15 = gtk_button_new_with_label ("button15");
6774 gtk_container_add (GTK_CONTAINER (frame10), button15);
6776 hpaned5 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6777 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
6779 frame11 = gtk_frame_new (NULL);
6780 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
6781 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
6783 button16 = gtk_button_new_with_label ("button16");
6784 gtk_container_add (GTK_CONTAINER (frame11), button16);
6786 frame12 = gtk_frame_new (NULL);
6787 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
6788 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
6790 button17 = gtk_button_new_with_label ("button17");
6791 gtk_container_add (GTK_CONTAINER (frame12), button17);
6797 paned_keyboard_window4 (GtkWidget *widget)
6804 GtkWidget *button19;
6805 GtkWidget *button18;
6808 GtkWidget *button21;
6809 GtkWidget *button20;
6811 GtkWidget *button23;
6812 GtkWidget *button22;
6814 GtkWidget *button25;
6815 GtkWidget *button24;
6817 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6818 g_object_set_data (G_OBJECT (window4), "window4", window4);
6819 gtk_window_set_title (GTK_WINDOW (window4), "window4");
6821 gtk_window_set_screen (GTK_WINDOW (window4),
6822 gtk_widget_get_screen (widget));
6824 vbox3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
6825 gtk_container_add (GTK_CONTAINER (window4), vbox3);
6827 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
6828 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
6829 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
6831 hpaned6 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6832 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
6834 vpaned3 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6835 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
6837 button19 = gtk_button_new_with_label ("button19");
6838 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
6840 button18 = gtk_button_new_with_label ("button18");
6841 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
6843 hbox3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
6844 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
6846 vpaned4 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6847 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
6849 button21 = gtk_button_new_with_label ("button21");
6850 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
6852 button20 = gtk_button_new_with_label ("button20");
6853 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
6855 vpaned5 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6856 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
6858 button23 = gtk_button_new_with_label ("button23");
6859 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
6861 button22 = gtk_button_new_with_label ("button22");
6862 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
6864 vpaned6 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6865 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
6867 button25 = gtk_button_new_with_label ("button25");
6868 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
6870 button24 = gtk_button_new_with_label ("button24");
6871 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
6877 create_paned_keyboard_navigation (GtkWidget *widget)
6879 static GtkWidget *window1 = NULL;
6880 static GtkWidget *window2 = NULL;
6881 static GtkWidget *window3 = NULL;
6882 static GtkWidget *window4 = NULL;
6885 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
6887 gtk_widget_destroy (window1);
6888 gtk_widget_destroy (window2);
6889 gtk_widget_destroy (window3);
6890 gtk_widget_destroy (window4);
6895 window1 = paned_keyboard_window1 (widget);
6896 g_signal_connect (window1, "destroy",
6897 G_CALLBACK (gtk_widget_destroyed),
6903 window2 = paned_keyboard_window2 (widget);
6904 g_signal_connect (window2, "destroy",
6905 G_CALLBACK (gtk_widget_destroyed),
6911 window3 = paned_keyboard_window3 (widget);
6912 g_signal_connect (window3, "destroy",
6913 G_CALLBACK (gtk_widget_destroyed),
6919 window4 = paned_keyboard_window4 (widget);
6920 g_signal_connect (window4, "destroy",
6921 G_CALLBACK (gtk_widget_destroyed),
6925 if (gtk_widget_get_visible (window1))
6926 gtk_widget_destroy (GTK_WIDGET (window1));
6928 gtk_widget_show_all (GTK_WIDGET (window1));
6930 if (gtk_widget_get_visible (window2))
6931 gtk_widget_destroy (GTK_WIDGET (window2));
6933 gtk_widget_show_all (GTK_WIDGET (window2));
6935 if (gtk_widget_get_visible (window3))
6936 gtk_widget_destroy (GTK_WIDGET (window3));
6938 gtk_widget_show_all (GTK_WIDGET (window3));
6940 if (gtk_widget_get_visible (window4))
6941 gtk_widget_destroy (GTK_WIDGET (window4));
6943 gtk_widget_show_all (GTK_WIDGET (window4));
6951 typedef struct _cursoroffset {gint x,y;} CursorOffset;
6954 shape_pressed (GtkWidget *widget, GdkEventButton *event)
6958 /* ignore double and triple click */
6959 if (event->type != GDK_BUTTON_PRESS)
6962 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
6963 p->x = (int) event->x;
6964 p->y = (int) event->y;
6966 gtk_grab_add (widget);
6967 gdk_pointer_grab (gtk_widget_get_window (widget), TRUE,
6968 GDK_BUTTON_RELEASE_MASK |
6969 GDK_BUTTON_MOTION_MASK |
6970 GDK_POINTER_MOTION_HINT_MASK,
6975 shape_released (GtkWidget *widget)
6977 gtk_grab_remove (widget);
6978 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
6983 shape_motion (GtkWidget *widget,
6984 GdkEventMotion *event)
6988 GdkModifierType mask;
6990 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
6993 * Can't use event->x / event->y here
6994 * because I need absolute coordinates.
6996 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
6997 gtk_window_move (GTK_WINDOW (widget), xp - p->x, yp - p->y);
7001 shape_create_icon (GdkScreen *screen,
7012 CursorOffset* icon_pos;
7013 cairo_surface_t *mask;
7014 cairo_region_t *mask_region;
7019 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
7021 window = gtk_window_new (window_type);
7022 gtk_window_set_screen (GTK_WINDOW (window), screen);
7024 fixed = gtk_fixed_new ();
7025 gtk_widget_set_size_request (fixed, 100, 100);
7026 gtk_container_add (GTK_CONTAINER (window), fixed);
7027 gtk_widget_show (fixed);
7029 gtk_widget_set_events (window,
7030 gtk_widget_get_events (window) |
7031 GDK_BUTTON_MOTION_MASK |
7032 GDK_POINTER_MOTION_HINT_MASK |
7033 GDK_BUTTON_PRESS_MASK);
7035 gtk_widget_realize (window);
7037 pixbuf = gdk_pixbuf_new_from_file (xpm_file, NULL);
7038 g_assert (pixbuf); /* FIXME: error handling */
7040 mask = cairo_image_surface_create (CAIRO_FORMAT_A1,
7041 gdk_pixbuf_get_width (pixbuf),
7042 gdk_pixbuf_get_height (pixbuf));
7043 cr = cairo_create (mask);
7044 gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
7048 mask_region = gdk_cairo_region_create_from_surface (mask);
7050 cairo_region_translate (mask_region, px, py);
7052 image = gtk_image_new_from_pixbuf (pixbuf);
7053 gtk_fixed_put (GTK_FIXED (fixed), image, px,py);
7054 gtk_widget_show (image);
7056 gtk_widget_shape_combine_region (window, mask_region);
7058 cairo_region_destroy (mask_region);
7059 cairo_surface_destroy (mask);
7060 g_object_unref (pixbuf);
7062 g_signal_connect (window, "button_press_event",
7063 G_CALLBACK (shape_pressed), NULL);
7064 g_signal_connect (window, "button_release_event",
7065 G_CALLBACK (shape_released), NULL);
7066 g_signal_connect (window, "motion_notify_event",
7067 G_CALLBACK (shape_motion), NULL);
7069 icon_pos = g_new (CursorOffset, 1);
7070 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
7072 gtk_window_move (GTK_WINDOW (window), x, y);
7073 gtk_widget_show (window);
7079 create_shapes (GtkWidget *widget)
7081 /* Variables used by the Drag/Drop and Shape Window demos */
7082 static GtkWidget *modeller = NULL;
7083 static GtkWidget *sheets = NULL;
7084 static GtkWidget *rings = NULL;
7085 static GtkWidget *with_region = NULL;
7086 GdkScreen *screen = gtk_widget_get_screen (widget);
7088 if (!(file_exists ("Modeller.xpm") &&
7089 file_exists ("FilesQueue.xpm") &&
7090 file_exists ("3DRings.xpm")))
7096 modeller = shape_create_icon (screen, "Modeller.xpm",
7097 440, 140, 0,0, GTK_WINDOW_POPUP);
7099 g_signal_connect (modeller, "destroy",
7100 G_CALLBACK (gtk_widget_destroyed),
7104 gtk_widget_destroy (modeller);
7108 sheets = shape_create_icon (screen, "FilesQueue.xpm",
7109 580, 170, 0,0, GTK_WINDOW_POPUP);
7111 g_signal_connect (sheets, "destroy",
7112 G_CALLBACK (gtk_widget_destroyed),
7117 gtk_widget_destroy (sheets);
7121 rings = shape_create_icon (screen, "3DRings.xpm",
7122 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7124 g_signal_connect (rings, "destroy",
7125 G_CALLBACK (gtk_widget_destroyed),
7129 gtk_widget_destroy (rings);
7133 cairo_region_t *region;
7136 with_region = shape_create_icon (screen, "3DRings.xpm",
7137 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7139 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
7141 g_signal_connect (with_region, "destroy",
7142 G_CALLBACK (gtk_widget_destroyed),
7145 /* reset shape from mask to a region */
7148 region = cairo_region_create ();
7160 cairo_region_union_rectangle (region, &rect);
7168 gdk_window_shape_combine_region (gtk_widget_get_window (with_region),
7173 gtk_widget_destroy (with_region);
7181 create_wmhints (GtkWidget *widget)
7183 static GtkWidget *window = NULL;
7185 GtkWidget *separator;
7189 GdkWindow *gdk_window;
7195 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7197 gtk_window_set_screen (GTK_WINDOW (window),
7198 gtk_widget_get_screen (widget));
7200 g_signal_connect (window, "destroy",
7201 G_CALLBACK (gtk_widget_destroyed),
7204 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
7205 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7207 gtk_widget_realize (window);
7209 gdk_window = gtk_widget_get_window (window);
7211 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
7212 list = g_list_prepend (NULL, pixbuf);
7214 gdk_window_set_icon_list (gdk_window, list);
7217 g_object_unref (pixbuf);
7219 gdk_window_set_icon_name (gdk_window, "WMHints Test Icon");
7221 gdk_window_set_decorations (gdk_window, GDK_DECOR_ALL | GDK_DECOR_MENU);
7222 gdk_window_set_functions (gdk_window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
7224 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
7225 gtk_container_add (GTK_CONTAINER (window), box1);
7226 gtk_widget_show (box1);
7228 label = gtk_label_new ("Try iconizing me!");
7229 gtk_widget_set_size_request (label, 150, 50);
7230 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
7231 gtk_widget_show (label);
7234 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
7235 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
7236 gtk_widget_show (separator);
7239 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 10);
7240 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7241 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7242 gtk_widget_show (box2);
7245 button = gtk_button_new_with_label ("close");
7247 g_signal_connect_swapped (button, "clicked",
7248 G_CALLBACK (gtk_widget_destroy),
7251 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7252 gtk_widget_set_can_default (button, TRUE);
7253 gtk_widget_grab_default (button);
7254 gtk_widget_show (button);
7257 if (!gtk_widget_get_visible (window))
7258 gtk_widget_show (window);
7260 gtk_widget_destroy (window);
7265 * Window state tracking
7269 window_state_callback (GtkWidget *widget,
7270 GdkEventWindowState *event,
7273 GtkWidget *label = data;
7276 msg = g_strconcat (gtk_window_get_title (GTK_WINDOW (widget)), ": ",
7277 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
7278 "withdrawn" : "not withdrawn", ", ",
7279 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
7280 "iconified" : "not iconified", ", ",
7281 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
7282 "sticky" : "not sticky", ", ",
7283 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
7284 "maximized" : "not maximized", ", ",
7285 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
7286 "fullscreen" : "not fullscreen",
7287 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
7288 "above" : "not above", ", ",
7289 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
7290 "below" : "not below", ", ",
7293 gtk_label_set_text (GTK_LABEL (label), msg);
7301 tracking_label (GtkWidget *window)
7307 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 5);
7309 g_signal_connect_object (hbox,
7311 G_CALLBACK (gtk_widget_destroy),
7315 label = gtk_label_new ("<no window state events received>");
7316 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
7317 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
7319 g_signal_connect (window,
7320 "window_state_event",
7321 G_CALLBACK (window_state_callback),
7324 button = gtk_button_new_with_label ("Deiconify");
7325 g_signal_connect_object (button,
7327 G_CALLBACK (gtk_window_deiconify),
7330 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7332 button = gtk_button_new_with_label ("Iconify");
7333 g_signal_connect_object (button,
7335 G_CALLBACK (gtk_window_iconify),
7338 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7340 button = gtk_button_new_with_label ("Fullscreen");
7341 g_signal_connect_object (button,
7343 G_CALLBACK (gtk_window_fullscreen),
7346 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7348 button = gtk_button_new_with_label ("Unfullscreen");
7349 g_signal_connect_object (button,
7351 G_CALLBACK (gtk_window_unfullscreen),
7354 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7356 button = gtk_button_new_with_label ("Present");
7357 g_signal_connect_object (button,
7359 G_CALLBACK (gtk_window_present),
7362 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7364 button = gtk_button_new_with_label ("Show");
7365 g_signal_connect_object (button,
7367 G_CALLBACK (gtk_widget_show),
7370 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7372 gtk_widget_show_all (hbox);
7378 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
7380 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7382 gtk_window_set_keep_above (GTK_WINDOW (data),
7383 gtk_toggle_button_get_active (togglebutton));
7385 if (gtk_toggle_button_get_active (togglebutton))
7386 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7390 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
7392 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7394 gtk_window_set_keep_below (GTK_WINDOW (data),
7395 gtk_toggle_button_get_active (togglebutton));
7397 if (gtk_toggle_button_get_active (togglebutton))
7398 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7403 get_state_controls (GtkWidget *window)
7407 GtkWidget *button_above;
7408 GtkWidget *button_below;
7410 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
7412 button = gtk_button_new_with_label ("Stick");
7413 g_signal_connect_object (button,
7415 G_CALLBACK (gtk_window_stick),
7418 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7420 button = gtk_button_new_with_label ("Unstick");
7421 g_signal_connect_object (button,
7423 G_CALLBACK (gtk_window_unstick),
7426 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7428 button = gtk_button_new_with_label ("Maximize");
7429 g_signal_connect_object (button,
7431 G_CALLBACK (gtk_window_maximize),
7434 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7436 button = gtk_button_new_with_label ("Unmaximize");
7437 g_signal_connect_object (button,
7439 G_CALLBACK (gtk_window_unmaximize),
7442 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7444 button = gtk_button_new_with_label ("Iconify");
7445 g_signal_connect_object (button,
7447 G_CALLBACK (gtk_window_iconify),
7450 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7452 button = gtk_button_new_with_label ("Fullscreen");
7453 g_signal_connect_object (button,
7455 G_CALLBACK (gtk_window_fullscreen),
7458 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7460 button = gtk_button_new_with_label ("Unfullscreen");
7461 g_signal_connect_object (button,
7463 G_CALLBACK (gtk_window_unfullscreen),
7466 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7468 button_above = gtk_toggle_button_new_with_label ("Keep above");
7469 g_signal_connect (button_above,
7471 G_CALLBACK (keep_window_above),
7473 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
7475 button_below = gtk_toggle_button_new_with_label ("Keep below");
7476 g_signal_connect (button_below,
7478 G_CALLBACK (keep_window_below),
7480 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
7482 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
7483 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
7485 button = gtk_button_new_with_label ("Hide (withdraw)");
7486 g_signal_connect_object (button,
7488 G_CALLBACK (gtk_widget_hide),
7491 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7493 gtk_widget_show_all (vbox);
7499 create_window_states (GtkWidget *widget)
7501 static GtkWidget *window = NULL;
7504 GtkWidget *iconified;
7506 GtkWidget *controls;
7510 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7511 gtk_window_set_screen (GTK_WINDOW (window),
7512 gtk_widget_get_screen (widget));
7514 g_signal_connect (window, "destroy",
7515 G_CALLBACK (gtk_widget_destroyed),
7518 gtk_window_set_title (GTK_WINDOW (window), "Window states");
7520 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
7521 gtk_container_add (GTK_CONTAINER (window), box1);
7523 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7525 gtk_window_set_screen (GTK_WINDOW (iconified),
7526 gtk_widget_get_screen (widget));
7528 g_signal_connect_object (iconified, "destroy",
7529 G_CALLBACK (gtk_widget_destroy),
7532 gtk_window_iconify (GTK_WINDOW (iconified));
7533 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
7534 controls = get_state_controls (iconified);
7535 gtk_container_add (GTK_CONTAINER (iconified), controls);
7537 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7539 gtk_window_set_screen (GTK_WINDOW (normal),
7540 gtk_widget_get_screen (widget));
7542 g_signal_connect_object (normal, "destroy",
7543 G_CALLBACK (gtk_widget_destroy),
7547 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
7548 controls = get_state_controls (normal);
7549 gtk_container_add (GTK_CONTAINER (normal), controls);
7551 label = tracking_label (iconified);
7552 gtk_container_add (GTK_CONTAINER (box1), label);
7554 label = tracking_label (normal);
7555 gtk_container_add (GTK_CONTAINER (box1), label);
7557 gtk_widget_show_all (iconified);
7558 gtk_widget_show_all (normal);
7559 gtk_widget_show_all (box1);
7562 if (!gtk_widget_get_visible (window))
7563 gtk_widget_show (window);
7565 gtk_widget_destroy (window);
7573 configure_event_callback (GtkWidget *widget,
7574 GdkEventConfigure *event,
7577 GtkWidget *label = data;
7581 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
7583 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
7585 event->x, event->y, event->width, event->height,
7588 gtk_label_set_text (GTK_LABEL (label), msg);
7596 get_ints (GtkWidget *window,
7603 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
7604 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
7606 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
7607 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
7611 set_size_callback (GtkWidget *widget,
7616 get_ints (data, &w, &h);
7618 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
7622 unset_default_size_callback (GtkWidget *widget,
7625 gtk_window_set_default_size (g_object_get_data (data, "target"),
7630 set_default_size_callback (GtkWidget *widget,
7635 get_ints (data, &w, &h);
7637 gtk_window_set_default_size (g_object_get_data (data, "target"),
7642 unset_size_request_callback (GtkWidget *widget,
7645 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7650 set_size_request_callback (GtkWidget *widget,
7655 get_ints (data, &w, &h);
7657 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7662 set_location_callback (GtkWidget *widget,
7667 get_ints (data, &x, &y);
7669 gtk_window_move (g_object_get_data (data, "target"), x, y);
7673 move_to_position_callback (GtkWidget *widget,
7679 window = g_object_get_data (data, "target");
7681 gtk_window_get_position (window, &x, &y);
7683 gtk_window_move (window, x, y);
7687 set_geometry_callback (GtkWidget *entry,
7693 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
7695 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
7697 if (!gtk_window_parse_geometry (target, text))
7698 g_print ("Bad geometry string '%s'\n", text);
7704 resizable_callback (GtkWidget *widget,
7707 g_object_set (g_object_get_data (data, "target"),
7708 "resizable", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)),
7713 gravity_selected (GtkWidget *widget,
7716 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
7717 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GDK_GRAVITY_NORTH_WEST);
7721 pos_selected (GtkWidget *widget,
7724 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
7725 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GTK_WIN_POS_NONE);
7729 move_gravity_window_to_current_position (GtkWidget *widget,
7735 window = GTK_WINDOW (data);
7737 gtk_window_get_position (window, &x, &y);
7739 gtk_window_move (window, x, y);
7743 get_screen_corner (GtkWindow *window,
7748 GdkScreen * screen = gtk_window_get_screen (window);
7750 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
7752 switch (gtk_window_get_gravity (window))
7754 case GDK_GRAVITY_SOUTH_EAST:
7755 *x = gdk_screen_get_width (screen) - w;
7756 *y = gdk_screen_get_height (screen) - h;
7759 case GDK_GRAVITY_NORTH_EAST:
7760 *x = gdk_screen_get_width (screen) - w;
7764 case GDK_GRAVITY_SOUTH_WEST:
7766 *y = gdk_screen_get_height (screen) - h;
7769 case GDK_GRAVITY_NORTH_WEST:
7774 case GDK_GRAVITY_SOUTH:
7775 *x = (gdk_screen_get_width (screen) - w) / 2;
7776 *y = gdk_screen_get_height (screen) - h;
7779 case GDK_GRAVITY_NORTH:
7780 *x = (gdk_screen_get_width (screen) - w) / 2;
7784 case GDK_GRAVITY_WEST:
7786 *y = (gdk_screen_get_height (screen) - h) / 2;
7789 case GDK_GRAVITY_EAST:
7790 *x = gdk_screen_get_width (screen) - w;
7791 *y = (gdk_screen_get_height (screen) - h) / 2;
7794 case GDK_GRAVITY_CENTER:
7795 *x = (gdk_screen_get_width (screen) - w) / 2;
7796 *y = (gdk_screen_get_height (screen) - h) / 2;
7799 case GDK_GRAVITY_STATIC:
7800 /* pick some random numbers */
7806 g_assert_not_reached ();
7812 move_gravity_window_to_starting_position (GtkWidget *widget,
7818 window = GTK_WINDOW (data);
7820 get_screen_corner (window,
7823 gtk_window_move (window, x, y);
7827 make_gravity_window (GtkWidget *destroy_with,
7836 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7838 gtk_window_set_screen (GTK_WINDOW (window),
7839 gtk_widget_get_screen (destroy_with));
7841 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
7842 gtk_widget_show (vbox);
7844 gtk_container_add (GTK_CONTAINER (window), vbox);
7845 gtk_window_set_title (GTK_WINDOW (window), title);
7846 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
7848 g_signal_connect_object (destroy_with,
7850 G_CALLBACK (gtk_widget_destroy),
7855 button = gtk_button_new_with_mnemonic ("_Move to current position");
7857 g_signal_connect (button, "clicked",
7858 G_CALLBACK (move_gravity_window_to_current_position),
7861 gtk_container_add (GTK_CONTAINER (vbox), button);
7862 gtk_widget_show (button);
7864 button = gtk_button_new_with_mnemonic ("Move to _starting position");
7866 g_signal_connect (button, "clicked",
7867 G_CALLBACK (move_gravity_window_to_starting_position),
7870 gtk_container_add (GTK_CONTAINER (vbox), button);
7871 gtk_widget_show (button);
7873 /* Pretend this is the result of --geometry.
7874 * DO NOT COPY THIS CODE unless you are setting --geometry results,
7875 * and in that case you probably should just use gtk_window_parse_geometry().
7876 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
7877 * you are parsing --geometry or equivalent.
7879 gtk_window_set_geometry_hints (GTK_WINDOW (window),
7883 gtk_window_set_default_size (GTK_WINDOW (window),
7886 get_screen_corner (GTK_WINDOW (window), &x, &y);
7888 gtk_window_move (GTK_WINDOW (window),
7895 do_gravity_test (GtkWidget *widget,
7898 GtkWidget *destroy_with = data;
7901 /* We put a window at each gravity point on the screen. */
7902 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
7904 gtk_widget_show (window);
7906 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
7908 gtk_widget_show (window);
7910 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
7912 gtk_widget_show (window);
7914 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
7916 gtk_widget_show (window);
7918 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
7920 gtk_widget_show (window);
7922 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
7924 gtk_widget_show (window);
7927 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
7929 gtk_widget_show (window);
7932 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
7934 gtk_widget_show (window);
7936 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
7938 gtk_widget_show (window);
7940 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
7942 gtk_widget_show (window);
7946 window_controls (GtkWidget *window)
7948 GtkWidget *control_window;
7958 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7960 gtk_window_set_screen (GTK_WINDOW (control_window),
7961 gtk_widget_get_screen (window));
7963 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
7965 g_object_set_data (G_OBJECT (control_window),
7969 g_signal_connect_object (control_window,
7971 G_CALLBACK (gtk_widget_destroy),
7975 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 5);
7977 gtk_container_add (GTK_CONTAINER (control_window), vbox);
7979 label = gtk_label_new ("<no configure events>");
7980 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
7982 g_signal_connect (window,
7984 G_CALLBACK (configure_event_callback),
7987 adj = gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0, 5.0, 0.0);
7988 spin = gtk_spin_button_new (adj, 0, 0);
7990 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
7992 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
7994 adj = gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0, 5.0, 0.0);
7995 spin = gtk_spin_button_new (adj, 0, 0);
7997 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
7999 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
8001 entry = gtk_entry_new ();
8002 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
8004 g_signal_connect (entry, "changed",
8005 G_CALLBACK (set_geometry_callback),
8008 button = gtk_button_new_with_label ("Show gravity test windows");
8009 g_signal_connect_swapped (button,
8011 G_CALLBACK (do_gravity_test),
8013 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8015 button = gtk_button_new_with_label ("Reshow with initial size");
8016 g_signal_connect_object (button,
8018 G_CALLBACK (gtk_window_reshow_with_initial_size),
8021 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8023 button = gtk_button_new_with_label ("Queue resize");
8024 g_signal_connect_object (button,
8026 G_CALLBACK (gtk_widget_queue_resize),
8029 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8031 button = gtk_button_new_with_label ("Resize");
8032 g_signal_connect (button,
8034 G_CALLBACK (set_size_callback),
8036 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8038 button = gtk_button_new_with_label ("Set default size");
8039 g_signal_connect (button,
8041 G_CALLBACK (set_default_size_callback),
8043 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8045 button = gtk_button_new_with_label ("Unset default size");
8046 g_signal_connect (button,
8048 G_CALLBACK (unset_default_size_callback),
8050 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8052 button = gtk_button_new_with_label ("Set size request");
8053 g_signal_connect (button,
8055 G_CALLBACK (set_size_request_callback),
8057 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8059 button = gtk_button_new_with_label ("Unset size request");
8060 g_signal_connect (button,
8062 G_CALLBACK (unset_size_request_callback),
8064 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8066 button = gtk_button_new_with_label ("Move");
8067 g_signal_connect (button,
8069 G_CALLBACK (set_location_callback),
8071 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8073 button = gtk_button_new_with_label ("Move to current position");
8074 g_signal_connect (button,
8076 G_CALLBACK (move_to_position_callback),
8078 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8080 button = gtk_check_button_new_with_label ("Allow resize");
8081 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
8082 g_signal_connect (button,
8084 G_CALLBACK (resizable_callback),
8086 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8088 button = gtk_button_new_with_mnemonic ("_Show");
8089 g_signal_connect_object (button,
8091 G_CALLBACK (gtk_widget_show),
8094 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8096 button = gtk_button_new_with_mnemonic ("_Hide");
8097 g_signal_connect_object (button,
8099 G_CALLBACK (gtk_widget_hide),
8102 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8104 om = gtk_combo_box_text_new ();
8108 static gchar *names[] = {
8109 "GDK_GRAVITY_NORTH_WEST",
8110 "GDK_GRAVITY_NORTH",
8111 "GDK_GRAVITY_NORTH_EAST",
8113 "GDK_GRAVITY_CENTER",
8115 "GDK_GRAVITY_SOUTH_WEST",
8116 "GDK_GRAVITY_SOUTH",
8117 "GDK_GRAVITY_SOUTH_EAST",
8118 "GDK_GRAVITY_STATIC",
8122 g_assert (names[i]);
8123 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (om), names[i]);
8128 g_signal_connect (om,
8130 G_CALLBACK (gravity_selected),
8133 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8136 om = gtk_combo_box_text_new ();
8140 static gchar *names[] = {
8142 "GTK_WIN_POS_CENTER",
8143 "GTK_WIN_POS_MOUSE",
8144 "GTK_WIN_POS_CENTER_ALWAYS",
8145 "GTK_WIN_POS_CENTER_ON_PARENT",
8149 g_assert (names[i]);
8150 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (om), names[i]);
8155 g_signal_connect (om,
8157 G_CALLBACK (pos_selected),
8160 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8162 gtk_widget_show_all (vbox);
8164 return control_window;
8168 create_window_sizing (GtkWidget *widget)
8170 static GtkWidget *window = NULL;
8171 static GtkWidget *target_window = NULL;
8177 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8178 gtk_window_set_screen (GTK_WINDOW (target_window),
8179 gtk_widget_get_screen (widget));
8180 label = gtk_label_new (NULL);
8181 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");
8182 gtk_container_add (GTK_CONTAINER (target_window), label);
8183 gtk_widget_show (label);
8185 g_signal_connect (target_window, "destroy",
8186 G_CALLBACK (gtk_widget_destroyed),
8189 window = window_controls (target_window);
8191 g_signal_connect (window, "destroy",
8192 G_CALLBACK (gtk_widget_destroyed),
8195 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
8198 /* don't show target window by default, we want to allow testing
8199 * of behavior on first show.
8202 if (!gtk_widget_get_visible (window))
8203 gtk_widget_show (window);
8205 gtk_widget_destroy (window);
8212 typedef struct _ProgressData {
8215 GtkWidget *block_spin;
8216 GtkWidget *x_align_spin;
8217 GtkWidget *y_align_spin;
8218 GtkWidget *step_spin;
8219 GtkWidget *act_blocks_spin;
8230 progress_timeout (gpointer data)
8232 ProgressData *pdata = data;
8236 if (pdata->activity)
8238 gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar));
8240 text = g_strdup_printf ("%s", "???");
8244 new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;
8247 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);
8249 text = g_strdup_printf ("%.0f%%", 100 * new_val);
8252 gtk_label_set_text (GTK_LABEL (pdata->label), text);
8259 destroy_progress (GtkWidget *widget,
8260 ProgressData **pdata)
8262 g_source_remove ((*pdata)->timer);
8263 (*pdata)->timer = 0;
8264 (*pdata)->window = NULL;
8270 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
8272 ProgressData *pdata;
8275 pdata = (ProgressData *) data;
8277 if (!gtk_widget_get_mapped (widget))
8280 i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8282 if (i == 0 || i == 1)
8283 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_HORIZONTAL);
8285 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_VERTICAL);
8287 if (i == 1 || i == 2)
8288 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), TRUE);
8290 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), FALSE);
8294 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
8298 active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8299 gtk_progress_bar_set_show_text (GTK_PROGRESS_BAR (pdata->pbar), active);
8303 progressbar_toggle_ellipsize (GtkWidget *widget,
8306 ProgressData *pdata = data;
8307 if (gtk_widget_is_drawable (widget))
8309 gint i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8310 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar), i);
8315 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
8317 pdata->activity = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8321 entry_changed (GtkWidget *widget, ProgressData *pdata)
8323 gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar),
8324 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
8328 create_progress_bar (GtkWidget *widget)
8330 GtkWidget *action_area, *content_area;
8340 static ProgressData *pdata = NULL;
8342 static gchar *items1[] =
8350 static char *ellipsize_items[] = {
8351 "None", // PANGO_ELLIPSIZE_NONE,
8352 "Start", // PANGO_ELLIPSIZE_START,
8353 "Middle", // PANGO_ELLIPSIZE_MIDDLE,
8354 "End", // PANGO_ELLIPSIZE_END
8358 pdata = g_new0 (ProgressData, 1);
8362 pdata->window = gtk_dialog_new ();
8364 gtk_window_set_screen (GTK_WINDOW (pdata->window),
8365 gtk_widget_get_screen (widget));
8367 gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);
8369 g_signal_connect (pdata->window, "destroy",
8370 G_CALLBACK (destroy_progress),
8374 content_area = gtk_dialog_get_content_area (GTK_DIALOG (pdata->window));
8375 action_area = gtk_dialog_get_action_area (GTK_DIALOG (pdata->window));
8377 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
8378 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
8380 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 5);
8381 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
8382 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, TRUE, 0);
8384 frame = gtk_frame_new ("Progress");
8385 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8387 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 5);
8388 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8390 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8391 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8393 pdata->pbar = gtk_progress_bar_new ();
8394 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar),
8395 PANGO_ELLIPSIZE_MIDDLE);
8397 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
8398 pdata->timer = g_timeout_add (100, (GSourceFunc)progress_timeout, pdata);
8400 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8401 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8403 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 5);
8404 gtk_container_add (GTK_CONTAINER (align), hbox);
8405 label = gtk_label_new ("Label updated by user :");
8406 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8407 pdata->label = gtk_label_new ("");
8408 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
8410 frame = gtk_frame_new ("Options");
8411 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8413 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 5);
8414 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8416 tab = gtk_table_new (7, 2, FALSE);
8417 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
8419 label = gtk_label_new ("Orientation :");
8420 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
8421 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8423 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
8425 pdata->omenu1 = build_option_menu (items1, 4, 0,
8426 progressbar_toggle_orientation,
8428 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
8429 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
8430 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8432 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
8434 check = gtk_check_button_new_with_label ("Show text");
8435 g_signal_connect (check, "clicked",
8436 G_CALLBACK (toggle_show_text),
8438 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 1, 2,
8439 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8442 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
8443 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 1, 2,
8444 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8447 label = gtk_label_new ("Text: ");
8448 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8450 pdata->entry = gtk_entry_new ();
8451 g_signal_connect (pdata->entry, "changed",
8452 G_CALLBACK (entry_changed),
8454 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
8455 gtk_widget_set_size_request (pdata->entry, 100, -1);
8457 label = gtk_label_new ("Ellipsize text :");
8458 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 10, 11,
8459 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8461 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
8462 pdata->elmenu = build_option_menu (ellipsize_items,
8463 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
8464 2, // PANGO_ELLIPSIZE_MIDDLE
8465 progressbar_toggle_ellipsize,
8467 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
8468 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 10, 11,
8469 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8471 gtk_box_pack_start (GTK_BOX (hbox), pdata->elmenu, TRUE, TRUE, 0);
8473 check = gtk_check_button_new_with_label ("Activity mode");
8474 g_signal_connect (check, "clicked",
8475 G_CALLBACK (toggle_activity_mode), pdata);
8476 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 15, 16,
8477 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8480 button = gtk_button_new_with_label ("close");
8481 g_signal_connect_swapped (button, "clicked",
8482 G_CALLBACK (gtk_widget_destroy),
8484 gtk_widget_set_can_default (button, TRUE);
8485 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
8486 gtk_widget_grab_default (button);
8489 if (!gtk_widget_get_visible (pdata->window))
8490 gtk_widget_show_all (pdata->window);
8492 gtk_widget_destroy (pdata->window);
8504 GtkWidget *res_widget;
8508 find_widget (GtkWidget *widget, FindWidgetData *data)
8510 GtkAllocation new_allocation;
8514 gtk_widget_get_allocation (widget, &new_allocation);
8516 if (data->found || !gtk_widget_get_mapped (widget))
8519 /* Note that in the following code, we only count the
8520 * position as being inside a WINDOW widget if it is inside
8521 * widget->window; points that are outside of widget->window
8522 * but within the allocation are not counted. This is consistent
8523 * with the way we highlight drag targets.
8525 if (gtk_widget_get_has_window (widget))
8527 new_allocation.x = 0;
8528 new_allocation.y = 0;
8531 if (gtk_widget_get_parent (widget) && !data->first)
8533 GdkWindow *window = gtk_widget_get_window (widget);
8534 while (window != gtk_widget_get_window (gtk_widget_get_parent (widget)))
8536 gint tx, ty, twidth, theight;
8538 twidth = gdk_window_get_width (window);
8539 theight = gdk_window_get_height (window);
8541 if (new_allocation.x < 0)
8543 new_allocation.width += new_allocation.x;
8544 new_allocation.x = 0;
8546 if (new_allocation.y < 0)
8548 new_allocation.height += new_allocation.y;
8549 new_allocation.y = 0;
8551 if (new_allocation.x + new_allocation.width > twidth)
8552 new_allocation.width = twidth - new_allocation.x;
8553 if (new_allocation.y + new_allocation.height > theight)
8554 new_allocation.height = theight - new_allocation.y;
8556 gdk_window_get_position (window, &tx, &ty);
8557 new_allocation.x += tx;
8559 new_allocation.y += ty;
8562 window = gdk_window_get_parent (window);
8566 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
8567 (data->x < new_allocation.x + new_allocation.width) &&
8568 (data->y < new_allocation.y + new_allocation.height))
8570 /* First, check if the drag is in a valid drop site in
8571 * one of our children
8573 if (GTK_IS_CONTAINER (widget))
8575 FindWidgetData new_data = *data;
8577 new_data.x -= x_offset;
8578 new_data.y -= y_offset;
8579 new_data.found = FALSE;
8580 new_data.first = FALSE;
8582 gtk_container_forall (GTK_CONTAINER (widget),
8583 (GtkCallback)find_widget,
8586 data->found = new_data.found;
8588 data->res_widget = new_data.res_widget;
8591 /* If not, and this widget is registered as a drop site, check to
8592 * emit "drag_motion" to check if we are actually in
8598 data->res_widget = widget;
8604 find_widget_at_pointer (GdkDisplay *display)
8606 GtkWidget *widget = NULL;
8607 GdkWindow *pointer_window;
8609 FindWidgetData data;
8611 pointer_window = gdk_display_get_window_at_pointer (display, NULL, NULL);
8615 gpointer widget_ptr;
8617 gdk_window_get_user_data (pointer_window, &widget_ptr);
8618 widget = widget_ptr;
8623 gdk_window_get_pointer (gtk_widget_get_window (widget),
8631 find_widget (widget, &data);
8633 return data.res_widget;
8639 struct PropertiesData {
8647 destroy_properties (GtkWidget *widget,
8648 struct PropertiesData *data)
8652 *data->window = NULL;
8653 data->window = NULL;
8658 gdk_cursor_unref (data->cursor);
8659 data->cursor = NULL;
8664 g_signal_handler_disconnect (widget, data->handler);
8672 property_query_event (GtkWidget *widget,
8674 struct PropertiesData *data)
8676 GtkWidget *res_widget = NULL;
8678 if (!data->in_query)
8681 if (event->type == GDK_BUTTON_RELEASE)
8683 gtk_grab_remove (widget);
8684 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
8687 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
8690 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
8691 gtk_widget_get_screen (widget));
8692 create_prop_editor (G_OBJECT (res_widget), 0);
8695 data->in_query = FALSE;
8702 query_properties (GtkButton *button,
8703 struct PropertiesData *data)
8705 GtkWidget *widget = GTK_WIDGET (button);
8708 g_signal_connect (button, "event",
8709 G_CALLBACK (property_query_event), data);
8713 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget),
8716 failure = gdk_pointer_grab (gtk_widget_get_window (widget),
8718 GDK_BUTTON_RELEASE_MASK,
8723 gtk_grab_add (widget);
8725 data->in_query = TRUE;
8729 create_properties (GtkWidget *widget)
8731 static GtkWidget *window = NULL;
8735 struct PropertiesData *data;
8737 data = g_new (struct PropertiesData, 1);
8738 data->window = &window;
8739 data->in_query = FALSE;
8740 data->cursor = NULL;
8745 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8747 gtk_window_set_screen (GTK_WINDOW (window),
8748 gtk_widget_get_screen (widget));
8750 data->handler = g_signal_connect (window, "destroy",
8751 G_CALLBACK (destroy_properties),
8754 gtk_window_set_title (GTK_WINDOW (window), "test properties");
8755 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
8757 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 1);
8758 gtk_container_add (GTK_CONTAINER (window), vbox);
8760 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
8761 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
8763 button = gtk_button_new_with_label ("Query properties");
8764 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8765 g_signal_connect (button, "clicked",
8766 G_CALLBACK (query_properties),
8770 if (!gtk_widget_get_visible (window))
8771 gtk_widget_show_all (window);
8773 gtk_widget_destroy (window);
8777 struct SnapshotData {
8778 GtkWidget *toplevel_button;
8782 gboolean is_toplevel;
8787 destroy_snapshot_data (GtkWidget *widget,
8788 struct SnapshotData *data)
8791 *data->window = NULL;
8795 gdk_cursor_unref (data->cursor);
8796 data->cursor = NULL;
8801 g_signal_handler_disconnect (widget, data->handler);
8809 snapshot_widget_event (GtkWidget *widget,
8811 struct SnapshotData *data)
8813 GtkWidget *res_widget = NULL;
8815 if (!data->in_query)
8818 if (event->type == GDK_BUTTON_RELEASE)
8820 gtk_grab_remove (widget);
8821 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
8824 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
8825 if (data->is_toplevel && res_widget)
8826 res_widget = gtk_widget_get_toplevel (res_widget);
8829 cairo_surface_t *surface;
8830 GtkWidget *window, *image;
8835 width = gtk_widget_get_allocated_width (res_widget);
8836 height = gtk_widget_get_allocated_height (res_widget);
8838 surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
8840 cr = cairo_create (surface);
8841 gtk_widget_draw (res_widget, cr);
8844 pixbuf = gdk_pixbuf_get_from_surface (surface,
8847 cairo_surface_destroy (surface);
8849 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8850 image = gtk_image_new_from_pixbuf (pixbuf);
8851 g_object_unref (pixbuf);
8853 gtk_container_add (GTK_CONTAINER (window), image);
8854 gtk_widget_show_all (window);
8857 data->in_query = FALSE;
8864 snapshot_widget (GtkButton *button,
8865 struct SnapshotData *data)
8867 GtkWidget *widget = GTK_WIDGET (button);
8870 g_signal_connect (button, "event",
8871 G_CALLBACK (snapshot_widget_event), data);
8873 data->is_toplevel = widget == data->toplevel_button;
8876 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget),
8879 failure = gdk_pointer_grab (gtk_widget_get_window (widget),
8881 GDK_BUTTON_RELEASE_MASK,
8886 gtk_grab_add (widget);
8888 data->in_query = TRUE;
8892 create_snapshot (GtkWidget *widget)
8894 static GtkWidget *window = NULL;
8897 struct SnapshotData *data;
8899 data = g_new (struct SnapshotData, 1);
8900 data->window = &window;
8901 data->in_query = FALSE;
8902 data->cursor = NULL;
8907 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8909 gtk_window_set_screen (GTK_WINDOW (window),
8910 gtk_widget_get_screen (widget));
8912 data->handler = g_signal_connect (window, "destroy",
8913 G_CALLBACK (destroy_snapshot_data),
8916 gtk_window_set_title (GTK_WINDOW (window), "test snapshot");
8917 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
8919 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 1);
8920 gtk_container_add (GTK_CONTAINER (window), vbox);
8922 button = gtk_button_new_with_label ("Snapshot widget");
8923 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8924 g_signal_connect (button, "clicked",
8925 G_CALLBACK (snapshot_widget),
8928 button = gtk_button_new_with_label ("Snapshot toplevel");
8929 data->toplevel_button = button;
8930 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8931 g_signal_connect (button, "clicked",
8932 G_CALLBACK (snapshot_widget),
8936 if (!gtk_widget_get_visible (window))
8937 gtk_widget_show_all (window);
8939 gtk_widget_destroy (window);
8948 selection_test_received (GtkWidget *tree_view,
8949 GtkSelectionData *data)
8951 GtkTreeModel *model;
8952 GtkListStore *store;
8956 if (data->length < 0)
8958 g_print ("Selection retrieval failed\n");
8961 if (data->type != GDK_SELECTION_TYPE_ATOM)
8963 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
8967 /* Clear out any current list items */
8969 model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
8970 store = GTK_LIST_STORE (model);
8971 gtk_list_store_clear (store);
8973 /* Add new items to list */
8975 atoms = (GdkAtom *)data->data;
8977 l = data->length / sizeof (GdkAtom);
8978 for (i = 0; i < l; i++)
8983 name = gdk_atom_name (atoms[i]);
8986 gtk_list_store_insert_with_values (store, &iter, i, 0, name, -1);
8990 gtk_list_store_insert_with_values (store, &iter, i, 0, "(bad atom)", -1);
8997 selection_test_get_targets (GtkWidget *widget, GtkWidget *tree_view)
8999 static GdkAtom targets_atom = GDK_NONE;
9001 if (targets_atom == GDK_NONE)
9002 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
9004 gtk_selection_convert (tree_view, GDK_SELECTION_PRIMARY, targets_atom,
9009 create_selection_test (GtkWidget *widget)
9011 static GtkWidget *window = NULL;
9012 GtkWidget *action_area, *content_area;
9015 GtkWidget *scrolled_win;
9016 GtkListStore* store;
9017 GtkWidget *tree_view;
9018 GtkTreeViewColumn *column;
9019 GtkCellRenderer *renderer;
9024 window = gtk_dialog_new ();
9026 gtk_window_set_screen (GTK_WINDOW (window),
9027 gtk_widget_get_screen (widget));
9029 g_signal_connect (window, "destroy",
9030 G_CALLBACK (gtk_widget_destroyed),
9033 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9034 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9036 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
9037 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9039 /* Create the list */
9041 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 5);
9042 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9043 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
9045 label = gtk_label_new ("Gets available targets for current selection");
9046 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9048 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
9049 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
9050 GTK_POLICY_AUTOMATIC,
9051 GTK_POLICY_AUTOMATIC);
9052 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
9053 gtk_widget_set_size_request (scrolled_win, 100, 200);
9055 store = gtk_list_store_new (1, G_TYPE_STRING);
9056 tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
9057 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), tree_view);
9059 renderer = gtk_cell_renderer_text_new ();
9060 column = gtk_tree_view_column_new_with_attributes ("Target", renderer,
9062 gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
9064 g_signal_connect (tree_view, "selection_received",
9065 G_CALLBACK (selection_test_received), NULL);
9067 /* .. And create some buttons */
9068 button = gtk_button_new_with_label ("Get Targets");
9069 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9071 g_signal_connect (button, "clicked",
9072 G_CALLBACK (selection_test_get_targets), tree_view);
9074 button = gtk_button_new_with_label ("Quit");
9075 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9077 g_signal_connect_swapped (button, "clicked",
9078 G_CALLBACK (gtk_widget_destroy),
9082 if (!gtk_widget_get_visible (window))
9083 gtk_widget_show_all (window);
9085 gtk_widget_destroy (window);
9092 static int scroll_test_pos = 0.0;
9095 scroll_test_draw (GtkWidget *widget,
9100 gint imin, imax, jmin, jmax;
9103 gdk_cairo_get_clip_rectangle (cr, &clip);
9105 imin = (clip.x) / 10;
9106 imax = (clip.x + clip.width + 9) / 10;
9108 jmin = ((int)adj->value + clip.y) / 10;
9109 jmax = ((int)adj->value + clip.y + clip.height + 9) / 10;
9111 for (i=imin; i<imax; i++)
9112 for (j=jmin; j<jmax; j++)
9114 cairo_rectangle (cr, 10*i, 10*j - (int)adj->value, 1+i%10, 1+j%10);
9122 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
9125 gdouble new_value = adj->value + ((event->direction == GDK_SCROLL_UP) ?
9126 -adj->page_increment / 2:
9127 adj->page_increment / 2);
9128 new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
9129 gtk_adjustment_set_value (adj, new_value);
9135 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
9138 GtkAllocation allocation;
9140 gtk_widget_get_allocation (widget, &allocation);
9141 adj->page_increment = 0.9 * allocation.height;
9142 adj->page_size = allocation.height;
9144 g_signal_emit_by_name (adj, "changed");
9148 scroll_test_adjustment_changed (GtkAdjustment *adj, GtkWidget *widget)
9153 dy = scroll_test_pos - (int)adj->value;
9154 scroll_test_pos = adj->value;
9156 if (!gtk_widget_is_drawable (widget))
9159 window = gtk_widget_get_window (widget);
9160 gdk_window_scroll (window, 0, dy);
9161 gdk_window_process_updates (window, FALSE);
9166 create_scroll_test (GtkWidget *widget)
9168 static GtkWidget *window = NULL;
9169 GtkWidget *action_area, *content_area;
9171 GtkWidget *drawing_area;
9172 GtkWidget *scrollbar;
9175 GdkGeometry geometry;
9176 GdkWindowHints geometry_mask;
9180 window = gtk_dialog_new ();
9182 gtk_window_set_screen (GTK_WINDOW (window),
9183 gtk_widget_get_screen (widget));
9185 g_signal_connect (window, "destroy",
9186 G_CALLBACK (gtk_widget_destroyed),
9189 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9190 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9192 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
9193 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9195 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
9196 gtk_box_pack_start (GTK_BOX (content_area), hbox, TRUE, TRUE, 0);
9197 gtk_widget_show (hbox);
9199 drawing_area = gtk_drawing_area_new ();
9200 gtk_widget_set_size_request (drawing_area, 200, 200);
9201 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
9202 gtk_widget_show (drawing_area);
9204 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
9206 adj = gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0);
9207 scroll_test_pos = 0.0;
9209 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, adj);
9210 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
9211 gtk_widget_show (scrollbar);
9213 g_signal_connect (drawing_area, "draw",
9214 G_CALLBACK (scroll_test_draw), adj);
9215 g_signal_connect (drawing_area, "configure_event",
9216 G_CALLBACK (scroll_test_configure), adj);
9217 g_signal_connect (drawing_area, "scroll_event",
9218 G_CALLBACK (scroll_test_scroll), adj);
9220 g_signal_connect (adj, "value_changed",
9221 G_CALLBACK (scroll_test_adjustment_changed),
9224 /* .. And create some buttons */
9226 button = gtk_button_new_with_label ("Quit");
9227 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9229 g_signal_connect_swapped (button, "clicked",
9230 G_CALLBACK (gtk_widget_destroy),
9232 gtk_widget_show (button);
9234 /* Set up gridded geometry */
9236 geometry_mask = GDK_HINT_MIN_SIZE |
9237 GDK_HINT_BASE_SIZE |
9238 GDK_HINT_RESIZE_INC;
9240 geometry.min_width = 20;
9241 geometry.min_height = 20;
9242 geometry.base_width = 0;
9243 geometry.base_height = 0;
9244 geometry.width_inc = 10;
9245 geometry.height_inc = 10;
9247 gtk_window_set_geometry_hints (GTK_WINDOW (window),
9248 drawing_area, &geometry, geometry_mask);
9251 if (!gtk_widget_get_visible (window))
9252 gtk_widget_show (window);
9254 gtk_widget_destroy (window);
9261 static int timer = 0;
9264 timeout_test (GtkWidget *label)
9266 static int count = 0;
9267 static char buffer[32];
9269 sprintf (buffer, "count: %d", ++count);
9270 gtk_label_set_text (GTK_LABEL (label), buffer);
9276 start_timeout_test (GtkWidget *widget,
9281 timer = g_timeout_add (100, (GSourceFunc)timeout_test, label);
9286 stop_timeout_test (GtkWidget *widget,
9291 g_source_remove (timer);
9297 destroy_timeout_test (GtkWidget *widget,
9300 stop_timeout_test (NULL, NULL);
9306 create_timeout_test (GtkWidget *widget)
9308 static GtkWidget *window = NULL;
9309 GtkWidget *action_area, *content_area;
9315 window = gtk_dialog_new ();
9317 gtk_window_set_screen (GTK_WINDOW (window),
9318 gtk_widget_get_screen (widget));
9320 g_signal_connect (window, "destroy",
9321 G_CALLBACK (destroy_timeout_test),
9324 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9325 action_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9327 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
9328 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9330 label = gtk_label_new ("count: 0");
9331 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
9332 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9333 gtk_widget_show (label);
9335 button = gtk_button_new_with_label ("close");
9336 g_signal_connect_swapped (button, "clicked",
9337 G_CALLBACK (gtk_widget_destroy),
9339 gtk_widget_set_can_default (button, TRUE);
9340 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9341 gtk_widget_grab_default (button);
9342 gtk_widget_show (button);
9344 button = gtk_button_new_with_label ("start");
9345 g_signal_connect (button, "clicked",
9346 G_CALLBACK(start_timeout_test),
9348 gtk_widget_set_can_default (button, TRUE);
9349 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9350 gtk_widget_show (button);
9352 button = gtk_button_new_with_label ("stop");
9353 g_signal_connect (button, "clicked",
9354 G_CALLBACK (stop_timeout_test),
9356 gtk_widget_set_can_default (button, TRUE);
9357 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9358 gtk_widget_show (button);
9361 if (!gtk_widget_get_visible (window))
9362 gtk_widget_show (window);
9364 gtk_widget_destroy (window);
9371 static int idle_id = 0;
9374 idle_test (GtkWidget *label)
9376 static int count = 0;
9377 static char buffer[32];
9379 sprintf (buffer, "count: %d", ++count);
9380 gtk_label_set_text (GTK_LABEL (label), buffer);
9386 start_idle_test (GtkWidget *widget,
9391 idle_id = g_idle_add ((GSourceFunc) idle_test, label);
9396 stop_idle_test (GtkWidget *widget,
9401 g_source_remove (idle_id);
9407 destroy_idle_test (GtkWidget *widget,
9410 stop_idle_test (NULL, NULL);
9416 toggle_idle_container (GObject *button,
9417 GtkContainer *container)
9419 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
9423 create_idle_test (GtkWidget *widget)
9425 static GtkWidget *window = NULL;
9428 GtkWidget *container;
9432 GtkWidget *action_area, *content_area;
9437 window = gtk_dialog_new ();
9439 gtk_window_set_screen (GTK_WINDOW (window),
9440 gtk_widget_get_screen (widget));
9442 g_signal_connect (window, "destroy",
9443 G_CALLBACK (destroy_idle_test),
9446 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9447 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9449 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
9450 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9452 label = gtk_label_new ("count: 0");
9453 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
9454 gtk_widget_show (label);
9457 g_object_new (GTK_TYPE_HBOX,
9459 /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
9460 * "GtkWidget::visible", TRUE,
9465 gtk_box_pack_start (GTK_BOX (content_area), container, TRUE, TRUE, 0);
9468 g_object_new (GTK_TYPE_FRAME,
9470 "label", "Label Container",
9472 "parent", content_area,
9475 g_object_new (GTK_TYPE_VBOX,
9480 g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
9481 "label", "Resize-Parent",
9482 "user_data", (void*)GTK_RESIZE_PARENT,
9486 "signal::clicked", toggle_idle_container, container,
9488 button = g_object_new (GTK_TYPE_RADIO_BUTTON,
9489 "label", "Resize-Queue",
9490 "user_data", (void*)GTK_RESIZE_QUEUE,
9495 g_object_connect (button,
9496 "signal::clicked", toggle_idle_container, container,
9498 button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
9499 "label", "Resize-Immediate",
9500 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
9502 g_object_connect (button2,
9503 "signal::clicked", toggle_idle_container, container,
9505 g_object_set (button2,
9511 button = gtk_button_new_with_label ("close");
9512 g_signal_connect_swapped (button, "clicked",
9513 G_CALLBACK (gtk_widget_destroy),
9515 gtk_widget_set_can_default (button, TRUE);
9516 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9517 gtk_widget_grab_default (button);
9518 gtk_widget_show (button);
9520 button = gtk_button_new_with_label ("start");
9521 g_signal_connect (button, "clicked",
9522 G_CALLBACK (start_idle_test),
9524 gtk_widget_set_can_default (button, TRUE);
9525 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9526 gtk_widget_show (button);
9528 button = gtk_button_new_with_label ("stop");
9529 g_signal_connect (button, "clicked",
9530 G_CALLBACK (stop_idle_test),
9532 gtk_widget_set_can_default (button, TRUE);
9533 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9534 gtk_widget_show (button);
9537 if (!gtk_widget_get_visible (window))
9538 gtk_widget_show (window);
9540 gtk_widget_destroy (window);
9548 reload_all_rc_files (void)
9550 static GdkAtom atom_rcfiles = GDK_NONE;
9552 GdkEvent *send_event = gdk_event_new (GDK_CLIENT_EVENT);
9556 atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
9558 for(i = 0; i < 5; i++)
9559 send_event->client.data.l[i] = 0;
9560 send_event->client.data_format = 32;
9561 send_event->client.message_type = atom_rcfiles;
9562 gdk_event_send_clientmessage_toall (send_event);
9564 gdk_event_free (send_event);
9568 create_rc_file (GtkWidget *widget)
9570 static GtkWidget *window = NULL;
9571 GtkWidget *action_area, *content_area;
9579 window = gtk_dialog_new ();
9581 gtk_window_set_screen (GTK_WINDOW (window),
9582 gtk_widget_get_screen (widget));
9584 g_signal_connect (window, "destroy",
9585 G_CALLBACK (gtk_widget_destroyed),
9588 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9589 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9591 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
9592 gtk_box_pack_start (GTK_BOX (content_area), frame, FALSE, FALSE, 0);
9594 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
9595 gtk_container_add (GTK_CONTAINER (frame), vbox);
9597 label = gtk_label_new ("This label should be red");
9598 gtk_widget_set_name (label, "testgtk-red-label");
9599 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9601 label = gtk_label_new ("This label should be green");
9602 gtk_widget_set_name (label, "testgtk-green-label");
9603 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9605 label = gtk_label_new ("This label should be blue");
9606 gtk_widget_set_name (label, "testgtk-blue-label");
9607 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9609 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
9610 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9612 button = gtk_button_new_with_label ("Reload");
9613 g_signal_connect (button, "clicked",
9614 G_CALLBACK (gtk_rc_reparse_all), NULL);
9615 gtk_widget_set_can_default (button, TRUE);
9616 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9617 gtk_widget_grab_default (button);
9619 button = gtk_button_new_with_label ("Reload All");
9620 g_signal_connect (button, "clicked",
9621 G_CALLBACK (reload_all_rc_files), NULL);
9622 gtk_widget_set_can_default (button, TRUE);
9623 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9625 button = gtk_button_new_with_label ("Close");
9626 g_signal_connect_swapped (button, "clicked",
9627 G_CALLBACK (gtk_widget_destroy),
9629 gtk_widget_set_can_default (button, TRUE);
9630 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9633 if (!gtk_widget_get_visible (window))
9634 gtk_widget_show_all (window);
9636 gtk_widget_destroy (window);
9640 * Test of recursive mainloop
9644 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
9651 create_mainloop (GtkWidget *widget)
9653 static GtkWidget *window = NULL;
9654 GtkWidget *action_area, *content_area;
9660 window = gtk_dialog_new ();
9662 gtk_window_set_screen (GTK_WINDOW (window),
9663 gtk_widget_get_screen (widget));
9665 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
9667 g_signal_connect (window, "destroy",
9668 G_CALLBACK (mainloop_destroyed),
9671 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9672 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9674 label = gtk_label_new ("In recursive main loop...");
9675 gtk_misc_set_padding (GTK_MISC(label), 20, 20);
9677 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9678 gtk_widget_show (label);
9680 button = gtk_button_new_with_label ("Leave");
9681 gtk_box_pack_start (GTK_BOX (action_area), button, FALSE, TRUE, 0);
9683 g_signal_connect_swapped (button, "clicked",
9684 G_CALLBACK (gtk_widget_destroy),
9687 gtk_widget_set_can_default (button, TRUE);
9688 gtk_widget_grab_default (button);
9690 gtk_widget_show (button);
9693 if (!gtk_widget_get_visible (window))
9695 gtk_widget_show (window);
9697 g_print ("create_mainloop: start\n");
9699 g_print ("create_mainloop: done\n");
9702 gtk_widget_destroy (window);
9706 layout_draw_handler (GtkWidget *widget, cairo_t *cr)
9709 GdkWindow *bin_window;
9712 gint imin, imax, jmin, jmax;
9714 layout = GTK_LAYOUT (widget);
9715 bin_window = gtk_layout_get_bin_window (layout);
9717 if (!gtk_cairo_should_draw_window (cr, bin_window))
9720 gdk_window_get_position (bin_window, &x, &y);
9721 cairo_translate (cr, x, y);
9723 gdk_cairo_get_clip_rectangle (cr, &clip);
9725 imin = (clip.x) / 10;
9726 imax = (clip.x + clip.width + 9) / 10;
9728 jmin = (clip.y) / 10;
9729 jmax = (clip.y + clip.height + 9) / 10;
9731 for (i=imin; i<imax; i++)
9732 for (j=jmin; j<jmax; j++)
9734 cairo_rectangle (cr,
9743 void create_layout (GtkWidget *widget)
9745 GtkAdjustment *hadjustment, *vadjustment;
9747 static GtkWidget *window = NULL;
9748 GtkWidget *layout_widget;
9749 GtkWidget *scrolledwindow;
9758 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9759 gtk_window_set_screen (GTK_WINDOW (window),
9760 gtk_widget_get_screen (widget));
9762 g_signal_connect (window, "destroy",
9763 G_CALLBACK (gtk_widget_destroyed),
9766 gtk_window_set_title (GTK_WINDOW (window), "Layout");
9767 gtk_widget_set_size_request (window, 200, 200);
9769 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
9770 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
9772 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
9773 GTK_CORNER_TOP_RIGHT);
9775 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
9777 layout_widget = gtk_layout_new (NULL, NULL);
9778 layout = GTK_LAYOUT (layout_widget);
9779 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout_widget);
9781 /* We set step sizes here since GtkLayout does not set
9784 hadjustment = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (layout));
9785 vadjustment = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (layout));
9786 gtk_adjustment_set_step_increment (hadjustment, 10.0);
9787 gtk_adjustment_set_step_increment (vadjustment, 10.0);
9788 gtk_scrollable_set_hadjustment (GTK_SCROLLABLE (layout), hadjustment);
9789 gtk_scrollable_set_vadjustment (GTK_SCROLLABLE (layout), vadjustment);
9791 gtk_widget_set_events (layout_widget, GDK_EXPOSURE_MASK);
9792 g_signal_connect (layout, "draw",
9793 G_CALLBACK (layout_draw_handler), NULL);
9795 gtk_layout_set_size (layout, 1600, 128000);
9797 for (i=0 ; i < 16 ; i++)
9798 for (j=0 ; j < 16 ; j++)
9800 sprintf(buf, "Button %d, %d", i, j);
9802 button = gtk_button_new_with_label (buf);
9804 button = gtk_label_new (buf);
9806 gtk_layout_put (layout, button, j*100, i*100);
9809 for (i=16; i < 1280; i++)
9811 sprintf(buf, "Button %d, %d", i, 0);
9813 button = gtk_button_new_with_label (buf);
9815 button = gtk_label_new (buf);
9817 gtk_layout_put (layout, button, 0, i*100);
9821 if (!gtk_widget_get_visible (window))
9822 gtk_widget_show_all (window);
9824 gtk_widget_destroy (window);
9828 create_styles (GtkWidget *widget)
9830 static GtkWidget *window = NULL;
9831 GtkWidget *content_area, *action_area;
9836 static GdkColor red = { 0, 0xffff, 0, 0 };
9837 static GdkColor green = { 0, 0, 0xffff, 0 };
9838 static GdkColor blue = { 0, 0, 0, 0xffff };
9839 static GdkColor yellow = { 0, 0xffff, 0xffff, 0 };
9840 static GdkColor cyan = { 0, 0 , 0xffff, 0xffff };
9841 PangoFontDescription *font_desc;
9843 GtkRcStyle *rc_style;
9847 window = gtk_dialog_new ();
9848 gtk_window_set_screen (GTK_WINDOW (window),
9849 gtk_widget_get_screen (widget));
9851 g_signal_connect (window, "destroy",
9852 G_CALLBACK (gtk_widget_destroyed),
9855 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9856 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9858 button = gtk_button_new_with_label ("Close");
9859 g_signal_connect_swapped (button, "clicked",
9860 G_CALLBACK (gtk_widget_destroy),
9862 gtk_widget_set_can_default (button, TRUE);
9863 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9864 gtk_widget_show (button);
9866 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 5);
9867 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9868 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, FALSE, 0);
9870 label = gtk_label_new ("Font:");
9871 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9872 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9874 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
9876 button = gtk_button_new_with_label ("Some Text");
9877 gtk_widget_modify_font (gtk_bin_get_child (GTK_BIN (button)),
9879 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9881 label = gtk_label_new ("Foreground:");
9882 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9883 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9885 button = gtk_button_new_with_label ("Some Text");
9886 gtk_widget_modify_fg (gtk_bin_get_child (GTK_BIN (button)),
9887 GTK_STATE_NORMAL, &red);
9888 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9890 label = gtk_label_new ("Background:");
9891 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9892 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9894 button = gtk_button_new_with_label ("Some Text");
9895 gtk_widget_modify_bg (button, GTK_STATE_NORMAL, &green);
9896 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9898 label = gtk_label_new ("Text:");
9899 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9900 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9902 entry = gtk_entry_new ();
9903 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9904 gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &blue);
9905 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9907 label = gtk_label_new ("Base:");
9908 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9909 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9911 entry = gtk_entry_new ();
9912 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9913 gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &yellow);
9914 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9916 label = gtk_label_new ("Cursor:");
9917 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9918 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9920 entry = gtk_entry_new ();
9921 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9922 gtk_widget_modify_cursor (entry, &red, &red);
9923 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9925 label = gtk_label_new ("Multiple:");
9926 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9927 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9929 button = gtk_button_new_with_label ("Some Text");
9931 rc_style = gtk_rc_style_new ();
9933 rc_style->font_desc = pango_font_description_copy (font_desc);
9934 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
9935 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
9936 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
9937 rc_style->fg[GTK_STATE_NORMAL] = yellow;
9938 rc_style->bg[GTK_STATE_NORMAL] = blue;
9939 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
9940 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
9941 rc_style->fg[GTK_STATE_ACTIVE] = red;
9942 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
9943 rc_style->xthickness = 5;
9944 rc_style->ythickness = 5;
9946 gtk_widget_modify_style (button, rc_style);
9947 gtk_widget_modify_style (gtk_bin_get_child (GTK_BIN (button)), rc_style);
9949 g_object_unref (rc_style);
9951 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9954 if (!gtk_widget_get_visible (window))
9955 gtk_widget_show_all (window);
9957 gtk_widget_destroy (window);
9961 * Main Window and Exit
9965 do_exit (GtkWidget *widget, GtkWidget *window)
9967 gtk_widget_destroy (window);
9973 void (*func) (GtkWidget *widget);
9974 gboolean do_not_benchmark;
9977 { "alpha window", create_alpha_window },
9978 { "big windows", create_big_windows },
9979 { "button box", create_button_box },
9980 { "buttons", create_buttons },
9981 { "check buttons", create_check_buttons },
9982 { "color selection", create_color_selection },
9983 { "composited window", create_composited_window },
9984 { "cursors", create_cursors },
9985 { "dialog", create_dialog },
9986 { "display & screen", create_display_screen, TRUE },
9987 { "entry", create_entry },
9988 { "event box", create_event_box },
9989 { "event watcher", create_event_watcher },
9990 { "expander", create_expander },
9991 { "flipping", create_flipping },
9992 { "focus", create_focus },
9993 { "font selection", create_font_selection },
9994 { "handle box", create_handle_box },
9995 { "image", create_image },
9996 { "key lookup", create_key_lookup },
9997 { "labels", create_labels },
9998 { "layout", create_layout },
9999 { "menus", create_menus },
10000 { "message dialog", create_message_dialog },
10001 { "modal window", create_modal_window, TRUE },
10002 { "notebook", create_notebook },
10003 { "panes", create_panes },
10004 { "paned keyboard", create_paned_keyboard_navigation },
10005 { "pixbuf", create_pixbuf },
10006 { "progress bar", create_progress_bar },
10007 { "properties", create_properties },
10008 { "radio buttons", create_radio_buttons },
10009 { "range controls", create_range_controls },
10010 { "rc file", create_rc_file },
10011 { "reparent", create_reparent },
10012 { "resize grips", create_resize_grips },
10013 { "rotated label", create_rotated_label },
10014 { "rotated text", create_rotated_text },
10015 { "rulers", create_rulers },
10016 { "saved position", create_saved_position },
10017 { "scrolled windows", create_scrolled_windows },
10018 { "shapes", create_shapes },
10019 { "size groups", create_size_groups },
10020 { "snapshot", create_snapshot },
10021 { "spinbutton", create_spins },
10022 { "statusbar", create_statusbar },
10023 { "styles", create_styles },
10024 { "test idle", create_idle_test },
10025 { "test mainloop", create_mainloop, TRUE },
10026 { "test scrolling", create_scroll_test },
10027 { "test selection", create_selection_test },
10028 { "test timeout", create_timeout_test },
10029 { "toggle buttons", create_toggle_buttons },
10030 { "toolbar", create_toolbar },
10031 { "tooltips", create_tooltips },
10032 { "WM hints", create_wmhints },
10033 { "window sizing", create_window_sizing },
10034 { "window states", create_window_states }
10036 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
10039 create_main_window (void)
10044 GtkWidget *scrolled_window;
10048 GtkWidget *separator;
10049 GdkGeometry geometry;
10052 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10053 gtk_widget_set_name (window, "main window");
10054 gtk_window_move (GTK_WINDOW (window), 50, 20);
10055 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
10057 geometry.min_width = -1;
10058 geometry.min_height = -1;
10059 geometry.max_width = -1;
10060 geometry.max_height = G_MAXSHORT;
10061 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
10063 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
10065 g_signal_connect (window, "destroy",
10066 G_CALLBACK (gtk_main_quit),
10068 g_signal_connect (window, "delete-event",
10069 G_CALLBACK (gtk_false),
10072 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
10073 gtk_container_add (GTK_CONTAINER (window), box1);
10075 if (gtk_micro_version > 0)
10078 gtk_get_major_version (),
10079 gtk_get_minor_version (),
10080 gtk_get_micro_version ());
10084 gtk_get_major_version (),
10085 gtk_get_minor_version ());
10087 label = gtk_label_new (buffer);
10088 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
10089 gtk_widget_set_name (label, "testgtk-version-label");
10091 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
10092 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
10093 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
10095 GTK_POLICY_AUTOMATIC);
10096 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
10098 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
10099 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10100 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
10101 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
10102 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
10103 gtk_widget_show (box2);
10105 for (i = 0; i < nbuttons; i++)
10107 button = gtk_button_new_with_label (buttons[i].label);
10108 if (buttons[i].func)
10109 g_signal_connect (button,
10111 G_CALLBACK(buttons[i].func),
10114 gtk_widget_set_sensitive (button, FALSE);
10115 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10118 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
10119 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
10121 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 10);
10122 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10123 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
10125 button = gtk_button_new_with_mnemonic ("_Close");
10126 g_signal_connect (button, "clicked",
10127 G_CALLBACK (do_exit),
10129 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10130 gtk_widget_set_can_default (button, TRUE);
10131 gtk_widget_grab_default (button);
10133 gtk_widget_show_all (window);
10139 if (g_file_test ("../gdk-pixbuf/libpixbufloader-pnm.la",
10140 G_FILE_TEST_EXISTS))
10142 g_setenv ("GDK_PIXBUF_MODULE_FILE", "../gdk-pixbuf/loaders.cache", TRUE);
10143 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/immodules.cache", TRUE);
10148 pad (const char *str, int to)
10150 static char buf[256];
10151 int len = strlen (str);
10154 for (i = 0; i < to; i++)
10159 memcpy (buf, str, len);
10165 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
10167 fn (widget); /* on */
10168 while (g_main_context_iteration (NULL, FALSE));
10169 fn (widget); /* off */
10170 while (g_main_context_iteration (NULL, FALSE));
10174 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
10180 static gboolean printed_headers = FALSE;
10182 if (!printed_headers) {
10183 g_print ("Test Iters First Other\n");
10184 g_print ("-------------------- ----- ---------- ----------\n");
10185 printed_headers = TRUE;
10188 g_get_current_time (&tv0);
10189 bench_iteration (widget, fn);
10190 g_get_current_time (&tv1);
10192 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10193 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10195 g_get_current_time (&tv0);
10196 for (n = 0; n < num - 1; n++)
10197 bench_iteration (widget, fn);
10198 g_get_current_time (&tv1);
10199 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10200 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10202 g_print ("%s %5d ", pad (name, 20), num);
10204 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
10206 g_print ("%10.1f\n", dt_first);
10210 do_bench (char* what, int num)
10214 void (* fn) (GtkWidget *widget);
10216 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10218 if (g_ascii_strcasecmp (what, "ALL") == 0)
10220 for (i = 0; i < nbuttons; i++)
10222 if (!buttons[i].do_not_benchmark)
10223 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
10230 for (i = 0; i < nbuttons; i++)
10232 if (strcmp (buttons[i].label, what) == 0)
10234 fn = buttons[i].func;
10240 g_print ("Can't bench: \"%s\" not found.\n", what);
10242 do_real_bench (widget, fn, buttons[i].label, num);
10249 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
10254 main (int argc, char *argv[])
10256 GtkBindingSet *binding_set;
10258 gboolean done_benchmarks = FALSE;
10260 srand (time (NULL));
10264 /* Check to see if we are being run from the correct
10267 if (file_exists ("testgtkrc"))
10268 gtk_rc_add_default_file ("testgtkrc");
10269 else if (file_exists ("tests/testgtkrc"))
10270 gtk_rc_add_default_file ("tests/testgtkrc");
10272 g_warning ("Couldn't find file \"testgtkrc\".");
10274 g_set_application_name ("GTK+ Test Program");
10276 gtk_init (&argc, &argv);
10278 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
10287 for (i = 1; i < argc; i++)
10289 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
10296 nextarg = strchr (argv[i], '=');
10307 count = strchr (nextarg, ':');
10310 what = g_strndup (nextarg, count - nextarg);
10312 num = atoi (count);
10317 what = g_strdup (nextarg);
10319 do_bench (what, num ? num : 1);
10320 done_benchmarks = TRUE;
10325 if (done_benchmarks)
10330 binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
10331 gtk_binding_entry_add_signal (binding_set,
10332 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
10335 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
10337 /* We use gtk_rc_parse_string() here so we can make sure it works across theme
10341 gtk_rc_parse_string ("style \"testgtk-version-label\" { "
10342 " fg[NORMAL] = \"#ff0000\"\n"
10343 " font = \"Sans 18\"\n"
10345 "widget \"*.testgtk-version-label\" style \"testgtk-version-label\"");
10347 create_main_window ();
10353 while (g_main_context_pending (NULL))
10354 g_main_context_iteration (NULL, FALSE);
10357 while (g_main_context_pending (NULL))
10358 g_main_context_iteration (NULL, FALSE);