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_new_text ();
113 g_signal_connect (omenu, "changed",
114 G_CALLBACK (func), data);
116 for (i = 0; i < num_items; i++)
117 gtk_combo_box_append_text (GTK_COMBO_BOX (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_hbox_new (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_window_set_visual (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_vbox_new (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_expose (GtkWidget *widget,
459 GdkEventExpose *event,
463 GdkWindow *window = event->window;
465 color = g_object_get_data (G_OBJECT (window), "pattern-color");
468 cairo_t *cr = gdk_cairo_create (window);
470 gdk_cairo_set_source_color (cr, color);
471 gdk_cairo_rectangle (cr, &event->area);
481 pattern_set_bg (GtkWidget *widget,
485 static const GdkColor colors[] = {
486 { 0, 0x4444, 0x4444, 0xffff },
487 { 0, 0x8888, 0x8888, 0xffff },
488 { 0, 0xaaaa, 0xaaaa, 0xffff }
491 g_object_set_data (G_OBJECT (child), "pattern-color", (gpointer) &colors[level]);
492 gdk_window_set_user_data (child, widget);
496 create_pattern (GtkWidget *widget,
507 while (2 * h <= height)
512 while (2 * w <= width)
514 if ((i + j) % 2 == 0)
519 GdkWindowAttr attributes;
521 attributes.window_type = GDK_WINDOW_CHILD;
524 attributes.width = w;
525 attributes.height = h;
526 attributes.wclass = GDK_INPUT_OUTPUT;
527 attributes.event_mask = GDK_EXPOSURE_MASK;
528 attributes.visual = gtk_widget_get_visual (widget);
530 child = gdk_window_new (parent, &attributes,
531 GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL);
533 pattern_set_bg (widget, child, level);
536 create_pattern (widget, child, level + 1, w, h);
538 gdk_window_show (child);
548 #define PATTERN_SIZE (1 << 18)
551 pattern_hadj_changed (GtkAdjustment *adj,
554 gint *old_value = g_object_get_data (G_OBJECT (adj), "old-value");
555 gint new_value = adj->value;
557 if (gtk_widget_get_realized (darea))
559 gdk_window_scroll (gtk_widget_get_window (darea),
560 *old_value - new_value, 0);
561 *old_value = new_value;
566 pattern_vadj_changed (GtkAdjustment *adj,
569 gint *old_value = g_object_get_data (G_OBJECT (adj), "old-value");
570 gint new_value = adj->value;
572 if (gtk_widget_get_realized (darea))
574 gdk_window_scroll (gtk_widget_get_window (darea),
575 0, *old_value - new_value);
576 *old_value = new_value;
581 pattern_realize (GtkWidget *widget,
586 window = gtk_widget_get_window (widget);
587 pattern_set_bg (widget, window, 0);
588 create_pattern (widget, window, 1, PATTERN_SIZE, PATTERN_SIZE);
592 create_big_windows (GtkWidget *widget)
594 static GtkWidget *window = NULL;
595 GtkWidget *content_area;
596 GtkWidget *darea, *table, *scrollbar;
600 static gint current_x;
601 static gint current_y;
608 window = gtk_dialog_new_with_buttons ("Big Windows",
614 gtk_window_set_screen (GTK_WINDOW (window),
615 gtk_widget_get_screen (widget));
617 gtk_window_set_default_size (GTK_WINDOW (window), 200, 300);
619 g_signal_connect (window, "destroy",
620 G_CALLBACK (gtk_widget_destroyed),
623 g_signal_connect (window, "response",
624 G_CALLBACK (gtk_widget_destroy),
627 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
629 table = gtk_table_new (2, 2, FALSE);
630 gtk_box_pack_start (GTK_BOX (content_area), table, TRUE, TRUE, 0);
632 darea = gtk_drawing_area_new ();
634 hadj = (GtkAdjustment *)gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
635 g_signal_connect (hadj, "value_changed",
636 G_CALLBACK (pattern_hadj_changed), darea);
637 g_object_set_data (G_OBJECT (hadj), "old-value", ¤t_x);
639 vadj = (GtkAdjustment *)gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
640 g_signal_connect (vadj, "value_changed",
641 G_CALLBACK (pattern_vadj_changed), darea);
642 g_object_set_data (G_OBJECT (vadj), "old-value", ¤t_y);
644 g_signal_connect (darea, "realize",
645 G_CALLBACK (pattern_realize),
647 g_signal_connect (darea, "expose_event",
648 G_CALLBACK (pattern_expose),
651 eventbox = gtk_event_box_new ();
652 gtk_table_attach (GTK_TABLE (table), eventbox,
654 GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND,
657 gtk_container_add (GTK_CONTAINER (eventbox), darea);
659 scrollbar = gtk_hscrollbar_new (hadj);
660 gtk_table_attach (GTK_TABLE (table), scrollbar,
662 GTK_FILL | GTK_EXPAND, GTK_FILL,
665 scrollbar = gtk_vscrollbar_new (vadj);
666 gtk_table_attach (GTK_TABLE (table), scrollbar,
668 GTK_FILL, GTK_EXPAND | GTK_FILL,
673 if (!gtk_widget_get_visible (window))
674 gtk_widget_show_all (window);
676 gtk_widget_hide (window);
684 button_window (GtkWidget *widget,
687 if (!gtk_widget_get_visible (button))
688 gtk_widget_show (button);
690 gtk_widget_hide (button);
694 create_buttons (GtkWidget *widget)
696 static GtkWidget *window = NULL;
700 GtkWidget *button[10];
701 GtkWidget *separator;
705 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
706 gtk_window_set_screen (GTK_WINDOW (window),
707 gtk_widget_get_screen (widget));
709 g_signal_connect (window, "destroy",
710 G_CALLBACK (gtk_widget_destroyed),
713 gtk_window_set_title (GTK_WINDOW (window), "GtkButton");
714 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
716 box1 = gtk_vbox_new (FALSE, 0);
717 gtk_container_add (GTK_CONTAINER (window), box1);
719 table = gtk_table_new (3, 3, FALSE);
720 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
721 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
722 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
723 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
725 button[0] = gtk_button_new_with_label ("button1");
726 button[1] = gtk_button_new_with_mnemonic ("_button2");
727 button[2] = gtk_button_new_with_mnemonic ("_button3");
728 button[3] = gtk_button_new_from_stock (GTK_STOCK_OK);
729 button[4] = gtk_button_new_with_label ("button5");
730 button[5] = gtk_button_new_with_label ("button6");
731 button[6] = gtk_button_new_with_label ("button7");
732 button[7] = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
733 button[8] = gtk_button_new_with_label ("button9");
735 g_signal_connect (button[0], "clicked",
736 G_CALLBACK (button_window),
739 gtk_table_attach (GTK_TABLE (table), button[0], 0, 1, 0, 1,
740 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
742 g_signal_connect (button[1], "clicked",
743 G_CALLBACK (button_window),
746 gtk_table_attach (GTK_TABLE (table), button[1], 1, 2, 1, 2,
747 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
749 g_signal_connect (button[2], "clicked",
750 G_CALLBACK (button_window),
752 gtk_table_attach (GTK_TABLE (table), button[2], 2, 3, 2, 3,
753 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
755 g_signal_connect (button[3], "clicked",
756 G_CALLBACK (button_window),
758 gtk_table_attach (GTK_TABLE (table), button[3], 0, 1, 2, 3,
759 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
761 g_signal_connect (button[4], "clicked",
762 G_CALLBACK (button_window),
764 gtk_table_attach (GTK_TABLE (table), button[4], 2, 3, 0, 1,
765 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
767 g_signal_connect (button[5], "clicked",
768 G_CALLBACK (button_window),
770 gtk_table_attach (GTK_TABLE (table), button[5], 1, 2, 2, 3,
771 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
773 g_signal_connect (button[6], "clicked",
774 G_CALLBACK (button_window),
776 gtk_table_attach (GTK_TABLE (table), button[6], 1, 2, 0, 1,
777 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
779 g_signal_connect (button[7], "clicked",
780 G_CALLBACK (button_window),
782 gtk_table_attach (GTK_TABLE (table), button[7], 2, 3, 1, 2,
783 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
785 g_signal_connect (button[8], "clicked",
786 G_CALLBACK (button_window),
788 gtk_table_attach (GTK_TABLE (table), button[8], 0, 1, 1, 2,
789 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
791 separator = gtk_hseparator_new ();
792 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
794 box2 = gtk_vbox_new (FALSE, 10);
795 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
796 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
798 button[9] = gtk_button_new_with_label ("close");
799 g_signal_connect_swapped (button[9], "clicked",
800 G_CALLBACK (gtk_widget_destroy),
802 gtk_box_pack_start (GTK_BOX (box2), button[9], TRUE, TRUE, 0);
803 gtk_widget_set_can_default (button[9], TRUE);
804 gtk_widget_grab_default (button[9]);
807 if (!gtk_widget_get_visible (window))
808 gtk_widget_show_all (window);
810 gtk_widget_destroy (window);
818 create_toggle_buttons (GtkWidget *widget)
820 static GtkWidget *window = NULL;
824 GtkWidget *separator;
828 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
829 gtk_window_set_screen (GTK_WINDOW (window),
830 gtk_widget_get_screen (widget));
832 g_signal_connect (window, "destroy",
833 G_CALLBACK (gtk_widget_destroyed),
836 gtk_window_set_title (GTK_WINDOW (window), "GtkToggleButton");
837 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
839 box1 = gtk_vbox_new (FALSE, 0);
840 gtk_container_add (GTK_CONTAINER (window), box1);
842 box2 = gtk_vbox_new (FALSE, 10);
843 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
844 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
846 button = gtk_toggle_button_new_with_label ("button1");
847 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
849 button = gtk_toggle_button_new_with_label ("button2");
850 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
852 button = gtk_toggle_button_new_with_label ("button3");
853 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
855 button = gtk_toggle_button_new_with_label ("inconsistent");
856 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
857 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
859 separator = gtk_hseparator_new ();
860 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
862 box2 = gtk_vbox_new (FALSE, 10);
863 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
864 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
866 button = gtk_button_new_with_label ("close");
867 g_signal_connect_swapped (button, "clicked",
868 G_CALLBACK (gtk_widget_destroy),
870 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
871 gtk_widget_set_can_default (button, TRUE);
872 gtk_widget_grab_default (button);
875 if (!gtk_widget_get_visible (window))
876 gtk_widget_show_all (window);
878 gtk_widget_destroy (window);
882 create_widget_grid (GType widget_type)
885 GtkWidget *group_widget = NULL;
888 table = gtk_table_new (FALSE, 3, 3);
890 for (i = 0; i < 5; i++)
892 for (j = 0; j < 5; j++)
897 if (i == 0 && j == 0)
903 tmp = g_strdup_printf ("%d", j);
904 widget = gtk_label_new (tmp);
909 tmp = g_strdup_printf ("%c", 'A' + i - 1);
910 widget = gtk_label_new (tmp);
915 widget = g_object_new (widget_type, NULL);
917 if (g_type_is_a (widget_type, GTK_TYPE_RADIO_BUTTON))
920 group_widget = widget;
922 g_object_set (widget, "group", group_widget, NULL);
927 gtk_table_attach (GTK_TABLE (table), widget,
942 create_check_buttons (GtkWidget *widget)
944 static GtkWidget *window = NULL;
948 GtkWidget *separator;
953 window = gtk_dialog_new_with_buttons ("Check Buttons",
959 gtk_window_set_screen (GTK_WINDOW (window),
960 gtk_widget_get_screen (widget));
962 g_signal_connect (window, "destroy",
963 G_CALLBACK (gtk_widget_destroyed),
965 g_signal_connect (window, "response",
966 G_CALLBACK (gtk_widget_destroy),
969 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
971 box2 = gtk_vbox_new (FALSE, 10);
972 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
973 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
975 button = gtk_check_button_new_with_mnemonic ("_button1");
976 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
978 button = gtk_check_button_new_with_label ("button2");
979 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
981 button = gtk_check_button_new_with_label ("button3");
982 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
984 button = gtk_check_button_new_with_label ("inconsistent");
985 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
986 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
988 separator = gtk_hseparator_new ();
989 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
991 table = create_widget_grid (GTK_TYPE_CHECK_BUTTON);
992 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
993 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
996 if (!gtk_widget_get_visible (window))
997 gtk_widget_show_all (window);
999 gtk_widget_destroy (window);
1007 create_radio_buttons (GtkWidget *widget)
1009 static GtkWidget *window = NULL;
1013 GtkWidget *separator;
1018 window = gtk_dialog_new_with_buttons ("Radio Buttons",
1024 gtk_window_set_screen (GTK_WINDOW (window),
1025 gtk_widget_get_screen (widget));
1027 g_signal_connect (window, "destroy",
1028 G_CALLBACK (gtk_widget_destroyed),
1030 g_signal_connect (window, "response",
1031 G_CALLBACK (gtk_widget_destroy),
1034 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
1036 box2 = gtk_vbox_new (FALSE, 10);
1037 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1038 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1040 button = gtk_radio_button_new_with_label (NULL, "button1");
1041 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1043 button = gtk_radio_button_new_with_label (
1044 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1046 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
1047 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1049 button = gtk_radio_button_new_with_label (
1050 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1052 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1054 button = gtk_radio_button_new_with_label (
1055 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1057 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
1058 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1060 separator = gtk_hseparator_new ();
1061 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1063 box2 = gtk_vbox_new (FALSE, 10);
1064 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1065 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1067 button = gtk_radio_button_new_with_label (NULL, "button4");
1068 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1069 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1071 button = gtk_radio_button_new_with_label (
1072 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1074 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
1075 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1076 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1078 button = gtk_radio_button_new_with_label (
1079 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1081 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1082 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1084 separator = gtk_hseparator_new ();
1085 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1087 table = create_widget_grid (GTK_TYPE_RADIO_BUTTON);
1088 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
1089 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
1092 if (!gtk_widget_get_visible (window))
1093 gtk_widget_show_all (window);
1095 gtk_widget_destroy (window);
1103 create_bbox (gint horizontal,
1114 frame = gtk_frame_new (title);
1117 bbox = gtk_hbutton_box_new ();
1119 bbox = gtk_vbutton_box_new ();
1121 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
1122 gtk_container_add (GTK_CONTAINER (frame), bbox);
1124 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), layout);
1125 gtk_box_set_spacing (GTK_BOX (bbox), spacing);
1127 button = gtk_button_new_with_label ("OK");
1128 gtk_container_add (GTK_CONTAINER (bbox), button);
1130 button = gtk_button_new_with_label ("Cancel");
1131 gtk_container_add (GTK_CONTAINER (bbox), button);
1133 button = gtk_button_new_with_label ("Help");
1134 gtk_container_add (GTK_CONTAINER (bbox), button);
1140 create_button_box (GtkWidget *widget)
1142 static GtkWidget* window = NULL;
1143 GtkWidget *main_vbox;
1146 GtkWidget *frame_horz;
1147 GtkWidget *frame_vert;
1151 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1152 gtk_window_set_screen (GTK_WINDOW (window), gtk_widget_get_screen (widget));
1153 gtk_window_set_title (GTK_WINDOW (window), "Button Boxes");
1155 g_signal_connect (window, "destroy",
1156 G_CALLBACK (gtk_widget_destroyed),
1159 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
1161 main_vbox = gtk_vbox_new (FALSE, 0);
1162 gtk_container_add (GTK_CONTAINER (window), main_vbox);
1164 frame_horz = gtk_frame_new ("Horizontal Button Boxes");
1165 gtk_box_pack_start (GTK_BOX (main_vbox), frame_horz, TRUE, TRUE, 10);
1167 vbox = gtk_vbox_new (FALSE, 0);
1168 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
1169 gtk_container_add (GTK_CONTAINER (frame_horz), vbox);
1171 gtk_box_pack_start (GTK_BOX (vbox),
1172 create_bbox (TRUE, "Spread", 40, 85, 20, GTK_BUTTONBOX_SPREAD),
1175 gtk_box_pack_start (GTK_BOX (vbox),
1176 create_bbox (TRUE, "Edge", 40, 85, 20, GTK_BUTTONBOX_EDGE),
1179 gtk_box_pack_start (GTK_BOX (vbox),
1180 create_bbox (TRUE, "Start", 40, 85, 20, GTK_BUTTONBOX_START),
1183 gtk_box_pack_start (GTK_BOX (vbox),
1184 create_bbox (TRUE, "End", 40, 85, 20, GTK_BUTTONBOX_END),
1187 gtk_box_pack_start (GTK_BOX (vbox),
1188 create_bbox (TRUE, "Center", 40, 85, 20, GTK_BUTTONBOX_CENTER),
1191 frame_vert = gtk_frame_new ("Vertical Button Boxes");
1192 gtk_box_pack_start (GTK_BOX (main_vbox), frame_vert, TRUE, TRUE, 10);
1194 hbox = gtk_hbox_new (FALSE, 0);
1195 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
1196 gtk_container_add (GTK_CONTAINER (frame_vert), hbox);
1198 gtk_box_pack_start (GTK_BOX (hbox),
1199 create_bbox (FALSE, "Spread", 30, 85, 20, GTK_BUTTONBOX_SPREAD),
1202 gtk_box_pack_start (GTK_BOX (hbox),
1203 create_bbox (FALSE, "Edge", 30, 85, 20, GTK_BUTTONBOX_EDGE),
1206 gtk_box_pack_start (GTK_BOX (hbox),
1207 create_bbox (FALSE, "Start", 30, 85, 20, GTK_BUTTONBOX_START),
1210 gtk_box_pack_start (GTK_BOX (hbox),
1211 create_bbox (FALSE, "End", 30, 85, 20, GTK_BUTTONBOX_END),
1214 gtk_box_pack_start (GTK_BOX (hbox),
1215 create_bbox (FALSE, "Center", 30, 85, 20, GTK_BUTTONBOX_CENTER),
1219 if (!gtk_widget_get_visible (window))
1220 gtk_widget_show_all (window);
1222 gtk_widget_destroy (window);
1230 new_pixbuf (char *filename,
1232 GdkColor *background)
1237 if (strcmp (filename, "test.xpm") == 0)
1240 pixbuf = gdk_pixbuf_new_from_file (filename, NULL);
1243 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
1245 widget = gtk_image_new_from_pixbuf (pixbuf);
1247 g_object_unref (pixbuf);
1254 set_toolbar_small_stock (GtkWidget *widget,
1257 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_SMALL_TOOLBAR);
1261 set_toolbar_large_stock (GtkWidget *widget,
1264 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_LARGE_TOOLBAR);
1268 set_toolbar_horizontal (GtkWidget *widget,
1271 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_HORIZONTAL);
1275 set_toolbar_vertical (GtkWidget *widget,
1278 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_VERTICAL);
1282 set_toolbar_icons (GtkWidget *widget,
1285 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_ICONS);
1289 set_toolbar_text (GtkWidget *widget,
1292 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_TEXT);
1296 set_toolbar_both (GtkWidget *widget,
1299 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH);
1303 set_toolbar_both_horiz (GtkWidget *widget,
1306 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH_HORIZ);
1310 set_toolbar_enable (GtkWidget *widget,
1313 GtkSettings *settings = gtk_widget_get_settings (widget);
1314 g_object_set (settings, "gtk-enable-tooltips", TRUE, NULL);
1318 set_toolbar_disable (GtkWidget *widget,
1321 GtkSettings *settings = gtk_widget_get_settings (widget);
1322 g_object_set (settings, "gtk-enable-tooltips", FALSE, NULL);
1325 static GtkActionEntry create_toolbar_items[] = {
1326 { NULL, GTK_STOCK_NEW, NULL, NULL, "Stock icon: New",
1327 G_CALLBACK (set_toolbar_small_stock) },
1328 { NULL, GTK_STOCK_OPEN, NULL, NULL, "Stock icon: Open",
1329 G_CALLBACK (set_toolbar_large_stock) },
1330 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1331 G_CALLBACK (set_toolbar_horizontal) },
1332 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1333 G_CALLBACK (set_toolbar_vertical) },
1335 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1336 G_CALLBACK (set_toolbar_icons) },
1337 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1338 G_CALLBACK (set_toolbar_text) },
1339 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1340 G_CALLBACK (set_toolbar_both) },
1341 { NULL, NULL, "Both (horizontal)", NULL, "Show toolbar icons and text in a horizontal fashion",
1342 G_CALLBACK (set_toolbar_both_horiz) },
1344 { "entry", NULL, NULL, "This is an unusable GtkEntry ;)",
1348 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1349 G_CALLBACK (set_toolbar_enable) },
1350 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1351 G_CALLBACK (set_toolbar_disable) },
1353 { NULL, NULL, "Frobate", NULL, "Frobate tooltip",
1355 { NULL, NULL, "Baz", NULL, "Baz tooltip",
1358 { NULL, NULL, "Blah", NULL, "Blash tooltip",
1360 { NULL, NULL, "Bar", NULL, "Bar tooltip",
1365 create_toolbar (GtkWidget *widget)
1367 static GtkWidget *window = NULL;
1374 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1375 gtk_window_set_screen (GTK_WINDOW (window),
1376 gtk_widget_get_screen (widget));
1378 gtk_window_set_title (GTK_WINDOW (window), "Toolbar test");
1380 g_signal_connect (window, "destroy",
1381 G_CALLBACK (gtk_widget_destroyed),
1384 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1385 gtk_widget_realize (window);
1387 toolbar = gtk_toolbar_new ();
1388 for (i = 0; i < G_N_ELEMENTS (create_toolbar_items); i++)
1390 GtkToolItem *toolitem;
1392 if (create_toolbar_items[i].tooltip == NULL)
1393 toolitem = gtk_separator_tool_item_new ();
1394 else if (g_strcmp0 (create_toolbar_items[i].name, "entry") == 0)
1398 toolitem = gtk_tool_item_new ();
1399 entry = gtk_entry_new ();
1400 gtk_container_add (GTK_CONTAINER (toolitem), entry);
1402 else if (create_toolbar_items[i].stock_id)
1403 toolitem = gtk_tool_button_new_from_stock (create_toolbar_items[i].stock_id);
1408 icon = new_pixbuf ("test.xpm", gtk_widget_get_window (window),
1409 >k_widget_get_style (window)->bg[GTK_STATE_NORMAL]);
1410 toolitem = gtk_tool_button_new (icon, create_toolbar_items[i].label);
1412 if (create_toolbar_items[i].callback)
1413 g_signal_connect (toolitem, "clicked",
1414 create_toolbar_items[i].callback, toolbar);
1415 gtk_tool_item_set_tooltip_text (toolitem, create_toolbar_items[i].tooltip);
1416 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1419 gtk_container_add (GTK_CONTAINER (window), toolbar);
1421 gtk_widget_set_size_request (toolbar, 200, -1);
1424 if (!gtk_widget_get_visible (window))
1425 gtk_widget_show_all (window);
1427 gtk_widget_destroy (window);
1430 static GtkActionEntry make_toolbar_items[] = {
1431 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1432 G_CALLBACK (set_toolbar_horizontal) },
1433 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1434 G_CALLBACK (set_toolbar_vertical) },
1436 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1437 G_CALLBACK (set_toolbar_icons) },
1438 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1439 G_CALLBACK (set_toolbar_text) },
1440 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1441 G_CALLBACK (set_toolbar_both) },
1443 { NULL, NULL, "Woot", NULL, "Woot woot woot",
1445 { NULL, NULL, "Blah", NULL, "Blah blah blah",
1448 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1449 G_CALLBACK (set_toolbar_enable) },
1450 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1451 G_CALLBACK (set_toolbar_disable) },
1453 { NULL, NULL, "Hoo", NULL, "Hoo tooltip",
1455 { NULL, NULL, "Woo", NULL, "Woo tooltip",
1460 make_toolbar (GtkWidget *window)
1465 if (!gtk_widget_get_realized (window))
1466 gtk_widget_realize (window);
1468 toolbar = gtk_toolbar_new ();
1469 for (i = 0; i < G_N_ELEMENTS (make_toolbar_items); i++)
1472 GtkToolItem *toolitem;
1474 if (make_toolbar_items[i].label == NULL)
1476 toolitem = gtk_separator_tool_item_new ();
1479 icon = new_pixbuf ("test.xpm", gtk_widget_get_window (window),
1480 >k_widget_get_style (window)->bg[GTK_STATE_NORMAL]);
1481 toolitem = gtk_tool_button_new (icon, make_toolbar_items[i].label);
1482 gtk_tool_item_set_tooltip_text (toolitem, make_toolbar_items[i].tooltip);
1483 if (make_toolbar_items[i].callback != NULL)
1484 g_signal_connect (toolitem, "clicked", make_toolbar_items[i].callback, toolbar);
1485 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1495 static guint statusbar_counter = 1;
1498 statusbar_push (GtkWidget *button,
1499 GtkStatusbar *statusbar)
1503 sprintf (text, "something %d", statusbar_counter++);
1505 gtk_statusbar_push (statusbar, 1, text);
1509 statusbar_push_long (GtkWidget *button,
1510 GtkStatusbar *statusbar)
1514 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\").");
1516 gtk_statusbar_push (statusbar, 1, text);
1520 statusbar_pop (GtkWidget *button,
1521 GtkStatusbar *statusbar)
1523 gtk_statusbar_pop (statusbar, 1);
1527 statusbar_steal (GtkWidget *button,
1528 GtkStatusbar *statusbar)
1530 gtk_statusbar_remove (statusbar, 1, 4);
1534 statusbar_popped (GtkStatusbar *statusbar,
1539 statusbar_counter = 1;
1543 statusbar_contexts (GtkStatusbar *statusbar)
1547 string = "any context";
1548 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1550 gtk_statusbar_get_context_id (statusbar, string));
1552 string = "idle messages";
1553 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1555 gtk_statusbar_get_context_id (statusbar, string));
1557 string = "some text";
1558 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1560 gtk_statusbar_get_context_id (statusbar, string));
1562 string = "hit the mouse";
1563 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1565 gtk_statusbar_get_context_id (statusbar, string));
1567 string = "hit the mouse2";
1568 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1570 gtk_statusbar_get_context_id (statusbar, string));
1574 create_statusbar (GtkWidget *widget)
1576 static GtkWidget *window = NULL;
1580 GtkWidget *separator;
1581 GtkWidget *statusbar;
1585 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1586 gtk_window_set_screen (GTK_WINDOW (window),
1587 gtk_widget_get_screen (widget));
1589 g_signal_connect (window, "destroy",
1590 G_CALLBACK (gtk_widget_destroyed),
1593 gtk_window_set_title (GTK_WINDOW (window), "statusbar");
1594 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1596 box1 = gtk_vbox_new (FALSE, 0);
1597 gtk_container_add (GTK_CONTAINER (window), box1);
1599 box2 = gtk_vbox_new (FALSE, 10);
1600 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1601 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1603 statusbar = gtk_statusbar_new ();
1604 gtk_box_pack_end (GTK_BOX (box1), statusbar, TRUE, TRUE, 0);
1605 g_signal_connect (statusbar,
1607 G_CALLBACK (statusbar_popped),
1610 button = g_object_new (gtk_button_get_type (),
1611 "label", "push something",
1615 g_object_connect (button,
1616 "signal::clicked", statusbar_push, statusbar,
1619 button = g_object_connect (g_object_new (gtk_button_get_type (),
1624 "signal_after::clicked", statusbar_pop, statusbar,
1627 button = g_object_connect (g_object_new (gtk_button_get_type (),
1628 "label", "steal #4",
1632 "signal_after::clicked", statusbar_steal, statusbar,
1635 button = g_object_connect (g_object_new (gtk_button_get_type (),
1636 "label", "test contexts",
1640 "swapped_signal_after::clicked", statusbar_contexts, statusbar,
1643 button = g_object_connect (g_object_new (gtk_button_get_type (),
1644 "label", "push something long",
1648 "signal_after::clicked", statusbar_push_long, statusbar,
1651 separator = gtk_hseparator_new ();
1652 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1654 box2 = gtk_vbox_new (FALSE, 10);
1655 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1656 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
1658 button = gtk_button_new_with_label ("close");
1659 g_signal_connect_swapped (button, "clicked",
1660 G_CALLBACK (gtk_widget_destroy),
1662 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1663 gtk_widget_set_can_default (button, TRUE);
1664 gtk_widget_grab_default (button);
1667 if (!gtk_widget_get_visible (window))
1668 gtk_widget_show_all (window);
1670 gtk_widget_destroy (window);
1676 #define GRID_SIZE 20
1677 #define DEFAULT_GEOMETRY "10x10"
1680 gridded_geometry_expose (GtkWidget *widget,
1681 GdkEventExpose *event)
1683 GtkAllocation allocation;
1689 gtk_widget_get_allocation (widget, &allocation);
1690 style = gtk_widget_get_style (widget);
1691 state = gtk_widget_get_state (widget);
1693 cr = gdk_cairo_create (gtk_widget_get_window (widget));
1695 cairo_rectangle (cr, 0, 0, allocation.width, allocation.height);
1696 gdk_cairo_set_source_color (cr, &style->base[state]);
1699 for (i = 0 ; i * GRID_SIZE < allocation.width; i++)
1700 for (j = 0 ; j * GRID_SIZE < allocation.height; j++)
1702 if ((i + j) % 2 == 0)
1703 cairo_rectangle (cr, i * GRID_SIZE, j * GRID_SIZE, GRID_SIZE, GRID_SIZE);
1706 gdk_cairo_set_source_color (cr, &style->text[state]);
1715 gridded_geometry_subresponse (GtkDialog *dialog,
1717 gchar *geometry_string)
1719 if (response_id == GTK_RESPONSE_NONE)
1721 gtk_widget_destroy (GTK_WIDGET (dialog));
1725 if (!gtk_window_parse_geometry (GTK_WINDOW (dialog), geometry_string))
1727 g_print ("Can't parse geometry string %s\n", geometry_string);
1728 gtk_window_parse_geometry (GTK_WINDOW (dialog), DEFAULT_GEOMETRY);
1734 gridded_geometry_response (GtkDialog *dialog,
1738 if (response_id == GTK_RESPONSE_NONE)
1740 gtk_widget_destroy (GTK_WIDGET (dialog));
1744 gchar *geometry_string = g_strdup (gtk_entry_get_text (entry));
1745 gchar *title = g_strdup_printf ("Gridded window at: %s", geometry_string);
1746 GtkWidget *content_area;
1748 GtkWidget *drawing_area;
1750 GdkGeometry geometry;
1752 window = gtk_dialog_new_with_buttons (title,
1755 GTK_STOCK_CLOSE, GTK_RESPONSE_NONE,
1758 gtk_window_set_screen (GTK_WINDOW (window),
1759 gtk_widget_get_screen (GTK_WIDGET (dialog)));
1761 g_signal_connect (window, "response",
1762 G_CALLBACK (gridded_geometry_subresponse), geometry_string);
1764 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
1766 box = gtk_vbox_new (FALSE, 0);
1767 gtk_box_pack_start (GTK_BOX (content_area), box, TRUE, TRUE, 0);
1769 gtk_container_set_border_width (GTK_CONTAINER (box), 7);
1771 drawing_area = gtk_drawing_area_new ();
1772 g_signal_connect (drawing_area, "expose_event",
1773 G_CALLBACK (gridded_geometry_expose), NULL);
1774 gtk_box_pack_start (GTK_BOX (box), drawing_area, TRUE, TRUE, 0);
1776 /* Gross hack to work around bug 68668... if we set the size request
1777 * large enough, then the current
1779 * request_of_window - request_of_geometry_widget
1781 * method of getting the base size works more or less works.
1783 gtk_widget_set_size_request (drawing_area, 2000, 2000);
1785 geometry.base_width = 0;
1786 geometry.base_height = 0;
1787 geometry.min_width = 2 * GRID_SIZE;
1788 geometry.min_height = 2 * GRID_SIZE;
1789 geometry.width_inc = GRID_SIZE;
1790 geometry.height_inc = GRID_SIZE;
1792 gtk_window_set_geometry_hints (GTK_WINDOW (window), drawing_area,
1794 GDK_HINT_BASE_SIZE | GDK_HINT_MIN_SIZE | GDK_HINT_RESIZE_INC);
1796 if (!gtk_window_parse_geometry (GTK_WINDOW (window), geometry_string))
1798 g_print ("Can't parse geometry string %s\n", geometry_string);
1799 gtk_window_parse_geometry (GTK_WINDOW (window), DEFAULT_GEOMETRY);
1802 gtk_widget_show_all (window);
1807 create_gridded_geometry (GtkWidget *widget)
1809 static GtkWidget *window = NULL;
1810 gpointer window_ptr;
1811 GtkWidget *content_area;
1817 window = gtk_dialog_new_with_buttons ("Gridded Geometry",
1820 GTK_STOCK_CLOSE, GTK_RESPONSE_NONE,
1823 gtk_window_set_screen (GTK_WINDOW (window),
1824 gtk_widget_get_screen (widget));
1826 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
1828 label = gtk_label_new ("Geometry string:");
1829 gtk_box_pack_start (GTK_BOX (content_area), label, FALSE, FALSE, 0);
1831 entry = gtk_entry_new ();
1832 gtk_entry_set_text (GTK_ENTRY (entry), DEFAULT_GEOMETRY);
1833 gtk_box_pack_start (GTK_BOX (content_area), entry, FALSE, FALSE, 0);
1835 g_signal_connect (window, "response",
1836 G_CALLBACK (gridded_geometry_response), entry);
1837 window_ptr = &window;
1838 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
1840 gtk_widget_show_all (window);
1843 gtk_widget_destroy (window);
1851 handle_box_child_signal (GtkHandleBox *hb,
1853 const gchar *action)
1855 printf ("%s: child <%s> %sed\n",
1856 g_type_name (G_OBJECT_TYPE (hb)),
1857 g_type_name (G_OBJECT_TYPE (child)),
1862 create_handle_box (GtkWidget *widget)
1864 static GtkWidget* window = NULL;
1865 GtkWidget *handle_box;
1866 GtkWidget *handle_box2;
1871 GtkWidget *separator;
1875 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1877 gtk_window_set_screen (GTK_WINDOW (window),
1878 gtk_widget_get_screen (widget));
1879 gtk_window_set_modal (GTK_WINDOW (window), FALSE);
1880 gtk_window_set_title (GTK_WINDOW (window),
1882 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
1884 g_signal_connect (window, "destroy",
1885 G_CALLBACK (gtk_widget_destroyed),
1888 gtk_container_set_border_width (GTK_CONTAINER (window), 20);
1890 vbox = gtk_vbox_new (FALSE, 0);
1891 gtk_container_add (GTK_CONTAINER (window), vbox);
1892 gtk_widget_show (vbox);
1894 label = gtk_label_new ("Above");
1895 gtk_container_add (GTK_CONTAINER (vbox), label);
1896 gtk_widget_show (label);
1898 separator = gtk_hseparator_new ();
1899 gtk_container_add (GTK_CONTAINER (vbox), separator);
1900 gtk_widget_show (separator);
1902 hbox = gtk_hbox_new (FALSE, 10);
1903 gtk_container_add (GTK_CONTAINER (vbox), hbox);
1904 gtk_widget_show (hbox);
1906 separator = gtk_hseparator_new ();
1907 gtk_container_add (GTK_CONTAINER (vbox), separator);
1908 gtk_widget_show (separator);
1910 label = gtk_label_new ("Below");
1911 gtk_container_add (GTK_CONTAINER (vbox), label);
1912 gtk_widget_show (label);
1914 handle_box = gtk_handle_box_new ();
1915 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1916 g_signal_connect (handle_box,
1918 G_CALLBACK (handle_box_child_signal),
1920 g_signal_connect (handle_box,
1922 G_CALLBACK (handle_box_child_signal),
1924 gtk_widget_show (handle_box);
1926 toolbar = make_toolbar (window);
1928 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
1929 gtk_widget_show (toolbar);
1931 handle_box = gtk_handle_box_new ();
1932 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1933 g_signal_connect (handle_box,
1935 G_CALLBACK (handle_box_child_signal),
1937 g_signal_connect (handle_box,
1939 G_CALLBACK (handle_box_child_signal),
1941 gtk_widget_show (handle_box);
1943 handle_box2 = gtk_handle_box_new ();
1944 gtk_container_add (GTK_CONTAINER (handle_box), handle_box2);
1945 g_signal_connect (handle_box2,
1947 G_CALLBACK (handle_box_child_signal),
1949 g_signal_connect (handle_box2,
1951 G_CALLBACK (handle_box_child_signal),
1953 gtk_widget_show (handle_box2);
1955 hbox = g_object_new (GTK_TYPE_HBOX, "visible", 1, "parent", handle_box2, NULL);
1956 label = gtk_label_new ("Fooo!");
1957 gtk_container_add (GTK_CONTAINER (hbox), label);
1958 gtk_widget_show (label);
1959 g_object_new (GTK_TYPE_ARROW, "visible", 1, "parent", hbox, NULL);
1962 if (!gtk_widget_get_visible (window))
1963 gtk_widget_show (window);
1965 gtk_widget_destroy (window);
1972 sensitivity_toggled (GtkWidget *toggle,
1975 gtk_widget_set_sensitive (widget, GTK_TOGGLE_BUTTON (toggle)->active);
1979 create_sensitivity_control (GtkWidget *widget)
1983 button = gtk_toggle_button_new_with_label ("Sensitive");
1985 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
1986 gtk_widget_is_sensitive (widget));
1988 g_signal_connect (button,
1990 G_CALLBACK (sensitivity_toggled),
1993 gtk_widget_show_all (button);
1999 set_selectable_recursive (GtkWidget *widget,
2002 if (GTK_IS_CONTAINER (widget))
2007 children = gtk_container_get_children (GTK_CONTAINER (widget));
2011 set_selectable_recursive (tmp->data, setting);
2015 g_list_free (children);
2017 else if (GTK_IS_LABEL (widget))
2019 gtk_label_set_selectable (GTK_LABEL (widget), setting);
2024 selectable_toggled (GtkWidget *toggle,
2027 set_selectable_recursive (widget,
2028 GTK_TOGGLE_BUTTON (toggle)->active);
2032 create_selectable_control (GtkWidget *widget)
2036 button = gtk_toggle_button_new_with_label ("Selectable");
2038 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
2041 g_signal_connect (button,
2043 G_CALLBACK (selectable_toggled),
2046 gtk_widget_show_all (button);
2052 dialog_response (GtkWidget *dialog, gint response_id, GtkLabel *label)
2056 gtk_widget_destroy (dialog);
2058 text = "Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
2059 "as hyperlinks, which can be clicked\n"
2060 "or activated via <a href=\"keynav\">keynav</a>.\n"
2061 "The links remain the same.";
2062 gtk_label_set_markup (label, text);
2066 activate_link (GtkWidget *label, const gchar *uri, gpointer data)
2068 if (g_strcmp0 (uri, "keynav") == 0)
2072 dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (gtk_widget_get_toplevel (label)),
2073 GTK_DIALOG_DESTROY_WITH_PARENT,
2076 "The term <i>keynav</i> is a shorthand for "
2077 "keyboard navigation and refers to the process of using a program "
2078 "(exclusively) via keyboard input.");
2080 gtk_window_present (GTK_WINDOW (dialog));
2082 g_signal_connect (dialog, "response", G_CALLBACK (dialog_response), label);
2090 void create_labels (GtkWidget *widget)
2092 static GtkWidget *window = NULL;
2101 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2103 gtk_window_set_screen (GTK_WINDOW (window),
2104 gtk_widget_get_screen (widget));
2106 g_signal_connect (window, "destroy",
2107 G_CALLBACK (gtk_widget_destroyed),
2110 gtk_window_set_title (GTK_WINDOW (window), "Label");
2112 vbox = gtk_vbox_new (FALSE, 5);
2114 hbox = gtk_hbox_new (FALSE, 5);
2115 gtk_container_add (GTK_CONTAINER (window), vbox);
2117 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
2119 button = create_sensitivity_control (hbox);
2121 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2123 button = create_selectable_control (hbox);
2125 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
2127 vbox = gtk_vbox_new (FALSE, 5);
2129 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2130 gtk_container_set_border_width (GTK_CONTAINER (window), 5);
2132 frame = gtk_frame_new ("Normal Label");
2133 label = gtk_label_new ("This is a Normal label");
2134 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
2135 gtk_container_add (GTK_CONTAINER (frame), label);
2136 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2138 frame = gtk_frame_new ("Multi-line Label");
2139 label = gtk_label_new ("This is a Multi-line label.\nSecond line\nThird line");
2140 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
2141 gtk_container_add (GTK_CONTAINER (frame), label);
2142 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2144 frame = gtk_frame_new ("Left Justified Label");
2145 label = gtk_label_new ("This is a Left-Justified\nMulti-line label.\nThird line");
2146 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_MIDDLE);
2147 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2148 gtk_container_add (GTK_CONTAINER (frame), label);
2149 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2151 frame = gtk_frame_new ("Right Justified Label");
2152 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
2153 label = gtk_label_new ("This is a Right-Justified\nMulti-line label.\nFourth line, (j/k)");
2154 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
2155 gtk_container_add (GTK_CONTAINER (frame), label);
2156 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2158 frame = gtk_frame_new ("Internationalized Label");
2159 label = gtk_label_new (NULL);
2160 gtk_label_set_markup (GTK_LABEL (label),
2161 "French (Fran\303\247ais) Bonjour, Salut\n"
2162 "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"
2163 "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"
2164 "Chinese (Simplified) <span lang=\"zh-cn\">\345\205\203\346\260\224 \345\274\200\345\217\221</span>\n"
2165 "Chinese (Traditional) <span lang=\"zh-tw\">\345\205\203\346\260\243 \351\226\213\347\231\274</span>\n"
2166 "Japanese <span lang=\"ja\">\345\205\203\346\260\227 \351\226\213\347\231\272</span>");
2167 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2168 gtk_container_add (GTK_CONTAINER (frame), label);
2169 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2171 frame = gtk_frame_new ("Bidirection Label");
2172 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"
2173 "\342\200\217Hebrew \327\251\327\234\327\225\327\235");
2174 gtk_container_add (GTK_CONTAINER (frame), label);
2175 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2177 frame = gtk_frame_new ("Links in a label");
2178 label = gtk_label_new ("Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
2179 "as hyperlinks, which can be clicked\n"
2180 "or activated via <a href=\"keynav\">keynav</a>");
2181 gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
2182 gtk_container_add (GTK_CONTAINER (frame), label);
2183 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2184 g_signal_connect (label, "activate-link", G_CALLBACK (activate_link), NULL);
2186 vbox = gtk_vbox_new (FALSE, 5);
2187 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
2188 frame = gtk_frame_new ("Line wrapped label");
2189 label = gtk_label_new ("This is an example of a line-wrapped label. It should not be taking "\
2190 "up the entire "/* big space to test spacing */\
2191 "width allocated to it, but automatically wraps the words to fit. "\
2192 "The time has come, for all good men, to come to the aid of their party. "\
2193 "The sixth sheik's six sheep's sick.\n"\
2194 " It supports multiple paragraphs correctly, and correctly adds "\
2195 "many extra spaces. ");
2197 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2198 gtk_container_add (GTK_CONTAINER (frame), label);
2199 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2201 frame = gtk_frame_new ("Filled, wrapped label");
2202 label = gtk_label_new ("This is an example of a line-wrapped, filled label. It should be taking "\
2203 "up the entire width allocated to it. Here is a seneance to prove "\
2204 "my point. Here is another sentence. "\
2205 "Here comes the sun, do de do de do.\n"\
2206 " This is a new paragraph.\n"\
2207 " This is another newer, longer, better paragraph. It is coming to an end, "\
2209 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_FILL);
2210 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2211 gtk_container_add (GTK_CONTAINER (frame), label);
2212 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2214 frame = gtk_frame_new ("Underlined label");
2215 label = gtk_label_new ("This label is underlined!\n"
2216 "This one is underlined (\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257) in quite a funky fashion");
2217 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2218 gtk_label_set_pattern (GTK_LABEL (label), "_________________________ _ _________ _ _____ _ __ __ ___ ____ _____");
2219 gtk_container_add (GTK_CONTAINER (frame), label);
2220 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2222 frame = gtk_frame_new ("Markup label");
2223 label = gtk_label_new (NULL);
2225 /* There's also a gtk_label_set_markup() without accel if you
2226 * don't have an accelerator key
2228 gtk_label_set_markup_with_mnemonic (GTK_LABEL (label),
2229 "This <span foreground=\"blue\" background=\"orange\">label</span> has "
2230 "<b>markup</b> _such as "
2231 "<big><i>Big Italics</i></big>\n"
2232 "<tt>Monospace font</tt>\n"
2233 "<u>Underline!</u>\n"
2235 "<span foreground=\"green\" background=\"red\">Ugly colors</span>\n"
2236 "and nothing on this line,\n"
2239 "or even on this one\n"
2240 "la <big>la <big>la <big>la <big>la</big></big></big></big>\n"
2241 "but this _word is <span foreground=\"purple\"><big>purple</big></span>\n"
2242 "<span underline=\"double\">We like <sup>superscript</sup> and <sub>subscript</sub> too</span>");
2244 g_assert (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)) == GDK_KEY_s);
2246 gtk_container_add (GTK_CONTAINER (frame), label);
2247 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2250 if (!gtk_widget_get_visible (window))
2251 gtk_widget_show_all (window);
2253 gtk_widget_destroy (window);
2257 on_angle_scale_changed (GtkRange *range,
2260 gtk_label_set_angle (GTK_LABEL (label), gtk_range_get_value (range));
2264 create_rotated_label (GtkWidget *widget)
2266 static GtkWidget *window = NULL;
2267 GtkWidget *content_area;
2271 GtkWidget *scale_label;
2272 GtkWidget *scale_hbox;
2276 window = gtk_dialog_new_with_buttons ("Rotated Label",
2277 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2278 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2281 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2283 gtk_window_set_screen (GTK_WINDOW (window),
2284 gtk_widget_get_screen (widget));
2286 g_signal_connect (window, "response",
2287 G_CALLBACK (gtk_object_destroy), NULL);
2288 g_signal_connect (window, "destroy",
2289 G_CALLBACK (gtk_widget_destroyed), &window);
2291 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2293 vbox = gtk_vbox_new (FALSE, 5);
2294 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
2295 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
2297 label = gtk_label_new (NULL);
2298 gtk_label_set_markup (GTK_LABEL (label), "Hello World\n<i>Rotate</i> <span underline='single' foreground='blue'>me</span>");
2299 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
2301 scale_hbox = gtk_hbox_new (FALSE, 0);
2302 gtk_box_pack_start (GTK_BOX (vbox), scale_hbox, FALSE, FALSE, 0);
2304 scale_label = gtk_label_new (NULL);
2305 gtk_label_set_markup (GTK_LABEL (scale_label), "<i>Angle: </i>");
2306 gtk_box_pack_start (GTK_BOX (scale_hbox), scale_label, FALSE, FALSE, 0);
2308 hscale = gtk_hscale_new_with_range (0, 360, 5);
2309 g_signal_connect (hscale, "value-changed",
2310 G_CALLBACK (on_angle_scale_changed), label);
2312 gtk_range_set_value (GTK_RANGE (hscale), 45);
2313 gtk_widget_set_size_request (hscale, 200, -1);
2314 gtk_box_pack_start (GTK_BOX (scale_hbox), hscale, TRUE, TRUE, 0);
2317 if (!gtk_widget_get_visible (window))
2318 gtk_widget_show_all (window);
2320 gtk_widget_destroy (window);
2323 #define DEFAULT_TEXT_RADIUS 200
2326 on_rotated_text_unrealize (GtkWidget *widget)
2328 g_object_set_data (G_OBJECT (widget), "text-gc", NULL);
2332 on_rotated_text_draw (GtkWidget *widget,
2334 GdkPixbuf *tile_pixbuf)
2336 static const gchar *words[] = { "The", "grand", "old", "Duke", "of", "York",
2337 "had", "10,000", "men" };
2342 PangoLayout *layout;
2343 PangoContext *context;
2344 PangoFontDescription *desc;
2348 gdk_cairo_set_source_pixbuf (cr, tile_pixbuf, 0, 0);
2349 cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT);
2352 cairo_set_source_rgb (cr, 0, 0, 0);
2354 width = gtk_widget_get_allocated_width (widget);
2355 height = gtk_widget_get_allocated_height (widget);
2356 radius = MIN (width, height) / 2.;
2358 cairo_translate (cr,
2359 radius + (width - 2 * radius) / 2,
2360 radius + (height - 2 * radius) / 2);
2361 cairo_scale (cr, radius / DEFAULT_TEXT_RADIUS, radius / DEFAULT_TEXT_RADIUS);
2363 context = gtk_widget_get_pango_context (widget);
2364 layout = pango_layout_new (context);
2365 desc = pango_font_description_from_string ("Sans Bold 30");
2366 pango_layout_set_font_description (layout, desc);
2367 pango_font_description_free (desc);
2369 n_words = G_N_ELEMENTS (words);
2370 for (i = 0; i < n_words; i++)
2376 cairo_rotate (cr, 2 * G_PI * i / n_words);
2377 pango_cairo_update_layout (cr, layout);
2379 pango_layout_set_text (layout, words[i], -1);
2380 pango_layout_get_size (layout, &width, &height);
2382 cairo_move_to (cr, - width / 2 / PANGO_SCALE, - DEFAULT_TEXT_RADIUS);
2383 pango_cairo_show_layout (cr, layout);
2388 g_object_unref (layout);
2394 create_rotated_text (GtkWidget *widget)
2396 static GtkWidget *window = NULL;
2400 const GdkColor white = { 0, 0xffff, 0xffff, 0xffff };
2401 GtkRequisition requisition;
2402 GtkWidget *content_area;
2403 GtkWidget *drawing_area;
2404 GdkPixbuf *tile_pixbuf;
2406 window = gtk_dialog_new_with_buttons ("Rotated Text",
2407 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2408 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2411 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2413 gtk_window_set_screen (GTK_WINDOW (window),
2414 gtk_widget_get_screen (widget));
2416 g_signal_connect (window, "response",
2417 G_CALLBACK (gtk_object_destroy), NULL);
2418 g_signal_connect (window, "destroy",
2419 G_CALLBACK (gtk_widget_destroyed), &window);
2421 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2423 drawing_area = gtk_drawing_area_new ();
2424 gtk_box_pack_start (GTK_BOX (content_area), drawing_area, TRUE, TRUE, 0);
2425 gtk_widget_modify_bg (drawing_area, GTK_STATE_NORMAL, &white);
2427 tile_pixbuf = gdk_pixbuf_new_from_file ("marble.xpm", NULL);
2429 g_signal_connect (drawing_area, "draw",
2430 G_CALLBACK (on_rotated_text_draw), tile_pixbuf);
2431 g_signal_connect (drawing_area, "unrealize",
2432 G_CALLBACK (on_rotated_text_unrealize), NULL);
2434 gtk_widget_show_all (gtk_bin_get_child (GTK_BIN (window)));
2436 gtk_widget_set_size_request (drawing_area, DEFAULT_TEXT_RADIUS * 2, DEFAULT_TEXT_RADIUS * 2);
2437 gtk_size_request_get_size (GTK_SIZE_REQUEST (window),
2438 &requisition, NULL);
2439 gtk_widget_set_size_request (drawing_area, -1, -1);
2440 gtk_window_resize (GTK_WINDOW (window), requisition.width, requisition.height);
2443 if (!gtk_widget_get_visible (window))
2444 gtk_widget_show (window);
2446 gtk_widget_destroy (window);
2454 reparent_label (GtkWidget *widget,
2455 GtkWidget *new_parent)
2459 label = g_object_get_data (G_OBJECT (widget), "user_data");
2461 gtk_widget_reparent (label, new_parent);
2465 set_parent_signal (GtkWidget *child,
2466 GtkWidget *old_parent,
2471 parent = gtk_widget_get_parent (child);
2472 g_message ("set_parent for \"%s\": new parent: \"%s\", old parent: \"%s\", data: %d\n",
2473 g_type_name (G_OBJECT_TYPE (child)),
2474 parent ? g_type_name (G_OBJECT_TYPE (parent)) : "NULL",
2475 old_parent ? g_type_name (G_OBJECT_TYPE (old_parent)) : "NULL",
2476 GPOINTER_TO_INT (func_data));
2480 create_reparent (GtkWidget *widget)
2482 static GtkWidget *window = NULL;
2489 GtkWidget *separator;
2490 GtkWidget *event_box;
2494 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2496 gtk_window_set_screen (GTK_WINDOW (window),
2497 gtk_widget_get_screen (widget));
2499 g_signal_connect (window, "destroy",
2500 G_CALLBACK (gtk_widget_destroyed),
2503 gtk_window_set_title (GTK_WINDOW (window), "reparent");
2504 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2506 box1 = gtk_vbox_new (FALSE, 0);
2507 gtk_container_add (GTK_CONTAINER (window), box1);
2509 box2 = gtk_hbox_new (FALSE, 5);
2510 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2511 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2513 label = gtk_label_new ("Hello World");
2515 frame = gtk_frame_new ("Frame 1");
2516 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2518 box3 = gtk_vbox_new (FALSE, 5);
2519 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2520 gtk_container_add (GTK_CONTAINER (frame), box3);
2522 button = gtk_button_new_with_label ("switch");
2523 g_object_set_data (G_OBJECT (button), "user_data", label);
2524 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2526 event_box = gtk_event_box_new ();
2527 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2528 gtk_container_add (GTK_CONTAINER (event_box), label);
2530 g_signal_connect (button, "clicked",
2531 G_CALLBACK (reparent_label),
2534 g_signal_connect (label, "parent_set",
2535 G_CALLBACK (set_parent_signal),
2536 GINT_TO_POINTER (42));
2538 frame = gtk_frame_new ("Frame 2");
2539 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2541 box3 = gtk_vbox_new (FALSE, 5);
2542 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2543 gtk_container_add (GTK_CONTAINER (frame), box3);
2545 button = gtk_button_new_with_label ("switch");
2546 g_object_set_data (G_OBJECT (button), "user_data", label);
2547 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2549 event_box = gtk_event_box_new ();
2550 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2552 g_signal_connect (button, "clicked",
2553 G_CALLBACK (reparent_label),
2556 separator = gtk_hseparator_new ();
2557 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2559 box2 = gtk_vbox_new (FALSE, 10);
2560 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2561 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2563 button = gtk_button_new_with_label ("close");
2564 g_signal_connect_swapped (button, "clicked",
2565 G_CALLBACK (gtk_widget_destroy), window);
2566 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2567 gtk_widget_set_can_default (button, TRUE);
2568 gtk_widget_grab_default (button);
2571 if (!gtk_widget_get_visible (window))
2572 gtk_widget_show_all (window);
2574 gtk_widget_destroy (window);
2581 grippy_button_press (GtkWidget *area, GdkEventButton *event, GdkWindowEdge edge)
2583 if (event->type == GDK_BUTTON_PRESS)
2585 if (event->button == 1)
2586 gtk_window_begin_resize_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)), edge,
2587 event->button, event->x_root, event->y_root,
2589 else if (event->button == 2)
2590 gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)),
2591 event->button, event->x_root, event->y_root,
2598 grippy_draw (GtkWidget *area, cairo_t *cr, GdkWindowEdge edge)
2600 gtk_cairo_paint_resize_grip (gtk_widget_get_style (area),
2602 gtk_widget_get_state (area),
2607 gtk_widget_get_allocated_width (area),
2608 gtk_widget_get_allocated_height (area));
2614 create_resize_grips (GtkWidget *widget)
2616 static GtkWidget *window = NULL;
2618 GtkWidget *hbox, *vbox;
2621 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2623 gtk_window_set_screen (GTK_WINDOW (window),
2624 gtk_widget_get_screen (widget));
2626 gtk_window_set_title (GTK_WINDOW (window), "resize grips");
2628 g_signal_connect (window, "destroy",
2629 G_CALLBACK (gtk_widget_destroyed),
2632 vbox = gtk_vbox_new (FALSE, 0);
2633 gtk_container_add (GTK_CONTAINER (window), vbox);
2635 hbox = gtk_hbox_new (FALSE, 0);
2636 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2639 area = gtk_drawing_area_new ();
2640 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2641 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2642 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2643 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2644 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2645 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2648 area = gtk_drawing_area_new ();
2649 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2650 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2651 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2652 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2653 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2654 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2657 area = gtk_drawing_area_new ();
2658 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2659 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2660 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2661 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2662 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2663 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2665 hbox = gtk_hbox_new (FALSE, 0);
2666 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2669 area = gtk_drawing_area_new ();
2670 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2671 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2672 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2673 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2674 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2675 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2678 area = gtk_drawing_area_new ();
2679 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2682 area = gtk_drawing_area_new ();
2683 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2684 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2685 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2686 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2687 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2688 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2691 hbox = gtk_hbox_new (FALSE, 0);
2692 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2695 area = gtk_drawing_area_new ();
2696 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2697 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2698 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2699 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2700 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2701 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2703 area = gtk_drawing_area_new ();
2704 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2705 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2706 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2707 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2708 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2709 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2712 area = gtk_drawing_area_new ();
2713 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2714 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2715 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2716 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2717 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2718 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2721 if (!gtk_widget_get_visible (window))
2722 gtk_widget_show_all (window);
2724 gtk_widget_destroy (window);
2730 gint upositionx = 0;
2731 gint upositiony = 0;
2734 uposition_configure (GtkWidget *window)
2740 lx = g_object_get_data (G_OBJECT (window), "x");
2741 ly = g_object_get_data (G_OBJECT (window), "y");
2743 gdk_window_get_root_origin (gtk_widget_get_window (window),
2744 &upositionx, &upositiony);
2745 sprintf (buffer, "%d", upositionx);
2746 gtk_label_set_text (lx, buffer);
2747 sprintf (buffer, "%d", upositiony);
2748 gtk_label_set_text (ly, buffer);
2754 uposition_stop_configure (GtkToggleButton *toggle,
2758 g_signal_handlers_block_by_func (window, G_CALLBACK (uposition_configure), NULL);
2760 g_signal_handlers_unblock_by_func (window, G_CALLBACK (uposition_configure), NULL);
2764 create_saved_position (GtkWidget *widget)
2766 static GtkWidget *window = NULL;
2771 GtkWidget *main_vbox;
2779 window = g_object_connect (g_object_new (GTK_TYPE_WINDOW,
2780 "type", GTK_WINDOW_TOPLEVEL,
2781 "title", "Saved Position",
2783 "signal::configure_event", uposition_configure, NULL,
2786 gtk_window_move (GTK_WINDOW (window), upositionx, upositiony);
2788 gtk_window_set_screen (GTK_WINDOW (window),
2789 gtk_widget_get_screen (widget));
2792 g_signal_connect (window, "destroy",
2793 G_CALLBACK (gtk_widget_destroyed),
2796 main_vbox = gtk_vbox_new (FALSE, 5);
2797 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
2798 gtk_container_add (GTK_CONTAINER (window), main_vbox);
2801 g_object_new (gtk_vbox_get_type (),
2802 "GtkBox::homogeneous", FALSE,
2803 "GtkBox::spacing", 5,
2804 "GtkContainer::border_width", 10,
2805 "GtkWidget::parent", main_vbox,
2806 "GtkWidget::visible", TRUE,
2807 "child", g_object_connect (g_object_new (GTK_TYPE_TOGGLE_BUTTON,
2808 "label", "Stop Events",
2812 "signal::clicked", uposition_stop_configure, window,
2816 hbox = gtk_hbox_new (FALSE, 0);
2817 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2818 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2820 label = gtk_label_new ("X Origin : ");
2821 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2822 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
2824 x_label = gtk_label_new ("");
2825 gtk_box_pack_start (GTK_BOX (hbox), x_label, TRUE, TRUE, 0);
2826 g_object_set_data (G_OBJECT (window), "x", x_label);
2828 hbox = gtk_hbox_new (FALSE, 0);
2829 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2830 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2832 label = gtk_label_new ("Y Origin : ");
2833 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2834 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
2836 y_label = gtk_label_new ("");
2837 gtk_box_pack_start (GTK_BOX (hbox), y_label, TRUE, TRUE, 0);
2838 g_object_set_data (G_OBJECT (window), "y", y_label);
2841 g_object_new (gtk_hseparator_get_type (),
2842 "GtkWidget::visible", TRUE,
2844 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
2846 hbox = gtk_hbox_new (FALSE, 0);
2847 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
2848 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
2850 button = gtk_button_new_with_label ("Close");
2851 g_signal_connect_swapped (button, "clicked",
2852 G_CALLBACK (gtk_widget_destroy),
2854 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
2855 gtk_widget_set_can_default (button, TRUE);
2856 gtk_widget_grab_default (button);
2858 gtk_widget_show_all (window);
2861 gtk_widget_destroy (window);
2869 create_pixbuf (GtkWidget *widget)
2871 static GtkWidget *window = NULL;
2877 GtkWidget *separator;
2878 GtkWidget *pixbufwid;
2879 GdkWindow *gdk_window;
2883 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2885 gtk_window_set_screen (GTK_WINDOW (window),
2886 gtk_widget_get_screen (widget));
2888 g_signal_connect (window, "destroy",
2889 G_CALLBACK (gtk_widget_destroyed),
2892 gtk_window_set_title (GTK_WINDOW (window), "GtkPixmap");
2893 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2894 gtk_widget_realize(window);
2896 box1 = gtk_vbox_new (FALSE, 0);
2897 gtk_container_add (GTK_CONTAINER (window), box1);
2899 box2 = gtk_vbox_new (FALSE, 10);
2900 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2901 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2903 button = gtk_button_new ();
2904 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
2906 gdk_window = gtk_widget_get_window (window);
2908 pixbufwid = new_pixbuf ("test.xpm", gdk_window, NULL);
2910 label = gtk_label_new ("Pixbuf\ntest");
2911 box3 = gtk_hbox_new (FALSE, 0);
2912 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
2913 gtk_container_add (GTK_CONTAINER (box3), pixbufwid);
2914 gtk_container_add (GTK_CONTAINER (box3), label);
2915 gtk_container_add (GTK_CONTAINER (button), box3);
2917 button = gtk_button_new ();
2918 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
2920 pixbufwid = new_pixbuf ("test.xpm", gdk_window, NULL);
2922 label = gtk_label_new ("Pixbuf\ntest");
2923 box3 = gtk_hbox_new (FALSE, 0);
2924 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
2925 gtk_container_add (GTK_CONTAINER (box3), pixbufwid);
2926 gtk_container_add (GTK_CONTAINER (box3), label);
2927 gtk_container_add (GTK_CONTAINER (button), box3);
2929 gtk_widget_set_sensitive (button, FALSE);
2931 separator = gtk_hseparator_new ();
2932 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2934 box2 = gtk_vbox_new (FALSE, 10);
2935 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2936 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2938 button = gtk_button_new_with_label ("close");
2939 g_signal_connect_swapped (button, "clicked",
2940 G_CALLBACK (gtk_widget_destroy),
2942 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2943 gtk_widget_set_can_default (button, TRUE);
2944 gtk_widget_grab_default (button);
2947 if (!gtk_widget_get_visible (window))
2948 gtk_widget_show_all (window);
2950 gtk_widget_destroy (window);
2954 create_tooltips (GtkWidget *widget)
2956 static GtkWidget *window = NULL;
2963 GtkWidget *separator;
2968 g_object_new (gtk_window_get_type (),
2969 "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
2970 "GtkContainer::border_width", 0,
2971 "GtkWindow::title", "Tooltips",
2972 "GtkWindow::resizable", FALSE,
2975 gtk_window_set_screen (GTK_WINDOW (window),
2976 gtk_widget_get_screen (widget));
2978 box1 = gtk_vbox_new (FALSE, 0);
2979 gtk_container_add (GTK_CONTAINER (window), box1);
2981 box2 = gtk_vbox_new (FALSE, 10);
2982 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2983 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2985 button = gtk_toggle_button_new_with_label ("button1");
2986 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2988 gtk_widget_set_tooltip_text (button, "This is button 1");
2990 button = gtk_toggle_button_new_with_label ("button2");
2991 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2993 gtk_widget_set_tooltip_text (button,
2994 "This is button 2. This is also a really long tooltip which probably "
2995 "won't fit on a single line and will therefore need to be wrapped. "
2996 "Hopefully the wrapping will work correctly.");
2998 toggle = gtk_toggle_button_new_with_label ("Override TipsQuery Label");
2999 gtk_box_pack_start (GTK_BOX (box2), toggle, TRUE, TRUE, 0);
3001 gtk_widget_set_tooltip_text (toggle, "Toggle TipsQuery view.");
3004 g_object_new (gtk_vbox_get_type (),
3005 "homogeneous", FALSE,
3012 g_object_new (gtk_button_get_type (),
3017 gtk_box_set_child_packing (GTK_BOX (box3), button, FALSE, FALSE, 0, GTK_PACK_START);
3018 gtk_widget_set_tooltip_text (button, "Start the Tooltips Inspector");
3020 frame = g_object_new (gtk_frame_get_type (),
3021 "label", "ToolTips Inspector",
3022 "label_xalign", (double) 0.5,
3028 gtk_box_set_child_packing (GTK_BOX (box2), frame, TRUE, TRUE, 10, GTK_PACK_START);
3030 separator = gtk_hseparator_new ();
3031 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3033 box2 = gtk_vbox_new (FALSE, 10);
3034 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3035 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3037 button = gtk_button_new_with_label ("close");
3038 g_signal_connect_swapped (button, "clicked",
3039 G_CALLBACK (gtk_widget_destroy),
3041 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3042 gtk_widget_set_can_default (button, TRUE);
3043 gtk_widget_grab_default (button);
3045 gtk_widget_set_tooltip_text (button, "Push this button to close window");
3048 if (!gtk_widget_get_visible (window))
3049 gtk_widget_show_all (window);
3051 gtk_widget_destroy (window);
3059 pack_image (GtkWidget *box,
3063 gtk_box_pack_start (GTK_BOX (box),
3064 gtk_label_new (text),
3067 gtk_box_pack_start (GTK_BOX (box),
3073 create_image (GtkWidget *widget)
3075 static GtkWidget *window = NULL;
3082 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3084 gtk_window_set_screen (GTK_WINDOW (window),
3085 gtk_widget_get_screen (widget));
3087 /* this is bogus for testing drawing when allocation < request,
3088 * don't copy into real code
3090 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
3092 g_signal_connect (window, "destroy",
3093 G_CALLBACK (gtk_widget_destroyed),
3096 vbox = gtk_vbox_new (FALSE, 5);
3098 gtk_container_add (GTK_CONTAINER (window), vbox);
3100 pack_image (vbox, "Stock Warning Dialog",
3101 gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
3102 GTK_ICON_SIZE_DIALOG));
3104 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
3106 pack_image (vbox, "Pixbuf",
3107 gtk_image_new_from_pixbuf (pixbuf));
3109 g_object_unref (pixbuf);
3112 if (!gtk_widget_get_visible (window))
3113 gtk_widget_show_all (window);
3115 gtk_widget_destroy (window);
3123 create_menu (GdkScreen *screen, gint depth, gint length, gboolean tearoff)
3126 GtkWidget *menuitem;
3135 menu = gtk_menu_new ();
3136 gtk_menu_set_screen (GTK_MENU (menu), screen);
3142 menuitem = gtk_tearoff_menu_item_new ();
3143 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3144 gtk_widget_show (menuitem);
3147 image = gtk_image_new_from_stock (GTK_STOCK_OPEN,
3148 GTK_ICON_SIZE_MENU);
3149 gtk_widget_show (image);
3150 menuitem = gtk_image_menu_item_new_with_label ("Image item");
3151 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3152 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3153 gtk_widget_show (menuitem);
3155 for (i = 0, j = 1; i < length; i++, j++)
3157 sprintf (buf, "item %2d - %d", depth, j);
3159 menuitem = gtk_radio_menu_item_new_with_label (group, buf);
3160 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
3162 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3163 gtk_widget_show (menuitem);
3165 gtk_widget_set_sensitive (menuitem, FALSE);
3168 gtk_check_menu_item_set_inconsistent (GTK_CHECK_MENU_ITEM (menuitem),
3172 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem),
3173 create_menu (screen, depth - 1, 5, TRUE));
3180 create_table_menu (GdkScreen *screen, gint cols, gint rows, gboolean tearoff)
3183 GtkWidget *menuitem;
3189 menu = gtk_menu_new ();
3190 gtk_menu_set_screen (GTK_MENU (menu), screen);
3195 menuitem = gtk_tearoff_menu_item_new ();
3196 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3197 gtk_widget_show (menuitem);
3201 menuitem = gtk_menu_item_new_with_label ("items");
3202 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3204 submenu = gtk_menu_new ();
3205 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3206 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3207 gtk_widget_show (menuitem);
3210 /* now fill the items submenu */
3211 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3212 GTK_ICON_SIZE_MENU);
3213 gtk_widget_show (image);
3214 menuitem = gtk_image_menu_item_new_with_label ("Image");
3215 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3216 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3217 gtk_widget_show (menuitem);
3219 menuitem = gtk_menu_item_new_with_label ("x");
3220 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 0, 1);
3221 gtk_widget_show (menuitem);
3223 menuitem = gtk_menu_item_new_with_label ("x");
3224 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 2);
3225 gtk_widget_show (menuitem);
3227 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3228 GTK_ICON_SIZE_MENU);
3229 gtk_widget_show (image);
3230 menuitem = gtk_image_menu_item_new_with_label ("Image");
3231 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3232 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3233 gtk_widget_show (menuitem);
3235 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3236 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 2, 3);
3237 gtk_widget_show (menuitem);
3239 menuitem = gtk_menu_item_new_with_label ("x");
3240 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 2, 3);
3241 gtk_widget_show (menuitem);
3243 menuitem = gtk_menu_item_new_with_label ("x");
3244 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 3, 4);
3245 gtk_widget_show (menuitem);
3247 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3248 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 3, 4);
3249 gtk_widget_show (menuitem);
3251 menuitem = gtk_check_menu_item_new_with_label ("Check");
3252 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 4, 5);
3253 gtk_widget_show (menuitem);
3255 menuitem = gtk_menu_item_new_with_label ("x");
3256 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 4, 5);
3257 gtk_widget_show (menuitem);
3259 menuitem = gtk_menu_item_new_with_label ("x");
3260 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 5, 6);
3261 gtk_widget_show (menuitem);
3263 menuitem = gtk_check_menu_item_new_with_label ("Check");
3264 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 5, 6);
3265 gtk_widget_show (menuitem);
3267 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3268 gtk_widget_show (menuitem);
3269 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 8);
3271 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3272 gtk_widget_show (menuitem);
3273 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 2);
3275 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3276 gtk_widget_show (menuitem);
3277 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 0);
3279 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3280 gtk_widget_show (menuitem);
3281 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, -1);
3283 /* end of items submenu */
3285 menuitem = gtk_menu_item_new_with_label ("spanning");
3286 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3288 submenu = gtk_menu_new ();
3289 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3290 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3291 gtk_widget_show (menuitem);
3294 /* now fill the spanning submenu */
3295 menuitem = gtk_menu_item_new_with_label ("a");
3296 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 2, 0, 1);
3297 gtk_widget_show (menuitem);
3299 menuitem = gtk_menu_item_new_with_label ("b");
3300 gtk_menu_attach (GTK_MENU (submenu), menuitem, 2, 3, 0, 2);
3301 gtk_widget_show (menuitem);
3303 menuitem = gtk_menu_item_new_with_label ("c");
3304 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 3);
3305 gtk_widget_show (menuitem);
3307 menuitem = gtk_menu_item_new_with_label ("d");
3308 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3309 gtk_widget_show (menuitem);
3311 menuitem = gtk_menu_item_new_with_label ("e");
3312 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 3, 2, 3);
3313 gtk_widget_show (menuitem);
3314 /* end of spanning submenu */
3316 menuitem = gtk_menu_item_new_with_label ("left");
3317 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, 1, j, j + 1);
3318 submenu = gtk_menu_new ();
3319 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3320 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3321 gtk_widget_show (menuitem);
3323 menuitem = gtk_menu_item_new_with_label ("Empty");
3324 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3325 submenu = gtk_menu_new ();
3326 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3327 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3328 gtk_widget_show (menuitem);
3330 menuitem = gtk_menu_item_new_with_label ("right");
3331 gtk_menu_attach (GTK_MENU (menu), menuitem, 1, 2, j, j + 1);
3332 submenu = gtk_menu_new ();
3333 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3334 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3335 gtk_widget_show (menuitem);
3337 menuitem = gtk_menu_item_new_with_label ("Empty");
3338 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3339 gtk_widget_show (menuitem);
3343 for (; j < rows; j++)
3344 for (i = 0; i < cols; i++)
3346 sprintf (buf, "(%d %d)", i, j);
3347 menuitem = gtk_menu_item_new_with_label (buf);
3348 gtk_menu_attach (GTK_MENU (menu), menuitem, i, i + 1, j, j + 1);
3349 gtk_widget_show (menuitem);
3352 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3353 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 8);
3354 gtk_widget_show (menuitem);
3355 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3356 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 2);
3357 gtk_widget_show (menuitem);
3358 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3359 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 0);
3360 gtk_widget_show (menuitem);
3361 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3362 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, -1);
3363 gtk_widget_show (menuitem);
3369 create_menus (GtkWidget *widget)
3371 static GtkWidget *window = NULL;
3375 GtkWidget *optionmenu;
3376 GtkWidget *separator;
3382 GtkWidget *menuitem;
3383 GtkAccelGroup *accel_group;
3385 GdkScreen *screen = gtk_widget_get_screen (widget);
3387 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3389 gtk_window_set_screen (GTK_WINDOW (window), screen);
3391 g_signal_connect (window, "destroy",
3392 G_CALLBACK (gtk_widget_destroyed),
3394 g_signal_connect (window, "delete-event",
3395 G_CALLBACK (gtk_true),
3398 accel_group = gtk_accel_group_new ();
3399 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3401 gtk_window_set_title (GTK_WINDOW (window), "menus");
3402 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3405 box1 = gtk_vbox_new (FALSE, 0);
3406 gtk_container_add (GTK_CONTAINER (window), box1);
3407 gtk_widget_show (box1);
3409 menubar = gtk_menu_bar_new ();
3410 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3411 gtk_widget_show (menubar);
3413 menu = create_menu (screen, 2, 50, TRUE);
3415 menuitem = gtk_menu_item_new_with_label ("test\nline2");
3416 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3417 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3418 gtk_widget_show (menuitem);
3420 menu = create_table_menu (screen, 2, 50, TRUE);
3422 menuitem = gtk_menu_item_new_with_label ("table");
3423 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3424 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3425 gtk_widget_show (menuitem);
3427 menuitem = gtk_menu_item_new_with_label ("foo");
3428 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5, TRUE));
3429 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3430 gtk_widget_show (menuitem);
3432 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3433 GTK_ICON_SIZE_MENU);
3434 gtk_widget_show (image);
3435 menuitem = gtk_image_menu_item_new_with_label ("Help");
3436 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3437 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 4, 5, TRUE));
3438 gtk_menu_item_set_right_justified (GTK_MENU_ITEM (menuitem), TRUE);
3439 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3440 gtk_widget_show (menuitem);
3442 menubar = gtk_menu_bar_new ();
3443 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3444 gtk_widget_show (menubar);
3446 menu = create_menu (screen, 2, 10, TRUE);
3448 menuitem = gtk_menu_item_new_with_label ("Second menu bar");
3449 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3450 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3451 gtk_widget_show (menuitem);
3453 box2 = gtk_vbox_new (FALSE, 10);
3454 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3455 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3456 gtk_widget_show (box2);
3458 menu = create_menu (screen, 1, 5, FALSE);
3459 gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
3461 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
3462 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3463 gtk_widget_show (menuitem);
3465 menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
3466 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3467 gtk_widget_show (menuitem);
3468 gtk_widget_add_accelerator (menuitem,
3474 menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
3475 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3476 gtk_widget_show (menuitem);
3477 gtk_widget_add_accelerator (menuitem,
3482 GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3483 menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
3484 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3485 gtk_widget_show (menuitem);
3486 gtk_widget_add_accelerator (menuitem,
3492 gtk_widget_add_accelerator (menuitem,
3499 optionmenu = gtk_combo_box_new_text ();
3500 gtk_combo_box_set_active (GTK_COMBO_BOX (optionmenu), 3);
3501 gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
3502 gtk_widget_show (optionmenu);
3504 separator = gtk_hseparator_new ();
3505 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3506 gtk_widget_show (separator);
3508 box2 = gtk_vbox_new (FALSE, 10);
3509 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3510 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3511 gtk_widget_show (box2);
3513 button = gtk_button_new_with_label ("close");
3514 g_signal_connect_swapped (button, "clicked",
3515 G_CALLBACK (gtk_widget_destroy),
3517 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3518 gtk_widget_set_can_default (button, TRUE);
3519 gtk_widget_grab_default (button);
3520 gtk_widget_show (button);
3523 if (!gtk_widget_get_visible (window))
3524 gtk_widget_show (window);
3526 gtk_widget_destroy (window);
3529 /* GdkPixbuf RGBA C-Source image dump */
3531 static const guint8 apple[] =
3533 /* Pixbuf magic (0x47646b50) */
3535 /* length: header (24) + pixel_data (2304) */
3537 /* pixdata_type (0x1010002) */
3539 /* rowstride (96) */
3546 "\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"
3547 "\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"
3548 "\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"
3549 "\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"
3550 "\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"
3551 "\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"
3552 "\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"
3553 "\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"
3554 "\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"
3555 "[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"
3556 "\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"
3557 "\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"
3558 "\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"
3559 "\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"
3560 "\0\0\0\0\0\0`l\\\20iw_\356y\211h\373x\207g\364~\216i\364u\204e\366gt"
3561 "_\374^jX\241A;-_\0\0\0~\0\0\0\0SM4)SM21B9&\22\320\270\204\1\320\270\204"
3562 "\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"
3563 "]\212r\200c\366v\205f\371jx_\323_kY\232_kZH^jY\26]iW\211@G9\272:6%j\220"
3564 "\211]\320\221\211`\377\212\203Z\377~xP\377mkE\331]^;|/0\37\21\0\0\0\0"
3565 "\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["
3566 "eT<\216\200Z\203\227\211_\354\234\217c\377\232\217b\362\232\220c\337"
3567 "\243\233k\377\252\241p\377\250\236p\377\241\225h\377\231\214_\377\210"
3568 "\202U\377srI\377[]:\355KO0U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0i"
3569 "v^\200`lY\211^jY\"\0\0\0\0\221\204\\\273\250\233r\377\302\267\224\377"
3570 "\311\300\237\377\272\256\204\377\271\256\177\377\271\257\200\377\267"
3571 "\260\177\377\260\251x\377\250\236l\377\242\225e\377\226\213]\377~zP\377"
3572 "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"
3573 "\0\213\203[v\253\240t\377\334\326\301\377\344\340\317\377\321\312\253"
3574 "\377\303\271\217\377\300\270\213\377\277\267\210\377\272\264\203\377"
3575 "\261\255z\377\250\242n\377\243\232h\377\232\220`\377\210\202V\377nnE"
3576 "\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"
3577 "\234\222e\362\304\274\232\377\337\333\306\377\332\325\273\377\311\302"
3578 "\232\377\312\303\236\377\301\273\216\377\300\271\212\377\270\264\200"
3579 "\377\256\253v\377\246\243n\377\236\232h\377\230\220`\377\213\203V\377"
3580 "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"
3581 "\203Zl\242\234l\377\321\315\260\377\331\324\271\377\320\313\251\377\307"
3582 "\301\232\377\303\276\224\377\300\272\214\377\274\267\206\377\264\260"
3583 "|\377\253\251s\377\244\243n\377\232\230e\377\223\216^\377\207\200U\377"
3584 "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"
3585 "\210\204Y\240\245\237o\377\316\310\253\377\310\303\237\377\304\300\230"
3586 "\377\303\277\225\377\277\272\216\377\274\270\210\377\266\263\200\377"
3587 "\256\254v\377\247\246p\377\237\236j\377\227\226d\377\215\212[\377\203"
3588 "\177T\377qsH\377X]8\377FN.\377DK-\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3589 "\0\0\0\0\207\204X\257\244\240o\377\300\275\231\377\301\275\226\377\274"
3590 "\270\213\377\274\270\214\377\267\264\205\377\264\262\200\377\260\256"
3591 "z\377\251\251s\377\243\244n\377\231\232g\377\220\222`\377\210\211Y\377"
3592 "|}Q\377hlC\377PU3\377CK,\377DL/Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3593 "\0\0\205\204X\220\232\230h\377\261\260\204\377\266\264\212\377\261\260"
3594 "\201\377\263\260\200\377\260\257}\377\256\256x\377\253\254t\377\244\246"
3595 "o\377\233\236i\377\221\224b\377\211\214\\\377\202\204V\377txM\377]b>"
3596 "\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>"
3597 "\215\215_\377\237\237r\377\247\247x\377\247\247t\377\252\252w\377\252"
3598 "\252u\377\252\253t\377\243\246o\377\235\240j\377\223\230c\377\213\217"
3599 "]\377\201\206V\377x}P\377gkD\377RY5\377BI,\377AI,\262\0\0\0\0\0\0\0\0"
3600 "\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"
3601 "\232g\377\234\236i\377\236\241l\377\241\244n\377\240\244m\377\232\237"
3602 "i\377\223\230c\377\212\221]\377\200\210W\377v|P\377jnG\377Za>\377HP2"
3603 "\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"
3604 "\0wzQ6\177\201U\371\206\211Z\377\216\222`\377\220\225a\377\220\225b\377"
3605 "\220\226a\377\213\221_\377\204\213Z\377{\203R\377ryN\377iqH\377^fA\377"
3606 "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"
3607 "\0\0\0\0\0\0\0\0\0\0\0\0ptJTw|Q\371z\177R\377}\202T\377|\203T\377z\200"
3608 "R\377v|O\377pwL\377jpF\377dlB\377`hB\377Yb@\377LT6\377<C*\377\11\12\6"
3609 "\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"
3610 "\0\0\0\0\0\0\0\0\0\0\\`=UgnE\370hnG\377gmE\377djB\377]d>\377[c<\377Y"
3611 "b<\377Zc>\377V_>\377OW8\377BK/\377\16\20\12\377\0\0\0\377\0\0\0\377\0"
3612 "\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"
3613 "\0\1\0\0\0\40\22\24\15\260@D+\377W`;\377OV5\377.3\36\377.3\37\377IP0"
3614 "\377RZ7\377PZ8\3776=&\377\14\15\10\377\0\0\0\377\0\0\0\377\0\0\0\377"
3615 "\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"
3616 "\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"
3617 "\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"
3618 "\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"
3619 "\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"
3620 "\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"
3621 "\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"
3622 "\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"
3623 "\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"
3624 "\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
3628 accel_button_new (GtkAccelGroup *accel_group,
3633 GdkModifierType modifiers;
3637 gtk_accelerator_parse (accel, &keyval, &modifiers);
3640 button = gtk_button_new ();
3641 gtk_widget_add_accelerator (button, "activate", accel_group,
3642 keyval, modifiers, GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3644 label = gtk_accel_label_new (text);
3645 gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), button);
3646 gtk_widget_show (label);
3648 gtk_container_add (GTK_CONTAINER (button), label);
3654 create_key_lookup (GtkWidget *widget)
3656 static GtkWidget *window = NULL;
3657 gpointer window_ptr;
3661 GtkAccelGroup *accel_group = gtk_accel_group_new ();
3663 GtkWidget *content_area;
3665 window = gtk_dialog_new_with_buttons ("Key Lookup", NULL, 0,
3666 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
3669 gtk_window_set_screen (GTK_WINDOW (window),
3670 gtk_widget_get_screen (widget));
3672 /* We have to expand it so the accel labels will draw their labels
3674 gtk_window_set_default_size (GTK_WINDOW (window), 300, -1);
3676 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3678 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
3680 button = gtk_button_new_with_mnemonic ("Button 1 (_a)");
3681 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3682 button = gtk_button_new_with_mnemonic ("Button 2 (_A)");
3683 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3684 button = gtk_button_new_with_mnemonic ("Button 3 (_\321\204)");
3685 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3686 button = gtk_button_new_with_mnemonic ("Button 4 (_\320\244)");
3687 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3688 button = gtk_button_new_with_mnemonic ("Button 6 (_b)");
3689 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3690 button = accel_button_new (accel_group, "Button 7", "<Alt><Shift>b");
3691 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3692 button = accel_button_new (accel_group, "Button 8", "<Alt>d");
3693 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3694 button = accel_button_new (accel_group, "Button 9", "<Alt>Cyrillic_ve");
3695 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3696 button = gtk_button_new_with_mnemonic ("Button 10 (_1)");
3697 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3698 button = gtk_button_new_with_mnemonic ("Button 11 (_!)");
3699 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3700 button = accel_button_new (accel_group, "Button 12", "<Super>a");
3701 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3702 button = accel_button_new (accel_group, "Button 13", "<Hyper>a");
3703 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3704 button = accel_button_new (accel_group, "Button 14", "<Meta>a");
3705 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3706 button = accel_button_new (accel_group, "Button 15", "<Shift><Mod4>b");
3707 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3709 window_ptr = &window;
3710 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
3711 g_signal_connect (window, "response", G_CALLBACK (gtk_object_destroy), NULL);
3713 gtk_widget_show_all (window);
3716 gtk_widget_destroy (window);
3725 cmw_destroy_cb(GtkWidget *widget)
3727 /* This is needed to get out of gtk_main */
3734 cmw_color (GtkWidget *widget, GtkWidget *parent)
3737 GtkWidget *colorsel;
3738 GtkWidget *ok_button, *cancel_button;
3740 csd = gtk_color_selection_dialog_new ("This is a modal color selection dialog");
3742 gtk_window_set_screen (GTK_WINDOW (csd), gtk_widget_get_screen (parent));
3744 colorsel = gtk_color_selection_dialog_get_color_selection (GTK_COLOR_SELECTION_DIALOG (csd));
3745 gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (colorsel),
3749 gtk_window_set_modal (GTK_WINDOW(csd),TRUE);
3751 /* And mark it as a transient dialog */
3752 gtk_window_set_transient_for (GTK_WINDOW (csd), GTK_WINDOW (parent));
3754 g_signal_connect (csd, "destroy",
3755 G_CALLBACK (cmw_destroy_cb), NULL);
3758 "ok-button", &ok_button,
3759 "cancel-button", &cancel_button,
3762 g_signal_connect_swapped (ok_button,
3763 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
3764 g_signal_connect_swapped (cancel_button,
3765 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
3767 /* wait until destroy calls gtk_main_quit */
3768 gtk_widget_show (csd);
3773 cmw_file (GtkWidget *widget, GtkWidget *parent)
3777 fs = gtk_file_chooser_dialog_new ("This is a modal file selection dialog",
3778 GTK_WINDOW (parent), GTK_FILE_CHOOSER_ACTION_OPEN,
3779 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
3780 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
3782 gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent));
3783 gtk_window_set_modal (GTK_WINDOW (fs), TRUE);
3785 g_signal_connect (fs, "destroy",
3786 G_CALLBACK (cmw_destroy_cb), NULL);
3787 g_signal_connect_swapped (fs, "response",
3788 G_CALLBACK (gtk_widget_destroy), fs);
3790 /* wait until destroy calls gtk_main_quit */
3791 gtk_widget_show (fs);
3797 create_modal_window (GtkWidget *widget)
3799 GtkWidget *window = NULL;
3800 GtkWidget *box1,*box2;
3802 GtkWidget *btnColor,*btnFile,*btnClose;
3804 /* Create modal window (Here you can use any window descendent )*/
3805 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3806 gtk_window_set_screen (GTK_WINDOW (window),
3807 gtk_widget_get_screen (widget));
3809 gtk_window_set_title (GTK_WINDOW(window),"This window is modal");
3811 /* Set window as modal */
3812 gtk_window_set_modal (GTK_WINDOW(window),TRUE);
3814 /* Create widgets */
3815 box1 = gtk_vbox_new (FALSE,5);
3816 frame1 = gtk_frame_new ("Standard dialogs in modal form");
3817 box2 = gtk_vbox_new (TRUE,5);
3818 btnColor = gtk_button_new_with_label ("Color");
3819 btnFile = gtk_button_new_with_label ("File Selection");
3820 btnClose = gtk_button_new_with_label ("Close");
3823 gtk_container_set_border_width (GTK_CONTAINER (box1), 3);
3824 gtk_container_set_border_width (GTK_CONTAINER (box2), 3);
3827 gtk_container_add (GTK_CONTAINER (window), box1);
3828 gtk_box_pack_start (GTK_BOX (box1), frame1, TRUE, TRUE, 4);
3829 gtk_container_add (GTK_CONTAINER (frame1), box2);
3830 gtk_box_pack_start (GTK_BOX (box2), btnColor, FALSE, FALSE, 4);
3831 gtk_box_pack_start (GTK_BOX (box2), btnFile, FALSE, FALSE, 4);
3832 gtk_box_pack_start (GTK_BOX (box1), gtk_hseparator_new (), FALSE, FALSE, 4);
3833 gtk_box_pack_start (GTK_BOX (box1), btnClose, FALSE, FALSE, 4);
3835 /* connect signals */
3836 g_signal_connect_swapped (btnClose, "clicked",
3837 G_CALLBACK (gtk_widget_destroy), window);
3839 g_signal_connect (window, "destroy",
3840 G_CALLBACK (cmw_destroy_cb), NULL);
3842 g_signal_connect (btnColor, "clicked",
3843 G_CALLBACK (cmw_color), window);
3844 g_signal_connect (btnFile, "clicked",
3845 G_CALLBACK (cmw_file), window);
3848 gtk_widget_show_all (window);
3850 /* wait until dialog get destroyed */
3859 make_message_dialog (GdkScreen *screen,
3861 GtkMessageType type,
3862 GtkButtonsType buttons,
3863 guint default_response)
3867 gtk_widget_destroy (*dialog);
3872 *dialog = gtk_message_dialog_new (NULL, 0, type, buttons,
3873 "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.)");
3875 gtk_window_set_screen (GTK_WINDOW (*dialog), screen);
3877 g_signal_connect_swapped (*dialog,
3879 G_CALLBACK (gtk_widget_destroy),
3882 g_signal_connect (*dialog,
3884 G_CALLBACK (gtk_widget_destroyed),
3887 gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
3889 gtk_widget_show (*dialog);
3893 create_message_dialog (GtkWidget *widget)
3895 static GtkWidget *info = NULL;
3896 static GtkWidget *warning = NULL;
3897 static GtkWidget *error = NULL;
3898 static GtkWidget *question = NULL;
3899 GdkScreen *screen = gtk_widget_get_screen (widget);
3901 make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK);
3902 make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE);
3903 make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK);
3904 make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_NO);
3911 static GtkWidget *sw_parent = NULL;
3912 static GtkWidget *sw_float_parent;
3913 static guint sw_destroyed_handler = 0;
3916 scrolled_windows_delete_cb (GtkWidget *widget, GdkEventAny *event, GtkWidget *scrollwin)
3918 gtk_widget_reparent (scrollwin, sw_parent);
3920 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
3921 sw_float_parent = NULL;
3923 sw_destroyed_handler = 0;
3929 scrolled_windows_destroy_cb (GtkWidget *widget, GtkWidget *scrollwin)
3931 gtk_widget_destroy (sw_float_parent);
3933 sw_float_parent = NULL;
3935 sw_destroyed_handler = 0;
3939 scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
3943 gtk_widget_reparent (scrollwin, sw_parent);
3944 gtk_widget_destroy (sw_float_parent);
3946 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
3947 sw_float_parent = NULL;
3949 sw_destroyed_handler = 0;
3953 sw_parent = gtk_widget_get_parent (scrollwin);
3954 sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3955 gtk_window_set_screen (GTK_WINDOW (sw_float_parent),
3956 gtk_widget_get_screen (widget));
3958 gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200);
3960 gtk_widget_reparent (scrollwin, sw_float_parent);
3961 gtk_widget_show (sw_float_parent);
3963 sw_destroyed_handler =
3964 g_signal_connect (sw_parent, "destroy",
3965 G_CALLBACK (scrolled_windows_destroy_cb), scrollwin);
3966 g_signal_connect (sw_float_parent, "delete_event",
3967 G_CALLBACK (scrolled_windows_delete_cb), scrollwin);
3972 create_scrolled_windows (GtkWidget *widget)
3974 static GtkWidget *window;
3975 GtkWidget *content_area, *action_area;
3976 GtkWidget *scrolled_window;
3984 window = gtk_dialog_new ();
3986 gtk_window_set_screen (GTK_WINDOW (window),
3987 gtk_widget_get_screen (widget));
3989 g_signal_connect (window, "destroy",
3990 G_CALLBACK (gtk_widget_destroyed),
3993 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
3994 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
3996 gtk_window_set_title (GTK_WINDOW (window), "dialog");
3997 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3999 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
4000 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
4001 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
4002 GTK_POLICY_AUTOMATIC,
4003 GTK_POLICY_AUTOMATIC);
4004 gtk_box_pack_start (GTK_BOX (content_area), scrolled_window, TRUE, TRUE, 0);
4005 gtk_widget_show (scrolled_window);
4007 table = gtk_table_new (20, 20, FALSE);
4008 gtk_table_set_row_spacings (GTK_TABLE (table), 10);
4009 gtk_table_set_col_spacings (GTK_TABLE (table), 10);
4010 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
4011 gtk_container_set_focus_hadjustment (GTK_CONTAINER (table),
4012 gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
4013 gtk_container_set_focus_vadjustment (GTK_CONTAINER (table),
4014 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
4015 gtk_widget_show (table);
4017 for (i = 0; i < 20; i++)
4018 for (j = 0; j < 20; j++)
4020 sprintf (buffer, "button (%d,%d)\n", i, j);
4021 button = gtk_toggle_button_new_with_label (buffer);
4022 gtk_table_attach_defaults (GTK_TABLE (table), button,
4024 gtk_widget_show (button);
4028 button = gtk_button_new_with_label ("Close");
4029 g_signal_connect_swapped (button, "clicked",
4030 G_CALLBACK (gtk_widget_destroy),
4032 gtk_widget_set_can_default (button, TRUE);
4033 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
4034 gtk_widget_grab_default (button);
4035 gtk_widget_show (button);
4037 button = gtk_button_new_with_label ("Reparent Out");
4038 g_signal_connect (button, "clicked",
4039 G_CALLBACK (scrolled_windows_remove),
4041 gtk_widget_set_can_default (button, TRUE);
4042 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
4043 gtk_widget_grab_default (button);
4044 gtk_widget_show (button);
4046 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
4049 if (!gtk_widget_get_visible (window))
4050 gtk_widget_show (window);
4052 gtk_widget_destroy (window);
4060 entry_toggle_frame (GtkWidget *checkbutton,
4063 gtk_entry_set_has_frame (GTK_ENTRY(entry),
4064 GTK_TOGGLE_BUTTON(checkbutton)->active);
4068 entry_toggle_sensitive (GtkWidget *checkbutton,
4071 gtk_widget_set_sensitive (entry, GTK_TOGGLE_BUTTON(checkbutton)->active);
4075 entry_progress_timeout (gpointer data)
4077 if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (data), "progress-pulse")))
4079 gtk_entry_progress_pulse (GTK_ENTRY (data));
4085 fraction = gtk_entry_get_progress_fraction (GTK_ENTRY (data));
4088 if (fraction > 1.0001)
4091 gtk_entry_set_progress_fraction (GTK_ENTRY (data), fraction);
4098 entry_remove_timeout (gpointer data)
4100 g_source_remove (GPOINTER_TO_UINT (data));
4104 entry_toggle_progress (GtkWidget *checkbutton,
4107 if (GTK_TOGGLE_BUTTON (checkbutton)->active)
4109 guint timeout = gdk_threads_add_timeout (100,
4110 entry_progress_timeout,
4112 g_object_set_data_full (G_OBJECT (entry), "timeout-id",
4113 GUINT_TO_POINTER (timeout),
4114 entry_remove_timeout);
4118 g_object_set_data (G_OBJECT (entry), "timeout-id",
4119 GUINT_TO_POINTER (0));
4121 gtk_entry_set_progress_fraction (GTK_ENTRY (entry), 0.0);
4126 entry_toggle_pulse (GtkWidget *checkbutton,
4129 g_object_set_data (G_OBJECT (entry), "progress-pulse",
4130 GUINT_TO_POINTER ((guint) GTK_TOGGLE_BUTTON (checkbutton)->active));
4134 props_clicked (GtkWidget *button,
4137 GtkWidget *window = create_prop_editor (object, 0);
4139 gtk_window_set_title (GTK_WINDOW (window), "Object Properties");
4143 create_entry (GtkWidget *widget)
4145 static GtkWidget *window = NULL;
4149 GtkWidget *has_frame_check;
4150 GtkWidget *sensitive_check;
4151 GtkWidget *progress_check;
4154 GtkWidget *cb_entry;
4156 GtkWidget *separator;
4160 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4161 gtk_window_set_screen (GTK_WINDOW (window),
4162 gtk_widget_get_screen (widget));
4164 g_signal_connect (window, "destroy",
4165 G_CALLBACK (gtk_widget_destroyed),
4168 gtk_window_set_title (GTK_WINDOW (window), "entry");
4169 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4172 box1 = gtk_vbox_new (FALSE, 0);
4173 gtk_container_add (GTK_CONTAINER (window), box1);
4176 box2 = gtk_vbox_new (FALSE, 10);
4177 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4178 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
4180 hbox = gtk_hbox_new (FALSE, 5);
4181 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
4183 entry = gtk_entry_new ();
4184 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");
4185 gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5);
4186 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
4188 button = gtk_button_new_with_mnemonic ("_Props");
4189 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
4190 g_signal_connect (button, "clicked",
4191 G_CALLBACK (props_clicked),
4194 cb = GTK_COMBO_BOX (gtk_combo_box_entry_new_text ());
4195 gtk_combo_box_append_text (cb, "item0");
4196 gtk_combo_box_append_text (cb, "item0");
4197 gtk_combo_box_append_text (cb, "item1 item1");
4198 gtk_combo_box_append_text (cb, "item2 item2 item2");
4199 gtk_combo_box_append_text (cb, "item3 item3 item3 item3");
4200 gtk_combo_box_append_text (cb, "item4 item4 item4 item4 item4");
4201 gtk_combo_box_append_text (cb, "item5 item5 item5 item5 item5 item5");
4202 gtk_combo_box_append_text (cb, "item6 item6 item6 item6 item6");
4203 gtk_combo_box_append_text (cb, "item7 item7 item7 item7");
4204 gtk_combo_box_append_text (cb, "item8 item8 item8");
4205 gtk_combo_box_append_text (cb, "item9 item9");
4207 cb_entry = gtk_bin_get_child (GTK_BIN (cb));
4208 gtk_entry_set_text (GTK_ENTRY (cb_entry), "hello world \n\n\n foo");
4209 gtk_editable_select_region (GTK_EDITABLE (cb_entry), 0, -1);
4210 gtk_box_pack_start (GTK_BOX (box2), GTK_WIDGET (cb), TRUE, TRUE, 0);
4212 sensitive_check = gtk_check_button_new_with_label("Sensitive");
4213 gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0);
4214 g_signal_connect (sensitive_check, "toggled",
4215 G_CALLBACK (entry_toggle_sensitive), entry);
4216 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sensitive_check), TRUE);
4218 has_frame_check = gtk_check_button_new_with_label("Has Frame");
4219 gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0);
4220 g_signal_connect (has_frame_check, "toggled",
4221 G_CALLBACK (entry_toggle_frame), entry);
4222 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
4224 progress_check = gtk_check_button_new_with_label("Show Progress");
4225 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4226 g_signal_connect (progress_check, "toggled",
4227 G_CALLBACK (entry_toggle_progress), entry);
4229 progress_check = gtk_check_button_new_with_label("Pulse Progress");
4230 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4231 g_signal_connect (progress_check, "toggled",
4232 G_CALLBACK (entry_toggle_pulse), entry);
4234 separator = gtk_hseparator_new ();
4235 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4237 box2 = gtk_vbox_new (FALSE, 10);
4238 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4239 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4241 button = gtk_button_new_with_label ("close");
4242 g_signal_connect_swapped (button, "clicked",
4243 G_CALLBACK (gtk_widget_destroy),
4245 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4246 gtk_widget_set_can_default (button, TRUE);
4247 gtk_widget_grab_default (button);
4250 if (!gtk_widget_get_visible (window))
4251 gtk_widget_show_all (window);
4253 gtk_widget_destroy (window);
4257 create_expander (GtkWidget *widget)
4260 GtkWidget *expander;
4262 static GtkWidget *window = NULL;
4266 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4267 gtk_window_set_screen (GTK_WINDOW (window),
4268 gtk_widget_get_screen (widget));
4270 g_signal_connect (window, "destroy",
4271 G_CALLBACK (gtk_widget_destroyed),
4274 gtk_window_set_title (GTK_WINDOW (window), "expander");
4275 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4277 box1 = gtk_vbox_new (FALSE, 0);
4278 gtk_container_add (GTK_CONTAINER (window), box1);
4280 expander = gtk_expander_new ("The Hidden");
4282 gtk_box_pack_start (GTK_BOX (box1), expander, TRUE, TRUE, 0);
4284 hidden = gtk_label_new ("Revealed!");
4286 gtk_container_add (GTK_CONTAINER (expander), hidden);
4289 if (!gtk_widget_get_visible (window))
4290 gtk_widget_show_all (window);
4292 gtk_widget_destroy (window);
4300 event_box_label_pressed (GtkWidget *widget,
4301 GdkEventButton *event,
4304 g_print ("clicked on event box\n");
4308 event_box_button_clicked (GtkWidget *widget,
4312 g_print ("pushed button\n");
4316 event_box_toggle_visible_window (GtkWidget *checkbutton,
4317 GtkEventBox *event_box)
4319 gtk_event_box_set_visible_window (event_box,
4320 GTK_TOGGLE_BUTTON(checkbutton)->active);
4324 event_box_toggle_above_child (GtkWidget *checkbutton,
4325 GtkEventBox *event_box)
4327 gtk_event_box_set_above_child (event_box,
4328 GTK_TOGGLE_BUTTON(checkbutton)->active);
4332 create_event_box (GtkWidget *widget)
4334 static GtkWidget *window = NULL;
4340 GtkWidget *separator;
4341 GtkWidget *event_box;
4343 GtkWidget *visible_window_check;
4344 GtkWidget *above_child_check;
4353 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4354 gtk_window_set_screen (GTK_WINDOW (window),
4355 gtk_widget_get_screen (widget));
4357 g_signal_connect (window, "destroy",
4358 G_CALLBACK (gtk_widget_destroyed),
4361 gtk_window_set_title (GTK_WINDOW (window), "event box");
4362 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4364 box1 = gtk_vbox_new (FALSE, 0);
4365 gtk_container_add (GTK_CONTAINER (window), box1);
4366 gtk_widget_modify_bg (window, GTK_STATE_NORMAL, &color);
4368 hbox = gtk_hbox_new (FALSE, 0);
4369 gtk_box_pack_start (GTK_BOX (box1), hbox, TRUE, FALSE, 0);
4371 event_box = gtk_event_box_new ();
4372 gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, FALSE, 0);
4374 vbox = gtk_vbox_new (FALSE, 0);
4375 gtk_container_add (GTK_CONTAINER (event_box), vbox);
4376 g_signal_connect (event_box, "button_press_event",
4377 G_CALLBACK (event_box_label_pressed),
4380 label = gtk_label_new ("Click on this label");
4381 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
4383 button = gtk_button_new_with_label ("button in eventbox");
4384 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, FALSE, 0);
4385 g_signal_connect (button, "clicked",
4386 G_CALLBACK (event_box_button_clicked),
4390 visible_window_check = gtk_check_button_new_with_label("Visible Window");
4391 gtk_box_pack_start (GTK_BOX (box1), visible_window_check, FALSE, TRUE, 0);
4392 g_signal_connect (visible_window_check, "toggled",
4393 G_CALLBACK (event_box_toggle_visible_window), event_box);
4394 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (visible_window_check), FALSE);
4396 above_child_check = gtk_check_button_new_with_label("Above Child");
4397 gtk_box_pack_start (GTK_BOX (box1), above_child_check, FALSE, TRUE, 0);
4398 g_signal_connect (above_child_check, "toggled",
4399 G_CALLBACK (event_box_toggle_above_child), event_box);
4400 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (above_child_check), FALSE);
4402 separator = gtk_hseparator_new ();
4403 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4405 box2 = gtk_vbox_new (FALSE, 10);
4406 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4407 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4409 button = gtk_button_new_with_label ("close");
4410 g_signal_connect_swapped (button, "clicked",
4411 G_CALLBACK (gtk_widget_destroy),
4413 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4414 gtk_widget_set_can_default (button, TRUE);
4415 gtk_widget_grab_default (button);
4418 if (!gtk_widget_get_visible (window))
4419 gtk_widget_show_all (window);
4421 gtk_widget_destroy (window);
4429 #define SIZE_GROUP_INITIAL_SIZE 50
4432 size_group_hsize_changed (GtkSpinButton *spin_button,
4435 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4436 gtk_spin_button_get_value_as_int (spin_button),
4441 size_group_vsize_changed (GtkSpinButton *spin_button,
4444 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4446 gtk_spin_button_get_value_as_int (spin_button));
4450 create_size_group_window (GdkScreen *screen,
4451 GtkSizeGroup *master_size_group)
4453 GtkWidget *content_area;
4456 GtkWidget *main_button;
4458 GtkWidget *spin_button;
4460 GtkSizeGroup *hgroup1;
4461 GtkSizeGroup *hgroup2;
4462 GtkSizeGroup *vgroup1;
4463 GtkSizeGroup *vgroup2;
4465 window = gtk_dialog_new_with_buttons ("GtkSizeGroup",
4471 gtk_window_set_screen (GTK_WINDOW (window), screen);
4473 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
4475 g_signal_connect (window, "response",
4476 G_CALLBACK (gtk_widget_destroy),
4479 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
4481 table = gtk_table_new (2, 2, FALSE);
4482 gtk_box_pack_start (GTK_BOX (content_area), table, TRUE, TRUE, 0);
4484 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
4485 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
4486 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
4487 gtk_widget_set_size_request (table, 250, 250);
4489 hgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4490 hgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4491 vgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4492 vgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4494 main_button = gtk_button_new_with_label ("X");
4496 gtk_table_attach (GTK_TABLE (table), main_button,
4498 GTK_EXPAND, GTK_EXPAND,
4500 gtk_size_group_add_widget (master_size_group, main_button);
4501 gtk_size_group_add_widget (hgroup1, main_button);
4502 gtk_size_group_add_widget (vgroup1, main_button);
4503 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (main_button)),
4504 SIZE_GROUP_INITIAL_SIZE,
4505 SIZE_GROUP_INITIAL_SIZE);
4507 button = gtk_button_new ();
4508 gtk_table_attach (GTK_TABLE (table), button,
4510 GTK_EXPAND, GTK_EXPAND,
4512 gtk_size_group_add_widget (vgroup1, button);
4513 gtk_size_group_add_widget (vgroup2, button);
4515 button = gtk_button_new ();
4516 gtk_table_attach (GTK_TABLE (table), button,
4518 GTK_EXPAND, GTK_EXPAND,
4520 gtk_size_group_add_widget (hgroup1, button);
4521 gtk_size_group_add_widget (hgroup2, button);
4523 button = gtk_button_new ();
4524 gtk_table_attach (GTK_TABLE (table), button,
4526 GTK_EXPAND, GTK_EXPAND,
4528 gtk_size_group_add_widget (hgroup2, button);
4529 gtk_size_group_add_widget (vgroup2, button);
4531 g_object_unref (hgroup1);
4532 g_object_unref (hgroup2);
4533 g_object_unref (vgroup1);
4534 g_object_unref (vgroup2);
4536 hbox = gtk_hbox_new (FALSE, 5);
4537 gtk_box_pack_start (GTK_BOX (content_area), hbox, FALSE, FALSE, 0);
4539 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4540 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4541 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4542 g_signal_connect (spin_button, "value_changed",
4543 G_CALLBACK (size_group_hsize_changed), main_button);
4545 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4546 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4547 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4548 g_signal_connect (spin_button, "value_changed",
4549 G_CALLBACK (size_group_vsize_changed), main_button);
4555 create_size_groups (GtkWidget *widget)
4557 static GtkWidget *window1 = NULL;
4558 static GtkWidget *window2 = NULL;
4559 static GtkSizeGroup *master_size_group;
4561 if (!master_size_group)
4562 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
4566 window1 = create_size_group_window (gtk_widget_get_screen (widget),
4569 g_signal_connect (window1, "destroy",
4570 G_CALLBACK (gtk_widget_destroyed),
4576 window2 = create_size_group_window (gtk_widget_get_screen (widget),
4579 g_signal_connect (window2, "destroy",
4580 G_CALLBACK (gtk_widget_destroyed),
4584 if (gtk_widget_get_visible (window1) && gtk_widget_get_visible (window2))
4586 gtk_widget_destroy (window1);
4587 gtk_widget_destroy (window2);
4591 if (!gtk_widget_get_visible (window1))
4592 gtk_widget_show_all (window1);
4593 if (!gtk_widget_get_visible (window2))
4594 gtk_widget_show_all (window2);
4602 static GtkWidget *spinner1;
4605 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
4607 gtk_spin_button_set_snap_to_ticks (spin, GTK_TOGGLE_BUTTON (widget)->active);
4611 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
4613 gtk_spin_button_set_numeric (spin, GTK_TOGGLE_BUTTON (widget)->active);
4617 change_digits (GtkWidget *widget, GtkSpinButton *spin)
4619 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
4620 gtk_spin_button_get_value_as_int (spin));
4624 get_value (GtkWidget *widget, gpointer data)
4628 GtkSpinButton *spin;
4630 spin = GTK_SPIN_BUTTON (spinner1);
4631 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
4632 if (GPOINTER_TO_INT (data) == 1)
4633 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
4635 sprintf (buf, "%0.*f",
4636 gtk_spin_button_get_digits (spin),
4637 gtk_spin_button_get_value (spin));
4639 gtk_label_set_text (label, buf);
4643 get_spin_value (GtkWidget *widget, gpointer data)
4647 GtkSpinButton *spin;
4649 spin = GTK_SPIN_BUTTON (widget);
4650 label = GTK_LABEL (data);
4652 buffer = g_strdup_printf ("%0.*f",
4653 gtk_spin_button_get_digits (spin),
4654 gtk_spin_button_get_value (spin));
4655 gtk_label_set_text (label, buffer);
4661 spin_button_time_output_func (GtkSpinButton *spin_button)
4663 GtkAdjustment *adjustment;
4664 static gchar buf[6];
4668 adjustment = gtk_spin_button_get_adjustment (spin_button);
4669 hours = gtk_adjustment_get_value (adjustment) / 60.0;
4670 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
4671 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
4672 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4673 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4678 spin_button_month_input_func (GtkSpinButton *spin_button,
4682 static gchar *month[12] = { "January", "February", "March", "April",
4683 "May", "June", "July", "August",
4684 "September", "October", "November", "December" };
4686 gboolean found = FALSE;
4688 for (i = 1; i <= 12; i++)
4690 tmp1 = g_ascii_strup (month[i - 1], -1);
4691 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
4692 if (strstr (tmp1, tmp2) == tmp1)
4702 return GTK_INPUT_ERROR;
4704 *new_val = (gdouble) i;
4709 spin_button_month_output_func (GtkSpinButton *spin_button)
4711 GtkAdjustment *adjustment;
4714 static gchar *month[12] = { "January", "February", "March", "April",
4715 "May", "June", "July", "August", "September",
4716 "October", "November", "December" };
4718 adjustment = gtk_spin_button_get_adjustment (spin_button);
4719 value = gtk_adjustment_get_value (adjustment);
4720 for (i = 1; i <= 12; i++)
4721 if (fabs (value - (double)i) < 1e-5)
4723 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
4724 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
4730 spin_button_hex_input_func (GtkSpinButton *spin_button,
4737 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
4738 res = strtol(buf, &err, 16);
4741 return GTK_INPUT_ERROR;
4747 spin_button_hex_output_func (GtkSpinButton *spin_button)
4749 GtkAdjustment *adjustment;
4750 static gchar buf[7];
4753 adjustment = gtk_spin_button_get_adjustment (spin_button);
4754 val = (gint) gtk_adjustment_get_value (adjustment);
4755 if (fabs (val) < 1e-5)
4756 sprintf (buf, "0x00");
4758 sprintf (buf, "0x%.2X", val);
4759 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4760 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4765 create_spins (GtkWidget *widget)
4767 static GtkWidget *window = NULL;
4770 GtkWidget *main_vbox;
4773 GtkWidget *spinner2;
4777 GtkWidget *val_label;
4782 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4783 gtk_window_set_screen (GTK_WINDOW (window),
4784 gtk_widget_get_screen (widget));
4786 g_signal_connect (window, "destroy",
4787 G_CALLBACK (gtk_widget_destroyed),
4790 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
4792 main_vbox = gtk_vbox_new (FALSE, 5);
4793 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
4794 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4796 frame = gtk_frame_new ("Not accelerated");
4797 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4799 vbox = gtk_vbox_new (FALSE, 0);
4800 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4801 gtk_container_add (GTK_CONTAINER (frame), vbox);
4803 /* Time, month, hex spinners */
4805 hbox = gtk_hbox_new (FALSE, 0);
4806 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
4808 vbox2 = gtk_vbox_new (FALSE, 0);
4809 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4811 label = gtk_label_new ("Time :");
4812 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4813 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4815 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
4816 spinner = gtk_spin_button_new (adj, 0, 0);
4817 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
4818 g_signal_connect (spinner,
4820 G_CALLBACK (spin_button_time_output_func),
4822 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4823 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 5);
4824 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4826 vbox2 = gtk_vbox_new (FALSE, 0);
4827 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4829 label = gtk_label_new ("Month :");
4830 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4831 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4833 adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
4835 spinner = gtk_spin_button_new (adj, 0, 0);
4836 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
4837 GTK_UPDATE_IF_VALID);
4838 g_signal_connect (spinner,
4840 G_CALLBACK (spin_button_month_input_func),
4842 g_signal_connect (spinner,
4844 G_CALLBACK (spin_button_month_output_func),
4846 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4847 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 9);
4848 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4850 vbox2 = gtk_vbox_new (FALSE, 0);
4851 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4853 label = gtk_label_new ("Hex :");
4854 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4855 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4857 adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 255, 1, 16, 0);
4858 spinner = gtk_spin_button_new (adj, 0, 0);
4859 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
4860 g_signal_connect (spinner,
4862 G_CALLBACK (spin_button_hex_input_func),
4864 g_signal_connect (spinner,
4866 G_CALLBACK (spin_button_hex_output_func),
4868 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4869 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 4);
4870 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4872 frame = gtk_frame_new ("Accelerated");
4873 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4875 vbox = gtk_vbox_new (FALSE, 0);
4876 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4877 gtk_container_add (GTK_CONTAINER (frame), vbox);
4879 hbox = gtk_hbox_new (FALSE, 0);
4880 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4882 vbox2 = gtk_vbox_new (FALSE, 0);
4883 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4885 label = gtk_label_new ("Value :");
4886 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4887 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4889 adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -10000.0, 10000.0,
4891 spinner1 = gtk_spin_button_new (adj, 1.0, 2);
4892 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
4893 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
4895 vbox2 = gtk_vbox_new (FALSE, 0);
4896 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4898 label = gtk_label_new ("Digits :");
4899 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4900 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4902 adj = (GtkAdjustment *) gtk_adjustment_new (2, 1, 15, 1, 1, 0);
4903 spinner2 = gtk_spin_button_new (adj, 0.0, 0);
4904 g_signal_connect (adj, "value_changed",
4905 G_CALLBACK (change_digits),
4907 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
4909 hbox = gtk_hbox_new (FALSE, 0);
4910 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
4912 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
4913 g_signal_connect (button, "clicked",
4914 G_CALLBACK (toggle_snap),
4916 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4917 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4919 button = gtk_check_button_new_with_label ("Numeric only input mode");
4920 g_signal_connect (button, "clicked",
4921 G_CALLBACK (toggle_numeric),
4923 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4924 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4926 val_label = gtk_label_new ("");
4928 hbox = gtk_hbox_new (FALSE, 0);
4929 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4931 button = gtk_button_new_with_label ("Value as Int");
4932 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4933 g_signal_connect (button, "clicked",
4934 G_CALLBACK (get_value),
4935 GINT_TO_POINTER (1));
4936 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4938 button = gtk_button_new_with_label ("Value as Float");
4939 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4940 g_signal_connect (button, "clicked",
4941 G_CALLBACK (get_value),
4942 GINT_TO_POINTER (2));
4943 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4945 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
4946 gtk_label_set_text (GTK_LABEL (val_label), "0");
4948 frame = gtk_frame_new ("Using Convenience Constructor");
4949 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4951 hbox = gtk_hbox_new (FALSE, 0);
4952 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4953 gtk_container_add (GTK_CONTAINER (frame), hbox);
4955 val_label = gtk_label_new ("0.0");
4957 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
4958 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
4959 g_signal_connect (spinner, "value_changed",
4960 G_CALLBACK (get_spin_value), val_label);
4961 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
4962 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
4964 hbox = gtk_hbox_new (FALSE, 0);
4965 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
4967 button = gtk_button_new_with_label ("Close");
4968 g_signal_connect_swapped (button, "clicked",
4969 G_CALLBACK (gtk_widget_destroy),
4971 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4974 if (!gtk_widget_get_visible (window))
4975 gtk_widget_show_all (window);
4977 gtk_widget_destroy (window);
4986 cursor_expose_event (GtkWidget *widget,
4990 GtkAllocation allocation;
4991 GtkDrawingArea *darea;
4992 GdkDrawable *drawable;
4997 g_return_val_if_fail (widget != NULL, TRUE);
4998 g_return_val_if_fail (GTK_IS_DRAWING_AREA (widget), TRUE);
5000 darea = GTK_DRAWING_AREA (widget);
5001 drawable = gtk_widget_get_window (widget);
5003 gtk_widget_get_allocation (widget, &allocation);
5004 max_width = allocation.width;
5005 max_height = allocation.height;
5007 cr = gdk_cairo_create (drawable);
5009 cairo_set_source_rgb (cr, 1, 1, 1);
5010 cairo_rectangle (cr, 0, 0, max_width, max_height / 2);
5013 cairo_set_source_rgb (cr, 0, 0, 0);
5014 cairo_rectangle (cr, 0, max_height / 2, max_width, max_height / 2);
5017 gdk_cairo_set_source_color (cr, >k_widget_get_style (widget)->bg[GTK_STATE_NORMAL]);
5018 cairo_rectangle (cr, max_width / 3, max_height / 3, max_width / 3, max_height / 3);
5027 set_cursor (GtkWidget *spinner,
5036 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
5039 label = g_object_get_data (G_OBJECT (spinner), "user_data");
5041 class = g_type_class_ref (GDK_TYPE_CURSOR_TYPE);
5042 vals = class->values;
5044 while (vals && vals->value != c)
5047 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
5049 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
5051 g_type_class_unref (class);
5053 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
5054 gdk_window_set_cursor (gtk_widget_get_window (widget),
5056 gdk_cursor_unref (cursor);
5060 cursor_event (GtkWidget *widget,
5062 GtkSpinButton *spinner)
5064 if ((event->type == GDK_BUTTON_PRESS) &&
5065 ((event->button.button == 1) ||
5066 (event->button.button == 3)))
5068 gtk_spin_button_spin (spinner, event->button.button == 1 ?
5069 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
5076 #ifdef GDK_WINDOWING_X11
5077 #include "x11/gdkx.h"
5080 change_cursor_theme (GtkWidget *widget,
5087 children = gtk_container_get_children (GTK_CONTAINER (data));
5089 theme = gtk_entry_get_text (GTK_ENTRY (children->next->data));
5090 size = (gint) gtk_spin_button_get_value (GTK_SPIN_BUTTON (children->next->next->data));
5092 g_list_free (children);
5094 gdk_x11_display_set_cursor_theme (gtk_widget_get_display (widget),
5101 create_cursors (GtkWidget *widget)
5103 static GtkWidget *window = NULL;
5106 GtkWidget *main_vbox;
5119 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5120 gtk_window_set_screen (GTK_WINDOW (window),
5121 gtk_widget_get_screen (widget));
5123 g_signal_connect (window, "destroy",
5124 G_CALLBACK (gtk_widget_destroyed),
5127 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
5129 main_vbox = gtk_vbox_new (FALSE, 5);
5130 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
5131 gtk_container_add (GTK_CONTAINER (window), main_vbox);
5134 g_object_new (gtk_vbox_get_type (),
5135 "GtkBox::homogeneous", FALSE,
5136 "GtkBox::spacing", 5,
5137 "GtkContainer::border_width", 10,
5138 "GtkWidget::parent", main_vbox,
5139 "GtkWidget::visible", TRUE,
5142 #ifdef GDK_WINDOWING_X11
5143 hbox = gtk_hbox_new (FALSE, 0);
5144 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5145 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5147 label = gtk_label_new ("Cursor Theme : ");
5148 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5149 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5151 entry = gtk_entry_new ();
5152 gtk_entry_set_text (GTK_ENTRY (entry), "default");
5153 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, TRUE, 0);
5155 size = gtk_spin_button_new_with_range (1.0, 64.0, 1.0);
5156 gtk_spin_button_set_value (GTK_SPIN_BUTTON (size), 24.0);
5157 gtk_box_pack_start (GTK_BOX (hbox), size, TRUE, TRUE, 0);
5159 g_signal_connect (entry, "changed",
5160 G_CALLBACK (change_cursor_theme), hbox);
5161 g_signal_connect (size, "changed",
5162 G_CALLBACK (change_cursor_theme), hbox);
5165 hbox = gtk_hbox_new (FALSE, 0);
5166 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5167 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5169 label = gtk_label_new ("Cursor Value : ");
5170 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5171 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5173 adj = (GtkAdjustment *) gtk_adjustment_new (0,
5177 spinner = gtk_spin_button_new (adj, 0, 0);
5178 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
5181 g_object_new (gtk_frame_get_type (),
5182 "GtkFrame::shadow", GTK_SHADOW_ETCHED_IN,
5183 "GtkFrame::label_xalign", 0.5,
5184 "GtkFrame::label", "Cursor Area",
5185 "GtkContainer::border_width", 10,
5186 "GtkWidget::parent", vbox,
5187 "GtkWidget::visible", TRUE,
5190 darea = gtk_drawing_area_new ();
5191 gtk_widget_set_size_request (darea, 80, 80);
5192 gtk_container_add (GTK_CONTAINER (frame), darea);
5193 g_signal_connect (darea,
5195 G_CALLBACK (cursor_expose_event),
5197 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
5198 g_signal_connect (darea,
5199 "button_press_event",
5200 G_CALLBACK (cursor_event),
5202 gtk_widget_show (darea);
5204 g_signal_connect (spinner, "changed",
5205 G_CALLBACK (set_cursor),
5208 label = g_object_new (GTK_TYPE_LABEL,
5213 gtk_container_child_set (GTK_CONTAINER (vbox), label,
5216 g_object_set_data (G_OBJECT (spinner), "user_data", label);
5219 g_object_new (gtk_hseparator_get_type (),
5220 "GtkWidget::visible", TRUE,
5222 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
5224 hbox = gtk_hbox_new (FALSE, 0);
5225 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
5226 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5228 button = gtk_button_new_with_label ("Close");
5229 g_signal_connect_swapped (button, "clicked",
5230 G_CALLBACK (gtk_widget_destroy),
5232 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5234 gtk_widget_show_all (window);
5236 set_cursor (spinner, darea);
5239 gtk_widget_destroy (window);
5247 color_selection_ok (GtkWidget *w,
5248 GtkColorSelectionDialog *cs)
5250 GtkWidget *colorsel;
5253 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5255 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5256 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5260 color_selection_changed (GtkWidget *w,
5261 GtkColorSelectionDialog *cs)
5263 GtkWidget *colorsel;
5266 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5267 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5268 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5273 opacity_toggled_cb (GtkWidget *w,
5274 GtkColorSelectionDialog *cs)
5276 GtkColorSelection *colorsel;
5278 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5279 gtk_color_selection_set_has_opacity_control (colorsel,
5280 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5284 palette_toggled_cb (GtkWidget *w,
5285 GtkColorSelectionDialog *cs)
5287 GtkColorSelection *colorsel;
5289 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5290 gtk_color_selection_set_has_palette (colorsel,
5291 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5296 create_color_selection (GtkWidget *widget)
5298 static GtkWidget *window = NULL;
5307 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5308 gtk_window_set_screen (GTK_WINDOW (window),
5309 gtk_widget_get_screen (widget));
5311 g_signal_connect (window, "destroy",
5312 G_CALLBACK (gtk_widget_destroyed),
5315 gtk_window_set_title (GTK_WINDOW (window), "GtkColorButton");
5316 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5318 hbox = gtk_hbox_new (FALSE, 8);
5319 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5320 gtk_container_add (GTK_CONTAINER (window), hbox);
5322 label = gtk_label_new ("Pick a color");
5323 gtk_container_add (GTK_CONTAINER (hbox), label);
5325 picker = gtk_color_button_new ();
5326 gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (picker), TRUE);
5327 gtk_container_add (GTK_CONTAINER (hbox), picker);
5329 button = gtk_button_new_with_mnemonic ("_Props");
5330 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
5331 g_signal_connect (button, "clicked",
5332 G_CALLBACK (props_clicked),
5336 if (!gtk_widget_get_visible (window))
5337 gtk_widget_show_all (window);
5339 gtk_widget_destroy (window);
5343 flipping_toggled_cb (GtkWidget *widget, gpointer data)
5345 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
5346 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
5348 gtk_widget_set_default_direction (new_direction);
5352 orientable_toggle_orientation (GtkOrientable *orientable)
5354 GtkOrientation orientation;
5356 orientation = gtk_orientable_get_orientation (orientable);
5357 gtk_orientable_set_orientation (orientable,
5358 orientation == GTK_ORIENTATION_HORIZONTAL ?
5359 GTK_ORIENTATION_VERTICAL :
5360 GTK_ORIENTATION_HORIZONTAL);
5362 if (GTK_IS_CONTAINER (orientable))
5367 children = gtk_container_get_children (GTK_CONTAINER (orientable));
5369 for (child = children; child; child = child->next)
5371 if (GTK_IS_ORIENTABLE (child->data))
5372 orientable_toggle_orientation (child->data);
5375 g_list_free (children);
5380 flipping_orientation_toggled_cb (GtkWidget *widget, gpointer data)
5382 GtkWidget *content_area;
5383 GtkWidget *toplevel;
5385 toplevel = gtk_widget_get_toplevel (widget);
5386 content_area = gtk_dialog_get_content_area (GTK_DIALOG (toplevel));
5387 orientable_toggle_orientation (GTK_ORIENTABLE (content_area));
5391 set_direction_recurse (GtkWidget *widget,
5394 GtkTextDirection *dir = data;
5396 gtk_widget_set_direction (widget, *dir);
5397 if (GTK_IS_CONTAINER (widget))
5398 gtk_container_foreach (GTK_CONTAINER (widget),
5399 set_direction_recurse,
5404 create_forward_back (const char *title,
5405 GtkTextDirection text_dir)
5407 GtkWidget *frame = gtk_frame_new (title);
5408 GtkWidget *bbox = gtk_hbutton_box_new ();
5409 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
5410 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
5412 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
5414 gtk_container_add (GTK_CONTAINER (frame), bbox);
5415 gtk_container_add (GTK_CONTAINER (bbox), back_button);
5416 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
5418 set_direction_recurse (frame, &text_dir);
5424 create_flipping (GtkWidget *widget)
5426 static GtkWidget *window = NULL;
5427 GtkWidget *check_button, *button;
5428 GtkWidget *action_area, *content_area;
5432 window = gtk_dialog_new ();
5434 gtk_window_set_screen (GTK_WINDOW (window),
5435 gtk_widget_get_screen (widget));
5437 g_signal_connect (window, "destroy",
5438 G_CALLBACK (gtk_widget_destroyed),
5441 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5442 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
5444 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
5446 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
5447 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5448 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5450 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
5451 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
5453 g_signal_connect (check_button, "toggled",
5454 G_CALLBACK (flipping_toggled_cb), NULL);
5456 check_button = gtk_check_button_new_with_label ("Toggle orientation of all boxes");
5457 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5458 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5460 g_signal_connect (check_button, "toggled",
5461 G_CALLBACK (flipping_orientation_toggled_cb), NULL);
5463 gtk_box_pack_start (GTK_BOX (content_area),
5464 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
5467 gtk_box_pack_start (GTK_BOX (content_area),
5468 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
5471 gtk_box_pack_start (GTK_BOX (content_area),
5472 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
5475 button = gtk_button_new_with_label ("Close");
5476 g_signal_connect_swapped (button, "clicked",
5477 G_CALLBACK (gtk_widget_destroy), window);
5478 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5481 if (!gtk_widget_get_visible (window))
5482 gtk_widget_show_all (window);
5484 gtk_widget_destroy (window);
5492 make_focus_table (GList **list)
5497 table = gtk_table_new (5, 5, FALSE);
5510 widget = gtk_entry_new ();
5512 widget = gtk_button_new_with_label ("Foo");
5514 *list = g_list_prepend (*list, widget);
5516 gtk_table_attach (GTK_TABLE (table),
5520 GTK_EXPAND | GTK_FILL,
5521 GTK_EXPAND | GTK_FILL,
5530 *list = g_list_reverse (*list);
5536 create_focus (GtkWidget *widget)
5538 static GtkWidget *window = NULL;
5542 GtkWidget *content_area;
5547 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
5553 gtk_window_set_screen (GTK_WINDOW (window),
5554 gtk_widget_get_screen (widget));
5556 g_signal_connect (window, "destroy",
5557 G_CALLBACK (gtk_widget_destroyed),
5560 g_signal_connect (window, "response",
5561 G_CALLBACK (gtk_widget_destroy),
5564 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5566 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
5568 frame = gtk_frame_new ("Weird tab focus chain");
5570 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5572 table = make_focus_table (&list);
5574 gtk_container_add (GTK_CONTAINER (frame), table);
5576 gtk_container_set_focus_chain (GTK_CONTAINER (table),
5581 frame = gtk_frame_new ("Default tab focus chain");
5583 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5586 table = make_focus_table (&list);
5590 gtk_container_add (GTK_CONTAINER (frame), table);
5593 if (!gtk_widget_get_visible (window))
5594 gtk_widget_show_all (window);
5596 gtk_widget_destroy (window);
5604 font_selection_ok (GtkWidget *w,
5605 GtkFontSelectionDialog *fs)
5607 gchar *s = gtk_font_selection_dialog_get_font_name (fs);
5609 g_print ("%s\n", s);
5611 gtk_widget_destroy (GTK_WIDGET (fs));
5615 create_font_selection (GtkWidget *widget)
5617 static GtkWidget *window = NULL;
5625 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5626 gtk_window_set_screen (GTK_WINDOW (window),
5627 gtk_widget_get_screen (widget));
5629 g_signal_connect (window, "destroy",
5630 G_CALLBACK (gtk_widget_destroyed),
5633 gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
5634 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5636 hbox = gtk_hbox_new (FALSE, 8);
5637 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5638 gtk_container_add (GTK_CONTAINER (window), hbox);
5640 label = gtk_label_new ("Pick a font");
5641 gtk_container_add (GTK_CONTAINER (hbox), label);
5643 picker = gtk_font_button_new ();
5644 gtk_font_button_set_use_font (GTK_FONT_BUTTON (picker), TRUE);
5645 gtk_container_add (GTK_CONTAINER (hbox), picker);
5648 if (!gtk_widget_get_visible (window))
5649 gtk_widget_show_all (window);
5651 gtk_widget_destroy (window);
5658 static GtkWidget *dialog_window = NULL;
5661 label_toggle (GtkWidget *widget,
5666 *label = gtk_label_new ("Dialog Test");
5667 g_signal_connect (*label,
5669 G_CALLBACK (gtk_widget_destroyed),
5671 gtk_misc_set_padding (GTK_MISC (*label), 10, 10);
5672 gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog_window))),
5673 *label, TRUE, TRUE, 0);
5674 gtk_widget_show (*label);
5677 gtk_widget_destroy (*label);
5681 create_dialog (GtkWidget *widget)
5683 static GtkWidget *label;
5684 GtkWidget *action_area;
5689 /* This is a terrible example; it's much simpler to create
5690 * dialogs than this. Don't use testgtk for example code,
5694 dialog_window = gtk_dialog_new ();
5695 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5696 gtk_widget_get_screen (widget));
5698 g_signal_connect (dialog_window, "destroy",
5699 G_CALLBACK (gtk_widget_destroyed),
5702 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5704 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
5705 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5707 button = gtk_button_new_with_label ("OK");
5708 gtk_widget_set_can_default (button, TRUE);
5709 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5710 gtk_widget_grab_default (button);
5711 gtk_widget_show (button);
5713 button = gtk_button_new_with_label ("Toggle");
5714 g_signal_connect (button, "clicked",
5715 G_CALLBACK (label_toggle),
5717 gtk_widget_set_can_default (button, TRUE);
5718 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5719 gtk_widget_show (button);
5724 if (!gtk_widget_get_visible (dialog_window))
5725 gtk_widget_show (dialog_window);
5727 gtk_widget_destroy (dialog_window);
5730 /* Display & Screen test
5737 GtkWidget *radio_dpy;
5738 GtkWidget *toplevel;
5739 GtkWidget *dialog_window;
5740 } ScreenDisplaySelection;
5743 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
5745 const gchar *display_name;
5746 GdkDisplay *display = gtk_widget_get_display (widget);
5748 GdkScreen *new_screen = NULL;
5749 GdkScreen *current_screen = gtk_widget_get_screen (widget);
5751 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
5753 display_name = gtk_entry_get_text (GTK_ENTRY (data->entry));
5754 display = gdk_display_open (display_name);
5758 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
5759 GTK_DIALOG_DESTROY_WITH_PARENT,
5762 "The display :\n%s\ncannot be opened",
5764 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
5765 gtk_widget_show (dialog);
5766 g_signal_connect (dialog, "response",
5767 G_CALLBACK (gtk_widget_destroy),
5772 GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (data->combo));
5775 gboolean found = FALSE;
5776 while (gtk_tree_model_iter_nth_child (model, &iter, NULL, i++))
5779 gtk_tree_model_get (model, &iter, 0, &name, -1);
5780 found = !g_ascii_strcasecmp (display_name, name);
5787 gtk_combo_box_append_text (GTK_COMBO_BOX (data->combo), display_name);
5788 new_screen = gdk_display_get_default_screen (display);
5793 gint number_of_screens = gdk_display_get_n_screens (display);
5794 gint screen_num = gdk_screen_get_number (current_screen);
5795 if ((screen_num +1) < number_of_screens)
5796 new_screen = gdk_display_get_screen (display, screen_num + 1);
5798 new_screen = gdk_display_get_screen (display, 0);
5803 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
5804 gtk_widget_destroy (data->dialog_window);
5809 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
5811 gtk_widget_destroy (data);
5815 create_display_screen (GtkWidget *widget)
5817 GtkWidget *table, *frame, *window, *combo_dpy, *vbox;
5818 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
5820 ScreenDisplaySelection *scr_dpy_data;
5821 GdkScreen *screen = gtk_widget_get_screen (widget);
5822 GdkDisplay *display = gdk_screen_get_display (screen);
5824 window = g_object_new (gtk_window_get_type (),
5827 "type", GTK_WINDOW_TOPLEVEL,
5829 "Screen or Display selection",
5830 "border_width", 10, NULL);
5831 g_signal_connect (window, "destroy",
5832 G_CALLBACK (gtk_widget_destroy), NULL);
5834 vbox = gtk_vbox_new (FALSE, 3);
5835 gtk_container_add (GTK_CONTAINER (window), vbox);
5837 frame = gtk_frame_new ("Select screen or display");
5838 gtk_container_add (GTK_CONTAINER (vbox), frame);
5840 table = gtk_table_new (2, 2, TRUE);
5841 gtk_table_set_row_spacings (GTK_TABLE (table), 3);
5842 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
5844 gtk_container_add (GTK_CONTAINER (frame), table);
5846 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
5847 if (gdk_display_get_n_screens(display) > 1)
5848 radio_scr = gtk_radio_button_new_with_label
5849 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
5852 radio_scr = gtk_radio_button_new_with_label
5853 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
5854 "only one screen on the current display");
5855 gtk_widget_set_sensitive (radio_scr, FALSE);
5857 combo_dpy = gtk_combo_box_new_text ();
5858 gtk_combo_box_append_text (GTK_COMBO_BOX (combo_dpy), "diabolo:0.0");
5859 gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (combo_dpy))),
5860 "<hostname>:<X Server Num>.<Screen Num>");
5862 gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1);
5863 gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2);
5864 gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1);
5866 bbox = gtk_hbutton_box_new ();
5867 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
5868 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
5870 gtk_container_add (GTK_CONTAINER (vbox), bbox);
5872 gtk_container_add (GTK_CONTAINER (bbox), applyb);
5873 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
5875 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
5877 scr_dpy_data->entry = gtk_bin_get_child (GTK_BIN (combo_dpy));
5878 scr_dpy_data->radio_dpy = radio_dpy;
5879 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
5880 scr_dpy_data->dialog_window = window;
5882 g_signal_connect (cancelb, "clicked",
5883 G_CALLBACK (screen_display_destroy_diag), window);
5884 g_signal_connect (applyb, "clicked",
5885 G_CALLBACK (screen_display_check), scr_dpy_data);
5886 gtk_widget_show_all (window);
5891 static gboolean event_watcher_enter_id = 0;
5892 static gboolean event_watcher_leave_id = 0;
5895 event_watcher (GSignalInvocationHint *ihint,
5896 guint n_param_values,
5897 const GValue *param_values,
5900 g_print ("Watch: \"%s\" emitted for %s\n",
5901 g_signal_name (ihint->signal_id),
5902 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
5908 event_watcher_down (void)
5910 if (event_watcher_enter_id)
5914 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5915 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
5916 event_watcher_enter_id = 0;
5917 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5918 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
5919 event_watcher_leave_id = 0;
5924 event_watcher_toggle (void)
5926 if (event_watcher_enter_id)
5927 event_watcher_down ();
5932 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5933 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5934 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5935 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5940 create_event_watcher (GtkWidget *widget)
5942 GtkWidget *action_area, *content_area;
5947 dialog_window = gtk_dialog_new ();
5948 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5949 gtk_widget_get_screen (widget));
5951 g_signal_connect (dialog_window, "destroy",
5952 G_CALLBACK (gtk_widget_destroyed),
5954 g_signal_connect (dialog_window, "destroy",
5955 G_CALLBACK (event_watcher_down),
5958 content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog_window));
5959 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5961 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
5962 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5963 gtk_widget_set_size_request (dialog_window, 200, 110);
5965 button = gtk_toggle_button_new_with_label ("Activate Watch");
5966 g_signal_connect (button, "clicked",
5967 G_CALLBACK (event_watcher_toggle),
5969 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
5970 gtk_box_pack_start (GTK_BOX (content_area), button, TRUE, TRUE, 0);
5971 gtk_widget_show (button);
5973 button = gtk_button_new_with_label ("Close");
5974 g_signal_connect_swapped (button, "clicked",
5975 G_CALLBACK (gtk_widget_destroy),
5977 gtk_widget_set_can_default (button, TRUE);
5978 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5979 gtk_widget_grab_default (button);
5980 gtk_widget_show (button);
5983 if (!gtk_widget_get_visible (dialog_window))
5984 gtk_widget_show (dialog_window);
5986 gtk_widget_destroy (dialog_window);
5994 reformat_value (GtkScale *scale,
5997 return g_strdup_printf ("-->%0.*g<--",
5998 gtk_scale_get_digits (scale), value);
6002 create_range_controls (GtkWidget *widget)
6004 static GtkWidget *window = NULL;
6008 GtkWidget *scrollbar;
6010 GtkWidget *separator;
6011 GtkObject *adjustment;
6016 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6018 gtk_window_set_screen (GTK_WINDOW (window),
6019 gtk_widget_get_screen (widget));
6021 g_signal_connect (window, "destroy",
6022 G_CALLBACK (gtk_widget_destroyed),
6025 gtk_window_set_title (GTK_WINDOW (window), "range controls");
6026 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6029 box1 = gtk_vbox_new (FALSE, 0);
6030 gtk_container_add (GTK_CONTAINER (window), box1);
6031 gtk_widget_show (box1);
6034 box2 = gtk_vbox_new (FALSE, 10);
6035 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6036 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
6037 gtk_widget_show (box2);
6040 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
6042 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
6043 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
6044 gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
6045 gtk_scale_set_digits (GTK_SCALE (scale), 1);
6046 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6047 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
6048 gtk_widget_show (scale);
6050 scrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT (adjustment));
6051 gtk_range_set_update_policy (GTK_RANGE (scrollbar),
6052 GTK_UPDATE_CONTINUOUS);
6053 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
6054 gtk_widget_show (scrollbar);
6056 scale = gtk_hscale_new (GTK_ADJUSTMENT (adjustment));
6057 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6058 g_signal_connect (scale,
6060 G_CALLBACK (reformat_value),
6062 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
6063 gtk_widget_show (scale);
6065 hbox = gtk_hbox_new (FALSE, 0);
6067 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6068 gtk_widget_set_size_request (scale, -1, 200);
6069 gtk_scale_set_digits (GTK_SCALE (scale), 2);
6070 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6071 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6072 gtk_widget_show (scale);
6074 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6075 gtk_widget_set_size_request (scale, -1, 200);
6076 gtk_scale_set_digits (GTK_SCALE (scale), 2);
6077 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6078 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
6079 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6080 gtk_widget_show (scale);
6082 scale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment));
6083 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
6084 g_signal_connect (scale,
6086 G_CALLBACK (reformat_value),
6088 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
6089 gtk_widget_show (scale);
6092 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
6093 gtk_widget_show (hbox);
6095 separator = gtk_hseparator_new ();
6096 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
6097 gtk_widget_show (separator);
6100 box2 = gtk_vbox_new (FALSE, 10);
6101 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6102 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6103 gtk_widget_show (box2);
6106 button = gtk_button_new_with_label ("close");
6107 g_signal_connect_swapped (button, "clicked",
6108 G_CALLBACK (gtk_widget_destroy),
6110 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6111 gtk_widget_set_can_default (button, TRUE);
6112 gtk_widget_grab_default (button);
6113 gtk_widget_show (button);
6116 if (!gtk_widget_get_visible (window))
6117 gtk_widget_show (window);
6119 gtk_widget_destroy (window);
6127 create_rulers (GtkWidget *widget)
6129 static GtkWidget *window = NULL;
6135 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6137 gtk_window_set_screen (GTK_WINDOW (window),
6138 gtk_widget_get_screen (widget));
6140 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
6142 g_signal_connect (window, "destroy",
6143 G_CALLBACK (gtk_widget_destroyed),
6146 gtk_window_set_title (GTK_WINDOW (window), "rulers");
6147 gtk_widget_set_size_request (window, 300, 300);
6148 gtk_widget_set_events (window,
6149 GDK_POINTER_MOTION_MASK
6150 | GDK_POINTER_MOTION_HINT_MASK);
6151 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6153 table = gtk_table_new (2, 2, FALSE);
6154 gtk_container_add (GTK_CONTAINER (window), table);
6155 gtk_widget_show (table);
6157 ruler = gtk_hruler_new ();
6158 gtk_ruler_set_metric (GTK_RULER (ruler), GTK_CENTIMETERS);
6159 gtk_ruler_set_range (GTK_RULER (ruler), 100, 0, 0, 20);
6161 g_signal_connect_swapped (window,
6162 "motion_notify_event",
6163 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
6166 gtk_table_attach (GTK_TABLE (table), ruler, 1, 2, 0, 1,
6167 GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0);
6168 gtk_widget_show (ruler);
6171 ruler = gtk_vruler_new ();
6172 gtk_ruler_set_range (GTK_RULER (ruler), 5, 15, 0, 20);
6174 g_signal_connect_swapped (window,
6175 "motion_notify_event",
6176 G_CALLBACK (GTK_WIDGET_GET_CLASS (ruler)->motion_notify_event),
6179 gtk_table_attach (GTK_TABLE (table), ruler, 0, 1, 1, 2,
6180 GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
6181 gtk_widget_show (ruler);
6184 if (!gtk_widget_get_visible (window))
6185 gtk_widget_show (window);
6187 gtk_widget_destroy (window);
6194 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
6195 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
6196 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
6197 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
6198 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
6199 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
6200 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
6201 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
6204 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
6210 static const char * book_open_xpm[] = {
6233 static const char * book_closed_xpm[] = {
6258 GdkPixbuf *book_open;
6259 GdkPixbuf *book_closed;
6260 GtkWidget *sample_notebook;
6263 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
6265 GtkWidget *page_widget;
6268 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
6270 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
6271 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6273 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
6274 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6278 page_switch (GtkWidget *widget, gpointer *page, gint page_num)
6280 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
6281 gint old_page_num = gtk_notebook_get_current_page (notebook);
6283 if (page_num == old_page_num)
6286 set_page_image (notebook, page_num, book_open);
6288 if (old_page_num != -1)
6289 set_page_image (notebook, old_page_num, book_closed);
6293 tab_fill (GtkToggleButton *button, GtkWidget *child)
6295 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
6296 "tab-fill", gtk_toggle_button_get_active (button),
6301 tab_expand (GtkToggleButton *button, GtkWidget *child)
6303 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
6304 "tab-expand", gtk_toggle_button_get_active (button),
6309 create_pages (GtkNotebook *notebook, gint start, gint end)
6311 GtkWidget *child = NULL;
6316 GtkWidget *label_box;
6317 GtkWidget *menu_box;
6321 char accel_buffer[32];
6323 for (i = start; i <= end; i++)
6325 sprintf (buffer, "Page %d", i);
6326 sprintf (accel_buffer, "Page _%d", i);
6328 child = gtk_frame_new (buffer);
6329 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
6331 vbox = gtk_vbox_new (TRUE,0);
6332 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
6333 gtk_container_add (GTK_CONTAINER (child), vbox);
6335 hbox = gtk_hbox_new (TRUE,0);
6336 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
6338 button = gtk_check_button_new_with_label ("Fill Tab");
6339 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6340 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
6341 g_signal_connect (button, "toggled",
6342 G_CALLBACK (tab_fill), child);
6344 button = gtk_check_button_new_with_label ("Expand Tab");
6345 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6346 g_signal_connect (button, "toggled",
6347 G_CALLBACK (tab_expand), child);
6349 button = gtk_button_new_with_label ("Hide Page");
6350 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
6351 g_signal_connect_swapped (button, "clicked",
6352 G_CALLBACK (gtk_widget_hide),
6355 gtk_widget_show_all (child);
6357 label_box = gtk_hbox_new (FALSE, 0);
6358 pixwid = gtk_image_new_from_pixbuf (book_closed);
6359 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
6361 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
6362 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6363 label = gtk_label_new_with_mnemonic (accel_buffer);
6364 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
6365 gtk_widget_show_all (label_box);
6368 menu_box = gtk_hbox_new (FALSE, 0);
6369 pixwid = gtk_image_new_from_pixbuf (book_closed);
6370 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
6372 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
6373 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6374 label = gtk_label_new (buffer);
6375 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
6376 gtk_widget_show_all (menu_box);
6378 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
6383 rotate_notebook (GtkButton *button,
6384 GtkNotebook *notebook)
6386 gtk_notebook_set_tab_pos (notebook, (gtk_notebook_get_tab_pos (notebook) + 1) % 4);
6390 show_all_pages (GtkButton *button,
6391 GtkNotebook *notebook)
6393 gtk_container_foreach (GTK_CONTAINER (notebook),
6394 (GtkCallback) gtk_widget_show, NULL);
6398 notebook_type_changed (GtkWidget *optionmenu,
6401 GtkNotebook *notebook;
6411 notebook = GTK_NOTEBOOK (data);
6413 c = gtk_combo_box_get_active (GTK_COMBO_BOX (optionmenu));
6418 /* standard notebook */
6419 gtk_notebook_set_show_tabs (notebook, TRUE);
6420 gtk_notebook_set_show_border (notebook, TRUE);
6421 gtk_notebook_set_scrollable (notebook, FALSE);
6425 /* notabs notebook */
6426 gtk_notebook_set_show_tabs (notebook, FALSE);
6427 gtk_notebook_set_show_border (notebook, TRUE);
6432 gtk_notebook_set_show_tabs (notebook, FALSE);
6433 gtk_notebook_set_show_border (notebook, FALSE);
6438 gtk_notebook_set_show_tabs (notebook, TRUE);
6439 gtk_notebook_set_show_border (notebook, TRUE);
6440 gtk_notebook_set_scrollable (notebook, TRUE);
6441 if (gtk_notebook_get_n_pages (notebook) == 5)
6442 create_pages (notebook, 6, 15);
6448 if (gtk_notebook_get_n_pages (notebook) == 15)
6449 for (i = 0; i < 10; i++)
6450 gtk_notebook_remove_page (notebook, 5);
6454 notebook_popup (GtkToggleButton *button,
6455 GtkNotebook *notebook)
6458 gtk_notebook_popup_enable (notebook);
6460 gtk_notebook_popup_disable (notebook);
6464 create_notebook (GtkWidget *widget)
6466 static GtkWidget *window = NULL;
6470 GtkWidget *separator;
6474 static gchar *items[] =
6484 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6485 gtk_window_set_screen (GTK_WINDOW (window),
6486 gtk_widget_get_screen (widget));
6488 g_signal_connect (window, "destroy",
6489 G_CALLBACK (gtk_widget_destroyed),
6492 gtk_window_set_title (GTK_WINDOW (window), "notebook");
6493 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6495 box1 = gtk_vbox_new (FALSE, 0);
6496 gtk_container_add (GTK_CONTAINER (window), box1);
6498 sample_notebook = gtk_notebook_new ();
6499 g_signal_connect (sample_notebook, "switch_page",
6500 G_CALLBACK (page_switch), NULL);
6501 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
6502 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
6503 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
6505 gtk_widget_realize (sample_notebook);
6508 book_open = gdk_pixbuf_new_from_xpm_data (book_open_xpm);
6511 book_closed = gdk_pixbuf_new_from_xpm_data (book_closed_xpm);
6513 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
6515 separator = gtk_hseparator_new ();
6516 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
6518 box2 = gtk_hbox_new (FALSE, 5);
6519 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6520 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6522 button = gtk_check_button_new_with_label ("popup menu");
6523 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
6524 g_signal_connect (button, "clicked",
6525 G_CALLBACK (notebook_popup),
6528 box2 = gtk_hbox_new (FALSE, 5);
6529 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6530 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6532 label = gtk_label_new ("Notebook Style :");
6533 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
6535 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
6536 notebook_type_changed,
6538 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
6540 button = gtk_button_new_with_label ("Show all Pages");
6541 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
6542 g_signal_connect (button, "clicked",
6543 G_CALLBACK (show_all_pages), sample_notebook);
6545 box2 = gtk_hbox_new (TRUE, 10);
6546 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6547 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6549 button = gtk_button_new_with_label ("prev");
6550 g_signal_connect_swapped (button, "clicked",
6551 G_CALLBACK (gtk_notebook_prev_page),
6553 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6555 button = gtk_button_new_with_label ("next");
6556 g_signal_connect_swapped (button, "clicked",
6557 G_CALLBACK (gtk_notebook_next_page),
6559 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6561 button = gtk_button_new_with_label ("rotate");
6562 g_signal_connect (button, "clicked",
6563 G_CALLBACK (rotate_notebook), sample_notebook);
6564 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6566 separator = gtk_hseparator_new ();
6567 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
6569 button = gtk_button_new_with_label ("close");
6570 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
6571 g_signal_connect_swapped (button, "clicked",
6572 G_CALLBACK (gtk_widget_destroy),
6574 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
6575 gtk_widget_set_can_default (button, TRUE);
6576 gtk_widget_grab_default (button);
6579 if (!gtk_widget_get_visible (window))
6580 gtk_widget_show_all (window);
6582 gtk_widget_destroy (window);
6590 toggle_resize (GtkWidget *widget, GtkWidget *child)
6592 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6593 GValue value = { 0, };
6594 g_value_init (&value, G_TYPE_BOOLEAN);
6595 gtk_container_child_get_property (container, child, "resize", &value);
6596 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6597 gtk_container_child_set_property (container, child, "resize", &value);
6601 toggle_shrink (GtkWidget *widget, GtkWidget *child)
6603 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6604 GValue value = { 0, };
6605 g_value_init (&value, G_TYPE_BOOLEAN);
6606 gtk_container_child_get_property (container, child, "shrink", &value);
6607 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6608 gtk_container_child_set_property (container, child, "shrink", &value);
6612 paned_props_clicked (GtkWidget *button,
6615 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
6617 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
6621 create_pane_options (GtkPaned *paned,
6622 const gchar *frame_label,
6623 const gchar *label1,
6624 const gchar *label2)
6626 GtkWidget *child1, *child2;
6631 GtkWidget *check_button;
6633 child1 = gtk_paned_get_child1 (paned);
6634 child2 = gtk_paned_get_child2 (paned);
6636 frame = gtk_frame_new (frame_label);
6637 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
6639 table = gtk_table_new (4, 2, 4);
6640 gtk_container_add (GTK_CONTAINER (frame), table);
6642 label = gtk_label_new (label1);
6643 gtk_table_attach_defaults (GTK_TABLE (table), label,
6646 check_button = gtk_check_button_new_with_label ("Resize");
6647 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6649 g_signal_connect (check_button, "toggled",
6650 G_CALLBACK (toggle_resize),
6653 check_button = gtk_check_button_new_with_label ("Shrink");
6654 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6656 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6658 g_signal_connect (check_button, "toggled",
6659 G_CALLBACK (toggle_shrink),
6662 label = gtk_label_new (label2);
6663 gtk_table_attach_defaults (GTK_TABLE (table), label,
6666 check_button = gtk_check_button_new_with_label ("Resize");
6667 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6669 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6671 g_signal_connect (check_button, "toggled",
6672 G_CALLBACK (toggle_resize),
6675 check_button = gtk_check_button_new_with_label ("Shrink");
6676 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6678 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6680 g_signal_connect (check_button, "toggled",
6681 G_CALLBACK (toggle_shrink),
6684 button = gtk_button_new_with_mnemonic ("_Properties");
6685 gtk_table_attach_defaults (GTK_TABLE (table), button,
6687 g_signal_connect (button, "clicked",
6688 G_CALLBACK (paned_props_clicked),
6695 create_panes (GtkWidget *widget)
6697 static GtkWidget *window = NULL;
6706 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6708 gtk_window_set_screen (GTK_WINDOW (window),
6709 gtk_widget_get_screen (widget));
6711 g_signal_connect (window, "destroy",
6712 G_CALLBACK (gtk_widget_destroyed),
6715 gtk_window_set_title (GTK_WINDOW (window), "Panes");
6716 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6718 vbox = gtk_vbox_new (FALSE, 0);
6719 gtk_container_add (GTK_CONTAINER (window), vbox);
6721 vpaned = gtk_vpaned_new ();
6722 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
6723 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
6725 hpaned = gtk_hpaned_new ();
6726 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
6728 frame = gtk_frame_new (NULL);
6729 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6730 gtk_widget_set_size_request (frame, 60, 60);
6731 gtk_paned_add1 (GTK_PANED (hpaned), frame);
6733 button = gtk_button_new_with_label ("Hi there");
6734 gtk_container_add (GTK_CONTAINER(frame), button);
6736 frame = gtk_frame_new (NULL);
6737 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6738 gtk_widget_set_size_request (frame, 80, 60);
6739 gtk_paned_add2 (GTK_PANED (hpaned), frame);
6741 frame = gtk_frame_new (NULL);
6742 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6743 gtk_widget_set_size_request (frame, 60, 80);
6744 gtk_paned_add2 (GTK_PANED (vpaned), frame);
6746 /* Now create toggle buttons to control sizing */
6748 gtk_box_pack_start (GTK_BOX (vbox),
6749 create_pane_options (GTK_PANED (hpaned),
6755 gtk_box_pack_start (GTK_BOX (vbox),
6756 create_pane_options (GTK_PANED (vpaned),
6762 gtk_widget_show_all (vbox);
6765 if (!gtk_widget_get_visible (window))
6766 gtk_widget_show (window);
6768 gtk_widget_destroy (window);
6772 * Paned keyboard navigation
6776 paned_keyboard_window1 (GtkWidget *widget)
6799 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6800 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
6801 gtk_window_set_screen (GTK_WINDOW (window1),
6802 gtk_widget_get_screen (widget));
6804 hpaned1 = gtk_hpaned_new ();
6805 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
6807 frame1 = gtk_frame_new (NULL);
6808 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
6809 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
6811 vbox1 = gtk_vbox_new (FALSE, 0);
6812 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
6814 button7 = gtk_button_new_with_label ("button7");
6815 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
6817 button8 = gtk_button_new_with_label ("button8");
6818 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
6820 button9 = gtk_button_new_with_label ("button9");
6821 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
6823 vpaned1 = gtk_vpaned_new ();
6824 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
6826 frame2 = gtk_frame_new (NULL);
6827 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
6828 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
6830 frame5 = gtk_frame_new (NULL);
6831 gtk_container_add (GTK_CONTAINER (frame2), frame5);
6833 hbox1 = gtk_hbox_new (FALSE, 0);
6834 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
6836 button5 = gtk_button_new_with_label ("button5");
6837 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
6839 button6 = gtk_button_new_with_label ("button6");
6840 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
6842 frame3 = gtk_frame_new (NULL);
6843 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
6844 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
6846 frame4 = gtk_frame_new ("Buttons");
6847 gtk_container_add (GTK_CONTAINER (frame3), frame4);
6848 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
6850 table1 = gtk_table_new (2, 2, FALSE);
6851 gtk_container_add (GTK_CONTAINER (frame4), table1);
6852 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
6854 button1 = gtk_button_new_with_label ("button1");
6855 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
6856 (GtkAttachOptions) (GTK_FILL),
6857 (GtkAttachOptions) (0), 0, 0);
6859 button2 = gtk_button_new_with_label ("button2");
6860 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
6861 (GtkAttachOptions) (GTK_FILL),
6862 (GtkAttachOptions) (0), 0, 0);
6864 button3 = gtk_button_new_with_label ("button3");
6865 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
6866 (GtkAttachOptions) (GTK_FILL),
6867 (GtkAttachOptions) (0), 0, 0);
6869 button4 = gtk_button_new_with_label ("button4");
6870 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
6871 (GtkAttachOptions) (GTK_FILL),
6872 (GtkAttachOptions) (0), 0, 0);
6878 paned_keyboard_window2 (GtkWidget *widget)
6883 GtkWidget *button13;
6887 GtkWidget *button12;
6889 GtkWidget *button11;
6890 GtkWidget *button10;
6892 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6893 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
6895 gtk_window_set_screen (GTK_WINDOW (window2),
6896 gtk_widget_get_screen (widget));
6898 hpaned2 = gtk_hpaned_new ();
6899 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
6901 frame6 = gtk_frame_new (NULL);
6902 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
6903 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
6905 button13 = gtk_button_new_with_label ("button13");
6906 gtk_container_add (GTK_CONTAINER (frame6), button13);
6908 hbox2 = gtk_hbox_new (FALSE, 0);
6909 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
6911 vpaned2 = gtk_vpaned_new ();
6912 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
6914 frame7 = gtk_frame_new (NULL);
6915 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
6916 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
6918 button12 = gtk_button_new_with_label ("button12");
6919 gtk_container_add (GTK_CONTAINER (frame7), button12);
6921 frame8 = gtk_frame_new (NULL);
6922 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
6923 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
6925 button11 = gtk_button_new_with_label ("button11");
6926 gtk_container_add (GTK_CONTAINER (frame8), button11);
6928 button10 = gtk_button_new_with_label ("button10");
6929 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
6935 paned_keyboard_window3 (GtkWidget *widget)
6942 GtkWidget *button14;
6945 GtkWidget *button15;
6948 GtkWidget *button16;
6950 GtkWidget *button17;
6952 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6953 g_object_set_data (G_OBJECT (window3), "window3", window3);
6954 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
6956 gtk_window_set_screen (GTK_WINDOW (window3),
6957 gtk_widget_get_screen (widget));
6960 vbox2 = gtk_vbox_new (FALSE, 0);
6961 gtk_container_add (GTK_CONTAINER (window3), vbox2);
6963 label1 = gtk_label_new ("Three panes nested inside each other");
6964 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
6966 hpaned3 = gtk_hpaned_new ();
6967 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
6969 frame9 = gtk_frame_new (NULL);
6970 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
6971 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
6973 button14 = gtk_button_new_with_label ("button14");
6974 gtk_container_add (GTK_CONTAINER (frame9), button14);
6976 hpaned4 = gtk_hpaned_new ();
6977 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
6979 frame10 = gtk_frame_new (NULL);
6980 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
6981 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
6983 button15 = gtk_button_new_with_label ("button15");
6984 gtk_container_add (GTK_CONTAINER (frame10), button15);
6986 hpaned5 = gtk_hpaned_new ();
6987 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
6989 frame11 = gtk_frame_new (NULL);
6990 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
6991 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
6993 button16 = gtk_button_new_with_label ("button16");
6994 gtk_container_add (GTK_CONTAINER (frame11), button16);
6996 frame12 = gtk_frame_new (NULL);
6997 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
6998 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
7000 button17 = gtk_button_new_with_label ("button17");
7001 gtk_container_add (GTK_CONTAINER (frame12), button17);
7007 paned_keyboard_window4 (GtkWidget *widget)
7014 GtkWidget *button19;
7015 GtkWidget *button18;
7018 GtkWidget *button21;
7019 GtkWidget *button20;
7021 GtkWidget *button23;
7022 GtkWidget *button22;
7024 GtkWidget *button25;
7025 GtkWidget *button24;
7027 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7028 g_object_set_data (G_OBJECT (window4), "window4", window4);
7029 gtk_window_set_title (GTK_WINDOW (window4), "window4");
7031 gtk_window_set_screen (GTK_WINDOW (window4),
7032 gtk_widget_get_screen (widget));
7034 vbox3 = gtk_vbox_new (FALSE, 0);
7035 gtk_container_add (GTK_CONTAINER (window4), vbox3);
7037 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
7038 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
7039 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
7041 hpaned6 = gtk_hpaned_new ();
7042 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
7044 vpaned3 = gtk_vpaned_new ();
7045 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
7047 button19 = gtk_button_new_with_label ("button19");
7048 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
7050 button18 = gtk_button_new_with_label ("button18");
7051 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
7053 hbox3 = gtk_hbox_new (FALSE, 0);
7054 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
7056 vpaned4 = gtk_vpaned_new ();
7057 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
7059 button21 = gtk_button_new_with_label ("button21");
7060 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
7062 button20 = gtk_button_new_with_label ("button20");
7063 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
7065 vpaned5 = gtk_vpaned_new ();
7066 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
7068 button23 = gtk_button_new_with_label ("button23");
7069 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
7071 button22 = gtk_button_new_with_label ("button22");
7072 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
7074 vpaned6 = gtk_vpaned_new ();
7075 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
7077 button25 = gtk_button_new_with_label ("button25");
7078 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
7080 button24 = gtk_button_new_with_label ("button24");
7081 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
7087 create_paned_keyboard_navigation (GtkWidget *widget)
7089 static GtkWidget *window1 = NULL;
7090 static GtkWidget *window2 = NULL;
7091 static GtkWidget *window3 = NULL;
7092 static GtkWidget *window4 = NULL;
7095 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
7097 gtk_widget_destroy (window1);
7098 gtk_widget_destroy (window2);
7099 gtk_widget_destroy (window3);
7100 gtk_widget_destroy (window4);
7105 window1 = paned_keyboard_window1 (widget);
7106 g_signal_connect (window1, "destroy",
7107 G_CALLBACK (gtk_widget_destroyed),
7113 window2 = paned_keyboard_window2 (widget);
7114 g_signal_connect (window2, "destroy",
7115 G_CALLBACK (gtk_widget_destroyed),
7121 window3 = paned_keyboard_window3 (widget);
7122 g_signal_connect (window3, "destroy",
7123 G_CALLBACK (gtk_widget_destroyed),
7129 window4 = paned_keyboard_window4 (widget);
7130 g_signal_connect (window4, "destroy",
7131 G_CALLBACK (gtk_widget_destroyed),
7135 if (gtk_widget_get_visible (window1))
7136 gtk_widget_destroy (GTK_WIDGET (window1));
7138 gtk_widget_show_all (GTK_WIDGET (window1));
7140 if (gtk_widget_get_visible (window2))
7141 gtk_widget_destroy (GTK_WIDGET (window2));
7143 gtk_widget_show_all (GTK_WIDGET (window2));
7145 if (gtk_widget_get_visible (window3))
7146 gtk_widget_destroy (GTK_WIDGET (window3));
7148 gtk_widget_show_all (GTK_WIDGET (window3));
7150 if (gtk_widget_get_visible (window4))
7151 gtk_widget_destroy (GTK_WIDGET (window4));
7153 gtk_widget_show_all (GTK_WIDGET (window4));
7161 typedef struct _cursoroffset {gint x,y;} CursorOffset;
7164 shape_pressed (GtkWidget *widget, GdkEventButton *event)
7168 /* ignore double and triple click */
7169 if (event->type != GDK_BUTTON_PRESS)
7172 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
7173 p->x = (int) event->x;
7174 p->y = (int) event->y;
7176 gtk_grab_add (widget);
7177 gdk_pointer_grab (gtk_widget_get_window (widget), TRUE,
7178 GDK_BUTTON_RELEASE_MASK |
7179 GDK_BUTTON_MOTION_MASK |
7180 GDK_POINTER_MOTION_HINT_MASK,
7185 shape_released (GtkWidget *widget)
7187 gtk_grab_remove (widget);
7188 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
7193 shape_motion (GtkWidget *widget,
7194 GdkEventMotion *event)
7198 GdkModifierType mask;
7200 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
7203 * Can't use event->x / event->y here
7204 * because I need absolute coordinates.
7206 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
7207 gtk_window_move (GTK_WINDOW (widget), xp - p->x, yp - p->y);
7211 shape_create_icon (GdkScreen *screen,
7222 CursorOffset* icon_pos;
7223 cairo_surface_t *mask;
7224 cairo_region_t *mask_region;
7229 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
7231 window = gtk_window_new (window_type);
7232 gtk_window_set_screen (GTK_WINDOW (window), screen);
7234 fixed = gtk_fixed_new ();
7235 gtk_widget_set_size_request (fixed, 100, 100);
7236 gtk_container_add (GTK_CONTAINER (window), fixed);
7237 gtk_widget_show (fixed);
7239 gtk_widget_set_events (window,
7240 gtk_widget_get_events (window) |
7241 GDK_BUTTON_MOTION_MASK |
7242 GDK_POINTER_MOTION_HINT_MASK |
7243 GDK_BUTTON_PRESS_MASK);
7245 gtk_widget_realize (window);
7247 pixbuf = gdk_pixbuf_new_from_file (xpm_file, NULL);
7248 g_assert (pixbuf); /* FIXME: error handling */
7250 mask = cairo_image_surface_create (CAIRO_FORMAT_A1,
7251 gdk_pixbuf_get_width (pixbuf),
7252 gdk_pixbuf_get_height (pixbuf));
7253 cr = cairo_create (mask);
7254 gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
7258 mask_region = gdk_cairo_region_create_from_surface (mask);
7260 cairo_region_translate (mask_region, px, py);
7262 image = gtk_image_new_from_pixbuf (pixbuf);
7263 gtk_fixed_put (GTK_FIXED (fixed), image, px,py);
7264 gtk_widget_show (image);
7266 gtk_widget_shape_combine_region (window, mask_region);
7268 cairo_region_destroy (mask_region);
7269 cairo_surface_destroy (mask);
7270 g_object_unref (pixbuf);
7272 g_signal_connect (window, "button_press_event",
7273 G_CALLBACK (shape_pressed), NULL);
7274 g_signal_connect (window, "button_release_event",
7275 G_CALLBACK (shape_released), NULL);
7276 g_signal_connect (window, "motion_notify_event",
7277 G_CALLBACK (shape_motion), NULL);
7279 icon_pos = g_new (CursorOffset, 1);
7280 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
7282 gtk_window_move (GTK_WINDOW (window), x, y);
7283 gtk_widget_show (window);
7289 create_shapes (GtkWidget *widget)
7291 /* Variables used by the Drag/Drop and Shape Window demos */
7292 static GtkWidget *modeller = NULL;
7293 static GtkWidget *sheets = NULL;
7294 static GtkWidget *rings = NULL;
7295 static GtkWidget *with_region = NULL;
7296 GdkScreen *screen = gtk_widget_get_screen (widget);
7298 if (!(file_exists ("Modeller.xpm") &&
7299 file_exists ("FilesQueue.xpm") &&
7300 file_exists ("3DRings.xpm")))
7306 modeller = shape_create_icon (screen, "Modeller.xpm",
7307 440, 140, 0,0, GTK_WINDOW_POPUP);
7309 g_signal_connect (modeller, "destroy",
7310 G_CALLBACK (gtk_widget_destroyed),
7314 gtk_widget_destroy (modeller);
7318 sheets = shape_create_icon (screen, "FilesQueue.xpm",
7319 580, 170, 0,0, GTK_WINDOW_POPUP);
7321 g_signal_connect (sheets, "destroy",
7322 G_CALLBACK (gtk_widget_destroyed),
7327 gtk_widget_destroy (sheets);
7331 rings = shape_create_icon (screen, "3DRings.xpm",
7332 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7334 g_signal_connect (rings, "destroy",
7335 G_CALLBACK (gtk_widget_destroyed),
7339 gtk_widget_destroy (rings);
7343 cairo_region_t *region;
7346 with_region = shape_create_icon (screen, "3DRings.xpm",
7347 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7349 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
7351 g_signal_connect (with_region, "destroy",
7352 G_CALLBACK (gtk_widget_destroyed),
7355 /* reset shape from mask to a region */
7358 region = cairo_region_create ();
7370 cairo_region_union_rectangle (region, &rect);
7378 gdk_window_shape_combine_region (gtk_widget_get_window (with_region),
7383 gtk_widget_destroy (with_region);
7391 create_wmhints (GtkWidget *widget)
7393 static GtkWidget *window = NULL;
7395 GtkWidget *separator;
7399 GdkWindow *gdk_window;
7405 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7407 gtk_window_set_screen (GTK_WINDOW (window),
7408 gtk_widget_get_screen (widget));
7410 g_signal_connect (window, "destroy",
7411 G_CALLBACK (gtk_widget_destroyed),
7414 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
7415 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7417 gtk_widget_realize (window);
7419 gdk_window = gtk_widget_get_window (window);
7421 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
7422 list = g_list_prepend (NULL, pixbuf);
7424 gdk_window_set_icon_list (gdk_window, list);
7427 g_object_unref (pixbuf);
7429 gdk_window_set_icon_name (gdk_window, "WMHints Test Icon");
7431 gdk_window_set_decorations (gdk_window, GDK_DECOR_ALL | GDK_DECOR_MENU);
7432 gdk_window_set_functions (gdk_window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
7434 box1 = gtk_vbox_new (FALSE, 0);
7435 gtk_container_add (GTK_CONTAINER (window), box1);
7436 gtk_widget_show (box1);
7438 label = gtk_label_new ("Try iconizing me!");
7439 gtk_widget_set_size_request (label, 150, 50);
7440 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
7441 gtk_widget_show (label);
7444 separator = gtk_hseparator_new ();
7445 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
7446 gtk_widget_show (separator);
7449 box2 = gtk_vbox_new (FALSE, 10);
7450 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7451 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7452 gtk_widget_show (box2);
7455 button = gtk_button_new_with_label ("close");
7457 g_signal_connect_swapped (button, "clicked",
7458 G_CALLBACK (gtk_widget_destroy),
7461 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7462 gtk_widget_set_can_default (button, TRUE);
7463 gtk_widget_grab_default (button);
7464 gtk_widget_show (button);
7467 if (!gtk_widget_get_visible (window))
7468 gtk_widget_show (window);
7470 gtk_widget_destroy (window);
7475 * Window state tracking
7479 window_state_callback (GtkWidget *widget,
7480 GdkEventWindowState *event,
7483 GtkWidget *label = data;
7486 msg = g_strconcat (gtk_window_get_title (GTK_WINDOW (widget)), ": ",
7487 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
7488 "withdrawn" : "not withdrawn", ", ",
7489 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
7490 "iconified" : "not iconified", ", ",
7491 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
7492 "sticky" : "not sticky", ", ",
7493 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
7494 "maximized" : "not maximized", ", ",
7495 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
7496 "fullscreen" : "not fullscreen",
7497 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
7498 "above" : "not above", ", ",
7499 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
7500 "below" : "not below", ", ",
7503 gtk_label_set_text (GTK_LABEL (label), msg);
7511 tracking_label (GtkWidget *window)
7517 hbox = gtk_hbox_new (FALSE, 5);
7519 g_signal_connect_object (hbox,
7521 G_CALLBACK (gtk_widget_destroy),
7525 label = gtk_label_new ("<no window state events received>");
7526 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
7527 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
7529 g_signal_connect (window,
7530 "window_state_event",
7531 G_CALLBACK (window_state_callback),
7534 button = gtk_button_new_with_label ("Deiconify");
7535 g_signal_connect_object (button,
7537 G_CALLBACK (gtk_window_deiconify),
7540 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7542 button = gtk_button_new_with_label ("Iconify");
7543 g_signal_connect_object (button,
7545 G_CALLBACK (gtk_window_iconify),
7548 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7550 button = gtk_button_new_with_label ("Fullscreen");
7551 g_signal_connect_object (button,
7553 G_CALLBACK (gtk_window_fullscreen),
7556 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7558 button = gtk_button_new_with_label ("Unfullscreen");
7559 g_signal_connect_object (button,
7561 G_CALLBACK (gtk_window_unfullscreen),
7564 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7566 button = gtk_button_new_with_label ("Present");
7567 g_signal_connect_object (button,
7569 G_CALLBACK (gtk_window_present),
7572 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7574 button = gtk_button_new_with_label ("Show");
7575 g_signal_connect_object (button,
7577 G_CALLBACK (gtk_widget_show),
7580 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7582 gtk_widget_show_all (hbox);
7588 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
7590 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7592 gtk_window_set_keep_above (GTK_WINDOW (data),
7593 gtk_toggle_button_get_active (togglebutton));
7595 if (gtk_toggle_button_get_active (togglebutton))
7596 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7600 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
7602 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7604 gtk_window_set_keep_below (GTK_WINDOW (data),
7605 gtk_toggle_button_get_active (togglebutton));
7607 if (gtk_toggle_button_get_active (togglebutton))
7608 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7613 get_state_controls (GtkWidget *window)
7617 GtkWidget *button_above;
7618 GtkWidget *button_below;
7620 vbox = gtk_vbox_new (FALSE, 0);
7622 button = gtk_button_new_with_label ("Stick");
7623 g_signal_connect_object (button,
7625 G_CALLBACK (gtk_window_stick),
7628 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7630 button = gtk_button_new_with_label ("Unstick");
7631 g_signal_connect_object (button,
7633 G_CALLBACK (gtk_window_unstick),
7636 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7638 button = gtk_button_new_with_label ("Maximize");
7639 g_signal_connect_object (button,
7641 G_CALLBACK (gtk_window_maximize),
7644 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7646 button = gtk_button_new_with_label ("Unmaximize");
7647 g_signal_connect_object (button,
7649 G_CALLBACK (gtk_window_unmaximize),
7652 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7654 button = gtk_button_new_with_label ("Iconify");
7655 g_signal_connect_object (button,
7657 G_CALLBACK (gtk_window_iconify),
7660 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7662 button = gtk_button_new_with_label ("Fullscreen");
7663 g_signal_connect_object (button,
7665 G_CALLBACK (gtk_window_fullscreen),
7668 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7670 button = gtk_button_new_with_label ("Unfullscreen");
7671 g_signal_connect_object (button,
7673 G_CALLBACK (gtk_window_unfullscreen),
7676 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7678 button_above = gtk_toggle_button_new_with_label ("Keep above");
7679 g_signal_connect (button_above,
7681 G_CALLBACK (keep_window_above),
7683 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
7685 button_below = gtk_toggle_button_new_with_label ("Keep below");
7686 g_signal_connect (button_below,
7688 G_CALLBACK (keep_window_below),
7690 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
7692 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
7693 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
7695 button = gtk_button_new_with_label ("Hide (withdraw)");
7696 g_signal_connect_object (button,
7698 G_CALLBACK (gtk_widget_hide),
7701 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7703 gtk_widget_show_all (vbox);
7709 create_window_states (GtkWidget *widget)
7711 static GtkWidget *window = NULL;
7714 GtkWidget *iconified;
7716 GtkWidget *controls;
7720 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7721 gtk_window_set_screen (GTK_WINDOW (window),
7722 gtk_widget_get_screen (widget));
7724 g_signal_connect (window, "destroy",
7725 G_CALLBACK (gtk_widget_destroyed),
7728 gtk_window_set_title (GTK_WINDOW (window), "Window states");
7730 box1 = gtk_vbox_new (FALSE, 0);
7731 gtk_container_add (GTK_CONTAINER (window), box1);
7733 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7735 gtk_window_set_screen (GTK_WINDOW (iconified),
7736 gtk_widget_get_screen (widget));
7738 g_signal_connect_object (iconified, "destroy",
7739 G_CALLBACK (gtk_widget_destroy),
7742 gtk_window_iconify (GTK_WINDOW (iconified));
7743 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
7744 controls = get_state_controls (iconified);
7745 gtk_container_add (GTK_CONTAINER (iconified), controls);
7747 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7749 gtk_window_set_screen (GTK_WINDOW (normal),
7750 gtk_widget_get_screen (widget));
7752 g_signal_connect_object (normal, "destroy",
7753 G_CALLBACK (gtk_widget_destroy),
7757 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
7758 controls = get_state_controls (normal);
7759 gtk_container_add (GTK_CONTAINER (normal), controls);
7761 label = tracking_label (iconified);
7762 gtk_container_add (GTK_CONTAINER (box1), label);
7764 label = tracking_label (normal);
7765 gtk_container_add (GTK_CONTAINER (box1), label);
7767 gtk_widget_show_all (iconified);
7768 gtk_widget_show_all (normal);
7769 gtk_widget_show_all (box1);
7772 if (!gtk_widget_get_visible (window))
7773 gtk_widget_show (window);
7775 gtk_widget_destroy (window);
7783 configure_event_callback (GtkWidget *widget,
7784 GdkEventConfigure *event,
7787 GtkWidget *label = data;
7791 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
7793 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
7795 event->x, event->y, event->width, event->height,
7798 gtk_label_set_text (GTK_LABEL (label), msg);
7806 get_ints (GtkWidget *window,
7813 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
7814 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
7816 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
7817 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
7821 set_size_callback (GtkWidget *widget,
7826 get_ints (data, &w, &h);
7828 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
7832 unset_default_size_callback (GtkWidget *widget,
7835 gtk_window_set_default_size (g_object_get_data (data, "target"),
7840 set_default_size_callback (GtkWidget *widget,
7845 get_ints (data, &w, &h);
7847 gtk_window_set_default_size (g_object_get_data (data, "target"),
7852 unset_size_request_callback (GtkWidget *widget,
7855 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7860 set_size_request_callback (GtkWidget *widget,
7865 get_ints (data, &w, &h);
7867 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7872 set_location_callback (GtkWidget *widget,
7877 get_ints (data, &x, &y);
7879 gtk_window_move (g_object_get_data (data, "target"), x, y);
7883 move_to_position_callback (GtkWidget *widget,
7889 window = g_object_get_data (data, "target");
7891 gtk_window_get_position (window, &x, &y);
7893 gtk_window_move (window, x, y);
7897 set_geometry_callback (GtkWidget *entry,
7903 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
7905 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
7907 if (!gtk_window_parse_geometry (target, text))
7908 g_print ("Bad geometry string '%s'\n", text);
7914 resizable_callback (GtkWidget *widget,
7917 g_object_set (g_object_get_data (data, "target"),
7918 "resizable", GTK_TOGGLE_BUTTON (widget)->active,
7923 gravity_selected (GtkWidget *widget,
7926 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
7927 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GDK_GRAVITY_NORTH_WEST);
7931 pos_selected (GtkWidget *widget,
7934 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
7935 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GTK_WIN_POS_NONE);
7939 move_gravity_window_to_current_position (GtkWidget *widget,
7945 window = GTK_WINDOW (data);
7947 gtk_window_get_position (window, &x, &y);
7949 gtk_window_move (window, x, y);
7953 get_screen_corner (GtkWindow *window,
7958 GdkScreen * screen = gtk_window_get_screen (window);
7960 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
7962 switch (gtk_window_get_gravity (window))
7964 case GDK_GRAVITY_SOUTH_EAST:
7965 *x = gdk_screen_get_width (screen) - w;
7966 *y = gdk_screen_get_height (screen) - h;
7969 case GDK_GRAVITY_NORTH_EAST:
7970 *x = gdk_screen_get_width (screen) - w;
7974 case GDK_GRAVITY_SOUTH_WEST:
7976 *y = gdk_screen_get_height (screen) - h;
7979 case GDK_GRAVITY_NORTH_WEST:
7984 case GDK_GRAVITY_SOUTH:
7985 *x = (gdk_screen_get_width (screen) - w) / 2;
7986 *y = gdk_screen_get_height (screen) - h;
7989 case GDK_GRAVITY_NORTH:
7990 *x = (gdk_screen_get_width (screen) - w) / 2;
7994 case GDK_GRAVITY_WEST:
7996 *y = (gdk_screen_get_height (screen) - h) / 2;
7999 case GDK_GRAVITY_EAST:
8000 *x = gdk_screen_get_width (screen) - w;
8001 *y = (gdk_screen_get_height (screen) - h) / 2;
8004 case GDK_GRAVITY_CENTER:
8005 *x = (gdk_screen_get_width (screen) - w) / 2;
8006 *y = (gdk_screen_get_height (screen) - h) / 2;
8009 case GDK_GRAVITY_STATIC:
8010 /* pick some random numbers */
8016 g_assert_not_reached ();
8022 move_gravity_window_to_starting_position (GtkWidget *widget,
8028 window = GTK_WINDOW (data);
8030 get_screen_corner (window,
8033 gtk_window_move (window, x, y);
8037 make_gravity_window (GtkWidget *destroy_with,
8046 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8048 gtk_window_set_screen (GTK_WINDOW (window),
8049 gtk_widget_get_screen (destroy_with));
8051 vbox = gtk_vbox_new (FALSE, 0);
8052 gtk_widget_show (vbox);
8054 gtk_container_add (GTK_CONTAINER (window), vbox);
8055 gtk_window_set_title (GTK_WINDOW (window), title);
8056 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
8058 g_signal_connect_object (destroy_with,
8060 G_CALLBACK (gtk_widget_destroy),
8065 button = gtk_button_new_with_mnemonic ("_Move to current position");
8067 g_signal_connect (button, "clicked",
8068 G_CALLBACK (move_gravity_window_to_current_position),
8071 gtk_container_add (GTK_CONTAINER (vbox), button);
8072 gtk_widget_show (button);
8074 button = gtk_button_new_with_mnemonic ("Move to _starting position");
8076 g_signal_connect (button, "clicked",
8077 G_CALLBACK (move_gravity_window_to_starting_position),
8080 gtk_container_add (GTK_CONTAINER (vbox), button);
8081 gtk_widget_show (button);
8083 /* Pretend this is the result of --geometry.
8084 * DO NOT COPY THIS CODE unless you are setting --geometry results,
8085 * and in that case you probably should just use gtk_window_parse_geometry().
8086 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
8087 * you are parsing --geometry or equivalent.
8089 gtk_window_set_geometry_hints (GTK_WINDOW (window),
8093 gtk_window_set_default_size (GTK_WINDOW (window),
8096 get_screen_corner (GTK_WINDOW (window), &x, &y);
8098 gtk_window_move (GTK_WINDOW (window),
8105 do_gravity_test (GtkWidget *widget,
8108 GtkWidget *destroy_with = data;
8111 /* We put a window at each gravity point on the screen. */
8112 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
8114 gtk_widget_show (window);
8116 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
8118 gtk_widget_show (window);
8120 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
8122 gtk_widget_show (window);
8124 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
8126 gtk_widget_show (window);
8128 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
8130 gtk_widget_show (window);
8132 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
8134 gtk_widget_show (window);
8137 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
8139 gtk_widget_show (window);
8142 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
8144 gtk_widget_show (window);
8146 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
8148 gtk_widget_show (window);
8150 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
8152 gtk_widget_show (window);
8156 window_controls (GtkWidget *window)
8158 GtkWidget *control_window;
8168 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8170 gtk_window_set_screen (GTK_WINDOW (control_window),
8171 gtk_widget_get_screen (window));
8173 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
8175 g_object_set_data (G_OBJECT (control_window),
8179 g_signal_connect_object (control_window,
8181 G_CALLBACK (gtk_widget_destroy),
8185 vbox = gtk_vbox_new (FALSE, 5);
8187 gtk_container_add (GTK_CONTAINER (control_window), vbox);
8189 label = gtk_label_new ("<no configure events>");
8190 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
8192 g_signal_connect (window,
8194 G_CALLBACK (configure_event_callback),
8197 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
8199 spin = gtk_spin_button_new (adj, 0, 0);
8201 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
8203 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
8205 adj = (GtkAdjustment *) gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0,
8207 spin = gtk_spin_button_new (adj, 0, 0);
8209 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
8211 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
8213 entry = gtk_entry_new ();
8214 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
8216 g_signal_connect (entry, "changed",
8217 G_CALLBACK (set_geometry_callback),
8220 button = gtk_button_new_with_label ("Show gravity test windows");
8221 g_signal_connect_swapped (button,
8223 G_CALLBACK (do_gravity_test),
8225 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8227 button = gtk_button_new_with_label ("Reshow with initial size");
8228 g_signal_connect_object (button,
8230 G_CALLBACK (gtk_window_reshow_with_initial_size),
8233 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8235 button = gtk_button_new_with_label ("Queue resize");
8236 g_signal_connect_object (button,
8238 G_CALLBACK (gtk_widget_queue_resize),
8241 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8243 button = gtk_button_new_with_label ("Resize");
8244 g_signal_connect (button,
8246 G_CALLBACK (set_size_callback),
8248 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8250 button = gtk_button_new_with_label ("Set default size");
8251 g_signal_connect (button,
8253 G_CALLBACK (set_default_size_callback),
8255 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8257 button = gtk_button_new_with_label ("Unset default size");
8258 g_signal_connect (button,
8260 G_CALLBACK (unset_default_size_callback),
8262 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8264 button = gtk_button_new_with_label ("Set size request");
8265 g_signal_connect (button,
8267 G_CALLBACK (set_size_request_callback),
8269 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8271 button = gtk_button_new_with_label ("Unset size request");
8272 g_signal_connect (button,
8274 G_CALLBACK (unset_size_request_callback),
8276 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8278 button = gtk_button_new_with_label ("Move");
8279 g_signal_connect (button,
8281 G_CALLBACK (set_location_callback),
8283 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8285 button = gtk_button_new_with_label ("Move to current position");
8286 g_signal_connect (button,
8288 G_CALLBACK (move_to_position_callback),
8290 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8292 button = gtk_check_button_new_with_label ("Allow resize");
8293 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
8294 g_signal_connect (button,
8296 G_CALLBACK (resizable_callback),
8298 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8300 button = gtk_button_new_with_mnemonic ("_Show");
8301 g_signal_connect_object (button,
8303 G_CALLBACK (gtk_widget_show),
8306 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8308 button = gtk_button_new_with_mnemonic ("_Hide");
8309 g_signal_connect_object (button,
8311 G_CALLBACK (gtk_widget_hide),
8314 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8316 om = gtk_combo_box_new_text ();
8320 static gchar *names[] = {
8321 "GDK_GRAVITY_NORTH_WEST",
8322 "GDK_GRAVITY_NORTH",
8323 "GDK_GRAVITY_NORTH_EAST",
8325 "GDK_GRAVITY_CENTER",
8327 "GDK_GRAVITY_SOUTH_WEST",
8328 "GDK_GRAVITY_SOUTH",
8329 "GDK_GRAVITY_SOUTH_EAST",
8330 "GDK_GRAVITY_STATIC",
8334 g_assert (names[i]);
8335 gtk_combo_box_append_text (GTK_COMBO_BOX (om), names[i]);
8340 g_signal_connect (om,
8342 G_CALLBACK (gravity_selected),
8345 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8348 om = gtk_combo_box_new_text ();
8352 static gchar *names[] = {
8354 "GTK_WIN_POS_CENTER",
8355 "GTK_WIN_POS_MOUSE",
8356 "GTK_WIN_POS_CENTER_ALWAYS",
8357 "GTK_WIN_POS_CENTER_ON_PARENT",
8361 g_assert (names[i]);
8362 gtk_combo_box_append_text (GTK_COMBO_BOX (om), names[i]);
8367 g_signal_connect (om,
8369 G_CALLBACK (pos_selected),
8372 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8374 gtk_widget_show_all (vbox);
8376 return control_window;
8380 create_window_sizing (GtkWidget *widget)
8382 static GtkWidget *window = NULL;
8383 static GtkWidget *target_window = NULL;
8389 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8390 gtk_window_set_screen (GTK_WINDOW (target_window),
8391 gtk_widget_get_screen (widget));
8392 label = gtk_label_new (NULL);
8393 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");
8394 gtk_container_add (GTK_CONTAINER (target_window), label);
8395 gtk_widget_show (label);
8397 g_signal_connect (target_window, "destroy",
8398 G_CALLBACK (gtk_widget_destroyed),
8401 window = window_controls (target_window);
8403 g_signal_connect (window, "destroy",
8404 G_CALLBACK (gtk_widget_destroyed),
8407 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
8410 /* don't show target window by default, we want to allow testing
8411 * of behavior on first show.
8414 if (!gtk_widget_get_visible (window))
8415 gtk_widget_show (window);
8417 gtk_widget_destroy (window);
8424 typedef struct _ProgressData {
8427 GtkWidget *block_spin;
8428 GtkWidget *x_align_spin;
8429 GtkWidget *y_align_spin;
8430 GtkWidget *step_spin;
8431 GtkWidget *act_blocks_spin;
8442 progress_timeout (gpointer data)
8444 ProgressData *pdata = data;
8448 if (pdata->activity)
8450 gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar));
8452 text = g_strdup_printf ("%s", "???");
8456 new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;
8459 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);
8461 text = g_strdup_printf ("%.0f%%", 100 * new_val);
8464 gtk_label_set_text (GTK_LABEL (pdata->label), text);
8471 destroy_progress (GtkWidget *widget,
8472 ProgressData **pdata)
8474 g_source_remove ((*pdata)->timer);
8475 (*pdata)->timer = 0;
8476 (*pdata)->window = NULL;
8482 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
8484 ProgressData *pdata;
8487 pdata = (ProgressData *) data;
8489 if (!gtk_widget_get_mapped (widget))
8492 i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8494 if (i == 0 || i == 1)
8495 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_HORIZONTAL);
8497 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_VERTICAL);
8499 if (i == 1 || i == 2)
8500 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), TRUE);
8502 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), FALSE);
8506 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
8510 active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8511 gtk_progress_bar_set_show_text (GTK_PROGRESS_BAR (pdata->pbar), active);
8515 progressbar_toggle_ellipsize (GtkWidget *widget,
8518 ProgressData *pdata = data;
8519 if (gtk_widget_is_drawable (widget))
8521 gint i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8522 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar), i);
8527 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
8529 pdata->activity = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8533 entry_changed (GtkWidget *widget, ProgressData *pdata)
8535 gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar),
8536 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
8540 create_progress_bar (GtkWidget *widget)
8542 GtkWidget *action_area, *content_area;
8552 static ProgressData *pdata = NULL;
8554 static gchar *items1[] =
8562 static char *ellipsize_items[] = {
8563 "None", // PANGO_ELLIPSIZE_NONE,
8564 "Start", // PANGO_ELLIPSIZE_START,
8565 "Middle", // PANGO_ELLIPSIZE_MIDDLE,
8566 "End", // PANGO_ELLIPSIZE_END
8570 pdata = g_new0 (ProgressData, 1);
8574 pdata->window = gtk_dialog_new ();
8576 gtk_window_set_screen (GTK_WINDOW (pdata->window),
8577 gtk_widget_get_screen (widget));
8579 gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);
8581 g_signal_connect (pdata->window, "destroy",
8582 G_CALLBACK (destroy_progress),
8586 content_area = gtk_dialog_get_content_area (GTK_DIALOG (pdata->window));
8587 action_area = gtk_dialog_get_action_area (GTK_DIALOG (pdata->window));
8589 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
8590 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
8592 vbox = gtk_vbox_new (FALSE, 5);
8593 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
8594 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, TRUE, 0);
8596 frame = gtk_frame_new ("Progress");
8597 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8599 vbox2 = gtk_vbox_new (FALSE, 5);
8600 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8602 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8603 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8605 pdata->pbar = gtk_progress_bar_new ();
8606 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar),
8607 PANGO_ELLIPSIZE_MIDDLE);
8609 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
8610 pdata->timer = g_timeout_add (100, (GSourceFunc)progress_timeout, pdata);
8612 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8613 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8615 hbox = gtk_hbox_new (FALSE, 5);
8616 gtk_container_add (GTK_CONTAINER (align), hbox);
8617 label = gtk_label_new ("Label updated by user :");
8618 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8619 pdata->label = gtk_label_new ("");
8620 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
8622 frame = gtk_frame_new ("Options");
8623 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8625 vbox2 = gtk_vbox_new (FALSE, 5);
8626 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8628 tab = gtk_table_new (7, 2, FALSE);
8629 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
8631 label = gtk_label_new ("Orientation :");
8632 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
8633 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8635 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
8637 pdata->omenu1 = build_option_menu (items1, 4, 0,
8638 progressbar_toggle_orientation,
8640 hbox = gtk_hbox_new (FALSE, 0);
8641 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
8642 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8644 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
8646 check = gtk_check_button_new_with_label ("Show text");
8647 g_signal_connect (check, "clicked",
8648 G_CALLBACK (toggle_show_text),
8650 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 1, 2,
8651 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8654 hbox = gtk_hbox_new (FALSE, 0);
8655 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 1, 2,
8656 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8659 label = gtk_label_new ("Text: ");
8660 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8662 pdata->entry = gtk_entry_new ();
8663 g_signal_connect (pdata->entry, "changed",
8664 G_CALLBACK (entry_changed),
8666 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
8667 gtk_widget_set_size_request (pdata->entry, 100, -1);
8669 label = gtk_label_new ("Ellipsize text :");
8670 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 10, 11,
8671 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8673 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
8674 pdata->elmenu = build_option_menu (ellipsize_items,
8675 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
8676 2, // PANGO_ELLIPSIZE_MIDDLE
8677 progressbar_toggle_ellipsize,
8679 hbox = gtk_hbox_new (FALSE, 0);
8680 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 10, 11,
8681 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8683 gtk_box_pack_start (GTK_BOX (hbox), pdata->elmenu, TRUE, TRUE, 0);
8685 check = gtk_check_button_new_with_label ("Activity mode");
8686 g_signal_connect (check, "clicked",
8687 G_CALLBACK (toggle_activity_mode), pdata);
8688 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 15, 16,
8689 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8692 button = gtk_button_new_with_label ("close");
8693 g_signal_connect_swapped (button, "clicked",
8694 G_CALLBACK (gtk_widget_destroy),
8696 gtk_widget_set_can_default (button, TRUE);
8697 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
8698 gtk_widget_grab_default (button);
8701 if (!gtk_widget_get_visible (pdata->window))
8702 gtk_widget_show_all (pdata->window);
8704 gtk_widget_destroy (pdata->window);
8716 GtkWidget *res_widget;
8720 find_widget (GtkWidget *widget, FindWidgetData *data)
8722 GtkAllocation new_allocation;
8726 gtk_widget_get_allocation (widget, &new_allocation);
8728 if (data->found || !gtk_widget_get_mapped (widget))
8731 /* Note that in the following code, we only count the
8732 * position as being inside a WINDOW widget if it is inside
8733 * widget->window; points that are outside of widget->window
8734 * but within the allocation are not counted. This is consistent
8735 * with the way we highlight drag targets.
8737 if (gtk_widget_get_has_window (widget))
8739 new_allocation.x = 0;
8740 new_allocation.y = 0;
8743 if (gtk_widget_get_parent (widget) && !data->first)
8745 GdkWindow *window = gtk_widget_get_window (widget);
8746 while (window != gtk_widget_get_window (gtk_widget_get_parent (widget)))
8748 gint tx, ty, twidth, theight;
8749 gdk_drawable_get_size (window, &twidth, &theight);
8751 if (new_allocation.x < 0)
8753 new_allocation.width += new_allocation.x;
8754 new_allocation.x = 0;
8756 if (new_allocation.y < 0)
8758 new_allocation.height += new_allocation.y;
8759 new_allocation.y = 0;
8761 if (new_allocation.x + new_allocation.width > twidth)
8762 new_allocation.width = twidth - new_allocation.x;
8763 if (new_allocation.y + new_allocation.height > theight)
8764 new_allocation.height = theight - new_allocation.y;
8766 gdk_window_get_position (window, &tx, &ty);
8767 new_allocation.x += tx;
8769 new_allocation.y += ty;
8772 window = gdk_window_get_parent (window);
8776 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
8777 (data->x < new_allocation.x + new_allocation.width) &&
8778 (data->y < new_allocation.y + new_allocation.height))
8780 /* First, check if the drag is in a valid drop site in
8781 * one of our children
8783 if (GTK_IS_CONTAINER (widget))
8785 FindWidgetData new_data = *data;
8787 new_data.x -= x_offset;
8788 new_data.y -= y_offset;
8789 new_data.found = FALSE;
8790 new_data.first = FALSE;
8792 gtk_container_forall (GTK_CONTAINER (widget),
8793 (GtkCallback)find_widget,
8796 data->found = new_data.found;
8798 data->res_widget = new_data.res_widget;
8801 /* If not, and this widget is registered as a drop site, check to
8802 * emit "drag_motion" to check if we are actually in
8808 data->res_widget = widget;
8814 find_widget_at_pointer (GdkDisplay *display)
8816 GtkWidget *widget = NULL;
8817 GdkWindow *pointer_window;
8819 FindWidgetData data;
8821 pointer_window = gdk_display_get_window_at_pointer (display, NULL, NULL);
8825 gpointer widget_ptr;
8827 gdk_window_get_user_data (pointer_window, &widget_ptr);
8828 widget = widget_ptr;
8833 gdk_window_get_pointer (gtk_widget_get_window (widget),
8841 find_widget (widget, &data);
8843 return data.res_widget;
8849 struct PropertiesData {
8857 destroy_properties (GtkWidget *widget,
8858 struct PropertiesData *data)
8862 *data->window = NULL;
8863 data->window = NULL;
8868 gdk_cursor_unref (data->cursor);
8869 data->cursor = NULL;
8874 g_signal_handler_disconnect (widget, data->handler);
8882 property_query_event (GtkWidget *widget,
8884 struct PropertiesData *data)
8886 GtkWidget *res_widget = NULL;
8888 if (!data->in_query)
8891 if (event->type == GDK_BUTTON_RELEASE)
8893 gtk_grab_remove (widget);
8894 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
8897 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
8900 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
8901 gtk_widget_get_screen (widget));
8902 create_prop_editor (G_OBJECT (res_widget), 0);
8905 data->in_query = FALSE;
8912 query_properties (GtkButton *button,
8913 struct PropertiesData *data)
8915 GtkWidget *widget = GTK_WIDGET (button);
8918 g_signal_connect (button, "event",
8919 G_CALLBACK (property_query_event), data);
8923 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget),
8926 failure = gdk_pointer_grab (gtk_widget_get_window (widget),
8928 GDK_BUTTON_RELEASE_MASK,
8933 gtk_grab_add (widget);
8935 data->in_query = TRUE;
8939 create_properties (GtkWidget *widget)
8941 static GtkWidget *window = NULL;
8945 struct PropertiesData *data;
8947 data = g_new (struct PropertiesData, 1);
8948 data->window = &window;
8949 data->in_query = FALSE;
8950 data->cursor = NULL;
8955 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8957 gtk_window_set_screen (GTK_WINDOW (window),
8958 gtk_widget_get_screen (widget));
8960 data->handler = g_signal_connect (window, "destroy",
8961 G_CALLBACK (destroy_properties),
8964 gtk_window_set_title (GTK_WINDOW (window), "test properties");
8965 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
8967 vbox = gtk_vbox_new (FALSE, 1);
8968 gtk_container_add (GTK_CONTAINER (window), vbox);
8970 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
8971 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
8973 button = gtk_button_new_with_label ("Query properties");
8974 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8975 g_signal_connect (button, "clicked",
8976 G_CALLBACK (query_properties),
8980 if (!gtk_widget_get_visible (window))
8981 gtk_widget_show_all (window);
8983 gtk_widget_destroy (window);
8992 selection_test_received (GtkWidget *tree_view,
8993 GtkSelectionData *data)
8995 GtkTreeModel *model;
8996 GtkListStore *store;
9000 if (data->length < 0)
9002 g_print ("Selection retrieval failed\n");
9005 if (data->type != GDK_SELECTION_TYPE_ATOM)
9007 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
9011 /* Clear out any current list items */
9013 model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
9014 store = GTK_LIST_STORE (model);
9015 gtk_list_store_clear (store);
9017 /* Add new items to list */
9019 atoms = (GdkAtom *)data->data;
9021 l = data->length / sizeof (GdkAtom);
9022 for (i = 0; i < l; i++)
9027 name = gdk_atom_name (atoms[i]);
9030 gtk_list_store_insert_with_values (store, &iter, i, 0, name, -1);
9034 gtk_list_store_insert_with_values (store, &iter, i, 0, "(bad atom)", -1);
9041 selection_test_get_targets (GtkWidget *widget, GtkWidget *tree_view)
9043 static GdkAtom targets_atom = GDK_NONE;
9045 if (targets_atom == GDK_NONE)
9046 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
9048 gtk_selection_convert (tree_view, GDK_SELECTION_PRIMARY, targets_atom,
9053 create_selection_test (GtkWidget *widget)
9055 static GtkWidget *window = NULL;
9056 GtkWidget *action_area, *content_area;
9059 GtkWidget *scrolled_win;
9060 GtkListStore* store;
9061 GtkWidget *tree_view;
9062 GtkTreeViewColumn *column;
9063 GtkCellRenderer *renderer;
9068 window = gtk_dialog_new ();
9070 gtk_window_set_screen (GTK_WINDOW (window),
9071 gtk_widget_get_screen (widget));
9073 g_signal_connect (window, "destroy",
9074 G_CALLBACK (gtk_widget_destroyed),
9077 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9078 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9080 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
9081 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9083 /* Create the list */
9085 vbox = gtk_vbox_new (FALSE, 5);
9086 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9087 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
9089 label = gtk_label_new ("Gets available targets for current selection");
9090 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9092 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
9093 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
9094 GTK_POLICY_AUTOMATIC,
9095 GTK_POLICY_AUTOMATIC);
9096 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
9097 gtk_widget_set_size_request (scrolled_win, 100, 200);
9099 store = gtk_list_store_new (1, G_TYPE_STRING);
9100 tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
9101 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), tree_view);
9103 renderer = gtk_cell_renderer_text_new ();
9104 column = gtk_tree_view_column_new_with_attributes ("Target", renderer,
9106 gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
9108 g_signal_connect (tree_view, "selection_received",
9109 G_CALLBACK (selection_test_received), NULL);
9111 /* .. And create some buttons */
9112 button = gtk_button_new_with_label ("Get Targets");
9113 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9115 g_signal_connect (button, "clicked",
9116 G_CALLBACK (selection_test_get_targets), tree_view);
9118 button = gtk_button_new_with_label ("Quit");
9119 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9121 g_signal_connect_swapped (button, "clicked",
9122 G_CALLBACK (gtk_widget_destroy),
9126 if (!gtk_widget_get_visible (window))
9127 gtk_widget_show_all (window);
9129 gtk_widget_destroy (window);
9136 static int scroll_test_pos = 0.0;
9139 scroll_test_expose (GtkWidget *widget, GdkEventExpose *event,
9144 gint imin, imax, jmin, jmax;
9147 imin = (event->area.x) / 10;
9148 imax = (event->area.x + event->area.width + 9) / 10;
9150 jmin = ((int)adj->value + event->area.y) / 10;
9151 jmax = ((int)adj->value + event->area.y + event->area.height + 9) / 10;
9153 window = gtk_widget_get_window (widget);
9155 gdk_window_clear_area (window,
9156 event->area.x, event->area.y,
9157 event->area.width, event->area.height);
9159 cr = gdk_cairo_create (window);
9161 for (i=imin; i<imax; i++)
9162 for (j=jmin; j<jmax; j++)
9164 cairo_rectangle (cr, 10*i, 10*j - (int)adj->value, 1+i%10, 1+j%10);
9174 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
9177 gdouble new_value = adj->value + ((event->direction == GDK_SCROLL_UP) ?
9178 -adj->page_increment / 2:
9179 adj->page_increment / 2);
9180 new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
9181 gtk_adjustment_set_value (adj, new_value);
9187 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
9190 GtkAllocation allocation;
9192 gtk_widget_get_allocation (widget, &allocation);
9193 adj->page_increment = 0.9 * allocation.height;
9194 adj->page_size = allocation.height;
9196 g_signal_emit_by_name (adj, "changed");
9200 scroll_test_adjustment_changed (GtkAdjustment *adj, GtkWidget *widget)
9205 dy = scroll_test_pos - (int)adj->value;
9206 scroll_test_pos = adj->value;
9208 if (!gtk_widget_is_drawable (widget))
9211 window = gtk_widget_get_window (widget);
9212 gdk_window_scroll (window, 0, dy);
9213 gdk_window_process_updates (window, FALSE);
9218 create_scroll_test (GtkWidget *widget)
9220 static GtkWidget *window = NULL;
9221 GtkWidget *action_area, *content_area;
9223 GtkWidget *drawing_area;
9224 GtkWidget *scrollbar;
9227 GdkGeometry geometry;
9228 GdkWindowHints geometry_mask;
9232 window = gtk_dialog_new ();
9234 gtk_window_set_screen (GTK_WINDOW (window),
9235 gtk_widget_get_screen (widget));
9237 g_signal_connect (window, "destroy",
9238 G_CALLBACK (gtk_widget_destroyed),
9241 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9242 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9244 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
9245 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9247 hbox = gtk_hbox_new (FALSE, 0);
9248 gtk_box_pack_start (GTK_BOX (content_area), hbox, TRUE, TRUE, 0);
9249 gtk_widget_show (hbox);
9251 drawing_area = gtk_drawing_area_new ();
9252 gtk_widget_set_size_request (drawing_area, 200, 200);
9253 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
9254 gtk_widget_show (drawing_area);
9256 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
9258 adj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0));
9259 scroll_test_pos = 0.0;
9261 scrollbar = gtk_vscrollbar_new (adj);
9262 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
9263 gtk_widget_show (scrollbar);
9265 g_signal_connect (drawing_area, "expose_event",
9266 G_CALLBACK (scroll_test_expose), adj);
9267 g_signal_connect (drawing_area, "configure_event",
9268 G_CALLBACK (scroll_test_configure), adj);
9269 g_signal_connect (drawing_area, "scroll_event",
9270 G_CALLBACK (scroll_test_scroll), adj);
9272 g_signal_connect (adj, "value_changed",
9273 G_CALLBACK (scroll_test_adjustment_changed),
9276 /* .. And create some buttons */
9278 button = gtk_button_new_with_label ("Quit");
9279 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9281 g_signal_connect_swapped (button, "clicked",
9282 G_CALLBACK (gtk_widget_destroy),
9284 gtk_widget_show (button);
9286 /* Set up gridded geometry */
9288 geometry_mask = GDK_HINT_MIN_SIZE |
9289 GDK_HINT_BASE_SIZE |
9290 GDK_HINT_RESIZE_INC;
9292 geometry.min_width = 20;
9293 geometry.min_height = 20;
9294 geometry.base_width = 0;
9295 geometry.base_height = 0;
9296 geometry.width_inc = 10;
9297 geometry.height_inc = 10;
9299 gtk_window_set_geometry_hints (GTK_WINDOW (window),
9300 drawing_area, &geometry, geometry_mask);
9303 if (!gtk_widget_get_visible (window))
9304 gtk_widget_show (window);
9306 gtk_widget_destroy (window);
9313 static int timer = 0;
9316 timeout_test (GtkWidget *label)
9318 static int count = 0;
9319 static char buffer[32];
9321 sprintf (buffer, "count: %d", ++count);
9322 gtk_label_set_text (GTK_LABEL (label), buffer);
9328 start_timeout_test (GtkWidget *widget,
9333 timer = g_timeout_add (100, (GSourceFunc)timeout_test, label);
9338 stop_timeout_test (GtkWidget *widget,
9343 g_source_remove (timer);
9349 destroy_timeout_test (GtkWidget *widget,
9352 stop_timeout_test (NULL, NULL);
9358 create_timeout_test (GtkWidget *widget)
9360 static GtkWidget *window = NULL;
9361 GtkWidget *action_area, *content_area;
9367 window = gtk_dialog_new ();
9369 gtk_window_set_screen (GTK_WINDOW (window),
9370 gtk_widget_get_screen (widget));
9372 g_signal_connect (window, "destroy",
9373 G_CALLBACK (destroy_timeout_test),
9376 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9377 action_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9379 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
9380 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9382 label = gtk_label_new ("count: 0");
9383 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
9384 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9385 gtk_widget_show (label);
9387 button = gtk_button_new_with_label ("close");
9388 g_signal_connect_swapped (button, "clicked",
9389 G_CALLBACK (gtk_widget_destroy),
9391 gtk_widget_set_can_default (button, TRUE);
9392 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9393 gtk_widget_grab_default (button);
9394 gtk_widget_show (button);
9396 button = gtk_button_new_with_label ("start");
9397 g_signal_connect (button, "clicked",
9398 G_CALLBACK(start_timeout_test),
9400 gtk_widget_set_can_default (button, TRUE);
9401 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9402 gtk_widget_show (button);
9404 button = gtk_button_new_with_label ("stop");
9405 g_signal_connect (button, "clicked",
9406 G_CALLBACK (stop_timeout_test),
9408 gtk_widget_set_can_default (button, TRUE);
9409 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9410 gtk_widget_show (button);
9413 if (!gtk_widget_get_visible (window))
9414 gtk_widget_show (window);
9416 gtk_widget_destroy (window);
9423 static int idle_id = 0;
9426 idle_test (GtkWidget *label)
9428 static int count = 0;
9429 static char buffer[32];
9431 sprintf (buffer, "count: %d", ++count);
9432 gtk_label_set_text (GTK_LABEL (label), buffer);
9438 start_idle_test (GtkWidget *widget,
9443 idle_id = g_idle_add ((GSourceFunc) idle_test, label);
9448 stop_idle_test (GtkWidget *widget,
9453 g_source_remove (idle_id);
9459 destroy_idle_test (GtkWidget *widget,
9462 stop_idle_test (NULL, NULL);
9468 toggle_idle_container (GObject *button,
9469 GtkContainer *container)
9471 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
9475 create_idle_test (GtkWidget *widget)
9477 static GtkWidget *window = NULL;
9480 GtkWidget *container;
9484 GtkWidget *action_area, *content_area;
9489 window = gtk_dialog_new ();
9491 gtk_window_set_screen (GTK_WINDOW (window),
9492 gtk_widget_get_screen (widget));
9494 g_signal_connect (window, "destroy",
9495 G_CALLBACK (destroy_idle_test),
9498 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9499 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9501 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
9502 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9504 label = gtk_label_new ("count: 0");
9505 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
9506 gtk_widget_show (label);
9509 g_object_new (GTK_TYPE_HBOX,
9511 /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
9512 * "GtkWidget::visible", TRUE,
9517 gtk_box_pack_start (GTK_BOX (content_area), container, TRUE, TRUE, 0);
9520 g_object_new (GTK_TYPE_FRAME,
9522 "label", "Label Container",
9524 "parent", content_area,
9527 g_object_new (GTK_TYPE_VBOX,
9532 g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
9533 "label", "Resize-Parent",
9534 "user_data", (void*)GTK_RESIZE_PARENT,
9538 "signal::clicked", toggle_idle_container, container,
9540 button = g_object_new (GTK_TYPE_RADIO_BUTTON,
9541 "label", "Resize-Queue",
9542 "user_data", (void*)GTK_RESIZE_QUEUE,
9547 g_object_connect (button,
9548 "signal::clicked", toggle_idle_container, container,
9550 button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
9551 "label", "Resize-Immediate",
9552 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
9554 g_object_connect (button2,
9555 "signal::clicked", toggle_idle_container, container,
9557 g_object_set (button2,
9563 button = gtk_button_new_with_label ("close");
9564 g_signal_connect_swapped (button, "clicked",
9565 G_CALLBACK (gtk_widget_destroy),
9567 gtk_widget_set_can_default (button, TRUE);
9568 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9569 gtk_widget_grab_default (button);
9570 gtk_widget_show (button);
9572 button = gtk_button_new_with_label ("start");
9573 g_signal_connect (button, "clicked",
9574 G_CALLBACK (start_idle_test),
9576 gtk_widget_set_can_default (button, TRUE);
9577 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9578 gtk_widget_show (button);
9580 button = gtk_button_new_with_label ("stop");
9581 g_signal_connect (button, "clicked",
9582 G_CALLBACK (stop_idle_test),
9584 gtk_widget_set_can_default (button, TRUE);
9585 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9586 gtk_widget_show (button);
9589 if (!gtk_widget_get_visible (window))
9590 gtk_widget_show (window);
9592 gtk_widget_destroy (window);
9600 reload_all_rc_files (void)
9602 static GdkAtom atom_rcfiles = GDK_NONE;
9604 GdkEvent *send_event = gdk_event_new (GDK_CLIENT_EVENT);
9608 atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
9610 for(i = 0; i < 5; i++)
9611 send_event->client.data.l[i] = 0;
9612 send_event->client.data_format = 32;
9613 send_event->client.message_type = atom_rcfiles;
9614 gdk_event_send_clientmessage_toall (send_event);
9616 gdk_event_free (send_event);
9620 create_rc_file (GtkWidget *widget)
9622 static GtkWidget *window = NULL;
9623 GtkWidget *action_area, *content_area;
9631 window = gtk_dialog_new ();
9633 gtk_window_set_screen (GTK_WINDOW (window),
9634 gtk_widget_get_screen (widget));
9636 g_signal_connect (window, "destroy",
9637 G_CALLBACK (gtk_widget_destroyed),
9640 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9641 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9643 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
9644 gtk_box_pack_start (GTK_BOX (content_area), frame, FALSE, FALSE, 0);
9646 vbox = gtk_vbox_new (FALSE, 0);
9647 gtk_container_add (GTK_CONTAINER (frame), vbox);
9649 label = gtk_label_new ("This label should be red");
9650 gtk_widget_set_name (label, "testgtk-red-label");
9651 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9653 label = gtk_label_new ("This label should be green");
9654 gtk_widget_set_name (label, "testgtk-green-label");
9655 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9657 label = gtk_label_new ("This label should be blue");
9658 gtk_widget_set_name (label, "testgtk-blue-label");
9659 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9661 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
9662 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9664 button = gtk_button_new_with_label ("Reload");
9665 g_signal_connect (button, "clicked",
9666 G_CALLBACK (gtk_rc_reparse_all), NULL);
9667 gtk_widget_set_can_default (button, TRUE);
9668 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9669 gtk_widget_grab_default (button);
9671 button = gtk_button_new_with_label ("Reload All");
9672 g_signal_connect (button, "clicked",
9673 G_CALLBACK (reload_all_rc_files), NULL);
9674 gtk_widget_set_can_default (button, TRUE);
9675 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9677 button = gtk_button_new_with_label ("Close");
9678 g_signal_connect_swapped (button, "clicked",
9679 G_CALLBACK (gtk_widget_destroy),
9681 gtk_widget_set_can_default (button, TRUE);
9682 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9685 if (!gtk_widget_get_visible (window))
9686 gtk_widget_show_all (window);
9688 gtk_widget_destroy (window);
9692 * Test of recursive mainloop
9696 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
9703 create_mainloop (GtkWidget *widget)
9705 static GtkWidget *window = NULL;
9706 GtkWidget *action_area, *content_area;
9712 window = gtk_dialog_new ();
9714 gtk_window_set_screen (GTK_WINDOW (window),
9715 gtk_widget_get_screen (widget));
9717 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
9719 g_signal_connect (window, "destroy",
9720 G_CALLBACK (mainloop_destroyed),
9723 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9724 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9726 label = gtk_label_new ("In recursive main loop...");
9727 gtk_misc_set_padding (GTK_MISC(label), 20, 20);
9729 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9730 gtk_widget_show (label);
9732 button = gtk_button_new_with_label ("Leave");
9733 gtk_box_pack_start (GTK_BOX (action_area), button, FALSE, TRUE, 0);
9735 g_signal_connect_swapped (button, "clicked",
9736 G_CALLBACK (gtk_widget_destroy),
9739 gtk_widget_set_can_default (button, TRUE);
9740 gtk_widget_grab_default (button);
9742 gtk_widget_show (button);
9745 if (!gtk_widget_get_visible (window))
9747 gtk_widget_show (window);
9749 g_print ("create_mainloop: start\n");
9751 g_print ("create_mainloop: done\n");
9754 gtk_widget_destroy (window);
9758 layout_expose_handler (GtkWidget *widget, GdkEventExpose *event)
9761 GdkWindow *bin_window;
9765 gint imin, imax, jmin, jmax;
9767 layout = GTK_LAYOUT (widget);
9768 bin_window = gtk_layout_get_bin_window (layout);
9770 if (event->window != bin_window)
9773 imin = (event->area.x) / 10;
9774 imax = (event->area.x + event->area.width + 9) / 10;
9776 jmin = (event->area.y) / 10;
9777 jmax = (event->area.y + event->area.height + 9) / 10;
9779 cr = gdk_cairo_create (bin_window);
9781 for (i=imin; i<imax; i++)
9782 for (j=jmin; j<jmax; j++)
9784 cairo_rectangle (cr,
9795 void create_layout (GtkWidget *widget)
9797 GtkAdjustment *hadjustment, *vadjustment;
9799 static GtkWidget *window = NULL;
9800 GtkWidget *layout_widget;
9801 GtkWidget *scrolledwindow;
9810 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9811 gtk_window_set_screen (GTK_WINDOW (window),
9812 gtk_widget_get_screen (widget));
9814 g_signal_connect (window, "destroy",
9815 G_CALLBACK (gtk_widget_destroyed),
9818 gtk_window_set_title (GTK_WINDOW (window), "Layout");
9819 gtk_widget_set_size_request (window, 200, 200);
9821 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
9822 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
9824 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
9825 GTK_CORNER_TOP_RIGHT);
9827 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
9829 layout_widget = gtk_layout_new (NULL, NULL);
9830 layout = GTK_LAYOUT (layout_widget);
9831 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout_widget);
9833 /* We set step sizes here since GtkLayout does not set
9836 hadjustment = gtk_layout_get_hadjustment (layout);
9837 vadjustment = gtk_layout_get_vadjustment (layout);
9838 gtk_adjustment_set_step_increment (hadjustment, 10.0);
9839 gtk_adjustment_set_step_increment (vadjustment, 10.0);
9840 gtk_layout_set_hadjustment (layout, hadjustment);
9841 gtk_layout_set_vadjustment (layout, vadjustment);
9843 gtk_widget_set_events (layout_widget, GDK_EXPOSURE_MASK);
9844 g_signal_connect (layout, "expose_event",
9845 G_CALLBACK (layout_expose_handler), NULL);
9847 gtk_layout_set_size (layout, 1600, 128000);
9849 for (i=0 ; i < 16 ; i++)
9850 for (j=0 ; j < 16 ; j++)
9852 sprintf(buf, "Button %d, %d", i, j);
9854 button = gtk_button_new_with_label (buf);
9856 button = gtk_label_new (buf);
9858 gtk_layout_put (layout, button, j*100, i*100);
9861 for (i=16; i < 1280; i++)
9863 sprintf(buf, "Button %d, %d", i, 0);
9865 button = gtk_button_new_with_label (buf);
9867 button = gtk_label_new (buf);
9869 gtk_layout_put (layout, button, 0, i*100);
9873 if (!gtk_widget_get_visible (window))
9874 gtk_widget_show_all (window);
9876 gtk_widget_destroy (window);
9880 create_styles (GtkWidget *widget)
9882 static GtkWidget *window = NULL;
9883 GtkWidget *content_area, *action_area;
9888 static GdkColor red = { 0, 0xffff, 0, 0 };
9889 static GdkColor green = { 0, 0, 0xffff, 0 };
9890 static GdkColor blue = { 0, 0, 0, 0xffff };
9891 static GdkColor yellow = { 0, 0xffff, 0xffff, 0 };
9892 static GdkColor cyan = { 0, 0 , 0xffff, 0xffff };
9893 PangoFontDescription *font_desc;
9895 GtkRcStyle *rc_style;
9899 window = gtk_dialog_new ();
9900 gtk_window_set_screen (GTK_WINDOW (window),
9901 gtk_widget_get_screen (widget));
9903 g_signal_connect (window, "destroy",
9904 G_CALLBACK (gtk_widget_destroyed),
9907 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9908 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9910 button = gtk_button_new_with_label ("Close");
9911 g_signal_connect_swapped (button, "clicked",
9912 G_CALLBACK (gtk_widget_destroy),
9914 gtk_widget_set_can_default (button, TRUE);
9915 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9916 gtk_widget_show (button);
9918 vbox = gtk_vbox_new (FALSE, 5);
9919 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9920 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, FALSE, 0);
9922 label = gtk_label_new ("Font:");
9923 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9924 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9926 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
9928 button = gtk_button_new_with_label ("Some Text");
9929 gtk_widget_modify_font (gtk_bin_get_child (GTK_BIN (button)),
9931 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9933 label = gtk_label_new ("Foreground:");
9934 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9935 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9937 button = gtk_button_new_with_label ("Some Text");
9938 gtk_widget_modify_fg (gtk_bin_get_child (GTK_BIN (button)),
9939 GTK_STATE_NORMAL, &red);
9940 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9942 label = gtk_label_new ("Background:");
9943 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9944 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9946 button = gtk_button_new_with_label ("Some Text");
9947 gtk_widget_modify_bg (button, GTK_STATE_NORMAL, &green);
9948 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9950 label = gtk_label_new ("Text:");
9951 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9952 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9954 entry = gtk_entry_new ();
9955 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9956 gtk_widget_modify_text (entry, GTK_STATE_NORMAL, &blue);
9957 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9959 label = gtk_label_new ("Base:");
9960 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9961 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9963 entry = gtk_entry_new ();
9964 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9965 gtk_widget_modify_base (entry, GTK_STATE_NORMAL, &yellow);
9966 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9968 label = gtk_label_new ("Cursor:");
9969 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9970 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9972 entry = gtk_entry_new ();
9973 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9974 gtk_widget_modify_cursor (entry, &red, &red);
9975 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9977 label = gtk_label_new ("Multiple:");
9978 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9979 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9981 button = gtk_button_new_with_label ("Some Text");
9983 rc_style = gtk_rc_style_new ();
9985 rc_style->font_desc = pango_font_description_copy (font_desc);
9986 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
9987 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
9988 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
9989 rc_style->fg[GTK_STATE_NORMAL] = yellow;
9990 rc_style->bg[GTK_STATE_NORMAL] = blue;
9991 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
9992 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
9993 rc_style->fg[GTK_STATE_ACTIVE] = red;
9994 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
9995 rc_style->xthickness = 5;
9996 rc_style->ythickness = 5;
9998 gtk_widget_modify_style (button, rc_style);
9999 gtk_widget_modify_style (gtk_bin_get_child (GTK_BIN (button)), rc_style);
10001 g_object_unref (rc_style);
10003 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
10006 if (!gtk_widget_get_visible (window))
10007 gtk_widget_show_all (window);
10009 gtk_widget_destroy (window);
10013 * Main Window and Exit
10017 do_exit (GtkWidget *widget, GtkWidget *window)
10019 gtk_widget_destroy (window);
10025 void (*func) (GtkWidget *widget);
10026 gboolean do_not_benchmark;
10029 { "alpha window", create_alpha_window },
10030 { "big windows", create_big_windows },
10031 { "button box", create_button_box },
10032 { "buttons", create_buttons },
10033 { "check buttons", create_check_buttons },
10034 { "color selection", create_color_selection },
10035 { "composited window", create_composited_window },
10036 { "cursors", create_cursors },
10037 { "dialog", create_dialog },
10038 { "display & screen", create_display_screen, TRUE },
10039 { "entry", create_entry },
10040 { "event box", create_event_box },
10041 { "event watcher", create_event_watcher },
10042 { "expander", create_expander },
10043 { "flipping", create_flipping },
10044 { "focus", create_focus },
10045 { "font selection", create_font_selection },
10046 { "gridded geometry", create_gridded_geometry },
10047 { "handle box", create_handle_box },
10048 { "image", create_image },
10049 { "key lookup", create_key_lookup },
10050 { "labels", create_labels },
10051 { "layout", create_layout },
10052 { "menus", create_menus },
10053 { "message dialog", create_message_dialog },
10054 { "modal window", create_modal_window, TRUE },
10055 { "notebook", create_notebook },
10056 { "panes", create_panes },
10057 { "paned keyboard", create_paned_keyboard_navigation },
10058 { "pixbuf", create_pixbuf },
10059 { "progress bar", create_progress_bar },
10060 { "properties", create_properties },
10061 { "radio buttons", create_radio_buttons },
10062 { "range controls", create_range_controls },
10063 { "rc file", create_rc_file },
10064 { "reparent", create_reparent },
10065 { "resize grips", create_resize_grips },
10066 { "rotated label", create_rotated_label },
10067 { "rotated text", create_rotated_text },
10068 { "rulers", create_rulers },
10069 { "saved position", create_saved_position },
10070 { "scrolled windows", create_scrolled_windows },
10071 { "shapes", create_shapes },
10072 { "size groups", create_size_groups },
10073 { "spinbutton", create_spins },
10074 { "statusbar", create_statusbar },
10075 { "styles", create_styles },
10076 { "test idle", create_idle_test },
10077 { "test mainloop", create_mainloop, TRUE },
10078 { "test scrolling", create_scroll_test },
10079 { "test selection", create_selection_test },
10080 { "test timeout", create_timeout_test },
10081 { "toggle buttons", create_toggle_buttons },
10082 { "toolbar", create_toolbar },
10083 { "tooltips", create_tooltips },
10084 { "WM hints", create_wmhints },
10085 { "window sizing", create_window_sizing },
10086 { "window states", create_window_states }
10088 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
10091 create_main_window (void)
10096 GtkWidget *scrolled_window;
10100 GtkWidget *separator;
10101 GdkGeometry geometry;
10104 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10105 gtk_widget_set_name (window, "main window");
10106 gtk_window_move (GTK_WINDOW (window), 50, 20);
10107 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
10109 geometry.min_width = -1;
10110 geometry.min_height = -1;
10111 geometry.max_width = -1;
10112 geometry.max_height = G_MAXSHORT;
10113 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
10115 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
10117 g_signal_connect (window, "destroy",
10118 G_CALLBACK (gtk_main_quit),
10120 g_signal_connect (window, "delete-event",
10121 G_CALLBACK (gtk_false),
10124 box1 = gtk_vbox_new (FALSE, 0);
10125 gtk_container_add (GTK_CONTAINER (window), box1);
10127 if (gtk_micro_version > 0)
10130 gtk_get_major_version (),
10131 gtk_get_minor_version (),
10132 gtk_get_micro_version ());
10136 gtk_get_major_version (),
10137 gtk_get_minor_version ());
10139 label = gtk_label_new (buffer);
10140 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
10141 gtk_widget_set_name (label, "testgtk-version-label");
10143 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
10144 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
10145 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
10147 GTK_POLICY_AUTOMATIC);
10148 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
10150 box2 = gtk_vbox_new (FALSE, 0);
10151 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10152 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
10153 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
10154 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
10155 gtk_widget_show (box2);
10157 for (i = 0; i < nbuttons; i++)
10159 button = gtk_button_new_with_label (buttons[i].label);
10160 if (buttons[i].func)
10161 g_signal_connect (button,
10163 G_CALLBACK(buttons[i].func),
10166 gtk_widget_set_sensitive (button, FALSE);
10167 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10170 separator = gtk_hseparator_new ();
10171 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
10173 box2 = gtk_vbox_new (FALSE, 10);
10174 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10175 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
10177 button = gtk_button_new_with_mnemonic ("_Close");
10178 g_signal_connect (button, "clicked",
10179 G_CALLBACK (do_exit),
10181 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10182 gtk_widget_set_can_default (button, TRUE);
10183 gtk_widget_grab_default (button);
10185 gtk_widget_show_all (window);
10191 if (g_file_test ("../gdk-pixbuf/libpixbufloader-pnm.la",
10192 G_FILE_TEST_EXISTS))
10194 g_setenv ("GDK_PIXBUF_MODULE_FILE", "../gdk-pixbuf/loaders.cache", TRUE);
10195 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/immodules.cache", TRUE);
10200 pad (const char *str, int to)
10202 static char buf[256];
10203 int len = strlen (str);
10206 for (i = 0; i < to; i++)
10211 memcpy (buf, str, len);
10217 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
10219 fn (widget); /* on */
10220 while (g_main_context_iteration (NULL, FALSE));
10221 fn (widget); /* off */
10222 while (g_main_context_iteration (NULL, FALSE));
10226 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
10232 static gboolean printed_headers = FALSE;
10234 if (!printed_headers) {
10235 g_print ("Test Iters First Other\n");
10236 g_print ("-------------------- ----- ---------- ----------\n");
10237 printed_headers = TRUE;
10240 g_get_current_time (&tv0);
10241 bench_iteration (widget, fn);
10242 g_get_current_time (&tv1);
10244 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10245 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10247 g_get_current_time (&tv0);
10248 for (n = 0; n < num - 1; n++)
10249 bench_iteration (widget, fn);
10250 g_get_current_time (&tv1);
10251 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10252 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10254 g_print ("%s %5d ", pad (name, 20), num);
10256 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
10258 g_print ("%10.1f\n", dt_first);
10262 do_bench (char* what, int num)
10266 void (* fn) (GtkWidget *widget);
10268 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10270 if (g_ascii_strcasecmp (what, "ALL") == 0)
10272 for (i = 0; i < nbuttons; i++)
10274 if (!buttons[i].do_not_benchmark)
10275 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
10282 for (i = 0; i < nbuttons; i++)
10284 if (strcmp (buttons[i].label, what) == 0)
10286 fn = buttons[i].func;
10292 g_print ("Can't bench: \"%s\" not found.\n", what);
10294 do_real_bench (widget, fn, buttons[i].label, num);
10301 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
10306 main (int argc, char *argv[])
10308 GtkBindingSet *binding_set;
10310 gboolean done_benchmarks = FALSE;
10312 srand (time (NULL));
10316 /* Check to see if we are being run from the correct
10319 if (file_exists ("testgtkrc"))
10320 gtk_rc_add_default_file ("testgtkrc");
10321 else if (file_exists ("tests/testgtkrc"))
10322 gtk_rc_add_default_file ("tests/testgtkrc");
10324 g_warning ("Couldn't find file \"testgtkrc\".");
10326 g_set_application_name ("GTK+ Test Program");
10328 gtk_init (&argc, &argv);
10330 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
10339 for (i = 1; i < argc; i++)
10341 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
10348 nextarg = strchr (argv[i], '=');
10359 count = strchr (nextarg, ':');
10362 what = g_strndup (nextarg, count - nextarg);
10364 num = atoi (count);
10369 what = g_strdup (nextarg);
10371 do_bench (what, num ? num : 1);
10372 done_benchmarks = TRUE;
10377 if (done_benchmarks)
10382 binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
10383 gtk_binding_entry_add_signal (binding_set,
10384 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
10387 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
10389 /* We use gtk_rc_parse_string() here so we can make sure it works across theme
10393 gtk_rc_parse_string ("style \"testgtk-version-label\" { "
10394 " fg[NORMAL] = \"#ff0000\"\n"
10395 " font = \"Sans 18\"\n"
10397 "widget \"*.testgtk-version-label\" style \"testgtk-version-label\"");
10399 create_main_window ();
10405 while (g_main_context_pending (NULL))
10406 g_main_context_iteration (NULL, FALSE);
10409 while (g_main_context_pending (NULL))
10410 g_main_context_iteration (NULL, FALSE);