1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
21 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
22 * file for a list of people on the GTK+ Team. See the ChangeLog
23 * files for a list of changes. These files are distributed with
24 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
44 #include "gdk/gdkkeysyms.h"
47 #define sleep(n) _sleep(n)
50 #include "prop-editor.h"
55 file_exists (const char *filename)
59 return stat (filename, &statbuf) == 0;
63 shape_create_icon (GdkScreen *screen,
72 build_option_menu (gchar *items[],
75 void (*func) (GtkWidget *widget, gpointer data),
78 /* macro, structure and variables used by tree window demos */
79 #define DEFAULT_NUMBER_OF_ITEM 3
80 #define DEFAULT_RECURSION_LEVEL 3
83 GSList* selection_mode_group;
84 GtkWidget* single_button;
85 GtkWidget* browse_button;
86 GtkWidget* multiple_button;
87 GtkWidget* draw_line_button;
88 GtkWidget* view_line_button;
89 GtkWidget* no_root_item_button;
90 GtkWidget* nb_item_spinner;
91 GtkWidget* recursion_spinner;
92 } sTreeSampleSelection;
94 typedef struct sTreeButtons {
96 GtkWidget* add_button;
97 GtkWidget* remove_button;
98 GtkWidget* subtree_button;
100 /* end of tree section */
103 build_option_menu (gchar *items[],
106 void (*func)(GtkWidget *widget, gpointer data),
112 omenu = gtk_combo_box_text_new ();
113 g_signal_connect (omenu, "changed",
114 G_CALLBACK (func), data);
116 for (i = 0; i < num_items; i++)
117 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (omenu), items[i]);
119 gtk_combo_box_set_active (GTK_COMBO_BOX (omenu), history);
125 * Windows with an alpha channel
130 on_alpha_window_draw (GtkWidget *widget,
133 cairo_pattern_t *pattern;
134 int radius, width, height;
136 width = gtk_widget_get_allocated_width (widget);
137 height = gtk_widget_get_allocated_height (widget);
138 radius = MIN (width, height) / 2;
139 pattern = cairo_pattern_create_radial (width / 2,
146 if (gdk_screen_get_rgba_visual (gtk_widget_get_screen (widget)) &&
147 gtk_widget_is_composited (widget))
148 cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.0); /* transparent */
150 cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* opaque white */
152 cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
155 cairo_pattern_add_color_stop_rgba (pattern, 0.0,
156 1.0, 0.75, 0.0, 1.0); /* solid orange */
157 cairo_pattern_add_color_stop_rgba (pattern, 1.0,
158 1.0, 0.75, 0.0, 0.0); /* transparent orange */
160 cairo_set_source (cr, pattern);
161 cairo_pattern_destroy (pattern);
163 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
170 build_alpha_widgets (void)
173 GtkWidget *radio_button;
178 table = gtk_table_new (1, 1, FALSE);
180 radio_button = gtk_radio_button_new_with_label (NULL, "Red");
181 gtk_table_attach (GTK_TABLE (table),
184 GTK_EXPAND | GTK_FILL, 0,
187 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Green");
188 gtk_table_attach (GTK_TABLE (table),
191 GTK_EXPAND | GTK_FILL, 0,
194 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Blue"),
195 gtk_table_attach (GTK_TABLE (table),
198 GTK_EXPAND | GTK_FILL, 0,
201 gtk_table_attach (GTK_TABLE (table),
202 gtk_check_button_new_with_label ("Sedentary"),
204 GTK_EXPAND | GTK_FILL, 0,
206 gtk_table_attach (GTK_TABLE (table),
207 gtk_check_button_new_with_label ("Nocturnal"),
209 GTK_EXPAND | GTK_FILL, 0,
211 gtk_table_attach (GTK_TABLE (table),
212 gtk_check_button_new_with_label ("Compulsive"),
214 GTK_EXPAND | GTK_FILL, 0,
217 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Green");
218 gtk_table_attach (GTK_TABLE (table),
221 GTK_EXPAND | GTK_FILL, 0,
224 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Blue"),
225 gtk_table_attach (GTK_TABLE (table),
228 GTK_EXPAND | GTK_FILL, 0,
231 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
232 label = gtk_label_new (NULL);
233 gtk_label_set_markup (GTK_LABEL (label), "<i>Entry: </i>");
234 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
235 entry = gtk_entry_new ();
236 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
237 gtk_table_attach (GTK_TABLE (table),
240 GTK_EXPAND | GTK_FILL, 0,
247 on_alpha_screen_changed (GtkWindow *window,
248 GdkScreen *old_screen,
251 GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (window));
252 GdkVisual *visual = gdk_screen_get_rgba_visual (screen);
256 visual = gdk_screen_get_system_visual (screen);
257 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen doesn't support alpha</b>");
261 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen supports alpha</b>");
264 gtk_widget_set_visual (GTK_WIDGET (window), visual);
268 on_composited_changed (GtkWidget *window,
271 gboolean is_composited = gtk_widget_is_composited (window);
274 gtk_label_set_text (label, "Composited");
276 gtk_label_set_text (label, "Not composited");
280 create_alpha_window (GtkWidget *widget)
282 static GtkWidget *window;
286 GtkWidget *content_area;
290 window = gtk_dialog_new_with_buttons ("Alpha Window",
291 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
295 gtk_widget_set_app_paintable (window, TRUE);
296 g_signal_connect (window, "draw",
297 G_CALLBACK (on_alpha_window_draw), NULL);
299 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
301 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 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_rgba_parse (&red, "red");
415 gtk_widget_override_background_color (window, 0, &red);
417 /* set our event box to have a fully-transparent background
418 * drawn on it. currently there is no way to simply tell gtk
419 * that "transparency" is the background colour for a widget.
421 gtk_widget_set_app_paintable (GTK_WIDGET (event), TRUE);
422 g_signal_connect (event, "draw",
423 G_CALLBACK (transparent_draw), NULL);
425 /* put them inside one another */
426 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
427 gtk_container_add (GTK_CONTAINER (window), event);
428 gtk_container_add (GTK_CONTAINER (event), button);
430 /* realise and show everything */
431 gtk_widget_realize (button);
433 /* set the event box GdkWindow to be composited.
434 * obviously must be performed after event box is realised.
436 gdk_window_set_composited (gtk_widget_get_window (event),
439 /* set up the compositing handler.
440 * note that we do _after so that the normal (red) background is drawn
441 * by gtk before our compositing occurs.
443 g_signal_connect_after (window, "draw",
444 G_CALLBACK (window_draw), NULL);
447 if (!gtk_widget_get_visible (window))
448 gtk_widget_show_all (window);
450 gtk_widget_destroy (window);
454 * Big windows and guffaw scrolling
458 pattern_set_bg (GtkWidget *widget,
462 static const GdkColor colors[] = {
463 { 0, 0x4444, 0x4444, 0xffff },
464 { 0, 0x8888, 0x8888, 0xffff },
465 { 0, 0xaaaa, 0xaaaa, 0xffff }
468 gdk_window_set_user_data (child, widget);
469 gdk_window_set_background (child, &colors[level]);
473 create_pattern (GtkWidget *widget,
484 while (2 * h <= height)
489 while (2 * w <= width)
491 if ((i + j) % 2 == 0)
496 GdkWindowAttr attributes;
498 attributes.window_type = GDK_WINDOW_CHILD;
501 attributes.width = w;
502 attributes.height = h;
503 attributes.wclass = GDK_INPUT_OUTPUT;
504 attributes.event_mask = GDK_EXPOSURE_MASK;
505 attributes.visual = gtk_widget_get_visual (widget);
507 child = gdk_window_new (parent, &attributes,
508 GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL);
510 pattern_set_bg (widget, child, level);
513 create_pattern (widget, child, level + 1, w, h);
515 gdk_window_show (child);
525 #define PATTERN_SIZE (1 << 18)
528 pattern_hadj_changed (GtkAdjustment *adj,
531 gint *old_value = g_object_get_data (G_OBJECT (adj), "old-value");
532 gint new_value = adj->value;
534 if (gtk_widget_get_realized (darea))
536 gdk_window_scroll (gtk_widget_get_window (darea),
537 *old_value - new_value, 0);
538 *old_value = new_value;
543 pattern_vadj_changed (GtkAdjustment *adj,
546 gint *old_value = g_object_get_data (G_OBJECT (adj), "old-value");
547 gint new_value = adj->value;
549 if (gtk_widget_get_realized (darea))
551 gdk_window_scroll (gtk_widget_get_window (darea),
552 0, *old_value - new_value);
553 *old_value = new_value;
558 pattern_realize (GtkWidget *widget,
563 window = gtk_widget_get_window (widget);
564 pattern_set_bg (widget, window, 0);
565 create_pattern (widget, window, 1, PATTERN_SIZE, PATTERN_SIZE);
569 create_big_windows (GtkWidget *widget)
571 static GtkWidget *window = NULL;
572 GtkWidget *content_area;
573 GtkWidget *darea, *table, *scrollbar;
577 static gint current_x;
578 static gint current_y;
585 window = gtk_dialog_new_with_buttons ("Big Windows",
591 gtk_window_set_screen (GTK_WINDOW (window),
592 gtk_widget_get_screen (widget));
594 gtk_window_set_default_size (GTK_WINDOW (window), 200, 300);
596 g_signal_connect (window, "destroy",
597 G_CALLBACK (gtk_widget_destroyed),
600 g_signal_connect (window, "response",
601 G_CALLBACK (gtk_widget_destroy),
604 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
606 table = gtk_table_new (2, 2, FALSE);
607 gtk_box_pack_start (GTK_BOX (content_area), table, TRUE, TRUE, 0);
609 darea = gtk_drawing_area_new ();
611 hadj = gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
612 g_signal_connect (hadj, "value_changed",
613 G_CALLBACK (pattern_hadj_changed), darea);
614 g_object_set_data (G_OBJECT (hadj), "old-value", ¤t_x);
616 vadj = gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
617 g_signal_connect (vadj, "value_changed",
618 G_CALLBACK (pattern_vadj_changed), darea);
619 g_object_set_data (G_OBJECT (vadj), "old-value", ¤t_y);
621 g_signal_connect (darea, "realize",
622 G_CALLBACK (pattern_realize),
625 eventbox = gtk_event_box_new ();
626 gtk_table_attach (GTK_TABLE (table), eventbox,
628 GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND,
631 gtk_container_add (GTK_CONTAINER (eventbox), darea);
633 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, hadj);
634 gtk_table_attach (GTK_TABLE (table), scrollbar,
636 GTK_FILL | GTK_EXPAND, GTK_FILL,
639 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, vadj);
640 gtk_table_attach (GTK_TABLE (table), scrollbar,
642 GTK_FILL, GTK_EXPAND | GTK_FILL,
647 if (!gtk_widget_get_visible (window))
648 gtk_widget_show_all (window);
650 gtk_widget_hide (window);
658 button_window (GtkWidget *widget,
661 if (!gtk_widget_get_visible (button))
662 gtk_widget_show (button);
664 gtk_widget_hide (button);
668 create_buttons (GtkWidget *widget)
670 static GtkWidget *window = NULL;
674 GtkWidget *button[10];
675 GtkWidget *separator;
679 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
680 gtk_window_set_screen (GTK_WINDOW (window),
681 gtk_widget_get_screen (widget));
683 g_signal_connect (window, "destroy",
684 G_CALLBACK (gtk_widget_destroyed),
687 gtk_window_set_title (GTK_WINDOW (window), "GtkButton");
688 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
690 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
691 gtk_container_add (GTK_CONTAINER (window), box1);
693 table = gtk_table_new (3, 3, FALSE);
694 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
695 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
696 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
697 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
699 button[0] = gtk_button_new_with_label ("button1");
700 button[1] = gtk_button_new_with_mnemonic ("_button2");
701 button[2] = gtk_button_new_with_mnemonic ("_button3");
702 button[3] = gtk_button_new_from_stock (GTK_STOCK_OK);
703 button[4] = gtk_button_new_with_label ("button5");
704 button[5] = gtk_button_new_with_label ("button6");
705 button[6] = gtk_button_new_with_label ("button7");
706 button[7] = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
707 button[8] = gtk_button_new_with_label ("button9");
709 g_signal_connect (button[0], "clicked",
710 G_CALLBACK (button_window),
713 gtk_table_attach (GTK_TABLE (table), button[0], 0, 1, 0, 1,
714 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
716 g_signal_connect (button[1], "clicked",
717 G_CALLBACK (button_window),
720 gtk_table_attach (GTK_TABLE (table), button[1], 1, 2, 1, 2,
721 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
723 g_signal_connect (button[2], "clicked",
724 G_CALLBACK (button_window),
726 gtk_table_attach (GTK_TABLE (table), button[2], 2, 3, 2, 3,
727 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
729 g_signal_connect (button[3], "clicked",
730 G_CALLBACK (button_window),
732 gtk_table_attach (GTK_TABLE (table), button[3], 0, 1, 2, 3,
733 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
735 g_signal_connect (button[4], "clicked",
736 G_CALLBACK (button_window),
738 gtk_table_attach (GTK_TABLE (table), button[4], 2, 3, 0, 1,
739 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
741 g_signal_connect (button[5], "clicked",
742 G_CALLBACK (button_window),
744 gtk_table_attach (GTK_TABLE (table), button[5], 1, 2, 2, 3,
745 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
747 g_signal_connect (button[6], "clicked",
748 G_CALLBACK (button_window),
750 gtk_table_attach (GTK_TABLE (table), button[6], 1, 2, 0, 1,
751 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
753 g_signal_connect (button[7], "clicked",
754 G_CALLBACK (button_window),
756 gtk_table_attach (GTK_TABLE (table), button[7], 2, 3, 1, 2,
757 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
759 g_signal_connect (button[8], "clicked",
760 G_CALLBACK (button_window),
762 gtk_table_attach (GTK_TABLE (table), button[8], 0, 1, 1, 2,
763 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
765 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
766 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
768 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
769 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
770 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
772 button[9] = gtk_button_new_with_label ("close");
773 g_signal_connect_swapped (button[9], "clicked",
774 G_CALLBACK (gtk_widget_destroy),
776 gtk_box_pack_start (GTK_BOX (box2), button[9], TRUE, TRUE, 0);
777 gtk_widget_set_can_default (button[9], TRUE);
778 gtk_widget_grab_default (button[9]);
781 if (!gtk_widget_get_visible (window))
782 gtk_widget_show_all (window);
784 gtk_widget_destroy (window);
792 create_toggle_buttons (GtkWidget *widget)
794 static GtkWidget *window = NULL;
798 GtkWidget *separator;
802 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
803 gtk_window_set_screen (GTK_WINDOW (window),
804 gtk_widget_get_screen (widget));
806 g_signal_connect (window, "destroy",
807 G_CALLBACK (gtk_widget_destroyed),
810 gtk_window_set_title (GTK_WINDOW (window), "GtkToggleButton");
811 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
813 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
814 gtk_container_add (GTK_CONTAINER (window), box1);
816 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
817 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
818 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
820 button = gtk_toggle_button_new_with_label ("button1");
821 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
823 button = gtk_toggle_button_new_with_label ("button2");
824 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
826 button = gtk_toggle_button_new_with_label ("button3");
827 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
829 button = gtk_toggle_button_new_with_label ("inconsistent");
830 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
831 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
833 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
834 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
836 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
837 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
838 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
840 button = gtk_button_new_with_label ("close");
841 g_signal_connect_swapped (button, "clicked",
842 G_CALLBACK (gtk_widget_destroy),
844 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
845 gtk_widget_set_can_default (button, TRUE);
846 gtk_widget_grab_default (button);
849 if (!gtk_widget_get_visible (window))
850 gtk_widget_show_all (window);
852 gtk_widget_destroy (window);
856 create_widget_grid (GType widget_type)
859 GtkWidget *group_widget = NULL;
862 table = gtk_table_new (FALSE, 3, 3);
864 for (i = 0; i < 5; i++)
866 for (j = 0; j < 5; j++)
871 if (i == 0 && j == 0)
877 tmp = g_strdup_printf ("%d", j);
878 widget = gtk_label_new (tmp);
883 tmp = g_strdup_printf ("%c", 'A' + i - 1);
884 widget = gtk_label_new (tmp);
889 widget = g_object_new (widget_type, NULL);
891 if (g_type_is_a (widget_type, GTK_TYPE_RADIO_BUTTON))
894 group_widget = widget;
896 g_object_set (widget, "group", group_widget, NULL);
901 gtk_table_attach (GTK_TABLE (table), widget,
916 create_check_buttons (GtkWidget *widget)
918 static GtkWidget *window = NULL;
922 GtkWidget *separator;
927 window = gtk_dialog_new_with_buttons ("Check Buttons",
933 gtk_window_set_screen (GTK_WINDOW (window),
934 gtk_widget_get_screen (widget));
936 g_signal_connect (window, "destroy",
937 G_CALLBACK (gtk_widget_destroyed),
939 g_signal_connect (window, "response",
940 G_CALLBACK (gtk_widget_destroy),
943 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
945 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
946 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
947 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
949 button = gtk_check_button_new_with_mnemonic ("_button1");
950 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
952 button = gtk_check_button_new_with_label ("button2");
953 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
955 button = gtk_check_button_new_with_label ("button3");
956 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
958 button = gtk_check_button_new_with_label ("inconsistent");
959 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
960 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
962 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
963 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
965 table = create_widget_grid (GTK_TYPE_CHECK_BUTTON);
966 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
967 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
970 if (!gtk_widget_get_visible (window))
971 gtk_widget_show_all (window);
973 gtk_widget_destroy (window);
981 create_radio_buttons (GtkWidget *widget)
983 static GtkWidget *window = NULL;
987 GtkWidget *separator;
992 window = gtk_dialog_new_with_buttons ("Radio Buttons",
998 gtk_window_set_screen (GTK_WINDOW (window),
999 gtk_widget_get_screen (widget));
1001 g_signal_connect (window, "destroy",
1002 G_CALLBACK (gtk_widget_destroyed),
1004 g_signal_connect (window, "response",
1005 G_CALLBACK (gtk_widget_destroy),
1008 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
1010 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1011 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1012 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1014 button = gtk_radio_button_new_with_label (NULL, "button1");
1015 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1017 button = gtk_radio_button_new_with_label (
1018 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1020 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
1021 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1023 button = gtk_radio_button_new_with_label (
1024 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1026 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1028 button = gtk_radio_button_new_with_label (
1029 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1031 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
1032 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1034 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1035 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1037 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1038 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1039 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1041 button = gtk_radio_button_new_with_label (NULL, "button4");
1042 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1043 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1045 button = gtk_radio_button_new_with_label (
1046 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1048 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
1049 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1050 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1052 button = gtk_radio_button_new_with_label (
1053 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1055 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1056 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1058 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1059 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1061 table = create_widget_grid (GTK_TYPE_RADIO_BUTTON);
1062 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
1063 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
1066 if (!gtk_widget_get_visible (window))
1067 gtk_widget_show_all (window);
1069 gtk_widget_destroy (window);
1077 create_bbox (gint horizontal,
1088 frame = gtk_frame_new (title);
1091 bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
1093 bbox = gtk_button_box_new (GTK_ORIENTATION_VERTICAL);
1095 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
1096 gtk_container_add (GTK_CONTAINER (frame), bbox);
1098 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), layout);
1099 gtk_box_set_spacing (GTK_BOX (bbox), spacing);
1101 button = gtk_button_new_with_label ("OK");
1102 gtk_container_add (GTK_CONTAINER (bbox), button);
1104 button = gtk_button_new_with_label ("Cancel");
1105 gtk_container_add (GTK_CONTAINER (bbox), button);
1107 button = gtk_button_new_with_label ("Help");
1108 gtk_container_add (GTK_CONTAINER (bbox), button);
1114 create_button_box (GtkWidget *widget)
1116 static GtkWidget* window = NULL;
1117 GtkWidget *main_vbox;
1120 GtkWidget *frame_horz;
1121 GtkWidget *frame_vert;
1125 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1126 gtk_window_set_screen (GTK_WINDOW (window), gtk_widget_get_screen (widget));
1127 gtk_window_set_title (GTK_WINDOW (window), "Button Boxes");
1129 g_signal_connect (window, "destroy",
1130 G_CALLBACK (gtk_widget_destroyed),
1133 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
1135 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1136 gtk_container_add (GTK_CONTAINER (window), main_vbox);
1138 frame_horz = gtk_frame_new ("Horizontal Button Boxes");
1139 gtk_box_pack_start (GTK_BOX (main_vbox), frame_horz, TRUE, TRUE, 10);
1141 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1142 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
1143 gtk_container_add (GTK_CONTAINER (frame_horz), vbox);
1145 gtk_box_pack_start (GTK_BOX (vbox),
1146 create_bbox (TRUE, "Spread", 40, 85, 20, GTK_BUTTONBOX_SPREAD),
1149 gtk_box_pack_start (GTK_BOX (vbox),
1150 create_bbox (TRUE, "Edge", 40, 85, 20, GTK_BUTTONBOX_EDGE),
1153 gtk_box_pack_start (GTK_BOX (vbox),
1154 create_bbox (TRUE, "Start", 40, 85, 20, GTK_BUTTONBOX_START),
1157 gtk_box_pack_start (GTK_BOX (vbox),
1158 create_bbox (TRUE, "End", 40, 85, 20, GTK_BUTTONBOX_END),
1161 gtk_box_pack_start (GTK_BOX (vbox),
1162 create_bbox (TRUE, "Center", 40, 85, 20, GTK_BUTTONBOX_CENTER),
1165 frame_vert = gtk_frame_new ("Vertical Button Boxes");
1166 gtk_box_pack_start (GTK_BOX (main_vbox), frame_vert, TRUE, TRUE, 10);
1168 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
1169 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
1170 gtk_container_add (GTK_CONTAINER (frame_vert), hbox);
1172 gtk_box_pack_start (GTK_BOX (hbox),
1173 create_bbox (FALSE, "Spread", 30, 85, 20, GTK_BUTTONBOX_SPREAD),
1176 gtk_box_pack_start (GTK_BOX (hbox),
1177 create_bbox (FALSE, "Edge", 30, 85, 20, GTK_BUTTONBOX_EDGE),
1180 gtk_box_pack_start (GTK_BOX (hbox),
1181 create_bbox (FALSE, "Start", 30, 85, 20, GTK_BUTTONBOX_START),
1184 gtk_box_pack_start (GTK_BOX (hbox),
1185 create_bbox (FALSE, "End", 30, 85, 20, GTK_BUTTONBOX_END),
1188 gtk_box_pack_start (GTK_BOX (hbox),
1189 create_bbox (FALSE, "Center", 30, 85, 20, GTK_BUTTONBOX_CENTER),
1193 if (!gtk_widget_get_visible (window))
1194 gtk_widget_show_all (window);
1196 gtk_widget_destroy (window);
1204 new_pixbuf (char *filename,
1210 if (strcmp (filename, "test.xpm") == 0)
1213 pixbuf = gdk_pixbuf_new_from_file (filename, NULL);
1216 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
1218 widget = gtk_image_new_from_pixbuf (pixbuf);
1220 g_object_unref (pixbuf);
1227 set_toolbar_small_stock (GtkWidget *widget,
1230 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_SMALL_TOOLBAR);
1234 set_toolbar_large_stock (GtkWidget *widget,
1237 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_LARGE_TOOLBAR);
1241 set_toolbar_horizontal (GtkWidget *widget,
1244 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_HORIZONTAL);
1248 set_toolbar_vertical (GtkWidget *widget,
1251 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_VERTICAL);
1255 set_toolbar_icons (GtkWidget *widget,
1258 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_ICONS);
1262 set_toolbar_text (GtkWidget *widget,
1265 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_TEXT);
1269 set_toolbar_both (GtkWidget *widget,
1272 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH);
1276 set_toolbar_both_horiz (GtkWidget *widget,
1279 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH_HORIZ);
1283 set_toolbar_enable (GtkWidget *widget,
1286 GtkSettings *settings = gtk_widget_get_settings (widget);
1287 g_object_set (settings, "gtk-enable-tooltips", TRUE, NULL);
1291 set_toolbar_disable (GtkWidget *widget,
1294 GtkSettings *settings = gtk_widget_get_settings (widget);
1295 g_object_set (settings, "gtk-enable-tooltips", FALSE, NULL);
1298 static GtkActionEntry create_toolbar_items[] = {
1299 { NULL, GTK_STOCK_NEW, NULL, NULL, "Stock icon: New",
1300 G_CALLBACK (set_toolbar_small_stock) },
1301 { NULL, GTK_STOCK_OPEN, NULL, NULL, "Stock icon: Open",
1302 G_CALLBACK (set_toolbar_large_stock) },
1303 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1304 G_CALLBACK (set_toolbar_horizontal) },
1305 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1306 G_CALLBACK (set_toolbar_vertical) },
1308 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1309 G_CALLBACK (set_toolbar_icons) },
1310 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1311 G_CALLBACK (set_toolbar_text) },
1312 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1313 G_CALLBACK (set_toolbar_both) },
1314 { NULL, NULL, "Both (horizontal)", NULL, "Show toolbar icons and text in a horizontal fashion",
1315 G_CALLBACK (set_toolbar_both_horiz) },
1317 { "entry", NULL, NULL, "This is an unusable GtkEntry ;)",
1321 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1322 G_CALLBACK (set_toolbar_enable) },
1323 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1324 G_CALLBACK (set_toolbar_disable) },
1326 { NULL, NULL, "Frobate", NULL, "Frobate tooltip",
1328 { NULL, NULL, "Baz", NULL, "Baz tooltip",
1331 { NULL, NULL, "Blah", NULL, "Blash tooltip",
1333 { NULL, NULL, "Bar", NULL, "Bar tooltip",
1338 create_toolbar (GtkWidget *widget)
1340 static GtkWidget *window = NULL;
1347 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1348 gtk_window_set_screen (GTK_WINDOW (window),
1349 gtk_widget_get_screen (widget));
1351 gtk_window_set_title (GTK_WINDOW (window), "Toolbar test");
1353 g_signal_connect (window, "destroy",
1354 G_CALLBACK (gtk_widget_destroyed),
1357 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1358 gtk_widget_realize (window);
1360 toolbar = gtk_toolbar_new ();
1361 for (i = 0; i < G_N_ELEMENTS (create_toolbar_items); i++)
1363 GtkToolItem *toolitem;
1365 if (create_toolbar_items[i].tooltip == NULL)
1366 toolitem = gtk_separator_tool_item_new ();
1367 else if (g_strcmp0 (create_toolbar_items[i].name, "entry") == 0)
1371 toolitem = gtk_tool_item_new ();
1372 entry = gtk_entry_new ();
1373 gtk_container_add (GTK_CONTAINER (toolitem), entry);
1375 else if (create_toolbar_items[i].stock_id)
1376 toolitem = gtk_tool_button_new_from_stock (create_toolbar_items[i].stock_id);
1381 icon = new_pixbuf ("test.xpm", gtk_widget_get_window (window));
1382 toolitem = gtk_tool_button_new (icon, create_toolbar_items[i].label);
1384 if (create_toolbar_items[i].callback)
1385 g_signal_connect (toolitem, "clicked",
1386 create_toolbar_items[i].callback, toolbar);
1387 gtk_tool_item_set_tooltip_text (toolitem, create_toolbar_items[i].tooltip);
1388 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1391 gtk_container_add (GTK_CONTAINER (window), toolbar);
1393 gtk_widget_set_size_request (toolbar, 200, -1);
1396 if (!gtk_widget_get_visible (window))
1397 gtk_widget_show_all (window);
1399 gtk_widget_destroy (window);
1402 static GtkActionEntry make_toolbar_items[] = {
1403 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1404 G_CALLBACK (set_toolbar_horizontal) },
1405 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1406 G_CALLBACK (set_toolbar_vertical) },
1408 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1409 G_CALLBACK (set_toolbar_icons) },
1410 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1411 G_CALLBACK (set_toolbar_text) },
1412 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1413 G_CALLBACK (set_toolbar_both) },
1415 { NULL, NULL, "Woot", NULL, "Woot woot woot",
1417 { NULL, NULL, "Blah", NULL, "Blah blah blah",
1420 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1421 G_CALLBACK (set_toolbar_enable) },
1422 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1423 G_CALLBACK (set_toolbar_disable) },
1425 { NULL, NULL, "Hoo", NULL, "Hoo tooltip",
1427 { NULL, NULL, "Woo", NULL, "Woo tooltip",
1432 make_toolbar (GtkWidget *window)
1437 if (!gtk_widget_get_realized (window))
1438 gtk_widget_realize (window);
1440 toolbar = gtk_toolbar_new ();
1441 for (i = 0; i < G_N_ELEMENTS (make_toolbar_items); i++)
1444 GtkToolItem *toolitem;
1446 if (make_toolbar_items[i].label == NULL)
1448 toolitem = gtk_separator_tool_item_new ();
1451 icon = new_pixbuf ("test.xpm", gtk_widget_get_window (window));
1452 toolitem = gtk_tool_button_new (icon, make_toolbar_items[i].label);
1453 gtk_tool_item_set_tooltip_text (toolitem, make_toolbar_items[i].tooltip);
1454 if (make_toolbar_items[i].callback != NULL)
1455 g_signal_connect (toolitem, "clicked", make_toolbar_items[i].callback, toolbar);
1456 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1466 static guint statusbar_counter = 1;
1469 statusbar_push (GtkWidget *button,
1470 GtkStatusbar *statusbar)
1474 sprintf (text, "something %d", statusbar_counter++);
1476 gtk_statusbar_push (statusbar, 1, text);
1480 statusbar_push_long (GtkWidget *button,
1481 GtkStatusbar *statusbar)
1485 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\").");
1487 gtk_statusbar_push (statusbar, 1, text);
1491 statusbar_pop (GtkWidget *button,
1492 GtkStatusbar *statusbar)
1494 gtk_statusbar_pop (statusbar, 1);
1498 statusbar_steal (GtkWidget *button,
1499 GtkStatusbar *statusbar)
1501 gtk_statusbar_remove (statusbar, 1, 4);
1505 statusbar_popped (GtkStatusbar *statusbar,
1510 statusbar_counter = 1;
1514 statusbar_contexts (GtkStatusbar *statusbar)
1518 string = "any context";
1519 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1521 gtk_statusbar_get_context_id (statusbar, string));
1523 string = "idle messages";
1524 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1526 gtk_statusbar_get_context_id (statusbar, string));
1528 string = "some text";
1529 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1531 gtk_statusbar_get_context_id (statusbar, string));
1533 string = "hit the mouse";
1534 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1536 gtk_statusbar_get_context_id (statusbar, string));
1538 string = "hit the mouse2";
1539 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1541 gtk_statusbar_get_context_id (statusbar, string));
1545 create_statusbar (GtkWidget *widget)
1547 static GtkWidget *window = NULL;
1551 GtkWidget *separator;
1552 GtkWidget *statusbar;
1556 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1557 gtk_window_set_screen (GTK_WINDOW (window),
1558 gtk_widget_get_screen (widget));
1560 g_signal_connect (window, "destroy",
1561 G_CALLBACK (gtk_widget_destroyed),
1564 gtk_window_set_title (GTK_WINDOW (window), "statusbar");
1565 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1567 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1568 gtk_container_add (GTK_CONTAINER (window), box1);
1570 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1571 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1572 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1574 statusbar = gtk_statusbar_new ();
1575 gtk_box_pack_end (GTK_BOX (box1), statusbar, TRUE, TRUE, 0);
1576 g_signal_connect (statusbar,
1578 G_CALLBACK (statusbar_popped),
1581 button = g_object_new (gtk_button_get_type (),
1582 "label", "push something",
1586 g_object_connect (button,
1587 "signal::clicked", statusbar_push, statusbar,
1590 button = g_object_connect (g_object_new (gtk_button_get_type (),
1595 "signal_after::clicked", statusbar_pop, statusbar,
1598 button = g_object_connect (g_object_new (gtk_button_get_type (),
1599 "label", "steal #4",
1603 "signal_after::clicked", statusbar_steal, statusbar,
1606 button = g_object_connect (g_object_new (gtk_button_get_type (),
1607 "label", "test contexts",
1611 "swapped_signal_after::clicked", statusbar_contexts, statusbar,
1614 button = g_object_connect (g_object_new (gtk_button_get_type (),
1615 "label", "push something long",
1619 "signal_after::clicked", statusbar_push_long, statusbar,
1622 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1623 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1625 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1626 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1627 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
1629 button = gtk_button_new_with_label ("close");
1630 g_signal_connect_swapped (button, "clicked",
1631 G_CALLBACK (gtk_widget_destroy),
1633 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1634 gtk_widget_set_can_default (button, TRUE);
1635 gtk_widget_grab_default (button);
1638 if (!gtk_widget_get_visible (window))
1639 gtk_widget_show_all (window);
1641 gtk_widget_destroy (window);
1649 handle_box_child_signal (GtkHandleBox *hb,
1651 const gchar *action)
1653 printf ("%s: child <%s> %sed\n",
1654 g_type_name (G_OBJECT_TYPE (hb)),
1655 g_type_name (G_OBJECT_TYPE (child)),
1660 create_handle_box (GtkWidget *widget)
1662 static GtkWidget* window = NULL;
1663 GtkWidget *handle_box;
1664 GtkWidget *handle_box2;
1669 GtkWidget *separator;
1673 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1675 gtk_window_set_screen (GTK_WINDOW (window),
1676 gtk_widget_get_screen (widget));
1677 gtk_window_set_modal (GTK_WINDOW (window), FALSE);
1678 gtk_window_set_title (GTK_WINDOW (window),
1680 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
1682 g_signal_connect (window, "destroy",
1683 G_CALLBACK (gtk_widget_destroyed),
1686 gtk_container_set_border_width (GTK_CONTAINER (window), 20);
1688 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1689 gtk_container_add (GTK_CONTAINER (window), vbox);
1690 gtk_widget_show (vbox);
1692 label = gtk_label_new ("Above");
1693 gtk_container_add (GTK_CONTAINER (vbox), label);
1694 gtk_widget_show (label);
1696 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1697 gtk_container_add (GTK_CONTAINER (vbox), separator);
1698 gtk_widget_show (separator);
1700 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
1701 gtk_container_add (GTK_CONTAINER (vbox), hbox);
1702 gtk_widget_show (hbox);
1704 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1705 gtk_container_add (GTK_CONTAINER (vbox), separator);
1706 gtk_widget_show (separator);
1708 label = gtk_label_new ("Below");
1709 gtk_container_add (GTK_CONTAINER (vbox), label);
1710 gtk_widget_show (label);
1712 handle_box = gtk_handle_box_new ();
1713 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1714 g_signal_connect (handle_box,
1716 G_CALLBACK (handle_box_child_signal),
1718 g_signal_connect (handle_box,
1720 G_CALLBACK (handle_box_child_signal),
1722 gtk_widget_show (handle_box);
1724 toolbar = make_toolbar (window);
1726 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
1727 gtk_widget_show (toolbar);
1729 handle_box = gtk_handle_box_new ();
1730 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1731 g_signal_connect (handle_box,
1733 G_CALLBACK (handle_box_child_signal),
1735 g_signal_connect (handle_box,
1737 G_CALLBACK (handle_box_child_signal),
1739 gtk_widget_show (handle_box);
1741 handle_box2 = gtk_handle_box_new ();
1742 gtk_container_add (GTK_CONTAINER (handle_box), handle_box2);
1743 g_signal_connect (handle_box2,
1745 G_CALLBACK (handle_box_child_signal),
1747 g_signal_connect (handle_box2,
1749 G_CALLBACK (handle_box_child_signal),
1751 gtk_widget_show (handle_box2);
1753 hbox = g_object_new (GTK_TYPE_HBOX, "visible", 1, "parent", handle_box2, NULL);
1754 label = gtk_label_new ("Fooo!");
1755 gtk_container_add (GTK_CONTAINER (hbox), label);
1756 gtk_widget_show (label);
1757 g_object_new (GTK_TYPE_ARROW, "visible", 1, "parent", hbox, NULL);
1760 if (!gtk_widget_get_visible (window))
1761 gtk_widget_show (window);
1763 gtk_widget_destroy (window);
1770 sensitivity_toggled (GtkWidget *toggle,
1773 gtk_widget_set_sensitive (widget,
1774 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle)));
1778 create_sensitivity_control (GtkWidget *widget)
1782 button = gtk_toggle_button_new_with_label ("Sensitive");
1784 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
1785 gtk_widget_is_sensitive (widget));
1787 g_signal_connect (button,
1789 G_CALLBACK (sensitivity_toggled),
1792 gtk_widget_show_all (button);
1798 set_selectable_recursive (GtkWidget *widget,
1801 if (GTK_IS_CONTAINER (widget))
1806 children = gtk_container_get_children (GTK_CONTAINER (widget));
1810 set_selectable_recursive (tmp->data, setting);
1814 g_list_free (children);
1816 else if (GTK_IS_LABEL (widget))
1818 gtk_label_set_selectable (GTK_LABEL (widget), setting);
1823 selectable_toggled (GtkWidget *toggle,
1826 set_selectable_recursive (widget,
1827 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle)));
1831 create_selectable_control (GtkWidget *widget)
1835 button = gtk_toggle_button_new_with_label ("Selectable");
1837 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
1840 g_signal_connect (button,
1842 G_CALLBACK (selectable_toggled),
1845 gtk_widget_show_all (button);
1851 dialog_response (GtkWidget *dialog, gint response_id, GtkLabel *label)
1855 gtk_widget_destroy (dialog);
1857 text = "Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
1858 "as hyperlinks, which can be clicked\n"
1859 "or activated via <a href=\"keynav\">keynav</a>.\n"
1860 "The links remain the same.";
1861 gtk_label_set_markup (label, text);
1865 activate_link (GtkWidget *label, const gchar *uri, gpointer data)
1867 if (g_strcmp0 (uri, "keynav") == 0)
1871 dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (gtk_widget_get_toplevel (label)),
1872 GTK_DIALOG_DESTROY_WITH_PARENT,
1875 "The term <i>keynav</i> is a shorthand for "
1876 "keyboard navigation and refers to the process of using a program "
1877 "(exclusively) via keyboard input.");
1879 gtk_window_present (GTK_WINDOW (dialog));
1881 g_signal_connect (dialog, "response", G_CALLBACK (dialog_response), label);
1889 void create_labels (GtkWidget *widget)
1891 static GtkWidget *window = NULL;
1900 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1902 gtk_window_set_screen (GTK_WINDOW (window),
1903 gtk_widget_get_screen (widget));
1905 g_signal_connect (window, "destroy",
1906 G_CALLBACK (gtk_widget_destroyed),
1909 gtk_window_set_title (GTK_WINDOW (window), "Label");
1911 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1913 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
1914 gtk_container_add (GTK_CONTAINER (window), vbox);
1916 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
1918 button = create_sensitivity_control (hbox);
1920 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
1922 button = create_selectable_control (hbox);
1924 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
1926 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1928 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
1929 gtk_container_set_border_width (GTK_CONTAINER (window), 5);
1931 frame = gtk_frame_new ("Normal Label");
1932 label = gtk_label_new ("This is a Normal label");
1933 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
1934 gtk_container_add (GTK_CONTAINER (frame), label);
1935 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1937 frame = gtk_frame_new ("Multi-line Label");
1938 label = gtk_label_new ("This is a Multi-line label.\nSecond line\nThird line");
1939 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
1940 gtk_container_add (GTK_CONTAINER (frame), label);
1941 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1943 frame = gtk_frame_new ("Left Justified Label");
1944 label = gtk_label_new ("This is a Left-Justified\nMulti-line label.\nThird line");
1945 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_MIDDLE);
1946 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1947 gtk_container_add (GTK_CONTAINER (frame), label);
1948 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1950 frame = gtk_frame_new ("Right Justified Label");
1951 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
1952 label = gtk_label_new ("This is a Right-Justified\nMulti-line label.\nFourth line, (j/k)");
1953 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1954 gtk_container_add (GTK_CONTAINER (frame), label);
1955 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1957 frame = gtk_frame_new ("Internationalized Label");
1958 label = gtk_label_new (NULL);
1959 gtk_label_set_markup (GTK_LABEL (label),
1960 "French (Fran\303\247ais) Bonjour, Salut\n"
1961 "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"
1962 "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"
1963 "Chinese (Simplified) <span lang=\"zh-cn\">\345\205\203\346\260\224 \345\274\200\345\217\221</span>\n"
1964 "Chinese (Traditional) <span lang=\"zh-tw\">\345\205\203\346\260\243 \351\226\213\347\231\274</span>\n"
1965 "Japanese <span lang=\"ja\">\345\205\203\346\260\227 \351\226\213\347\231\272</span>");
1966 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1967 gtk_container_add (GTK_CONTAINER (frame), label);
1968 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1970 frame = gtk_frame_new ("Bidirection Label");
1971 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"
1972 "\342\200\217Hebrew \327\251\327\234\327\225\327\235");
1973 gtk_container_add (GTK_CONTAINER (frame), label);
1974 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1976 frame = gtk_frame_new ("Links in a label");
1977 label = gtk_label_new ("Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
1978 "as hyperlinks, which can be clicked\n"
1979 "or activated via <a href=\"keynav\">keynav</a>");
1980 gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
1981 gtk_container_add (GTK_CONTAINER (frame), label);
1982 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1983 g_signal_connect (label, "activate-link", G_CALLBACK (activate_link), NULL);
1985 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1986 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
1987 frame = gtk_frame_new ("Line wrapped label");
1988 label = gtk_label_new ("This is an example of a line-wrapped label. It should not be taking "\
1989 "up the entire "/* big space to test spacing */\
1990 "width allocated to it, but automatically wraps the words to fit. "\
1991 "The time has come, for all good men, to come to the aid of their party. "\
1992 "The sixth sheik's six sheep's sick.\n"\
1993 " It supports multiple paragraphs correctly, and correctly adds "\
1994 "many extra spaces. ");
1996 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
1997 gtk_container_add (GTK_CONTAINER (frame), label);
1998 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2000 frame = gtk_frame_new ("Filled, wrapped label");
2001 label = gtk_label_new ("This is an example of a line-wrapped, filled label. It should be taking "\
2002 "up the entire width allocated to it. Here is a seneance to prove "\
2003 "my point. Here is another sentence. "\
2004 "Here comes the sun, do de do de do.\n"\
2005 " This is a new paragraph.\n"\
2006 " This is another newer, longer, better paragraph. It is coming to an end, "\
2008 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_FILL);
2009 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2010 gtk_container_add (GTK_CONTAINER (frame), label);
2011 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2013 frame = gtk_frame_new ("Underlined label");
2014 label = gtk_label_new ("This label is underlined!\n"
2015 "This one is underlined (\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257) in quite a funky fashion");
2016 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2017 gtk_label_set_pattern (GTK_LABEL (label), "_________________________ _ _________ _ _____ _ __ __ ___ ____ _____");
2018 gtk_container_add (GTK_CONTAINER (frame), label);
2019 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2021 frame = gtk_frame_new ("Markup label");
2022 label = gtk_label_new (NULL);
2024 /* There's also a gtk_label_set_markup() without accel if you
2025 * don't have an accelerator key
2027 gtk_label_set_markup_with_mnemonic (GTK_LABEL (label),
2028 "This <span foreground=\"blue\" background=\"orange\">label</span> has "
2029 "<b>markup</b> _such as "
2030 "<big><i>Big Italics</i></big>\n"
2031 "<tt>Monospace font</tt>\n"
2032 "<u>Underline!</u>\n"
2034 "<span foreground=\"green\" background=\"red\">Ugly colors</span>\n"
2035 "and nothing on this line,\n"
2038 "or even on this one\n"
2039 "la <big>la <big>la <big>la <big>la</big></big></big></big>\n"
2040 "but this _word is <span foreground=\"purple\"><big>purple</big></span>\n"
2041 "<span underline=\"double\">We like <sup>superscript</sup> and <sub>subscript</sub> too</span>");
2043 g_assert (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)) == GDK_KEY_s);
2045 gtk_container_add (GTK_CONTAINER (frame), label);
2046 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2049 if (!gtk_widget_get_visible (window))
2050 gtk_widget_show_all (window);
2052 gtk_widget_destroy (window);
2056 on_angle_scale_changed (GtkRange *range,
2059 gtk_label_set_angle (GTK_LABEL (label), gtk_range_get_value (range));
2063 create_rotated_label (GtkWidget *widget)
2065 static GtkWidget *window = NULL;
2066 GtkWidget *content_area;
2070 GtkWidget *scale_label;
2071 GtkWidget *scale_hbox;
2075 window = gtk_dialog_new_with_buttons ("Rotated Label",
2076 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2077 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2080 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2082 gtk_window_set_screen (GTK_WINDOW (window),
2083 gtk_widget_get_screen (widget));
2085 g_signal_connect (window, "response",
2086 G_CALLBACK (gtk_widget_destroy), NULL);
2087 g_signal_connect (window, "destroy",
2088 G_CALLBACK (gtk_widget_destroyed), &window);
2090 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2092 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2093 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
2094 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
2096 label = gtk_label_new (NULL);
2097 gtk_label_set_markup (GTK_LABEL (label), "Hello World\n<i>Rotate</i> <span underline='single' foreground='blue'>me</span>");
2098 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
2100 scale_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2101 gtk_box_pack_start (GTK_BOX (vbox), scale_hbox, FALSE, FALSE, 0);
2103 scale_label = gtk_label_new (NULL);
2104 gtk_label_set_markup (GTK_LABEL (scale_label), "<i>Angle: </i>");
2105 gtk_box_pack_start (GTK_BOX (scale_hbox), scale_label, FALSE, FALSE, 0);
2107 hscale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL,
2109 g_signal_connect (hscale, "value-changed",
2110 G_CALLBACK (on_angle_scale_changed), label);
2112 gtk_range_set_value (GTK_RANGE (hscale), 45);
2113 gtk_widget_set_size_request (hscale, 200, -1);
2114 gtk_box_pack_start (GTK_BOX (scale_hbox), hscale, TRUE, TRUE, 0);
2117 if (!gtk_widget_get_visible (window))
2118 gtk_widget_show_all (window);
2120 gtk_widget_destroy (window);
2123 #define DEFAULT_TEXT_RADIUS 200
2126 on_rotated_text_unrealize (GtkWidget *widget)
2128 g_object_set_data (G_OBJECT (widget), "text-gc", NULL);
2132 on_rotated_text_draw (GtkWidget *widget,
2134 GdkPixbuf *tile_pixbuf)
2136 static const gchar *words[] = { "The", "grand", "old", "Duke", "of", "York",
2137 "had", "10,000", "men" };
2142 PangoLayout *layout;
2143 PangoContext *context;
2144 PangoFontDescription *desc;
2148 gdk_cairo_set_source_pixbuf (cr, tile_pixbuf, 0, 0);
2149 cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT);
2152 cairo_set_source_rgb (cr, 0, 0, 0);
2154 width = gtk_widget_get_allocated_width (widget);
2155 height = gtk_widget_get_allocated_height (widget);
2156 radius = MIN (width, height) / 2.;
2158 cairo_translate (cr,
2159 radius + (width - 2 * radius) / 2,
2160 radius + (height - 2 * radius) / 2);
2161 cairo_scale (cr, radius / DEFAULT_TEXT_RADIUS, radius / DEFAULT_TEXT_RADIUS);
2163 context = gtk_widget_get_pango_context (widget);
2164 layout = pango_layout_new (context);
2165 desc = pango_font_description_from_string ("Sans Bold 30");
2166 pango_layout_set_font_description (layout, desc);
2167 pango_font_description_free (desc);
2169 n_words = G_N_ELEMENTS (words);
2170 for (i = 0; i < n_words; i++)
2176 cairo_rotate (cr, 2 * G_PI * i / n_words);
2177 pango_cairo_update_layout (cr, layout);
2179 pango_layout_set_text (layout, words[i], -1);
2180 pango_layout_get_size (layout, &width, &height);
2182 cairo_move_to (cr, - width / 2 / PANGO_SCALE, - DEFAULT_TEXT_RADIUS);
2183 pango_cairo_show_layout (cr, layout);
2188 g_object_unref (layout);
2194 create_rotated_text (GtkWidget *widget)
2196 static GtkWidget *window = NULL;
2200 const GdkRGBA white = { 1.0, 1.0, 1.0, 1.0 };
2201 GtkRequisition requisition;
2202 GtkWidget *content_area;
2203 GtkWidget *drawing_area;
2204 GdkPixbuf *tile_pixbuf;
2206 window = gtk_dialog_new_with_buttons ("Rotated Text",
2207 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2208 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2211 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2213 gtk_window_set_screen (GTK_WINDOW (window),
2214 gtk_widget_get_screen (widget));
2216 g_signal_connect (window, "response",
2217 G_CALLBACK (gtk_widget_destroy), NULL);
2218 g_signal_connect (window, "destroy",
2219 G_CALLBACK (gtk_widget_destroyed), &window);
2221 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2223 drawing_area = gtk_drawing_area_new ();
2224 gtk_box_pack_start (GTK_BOX (content_area), drawing_area, TRUE, TRUE, 0);
2225 gtk_widget_override_background_color (drawing_area, 0, &white);
2227 tile_pixbuf = gdk_pixbuf_new_from_file ("marble.xpm", NULL);
2229 g_signal_connect (drawing_area, "draw",
2230 G_CALLBACK (on_rotated_text_draw), tile_pixbuf);
2231 g_signal_connect (drawing_area, "unrealize",
2232 G_CALLBACK (on_rotated_text_unrealize), NULL);
2234 gtk_widget_show_all (gtk_bin_get_child (GTK_BIN (window)));
2236 gtk_widget_set_size_request (drawing_area, DEFAULT_TEXT_RADIUS * 2, DEFAULT_TEXT_RADIUS * 2);
2237 gtk_widget_get_preferred_size ( (window),
2238 &requisition, NULL);
2239 gtk_widget_set_size_request (drawing_area, -1, -1);
2240 gtk_window_resize (GTK_WINDOW (window), requisition.width, requisition.height);
2243 if (!gtk_widget_get_visible (window))
2244 gtk_widget_show (window);
2246 gtk_widget_destroy (window);
2254 reparent_label (GtkWidget *widget,
2255 GtkWidget *new_parent)
2259 label = g_object_get_data (G_OBJECT (widget), "user_data");
2261 gtk_widget_reparent (label, new_parent);
2265 set_parent_signal (GtkWidget *child,
2266 GtkWidget *old_parent,
2271 parent = gtk_widget_get_parent (child);
2272 g_message ("set_parent for \"%s\": new parent: \"%s\", old parent: \"%s\", data: %d\n",
2273 g_type_name (G_OBJECT_TYPE (child)),
2274 parent ? g_type_name (G_OBJECT_TYPE (parent)) : "NULL",
2275 old_parent ? g_type_name (G_OBJECT_TYPE (old_parent)) : "NULL",
2276 GPOINTER_TO_INT (func_data));
2280 create_reparent (GtkWidget *widget)
2282 static GtkWidget *window = NULL;
2289 GtkWidget *separator;
2290 GtkWidget *event_box;
2294 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2296 gtk_window_set_screen (GTK_WINDOW (window),
2297 gtk_widget_get_screen (widget));
2299 g_signal_connect (window, "destroy",
2300 G_CALLBACK (gtk_widget_destroyed),
2303 gtk_window_set_title (GTK_WINDOW (window), "reparent");
2304 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2306 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2307 gtk_container_add (GTK_CONTAINER (window), box1);
2309 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
2310 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2311 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2313 label = gtk_label_new ("Hello World");
2315 frame = gtk_frame_new ("Frame 1");
2316 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2318 box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2319 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2320 gtk_container_add (GTK_CONTAINER (frame), box3);
2322 button = gtk_button_new_with_label ("switch");
2323 g_object_set_data (G_OBJECT (button), "user_data", label);
2324 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2326 event_box = gtk_event_box_new ();
2327 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2328 gtk_container_add (GTK_CONTAINER (event_box), label);
2330 g_signal_connect (button, "clicked",
2331 G_CALLBACK (reparent_label),
2334 g_signal_connect (label, "parent_set",
2335 G_CALLBACK (set_parent_signal),
2336 GINT_TO_POINTER (42));
2338 frame = gtk_frame_new ("Frame 2");
2339 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2341 box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2342 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2343 gtk_container_add (GTK_CONTAINER (frame), box3);
2345 button = gtk_button_new_with_label ("switch");
2346 g_object_set_data (G_OBJECT (button), "user_data", label);
2347 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2349 event_box = gtk_event_box_new ();
2350 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2352 g_signal_connect (button, "clicked",
2353 G_CALLBACK (reparent_label),
2356 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2357 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2359 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2360 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2361 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2363 button = gtk_button_new_with_label ("close");
2364 g_signal_connect_swapped (button, "clicked",
2365 G_CALLBACK (gtk_widget_destroy), window);
2366 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2367 gtk_widget_set_can_default (button, TRUE);
2368 gtk_widget_grab_default (button);
2371 if (!gtk_widget_get_visible (window))
2372 gtk_widget_show_all (window);
2374 gtk_widget_destroy (window);
2381 grippy_button_press (GtkWidget *area, GdkEventButton *event, GdkWindowEdge edge)
2383 if (event->type == GDK_BUTTON_PRESS)
2385 if (event->button == 1)
2386 gtk_window_begin_resize_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)), edge,
2387 event->button, event->x_root, event->y_root,
2389 else if (event->button == 2)
2390 gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)),
2391 event->button, event->x_root, event->y_root,
2398 grippy_draw (GtkWidget *area, cairo_t *cr, GdkWindowEdge edge)
2400 GtkStyleContext *context;
2401 GtkJunctionSides sides;
2405 case GDK_WINDOW_EDGE_NORTH_WEST:
2406 sides = GTK_JUNCTION_CORNER_TOPLEFT;
2408 case GDK_WINDOW_EDGE_NORTH:
2409 sides = GTK_JUNCTION_TOP;
2411 case GDK_WINDOW_EDGE_NORTH_EAST:
2412 sides = GTK_JUNCTION_CORNER_TOPRIGHT;
2414 case GDK_WINDOW_EDGE_WEST:
2415 sides = GTK_JUNCTION_LEFT;
2417 case GDK_WINDOW_EDGE_EAST:
2418 sides = GTK_JUNCTION_RIGHT;
2420 case GDK_WINDOW_EDGE_SOUTH_WEST:
2421 sides = GTK_JUNCTION_CORNER_BOTTOMLEFT;
2423 case GDK_WINDOW_EDGE_SOUTH:
2424 sides = GTK_JUNCTION_BOTTOM;
2426 case GDK_WINDOW_EDGE_SOUTH_EAST:
2427 sides = GTK_JUNCTION_CORNER_BOTTOMRIGHT;
2431 context = gtk_widget_get_style_context (area);
2432 gtk_style_context_save (context);
2433 gtk_style_context_add_class (context, "grip");
2434 gtk_style_context_set_junction_sides (context, sides);
2435 gtk_render_handle (context, cr,
2437 gtk_widget_get_allocated_width (area),
2438 gtk_widget_get_allocated_height (area));
2440 gtk_style_context_restore (context);
2446 create_resize_grips (GtkWidget *widget)
2448 static GtkWidget *window = NULL;
2450 GtkWidget *hbox, *vbox;
2453 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2455 gtk_window_set_screen (GTK_WINDOW (window),
2456 gtk_widget_get_screen (widget));
2458 gtk_window_set_title (GTK_WINDOW (window), "resize grips");
2460 g_signal_connect (window, "destroy",
2461 G_CALLBACK (gtk_widget_destroyed),
2464 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2465 gtk_container_add (GTK_CONTAINER (window), vbox);
2467 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2468 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2471 area = gtk_drawing_area_new ();
2472 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2473 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2474 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2475 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2476 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2477 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2480 area = gtk_drawing_area_new ();
2481 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2482 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2483 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2484 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2485 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2486 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2489 area = gtk_drawing_area_new ();
2490 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2491 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2492 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2493 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2494 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2495 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2497 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2498 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2501 area = gtk_drawing_area_new ();
2502 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2503 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2504 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2505 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2506 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2507 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2510 area = gtk_drawing_area_new ();
2511 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2514 area = gtk_drawing_area_new ();
2515 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2516 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2517 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2518 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2519 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2520 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2523 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2524 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2527 area = gtk_drawing_area_new ();
2528 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2529 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2530 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2531 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2532 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2533 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2535 area = gtk_drawing_area_new ();
2536 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2537 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2538 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2539 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2540 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2541 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2544 area = gtk_drawing_area_new ();
2545 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2546 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2547 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2548 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2549 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2550 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2553 if (!gtk_widget_get_visible (window))
2554 gtk_widget_show_all (window);
2556 gtk_widget_destroy (window);
2562 gint upositionx = 0;
2563 gint upositiony = 0;
2566 uposition_configure (GtkWidget *window)
2572 lx = g_object_get_data (G_OBJECT (window), "x");
2573 ly = g_object_get_data (G_OBJECT (window), "y");
2575 gdk_window_get_root_origin (gtk_widget_get_window (window),
2576 &upositionx, &upositiony);
2577 sprintf (buffer, "%d", upositionx);
2578 gtk_label_set_text (lx, buffer);
2579 sprintf (buffer, "%d", upositiony);
2580 gtk_label_set_text (ly, buffer);
2586 uposition_stop_configure (GtkToggleButton *toggle,
2589 if (gtk_toggle_button_get_active (toggle))
2590 g_signal_handlers_block_by_func (window, G_CALLBACK (uposition_configure), NULL);
2592 g_signal_handlers_unblock_by_func (window, G_CALLBACK (uposition_configure), NULL);
2596 create_saved_position (GtkWidget *widget)
2598 static GtkWidget *window = NULL;
2603 GtkWidget *main_vbox;
2611 window = g_object_connect (g_object_new (GTK_TYPE_WINDOW,
2612 "type", GTK_WINDOW_TOPLEVEL,
2613 "title", "Saved Position",
2615 "signal::configure_event", uposition_configure, NULL,
2618 gtk_window_move (GTK_WINDOW (window), upositionx, upositiony);
2620 gtk_window_set_screen (GTK_WINDOW (window),
2621 gtk_widget_get_screen (widget));
2624 g_signal_connect (window, "destroy",
2625 G_CALLBACK (gtk_widget_destroyed),
2628 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2629 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
2630 gtk_container_add (GTK_CONTAINER (window), main_vbox);
2633 g_object_new (gtk_vbox_get_type (),
2634 "GtkBox::homogeneous", FALSE,
2635 "GtkBox::spacing", 5,
2636 "GtkContainer::border_width", 10,
2637 "GtkWidget::parent", main_vbox,
2638 "GtkWidget::visible", TRUE,
2639 "child", g_object_connect (g_object_new (GTK_TYPE_TOGGLE_BUTTON,
2640 "label", "Stop Events",
2644 "signal::clicked", uposition_stop_configure, window,
2648 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2649 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2650 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2652 label = gtk_label_new ("X Origin : ");
2653 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2654 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
2656 x_label = gtk_label_new ("");
2657 gtk_box_pack_start (GTK_BOX (hbox), x_label, TRUE, TRUE, 0);
2658 g_object_set_data (G_OBJECT (window), "x", x_label);
2660 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2661 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2662 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2664 label = gtk_label_new ("Y Origin : ");
2665 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2666 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
2668 y_label = gtk_label_new ("");
2669 gtk_box_pack_start (GTK_BOX (hbox), y_label, TRUE, TRUE, 0);
2670 g_object_set_data (G_OBJECT (window), "y", y_label);
2673 g_object_new (gtk_hseparator_get_type (),
2674 "GtkWidget::visible", TRUE,
2676 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
2678 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2679 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
2680 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
2682 button = gtk_button_new_with_label ("Close");
2683 g_signal_connect_swapped (button, "clicked",
2684 G_CALLBACK (gtk_widget_destroy),
2686 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
2687 gtk_widget_set_can_default (button, TRUE);
2688 gtk_widget_grab_default (button);
2690 gtk_widget_show_all (window);
2693 gtk_widget_destroy (window);
2701 create_pixbuf (GtkWidget *widget)
2703 static GtkWidget *window = NULL;
2709 GtkWidget *separator;
2710 GtkWidget *pixbufwid;
2711 GdkWindow *gdk_window;
2715 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2717 gtk_window_set_screen (GTK_WINDOW (window),
2718 gtk_widget_get_screen (widget));
2720 g_signal_connect (window, "destroy",
2721 G_CALLBACK (gtk_widget_destroyed),
2724 gtk_window_set_title (GTK_WINDOW (window), "GtkPixmap");
2725 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2726 gtk_widget_realize(window);
2728 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2729 gtk_container_add (GTK_CONTAINER (window), box1);
2731 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2732 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2733 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2735 button = gtk_button_new ();
2736 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
2738 gdk_window = gtk_widget_get_window (window);
2740 pixbufwid = new_pixbuf ("test.xpm", gdk_window);
2742 label = gtk_label_new ("Pixbuf\ntest");
2743 box3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2744 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
2745 gtk_container_add (GTK_CONTAINER (box3), pixbufwid);
2746 gtk_container_add (GTK_CONTAINER (box3), label);
2747 gtk_container_add (GTK_CONTAINER (button), box3);
2749 button = gtk_button_new ();
2750 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
2752 pixbufwid = new_pixbuf ("test.xpm", gdk_window);
2754 label = gtk_label_new ("Pixbuf\ntest");
2755 box3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2756 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
2757 gtk_container_add (GTK_CONTAINER (box3), pixbufwid);
2758 gtk_container_add (GTK_CONTAINER (box3), label);
2759 gtk_container_add (GTK_CONTAINER (button), box3);
2761 gtk_widget_set_sensitive (button, FALSE);
2763 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2764 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2766 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2767 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2768 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2770 button = gtk_button_new_with_label ("close");
2771 g_signal_connect_swapped (button, "clicked",
2772 G_CALLBACK (gtk_widget_destroy),
2774 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2775 gtk_widget_set_can_default (button, TRUE);
2776 gtk_widget_grab_default (button);
2779 if (!gtk_widget_get_visible (window))
2780 gtk_widget_show_all (window);
2782 gtk_widget_destroy (window);
2786 create_tooltips (GtkWidget *widget)
2788 static GtkWidget *window = NULL;
2795 GtkWidget *separator;
2800 g_object_new (gtk_window_get_type (),
2801 "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
2802 "GtkContainer::border_width", 0,
2803 "GtkWindow::title", "Tooltips",
2804 "GtkWindow::resizable", FALSE,
2807 gtk_window_set_screen (GTK_WINDOW (window),
2808 gtk_widget_get_screen (widget));
2810 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2811 gtk_container_add (GTK_CONTAINER (window), box1);
2813 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2814 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2815 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2817 button = gtk_toggle_button_new_with_label ("button1");
2818 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2820 gtk_widget_set_tooltip_text (button, "This is button 1");
2822 button = gtk_toggle_button_new_with_label ("button2");
2823 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2825 gtk_widget_set_tooltip_text (button,
2826 "This is button 2. This is also a really long tooltip which probably "
2827 "won't fit on a single line and will therefore need to be wrapped. "
2828 "Hopefully the wrapping will work correctly.");
2830 toggle = gtk_toggle_button_new_with_label ("Override TipsQuery Label");
2831 gtk_box_pack_start (GTK_BOX (box2), toggle, TRUE, TRUE, 0);
2833 gtk_widget_set_tooltip_text (toggle, "Toggle TipsQuery view.");
2836 g_object_new (gtk_vbox_get_type (),
2837 "homogeneous", FALSE,
2844 g_object_new (gtk_button_get_type (),
2849 gtk_box_set_child_packing (GTK_BOX (box3), button, FALSE, FALSE, 0, GTK_PACK_START);
2850 gtk_widget_set_tooltip_text (button, "Start the Tooltips Inspector");
2852 frame = g_object_new (gtk_frame_get_type (),
2853 "label", "ToolTips Inspector",
2854 "label_xalign", (double) 0.5,
2860 gtk_box_set_child_packing (GTK_BOX (box2), frame, TRUE, TRUE, 10, GTK_PACK_START);
2862 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2863 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2865 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2866 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2867 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2869 button = gtk_button_new_with_label ("close");
2870 g_signal_connect_swapped (button, "clicked",
2871 G_CALLBACK (gtk_widget_destroy),
2873 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2874 gtk_widget_set_can_default (button, TRUE);
2875 gtk_widget_grab_default (button);
2877 gtk_widget_set_tooltip_text (button, "Push this button to close window");
2880 if (!gtk_widget_get_visible (window))
2881 gtk_widget_show_all (window);
2883 gtk_widget_destroy (window);
2891 pack_image (GtkWidget *box,
2895 gtk_box_pack_start (GTK_BOX (box),
2896 gtk_label_new (text),
2899 gtk_box_pack_start (GTK_BOX (box),
2905 create_image (GtkWidget *widget)
2907 static GtkWidget *window = NULL;
2914 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2916 gtk_window_set_screen (GTK_WINDOW (window),
2917 gtk_widget_get_screen (widget));
2919 /* this is bogus for testing drawing when allocation < request,
2920 * don't copy into real code
2922 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2924 g_signal_connect (window, "destroy",
2925 G_CALLBACK (gtk_widget_destroyed),
2928 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2930 gtk_container_add (GTK_CONTAINER (window), vbox);
2932 pack_image (vbox, "Stock Warning Dialog",
2933 gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
2934 GTK_ICON_SIZE_DIALOG));
2936 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
2938 pack_image (vbox, "Pixbuf",
2939 gtk_image_new_from_pixbuf (pixbuf));
2941 g_object_unref (pixbuf);
2944 if (!gtk_widget_get_visible (window))
2945 gtk_widget_show_all (window);
2947 gtk_widget_destroy (window);
2955 create_menu (GdkScreen *screen, gint depth, gint length, gboolean tearoff)
2958 GtkWidget *menuitem;
2967 menu = gtk_menu_new ();
2968 gtk_menu_set_screen (GTK_MENU (menu), screen);
2974 menuitem = gtk_tearoff_menu_item_new ();
2975 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2976 gtk_widget_show (menuitem);
2979 image = gtk_image_new_from_stock (GTK_STOCK_OPEN,
2980 GTK_ICON_SIZE_MENU);
2981 gtk_widget_show (image);
2982 menuitem = gtk_image_menu_item_new_with_label ("Image item");
2983 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
2984 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2985 gtk_widget_show (menuitem);
2987 for (i = 0, j = 1; i < length; i++, j++)
2989 sprintf (buf, "item %2d - %d", depth, j);
2991 menuitem = gtk_radio_menu_item_new_with_label (group, buf);
2992 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
2994 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2995 gtk_widget_show (menuitem);
2997 gtk_widget_set_sensitive (menuitem, FALSE);
3000 gtk_check_menu_item_set_inconsistent (GTK_CHECK_MENU_ITEM (menuitem),
3004 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem),
3005 create_menu (screen, depth - 1, 5, TRUE));
3012 create_table_menu (GdkScreen *screen, gint cols, gint rows, gboolean tearoff)
3015 GtkWidget *menuitem;
3021 menu = gtk_menu_new ();
3022 gtk_menu_set_screen (GTK_MENU (menu), screen);
3027 menuitem = gtk_tearoff_menu_item_new ();
3028 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3029 gtk_widget_show (menuitem);
3033 menuitem = gtk_menu_item_new_with_label ("items");
3034 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3036 submenu = gtk_menu_new ();
3037 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3038 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3039 gtk_widget_show (menuitem);
3042 /* now fill the items submenu */
3043 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3044 GTK_ICON_SIZE_MENU);
3045 gtk_widget_show (image);
3046 menuitem = gtk_image_menu_item_new_with_label ("Image");
3047 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3048 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3049 gtk_widget_show (menuitem);
3051 menuitem = gtk_menu_item_new_with_label ("x");
3052 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 0, 1);
3053 gtk_widget_show (menuitem);
3055 menuitem = gtk_menu_item_new_with_label ("x");
3056 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 2);
3057 gtk_widget_show (menuitem);
3059 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3060 GTK_ICON_SIZE_MENU);
3061 gtk_widget_show (image);
3062 menuitem = gtk_image_menu_item_new_with_label ("Image");
3063 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3064 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3065 gtk_widget_show (menuitem);
3067 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3068 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 2, 3);
3069 gtk_widget_show (menuitem);
3071 menuitem = gtk_menu_item_new_with_label ("x");
3072 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 2, 3);
3073 gtk_widget_show (menuitem);
3075 menuitem = gtk_menu_item_new_with_label ("x");
3076 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 3, 4);
3077 gtk_widget_show (menuitem);
3079 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3080 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 3, 4);
3081 gtk_widget_show (menuitem);
3083 menuitem = gtk_check_menu_item_new_with_label ("Check");
3084 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 4, 5);
3085 gtk_widget_show (menuitem);
3087 menuitem = gtk_menu_item_new_with_label ("x");
3088 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 4, 5);
3089 gtk_widget_show (menuitem);
3091 menuitem = gtk_menu_item_new_with_label ("x");
3092 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 5, 6);
3093 gtk_widget_show (menuitem);
3095 menuitem = gtk_check_menu_item_new_with_label ("Check");
3096 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 5, 6);
3097 gtk_widget_show (menuitem);
3099 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3100 gtk_widget_show (menuitem);
3101 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 8);
3103 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3104 gtk_widget_show (menuitem);
3105 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 2);
3107 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3108 gtk_widget_show (menuitem);
3109 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 0);
3111 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3112 gtk_widget_show (menuitem);
3113 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, -1);
3115 /* end of items submenu */
3117 menuitem = gtk_menu_item_new_with_label ("spanning");
3118 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3120 submenu = gtk_menu_new ();
3121 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3122 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3123 gtk_widget_show (menuitem);
3126 /* now fill the spanning submenu */
3127 menuitem = gtk_menu_item_new_with_label ("a");
3128 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 2, 0, 1);
3129 gtk_widget_show (menuitem);
3131 menuitem = gtk_menu_item_new_with_label ("b");
3132 gtk_menu_attach (GTK_MENU (submenu), menuitem, 2, 3, 0, 2);
3133 gtk_widget_show (menuitem);
3135 menuitem = gtk_menu_item_new_with_label ("c");
3136 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 3);
3137 gtk_widget_show (menuitem);
3139 menuitem = gtk_menu_item_new_with_label ("d");
3140 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3141 gtk_widget_show (menuitem);
3143 menuitem = gtk_menu_item_new_with_label ("e");
3144 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 3, 2, 3);
3145 gtk_widget_show (menuitem);
3146 /* end of spanning submenu */
3148 menuitem = gtk_menu_item_new_with_label ("left");
3149 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, 1, j, j + 1);
3150 submenu = gtk_menu_new ();
3151 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3152 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3153 gtk_widget_show (menuitem);
3155 menuitem = gtk_menu_item_new_with_label ("Empty");
3156 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3157 submenu = gtk_menu_new ();
3158 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3159 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3160 gtk_widget_show (menuitem);
3162 menuitem = gtk_menu_item_new_with_label ("right");
3163 gtk_menu_attach (GTK_MENU (menu), menuitem, 1, 2, j, j + 1);
3164 submenu = gtk_menu_new ();
3165 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3166 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3167 gtk_widget_show (menuitem);
3169 menuitem = gtk_menu_item_new_with_label ("Empty");
3170 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3171 gtk_widget_show (menuitem);
3175 for (; j < rows; j++)
3176 for (i = 0; i < cols; i++)
3178 sprintf (buf, "(%d %d)", i, j);
3179 menuitem = gtk_menu_item_new_with_label (buf);
3180 gtk_menu_attach (GTK_MENU (menu), menuitem, i, i + 1, j, j + 1);
3181 gtk_widget_show (menuitem);
3184 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3185 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 8);
3186 gtk_widget_show (menuitem);
3187 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3188 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 2);
3189 gtk_widget_show (menuitem);
3190 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3191 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 0);
3192 gtk_widget_show (menuitem);
3193 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3194 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, -1);
3195 gtk_widget_show (menuitem);
3201 create_menus (GtkWidget *widget)
3203 static GtkWidget *window = NULL;
3207 GtkWidget *optionmenu;
3208 GtkWidget *separator;
3214 GtkWidget *menuitem;
3215 GtkAccelGroup *accel_group;
3217 GdkScreen *screen = gtk_widget_get_screen (widget);
3219 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3221 gtk_window_set_screen (GTK_WINDOW (window), screen);
3223 g_signal_connect (window, "destroy",
3224 G_CALLBACK (gtk_widget_destroyed),
3226 g_signal_connect (window, "delete-event",
3227 G_CALLBACK (gtk_true),
3230 accel_group = gtk_accel_group_new ();
3231 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3233 gtk_window_set_title (GTK_WINDOW (window), "menus");
3234 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3237 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
3238 gtk_container_add (GTK_CONTAINER (window), box1);
3239 gtk_widget_show (box1);
3241 menubar = gtk_menu_bar_new ();
3242 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3243 gtk_widget_show (menubar);
3245 menu = create_menu (screen, 2, 50, TRUE);
3247 menuitem = gtk_menu_item_new_with_label ("test\nline2");
3248 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3249 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3250 gtk_widget_show (menuitem);
3252 menu = create_table_menu (screen, 2, 50, TRUE);
3254 menuitem = gtk_menu_item_new_with_label ("table");
3255 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3256 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3257 gtk_widget_show (menuitem);
3259 menuitem = gtk_menu_item_new_with_label ("foo");
3260 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5, TRUE));
3261 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3262 gtk_widget_show (menuitem);
3264 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3265 GTK_ICON_SIZE_MENU);
3266 gtk_widget_show (image);
3267 menuitem = gtk_image_menu_item_new_with_label ("Help");
3268 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3269 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 4, 5, TRUE));
3270 gtk_menu_item_set_right_justified (GTK_MENU_ITEM (menuitem), TRUE);
3271 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3272 gtk_widget_show (menuitem);
3274 menubar = gtk_menu_bar_new ();
3275 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3276 gtk_widget_show (menubar);
3278 menu = create_menu (screen, 2, 10, TRUE);
3280 menuitem = gtk_menu_item_new_with_label ("Second menu bar");
3281 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3282 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3283 gtk_widget_show (menuitem);
3285 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3286 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3287 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3288 gtk_widget_show (box2);
3290 menu = create_menu (screen, 1, 5, FALSE);
3291 gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
3293 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
3294 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3295 gtk_widget_show (menuitem);
3297 menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
3298 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3299 gtk_widget_show (menuitem);
3300 gtk_widget_add_accelerator (menuitem,
3306 menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
3307 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3308 gtk_widget_show (menuitem);
3309 gtk_widget_add_accelerator (menuitem,
3314 GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3315 menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
3316 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3317 gtk_widget_show (menuitem);
3318 gtk_widget_add_accelerator (menuitem,
3324 gtk_widget_add_accelerator (menuitem,
3331 optionmenu = gtk_combo_box_text_new ();
3332 gtk_combo_box_set_active (GTK_COMBO_BOX (optionmenu), 3);
3333 gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
3334 gtk_widget_show (optionmenu);
3336 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
3337 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3338 gtk_widget_show (separator);
3340 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3341 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3342 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3343 gtk_widget_show (box2);
3345 button = gtk_button_new_with_label ("close");
3346 g_signal_connect_swapped (button, "clicked",
3347 G_CALLBACK (gtk_widget_destroy),
3349 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3350 gtk_widget_set_can_default (button, TRUE);
3351 gtk_widget_grab_default (button);
3352 gtk_widget_show (button);
3355 if (!gtk_widget_get_visible (window))
3356 gtk_widget_show (window);
3358 gtk_widget_destroy (window);
3361 /* GdkPixbuf RGBA C-Source image dump */
3363 static const guint8 apple[] =
3365 /* Pixbuf magic (0x47646b50) */
3367 /* length: header (24) + pixel_data (2304) */
3369 /* pixdata_type (0x1010002) */
3371 /* rowstride (96) */
3378 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3379 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3380 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3381 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3382 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3383 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3384 "\0\0\0\0\0\0\0\0\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"
3385 "\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"
3386 "\0\0\0\0\0\0\0\0\0\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"
3387 "[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"
3388 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3389 "\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"
3390 "\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"
3391 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3392 "\0\0\0\0\0\0`l\\\20iw_\356y\211h\373x\207g\364~\216i\364u\204e\366gt"
3393 "_\374^jX\241A;-_\0\0\0~\0\0\0\0SM4)SM21B9&\22\320\270\204\1\320\270\204"
3394 "\0\0\0\0\0\0\0\0\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"
3395 "]\212r\200c\366v\205f\371jx_\323_kY\232_kZH^jY\26]iW\211@G9\272:6%j\220"
3396 "\211]\320\221\211`\377\212\203Z\377~xP\377mkE\331]^;|/0\37\21\0\0\0\0"
3397 "\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["
3398 "eT<\216\200Z\203\227\211_\354\234\217c\377\232\217b\362\232\220c\337"
3399 "\243\233k\377\252\241p\377\250\236p\377\241\225h\377\231\214_\377\210"
3400 "\202U\377srI\377[]:\355KO0U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0i"
3401 "v^\200`lY\211^jY\"\0\0\0\0\221\204\\\273\250\233r\377\302\267\224\377"
3402 "\311\300\237\377\272\256\204\377\271\256\177\377\271\257\200\377\267"
3403 "\260\177\377\260\251x\377\250\236l\377\242\225e\377\226\213]\377~zP\377"
3404 "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"
3405 "\0\213\203[v\253\240t\377\334\326\301\377\344\340\317\377\321\312\253"
3406 "\377\303\271\217\377\300\270\213\377\277\267\210\377\272\264\203\377"
3407 "\261\255z\377\250\242n\377\243\232h\377\232\220`\377\210\202V\377nnE"
3408 "\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"
3409 "\234\222e\362\304\274\232\377\337\333\306\377\332\325\273\377\311\302"
3410 "\232\377\312\303\236\377\301\273\216\377\300\271\212\377\270\264\200"
3411 "\377\256\253v\377\246\243n\377\236\232h\377\230\220`\377\213\203V\377"
3412 "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"
3413 "\203Zl\242\234l\377\321\315\260\377\331\324\271\377\320\313\251\377\307"
3414 "\301\232\377\303\276\224\377\300\272\214\377\274\267\206\377\264\260"
3415 "|\377\253\251s\377\244\243n\377\232\230e\377\223\216^\377\207\200U\377"
3416 "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"
3417 "\210\204Y\240\245\237o\377\316\310\253\377\310\303\237\377\304\300\230"
3418 "\377\303\277\225\377\277\272\216\377\274\270\210\377\266\263\200\377"
3419 "\256\254v\377\247\246p\377\237\236j\377\227\226d\377\215\212[\377\203"
3420 "\177T\377qsH\377X]8\377FN.\377DK-\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3421 "\0\0\0\0\207\204X\257\244\240o\377\300\275\231\377\301\275\226\377\274"
3422 "\270\213\377\274\270\214\377\267\264\205\377\264\262\200\377\260\256"
3423 "z\377\251\251s\377\243\244n\377\231\232g\377\220\222`\377\210\211Y\377"
3424 "|}Q\377hlC\377PU3\377CK,\377DL/Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3425 "\0\0\205\204X\220\232\230h\377\261\260\204\377\266\264\212\377\261\260"
3426 "\201\377\263\260\200\377\260\257}\377\256\256x\377\253\254t\377\244\246"
3427 "o\377\233\236i\377\221\224b\377\211\214\\\377\202\204V\377txM\377]b>"
3428 "\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>"
3429 "\215\215_\377\237\237r\377\247\247x\377\247\247t\377\252\252w\377\252"
3430 "\252u\377\252\253t\377\243\246o\377\235\240j\377\223\230c\377\213\217"
3431 "]\377\201\206V\377x}P\377gkD\377RY5\377BI,\377AI,\262\0\0\0\0\0\0\0\0"
3432 "\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"
3433 "\232g\377\234\236i\377\236\241l\377\241\244n\377\240\244m\377\232\237"
3434 "i\377\223\230c\377\212\221]\377\200\210W\377v|P\377jnG\377Za>\377HP2"
3435 "\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"
3436 "\0wzQ6\177\201U\371\206\211Z\377\216\222`\377\220\225a\377\220\225b\377"
3437 "\220\226a\377\213\221_\377\204\213Z\377{\203R\377ryN\377iqH\377^fA\377"
3438 "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"
3439 "\0\0\0\0\0\0\0\0\0\0\0\0ptJTw|Q\371z\177R\377}\202T\377|\203T\377z\200"
3440 "R\377v|O\377pwL\377jpF\377dlB\377`hB\377Yb@\377LT6\377<C*\377\11\12\6"
3441 "\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"
3442 "\0\0\0\0\0\0\0\0\0\0\\`=UgnE\370hnG\377gmE\377djB\377]d>\377[c<\377Y"
3443 "b<\377Zc>\377V_>\377OW8\377BK/\377\16\20\12\377\0\0\0\377\0\0\0\377\0"
3444 "\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"
3445 "\0\1\0\0\0\40\22\24\15\260@D+\377W`;\377OV5\377.3\36\377.3\37\377IP0"
3446 "\377RZ7\377PZ8\3776=&\377\14\15\10\377\0\0\0\377\0\0\0\377\0\0\0\377"
3447 "\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"
3448 "\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"
3449 "\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"
3450 "\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"
3451 "\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"
3452 "\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"
3453 "\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"
3454 "\0\0\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"
3455 "\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"
3456 "\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
3460 accel_button_new (GtkAccelGroup *accel_group,
3465 GdkModifierType modifiers;
3469 gtk_accelerator_parse (accel, &keyval, &modifiers);
3472 button = gtk_button_new ();
3473 gtk_widget_add_accelerator (button, "activate", accel_group,
3474 keyval, modifiers, GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3476 label = gtk_accel_label_new (text);
3477 gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), button);
3478 gtk_widget_show (label);
3480 gtk_container_add (GTK_CONTAINER (button), label);
3486 create_key_lookup (GtkWidget *widget)
3488 static GtkWidget *window = NULL;
3489 gpointer window_ptr;
3493 GtkAccelGroup *accel_group = gtk_accel_group_new ();
3495 GtkWidget *content_area;
3497 window = gtk_dialog_new_with_buttons ("Key Lookup", NULL, 0,
3498 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
3501 gtk_window_set_screen (GTK_WINDOW (window),
3502 gtk_widget_get_screen (widget));
3504 /* We have to expand it so the accel labels will draw their labels
3506 gtk_window_set_default_size (GTK_WINDOW (window), 300, -1);
3508 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3510 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
3512 button = gtk_button_new_with_mnemonic ("Button 1 (_a)");
3513 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3514 button = gtk_button_new_with_mnemonic ("Button 2 (_A)");
3515 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3516 button = gtk_button_new_with_mnemonic ("Button 3 (_\321\204)");
3517 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3518 button = gtk_button_new_with_mnemonic ("Button 4 (_\320\244)");
3519 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3520 button = gtk_button_new_with_mnemonic ("Button 6 (_b)");
3521 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3522 button = accel_button_new (accel_group, "Button 7", "<Alt><Shift>b");
3523 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3524 button = accel_button_new (accel_group, "Button 8", "<Alt>d");
3525 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3526 button = accel_button_new (accel_group, "Button 9", "<Alt>Cyrillic_ve");
3527 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3528 button = gtk_button_new_with_mnemonic ("Button 10 (_1)");
3529 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3530 button = gtk_button_new_with_mnemonic ("Button 11 (_!)");
3531 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3532 button = accel_button_new (accel_group, "Button 12", "<Super>a");
3533 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3534 button = accel_button_new (accel_group, "Button 13", "<Hyper>a");
3535 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3536 button = accel_button_new (accel_group, "Button 14", "<Meta>a");
3537 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3538 button = accel_button_new (accel_group, "Button 15", "<Shift><Mod4>b");
3539 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3541 window_ptr = &window;
3542 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
3543 g_signal_connect (window, "response", G_CALLBACK (gtk_widget_destroy), NULL);
3545 gtk_widget_show_all (window);
3548 gtk_widget_destroy (window);
3557 cmw_destroy_cb(GtkWidget *widget)
3559 /* This is needed to get out of gtk_main */
3566 cmw_color (GtkWidget *widget, GtkWidget *parent)
3569 GtkWidget *colorsel;
3570 GtkWidget *ok_button, *cancel_button;
3572 csd = gtk_color_selection_dialog_new ("This is a modal color selection dialog");
3574 gtk_window_set_screen (GTK_WINDOW (csd), gtk_widget_get_screen (parent));
3576 colorsel = gtk_color_selection_dialog_get_color_selection (GTK_COLOR_SELECTION_DIALOG (csd));
3577 gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (colorsel),
3581 gtk_window_set_modal (GTK_WINDOW(csd),TRUE);
3583 /* And mark it as a transient dialog */
3584 gtk_window_set_transient_for (GTK_WINDOW (csd), GTK_WINDOW (parent));
3586 g_signal_connect (csd, "destroy",
3587 G_CALLBACK (cmw_destroy_cb), NULL);
3590 "ok-button", &ok_button,
3591 "cancel-button", &cancel_button,
3594 g_signal_connect_swapped (ok_button,
3595 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
3596 g_signal_connect_swapped (cancel_button,
3597 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
3599 /* wait until destroy calls gtk_main_quit */
3600 gtk_widget_show (csd);
3605 cmw_file (GtkWidget *widget, GtkWidget *parent)
3609 fs = gtk_file_chooser_dialog_new ("This is a modal file selection dialog",
3610 GTK_WINDOW (parent), GTK_FILE_CHOOSER_ACTION_OPEN,
3611 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
3612 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
3614 gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent));
3615 gtk_window_set_modal (GTK_WINDOW (fs), TRUE);
3617 g_signal_connect (fs, "destroy",
3618 G_CALLBACK (cmw_destroy_cb), NULL);
3619 g_signal_connect_swapped (fs, "response",
3620 G_CALLBACK (gtk_widget_destroy), fs);
3622 /* wait until destroy calls gtk_main_quit */
3623 gtk_widget_show (fs);
3629 create_modal_window (GtkWidget *widget)
3631 GtkWidget *window = NULL;
3632 GtkWidget *box1,*box2;
3634 GtkWidget *btnColor,*btnFile,*btnClose;
3636 /* Create modal window (Here you can use any window descendent )*/
3637 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3638 gtk_window_set_screen (GTK_WINDOW (window),
3639 gtk_widget_get_screen (widget));
3641 gtk_window_set_title (GTK_WINDOW(window),"This window is modal");
3643 /* Set window as modal */
3644 gtk_window_set_modal (GTK_WINDOW(window),TRUE);
3646 /* Create widgets */
3647 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
3648 frame1 = gtk_frame_new ("Standard dialogs in modal form");
3649 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
3650 gtk_box_set_homogeneous (GTK_BOX (box2), TRUE);
3651 btnColor = gtk_button_new_with_label ("Color");
3652 btnFile = gtk_button_new_with_label ("File Selection");
3653 btnClose = gtk_button_new_with_label ("Close");
3656 gtk_container_set_border_width (GTK_CONTAINER (box1), 3);
3657 gtk_container_set_border_width (GTK_CONTAINER (box2), 3);
3660 gtk_container_add (GTK_CONTAINER (window), box1);
3661 gtk_box_pack_start (GTK_BOX (box1), frame1, TRUE, TRUE, 4);
3662 gtk_container_add (GTK_CONTAINER (frame1), box2);
3663 gtk_box_pack_start (GTK_BOX (box2), btnColor, FALSE, FALSE, 4);
3664 gtk_box_pack_start (GTK_BOX (box2), btnFile, FALSE, FALSE, 4);
3665 gtk_box_pack_start (GTK_BOX (box1), gtk_separator_new (GTK_ORIENTATION_HORIZONTAL), FALSE, FALSE, 4);
3666 gtk_box_pack_start (GTK_BOX (box1), btnClose, FALSE, FALSE, 4);
3668 /* connect signals */
3669 g_signal_connect_swapped (btnClose, "clicked",
3670 G_CALLBACK (gtk_widget_destroy), window);
3672 g_signal_connect (window, "destroy",
3673 G_CALLBACK (cmw_destroy_cb), NULL);
3675 g_signal_connect (btnColor, "clicked",
3676 G_CALLBACK (cmw_color), window);
3677 g_signal_connect (btnFile, "clicked",
3678 G_CALLBACK (cmw_file), window);
3681 gtk_widget_show_all (window);
3683 /* wait until dialog get destroyed */
3692 make_message_dialog (GdkScreen *screen,
3694 GtkMessageType type,
3695 GtkButtonsType buttons,
3696 guint default_response)
3700 gtk_widget_destroy (*dialog);
3705 *dialog = gtk_message_dialog_new (NULL, 0, type, buttons,
3706 "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.)");
3708 gtk_window_set_screen (GTK_WINDOW (*dialog), screen);
3710 g_signal_connect_swapped (*dialog,
3712 G_CALLBACK (gtk_widget_destroy),
3715 g_signal_connect (*dialog,
3717 G_CALLBACK (gtk_widget_destroyed),
3720 gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
3722 gtk_widget_show (*dialog);
3726 create_message_dialog (GtkWidget *widget)
3728 static GtkWidget *info = NULL;
3729 static GtkWidget *warning = NULL;
3730 static GtkWidget *error = NULL;
3731 static GtkWidget *question = NULL;
3732 GdkScreen *screen = gtk_widget_get_screen (widget);
3734 make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK);
3735 make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE);
3736 make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK);
3737 make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_NO);
3744 static GtkWidget *sw_parent = NULL;
3745 static GtkWidget *sw_float_parent;
3746 static gulong sw_destroyed_handler = 0;
3749 scrolled_windows_delete_cb (GtkWidget *widget, GdkEventAny *event, GtkWidget *scrollwin)
3751 gtk_widget_reparent (scrollwin, sw_parent);
3753 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
3754 sw_float_parent = NULL;
3756 sw_destroyed_handler = 0;
3762 scrolled_windows_destroy_cb (GtkWidget *widget, GtkWidget *scrollwin)
3764 gtk_widget_destroy (sw_float_parent);
3766 sw_float_parent = NULL;
3768 sw_destroyed_handler = 0;
3772 scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
3776 gtk_widget_reparent (scrollwin, sw_parent);
3777 gtk_widget_destroy (sw_float_parent);
3779 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
3780 sw_float_parent = NULL;
3782 sw_destroyed_handler = 0;
3786 sw_parent = gtk_widget_get_parent (scrollwin);
3787 sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3788 gtk_window_set_screen (GTK_WINDOW (sw_float_parent),
3789 gtk_widget_get_screen (widget));
3791 gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200);
3793 gtk_widget_reparent (scrollwin, sw_float_parent);
3794 gtk_widget_show (sw_float_parent);
3796 sw_destroyed_handler =
3797 g_signal_connect (sw_parent, "destroy",
3798 G_CALLBACK (scrolled_windows_destroy_cb), scrollwin);
3799 g_signal_connect (sw_float_parent, "delete_event",
3800 G_CALLBACK (scrolled_windows_delete_cb), scrollwin);
3805 create_scrolled_windows (GtkWidget *widget)
3807 static GtkWidget *window;
3808 GtkWidget *content_area, *action_area;
3809 GtkWidget *scrolled_window;
3817 window = gtk_dialog_new ();
3819 gtk_window_set_screen (GTK_WINDOW (window),
3820 gtk_widget_get_screen (widget));
3822 g_signal_connect (window, "destroy",
3823 G_CALLBACK (gtk_widget_destroyed),
3826 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
3827 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
3829 gtk_window_set_title (GTK_WINDOW (window), "dialog");
3830 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3832 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
3833 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
3834 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
3835 GTK_POLICY_AUTOMATIC,
3836 GTK_POLICY_AUTOMATIC);
3837 gtk_box_pack_start (GTK_BOX (content_area), scrolled_window, TRUE, TRUE, 0);
3838 gtk_widget_show (scrolled_window);
3840 table = gtk_table_new (20, 20, FALSE);
3841 gtk_table_set_row_spacings (GTK_TABLE (table), 10);
3842 gtk_table_set_col_spacings (GTK_TABLE (table), 10);
3843 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
3844 gtk_container_set_focus_hadjustment (GTK_CONTAINER (table),
3845 gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
3846 gtk_container_set_focus_vadjustment (GTK_CONTAINER (table),
3847 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
3848 gtk_widget_show (table);
3850 for (i = 0; i < 20; i++)
3851 for (j = 0; j < 20; j++)
3853 sprintf (buffer, "button (%d,%d)\n", i, j);
3854 button = gtk_toggle_button_new_with_label (buffer);
3855 gtk_table_attach_defaults (GTK_TABLE (table), button,
3857 gtk_widget_show (button);
3861 button = gtk_button_new_with_label ("Close");
3862 g_signal_connect_swapped (button, "clicked",
3863 G_CALLBACK (gtk_widget_destroy),
3865 gtk_widget_set_can_default (button, TRUE);
3866 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
3867 gtk_widget_grab_default (button);
3868 gtk_widget_show (button);
3870 button = gtk_button_new_with_label ("Reparent Out");
3871 g_signal_connect (button, "clicked",
3872 G_CALLBACK (scrolled_windows_remove),
3874 gtk_widget_set_can_default (button, TRUE);
3875 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
3876 gtk_widget_grab_default (button);
3877 gtk_widget_show (button);
3879 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
3882 if (!gtk_widget_get_visible (window))
3883 gtk_widget_show (window);
3885 gtk_widget_destroy (window);
3893 entry_toggle_frame (GtkWidget *checkbutton,
3896 gtk_entry_set_has_frame (GTK_ENTRY(entry),
3897 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
3901 entry_toggle_sensitive (GtkWidget *checkbutton,
3904 gtk_widget_set_sensitive (entry,
3905 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(checkbutton)));
3909 entry_progress_timeout (gpointer data)
3911 if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (data), "progress-pulse")))
3913 gtk_entry_progress_pulse (GTK_ENTRY (data));
3919 fraction = gtk_entry_get_progress_fraction (GTK_ENTRY (data));
3922 if (fraction > 1.0001)
3925 gtk_entry_set_progress_fraction (GTK_ENTRY (data), fraction);
3932 entry_remove_timeout (gpointer data)
3934 g_source_remove (GPOINTER_TO_UINT (data));
3938 entry_toggle_progress (GtkWidget *checkbutton,
3941 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)))
3943 guint timeout = gdk_threads_add_timeout (100,
3944 entry_progress_timeout,
3946 g_object_set_data_full (G_OBJECT (entry), "timeout-id",
3947 GUINT_TO_POINTER (timeout),
3948 entry_remove_timeout);
3952 g_object_set_data (G_OBJECT (entry), "timeout-id",
3953 GUINT_TO_POINTER (0));
3955 gtk_entry_set_progress_fraction (GTK_ENTRY (entry), 0.0);
3960 entry_toggle_pulse (GtkWidget *checkbutton,
3963 g_object_set_data (G_OBJECT (entry), "progress-pulse",
3964 GUINT_TO_POINTER ((guint) gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton))));
3968 props_clicked (GtkWidget *button,
3971 GtkWidget *window = create_prop_editor (object, 0);
3973 gtk_window_set_title (GTK_WINDOW (window), "Object Properties");
3977 create_entry (GtkWidget *widget)
3979 static GtkWidget *window = NULL;
3983 GtkWidget *has_frame_check;
3984 GtkWidget *sensitive_check;
3985 GtkWidget *progress_check;
3987 GtkComboBoxText *cb;
3988 GtkWidget *cb_entry;
3990 GtkWidget *separator;
3994 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3995 gtk_window_set_screen (GTK_WINDOW (window),
3996 gtk_widget_get_screen (widget));
3998 g_signal_connect (window, "destroy",
3999 G_CALLBACK (gtk_widget_destroyed),
4002 gtk_window_set_title (GTK_WINDOW (window), "entry");
4003 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4006 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4007 gtk_container_add (GTK_CONTAINER (window), box1);
4010 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
4011 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4012 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
4014 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
4015 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
4017 entry = gtk_entry_new ();
4018 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");
4019 gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5);
4020 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
4022 button = gtk_button_new_with_mnemonic ("_Props");
4023 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
4024 g_signal_connect (button, "clicked",
4025 G_CALLBACK (props_clicked),
4028 cb = GTK_COMBO_BOX_TEXT (gtk_combo_box_text_new_with_entry ());
4030 gtk_combo_box_text_append_text (cb, "item0");
4031 gtk_combo_box_text_append_text (cb, "item0");
4032 gtk_combo_box_text_append_text (cb, "item1 item1");
4033 gtk_combo_box_text_append_text (cb, "item2 item2 item2");
4034 gtk_combo_box_text_append_text (cb, "item3 item3 item3 item3");
4035 gtk_combo_box_text_append_text (cb, "item4 item4 item4 item4 item4");
4036 gtk_combo_box_text_append_text (cb, "item5 item5 item5 item5 item5 item5");
4037 gtk_combo_box_text_append_text (cb, "item6 item6 item6 item6 item6");
4038 gtk_combo_box_text_append_text (cb, "item7 item7 item7 item7");
4039 gtk_combo_box_text_append_text (cb, "item8 item8 item8");
4040 gtk_combo_box_text_append_text (cb, "item9 item9");
4042 cb_entry = gtk_bin_get_child (GTK_BIN (cb));
4043 gtk_entry_set_text (GTK_ENTRY (cb_entry), "hello world \n\n\n foo");
4044 gtk_editable_select_region (GTK_EDITABLE (cb_entry), 0, -1);
4045 gtk_box_pack_start (GTK_BOX (box2), GTK_WIDGET (cb), TRUE, TRUE, 0);
4047 sensitive_check = gtk_check_button_new_with_label("Sensitive");
4048 gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0);
4049 g_signal_connect (sensitive_check, "toggled",
4050 G_CALLBACK (entry_toggle_sensitive), entry);
4051 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sensitive_check), TRUE);
4053 has_frame_check = gtk_check_button_new_with_label("Has Frame");
4054 gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0);
4055 g_signal_connect (has_frame_check, "toggled",
4056 G_CALLBACK (entry_toggle_frame), entry);
4057 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
4059 progress_check = gtk_check_button_new_with_label("Show Progress");
4060 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4061 g_signal_connect (progress_check, "toggled",
4062 G_CALLBACK (entry_toggle_progress), entry);
4064 progress_check = gtk_check_button_new_with_label("Pulse Progress");
4065 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4066 g_signal_connect (progress_check, "toggled",
4067 G_CALLBACK (entry_toggle_pulse), entry);
4069 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
4070 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4072 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
4073 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4074 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4076 button = gtk_button_new_with_label ("close");
4077 g_signal_connect_swapped (button, "clicked",
4078 G_CALLBACK (gtk_widget_destroy),
4080 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4081 gtk_widget_set_can_default (button, TRUE);
4082 gtk_widget_grab_default (button);
4085 if (!gtk_widget_get_visible (window))
4086 gtk_widget_show_all (window);
4088 gtk_widget_destroy (window);
4092 create_expander (GtkWidget *widget)
4095 GtkWidget *expander;
4097 static GtkWidget *window = NULL;
4101 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4102 gtk_window_set_screen (GTK_WINDOW (window),
4103 gtk_widget_get_screen (widget));
4105 g_signal_connect (window, "destroy",
4106 G_CALLBACK (gtk_widget_destroyed),
4109 gtk_window_set_title (GTK_WINDOW (window), "expander");
4110 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4112 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4113 gtk_container_add (GTK_CONTAINER (window), box1);
4115 expander = gtk_expander_new ("The Hidden");
4117 gtk_box_pack_start (GTK_BOX (box1), expander, TRUE, TRUE, 0);
4119 hidden = gtk_label_new ("Revealed!");
4121 gtk_container_add (GTK_CONTAINER (expander), hidden);
4124 if (!gtk_widget_get_visible (window))
4125 gtk_widget_show_all (window);
4127 gtk_widget_destroy (window);
4135 event_box_label_pressed (GtkWidget *widget,
4136 GdkEventButton *event,
4139 g_print ("clicked on event box\n");
4143 event_box_button_clicked (GtkWidget *widget,
4147 g_print ("pushed button\n");
4151 event_box_toggle_visible_window (GtkWidget *checkbutton,
4152 GtkEventBox *event_box)
4154 gtk_event_box_set_visible_window (event_box,
4155 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
4159 event_box_toggle_above_child (GtkWidget *checkbutton,
4160 GtkEventBox *event_box)
4162 gtk_event_box_set_above_child (event_box,
4163 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
4167 create_event_box (GtkWidget *widget)
4169 static GtkWidget *window = NULL;
4175 GtkWidget *separator;
4176 GtkWidget *event_box;
4178 GtkWidget *visible_window_check;
4179 GtkWidget *above_child_check;
4189 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4190 gtk_window_set_screen (GTK_WINDOW (window),
4191 gtk_widget_get_screen (widget));
4193 g_signal_connect (window, "destroy",
4194 G_CALLBACK (gtk_widget_destroyed),
4197 gtk_window_set_title (GTK_WINDOW (window), "event box");
4198 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4200 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4201 gtk_container_add (GTK_CONTAINER (window), box1);
4202 gtk_widget_override_background_color (window, 0, &color);
4204 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4205 gtk_box_pack_start (GTK_BOX (box1), hbox, TRUE, FALSE, 0);
4207 event_box = gtk_event_box_new ();
4208 gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, FALSE, 0);
4210 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4211 gtk_container_add (GTK_CONTAINER (event_box), vbox);
4212 g_signal_connect (event_box, "button_press_event",
4213 G_CALLBACK (event_box_label_pressed),
4216 label = gtk_label_new ("Click on this label");
4217 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
4219 button = gtk_button_new_with_label ("button in eventbox");
4220 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, FALSE, 0);
4221 g_signal_connect (button, "clicked",
4222 G_CALLBACK (event_box_button_clicked),
4226 visible_window_check = gtk_check_button_new_with_label("Visible Window");
4227 gtk_box_pack_start (GTK_BOX (box1), visible_window_check, FALSE, TRUE, 0);
4228 g_signal_connect (visible_window_check, "toggled",
4229 G_CALLBACK (event_box_toggle_visible_window), event_box);
4230 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (visible_window_check), FALSE);
4232 above_child_check = gtk_check_button_new_with_label("Above Child");
4233 gtk_box_pack_start (GTK_BOX (box1), above_child_check, FALSE, TRUE, 0);
4234 g_signal_connect (above_child_check, "toggled",
4235 G_CALLBACK (event_box_toggle_above_child), event_box);
4236 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (above_child_check), FALSE);
4238 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
4239 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4241 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
4242 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4243 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4245 button = gtk_button_new_with_label ("close");
4246 g_signal_connect_swapped (button, "clicked",
4247 G_CALLBACK (gtk_widget_destroy),
4249 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4250 gtk_widget_set_can_default (button, TRUE);
4251 gtk_widget_grab_default (button);
4254 if (!gtk_widget_get_visible (window))
4255 gtk_widget_show_all (window);
4257 gtk_widget_destroy (window);
4265 #define SIZE_GROUP_INITIAL_SIZE 50
4268 size_group_hsize_changed (GtkSpinButton *spin_button,
4271 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4272 gtk_spin_button_get_value_as_int (spin_button),
4277 size_group_vsize_changed (GtkSpinButton *spin_button,
4280 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4282 gtk_spin_button_get_value_as_int (spin_button));
4286 create_size_group_window (GdkScreen *screen,
4287 GtkSizeGroup *master_size_group)
4289 GtkWidget *content_area;
4292 GtkWidget *main_button;
4294 GtkWidget *spin_button;
4296 GtkSizeGroup *hgroup1;
4297 GtkSizeGroup *hgroup2;
4298 GtkSizeGroup *vgroup1;
4299 GtkSizeGroup *vgroup2;
4301 window = gtk_dialog_new_with_buttons ("GtkSizeGroup",
4307 gtk_window_set_screen (GTK_WINDOW (window), screen);
4309 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
4311 g_signal_connect (window, "response",
4312 G_CALLBACK (gtk_widget_destroy),
4315 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
4317 table = gtk_table_new (2, 2, FALSE);
4318 gtk_box_pack_start (GTK_BOX (content_area), table, TRUE, TRUE, 0);
4320 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
4321 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
4322 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
4323 gtk_widget_set_size_request (table, 250, 250);
4325 hgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4326 hgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4327 vgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4328 vgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4330 main_button = gtk_button_new_with_label ("X");
4332 gtk_table_attach (GTK_TABLE (table), main_button,
4334 GTK_EXPAND, GTK_EXPAND,
4336 gtk_size_group_add_widget (master_size_group, main_button);
4337 gtk_size_group_add_widget (hgroup1, main_button);
4338 gtk_size_group_add_widget (vgroup1, main_button);
4339 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (main_button)),
4340 SIZE_GROUP_INITIAL_SIZE,
4341 SIZE_GROUP_INITIAL_SIZE);
4343 button = gtk_button_new ();
4344 gtk_table_attach (GTK_TABLE (table), button,
4346 GTK_EXPAND, GTK_EXPAND,
4348 gtk_size_group_add_widget (vgroup1, button);
4349 gtk_size_group_add_widget (vgroup2, button);
4351 button = gtk_button_new ();
4352 gtk_table_attach (GTK_TABLE (table), button,
4354 GTK_EXPAND, GTK_EXPAND,
4356 gtk_size_group_add_widget (hgroup1, button);
4357 gtk_size_group_add_widget (hgroup2, button);
4359 button = gtk_button_new ();
4360 gtk_table_attach (GTK_TABLE (table), button,
4362 GTK_EXPAND, GTK_EXPAND,
4364 gtk_size_group_add_widget (hgroup2, button);
4365 gtk_size_group_add_widget (vgroup2, button);
4367 g_object_unref (hgroup1);
4368 g_object_unref (hgroup2);
4369 g_object_unref (vgroup1);
4370 g_object_unref (vgroup2);
4372 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
4373 gtk_box_pack_start (GTK_BOX (content_area), hbox, FALSE, FALSE, 0);
4375 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4376 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4377 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4378 g_signal_connect (spin_button, "value_changed",
4379 G_CALLBACK (size_group_hsize_changed), main_button);
4381 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4382 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4383 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4384 g_signal_connect (spin_button, "value_changed",
4385 G_CALLBACK (size_group_vsize_changed), main_button);
4391 create_size_groups (GtkWidget *widget)
4393 static GtkWidget *window1 = NULL;
4394 static GtkWidget *window2 = NULL;
4395 static GtkSizeGroup *master_size_group;
4397 if (!master_size_group)
4398 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
4402 window1 = create_size_group_window (gtk_widget_get_screen (widget),
4405 g_signal_connect (window1, "destroy",
4406 G_CALLBACK (gtk_widget_destroyed),
4412 window2 = create_size_group_window (gtk_widget_get_screen (widget),
4415 g_signal_connect (window2, "destroy",
4416 G_CALLBACK (gtk_widget_destroyed),
4420 if (gtk_widget_get_visible (window1) && gtk_widget_get_visible (window2))
4422 gtk_widget_destroy (window1);
4423 gtk_widget_destroy (window2);
4427 if (!gtk_widget_get_visible (window1))
4428 gtk_widget_show_all (window1);
4429 if (!gtk_widget_get_visible (window2))
4430 gtk_widget_show_all (window2);
4438 static GtkWidget *spinner1;
4441 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
4443 gtk_spin_button_set_snap_to_ticks (spin,
4444 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
4448 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
4450 gtk_spin_button_set_numeric (spin,
4451 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
4455 change_digits (GtkWidget *widget, GtkSpinButton *spin)
4457 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
4458 gtk_spin_button_get_value_as_int (spin));
4462 get_value (GtkWidget *widget, gpointer data)
4466 GtkSpinButton *spin;
4468 spin = GTK_SPIN_BUTTON (spinner1);
4469 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
4470 if (GPOINTER_TO_INT (data) == 1)
4471 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
4473 sprintf (buf, "%0.*f",
4474 gtk_spin_button_get_digits (spin),
4475 gtk_spin_button_get_value (spin));
4477 gtk_label_set_text (label, buf);
4481 get_spin_value (GtkWidget *widget, gpointer data)
4485 GtkSpinButton *spin;
4487 spin = GTK_SPIN_BUTTON (widget);
4488 label = GTK_LABEL (data);
4490 buffer = g_strdup_printf ("%0.*f",
4491 gtk_spin_button_get_digits (spin),
4492 gtk_spin_button_get_value (spin));
4493 gtk_label_set_text (label, buffer);
4499 spin_button_time_output_func (GtkSpinButton *spin_button)
4501 GtkAdjustment *adjustment;
4502 static gchar buf[6];
4506 adjustment = gtk_spin_button_get_adjustment (spin_button);
4507 hours = gtk_adjustment_get_value (adjustment) / 60.0;
4508 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
4509 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
4510 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4511 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4516 spin_button_month_input_func (GtkSpinButton *spin_button,
4520 static gchar *month[12] = { "January", "February", "March", "April",
4521 "May", "June", "July", "August",
4522 "September", "October", "November", "December" };
4524 gboolean found = FALSE;
4526 for (i = 1; i <= 12; i++)
4528 tmp1 = g_ascii_strup (month[i - 1], -1);
4529 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
4530 if (strstr (tmp1, tmp2) == tmp1)
4540 return GTK_INPUT_ERROR;
4542 *new_val = (gdouble) i;
4547 spin_button_month_output_func (GtkSpinButton *spin_button)
4549 GtkAdjustment *adjustment;
4552 static gchar *month[12] = { "January", "February", "March", "April",
4553 "May", "June", "July", "August", "September",
4554 "October", "November", "December" };
4556 adjustment = gtk_spin_button_get_adjustment (spin_button);
4557 value = gtk_adjustment_get_value (adjustment);
4558 for (i = 1; i <= 12; i++)
4559 if (fabs (value - (double)i) < 1e-5)
4561 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
4562 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
4568 spin_button_hex_input_func (GtkSpinButton *spin_button,
4575 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
4576 res = strtol(buf, &err, 16);
4579 return GTK_INPUT_ERROR;
4585 spin_button_hex_output_func (GtkSpinButton *spin_button)
4587 GtkAdjustment *adjustment;
4588 static gchar buf[7];
4591 adjustment = gtk_spin_button_get_adjustment (spin_button);
4592 val = (gint) gtk_adjustment_get_value (adjustment);
4593 if (fabs (val) < 1e-5)
4594 sprintf (buf, "0x00");
4596 sprintf (buf, "0x%.2X", val);
4597 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4598 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4603 create_spins (GtkWidget *widget)
4605 static GtkWidget *window = NULL;
4608 GtkWidget *main_vbox;
4611 GtkWidget *spinner2;
4615 GtkWidget *val_label;
4620 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4621 gtk_window_set_screen (GTK_WINDOW (window),
4622 gtk_widget_get_screen (widget));
4624 g_signal_connect (window, "destroy",
4625 G_CALLBACK (gtk_widget_destroyed),
4628 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
4630 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
4631 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
4632 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4634 frame = gtk_frame_new ("Not accelerated");
4635 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4637 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4638 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4639 gtk_container_add (GTK_CONTAINER (frame), vbox);
4641 /* Time, month, hex spinners */
4643 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4644 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
4646 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4647 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4649 label = gtk_label_new ("Time :");
4650 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4651 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4653 adj = gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
4654 spinner = gtk_spin_button_new (adj, 0, 0);
4655 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
4656 g_signal_connect (spinner,
4658 G_CALLBACK (spin_button_time_output_func),
4660 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4661 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 5);
4662 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4664 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4665 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4667 label = gtk_label_new ("Month :");
4668 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4669 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4671 adj = gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
4673 spinner = gtk_spin_button_new (adj, 0, 0);
4674 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
4675 GTK_UPDATE_IF_VALID);
4676 g_signal_connect (spinner,
4678 G_CALLBACK (spin_button_month_input_func),
4680 g_signal_connect (spinner,
4682 G_CALLBACK (spin_button_month_output_func),
4684 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4685 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 9);
4686 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4688 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4689 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4691 label = gtk_label_new ("Hex :");
4692 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4693 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4695 adj = gtk_adjustment_new (0, 0, 255, 1, 16, 0);
4696 spinner = gtk_spin_button_new (adj, 0, 0);
4697 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
4698 g_signal_connect (spinner,
4700 G_CALLBACK (spin_button_hex_input_func),
4702 g_signal_connect (spinner,
4704 G_CALLBACK (spin_button_hex_output_func),
4706 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4707 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 4);
4708 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4710 frame = gtk_frame_new ("Accelerated");
4711 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4713 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4714 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4715 gtk_container_add (GTK_CONTAINER (frame), vbox);
4717 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4718 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4720 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4721 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4723 label = gtk_label_new ("Value :");
4724 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4725 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4727 adj = gtk_adjustment_new (0.0, -10000.0, 10000.0,
4729 spinner1 = gtk_spin_button_new (adj, 1.0, 2);
4730 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
4731 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
4733 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4734 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4736 label = gtk_label_new ("Digits :");
4737 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4738 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4740 adj = gtk_adjustment_new (2, 1, 15, 1, 1, 0);
4741 spinner2 = gtk_spin_button_new (adj, 0.0, 0);
4742 g_signal_connect (adj, "value_changed",
4743 G_CALLBACK (change_digits),
4745 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
4747 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4748 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
4750 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
4751 g_signal_connect (button, "clicked",
4752 G_CALLBACK (toggle_snap),
4754 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4755 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4757 button = gtk_check_button_new_with_label ("Numeric only input mode");
4758 g_signal_connect (button, "clicked",
4759 G_CALLBACK (toggle_numeric),
4761 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4762 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4764 val_label = gtk_label_new ("");
4766 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4767 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4769 button = gtk_button_new_with_label ("Value as Int");
4770 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4771 g_signal_connect (button, "clicked",
4772 G_CALLBACK (get_value),
4773 GINT_TO_POINTER (1));
4774 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4776 button = gtk_button_new_with_label ("Value as Float");
4777 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4778 g_signal_connect (button, "clicked",
4779 G_CALLBACK (get_value),
4780 GINT_TO_POINTER (2));
4781 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4783 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
4784 gtk_label_set_text (GTK_LABEL (val_label), "0");
4786 frame = gtk_frame_new ("Using Convenience Constructor");
4787 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4789 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4790 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4791 gtk_container_add (GTK_CONTAINER (frame), hbox);
4793 val_label = gtk_label_new ("0.0");
4795 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
4796 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
4797 g_signal_connect (spinner, "value_changed",
4798 G_CALLBACK (get_spin_value), val_label);
4799 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
4800 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
4802 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4803 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
4805 button = gtk_button_new_with_label ("Close");
4806 g_signal_connect_swapped (button, "clicked",
4807 G_CALLBACK (gtk_widget_destroy),
4809 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4812 if (!gtk_widget_get_visible (window))
4813 gtk_widget_show_all (window);
4815 gtk_widget_destroy (window);
4824 cursor_draw (GtkWidget *widget,
4829 GtkStyleContext *context;
4832 width = gtk_widget_get_allocated_width (widget);
4833 height = gtk_widget_get_allocated_height (widget);
4835 cairo_set_source_rgb (cr, 1, 1, 1);
4836 cairo_rectangle (cr, 0, 0, width, height / 2);
4839 cairo_set_source_rgb (cr, 0, 0, 0);
4840 cairo_rectangle (cr, 0, height / 2, width, height / 2);
4843 context = gtk_widget_get_style_context (widget);
4844 gtk_style_context_get (context, 0, "background-color", &bg, NULL);
4845 gdk_cairo_set_source_rgba (cr, bg);
4847 cairo_rectangle (cr, width / 3, height / 3, width / 3, height / 3);
4854 set_cursor (GtkWidget *spinner,
4863 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
4866 label = g_object_get_data (G_OBJECT (spinner), "user_data");
4868 class = g_type_class_ref (GDK_TYPE_CURSOR_TYPE);
4869 vals = class->values;
4871 while (vals && vals->value != c)
4874 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
4876 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
4878 g_type_class_unref (class);
4880 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
4881 gdk_window_set_cursor (gtk_widget_get_window (widget),
4883 g_object_unref (cursor);
4887 cursor_event (GtkWidget *widget,
4889 GtkSpinButton *spinner)
4891 if ((event->type == GDK_BUTTON_PRESS) &&
4892 ((event->button.button == 1) ||
4893 (event->button.button == 3)))
4895 gtk_spin_button_spin (spinner, event->button.button == 1 ?
4896 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
4903 #ifdef GDK_WINDOWING_X11
4904 #include "x11/gdkx.h"
4907 change_cursor_theme (GtkWidget *widget,
4914 children = gtk_container_get_children (GTK_CONTAINER (data));
4916 theme = gtk_entry_get_text (GTK_ENTRY (children->next->data));
4917 size = (gint) gtk_spin_button_get_value (GTK_SPIN_BUTTON (children->next->next->data));
4919 g_list_free (children);
4921 gdk_x11_display_set_cursor_theme (gtk_widget_get_display (widget),
4928 create_cursors (GtkWidget *widget)
4930 static GtkWidget *window = NULL;
4933 GtkWidget *main_vbox;
4946 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4947 gtk_window_set_screen (GTK_WINDOW (window),
4948 gtk_widget_get_screen (widget));
4950 g_signal_connect (window, "destroy",
4951 G_CALLBACK (gtk_widget_destroyed),
4954 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
4956 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
4957 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
4958 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4961 g_object_new (gtk_vbox_get_type (),
4962 "GtkBox::homogeneous", FALSE,
4963 "GtkBox::spacing", 5,
4964 "GtkContainer::border_width", 10,
4965 "GtkWidget::parent", main_vbox,
4966 "GtkWidget::visible", TRUE,
4969 #ifdef GDK_WINDOWING_X11
4970 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4971 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4972 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
4974 label = gtk_label_new ("Cursor Theme : ");
4975 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4976 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
4978 entry = gtk_entry_new ();
4979 gtk_entry_set_text (GTK_ENTRY (entry), "default");
4980 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, TRUE, 0);
4982 size = gtk_spin_button_new_with_range (1.0, 64.0, 1.0);
4983 gtk_spin_button_set_value (GTK_SPIN_BUTTON (size), 24.0);
4984 gtk_box_pack_start (GTK_BOX (hbox), size, TRUE, TRUE, 0);
4986 g_signal_connect (entry, "changed",
4987 G_CALLBACK (change_cursor_theme), hbox);
4988 g_signal_connect (size, "changed",
4989 G_CALLBACK (change_cursor_theme), hbox);
4992 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4993 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4994 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
4996 label = gtk_label_new ("Cursor Value : ");
4997 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4998 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5000 adj = gtk_adjustment_new (0,
5004 spinner = gtk_spin_button_new (adj, 0, 0);
5005 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
5008 g_object_new (gtk_frame_get_type (),
5009 "GtkFrame::label_xalign", 0.5,
5010 "GtkFrame::label", "Cursor Area",
5011 "GtkContainer::border_width", 10,
5012 "GtkWidget::parent", vbox,
5013 "GtkWidget::visible", TRUE,
5016 darea = gtk_drawing_area_new ();
5017 gtk_widget_set_size_request (darea, 80, 80);
5018 gtk_container_add (GTK_CONTAINER (frame), darea);
5019 g_signal_connect (darea,
5021 G_CALLBACK (cursor_draw),
5023 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
5024 g_signal_connect (darea,
5025 "button_press_event",
5026 G_CALLBACK (cursor_event),
5028 gtk_widget_show (darea);
5030 g_signal_connect (spinner, "changed",
5031 G_CALLBACK (set_cursor),
5034 label = g_object_new (GTK_TYPE_LABEL,
5039 gtk_container_child_set (GTK_CONTAINER (vbox), label,
5042 g_object_set_data (G_OBJECT (spinner), "user_data", label);
5045 g_object_new (gtk_hseparator_get_type (),
5046 "GtkWidget::visible", TRUE,
5048 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
5050 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
5051 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
5052 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5054 button = gtk_button_new_with_label ("Close");
5055 g_signal_connect_swapped (button, "clicked",
5056 G_CALLBACK (gtk_widget_destroy),
5058 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5060 gtk_widget_show_all (window);
5062 set_cursor (spinner, darea);
5065 gtk_widget_destroy (window);
5073 color_selection_ok (GtkWidget *w,
5074 GtkColorSelectionDialog *cs)
5076 GtkWidget *colorsel;
5079 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5081 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5082 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5086 color_selection_changed (GtkWidget *w,
5087 GtkColorSelectionDialog *cs)
5089 GtkWidget *colorsel;
5092 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5093 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5094 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5099 opacity_toggled_cb (GtkWidget *w,
5100 GtkColorSelectionDialog *cs)
5102 GtkColorSelection *colorsel;
5104 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5105 gtk_color_selection_set_has_opacity_control (colorsel,
5106 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5110 palette_toggled_cb (GtkWidget *w,
5111 GtkColorSelectionDialog *cs)
5113 GtkColorSelection *colorsel;
5115 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5116 gtk_color_selection_set_has_palette (colorsel,
5117 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5122 create_color_selection (GtkWidget *widget)
5124 static GtkWidget *window = NULL;
5133 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5134 gtk_window_set_screen (GTK_WINDOW (window),
5135 gtk_widget_get_screen (widget));
5137 g_signal_connect (window, "destroy",
5138 G_CALLBACK (gtk_widget_destroyed),
5141 gtk_window_set_title (GTK_WINDOW (window), "GtkColorButton");
5142 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5144 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
5145 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5146 gtk_container_add (GTK_CONTAINER (window), hbox);
5148 label = gtk_label_new ("Pick a color");
5149 gtk_container_add (GTK_CONTAINER (hbox), label);
5151 picker = gtk_color_button_new ();
5152 gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (picker), TRUE);
5153 gtk_container_add (GTK_CONTAINER (hbox), picker);
5155 button = gtk_button_new_with_mnemonic ("_Props");
5156 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
5157 g_signal_connect (button, "clicked",
5158 G_CALLBACK (props_clicked),
5162 if (!gtk_widget_get_visible (window))
5163 gtk_widget_show_all (window);
5165 gtk_widget_destroy (window);
5169 flipping_toggled_cb (GtkWidget *widget, gpointer data)
5171 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
5172 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
5174 gtk_widget_set_default_direction (new_direction);
5178 orientable_toggle_orientation (GtkOrientable *orientable)
5180 GtkOrientation orientation;
5182 orientation = gtk_orientable_get_orientation (orientable);
5183 gtk_orientable_set_orientation (orientable,
5184 orientation == GTK_ORIENTATION_HORIZONTAL ?
5185 GTK_ORIENTATION_VERTICAL :
5186 GTK_ORIENTATION_HORIZONTAL);
5188 if (GTK_IS_CONTAINER (orientable))
5193 children = gtk_container_get_children (GTK_CONTAINER (orientable));
5195 for (child = children; child; child = child->next)
5197 if (GTK_IS_ORIENTABLE (child->data))
5198 orientable_toggle_orientation (child->data);
5201 g_list_free (children);
5206 flipping_orientation_toggled_cb (GtkWidget *widget, gpointer data)
5208 GtkWidget *content_area;
5209 GtkWidget *toplevel;
5211 toplevel = gtk_widget_get_toplevel (widget);
5212 content_area = gtk_dialog_get_content_area (GTK_DIALOG (toplevel));
5213 orientable_toggle_orientation (GTK_ORIENTABLE (content_area));
5217 set_direction_recurse (GtkWidget *widget,
5220 GtkTextDirection *dir = data;
5222 gtk_widget_set_direction (widget, *dir);
5223 if (GTK_IS_CONTAINER (widget))
5224 gtk_container_foreach (GTK_CONTAINER (widget),
5225 set_direction_recurse,
5230 create_forward_back (const char *title,
5231 GtkTextDirection text_dir)
5233 GtkWidget *frame = gtk_frame_new (title);
5234 GtkWidget *bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
5235 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
5236 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
5238 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
5240 gtk_container_add (GTK_CONTAINER (frame), bbox);
5241 gtk_container_add (GTK_CONTAINER (bbox), back_button);
5242 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
5244 set_direction_recurse (frame, &text_dir);
5250 create_flipping (GtkWidget *widget)
5252 static GtkWidget *window = NULL;
5253 GtkWidget *check_button, *button;
5254 GtkWidget *action_area, *content_area;
5258 window = gtk_dialog_new ();
5260 gtk_window_set_screen (GTK_WINDOW (window),
5261 gtk_widget_get_screen (widget));
5263 g_signal_connect (window, "destroy",
5264 G_CALLBACK (gtk_widget_destroyed),
5267 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5268 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
5270 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
5272 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
5273 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5274 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5276 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
5277 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
5279 g_signal_connect (check_button, "toggled",
5280 G_CALLBACK (flipping_toggled_cb), NULL);
5282 check_button = gtk_check_button_new_with_label ("Toggle orientation of all boxes");
5283 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5284 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5286 g_signal_connect (check_button, "toggled",
5287 G_CALLBACK (flipping_orientation_toggled_cb), NULL);
5289 gtk_box_pack_start (GTK_BOX (content_area),
5290 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
5293 gtk_box_pack_start (GTK_BOX (content_area),
5294 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
5297 gtk_box_pack_start (GTK_BOX (content_area),
5298 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
5301 button = gtk_button_new_with_label ("Close");
5302 g_signal_connect_swapped (button, "clicked",
5303 G_CALLBACK (gtk_widget_destroy), window);
5304 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5307 if (!gtk_widget_get_visible (window))
5308 gtk_widget_show_all (window);
5310 gtk_widget_destroy (window);
5318 make_focus_table (GList **list)
5323 table = gtk_table_new (5, 5, FALSE);
5336 widget = gtk_entry_new ();
5338 widget = gtk_button_new_with_label ("Foo");
5340 *list = g_list_prepend (*list, widget);
5342 gtk_table_attach (GTK_TABLE (table),
5346 GTK_EXPAND | GTK_FILL,
5347 GTK_EXPAND | GTK_FILL,
5356 *list = g_list_reverse (*list);
5362 create_focus (GtkWidget *widget)
5364 static GtkWidget *window = NULL;
5368 GtkWidget *content_area;
5373 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
5379 gtk_window_set_screen (GTK_WINDOW (window),
5380 gtk_widget_get_screen (widget));
5382 g_signal_connect (window, "destroy",
5383 G_CALLBACK (gtk_widget_destroyed),
5386 g_signal_connect (window, "response",
5387 G_CALLBACK (gtk_widget_destroy),
5390 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5392 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
5394 frame = gtk_frame_new ("Weird tab focus chain");
5396 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5398 table = make_focus_table (&list);
5400 gtk_container_add (GTK_CONTAINER (frame), table);
5402 gtk_container_set_focus_chain (GTK_CONTAINER (table),
5407 frame = gtk_frame_new ("Default tab focus chain");
5409 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5412 table = make_focus_table (&list);
5416 gtk_container_add (GTK_CONTAINER (frame), table);
5419 if (!gtk_widget_get_visible (window))
5420 gtk_widget_show_all (window);
5422 gtk_widget_destroy (window);
5430 font_selection_ok (GtkWidget *w,
5431 GtkFontSelectionDialog *fs)
5433 gchar *s = gtk_font_selection_dialog_get_font_name (fs);
5435 g_print ("%s\n", s);
5437 gtk_widget_destroy (GTK_WIDGET (fs));
5441 create_font_selection (GtkWidget *widget)
5443 static GtkWidget *window = NULL;
5451 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5452 gtk_window_set_screen (GTK_WINDOW (window),
5453 gtk_widget_get_screen (widget));
5455 g_signal_connect (window, "destroy",
5456 G_CALLBACK (gtk_widget_destroyed),
5459 gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
5460 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5462 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
5463 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5464 gtk_container_add (GTK_CONTAINER (window), hbox);
5466 label = gtk_label_new ("Pick a font");
5467 gtk_container_add (GTK_CONTAINER (hbox), label);
5469 picker = gtk_font_button_new ();
5470 gtk_font_button_set_use_font (GTK_FONT_BUTTON (picker), TRUE);
5471 gtk_container_add (GTK_CONTAINER (hbox), picker);
5474 if (!gtk_widget_get_visible (window))
5475 gtk_widget_show_all (window);
5477 gtk_widget_destroy (window);
5484 static GtkWidget *dialog_window = NULL;
5487 label_toggle (GtkWidget *widget,
5492 *label = gtk_label_new ("Dialog Test");
5493 g_signal_connect (*label,
5495 G_CALLBACK (gtk_widget_destroyed),
5497 gtk_misc_set_padding (GTK_MISC (*label), 10, 10);
5498 gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog_window))),
5499 *label, TRUE, TRUE, 0);
5500 gtk_widget_show (*label);
5503 gtk_widget_destroy (*label);
5507 create_dialog (GtkWidget *widget)
5509 static GtkWidget *label;
5510 GtkWidget *action_area;
5515 /* This is a terrible example; it's much simpler to create
5516 * dialogs than this. Don't use testgtk for example code,
5520 dialog_window = gtk_dialog_new ();
5521 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5522 gtk_widget_get_screen (widget));
5524 g_signal_connect (dialog_window, "destroy",
5525 G_CALLBACK (gtk_widget_destroyed),
5528 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5530 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
5531 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5533 button = gtk_button_new_with_label ("OK");
5534 gtk_widget_set_can_default (button, TRUE);
5535 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5536 gtk_widget_grab_default (button);
5537 gtk_widget_show (button);
5539 button = gtk_button_new_with_label ("Toggle");
5540 g_signal_connect (button, "clicked",
5541 G_CALLBACK (label_toggle),
5543 gtk_widget_set_can_default (button, TRUE);
5544 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5545 gtk_widget_show (button);
5550 if (!gtk_widget_get_visible (dialog_window))
5551 gtk_widget_show (dialog_window);
5553 gtk_widget_destroy (dialog_window);
5556 /* Display & Screen test
5563 GtkWidget *radio_dpy;
5564 GtkWidget *toplevel;
5565 GtkWidget *dialog_window;
5566 } ScreenDisplaySelection;
5569 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
5571 const gchar *display_name;
5572 GdkDisplay *display = gtk_widget_get_display (widget);
5574 GdkScreen *new_screen = NULL;
5575 GdkScreen *current_screen = gtk_widget_get_screen (widget);
5577 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
5579 display_name = gtk_entry_get_text (GTK_ENTRY (data->entry));
5580 display = gdk_display_open (display_name);
5584 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
5585 GTK_DIALOG_DESTROY_WITH_PARENT,
5588 "The display :\n%s\ncannot be opened",
5590 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
5591 gtk_widget_show (dialog);
5592 g_signal_connect (dialog, "response",
5593 G_CALLBACK (gtk_widget_destroy),
5598 GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (data->combo));
5601 gboolean found = FALSE;
5602 while (gtk_tree_model_iter_nth_child (model, &iter, NULL, i++))
5605 gtk_tree_model_get (model, &iter, 0, &name, -1);
5606 found = !g_ascii_strcasecmp (display_name, name);
5613 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (data->combo), display_name);
5614 new_screen = gdk_display_get_default_screen (display);
5619 gint number_of_screens = gdk_display_get_n_screens (display);
5620 gint screen_num = gdk_screen_get_number (current_screen);
5621 if ((screen_num +1) < number_of_screens)
5622 new_screen = gdk_display_get_screen (display, screen_num + 1);
5624 new_screen = gdk_display_get_screen (display, 0);
5629 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
5630 gtk_widget_destroy (data->dialog_window);
5635 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
5637 gtk_widget_destroy (data);
5641 create_display_screen (GtkWidget *widget)
5643 GtkWidget *table, *frame, *window, *combo_dpy, *vbox;
5644 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
5646 ScreenDisplaySelection *scr_dpy_data;
5647 GdkScreen *screen = gtk_widget_get_screen (widget);
5648 GdkDisplay *display = gdk_screen_get_display (screen);
5650 window = g_object_new (gtk_window_get_type (),
5653 "type", GTK_WINDOW_TOPLEVEL,
5655 "Screen or Display selection",
5656 "border_width", 10, NULL);
5657 g_signal_connect (window, "destroy",
5658 G_CALLBACK (gtk_widget_destroy), NULL);
5660 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
5661 gtk_container_add (GTK_CONTAINER (window), vbox);
5663 frame = gtk_frame_new ("Select screen or display");
5664 gtk_container_add (GTK_CONTAINER (vbox), frame);
5666 table = gtk_table_new (2, 2, TRUE);
5667 gtk_table_set_row_spacings (GTK_TABLE (table), 3);
5668 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
5670 gtk_container_add (GTK_CONTAINER (frame), table);
5672 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
5673 if (gdk_display_get_n_screens(display) > 1)
5674 radio_scr = gtk_radio_button_new_with_label
5675 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
5678 radio_scr = gtk_radio_button_new_with_label
5679 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
5680 "only one screen on the current display");
5681 gtk_widget_set_sensitive (radio_scr, FALSE);
5683 combo_dpy = gtk_combo_box_text_new_with_entry ();
5684 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_dpy), "diabolo:0.0");
5685 gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (combo_dpy))),
5686 "<hostname>:<X Server Num>.<Screen Num>");
5688 gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1);
5689 gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2);
5690 gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1);
5692 bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
5693 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
5694 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
5696 gtk_container_add (GTK_CONTAINER (vbox), bbox);
5698 gtk_container_add (GTK_CONTAINER (bbox), applyb);
5699 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
5701 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
5703 scr_dpy_data->entry = gtk_bin_get_child (GTK_BIN (combo_dpy));
5704 scr_dpy_data->radio_dpy = radio_dpy;
5705 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
5706 scr_dpy_data->dialog_window = window;
5708 g_signal_connect (cancelb, "clicked",
5709 G_CALLBACK (screen_display_destroy_diag), window);
5710 g_signal_connect (applyb, "clicked",
5711 G_CALLBACK (screen_display_check), scr_dpy_data);
5712 gtk_widget_show_all (window);
5717 static gulong event_watcher_enter_id = 0;
5718 static gulong event_watcher_leave_id = 0;
5721 event_watcher (GSignalInvocationHint *ihint,
5722 guint n_param_values,
5723 const GValue *param_values,
5726 g_print ("Watch: \"%s\" emitted for %s\n",
5727 g_signal_name (ihint->signal_id),
5728 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
5734 event_watcher_down (void)
5736 if (event_watcher_enter_id)
5740 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5741 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
5742 event_watcher_enter_id = 0;
5743 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5744 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
5745 event_watcher_leave_id = 0;
5750 event_watcher_toggle (void)
5752 if (event_watcher_enter_id)
5753 event_watcher_down ();
5758 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5759 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5760 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5761 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5766 create_event_watcher (GtkWidget *widget)
5768 GtkWidget *action_area, *content_area;
5773 dialog_window = gtk_dialog_new ();
5774 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5775 gtk_widget_get_screen (widget));
5777 g_signal_connect (dialog_window, "destroy",
5778 G_CALLBACK (gtk_widget_destroyed),
5780 g_signal_connect (dialog_window, "destroy",
5781 G_CALLBACK (event_watcher_down),
5784 content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog_window));
5785 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5787 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
5788 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5789 gtk_widget_set_size_request (dialog_window, 200, 110);
5791 button = gtk_toggle_button_new_with_label ("Activate Watch");
5792 g_signal_connect (button, "clicked",
5793 G_CALLBACK (event_watcher_toggle),
5795 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
5796 gtk_box_pack_start (GTK_BOX (content_area), button, TRUE, TRUE, 0);
5797 gtk_widget_show (button);
5799 button = gtk_button_new_with_label ("Close");
5800 g_signal_connect_swapped (button, "clicked",
5801 G_CALLBACK (gtk_widget_destroy),
5803 gtk_widget_set_can_default (button, TRUE);
5804 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5805 gtk_widget_grab_default (button);
5806 gtk_widget_show (button);
5809 if (!gtk_widget_get_visible (dialog_window))
5810 gtk_widget_show (dialog_window);
5812 gtk_widget_destroy (dialog_window);
5820 reformat_value (GtkScale *scale,
5823 return g_strdup_printf ("-->%0.*g<--",
5824 gtk_scale_get_digits (scale), value);
5828 create_range_controls (GtkWidget *widget)
5830 static GtkWidget *window = NULL;
5834 GtkWidget *scrollbar;
5836 GtkWidget *separator;
5837 GtkAdjustment *adjustment;
5842 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5844 gtk_window_set_screen (GTK_WINDOW (window),
5845 gtk_widget_get_screen (widget));
5847 g_signal_connect (window, "destroy",
5848 G_CALLBACK (gtk_widget_destroyed),
5851 gtk_window_set_title (GTK_WINDOW (window), "range controls");
5852 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5855 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
5856 gtk_container_add (GTK_CONTAINER (window), box1);
5857 gtk_widget_show (box1);
5860 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
5861 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5862 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
5863 gtk_widget_show (box2);
5866 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
5868 scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5869 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
5870 gtk_range_set_update_policy (GTK_RANGE (scale), GTK_UPDATE_DELAYED);
5871 gtk_scale_set_digits (GTK_SCALE (scale), 1);
5872 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5873 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
5874 gtk_widget_show (scale);
5876 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5877 gtk_range_set_update_policy (GTK_RANGE (scrollbar),
5878 GTK_UPDATE_CONTINUOUS);
5879 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
5880 gtk_widget_show (scrollbar);
5882 scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5883 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5884 g_signal_connect (scale,
5886 G_CALLBACK (reformat_value),
5888 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
5889 gtk_widget_show (scale);
5891 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
5893 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5894 gtk_widget_set_size_request (scale, -1, 200);
5895 gtk_scale_set_digits (GTK_SCALE (scale), 2);
5896 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5897 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5898 gtk_widget_show (scale);
5900 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5901 gtk_widget_set_size_request (scale, -1, 200);
5902 gtk_scale_set_digits (GTK_SCALE (scale), 2);
5903 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5904 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
5905 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5906 gtk_widget_show (scale);
5908 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5909 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5910 g_signal_connect (scale,
5912 G_CALLBACK (reformat_value),
5914 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5915 gtk_widget_show (scale);
5918 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
5919 gtk_widget_show (hbox);
5921 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
5922 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
5923 gtk_widget_show (separator);
5926 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
5927 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5928 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
5929 gtk_widget_show (box2);
5932 button = gtk_button_new_with_label ("close");
5933 g_signal_connect_swapped (button, "clicked",
5934 G_CALLBACK (gtk_widget_destroy),
5936 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
5937 gtk_widget_set_can_default (button, TRUE);
5938 gtk_widget_grab_default (button);
5939 gtk_widget_show (button);
5942 if (!gtk_widget_get_visible (window))
5943 gtk_widget_show (window);
5945 gtk_widget_destroy (window);
5952 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
5953 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
5954 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
5955 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
5956 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
5957 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
5958 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
5959 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
5962 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
5968 static const char * book_open_xpm[] = {
5991 static const char * book_closed_xpm[] = {
6016 GdkPixbuf *book_open;
6017 GdkPixbuf *book_closed;
6018 GtkWidget *sample_notebook;
6021 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
6023 GtkWidget *page_widget;
6026 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
6028 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
6029 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6031 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
6032 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6036 page_switch (GtkWidget *widget, gpointer *page, gint page_num)
6038 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
6039 gint old_page_num = gtk_notebook_get_current_page (notebook);
6041 if (page_num == old_page_num)
6044 set_page_image (notebook, page_num, book_open);
6046 if (old_page_num != -1)
6047 set_page_image (notebook, old_page_num, book_closed);
6051 tab_fill (GtkToggleButton *button, GtkWidget *child)
6053 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
6054 "tab-fill", gtk_toggle_button_get_active (button),
6059 tab_expand (GtkToggleButton *button, GtkWidget *child)
6061 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
6062 "tab-expand", gtk_toggle_button_get_active (button),
6067 create_pages (GtkNotebook *notebook, gint start, gint end)
6069 GtkWidget *child = NULL;
6074 GtkWidget *label_box;
6075 GtkWidget *menu_box;
6079 char accel_buffer[32];
6081 for (i = start; i <= end; i++)
6083 sprintf (buffer, "Page %d", i);
6084 sprintf (accel_buffer, "Page _%d", i);
6086 child = gtk_frame_new (buffer);
6087 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
6089 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6090 gtk_box_set_homogeneous (GTK_BOX (vbox), TRUE);
6091 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
6092 gtk_container_add (GTK_CONTAINER (child), vbox);
6094 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6095 gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE);
6096 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
6098 button = gtk_check_button_new_with_label ("Fill Tab");
6099 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6100 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
6101 g_signal_connect (button, "toggled",
6102 G_CALLBACK (tab_fill), child);
6104 button = gtk_check_button_new_with_label ("Expand Tab");
6105 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6106 g_signal_connect (button, "toggled",
6107 G_CALLBACK (tab_expand), child);
6109 button = gtk_button_new_with_label ("Hide Page");
6110 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
6111 g_signal_connect_swapped (button, "clicked",
6112 G_CALLBACK (gtk_widget_hide),
6115 gtk_widget_show_all (child);
6117 label_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6118 pixwid = gtk_image_new_from_pixbuf (book_closed);
6119 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
6121 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
6122 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6123 label = gtk_label_new_with_mnemonic (accel_buffer);
6124 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
6125 gtk_widget_show_all (label_box);
6128 menu_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6129 pixwid = gtk_image_new_from_pixbuf (book_closed);
6130 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
6132 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
6133 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6134 label = gtk_label_new (buffer);
6135 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
6136 gtk_widget_show_all (menu_box);
6138 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
6143 rotate_notebook (GtkButton *button,
6144 GtkNotebook *notebook)
6146 gtk_notebook_set_tab_pos (notebook, (gtk_notebook_get_tab_pos (notebook) + 1) % 4);
6150 show_all_pages (GtkButton *button,
6151 GtkNotebook *notebook)
6153 gtk_container_foreach (GTK_CONTAINER (notebook),
6154 (GtkCallback) gtk_widget_show, NULL);
6158 notebook_type_changed (GtkWidget *optionmenu,
6161 GtkNotebook *notebook;
6171 notebook = GTK_NOTEBOOK (data);
6173 c = gtk_combo_box_get_active (GTK_COMBO_BOX (optionmenu));
6178 /* standard notebook */
6179 gtk_notebook_set_show_tabs (notebook, TRUE);
6180 gtk_notebook_set_show_border (notebook, TRUE);
6181 gtk_notebook_set_scrollable (notebook, FALSE);
6185 /* notabs notebook */
6186 gtk_notebook_set_show_tabs (notebook, FALSE);
6187 gtk_notebook_set_show_border (notebook, TRUE);
6192 gtk_notebook_set_show_tabs (notebook, FALSE);
6193 gtk_notebook_set_show_border (notebook, FALSE);
6198 gtk_notebook_set_show_tabs (notebook, TRUE);
6199 gtk_notebook_set_show_border (notebook, TRUE);
6200 gtk_notebook_set_scrollable (notebook, TRUE);
6201 if (gtk_notebook_get_n_pages (notebook) == 5)
6202 create_pages (notebook, 6, 15);
6208 if (gtk_notebook_get_n_pages (notebook) == 15)
6209 for (i = 0; i < 10; i++)
6210 gtk_notebook_remove_page (notebook, 5);
6214 notebook_popup (GtkToggleButton *button,
6215 GtkNotebook *notebook)
6217 if (gtk_toggle_button_get_active (button))
6218 gtk_notebook_popup_enable (notebook);
6220 gtk_notebook_popup_disable (notebook);
6224 create_notebook (GtkWidget *widget)
6226 static GtkWidget *window = NULL;
6230 GtkWidget *separator;
6234 static gchar *items[] =
6244 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6245 gtk_window_set_screen (GTK_WINDOW (window),
6246 gtk_widget_get_screen (widget));
6248 g_signal_connect (window, "destroy",
6249 G_CALLBACK (gtk_widget_destroyed),
6252 gtk_window_set_title (GTK_WINDOW (window), "notebook");
6253 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6255 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6256 gtk_container_add (GTK_CONTAINER (window), box1);
6258 sample_notebook = gtk_notebook_new ();
6259 g_signal_connect (sample_notebook, "switch_page",
6260 G_CALLBACK (page_switch), NULL);
6261 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
6262 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
6263 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
6265 gtk_widget_realize (sample_notebook);
6268 book_open = gdk_pixbuf_new_from_xpm_data (book_open_xpm);
6271 book_closed = gdk_pixbuf_new_from_xpm_data (book_closed_xpm);
6273 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
6275 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
6276 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
6278 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
6279 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6280 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6282 button = gtk_check_button_new_with_label ("popup menu");
6283 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
6284 g_signal_connect (button, "clicked",
6285 G_CALLBACK (notebook_popup),
6288 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
6289 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6290 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6292 label = gtk_label_new ("Notebook Style :");
6293 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
6295 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
6296 notebook_type_changed,
6298 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
6300 button = gtk_button_new_with_label ("Show all Pages");
6301 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
6302 g_signal_connect (button, "clicked",
6303 G_CALLBACK (show_all_pages), sample_notebook);
6305 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
6306 gtk_box_set_homogeneous (GTK_BOX (box2), TRUE);
6307 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6308 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6310 button = gtk_button_new_with_label ("prev");
6311 g_signal_connect_swapped (button, "clicked",
6312 G_CALLBACK (gtk_notebook_prev_page),
6314 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6316 button = gtk_button_new_with_label ("next");
6317 g_signal_connect_swapped (button, "clicked",
6318 G_CALLBACK (gtk_notebook_next_page),
6320 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6322 button = gtk_button_new_with_label ("rotate");
6323 g_signal_connect (button, "clicked",
6324 G_CALLBACK (rotate_notebook), sample_notebook);
6325 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6327 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
6328 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
6330 button = gtk_button_new_with_label ("close");
6331 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
6332 g_signal_connect_swapped (button, "clicked",
6333 G_CALLBACK (gtk_widget_destroy),
6335 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
6336 gtk_widget_set_can_default (button, TRUE);
6337 gtk_widget_grab_default (button);
6340 if (!gtk_widget_get_visible (window))
6341 gtk_widget_show_all (window);
6343 gtk_widget_destroy (window);
6351 toggle_resize (GtkWidget *widget, GtkWidget *child)
6353 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6354 GValue value = { 0, };
6355 g_value_init (&value, G_TYPE_BOOLEAN);
6356 gtk_container_child_get_property (container, child, "resize", &value);
6357 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6358 gtk_container_child_set_property (container, child, "resize", &value);
6362 toggle_shrink (GtkWidget *widget, GtkWidget *child)
6364 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6365 GValue value = { 0, };
6366 g_value_init (&value, G_TYPE_BOOLEAN);
6367 gtk_container_child_get_property (container, child, "shrink", &value);
6368 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6369 gtk_container_child_set_property (container, child, "shrink", &value);
6373 paned_props_clicked (GtkWidget *button,
6376 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
6378 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
6382 create_pane_options (GtkPaned *paned,
6383 const gchar *frame_label,
6384 const gchar *label1,
6385 const gchar *label2)
6387 GtkWidget *child1, *child2;
6392 GtkWidget *check_button;
6394 child1 = gtk_paned_get_child1 (paned);
6395 child2 = gtk_paned_get_child2 (paned);
6397 frame = gtk_frame_new (frame_label);
6398 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
6400 table = gtk_table_new (4, 2, 4);
6401 gtk_container_add (GTK_CONTAINER (frame), table);
6403 label = gtk_label_new (label1);
6404 gtk_table_attach_defaults (GTK_TABLE (table), label,
6407 check_button = gtk_check_button_new_with_label ("Resize");
6408 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6410 g_signal_connect (check_button, "toggled",
6411 G_CALLBACK (toggle_resize),
6414 check_button = gtk_check_button_new_with_label ("Shrink");
6415 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6417 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6419 g_signal_connect (check_button, "toggled",
6420 G_CALLBACK (toggle_shrink),
6423 label = gtk_label_new (label2);
6424 gtk_table_attach_defaults (GTK_TABLE (table), label,
6427 check_button = gtk_check_button_new_with_label ("Resize");
6428 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6430 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6432 g_signal_connect (check_button, "toggled",
6433 G_CALLBACK (toggle_resize),
6436 check_button = gtk_check_button_new_with_label ("Shrink");
6437 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6439 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6441 g_signal_connect (check_button, "toggled",
6442 G_CALLBACK (toggle_shrink),
6445 button = gtk_button_new_with_mnemonic ("_Properties");
6446 gtk_table_attach_defaults (GTK_TABLE (table), button,
6448 g_signal_connect (button, "clicked",
6449 G_CALLBACK (paned_props_clicked),
6456 create_panes (GtkWidget *widget)
6458 static GtkWidget *window = NULL;
6467 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6469 gtk_window_set_screen (GTK_WINDOW (window),
6470 gtk_widget_get_screen (widget));
6472 g_signal_connect (window, "destroy",
6473 G_CALLBACK (gtk_widget_destroyed),
6476 gtk_window_set_title (GTK_WINDOW (window), "Panes");
6477 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6479 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6480 gtk_container_add (GTK_CONTAINER (window), vbox);
6482 vpaned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6483 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
6484 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
6486 hpaned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6487 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
6489 frame = gtk_frame_new (NULL);
6490 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6491 gtk_widget_set_size_request (frame, 60, 60);
6492 gtk_paned_add1 (GTK_PANED (hpaned), frame);
6494 button = gtk_button_new_with_label ("Hi there");
6495 gtk_container_add (GTK_CONTAINER(frame), button);
6497 frame = gtk_frame_new (NULL);
6498 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6499 gtk_widget_set_size_request (frame, 80, 60);
6500 gtk_paned_add2 (GTK_PANED (hpaned), frame);
6502 frame = gtk_frame_new (NULL);
6503 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6504 gtk_widget_set_size_request (frame, 60, 80);
6505 gtk_paned_add2 (GTK_PANED (vpaned), frame);
6507 /* Now create toggle buttons to control sizing */
6509 gtk_box_pack_start (GTK_BOX (vbox),
6510 create_pane_options (GTK_PANED (hpaned),
6516 gtk_box_pack_start (GTK_BOX (vbox),
6517 create_pane_options (GTK_PANED (vpaned),
6523 gtk_widget_show_all (vbox);
6526 if (!gtk_widget_get_visible (window))
6527 gtk_widget_show (window);
6529 gtk_widget_destroy (window);
6533 * Paned keyboard navigation
6537 paned_keyboard_window1 (GtkWidget *widget)
6560 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6561 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
6562 gtk_window_set_screen (GTK_WINDOW (window1),
6563 gtk_widget_get_screen (widget));
6565 hpaned1 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6566 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
6568 frame1 = gtk_frame_new (NULL);
6569 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
6570 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
6572 vbox1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6573 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
6575 button7 = gtk_button_new_with_label ("button7");
6576 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
6578 button8 = gtk_button_new_with_label ("button8");
6579 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
6581 button9 = gtk_button_new_with_label ("button9");
6582 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
6584 vpaned1 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6585 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
6587 frame2 = gtk_frame_new (NULL);
6588 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
6589 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
6591 frame5 = gtk_frame_new (NULL);
6592 gtk_container_add (GTK_CONTAINER (frame2), frame5);
6594 hbox1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6595 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
6597 button5 = gtk_button_new_with_label ("button5");
6598 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
6600 button6 = gtk_button_new_with_label ("button6");
6601 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
6603 frame3 = gtk_frame_new (NULL);
6604 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
6605 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
6607 frame4 = gtk_frame_new ("Buttons");
6608 gtk_container_add (GTK_CONTAINER (frame3), frame4);
6609 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
6611 table1 = gtk_table_new (2, 2, FALSE);
6612 gtk_container_add (GTK_CONTAINER (frame4), table1);
6613 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
6615 button1 = gtk_button_new_with_label ("button1");
6616 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
6617 (GtkAttachOptions) (GTK_FILL),
6618 (GtkAttachOptions) (0), 0, 0);
6620 button2 = gtk_button_new_with_label ("button2");
6621 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
6622 (GtkAttachOptions) (GTK_FILL),
6623 (GtkAttachOptions) (0), 0, 0);
6625 button3 = gtk_button_new_with_label ("button3");
6626 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
6627 (GtkAttachOptions) (GTK_FILL),
6628 (GtkAttachOptions) (0), 0, 0);
6630 button4 = gtk_button_new_with_label ("button4");
6631 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
6632 (GtkAttachOptions) (GTK_FILL),
6633 (GtkAttachOptions) (0), 0, 0);
6639 paned_keyboard_window2 (GtkWidget *widget)
6644 GtkWidget *button13;
6648 GtkWidget *button12;
6650 GtkWidget *button11;
6651 GtkWidget *button10;
6653 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6654 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
6656 gtk_window_set_screen (GTK_WINDOW (window2),
6657 gtk_widget_get_screen (widget));
6659 hpaned2 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6660 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
6662 frame6 = gtk_frame_new (NULL);
6663 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
6664 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
6666 button13 = gtk_button_new_with_label ("button13");
6667 gtk_container_add (GTK_CONTAINER (frame6), button13);
6669 hbox2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6670 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
6672 vpaned2 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6673 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
6675 frame7 = gtk_frame_new (NULL);
6676 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
6677 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
6679 button12 = gtk_button_new_with_label ("button12");
6680 gtk_container_add (GTK_CONTAINER (frame7), button12);
6682 frame8 = gtk_frame_new (NULL);
6683 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
6684 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
6686 button11 = gtk_button_new_with_label ("button11");
6687 gtk_container_add (GTK_CONTAINER (frame8), button11);
6689 button10 = gtk_button_new_with_label ("button10");
6690 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
6696 paned_keyboard_window3 (GtkWidget *widget)
6703 GtkWidget *button14;
6706 GtkWidget *button15;
6709 GtkWidget *button16;
6711 GtkWidget *button17;
6713 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6714 g_object_set_data (G_OBJECT (window3), "window3", window3);
6715 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
6717 gtk_window_set_screen (GTK_WINDOW (window3),
6718 gtk_widget_get_screen (widget));
6721 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6722 gtk_container_add (GTK_CONTAINER (window3), vbox2);
6724 label1 = gtk_label_new ("Three panes nested inside each other");
6725 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
6727 hpaned3 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6728 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
6730 frame9 = gtk_frame_new (NULL);
6731 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
6732 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
6734 button14 = gtk_button_new_with_label ("button14");
6735 gtk_container_add (GTK_CONTAINER (frame9), button14);
6737 hpaned4 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6738 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
6740 frame10 = gtk_frame_new (NULL);
6741 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
6742 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
6744 button15 = gtk_button_new_with_label ("button15");
6745 gtk_container_add (GTK_CONTAINER (frame10), button15);
6747 hpaned5 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6748 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
6750 frame11 = gtk_frame_new (NULL);
6751 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
6752 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
6754 button16 = gtk_button_new_with_label ("button16");
6755 gtk_container_add (GTK_CONTAINER (frame11), button16);
6757 frame12 = gtk_frame_new (NULL);
6758 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
6759 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
6761 button17 = gtk_button_new_with_label ("button17");
6762 gtk_container_add (GTK_CONTAINER (frame12), button17);
6768 paned_keyboard_window4 (GtkWidget *widget)
6775 GtkWidget *button19;
6776 GtkWidget *button18;
6779 GtkWidget *button21;
6780 GtkWidget *button20;
6782 GtkWidget *button23;
6783 GtkWidget *button22;
6785 GtkWidget *button25;
6786 GtkWidget *button24;
6788 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6789 g_object_set_data (G_OBJECT (window4), "window4", window4);
6790 gtk_window_set_title (GTK_WINDOW (window4), "window4");
6792 gtk_window_set_screen (GTK_WINDOW (window4),
6793 gtk_widget_get_screen (widget));
6795 vbox3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6796 gtk_container_add (GTK_CONTAINER (window4), vbox3);
6798 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
6799 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
6800 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
6802 hpaned6 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6803 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
6805 vpaned3 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6806 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
6808 button19 = gtk_button_new_with_label ("button19");
6809 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
6811 button18 = gtk_button_new_with_label ("button18");
6812 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
6814 hbox3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6815 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
6817 vpaned4 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6818 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
6820 button21 = gtk_button_new_with_label ("button21");
6821 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
6823 button20 = gtk_button_new_with_label ("button20");
6824 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
6826 vpaned5 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6827 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
6829 button23 = gtk_button_new_with_label ("button23");
6830 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
6832 button22 = gtk_button_new_with_label ("button22");
6833 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
6835 vpaned6 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6836 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
6838 button25 = gtk_button_new_with_label ("button25");
6839 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
6841 button24 = gtk_button_new_with_label ("button24");
6842 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
6848 create_paned_keyboard_navigation (GtkWidget *widget)
6850 static GtkWidget *window1 = NULL;
6851 static GtkWidget *window2 = NULL;
6852 static GtkWidget *window3 = NULL;
6853 static GtkWidget *window4 = NULL;
6856 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
6858 gtk_widget_destroy (window1);
6859 gtk_widget_destroy (window2);
6860 gtk_widget_destroy (window3);
6861 gtk_widget_destroy (window4);
6866 window1 = paned_keyboard_window1 (widget);
6867 g_signal_connect (window1, "destroy",
6868 G_CALLBACK (gtk_widget_destroyed),
6874 window2 = paned_keyboard_window2 (widget);
6875 g_signal_connect (window2, "destroy",
6876 G_CALLBACK (gtk_widget_destroyed),
6882 window3 = paned_keyboard_window3 (widget);
6883 g_signal_connect (window3, "destroy",
6884 G_CALLBACK (gtk_widget_destroyed),
6890 window4 = paned_keyboard_window4 (widget);
6891 g_signal_connect (window4, "destroy",
6892 G_CALLBACK (gtk_widget_destroyed),
6896 if (gtk_widget_get_visible (window1))
6897 gtk_widget_destroy (GTK_WIDGET (window1));
6899 gtk_widget_show_all (GTK_WIDGET (window1));
6901 if (gtk_widget_get_visible (window2))
6902 gtk_widget_destroy (GTK_WIDGET (window2));
6904 gtk_widget_show_all (GTK_WIDGET (window2));
6906 if (gtk_widget_get_visible (window3))
6907 gtk_widget_destroy (GTK_WIDGET (window3));
6909 gtk_widget_show_all (GTK_WIDGET (window3));
6911 if (gtk_widget_get_visible (window4))
6912 gtk_widget_destroy (GTK_WIDGET (window4));
6914 gtk_widget_show_all (GTK_WIDGET (window4));
6922 typedef struct _cursoroffset {gint x,y;} CursorOffset;
6925 shape_pressed (GtkWidget *widget, GdkEventButton *event)
6929 /* ignore double and triple click */
6930 if (event->type != GDK_BUTTON_PRESS)
6933 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
6934 p->x = (int) event->x;
6935 p->y = (int) event->y;
6937 gtk_grab_add (widget);
6938 gdk_device_grab (gdk_event_get_device ((GdkEvent*)event),
6939 gtk_widget_get_window (widget),
6942 GDK_BUTTON_RELEASE_MASK |
6943 GDK_BUTTON_MOTION_MASK |
6944 GDK_POINTER_MOTION_HINT_MASK,
6950 shape_released (GtkWidget *widget,
6951 GdkEventButton *event)
6953 gtk_grab_remove (widget);
6954 gdk_device_ungrab (gdk_event_get_device ((GdkEvent*)event), event->time);
6958 shape_motion (GtkWidget *widget,
6959 GdkEventMotion *event)
6963 GdkModifierType mask;
6965 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
6968 * Can't use event->x / event->y here
6969 * because I need absolute coordinates.
6971 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
6972 gtk_window_move (GTK_WINDOW (widget), xp - p->x, yp - p->y);
6976 shape_create_icon (GdkScreen *screen,
6987 CursorOffset* icon_pos;
6988 cairo_surface_t *mask;
6989 cairo_region_t *mask_region;
6994 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
6996 window = gtk_window_new (window_type);
6997 gtk_window_set_screen (GTK_WINDOW (window), screen);
6999 fixed = gtk_fixed_new ();
7000 gtk_widget_set_size_request (fixed, 100, 100);
7001 gtk_container_add (GTK_CONTAINER (window), fixed);
7002 gtk_widget_show (fixed);
7004 gtk_widget_set_events (window,
7005 gtk_widget_get_events (window) |
7006 GDK_BUTTON_MOTION_MASK |
7007 GDK_POINTER_MOTION_HINT_MASK |
7008 GDK_BUTTON_PRESS_MASK);
7010 gtk_widget_realize (window);
7012 pixbuf = gdk_pixbuf_new_from_file (xpm_file, NULL);
7013 g_assert (pixbuf); /* FIXME: error handling */
7015 mask = cairo_image_surface_create (CAIRO_FORMAT_A1,
7016 gdk_pixbuf_get_width (pixbuf),
7017 gdk_pixbuf_get_height (pixbuf));
7018 cr = cairo_create (mask);
7019 gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
7023 mask_region = gdk_cairo_region_create_from_surface (mask);
7025 cairo_region_translate (mask_region, px, py);
7027 image = gtk_image_new_from_pixbuf (pixbuf);
7028 gtk_fixed_put (GTK_FIXED (fixed), image, px,py);
7029 gtk_widget_show (image);
7031 gtk_widget_shape_combine_region (window, mask_region);
7033 cairo_region_destroy (mask_region);
7034 cairo_surface_destroy (mask);
7035 g_object_unref (pixbuf);
7037 g_signal_connect (window, "button_press_event",
7038 G_CALLBACK (shape_pressed), NULL);
7039 g_signal_connect (window, "button_release_event",
7040 G_CALLBACK (shape_released), NULL);
7041 g_signal_connect (window, "motion_notify_event",
7042 G_CALLBACK (shape_motion), NULL);
7044 icon_pos = g_new (CursorOffset, 1);
7045 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
7047 gtk_window_move (GTK_WINDOW (window), x, y);
7048 gtk_widget_show (window);
7054 create_shapes (GtkWidget *widget)
7056 /* Variables used by the Drag/Drop and Shape Window demos */
7057 static GtkWidget *modeller = NULL;
7058 static GtkWidget *sheets = NULL;
7059 static GtkWidget *rings = NULL;
7060 static GtkWidget *with_region = NULL;
7061 GdkScreen *screen = gtk_widget_get_screen (widget);
7063 if (!(file_exists ("Modeller.xpm") &&
7064 file_exists ("FilesQueue.xpm") &&
7065 file_exists ("3DRings.xpm")))
7071 modeller = shape_create_icon (screen, "Modeller.xpm",
7072 440, 140, 0,0, GTK_WINDOW_POPUP);
7074 g_signal_connect (modeller, "destroy",
7075 G_CALLBACK (gtk_widget_destroyed),
7079 gtk_widget_destroy (modeller);
7083 sheets = shape_create_icon (screen, "FilesQueue.xpm",
7084 580, 170, 0,0, GTK_WINDOW_POPUP);
7086 g_signal_connect (sheets, "destroy",
7087 G_CALLBACK (gtk_widget_destroyed),
7092 gtk_widget_destroy (sheets);
7096 rings = shape_create_icon (screen, "3DRings.xpm",
7097 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7099 g_signal_connect (rings, "destroy",
7100 G_CALLBACK (gtk_widget_destroyed),
7104 gtk_widget_destroy (rings);
7108 cairo_region_t *region;
7111 with_region = shape_create_icon (screen, "3DRings.xpm",
7112 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7114 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
7116 g_signal_connect (with_region, "destroy",
7117 G_CALLBACK (gtk_widget_destroyed),
7120 /* reset shape from mask to a region */
7123 region = cairo_region_create ();
7135 cairo_region_union_rectangle (region, &rect);
7143 gdk_window_shape_combine_region (gtk_widget_get_window (with_region),
7148 gtk_widget_destroy (with_region);
7156 create_wmhints (GtkWidget *widget)
7158 static GtkWidget *window = NULL;
7160 GtkWidget *separator;
7164 GdkWindow *gdk_window;
7170 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7172 gtk_window_set_screen (GTK_WINDOW (window),
7173 gtk_widget_get_screen (widget));
7175 g_signal_connect (window, "destroy",
7176 G_CALLBACK (gtk_widget_destroyed),
7179 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
7180 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7182 gtk_widget_realize (window);
7184 gdk_window = gtk_widget_get_window (window);
7186 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
7187 list = g_list_prepend (NULL, pixbuf);
7189 gdk_window_set_icon_list (gdk_window, list);
7192 g_object_unref (pixbuf);
7194 gdk_window_set_icon_name (gdk_window, "WMHints Test Icon");
7196 gdk_window_set_decorations (gdk_window, GDK_DECOR_ALL | GDK_DECOR_MENU);
7197 gdk_window_set_functions (gdk_window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
7199 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7200 gtk_container_add (GTK_CONTAINER (window), box1);
7201 gtk_widget_show (box1);
7203 label = gtk_label_new ("Try iconizing me!");
7204 gtk_widget_set_size_request (label, 150, 50);
7205 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
7206 gtk_widget_show (label);
7209 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
7210 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
7211 gtk_widget_show (separator);
7214 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
7215 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7216 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7217 gtk_widget_show (box2);
7220 button = gtk_button_new_with_label ("close");
7222 g_signal_connect_swapped (button, "clicked",
7223 G_CALLBACK (gtk_widget_destroy),
7226 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7227 gtk_widget_set_can_default (button, TRUE);
7228 gtk_widget_grab_default (button);
7229 gtk_widget_show (button);
7232 if (!gtk_widget_get_visible (window))
7233 gtk_widget_show (window);
7235 gtk_widget_destroy (window);
7240 * Window state tracking
7244 window_state_callback (GtkWidget *widget,
7245 GdkEventWindowState *event,
7248 GtkWidget *label = data;
7251 msg = g_strconcat (gtk_window_get_title (GTK_WINDOW (widget)), ": ",
7252 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
7253 "withdrawn" : "not withdrawn", ", ",
7254 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
7255 "iconified" : "not iconified", ", ",
7256 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
7257 "sticky" : "not sticky", ", ",
7258 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
7259 "maximized" : "not maximized", ", ",
7260 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
7261 "fullscreen" : "not fullscreen",
7262 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
7263 "above" : "not above", ", ",
7264 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
7265 "below" : "not below", ", ",
7268 gtk_label_set_text (GTK_LABEL (label), msg);
7276 tracking_label (GtkWidget *window)
7282 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
7284 g_signal_connect_object (hbox,
7286 G_CALLBACK (gtk_widget_destroy),
7290 label = gtk_label_new ("<no window state events received>");
7291 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
7292 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
7294 g_signal_connect (window,
7295 "window_state_event",
7296 G_CALLBACK (window_state_callback),
7299 button = gtk_button_new_with_label ("Deiconify");
7300 g_signal_connect_object (button,
7302 G_CALLBACK (gtk_window_deiconify),
7305 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7307 button = gtk_button_new_with_label ("Iconify");
7308 g_signal_connect_object (button,
7310 G_CALLBACK (gtk_window_iconify),
7313 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7315 button = gtk_button_new_with_label ("Fullscreen");
7316 g_signal_connect_object (button,
7318 G_CALLBACK (gtk_window_fullscreen),
7321 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7323 button = gtk_button_new_with_label ("Unfullscreen");
7324 g_signal_connect_object (button,
7326 G_CALLBACK (gtk_window_unfullscreen),
7329 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7331 button = gtk_button_new_with_label ("Present");
7332 g_signal_connect_object (button,
7334 G_CALLBACK (gtk_window_present),
7337 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7339 button = gtk_button_new_with_label ("Show");
7340 g_signal_connect_object (button,
7342 G_CALLBACK (gtk_widget_show),
7345 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7347 gtk_widget_show_all (hbox);
7353 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
7355 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7357 gtk_window_set_keep_above (GTK_WINDOW (data),
7358 gtk_toggle_button_get_active (togglebutton));
7360 if (gtk_toggle_button_get_active (togglebutton))
7361 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7365 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
7367 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7369 gtk_window_set_keep_below (GTK_WINDOW (data),
7370 gtk_toggle_button_get_active (togglebutton));
7372 if (gtk_toggle_button_get_active (togglebutton))
7373 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7378 get_state_controls (GtkWidget *window)
7382 GtkWidget *button_above;
7383 GtkWidget *button_below;
7385 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7387 button = gtk_button_new_with_label ("Stick");
7388 g_signal_connect_object (button,
7390 G_CALLBACK (gtk_window_stick),
7393 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7395 button = gtk_button_new_with_label ("Unstick");
7396 g_signal_connect_object (button,
7398 G_CALLBACK (gtk_window_unstick),
7401 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7403 button = gtk_button_new_with_label ("Maximize");
7404 g_signal_connect_object (button,
7406 G_CALLBACK (gtk_window_maximize),
7409 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7411 button = gtk_button_new_with_label ("Unmaximize");
7412 g_signal_connect_object (button,
7414 G_CALLBACK (gtk_window_unmaximize),
7417 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7419 button = gtk_button_new_with_label ("Iconify");
7420 g_signal_connect_object (button,
7422 G_CALLBACK (gtk_window_iconify),
7425 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7427 button = gtk_button_new_with_label ("Fullscreen");
7428 g_signal_connect_object (button,
7430 G_CALLBACK (gtk_window_fullscreen),
7433 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7435 button = gtk_button_new_with_label ("Unfullscreen");
7436 g_signal_connect_object (button,
7438 G_CALLBACK (gtk_window_unfullscreen),
7441 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7443 button_above = gtk_toggle_button_new_with_label ("Keep above");
7444 g_signal_connect (button_above,
7446 G_CALLBACK (keep_window_above),
7448 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
7450 button_below = gtk_toggle_button_new_with_label ("Keep below");
7451 g_signal_connect (button_below,
7453 G_CALLBACK (keep_window_below),
7455 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
7457 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
7458 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
7460 button = gtk_button_new_with_label ("Hide (withdraw)");
7461 g_signal_connect_object (button,
7463 G_CALLBACK (gtk_widget_hide),
7466 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7468 gtk_widget_show_all (vbox);
7474 create_window_states (GtkWidget *widget)
7476 static GtkWidget *window = NULL;
7479 GtkWidget *iconified;
7481 GtkWidget *controls;
7485 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7486 gtk_window_set_screen (GTK_WINDOW (window),
7487 gtk_widget_get_screen (widget));
7489 g_signal_connect (window, "destroy",
7490 G_CALLBACK (gtk_widget_destroyed),
7493 gtk_window_set_title (GTK_WINDOW (window), "Window states");
7495 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7496 gtk_container_add (GTK_CONTAINER (window), box1);
7498 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7500 gtk_window_set_screen (GTK_WINDOW (iconified),
7501 gtk_widget_get_screen (widget));
7503 g_signal_connect_object (iconified, "destroy",
7504 G_CALLBACK (gtk_widget_destroy),
7507 gtk_window_iconify (GTK_WINDOW (iconified));
7508 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
7509 controls = get_state_controls (iconified);
7510 gtk_container_add (GTK_CONTAINER (iconified), controls);
7512 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7514 gtk_window_set_screen (GTK_WINDOW (normal),
7515 gtk_widget_get_screen (widget));
7517 g_signal_connect_object (normal, "destroy",
7518 G_CALLBACK (gtk_widget_destroy),
7522 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
7523 controls = get_state_controls (normal);
7524 gtk_container_add (GTK_CONTAINER (normal), controls);
7526 label = tracking_label (iconified);
7527 gtk_container_add (GTK_CONTAINER (box1), label);
7529 label = tracking_label (normal);
7530 gtk_container_add (GTK_CONTAINER (box1), label);
7532 gtk_widget_show_all (iconified);
7533 gtk_widget_show_all (normal);
7534 gtk_widget_show_all (box1);
7537 if (!gtk_widget_get_visible (window))
7538 gtk_widget_show (window);
7540 gtk_widget_destroy (window);
7548 configure_event_callback (GtkWidget *widget,
7549 GdkEventConfigure *event,
7552 GtkWidget *label = data;
7556 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
7558 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
7560 event->x, event->y, event->width, event->height,
7563 gtk_label_set_text (GTK_LABEL (label), msg);
7571 get_ints (GtkWidget *window,
7578 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
7579 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
7581 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
7582 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
7586 set_size_callback (GtkWidget *widget,
7591 get_ints (data, &w, &h);
7593 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
7597 unset_default_size_callback (GtkWidget *widget,
7600 gtk_window_set_default_size (g_object_get_data (data, "target"),
7605 set_default_size_callback (GtkWidget *widget,
7610 get_ints (data, &w, &h);
7612 gtk_window_set_default_size (g_object_get_data (data, "target"),
7617 unset_size_request_callback (GtkWidget *widget,
7620 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7625 set_size_request_callback (GtkWidget *widget,
7630 get_ints (data, &w, &h);
7632 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7637 set_location_callback (GtkWidget *widget,
7642 get_ints (data, &x, &y);
7644 gtk_window_move (g_object_get_data (data, "target"), x, y);
7648 move_to_position_callback (GtkWidget *widget,
7654 window = g_object_get_data (data, "target");
7656 gtk_window_get_position (window, &x, &y);
7658 gtk_window_move (window, x, y);
7662 set_geometry_callback (GtkWidget *entry,
7668 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
7670 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
7672 if (!gtk_window_parse_geometry (target, text))
7673 g_print ("Bad geometry string '%s'\n", text);
7679 resizable_callback (GtkWidget *widget,
7682 g_object_set (g_object_get_data (data, "target"),
7683 "resizable", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)),
7688 gravity_selected (GtkWidget *widget,
7691 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
7692 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GDK_GRAVITY_NORTH_WEST);
7696 pos_selected (GtkWidget *widget,
7699 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
7700 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GTK_WIN_POS_NONE);
7704 move_gravity_window_to_current_position (GtkWidget *widget,
7710 window = GTK_WINDOW (data);
7712 gtk_window_get_position (window, &x, &y);
7714 gtk_window_move (window, x, y);
7718 get_screen_corner (GtkWindow *window,
7723 GdkScreen * screen = gtk_window_get_screen (window);
7725 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
7727 switch (gtk_window_get_gravity (window))
7729 case GDK_GRAVITY_SOUTH_EAST:
7730 *x = gdk_screen_get_width (screen) - w;
7731 *y = gdk_screen_get_height (screen) - h;
7734 case GDK_GRAVITY_NORTH_EAST:
7735 *x = gdk_screen_get_width (screen) - w;
7739 case GDK_GRAVITY_SOUTH_WEST:
7741 *y = gdk_screen_get_height (screen) - h;
7744 case GDK_GRAVITY_NORTH_WEST:
7749 case GDK_GRAVITY_SOUTH:
7750 *x = (gdk_screen_get_width (screen) - w) / 2;
7751 *y = gdk_screen_get_height (screen) - h;
7754 case GDK_GRAVITY_NORTH:
7755 *x = (gdk_screen_get_width (screen) - w) / 2;
7759 case GDK_GRAVITY_WEST:
7761 *y = (gdk_screen_get_height (screen) - h) / 2;
7764 case GDK_GRAVITY_EAST:
7765 *x = gdk_screen_get_width (screen) - w;
7766 *y = (gdk_screen_get_height (screen) - h) / 2;
7769 case GDK_GRAVITY_CENTER:
7770 *x = (gdk_screen_get_width (screen) - w) / 2;
7771 *y = (gdk_screen_get_height (screen) - h) / 2;
7774 case GDK_GRAVITY_STATIC:
7775 /* pick some random numbers */
7781 g_assert_not_reached ();
7787 move_gravity_window_to_starting_position (GtkWidget *widget,
7793 window = GTK_WINDOW (data);
7795 get_screen_corner (window,
7798 gtk_window_move (window, x, y);
7802 make_gravity_window (GtkWidget *destroy_with,
7811 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7813 gtk_window_set_screen (GTK_WINDOW (window),
7814 gtk_widget_get_screen (destroy_with));
7816 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7817 gtk_widget_show (vbox);
7819 gtk_container_add (GTK_CONTAINER (window), vbox);
7820 gtk_window_set_title (GTK_WINDOW (window), title);
7821 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
7823 g_signal_connect_object (destroy_with,
7825 G_CALLBACK (gtk_widget_destroy),
7830 button = gtk_button_new_with_mnemonic ("_Move to current position");
7832 g_signal_connect (button, "clicked",
7833 G_CALLBACK (move_gravity_window_to_current_position),
7836 gtk_container_add (GTK_CONTAINER (vbox), button);
7837 gtk_widget_show (button);
7839 button = gtk_button_new_with_mnemonic ("Move to _starting position");
7841 g_signal_connect (button, "clicked",
7842 G_CALLBACK (move_gravity_window_to_starting_position),
7845 gtk_container_add (GTK_CONTAINER (vbox), button);
7846 gtk_widget_show (button);
7848 /* Pretend this is the result of --geometry.
7849 * DO NOT COPY THIS CODE unless you are setting --geometry results,
7850 * and in that case you probably should just use gtk_window_parse_geometry().
7851 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
7852 * you are parsing --geometry or equivalent.
7854 gtk_window_set_geometry_hints (GTK_WINDOW (window),
7858 gtk_window_set_default_size (GTK_WINDOW (window),
7861 get_screen_corner (GTK_WINDOW (window), &x, &y);
7863 gtk_window_move (GTK_WINDOW (window),
7870 do_gravity_test (GtkWidget *widget,
7873 GtkWidget *destroy_with = data;
7876 /* We put a window at each gravity point on the screen. */
7877 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
7879 gtk_widget_show (window);
7881 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
7883 gtk_widget_show (window);
7885 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
7887 gtk_widget_show (window);
7889 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
7891 gtk_widget_show (window);
7893 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
7895 gtk_widget_show (window);
7897 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
7899 gtk_widget_show (window);
7902 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
7904 gtk_widget_show (window);
7907 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
7909 gtk_widget_show (window);
7911 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
7913 gtk_widget_show (window);
7915 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
7917 gtk_widget_show (window);
7921 window_controls (GtkWidget *window)
7923 GtkWidget *control_window;
7933 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7935 gtk_window_set_screen (GTK_WINDOW (control_window),
7936 gtk_widget_get_screen (window));
7938 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
7940 g_object_set_data (G_OBJECT (control_window),
7944 g_signal_connect_object (control_window,
7946 G_CALLBACK (gtk_widget_destroy),
7950 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
7952 gtk_container_add (GTK_CONTAINER (control_window), vbox);
7954 label = gtk_label_new ("<no configure events>");
7955 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
7957 g_signal_connect (window,
7959 G_CALLBACK (configure_event_callback),
7962 adj = gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0, 5.0, 0.0);
7963 spin = gtk_spin_button_new (adj, 0, 0);
7965 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
7967 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
7969 adj = gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0, 5.0, 0.0);
7970 spin = gtk_spin_button_new (adj, 0, 0);
7972 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
7974 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
7976 entry = gtk_entry_new ();
7977 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
7979 g_signal_connect (entry, "changed",
7980 G_CALLBACK (set_geometry_callback),
7983 button = gtk_button_new_with_label ("Show gravity test windows");
7984 g_signal_connect_swapped (button,
7986 G_CALLBACK (do_gravity_test),
7988 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7990 button = gtk_button_new_with_label ("Reshow with initial size");
7991 g_signal_connect_object (button,
7993 G_CALLBACK (gtk_window_reshow_with_initial_size),
7996 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7998 button = gtk_button_new_with_label ("Queue resize");
7999 g_signal_connect_object (button,
8001 G_CALLBACK (gtk_widget_queue_resize),
8004 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8006 button = gtk_button_new_with_label ("Resize");
8007 g_signal_connect (button,
8009 G_CALLBACK (set_size_callback),
8011 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8013 button = gtk_button_new_with_label ("Set default size");
8014 g_signal_connect (button,
8016 G_CALLBACK (set_default_size_callback),
8018 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8020 button = gtk_button_new_with_label ("Unset default size");
8021 g_signal_connect (button,
8023 G_CALLBACK (unset_default_size_callback),
8025 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8027 button = gtk_button_new_with_label ("Set size request");
8028 g_signal_connect (button,
8030 G_CALLBACK (set_size_request_callback),
8032 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8034 button = gtk_button_new_with_label ("Unset size request");
8035 g_signal_connect (button,
8037 G_CALLBACK (unset_size_request_callback),
8039 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8041 button = gtk_button_new_with_label ("Move");
8042 g_signal_connect (button,
8044 G_CALLBACK (set_location_callback),
8046 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8048 button = gtk_button_new_with_label ("Move to current position");
8049 g_signal_connect (button,
8051 G_CALLBACK (move_to_position_callback),
8053 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8055 button = gtk_check_button_new_with_label ("Allow resize");
8056 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
8057 g_signal_connect (button,
8059 G_CALLBACK (resizable_callback),
8061 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8063 button = gtk_button_new_with_mnemonic ("_Show");
8064 g_signal_connect_object (button,
8066 G_CALLBACK (gtk_widget_show),
8069 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8071 button = gtk_button_new_with_mnemonic ("_Hide");
8072 g_signal_connect_object (button,
8074 G_CALLBACK (gtk_widget_hide),
8077 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8079 om = gtk_combo_box_text_new ();
8083 static gchar *names[] = {
8084 "GDK_GRAVITY_NORTH_WEST",
8085 "GDK_GRAVITY_NORTH",
8086 "GDK_GRAVITY_NORTH_EAST",
8088 "GDK_GRAVITY_CENTER",
8090 "GDK_GRAVITY_SOUTH_WEST",
8091 "GDK_GRAVITY_SOUTH",
8092 "GDK_GRAVITY_SOUTH_EAST",
8093 "GDK_GRAVITY_STATIC",
8097 g_assert (names[i]);
8098 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (om), names[i]);
8103 g_signal_connect (om,
8105 G_CALLBACK (gravity_selected),
8108 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8111 om = gtk_combo_box_text_new ();
8115 static gchar *names[] = {
8117 "GTK_WIN_POS_CENTER",
8118 "GTK_WIN_POS_MOUSE",
8119 "GTK_WIN_POS_CENTER_ALWAYS",
8120 "GTK_WIN_POS_CENTER_ON_PARENT",
8124 g_assert (names[i]);
8125 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (om), names[i]);
8130 g_signal_connect (om,
8132 G_CALLBACK (pos_selected),
8135 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8137 gtk_widget_show_all (vbox);
8139 return control_window;
8143 create_window_sizing (GtkWidget *widget)
8145 static GtkWidget *window = NULL;
8146 static GtkWidget *target_window = NULL;
8152 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8153 gtk_window_set_screen (GTK_WINDOW (target_window),
8154 gtk_widget_get_screen (widget));
8155 label = gtk_label_new (NULL);
8156 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");
8157 gtk_container_add (GTK_CONTAINER (target_window), label);
8158 gtk_widget_show (label);
8160 g_signal_connect (target_window, "destroy",
8161 G_CALLBACK (gtk_widget_destroyed),
8164 window = window_controls (target_window);
8166 g_signal_connect (window, "destroy",
8167 G_CALLBACK (gtk_widget_destroyed),
8170 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
8173 /* don't show target window by default, we want to allow testing
8174 * of behavior on first show.
8177 if (!gtk_widget_get_visible (window))
8178 gtk_widget_show (window);
8180 gtk_widget_destroy (window);
8187 typedef struct _ProgressData {
8190 GtkWidget *block_spin;
8191 GtkWidget *x_align_spin;
8192 GtkWidget *y_align_spin;
8193 GtkWidget *step_spin;
8194 GtkWidget *act_blocks_spin;
8205 progress_timeout (gpointer data)
8207 ProgressData *pdata = data;
8211 if (pdata->activity)
8213 gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar));
8215 text = g_strdup_printf ("%s", "???");
8219 new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;
8222 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);
8224 text = g_strdup_printf ("%.0f%%", 100 * new_val);
8227 gtk_label_set_text (GTK_LABEL (pdata->label), text);
8234 destroy_progress (GtkWidget *widget,
8235 ProgressData **pdata)
8237 g_source_remove ((*pdata)->timer);
8238 (*pdata)->timer = 0;
8239 (*pdata)->window = NULL;
8245 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
8247 ProgressData *pdata;
8250 pdata = (ProgressData *) data;
8252 if (!gtk_widget_get_mapped (widget))
8255 i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8257 if (i == 0 || i == 1)
8258 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_HORIZONTAL);
8260 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_VERTICAL);
8262 if (i == 1 || i == 2)
8263 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), TRUE);
8265 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), FALSE);
8269 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
8273 active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8274 gtk_progress_bar_set_show_text (GTK_PROGRESS_BAR (pdata->pbar), active);
8278 progressbar_toggle_ellipsize (GtkWidget *widget,
8281 ProgressData *pdata = data;
8282 if (gtk_widget_is_drawable (widget))
8284 gint i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8285 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar), i);
8290 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
8292 pdata->activity = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8296 entry_changed (GtkWidget *widget, ProgressData *pdata)
8298 gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar),
8299 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
8303 create_progress_bar (GtkWidget *widget)
8305 GtkWidget *action_area, *content_area;
8315 static ProgressData *pdata = NULL;
8317 static gchar *items1[] =
8325 static char *ellipsize_items[] = {
8326 "None", // PANGO_ELLIPSIZE_NONE,
8327 "Start", // PANGO_ELLIPSIZE_START,
8328 "Middle", // PANGO_ELLIPSIZE_MIDDLE,
8329 "End", // PANGO_ELLIPSIZE_END
8333 pdata = g_new0 (ProgressData, 1);
8337 pdata->window = gtk_dialog_new ();
8339 gtk_window_set_screen (GTK_WINDOW (pdata->window),
8340 gtk_widget_get_screen (widget));
8342 gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);
8344 g_signal_connect (pdata->window, "destroy",
8345 G_CALLBACK (destroy_progress),
8349 content_area = gtk_dialog_get_content_area (GTK_DIALOG (pdata->window));
8350 action_area = gtk_dialog_get_action_area (GTK_DIALOG (pdata->window));
8352 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
8353 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
8355 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8356 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
8357 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, TRUE, 0);
8359 frame = gtk_frame_new ("Progress");
8360 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8362 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8363 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8365 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8366 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8368 pdata->pbar = gtk_progress_bar_new ();
8369 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar),
8370 PANGO_ELLIPSIZE_MIDDLE);
8372 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
8373 pdata->timer = g_timeout_add (100, (GSourceFunc)progress_timeout, pdata);
8375 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8376 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8378 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
8379 gtk_container_add (GTK_CONTAINER (align), hbox);
8380 label = gtk_label_new ("Label updated by user :");
8381 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8382 pdata->label = gtk_label_new ("");
8383 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
8385 frame = gtk_frame_new ("Options");
8386 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8388 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8389 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8391 tab = gtk_table_new (7, 2, FALSE);
8392 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
8394 label = gtk_label_new ("Orientation :");
8395 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
8396 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8398 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
8400 pdata->omenu1 = build_option_menu (items1, 4, 0,
8401 progressbar_toggle_orientation,
8403 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8404 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
8405 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8407 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
8409 check = gtk_check_button_new_with_label ("Show text");
8410 g_signal_connect (check, "clicked",
8411 G_CALLBACK (toggle_show_text),
8413 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 1, 2,
8414 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8417 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8418 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 1, 2,
8419 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8422 label = gtk_label_new ("Text: ");
8423 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8425 pdata->entry = gtk_entry_new ();
8426 g_signal_connect (pdata->entry, "changed",
8427 G_CALLBACK (entry_changed),
8429 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
8430 gtk_widget_set_size_request (pdata->entry, 100, -1);
8432 label = gtk_label_new ("Ellipsize text :");
8433 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 10, 11,
8434 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8436 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
8437 pdata->elmenu = build_option_menu (ellipsize_items,
8438 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
8439 2, // PANGO_ELLIPSIZE_MIDDLE
8440 progressbar_toggle_ellipsize,
8442 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8443 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 10, 11,
8444 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8446 gtk_box_pack_start (GTK_BOX (hbox), pdata->elmenu, TRUE, TRUE, 0);
8448 check = gtk_check_button_new_with_label ("Activity mode");
8449 g_signal_connect (check, "clicked",
8450 G_CALLBACK (toggle_activity_mode), pdata);
8451 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 15, 16,
8452 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8455 button = gtk_button_new_with_label ("close");
8456 g_signal_connect_swapped (button, "clicked",
8457 G_CALLBACK (gtk_widget_destroy),
8459 gtk_widget_set_can_default (button, TRUE);
8460 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
8461 gtk_widget_grab_default (button);
8464 if (!gtk_widget_get_visible (pdata->window))
8465 gtk_widget_show_all (pdata->window);
8467 gtk_widget_destroy (pdata->window);
8479 GtkWidget *res_widget;
8483 find_widget (GtkWidget *widget, FindWidgetData *data)
8485 GtkAllocation new_allocation;
8489 gtk_widget_get_allocation (widget, &new_allocation);
8491 if (data->found || !gtk_widget_get_mapped (widget))
8494 /* Note that in the following code, we only count the
8495 * position as being inside a WINDOW widget if it is inside
8496 * widget->window; points that are outside of widget->window
8497 * but within the allocation are not counted. This is consistent
8498 * with the way we highlight drag targets.
8500 if (gtk_widget_get_has_window (widget))
8502 new_allocation.x = 0;
8503 new_allocation.y = 0;
8506 if (gtk_widget_get_parent (widget) && !data->first)
8508 GdkWindow *window = gtk_widget_get_window (widget);
8509 while (window != gtk_widget_get_window (gtk_widget_get_parent (widget)))
8511 gint tx, ty, twidth, theight;
8513 twidth = gdk_window_get_width (window);
8514 theight = gdk_window_get_height (window);
8516 if (new_allocation.x < 0)
8518 new_allocation.width += new_allocation.x;
8519 new_allocation.x = 0;
8521 if (new_allocation.y < 0)
8523 new_allocation.height += new_allocation.y;
8524 new_allocation.y = 0;
8526 if (new_allocation.x + new_allocation.width > twidth)
8527 new_allocation.width = twidth - new_allocation.x;
8528 if (new_allocation.y + new_allocation.height > theight)
8529 new_allocation.height = theight - new_allocation.y;
8531 gdk_window_get_position (window, &tx, &ty);
8532 new_allocation.x += tx;
8534 new_allocation.y += ty;
8537 window = gdk_window_get_parent (window);
8541 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
8542 (data->x < new_allocation.x + new_allocation.width) &&
8543 (data->y < new_allocation.y + new_allocation.height))
8545 /* First, check if the drag is in a valid drop site in
8546 * one of our children
8548 if (GTK_IS_CONTAINER (widget))
8550 FindWidgetData new_data = *data;
8552 new_data.x -= x_offset;
8553 new_data.y -= y_offset;
8554 new_data.found = FALSE;
8555 new_data.first = FALSE;
8557 gtk_container_forall (GTK_CONTAINER (widget),
8558 (GtkCallback)find_widget,
8561 data->found = new_data.found;
8563 data->res_widget = new_data.res_widget;
8566 /* If not, and this widget is registered as a drop site, check to
8567 * emit "drag_motion" to check if we are actually in
8573 data->res_widget = widget;
8579 find_widget_at_pointer (GdkDisplay *display)
8581 GtkWidget *widget = NULL;
8582 GdkWindow *pointer_window;
8584 FindWidgetData data;
8586 pointer_window = gdk_display_get_window_at_pointer (display, NULL, NULL);
8590 gpointer widget_ptr;
8592 gdk_window_get_user_data (pointer_window, &widget_ptr);
8593 widget = widget_ptr;
8598 gdk_window_get_pointer (gtk_widget_get_window (widget),
8606 find_widget (widget, &data);
8608 return data.res_widget;
8614 struct PropertiesData {
8622 destroy_properties (GtkWidget *widget,
8623 struct PropertiesData *data)
8627 *data->window = NULL;
8628 data->window = NULL;
8633 g_object_unref (data->cursor);
8634 data->cursor = NULL;
8639 g_signal_handler_disconnect (widget, data->handler);
8647 property_query_event (GtkWidget *widget,
8649 struct PropertiesData *data)
8651 GtkWidget *res_widget = NULL;
8653 if (!data->in_query)
8656 if (event->type == GDK_BUTTON_RELEASE)
8658 gtk_grab_remove (widget);
8659 gdk_device_ungrab (gdk_event_get_device (event), GDK_CURRENT_TIME);
8661 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
8664 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
8665 gtk_widget_get_screen (widget));
8666 create_prop_editor (G_OBJECT (res_widget), 0);
8669 data->in_query = FALSE;
8676 query_properties (GtkButton *button,
8677 struct PropertiesData *data)
8679 GtkWidget *widget = GTK_WIDGET (button);
8680 GdkDisplay *display;
8681 GdkDeviceManager *device_manager;
8684 g_signal_connect (button, "event",
8685 G_CALLBACK (property_query_event), data);
8687 display = gtk_widget_get_display (widget);
8690 data->cursor = gdk_cursor_new_for_display (display, GDK_TARGET);
8692 device_manager = gdk_display_get_device_manager (display);
8693 device = gdk_device_manager_get_client_pointer (device_manager);
8694 gdk_device_grab (device,
8695 gtk_widget_get_window (widget),
8698 GDK_BUTTON_RELEASE_MASK,
8701 gtk_grab_add (widget);
8703 data->in_query = TRUE;
8707 create_properties (GtkWidget *widget)
8709 static GtkWidget *window = NULL;
8713 struct PropertiesData *data;
8715 data = g_new (struct PropertiesData, 1);
8716 data->window = &window;
8717 data->in_query = FALSE;
8718 data->cursor = NULL;
8723 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8725 gtk_window_set_screen (GTK_WINDOW (window),
8726 gtk_widget_get_screen (widget));
8728 data->handler = g_signal_connect (window, "destroy",
8729 G_CALLBACK (destroy_properties),
8732 gtk_window_set_title (GTK_WINDOW (window), "test properties");
8733 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
8735 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1);
8736 gtk_container_add (GTK_CONTAINER (window), vbox);
8738 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
8739 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
8741 button = gtk_button_new_with_label ("Query properties");
8742 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8743 g_signal_connect (button, "clicked",
8744 G_CALLBACK (query_properties),
8748 if (!gtk_widget_get_visible (window))
8749 gtk_widget_show_all (window);
8751 gtk_widget_destroy (window);
8755 struct SnapshotData {
8756 GtkWidget *toplevel_button;
8760 gboolean is_toplevel;
8765 destroy_snapshot_data (GtkWidget *widget,
8766 struct SnapshotData *data)
8769 *data->window = NULL;
8773 g_object_unref (data->cursor);
8774 data->cursor = NULL;
8779 g_signal_handler_disconnect (widget, data->handler);
8787 snapshot_widget_event (GtkWidget *widget,
8789 struct SnapshotData *data)
8791 GtkWidget *res_widget = NULL;
8793 if (!data->in_query)
8796 if (event->type == GDK_BUTTON_RELEASE)
8798 gtk_grab_remove (widget);
8799 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
8802 res_widget = find_widget_at_pointer (gtk_widget_get_display (widget));
8803 if (data->is_toplevel && res_widget)
8804 res_widget = gtk_widget_get_toplevel (res_widget);
8807 cairo_surface_t *surface;
8808 GtkWidget *window, *image;
8813 width = gtk_widget_get_allocated_width (res_widget);
8814 height = gtk_widget_get_allocated_height (res_widget);
8816 surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
8818 cr = cairo_create (surface);
8819 gtk_widget_draw (res_widget, cr);
8822 pixbuf = gdk_pixbuf_get_from_surface (surface,
8825 cairo_surface_destroy (surface);
8827 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8828 image = gtk_image_new_from_pixbuf (pixbuf);
8829 g_object_unref (pixbuf);
8831 gtk_container_add (GTK_CONTAINER (window), image);
8832 gtk_widget_show_all (window);
8835 data->in_query = FALSE;
8842 snapshot_widget (GtkButton *button,
8843 struct SnapshotData *data)
8845 GtkWidget *widget = GTK_WIDGET (button);
8848 g_signal_connect (button, "event",
8849 G_CALLBACK (snapshot_widget_event), data);
8851 data->is_toplevel = widget == data->toplevel_button;
8854 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget),
8857 failure = gdk_pointer_grab (gtk_widget_get_window (widget),
8859 GDK_BUTTON_RELEASE_MASK,
8864 gtk_grab_add (widget);
8866 data->in_query = TRUE;
8870 create_snapshot (GtkWidget *widget)
8872 static GtkWidget *window = NULL;
8875 struct SnapshotData *data;
8877 data = g_new (struct SnapshotData, 1);
8878 data->window = &window;
8879 data->in_query = FALSE;
8880 data->cursor = NULL;
8885 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8887 gtk_window_set_screen (GTK_WINDOW (window),
8888 gtk_widget_get_screen (widget));
8890 data->handler = g_signal_connect (window, "destroy",
8891 G_CALLBACK (destroy_snapshot_data),
8894 gtk_window_set_title (GTK_WINDOW (window), "test snapshot");
8895 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
8897 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1);
8898 gtk_container_add (GTK_CONTAINER (window), vbox);
8900 button = gtk_button_new_with_label ("Snapshot widget");
8901 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8902 g_signal_connect (button, "clicked",
8903 G_CALLBACK (snapshot_widget),
8906 button = gtk_button_new_with_label ("Snapshot toplevel");
8907 data->toplevel_button = button;
8908 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8909 g_signal_connect (button, "clicked",
8910 G_CALLBACK (snapshot_widget),
8914 if (!gtk_widget_get_visible (window))
8915 gtk_widget_show_all (window);
8917 gtk_widget_destroy (window);
8926 selection_test_received (GtkWidget *tree_view,
8927 GtkSelectionData *selection_data)
8929 GtkTreeModel *model;
8930 GtkListStore *store;
8934 if (gtk_selection_data_get_length (selection_data) < 0)
8936 g_print ("Selection retrieval failed\n");
8939 if (gtk_selection_data_get_data_type (selection_data) != GDK_SELECTION_TYPE_ATOM)
8941 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
8945 /* Clear out any current list items */
8947 model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
8948 store = GTK_LIST_STORE (model);
8949 gtk_list_store_clear (store);
8951 /* Add new items to list */
8953 gtk_selection_data_get_targets (selection_data,
8956 for (i = 0; i < l; i++)
8961 name = gdk_atom_name (atoms[i]);
8964 gtk_list_store_insert_with_values (store, &iter, i, 0, name, -1);
8968 gtk_list_store_insert_with_values (store, &iter, i, 0, "(bad atom)", -1);
8975 selection_test_get_targets (GtkWidget *widget, GtkWidget *tree_view)
8977 static GdkAtom targets_atom = GDK_NONE;
8979 if (targets_atom == GDK_NONE)
8980 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
8982 gtk_selection_convert (tree_view, GDK_SELECTION_PRIMARY, targets_atom,
8987 create_selection_test (GtkWidget *widget)
8989 static GtkWidget *window = NULL;
8990 GtkWidget *action_area, *content_area;
8993 GtkWidget *scrolled_win;
8994 GtkListStore* store;
8995 GtkWidget *tree_view;
8996 GtkTreeViewColumn *column;
8997 GtkCellRenderer *renderer;
9002 window = gtk_dialog_new ();
9004 gtk_window_set_screen (GTK_WINDOW (window),
9005 gtk_widget_get_screen (widget));
9007 g_signal_connect (window, "destroy",
9008 G_CALLBACK (gtk_widget_destroyed),
9011 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9012 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9014 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
9015 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9017 /* Create the list */
9019 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
9020 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9021 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
9023 label = gtk_label_new ("Gets available targets for current selection");
9024 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9026 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
9027 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
9028 GTK_POLICY_AUTOMATIC,
9029 GTK_POLICY_AUTOMATIC);
9030 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
9031 gtk_widget_set_size_request (scrolled_win, 100, 200);
9033 store = gtk_list_store_new (1, G_TYPE_STRING);
9034 tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
9035 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), tree_view);
9037 renderer = gtk_cell_renderer_text_new ();
9038 column = gtk_tree_view_column_new_with_attributes ("Target", renderer,
9040 gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
9042 g_signal_connect (tree_view, "selection_received",
9043 G_CALLBACK (selection_test_received), NULL);
9045 /* .. And create some buttons */
9046 button = gtk_button_new_with_label ("Get Targets");
9047 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9049 g_signal_connect (button, "clicked",
9050 G_CALLBACK (selection_test_get_targets), tree_view);
9052 button = gtk_button_new_with_label ("Quit");
9053 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9055 g_signal_connect_swapped (button, "clicked",
9056 G_CALLBACK (gtk_widget_destroy),
9060 if (!gtk_widget_get_visible (window))
9061 gtk_widget_show_all (window);
9063 gtk_widget_destroy (window);
9070 static int scroll_test_pos = 0.0;
9073 scroll_test_draw (GtkWidget *widget,
9078 gint imin, imax, jmin, jmax;
9081 gdk_cairo_get_clip_rectangle (cr, &clip);
9083 imin = (clip.x) / 10;
9084 imax = (clip.x + clip.width + 9) / 10;
9086 jmin = ((int)adj->value + clip.y) / 10;
9087 jmax = ((int)adj->value + clip.y + clip.height + 9) / 10;
9089 for (i=imin; i<imax; i++)
9090 for (j=jmin; j<jmax; j++)
9092 cairo_rectangle (cr, 10*i, 10*j - (int)adj->value, 1+i%10, 1+j%10);
9100 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
9103 gdouble new_value = adj->value + ((event->direction == GDK_SCROLL_UP) ?
9104 -adj->page_increment / 2:
9105 adj->page_increment / 2);
9106 new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
9107 gtk_adjustment_set_value (adj, new_value);
9113 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
9116 GtkAllocation allocation;
9118 gtk_widget_get_allocation (widget, &allocation);
9119 adj->page_increment = 0.9 * allocation.height;
9120 adj->page_size = allocation.height;
9122 g_signal_emit_by_name (adj, "changed");
9126 scroll_test_adjustment_changed (GtkAdjustment *adj, GtkWidget *widget)
9131 dy = scroll_test_pos - (int)adj->value;
9132 scroll_test_pos = adj->value;
9134 if (!gtk_widget_is_drawable (widget))
9137 window = gtk_widget_get_window (widget);
9138 gdk_window_scroll (window, 0, dy);
9139 gdk_window_process_updates (window, FALSE);
9144 create_scroll_test (GtkWidget *widget)
9146 static GtkWidget *window = NULL;
9147 GtkWidget *action_area, *content_area;
9149 GtkWidget *drawing_area;
9150 GtkWidget *scrollbar;
9153 GdkGeometry geometry;
9154 GdkWindowHints geometry_mask;
9158 window = gtk_dialog_new ();
9160 gtk_window_set_screen (GTK_WINDOW (window),
9161 gtk_widget_get_screen (widget));
9163 g_signal_connect (window, "destroy",
9164 G_CALLBACK (gtk_widget_destroyed),
9167 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9168 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9170 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
9171 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9173 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
9174 gtk_box_pack_start (GTK_BOX (content_area), hbox, TRUE, TRUE, 0);
9175 gtk_widget_show (hbox);
9177 drawing_area = gtk_drawing_area_new ();
9178 gtk_widget_set_size_request (drawing_area, 200, 200);
9179 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
9180 gtk_widget_show (drawing_area);
9182 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
9184 adj = gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0);
9185 scroll_test_pos = 0.0;
9187 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, adj);
9188 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
9189 gtk_widget_show (scrollbar);
9191 g_signal_connect (drawing_area, "draw",
9192 G_CALLBACK (scroll_test_draw), adj);
9193 g_signal_connect (drawing_area, "configure_event",
9194 G_CALLBACK (scroll_test_configure), adj);
9195 g_signal_connect (drawing_area, "scroll_event",
9196 G_CALLBACK (scroll_test_scroll), adj);
9198 g_signal_connect (adj, "value_changed",
9199 G_CALLBACK (scroll_test_adjustment_changed),
9202 /* .. And create some buttons */
9204 button = gtk_button_new_with_label ("Quit");
9205 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9207 g_signal_connect_swapped (button, "clicked",
9208 G_CALLBACK (gtk_widget_destroy),
9210 gtk_widget_show (button);
9212 /* Set up gridded geometry */
9214 geometry_mask = GDK_HINT_MIN_SIZE |
9215 GDK_HINT_BASE_SIZE |
9216 GDK_HINT_RESIZE_INC;
9218 geometry.min_width = 20;
9219 geometry.min_height = 20;
9220 geometry.base_width = 0;
9221 geometry.base_height = 0;
9222 geometry.width_inc = 10;
9223 geometry.height_inc = 10;
9225 gtk_window_set_geometry_hints (GTK_WINDOW (window),
9226 drawing_area, &geometry, geometry_mask);
9229 if (!gtk_widget_get_visible (window))
9230 gtk_widget_show (window);
9232 gtk_widget_destroy (window);
9239 static int timer = 0;
9242 timeout_test (GtkWidget *label)
9244 static int count = 0;
9245 static char buffer[32];
9247 sprintf (buffer, "count: %d", ++count);
9248 gtk_label_set_text (GTK_LABEL (label), buffer);
9254 start_timeout_test (GtkWidget *widget,
9259 timer = g_timeout_add (100, (GSourceFunc)timeout_test, label);
9264 stop_timeout_test (GtkWidget *widget,
9269 g_source_remove (timer);
9275 destroy_timeout_test (GtkWidget *widget,
9278 stop_timeout_test (NULL, NULL);
9284 create_timeout_test (GtkWidget *widget)
9286 static GtkWidget *window = NULL;
9287 GtkWidget *action_area, *content_area;
9293 window = gtk_dialog_new ();
9295 gtk_window_set_screen (GTK_WINDOW (window),
9296 gtk_widget_get_screen (widget));
9298 g_signal_connect (window, "destroy",
9299 G_CALLBACK (destroy_timeout_test),
9302 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9303 action_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9305 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
9306 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9308 label = gtk_label_new ("count: 0");
9309 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
9310 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9311 gtk_widget_show (label);
9313 button = gtk_button_new_with_label ("close");
9314 g_signal_connect_swapped (button, "clicked",
9315 G_CALLBACK (gtk_widget_destroy),
9317 gtk_widget_set_can_default (button, TRUE);
9318 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9319 gtk_widget_grab_default (button);
9320 gtk_widget_show (button);
9322 button = gtk_button_new_with_label ("start");
9323 g_signal_connect (button, "clicked",
9324 G_CALLBACK(start_timeout_test),
9326 gtk_widget_set_can_default (button, TRUE);
9327 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9328 gtk_widget_show (button);
9330 button = gtk_button_new_with_label ("stop");
9331 g_signal_connect (button, "clicked",
9332 G_CALLBACK (stop_timeout_test),
9334 gtk_widget_set_can_default (button, TRUE);
9335 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9336 gtk_widget_show (button);
9339 if (!gtk_widget_get_visible (window))
9340 gtk_widget_show (window);
9342 gtk_widget_destroy (window);
9349 static int idle_id = 0;
9352 idle_test (GtkWidget *label)
9354 static int count = 0;
9355 static char buffer[32];
9357 sprintf (buffer, "count: %d", ++count);
9358 gtk_label_set_text (GTK_LABEL (label), buffer);
9364 start_idle_test (GtkWidget *widget,
9369 idle_id = g_idle_add ((GSourceFunc) idle_test, label);
9374 stop_idle_test (GtkWidget *widget,
9379 g_source_remove (idle_id);
9385 destroy_idle_test (GtkWidget *widget,
9388 stop_idle_test (NULL, NULL);
9394 toggle_idle_container (GObject *button,
9395 GtkContainer *container)
9397 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
9401 create_idle_test (GtkWidget *widget)
9403 static GtkWidget *window = NULL;
9406 GtkWidget *container;
9410 GtkWidget *action_area, *content_area;
9415 window = gtk_dialog_new ();
9417 gtk_window_set_screen (GTK_WINDOW (window),
9418 gtk_widget_get_screen (widget));
9420 g_signal_connect (window, "destroy",
9421 G_CALLBACK (destroy_idle_test),
9424 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9425 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9427 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
9428 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9430 label = gtk_label_new ("count: 0");
9431 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
9432 gtk_widget_show (label);
9435 g_object_new (GTK_TYPE_HBOX,
9437 /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
9438 * "GtkWidget::visible", TRUE,
9443 gtk_box_pack_start (GTK_BOX (content_area), container, TRUE, TRUE, 0);
9446 g_object_new (GTK_TYPE_FRAME,
9448 "label", "Label Container",
9450 "parent", content_area,
9453 g_object_new (GTK_TYPE_VBOX,
9458 g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
9459 "label", "Resize-Parent",
9460 "user_data", (void*)GTK_RESIZE_PARENT,
9464 "signal::clicked", toggle_idle_container, container,
9466 button = g_object_new (GTK_TYPE_RADIO_BUTTON,
9467 "label", "Resize-Queue",
9468 "user_data", (void*)GTK_RESIZE_QUEUE,
9473 g_object_connect (button,
9474 "signal::clicked", toggle_idle_container, container,
9476 button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
9477 "label", "Resize-Immediate",
9478 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
9480 g_object_connect (button2,
9481 "signal::clicked", toggle_idle_container, container,
9483 g_object_set (button2,
9489 button = gtk_button_new_with_label ("close");
9490 g_signal_connect_swapped (button, "clicked",
9491 G_CALLBACK (gtk_widget_destroy),
9493 gtk_widget_set_can_default (button, TRUE);
9494 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9495 gtk_widget_grab_default (button);
9496 gtk_widget_show (button);
9498 button = gtk_button_new_with_label ("start");
9499 g_signal_connect (button, "clicked",
9500 G_CALLBACK (start_idle_test),
9502 gtk_widget_set_can_default (button, TRUE);
9503 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9504 gtk_widget_show (button);
9506 button = gtk_button_new_with_label ("stop");
9507 g_signal_connect (button, "clicked",
9508 G_CALLBACK (stop_idle_test),
9510 gtk_widget_set_can_default (button, TRUE);
9511 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9512 gtk_widget_show (button);
9515 if (!gtk_widget_get_visible (window))
9516 gtk_widget_show (window);
9518 gtk_widget_destroy (window);
9526 reload_all_rc_files (void)
9528 static GdkAtom atom_rcfiles = GDK_NONE;
9530 GdkEvent *send_event = gdk_event_new (GDK_CLIENT_EVENT);
9534 atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
9536 for(i = 0; i < 5; i++)
9537 send_event->client.data.l[i] = 0;
9538 send_event->client.data_format = 32;
9539 send_event->client.message_type = atom_rcfiles;
9540 gdk_event_send_clientmessage_toall (send_event);
9542 gdk_event_free (send_event);
9546 create_rc_file (GtkWidget *widget)
9548 static GtkWidget *window = NULL;
9549 GtkWidget *action_area, *content_area;
9557 window = gtk_dialog_new ();
9559 gtk_window_set_screen (GTK_WINDOW (window),
9560 gtk_widget_get_screen (widget));
9562 g_signal_connect (window, "destroy",
9563 G_CALLBACK (gtk_widget_destroyed),
9566 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9567 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9569 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
9570 gtk_box_pack_start (GTK_BOX (content_area), frame, FALSE, FALSE, 0);
9572 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
9573 gtk_container_add (GTK_CONTAINER (frame), vbox);
9575 label = gtk_label_new ("This label should be red");
9576 gtk_widget_set_name (label, "testgtk-red-label");
9577 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9579 label = gtk_label_new ("This label should be green");
9580 gtk_widget_set_name (label, "testgtk-green-label");
9581 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9583 label = gtk_label_new ("This label should be blue");
9584 gtk_widget_set_name (label, "testgtk-blue-label");
9585 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9587 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
9588 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9590 button = gtk_button_new_with_label ("Reload");
9591 g_signal_connect_swapped (button, "clicked",
9592 G_CALLBACK (gtk_style_context_reset_widgets),
9593 gtk_widget_get_screen (button));
9594 gtk_widget_set_can_default (button, TRUE);
9595 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9596 gtk_widget_grab_default (button);
9598 button = gtk_button_new_with_label ("Reload All");
9599 g_signal_connect (button, "clicked",
9600 G_CALLBACK (reload_all_rc_files), NULL);
9601 gtk_widget_set_can_default (button, TRUE);
9602 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9604 button = gtk_button_new_with_label ("Close");
9605 g_signal_connect_swapped (button, "clicked",
9606 G_CALLBACK (gtk_widget_destroy),
9608 gtk_widget_set_can_default (button, TRUE);
9609 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9612 if (!gtk_widget_get_visible (window))
9613 gtk_widget_show_all (window);
9615 gtk_widget_destroy (window);
9619 * Test of recursive mainloop
9623 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
9630 create_mainloop (GtkWidget *widget)
9632 static GtkWidget *window = NULL;
9633 GtkWidget *action_area, *content_area;
9639 window = gtk_dialog_new ();
9641 gtk_window_set_screen (GTK_WINDOW (window),
9642 gtk_widget_get_screen (widget));
9644 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
9646 g_signal_connect (window, "destroy",
9647 G_CALLBACK (mainloop_destroyed),
9650 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9651 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9653 label = gtk_label_new ("In recursive main loop...");
9654 gtk_misc_set_padding (GTK_MISC(label), 20, 20);
9656 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9657 gtk_widget_show (label);
9659 button = gtk_button_new_with_label ("Leave");
9660 gtk_box_pack_start (GTK_BOX (action_area), button, FALSE, TRUE, 0);
9662 g_signal_connect_swapped (button, "clicked",
9663 G_CALLBACK (gtk_widget_destroy),
9666 gtk_widget_set_can_default (button, TRUE);
9667 gtk_widget_grab_default (button);
9669 gtk_widget_show (button);
9672 if (!gtk_widget_get_visible (window))
9674 gtk_widget_show (window);
9676 g_print ("create_mainloop: start\n");
9678 g_print ("create_mainloop: done\n");
9681 gtk_widget_destroy (window);
9685 layout_draw_handler (GtkWidget *widget, cairo_t *cr)
9688 GdkWindow *bin_window;
9691 gint imin, imax, jmin, jmax;
9693 layout = GTK_LAYOUT (widget);
9694 bin_window = gtk_layout_get_bin_window (layout);
9696 if (!gtk_cairo_should_draw_window (cr, bin_window))
9699 gdk_window_get_position (bin_window, &x, &y);
9700 cairo_translate (cr, x, y);
9702 gdk_cairo_get_clip_rectangle (cr, &clip);
9704 imin = (clip.x) / 10;
9705 imax = (clip.x + clip.width + 9) / 10;
9707 jmin = (clip.y) / 10;
9708 jmax = (clip.y + clip.height + 9) / 10;
9710 for (i=imin; i<imax; i++)
9711 for (j=jmin; j<jmax; j++)
9713 cairo_rectangle (cr,
9722 void create_layout (GtkWidget *widget)
9724 GtkAdjustment *hadjustment, *vadjustment;
9726 static GtkWidget *window = NULL;
9727 GtkWidget *layout_widget;
9728 GtkWidget *scrolledwindow;
9737 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9738 gtk_window_set_screen (GTK_WINDOW (window),
9739 gtk_widget_get_screen (widget));
9741 g_signal_connect (window, "destroy",
9742 G_CALLBACK (gtk_widget_destroyed),
9745 gtk_window_set_title (GTK_WINDOW (window), "Layout");
9746 gtk_widget_set_size_request (window, 200, 200);
9748 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
9749 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
9751 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
9752 GTK_CORNER_TOP_RIGHT);
9754 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
9756 layout_widget = gtk_layout_new (NULL, NULL);
9757 layout = GTK_LAYOUT (layout_widget);
9758 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout_widget);
9760 /* We set step sizes here since GtkLayout does not set
9763 hadjustment = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (layout));
9764 vadjustment = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (layout));
9765 gtk_adjustment_set_step_increment (hadjustment, 10.0);
9766 gtk_adjustment_set_step_increment (vadjustment, 10.0);
9767 gtk_scrollable_set_hadjustment (GTK_SCROLLABLE (layout), hadjustment);
9768 gtk_scrollable_set_vadjustment (GTK_SCROLLABLE (layout), vadjustment);
9770 gtk_widget_set_events (layout_widget, GDK_EXPOSURE_MASK);
9771 g_signal_connect (layout, "draw",
9772 G_CALLBACK (layout_draw_handler), NULL);
9774 gtk_layout_set_size (layout, 1600, 128000);
9776 for (i=0 ; i < 16 ; i++)
9777 for (j=0 ; j < 16 ; j++)
9779 sprintf(buf, "Button %d, %d", i, j);
9781 button = gtk_button_new_with_label (buf);
9783 button = gtk_label_new (buf);
9785 gtk_layout_put (layout, button, j*100, i*100);
9788 for (i=16; i < 1280; i++)
9790 sprintf(buf, "Button %d, %d", i, 0);
9792 button = gtk_button_new_with_label (buf);
9794 button = gtk_label_new (buf);
9796 gtk_layout_put (layout, button, 0, i*100);
9800 if (!gtk_widget_get_visible (window))
9801 gtk_widget_show_all (window);
9803 gtk_widget_destroy (window);
9807 /* FIXME: need to completely redo this for GtkStyleContext */
9809 create_styles (GtkWidget *widget)
9811 static GtkWidget *window = NULL;
9812 GtkWidget *content_area, *action_area;
9817 static GdkRGBA red = { 1,0,0,1 };
9818 static GdkRGBA green = { 0,1,0,1 };
9819 static GdkRGBA blue = { 0,0,1,1 };
9820 static GdkRGBA yellow = { 1,1,0,1 };
9821 static GdkRGBA cyan = { 0,1,1,1 };
9822 PangoFontDescription *font_desc;
9824 GtkRcStyle *rc_style;
9828 window = gtk_dialog_new ();
9829 gtk_window_set_screen (GTK_WINDOW (window),
9830 gtk_widget_get_screen (widget));
9832 g_signal_connect (window, "destroy",
9833 G_CALLBACK (gtk_widget_destroyed),
9836 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9837 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9839 button = gtk_button_new_with_label ("Close");
9840 g_signal_connect_swapped (button, "clicked",
9841 G_CALLBACK (gtk_widget_destroy),
9843 gtk_widget_set_can_default (button, TRUE);
9844 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9845 gtk_widget_show (button);
9847 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
9848 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9849 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, FALSE, 0);
9851 label = gtk_label_new ("Font:");
9852 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9853 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9855 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
9857 button = gtk_button_new_with_label ("Some Text");
9858 gtk_widget_override_font (gtk_bin_get_child (GTK_BIN (button)), font_desc);
9859 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9861 label = gtk_label_new ("Foreground:");
9862 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9863 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9865 button = gtk_button_new_with_label ("Some Text");
9866 gtk_widget_override_color (gtk_bin_get_child (GTK_BIN (button)), 0, &red);
9867 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9869 label = gtk_label_new ("Background:");
9870 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9871 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9873 button = gtk_button_new_with_label ("Some Text");
9874 gtk_widget_override_background_color (button, 0, &green);
9875 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9877 label = gtk_label_new ("Text:");
9878 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9879 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9881 entry = gtk_entry_new ();
9882 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9883 gtk_widget_override_color (entry, 0, &blue);
9884 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9886 label = gtk_label_new ("Base:");
9887 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9888 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9890 entry = gtk_entry_new ();
9891 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9892 gtk_widget_override_background_color (entry, 0, &yellow);
9893 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9895 label = gtk_label_new ("Cursor:");
9896 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9897 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9899 entry = gtk_entry_new ();
9900 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9901 gtk_widget_modify_cursor (entry, &red, &red);
9902 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9904 label = gtk_label_new ("Multiple:");
9905 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9906 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9908 button = gtk_button_new_with_label ("Some Text");
9910 rc_style = gtk_rc_style_new ();
9912 rc_style->font_desc = pango_font_description_copy (font_desc);
9913 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
9914 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
9915 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
9916 rc_style->fg[GTK_STATE_NORMAL] = yellow;
9917 rc_style->bg[GTK_STATE_NORMAL] = blue;
9918 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
9919 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
9920 rc_style->fg[GTK_STATE_ACTIVE] = red;
9921 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
9922 rc_style->xthickness = 5;
9923 rc_style->ythickness = 5;
9925 gtk_widget_modify_style (button, rc_style);
9926 gtk_widget_modify_style (gtk_bin_get_child (GTK_BIN (button)), rc_style);
9928 g_object_unref (rc_style);
9930 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9933 if (!gtk_widget_get_visible (window))
9934 gtk_widget_show_all (window);
9936 gtk_widget_destroy (window);
9941 * Main Window and Exit
9945 do_exit (GtkWidget *widget, GtkWidget *window)
9947 gtk_widget_destroy (window);
9953 void (*func) (GtkWidget *widget);
9954 gboolean do_not_benchmark;
9957 { "alpha window", create_alpha_window },
9958 { "big windows", create_big_windows },
9959 { "button box", create_button_box },
9960 { "buttons", create_buttons },
9961 { "check buttons", create_check_buttons },
9962 { "color selection", create_color_selection },
9963 { "composited window", create_composited_window },
9964 { "cursors", create_cursors },
9965 { "dialog", create_dialog },
9966 { "display & screen", create_display_screen, TRUE },
9967 { "entry", create_entry },
9968 { "event box", create_event_box },
9969 { "event watcher", create_event_watcher },
9970 { "expander", create_expander },
9971 { "flipping", create_flipping },
9972 { "focus", create_focus },
9973 { "font selection", create_font_selection },
9974 { "handle box", create_handle_box },
9975 { "image", create_image },
9976 { "key lookup", create_key_lookup },
9977 { "labels", create_labels },
9978 { "layout", create_layout },
9979 { "menus", create_menus },
9980 { "message dialog", create_message_dialog },
9981 { "modal window", create_modal_window, TRUE },
9982 { "notebook", create_notebook },
9983 { "panes", create_panes },
9984 { "paned keyboard", create_paned_keyboard_navigation },
9985 { "pixbuf", create_pixbuf },
9986 { "progress bar", create_progress_bar },
9987 { "properties", create_properties },
9988 { "radio buttons", create_radio_buttons },
9989 { "range controls", create_range_controls },
9990 { "rc file", create_rc_file },
9991 { "reparent", create_reparent },
9992 { "resize grips", create_resize_grips },
9993 { "rotated label", create_rotated_label },
9994 { "rotated text", create_rotated_text },
9995 { "saved position", create_saved_position },
9996 { "scrolled windows", create_scrolled_windows },
9997 { "shapes", create_shapes },
9998 { "size groups", create_size_groups },
9999 { "snapshot", create_snapshot },
10000 { "spinbutton", create_spins },
10001 { "statusbar", create_statusbar },
10003 { "styles", create_styles },
10005 { "test idle", create_idle_test },
10006 { "test mainloop", create_mainloop, TRUE },
10007 { "test scrolling", create_scroll_test },
10008 { "test selection", create_selection_test },
10009 { "test timeout", create_timeout_test },
10010 { "toggle buttons", create_toggle_buttons },
10011 { "toolbar", create_toolbar },
10012 { "tooltips", create_tooltips },
10013 { "WM hints", create_wmhints },
10014 { "window sizing", create_window_sizing },
10015 { "window states", create_window_states }
10017 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
10020 create_main_window (void)
10025 GtkWidget *scrolled_window;
10029 GtkWidget *separator;
10030 GdkGeometry geometry;
10033 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10034 gtk_widget_set_name (window, "main_window");
10035 gtk_window_move (GTK_WINDOW (window), 50, 20);
10036 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
10038 geometry.min_width = -1;
10039 geometry.min_height = -1;
10040 geometry.max_width = -1;
10041 geometry.max_height = G_MAXSHORT;
10042 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
10044 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
10046 g_signal_connect (window, "destroy",
10047 G_CALLBACK (gtk_main_quit),
10049 g_signal_connect (window, "delete-event",
10050 G_CALLBACK (gtk_false),
10053 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
10054 gtk_container_add (GTK_CONTAINER (window), box1);
10056 if (gtk_micro_version > 0)
10059 gtk_get_major_version (),
10060 gtk_get_minor_version (),
10061 gtk_get_micro_version ());
10065 gtk_get_major_version (),
10066 gtk_get_minor_version ());
10068 label = gtk_label_new (buffer);
10069 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
10070 gtk_widget_set_name (label, "testgtk-version-label");
10072 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
10073 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
10074 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
10076 GTK_POLICY_AUTOMATIC);
10077 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
10079 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
10080 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10081 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
10082 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
10083 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
10084 gtk_widget_show (box2);
10086 for (i = 0; i < nbuttons; i++)
10088 button = gtk_button_new_with_label (buttons[i].label);
10089 if (buttons[i].func)
10090 g_signal_connect (button,
10092 G_CALLBACK(buttons[i].func),
10095 gtk_widget_set_sensitive (button, FALSE);
10096 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10099 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
10100 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
10102 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
10103 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10104 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
10106 button = gtk_button_new_with_mnemonic ("_Close");
10107 g_signal_connect (button, "clicked",
10108 G_CALLBACK (do_exit),
10110 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10111 gtk_widget_set_can_default (button, TRUE);
10112 gtk_widget_grab_default (button);
10114 gtk_widget_show_all (window);
10120 if (g_file_test ("../gdk-pixbuf/libpixbufloader-pnm.la",
10121 G_FILE_TEST_EXISTS))
10123 g_setenv ("GDK_PIXBUF_MODULE_FILE", "../gdk-pixbuf/loaders.cache", TRUE);
10124 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/immodules.cache", TRUE);
10129 pad (const char *str, int to)
10131 static char buf[256];
10132 int len = strlen (str);
10135 for (i = 0; i < to; i++)
10140 memcpy (buf, str, len);
10146 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
10148 fn (widget); /* on */
10149 while (g_main_context_iteration (NULL, FALSE));
10150 fn (widget); /* off */
10151 while (g_main_context_iteration (NULL, FALSE));
10155 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
10161 static gboolean printed_headers = FALSE;
10163 if (!printed_headers) {
10164 g_print ("Test Iters First Other\n");
10165 g_print ("-------------------- ----- ---------- ----------\n");
10166 printed_headers = TRUE;
10169 g_get_current_time (&tv0);
10170 bench_iteration (widget, fn);
10171 g_get_current_time (&tv1);
10173 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10174 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10176 g_get_current_time (&tv0);
10177 for (n = 0; n < num - 1; n++)
10178 bench_iteration (widget, fn);
10179 g_get_current_time (&tv1);
10180 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10181 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10183 g_print ("%s %5d ", pad (name, 20), num);
10185 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
10187 g_print ("%10.1f\n", dt_first);
10191 do_bench (char* what, int num)
10195 void (* fn) (GtkWidget *widget);
10197 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10199 if (g_ascii_strcasecmp (what, "ALL") == 0)
10201 for (i = 0; i < nbuttons; i++)
10203 if (!buttons[i].do_not_benchmark)
10204 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
10211 for (i = 0; i < nbuttons; i++)
10213 if (strcmp (buttons[i].label, what) == 0)
10215 fn = buttons[i].func;
10221 g_print ("Can't bench: \"%s\" not found.\n", what);
10223 do_real_bench (widget, fn, buttons[i].label, num);
10230 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
10235 main (int argc, char *argv[])
10237 GtkCssProvider *provider, *memory_provider;
10238 GdkDisplay *display;
10240 GtkBindingSet *binding_set;
10242 gboolean done_benchmarks = FALSE;
10244 srand (time (NULL));
10248 g_set_application_name ("GTK+ Test Program");
10250 gtk_init (&argc, &argv);
10252 provider = gtk_css_provider_new ();
10254 /* Check to see if we are being run from the correct
10257 if (file_exists ("testgtk.css"))
10258 gtk_css_provider_load_from_path (provider, "testgtk.css", NULL);
10259 else if (file_exists ("tests/testgtk.css"))
10260 gtk_css_provider_load_from_path (provider, "tests/testgtk.css", NULL);
10262 g_warning ("Couldn't find file \"testgtk.css\".");
10264 display = gdk_display_get_default ();
10265 screen = gdk_display_get_default_screen (display);
10267 gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (provider),
10268 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
10269 g_object_unref (provider);
10271 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
10280 for (i = 1; i < argc; i++)
10282 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
10289 nextarg = strchr (argv[i], '=');
10300 count = strchr (nextarg, ':');
10303 what = g_strndup (nextarg, count - nextarg);
10305 num = atoi (count);
10310 what = g_strdup (nextarg);
10312 do_bench (what, num ? num : 1);
10313 done_benchmarks = TRUE;
10318 if (done_benchmarks)
10323 binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
10324 gtk_binding_entry_add_signal (binding_set,
10325 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
10328 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
10330 memory_provider = gtk_css_provider_new ();
10331 gtk_css_provider_load_from_data (memory_provider,
10332 "#testgtk-version-label {\n"
10334 " font: Sans 18;\n"
10337 gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (memory_provider),
10338 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION + 1);
10340 create_main_window ();
10346 while (g_main_context_pending (NULL))
10347 g_main_context_iteration (NULL, FALSE);
10350 while (g_main_context_pending (NULL))
10351 g_main_context_iteration (NULL, FALSE);