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 *adjustment,
531 gint *old_value = g_object_get_data (G_OBJECT (adjustment), "old-value");
532 gint new_value = gtk_adjustment_get_value (adjustment);
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 *adjustment,
546 gint *old_value = g_object_get_data (G_OBJECT (adjustment), "old-value");
547 gint new_value = gtk_adjustment_get_value (adjustment);
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;
575 GtkAdjustment *hadjustment;
576 GtkAdjustment *vadjustment;
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 hadjustment = gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
612 g_signal_connect (hadjustment, "value_changed",
613 G_CALLBACK (pattern_hadj_changed), darea);
614 g_object_set_data (G_OBJECT (hadjustment), "old-value", ¤t_x);
616 vadjustment = gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
617 g_signal_connect (vadjustment, "value_changed",
618 G_CALLBACK (pattern_vadj_changed), darea);
619 g_object_set_data (G_OBJECT (vadjustment), "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, hadjustment);
634 gtk_table_attach (GTK_TABLE (table), scrollbar,
636 GTK_FILL | GTK_EXPAND, GTK_FILL,
639 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, vadjustment);
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 ();
1452 icon = new_pixbuf ("test.xpm", gtk_widget_get_window (window));
1453 toolitem = gtk_tool_button_new (icon, make_toolbar_items[i].label);
1454 gtk_tool_item_set_tooltip_text (toolitem, make_toolbar_items[i].tooltip);
1455 if (make_toolbar_items[i].callback != NULL)
1456 g_signal_connect (toolitem, "clicked", make_toolbar_items[i].callback, toolbar);
1458 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1468 static guint statusbar_counter = 1;
1471 statusbar_push (GtkWidget *button,
1472 GtkStatusbar *statusbar)
1476 sprintf (text, "something %d", statusbar_counter++);
1478 gtk_statusbar_push (statusbar, 1, text);
1482 statusbar_push_long (GtkWidget *button,
1483 GtkStatusbar *statusbar)
1487 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\").");
1489 gtk_statusbar_push (statusbar, 1, text);
1493 statusbar_pop (GtkWidget *button,
1494 GtkStatusbar *statusbar)
1496 gtk_statusbar_pop (statusbar, 1);
1500 statusbar_steal (GtkWidget *button,
1501 GtkStatusbar *statusbar)
1503 gtk_statusbar_remove (statusbar, 1, 4);
1507 statusbar_popped (GtkStatusbar *statusbar,
1512 statusbar_counter = 1;
1516 statusbar_contexts (GtkStatusbar *statusbar)
1520 string = "any context";
1521 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1523 gtk_statusbar_get_context_id (statusbar, string));
1525 string = "idle messages";
1526 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1528 gtk_statusbar_get_context_id (statusbar, string));
1530 string = "some text";
1531 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1533 gtk_statusbar_get_context_id (statusbar, string));
1535 string = "hit the mouse";
1536 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1538 gtk_statusbar_get_context_id (statusbar, string));
1540 string = "hit the mouse2";
1541 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1543 gtk_statusbar_get_context_id (statusbar, string));
1547 create_statusbar (GtkWidget *widget)
1549 static GtkWidget *window = NULL;
1553 GtkWidget *separator;
1554 GtkWidget *statusbar;
1558 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1559 gtk_window_set_screen (GTK_WINDOW (window),
1560 gtk_widget_get_screen (widget));
1562 g_signal_connect (window, "destroy",
1563 G_CALLBACK (gtk_widget_destroyed),
1566 gtk_window_set_title (GTK_WINDOW (window), "statusbar");
1567 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1569 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1570 gtk_container_add (GTK_CONTAINER (window), box1);
1572 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1573 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1574 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1576 statusbar = gtk_statusbar_new ();
1577 gtk_box_pack_end (GTK_BOX (box1), statusbar, TRUE, TRUE, 0);
1578 g_signal_connect (statusbar,
1580 G_CALLBACK (statusbar_popped),
1583 button = g_object_new (gtk_button_get_type (),
1584 "label", "push something",
1588 g_object_connect (button,
1589 "signal::clicked", statusbar_push, statusbar,
1592 button = g_object_connect (g_object_new (gtk_button_get_type (),
1597 "signal_after::clicked", statusbar_pop, statusbar,
1600 button = g_object_connect (g_object_new (gtk_button_get_type (),
1601 "label", "steal #4",
1605 "signal_after::clicked", statusbar_steal, statusbar,
1608 button = g_object_connect (g_object_new (gtk_button_get_type (),
1609 "label", "test contexts",
1613 "swapped_signal_after::clicked", statusbar_contexts, statusbar,
1616 button = g_object_connect (g_object_new (gtk_button_get_type (),
1617 "label", "push something long",
1621 "signal_after::clicked", statusbar_push_long, statusbar,
1624 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1625 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1627 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1628 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1629 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
1631 button = gtk_button_new_with_label ("close");
1632 g_signal_connect_swapped (button, "clicked",
1633 G_CALLBACK (gtk_widget_destroy),
1635 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1636 gtk_widget_set_can_default (button, TRUE);
1637 gtk_widget_grab_default (button);
1640 if (!gtk_widget_get_visible (window))
1641 gtk_widget_show_all (window);
1643 gtk_widget_destroy (window);
1651 handle_box_child_signal (GtkHandleBox *hb,
1653 const gchar *action)
1655 printf ("%s: child <%s> %sed\n",
1656 g_type_name (G_OBJECT_TYPE (hb)),
1657 g_type_name (G_OBJECT_TYPE (child)),
1662 create_handle_box (GtkWidget *widget)
1664 static GtkWidget* window = NULL;
1665 GtkWidget *handle_box;
1666 GtkWidget *handle_box2;
1671 GtkWidget *separator;
1675 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1677 gtk_window_set_screen (GTK_WINDOW (window),
1678 gtk_widget_get_screen (widget));
1679 gtk_window_set_modal (GTK_WINDOW (window), FALSE);
1680 gtk_window_set_title (GTK_WINDOW (window),
1682 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
1684 g_signal_connect (window, "destroy",
1685 G_CALLBACK (gtk_widget_destroyed),
1688 gtk_container_set_border_width (GTK_CONTAINER (window), 20);
1690 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1691 gtk_container_add (GTK_CONTAINER (window), vbox);
1692 gtk_widget_show (vbox);
1694 label = gtk_label_new ("Above");
1695 gtk_container_add (GTK_CONTAINER (vbox), label);
1696 gtk_widget_show (label);
1698 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1699 gtk_container_add (GTK_CONTAINER (vbox), separator);
1700 gtk_widget_show (separator);
1702 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
1703 gtk_container_add (GTK_CONTAINER (vbox), hbox);
1704 gtk_widget_show (hbox);
1706 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1707 gtk_container_add (GTK_CONTAINER (vbox), separator);
1708 gtk_widget_show (separator);
1710 label = gtk_label_new ("Below");
1711 gtk_container_add (GTK_CONTAINER (vbox), label);
1712 gtk_widget_show (label);
1714 handle_box = gtk_handle_box_new ();
1715 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1716 g_signal_connect (handle_box,
1718 G_CALLBACK (handle_box_child_signal),
1720 g_signal_connect (handle_box,
1722 G_CALLBACK (handle_box_child_signal),
1724 gtk_widget_show (handle_box);
1726 toolbar = make_toolbar (window);
1728 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
1729 gtk_widget_show (toolbar);
1731 handle_box = gtk_handle_box_new ();
1732 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1733 g_signal_connect (handle_box,
1735 G_CALLBACK (handle_box_child_signal),
1737 g_signal_connect (handle_box,
1739 G_CALLBACK (handle_box_child_signal),
1741 gtk_widget_show (handle_box);
1743 handle_box2 = gtk_handle_box_new ();
1744 gtk_container_add (GTK_CONTAINER (handle_box), handle_box2);
1745 g_signal_connect (handle_box2,
1747 G_CALLBACK (handle_box_child_signal),
1749 g_signal_connect (handle_box2,
1751 G_CALLBACK (handle_box_child_signal),
1753 gtk_widget_show (handle_box2);
1755 hbox = g_object_new (GTK_TYPE_BOX, "visible", 1, "parent", handle_box2, NULL);
1756 label = gtk_label_new ("Fooo!");
1757 gtk_container_add (GTK_CONTAINER (hbox), label);
1758 gtk_widget_show (label);
1759 g_object_new (GTK_TYPE_ARROW, "visible", 1, "parent", hbox, NULL);
1762 if (!gtk_widget_get_visible (window))
1763 gtk_widget_show (window);
1765 gtk_widget_destroy (window);
1772 sensitivity_toggled (GtkWidget *toggle,
1775 gtk_widget_set_sensitive (widget,
1776 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle)));
1780 create_sensitivity_control (GtkWidget *widget)
1784 button = gtk_toggle_button_new_with_label ("Sensitive");
1786 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
1787 gtk_widget_is_sensitive (widget));
1789 g_signal_connect (button,
1791 G_CALLBACK (sensitivity_toggled),
1794 gtk_widget_show_all (button);
1800 set_selectable_recursive (GtkWidget *widget,
1803 if (GTK_IS_CONTAINER (widget))
1808 children = gtk_container_get_children (GTK_CONTAINER (widget));
1812 set_selectable_recursive (tmp->data, setting);
1816 g_list_free (children);
1818 else if (GTK_IS_LABEL (widget))
1820 gtk_label_set_selectable (GTK_LABEL (widget), setting);
1825 selectable_toggled (GtkWidget *toggle,
1828 set_selectable_recursive (widget,
1829 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle)));
1833 create_selectable_control (GtkWidget *widget)
1837 button = gtk_toggle_button_new_with_label ("Selectable");
1839 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
1842 g_signal_connect (button,
1844 G_CALLBACK (selectable_toggled),
1847 gtk_widget_show_all (button);
1853 dialog_response (GtkWidget *dialog, gint response_id, GtkLabel *label)
1857 gtk_widget_destroy (dialog);
1859 text = "Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
1860 "as hyperlinks, which can be clicked\n"
1861 "or activated via <a href=\"keynav\">keynav</a>.\n"
1862 "The links remain the same.";
1863 gtk_label_set_markup (label, text);
1867 activate_link (GtkWidget *label, const gchar *uri, gpointer data)
1869 if (g_strcmp0 (uri, "keynav") == 0)
1873 dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (gtk_widget_get_toplevel (label)),
1874 GTK_DIALOG_DESTROY_WITH_PARENT,
1877 "The term <i>keynav</i> is a shorthand for "
1878 "keyboard navigation and refers to the process of using a program "
1879 "(exclusively) via keyboard input.");
1881 gtk_window_present (GTK_WINDOW (dialog));
1883 g_signal_connect (dialog, "response", G_CALLBACK (dialog_response), label);
1891 void create_labels (GtkWidget *widget)
1893 static GtkWidget *window = NULL;
1902 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1904 gtk_window_set_screen (GTK_WINDOW (window),
1905 gtk_widget_get_screen (widget));
1907 g_signal_connect (window, "destroy",
1908 G_CALLBACK (gtk_widget_destroyed),
1911 gtk_window_set_title (GTK_WINDOW (window), "Label");
1913 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1915 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
1916 gtk_container_add (GTK_CONTAINER (window), vbox);
1918 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
1920 button = create_sensitivity_control (hbox);
1922 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
1924 button = create_selectable_control (hbox);
1926 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
1928 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1930 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
1931 gtk_container_set_border_width (GTK_CONTAINER (window), 5);
1933 frame = gtk_frame_new ("Normal Label");
1934 label = gtk_label_new ("This is a Normal label");
1935 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
1936 gtk_container_add (GTK_CONTAINER (frame), label);
1937 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1939 frame = gtk_frame_new ("Multi-line Label");
1940 label = gtk_label_new ("This is a Multi-line label.\nSecond line\nThird line");
1941 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
1942 gtk_container_add (GTK_CONTAINER (frame), label);
1943 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1945 frame = gtk_frame_new ("Left Justified Label");
1946 label = gtk_label_new ("This is a Left-Justified\nMulti-line label.\nThird line");
1947 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_MIDDLE);
1948 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1949 gtk_container_add (GTK_CONTAINER (frame), label);
1950 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1952 frame = gtk_frame_new ("Right Justified Label");
1953 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
1954 label = gtk_label_new ("This is a Right-Justified\nMulti-line label.\nFourth line, (j/k)");
1955 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1956 gtk_container_add (GTK_CONTAINER (frame), label);
1957 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1959 frame = gtk_frame_new ("Internationalized Label");
1960 label = gtk_label_new (NULL);
1961 gtk_label_set_markup (GTK_LABEL (label),
1962 "French (Fran\303\247ais) Bonjour, Salut\n"
1963 "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"
1964 "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"
1965 "Chinese (Simplified) <span lang=\"zh-cn\">\345\205\203\346\260\224 \345\274\200\345\217\221</span>\n"
1966 "Chinese (Traditional) <span lang=\"zh-tw\">\345\205\203\346\260\243 \351\226\213\347\231\274</span>\n"
1967 "Japanese <span lang=\"ja\">\345\205\203\346\260\227 \351\226\213\347\231\272</span>");
1968 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1969 gtk_container_add (GTK_CONTAINER (frame), label);
1970 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1972 frame = gtk_frame_new ("Bidirection Label");
1973 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"
1974 "\342\200\217Hebrew \327\251\327\234\327\225\327\235");
1975 gtk_container_add (GTK_CONTAINER (frame), label);
1976 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1978 frame = gtk_frame_new ("Links in a label");
1979 label = gtk_label_new ("Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
1980 "as hyperlinks, which can be clicked\n"
1981 "or activated via <a href=\"keynav\">keynav</a>");
1982 gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
1983 gtk_container_add (GTK_CONTAINER (frame), label);
1984 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1985 g_signal_connect (label, "activate-link", G_CALLBACK (activate_link), NULL);
1987 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1988 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
1989 frame = gtk_frame_new ("Line wrapped label");
1990 label = gtk_label_new ("This is an example of a line-wrapped label. It should not be taking "\
1991 "up the entire "/* big space to test spacing */\
1992 "width allocated to it, but automatically wraps the words to fit. "\
1993 "The time has come, for all good men, to come to the aid of their party. "\
1994 "The sixth sheik's six sheep's sick.\n"\
1995 " It supports multiple paragraphs correctly, and correctly adds "\
1996 "many extra spaces. ");
1998 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
1999 gtk_container_add (GTK_CONTAINER (frame), label);
2000 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2002 frame = gtk_frame_new ("Filled, wrapped label");
2003 label = gtk_label_new ("This is an example of a line-wrapped, filled label. It should be taking "\
2004 "up the entire width allocated to it. Here is a seneance to prove "\
2005 "my point. Here is another sentence. "\
2006 "Here comes the sun, do de do de do.\n"\
2007 " This is a new paragraph.\n"\
2008 " This is another newer, longer, better paragraph. It is coming to an end, "\
2010 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_FILL);
2011 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2012 gtk_container_add (GTK_CONTAINER (frame), label);
2013 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2015 frame = gtk_frame_new ("Underlined label");
2016 label = gtk_label_new ("This label is underlined!\n"
2017 "This one is underlined (\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257) in quite a funky fashion");
2018 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2019 gtk_label_set_pattern (GTK_LABEL (label), "_________________________ _ _________ _ _____ _ __ __ ___ ____ _____");
2020 gtk_container_add (GTK_CONTAINER (frame), label);
2021 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2023 frame = gtk_frame_new ("Markup label");
2024 label = gtk_label_new (NULL);
2026 /* There's also a gtk_label_set_markup() without accel if you
2027 * don't have an accelerator key
2029 gtk_label_set_markup_with_mnemonic (GTK_LABEL (label),
2030 "This <span foreground=\"blue\" background=\"orange\">label</span> has "
2031 "<b>markup</b> _such as "
2032 "<big><i>Big Italics</i></big>\n"
2033 "<tt>Monospace font</tt>\n"
2034 "<u>Underline!</u>\n"
2036 "<span foreground=\"green\" background=\"red\">Ugly colors</span>\n"
2037 "and nothing on this line,\n"
2040 "or even on this one\n"
2041 "la <big>la <big>la <big>la <big>la</big></big></big></big>\n"
2042 "but this _word is <span foreground=\"purple\"><big>purple</big></span>\n"
2043 "<span underline=\"double\">We like <sup>superscript</sup> and <sub>subscript</sub> too</span>");
2045 g_assert (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)) == GDK_KEY_s);
2047 gtk_container_add (GTK_CONTAINER (frame), label);
2048 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2051 if (!gtk_widget_get_visible (window))
2052 gtk_widget_show_all (window);
2054 gtk_widget_destroy (window);
2058 on_angle_scale_changed (GtkRange *range,
2061 gtk_label_set_angle (GTK_LABEL (label), gtk_range_get_value (range));
2065 create_rotated_label (GtkWidget *widget)
2067 static GtkWidget *window = NULL;
2068 GtkWidget *content_area;
2072 GtkWidget *scale_label;
2073 GtkWidget *scale_hbox;
2077 window = gtk_dialog_new_with_buttons ("Rotated Label",
2078 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2079 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2082 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2084 gtk_window_set_screen (GTK_WINDOW (window),
2085 gtk_widget_get_screen (widget));
2087 g_signal_connect (window, "response",
2088 G_CALLBACK (gtk_widget_destroy), NULL);
2089 g_signal_connect (window, "destroy",
2090 G_CALLBACK (gtk_widget_destroyed), &window);
2092 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2094 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2095 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
2096 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
2098 label = gtk_label_new (NULL);
2099 gtk_label_set_markup (GTK_LABEL (label), "Hello World\n<i>Rotate</i> <span underline='single' foreground='blue'>me</span>");
2100 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
2102 scale_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2103 gtk_box_pack_start (GTK_BOX (vbox), scale_hbox, FALSE, FALSE, 0);
2105 scale_label = gtk_label_new (NULL);
2106 gtk_label_set_markup (GTK_LABEL (scale_label), "<i>Angle: </i>");
2107 gtk_box_pack_start (GTK_BOX (scale_hbox), scale_label, FALSE, FALSE, 0);
2109 hscale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL,
2111 g_signal_connect (hscale, "value-changed",
2112 G_CALLBACK (on_angle_scale_changed), label);
2114 gtk_range_set_value (GTK_RANGE (hscale), 45);
2115 gtk_widget_set_size_request (hscale, 200, -1);
2116 gtk_box_pack_start (GTK_BOX (scale_hbox), hscale, TRUE, TRUE, 0);
2119 if (!gtk_widget_get_visible (window))
2120 gtk_widget_show_all (window);
2122 gtk_widget_destroy (window);
2125 #define DEFAULT_TEXT_RADIUS 200
2128 on_rotated_text_unrealize (GtkWidget *widget)
2130 g_object_set_data (G_OBJECT (widget), "text-gc", NULL);
2134 on_rotated_text_draw (GtkWidget *widget,
2136 GdkPixbuf *tile_pixbuf)
2138 static const gchar *words[] = { "The", "grand", "old", "Duke", "of", "York",
2139 "had", "10,000", "men" };
2144 PangoLayout *layout;
2145 PangoContext *context;
2146 PangoFontDescription *desc;
2150 gdk_cairo_set_source_pixbuf (cr, tile_pixbuf, 0, 0);
2151 cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT);
2154 cairo_set_source_rgb (cr, 0, 0, 0);
2156 width = gtk_widget_get_allocated_width (widget);
2157 height = gtk_widget_get_allocated_height (widget);
2158 radius = MIN (width, height) / 2.;
2160 cairo_translate (cr,
2161 radius + (width - 2 * radius) / 2,
2162 radius + (height - 2 * radius) / 2);
2163 cairo_scale (cr, radius / DEFAULT_TEXT_RADIUS, radius / DEFAULT_TEXT_RADIUS);
2165 context = gtk_widget_get_pango_context (widget);
2166 layout = pango_layout_new (context);
2167 desc = pango_font_description_from_string ("Sans Bold 30");
2168 pango_layout_set_font_description (layout, desc);
2169 pango_font_description_free (desc);
2171 n_words = G_N_ELEMENTS (words);
2172 for (i = 0; i < n_words; i++)
2178 cairo_rotate (cr, 2 * G_PI * i / n_words);
2179 pango_cairo_update_layout (cr, layout);
2181 pango_layout_set_text (layout, words[i], -1);
2182 pango_layout_get_size (layout, &width, &height);
2184 cairo_move_to (cr, - width / 2 / PANGO_SCALE, - DEFAULT_TEXT_RADIUS);
2185 pango_cairo_show_layout (cr, layout);
2190 g_object_unref (layout);
2196 create_rotated_text (GtkWidget *widget)
2198 static GtkWidget *window = NULL;
2202 const GdkRGBA white = { 1.0, 1.0, 1.0, 1.0 };
2203 GtkRequisition requisition;
2204 GtkWidget *content_area;
2205 GtkWidget *drawing_area;
2206 GdkPixbuf *tile_pixbuf;
2208 window = gtk_dialog_new_with_buttons ("Rotated Text",
2209 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2210 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2213 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2215 gtk_window_set_screen (GTK_WINDOW (window),
2216 gtk_widget_get_screen (widget));
2218 g_signal_connect (window, "response",
2219 G_CALLBACK (gtk_widget_destroy), NULL);
2220 g_signal_connect (window, "destroy",
2221 G_CALLBACK (gtk_widget_destroyed), &window);
2223 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2225 drawing_area = gtk_drawing_area_new ();
2226 gtk_box_pack_start (GTK_BOX (content_area), drawing_area, TRUE, TRUE, 0);
2227 gtk_widget_override_background_color (drawing_area, 0, &white);
2229 tile_pixbuf = gdk_pixbuf_new_from_file ("marble.xpm", NULL);
2231 g_signal_connect (drawing_area, "draw",
2232 G_CALLBACK (on_rotated_text_draw), tile_pixbuf);
2233 g_signal_connect (drawing_area, "unrealize",
2234 G_CALLBACK (on_rotated_text_unrealize), NULL);
2236 gtk_widget_show_all (gtk_bin_get_child (GTK_BIN (window)));
2238 gtk_widget_set_size_request (drawing_area, DEFAULT_TEXT_RADIUS * 2, DEFAULT_TEXT_RADIUS * 2);
2239 gtk_widget_get_preferred_size ( (window),
2240 &requisition, NULL);
2241 gtk_widget_set_size_request (drawing_area, -1, -1);
2242 gtk_window_resize (GTK_WINDOW (window), requisition.width, requisition.height);
2245 if (!gtk_widget_get_visible (window))
2246 gtk_widget_show (window);
2248 gtk_widget_destroy (window);
2256 reparent_label (GtkWidget *widget,
2257 GtkWidget *new_parent)
2261 label = g_object_get_data (G_OBJECT (widget), "user_data");
2263 gtk_widget_reparent (label, new_parent);
2267 set_parent_signal (GtkWidget *child,
2268 GtkWidget *old_parent,
2273 parent = gtk_widget_get_parent (child);
2274 g_message ("set_parent for \"%s\": new parent: \"%s\", old parent: \"%s\", data: %d\n",
2275 g_type_name (G_OBJECT_TYPE (child)),
2276 parent ? g_type_name (G_OBJECT_TYPE (parent)) : "NULL",
2277 old_parent ? g_type_name (G_OBJECT_TYPE (old_parent)) : "NULL",
2278 GPOINTER_TO_INT (func_data));
2282 create_reparent (GtkWidget *widget)
2284 static GtkWidget *window = NULL;
2291 GtkWidget *separator;
2292 GtkWidget *event_box;
2296 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2298 gtk_window_set_screen (GTK_WINDOW (window),
2299 gtk_widget_get_screen (widget));
2301 g_signal_connect (window, "destroy",
2302 G_CALLBACK (gtk_widget_destroyed),
2305 gtk_window_set_title (GTK_WINDOW (window), "reparent");
2306 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2308 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2309 gtk_container_add (GTK_CONTAINER (window), box1);
2311 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
2312 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2313 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2315 label = gtk_label_new ("Hello World");
2317 frame = gtk_frame_new ("Frame 1");
2318 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2320 box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2321 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2322 gtk_container_add (GTK_CONTAINER (frame), box3);
2324 button = gtk_button_new_with_label ("switch");
2325 g_object_set_data (G_OBJECT (button), "user_data", label);
2326 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2328 event_box = gtk_event_box_new ();
2329 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2330 gtk_container_add (GTK_CONTAINER (event_box), label);
2332 g_signal_connect (button, "clicked",
2333 G_CALLBACK (reparent_label),
2336 g_signal_connect (label, "parent_set",
2337 G_CALLBACK (set_parent_signal),
2338 GINT_TO_POINTER (42));
2340 frame = gtk_frame_new ("Frame 2");
2341 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2343 box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2344 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2345 gtk_container_add (GTK_CONTAINER (frame), box3);
2347 button = gtk_button_new_with_label ("switch");
2348 g_object_set_data (G_OBJECT (button), "user_data", label);
2349 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2351 event_box = gtk_event_box_new ();
2352 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2354 g_signal_connect (button, "clicked",
2355 G_CALLBACK (reparent_label),
2358 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2359 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2361 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2362 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2363 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2365 button = gtk_button_new_with_label ("close");
2366 g_signal_connect_swapped (button, "clicked",
2367 G_CALLBACK (gtk_widget_destroy), window);
2368 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2369 gtk_widget_set_can_default (button, TRUE);
2370 gtk_widget_grab_default (button);
2373 if (!gtk_widget_get_visible (window))
2374 gtk_widget_show_all (window);
2376 gtk_widget_destroy (window);
2383 grippy_button_press (GtkWidget *area, GdkEventButton *event, GdkWindowEdge edge)
2385 if (event->type == GDK_BUTTON_PRESS)
2387 if (event->button == 1)
2388 gtk_window_begin_resize_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)), edge,
2389 event->button, event->x_root, event->y_root,
2391 else if (event->button == 2)
2392 gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)),
2393 event->button, event->x_root, event->y_root,
2400 grippy_draw (GtkWidget *area, cairo_t *cr, GdkWindowEdge edge)
2402 GtkStyleContext *context;
2403 GtkJunctionSides sides;
2407 case GDK_WINDOW_EDGE_NORTH_WEST:
2408 sides = GTK_JUNCTION_CORNER_TOPLEFT;
2410 case GDK_WINDOW_EDGE_NORTH:
2411 sides = GTK_JUNCTION_TOP;
2413 case GDK_WINDOW_EDGE_NORTH_EAST:
2414 sides = GTK_JUNCTION_CORNER_TOPRIGHT;
2416 case GDK_WINDOW_EDGE_WEST:
2417 sides = GTK_JUNCTION_LEFT;
2419 case GDK_WINDOW_EDGE_EAST:
2420 sides = GTK_JUNCTION_RIGHT;
2422 case GDK_WINDOW_EDGE_SOUTH_WEST:
2423 sides = GTK_JUNCTION_CORNER_BOTTOMLEFT;
2425 case GDK_WINDOW_EDGE_SOUTH:
2426 sides = GTK_JUNCTION_BOTTOM;
2428 case GDK_WINDOW_EDGE_SOUTH_EAST:
2429 sides = GTK_JUNCTION_CORNER_BOTTOMRIGHT;
2432 g_assert_not_reached();
2435 context = gtk_widget_get_style_context (area);
2436 gtk_style_context_save (context);
2437 gtk_style_context_add_class (context, "grip");
2438 gtk_style_context_set_junction_sides (context, sides);
2439 gtk_render_handle (context, cr,
2441 gtk_widget_get_allocated_width (area),
2442 gtk_widget_get_allocated_height (area));
2444 gtk_style_context_restore (context);
2450 create_resize_grips (GtkWidget *widget)
2452 static GtkWidget *window = NULL;
2454 GtkWidget *hbox, *vbox;
2457 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2459 gtk_window_set_screen (GTK_WINDOW (window),
2460 gtk_widget_get_screen (widget));
2462 gtk_window_set_title (GTK_WINDOW (window), "resize grips");
2464 g_signal_connect (window, "destroy",
2465 G_CALLBACK (gtk_widget_destroyed),
2468 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2469 gtk_container_add (GTK_CONTAINER (window), vbox);
2471 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2472 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2475 area = gtk_drawing_area_new ();
2476 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2477 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2478 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2479 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2480 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2481 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2484 area = gtk_drawing_area_new ();
2485 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2486 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2487 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2488 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2489 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2490 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2493 area = gtk_drawing_area_new ();
2494 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2495 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2496 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2497 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2498 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2499 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2501 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2502 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2505 area = gtk_drawing_area_new ();
2506 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2507 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2508 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2509 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2510 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2511 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2514 area = gtk_drawing_area_new ();
2515 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2518 area = gtk_drawing_area_new ();
2519 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2520 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2521 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2522 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2523 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2524 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2527 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2528 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2531 area = gtk_drawing_area_new ();
2532 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2533 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2534 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2535 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2536 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2537 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2539 area = gtk_drawing_area_new ();
2540 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2541 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2542 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2543 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2544 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2545 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2548 area = gtk_drawing_area_new ();
2549 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2550 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2551 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2552 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2553 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2554 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2557 if (!gtk_widget_get_visible (window))
2558 gtk_widget_show_all (window);
2560 gtk_widget_destroy (window);
2566 gint upositionx = 0;
2567 gint upositiony = 0;
2570 uposition_configure (GtkWidget *window)
2576 lx = g_object_get_data (G_OBJECT (window), "x");
2577 ly = g_object_get_data (G_OBJECT (window), "y");
2579 gdk_window_get_root_origin (gtk_widget_get_window (window),
2580 &upositionx, &upositiony);
2581 sprintf (buffer, "%d", upositionx);
2582 gtk_label_set_text (lx, buffer);
2583 sprintf (buffer, "%d", upositiony);
2584 gtk_label_set_text (ly, buffer);
2590 uposition_stop_configure (GtkToggleButton *toggle,
2593 if (gtk_toggle_button_get_active (toggle))
2594 g_signal_handlers_block_by_func (window, G_CALLBACK (uposition_configure), NULL);
2596 g_signal_handlers_unblock_by_func (window, G_CALLBACK (uposition_configure), NULL);
2600 create_saved_position (GtkWidget *widget)
2602 static GtkWidget *window = NULL;
2607 GtkWidget *main_vbox;
2615 window = g_object_connect (g_object_new (GTK_TYPE_WINDOW,
2616 "type", GTK_WINDOW_TOPLEVEL,
2617 "title", "Saved Position",
2619 "signal::configure_event", uposition_configure, NULL,
2622 gtk_window_move (GTK_WINDOW (window), upositionx, upositiony);
2624 gtk_window_set_screen (GTK_WINDOW (window),
2625 gtk_widget_get_screen (widget));
2628 g_signal_connect (window, "destroy",
2629 G_CALLBACK (gtk_widget_destroyed),
2632 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2633 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
2634 gtk_container_add (GTK_CONTAINER (window), main_vbox);
2637 g_object_new (GTK_TYPE_BOX,
2638 "orientation", GTK_ORIENTATION_VERTICAL,
2639 "GtkBox::homogeneous", FALSE,
2640 "GtkBox::spacing", 5,
2641 "GtkContainer::border_width", 10,
2642 "GtkWidget::parent", main_vbox,
2643 "GtkWidget::visible", TRUE,
2644 "child", g_object_connect (g_object_new (GTK_TYPE_TOGGLE_BUTTON,
2645 "label", "Stop Events",
2649 "signal::clicked", uposition_stop_configure, window,
2653 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2654 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2655 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2657 label = gtk_label_new ("X Origin : ");
2658 gtk_widget_set_halign (label, GTK_ALIGN_START);
2659 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
2660 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
2662 x_label = gtk_label_new ("");
2663 gtk_box_pack_start (GTK_BOX (hbox), x_label, TRUE, TRUE, 0);
2664 g_object_set_data (G_OBJECT (window), "x", x_label);
2666 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2667 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2668 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2670 label = gtk_label_new ("Y Origin : ");
2671 gtk_widget_set_halign (label, GTK_ALIGN_START);
2672 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
2673 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
2675 y_label = gtk_label_new ("");
2676 gtk_box_pack_start (GTK_BOX (hbox), y_label, TRUE, TRUE, 0);
2677 g_object_set_data (G_OBJECT (window), "y", y_label);
2680 g_object_new (gtk_separator_get_type (),
2681 "GtkWidget::visible", TRUE,
2683 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
2685 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2686 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
2687 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
2689 button = gtk_button_new_with_label ("Close");
2690 g_signal_connect_swapped (button, "clicked",
2691 G_CALLBACK (gtk_widget_destroy),
2693 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
2694 gtk_widget_set_can_default (button, TRUE);
2695 gtk_widget_grab_default (button);
2697 gtk_widget_show_all (window);
2700 gtk_widget_destroy (window);
2708 create_pixbuf (GtkWidget *widget)
2710 static GtkWidget *window = NULL;
2716 GtkWidget *separator;
2717 GtkWidget *pixbufwid;
2718 GdkWindow *gdk_window;
2722 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2724 gtk_window_set_screen (GTK_WINDOW (window),
2725 gtk_widget_get_screen (widget));
2727 g_signal_connect (window, "destroy",
2728 G_CALLBACK (gtk_widget_destroyed),
2731 gtk_window_set_title (GTK_WINDOW (window), "GtkPixmap");
2732 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2733 gtk_widget_realize(window);
2735 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2736 gtk_container_add (GTK_CONTAINER (window), box1);
2738 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2739 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2740 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2742 button = gtk_button_new ();
2743 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
2745 gdk_window = gtk_widget_get_window (window);
2747 pixbufwid = new_pixbuf ("test.xpm", gdk_window);
2749 label = gtk_label_new ("Pixbuf\ntest");
2750 box3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2751 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
2752 gtk_container_add (GTK_CONTAINER (box3), pixbufwid);
2753 gtk_container_add (GTK_CONTAINER (box3), label);
2754 gtk_container_add (GTK_CONTAINER (button), box3);
2756 button = gtk_button_new ();
2757 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
2759 pixbufwid = new_pixbuf ("test.xpm", gdk_window);
2761 label = gtk_label_new ("Pixbuf\ntest");
2762 box3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2763 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
2764 gtk_container_add (GTK_CONTAINER (box3), pixbufwid);
2765 gtk_container_add (GTK_CONTAINER (box3), label);
2766 gtk_container_add (GTK_CONTAINER (button), box3);
2768 gtk_widget_set_sensitive (button, FALSE);
2770 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2771 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2773 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2774 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2775 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2777 button = gtk_button_new_with_label ("close");
2778 g_signal_connect_swapped (button, "clicked",
2779 G_CALLBACK (gtk_widget_destroy),
2781 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2782 gtk_widget_set_can_default (button, TRUE);
2783 gtk_widget_grab_default (button);
2786 if (!gtk_widget_get_visible (window))
2787 gtk_widget_show_all (window);
2789 gtk_widget_destroy (window);
2793 create_tooltips (GtkWidget *widget)
2795 static GtkWidget *window = NULL;
2802 GtkWidget *separator;
2807 g_object_new (gtk_window_get_type (),
2808 "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
2809 "GtkContainer::border_width", 0,
2810 "GtkWindow::title", "Tooltips",
2811 "GtkWindow::resizable", FALSE,
2814 gtk_window_set_screen (GTK_WINDOW (window),
2815 gtk_widget_get_screen (widget));
2817 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2818 gtk_container_add (GTK_CONTAINER (window), box1);
2820 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2821 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2822 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2824 button = gtk_toggle_button_new_with_label ("button1");
2825 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2827 gtk_widget_set_tooltip_text (button, "This is button 1");
2829 button = gtk_toggle_button_new_with_label ("button2");
2830 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2832 gtk_widget_set_tooltip_text (button,
2833 "This is button 2. This is also a really long tooltip which probably "
2834 "won't fit on a single line and will therefore need to be wrapped. "
2835 "Hopefully the wrapping will work correctly.");
2837 toggle = gtk_toggle_button_new_with_label ("Override TipsQuery Label");
2838 gtk_box_pack_start (GTK_BOX (box2), toggle, TRUE, TRUE, 0);
2840 gtk_widget_set_tooltip_text (toggle, "Toggle TipsQuery view.");
2843 g_object_new (GTK_TYPE_BOX,
2844 "orientation", GTK_ORIENTATION_VERTICAL,
2845 "homogeneous", FALSE,
2852 g_object_new (gtk_button_get_type (),
2857 gtk_box_set_child_packing (GTK_BOX (box3), button, FALSE, FALSE, 0, GTK_PACK_START);
2858 gtk_widget_set_tooltip_text (button, "Start the Tooltips Inspector");
2860 frame = g_object_new (gtk_frame_get_type (),
2861 "label", "ToolTips Inspector",
2862 "label_xalign", (double) 0.5,
2868 gtk_box_set_child_packing (GTK_BOX (box2), frame, TRUE, TRUE, 10, GTK_PACK_START);
2870 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2871 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2873 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2874 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2875 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2877 button = gtk_button_new_with_label ("close");
2878 g_signal_connect_swapped (button, "clicked",
2879 G_CALLBACK (gtk_widget_destroy),
2881 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2882 gtk_widget_set_can_default (button, TRUE);
2883 gtk_widget_grab_default (button);
2885 gtk_widget_set_tooltip_text (button, "Push this button to close window");
2888 if (!gtk_widget_get_visible (window))
2889 gtk_widget_show_all (window);
2891 gtk_widget_destroy (window);
2899 pack_image (GtkWidget *box,
2903 gtk_box_pack_start (GTK_BOX (box),
2904 gtk_label_new (text),
2907 gtk_box_pack_start (GTK_BOX (box),
2913 create_image (GtkWidget *widget)
2915 static GtkWidget *window = NULL;
2922 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2924 gtk_window_set_screen (GTK_WINDOW (window),
2925 gtk_widget_get_screen (widget));
2927 /* this is bogus for testing drawing when allocation < request,
2928 * don't copy into real code
2930 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2932 g_signal_connect (window, "destroy",
2933 G_CALLBACK (gtk_widget_destroyed),
2936 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2938 gtk_container_add (GTK_CONTAINER (window), vbox);
2940 pack_image (vbox, "Stock Warning Dialog",
2941 gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
2942 GTK_ICON_SIZE_DIALOG));
2944 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
2946 pack_image (vbox, "Pixbuf",
2947 gtk_image_new_from_pixbuf (pixbuf));
2949 g_object_unref (pixbuf);
2952 if (!gtk_widget_get_visible (window))
2953 gtk_widget_show_all (window);
2955 gtk_widget_destroy (window);
2963 create_menu (GdkScreen *screen, gint depth, gint length, gboolean tearoff)
2966 GtkWidget *menuitem;
2975 menu = gtk_menu_new ();
2976 gtk_menu_set_screen (GTK_MENU (menu), screen);
2982 menuitem = gtk_tearoff_menu_item_new ();
2983 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2984 gtk_widget_show (menuitem);
2987 image = gtk_image_new_from_stock (GTK_STOCK_OPEN,
2988 GTK_ICON_SIZE_MENU);
2989 gtk_widget_show (image);
2990 menuitem = gtk_image_menu_item_new_with_label ("Image item");
2991 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
2992 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2993 gtk_widget_show (menuitem);
2995 for (i = 0, j = 1; i < length; i++, j++)
2997 sprintf (buf, "item %2d - %d", depth, j);
2999 menuitem = gtk_radio_menu_item_new_with_label (group, buf);
3000 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
3002 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3003 gtk_widget_show (menuitem);
3005 gtk_widget_set_sensitive (menuitem, FALSE);
3008 gtk_check_menu_item_set_inconsistent (GTK_CHECK_MENU_ITEM (menuitem),
3012 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem),
3013 create_menu (screen, depth - 1, 5, TRUE));
3020 create_table_menu (GdkScreen *screen, gint cols, gint rows, gboolean tearoff)
3023 GtkWidget *menuitem;
3029 menu = gtk_menu_new ();
3030 gtk_menu_set_screen (GTK_MENU (menu), screen);
3035 menuitem = gtk_tearoff_menu_item_new ();
3036 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3037 gtk_widget_show (menuitem);
3041 menuitem = gtk_menu_item_new_with_label ("items");
3042 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3044 submenu = gtk_menu_new ();
3045 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3046 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3047 gtk_widget_show (menuitem);
3050 /* now fill the items submenu */
3051 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3052 GTK_ICON_SIZE_MENU);
3053 gtk_widget_show (image);
3054 menuitem = gtk_image_menu_item_new_with_label ("Image");
3055 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3056 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3057 gtk_widget_show (menuitem);
3059 menuitem = gtk_menu_item_new_with_label ("x");
3060 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 0, 1);
3061 gtk_widget_show (menuitem);
3063 menuitem = gtk_menu_item_new_with_label ("x");
3064 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 2);
3065 gtk_widget_show (menuitem);
3067 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3068 GTK_ICON_SIZE_MENU);
3069 gtk_widget_show (image);
3070 menuitem = gtk_image_menu_item_new_with_label ("Image");
3071 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3072 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3073 gtk_widget_show (menuitem);
3075 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3076 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 2, 3);
3077 gtk_widget_show (menuitem);
3079 menuitem = gtk_menu_item_new_with_label ("x");
3080 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 2, 3);
3081 gtk_widget_show (menuitem);
3083 menuitem = gtk_menu_item_new_with_label ("x");
3084 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 3, 4);
3085 gtk_widget_show (menuitem);
3087 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3088 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 3, 4);
3089 gtk_widget_show (menuitem);
3091 menuitem = gtk_check_menu_item_new_with_label ("Check");
3092 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 4, 5);
3093 gtk_widget_show (menuitem);
3095 menuitem = gtk_menu_item_new_with_label ("x");
3096 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 4, 5);
3097 gtk_widget_show (menuitem);
3099 menuitem = gtk_menu_item_new_with_label ("x");
3100 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 5, 6);
3101 gtk_widget_show (menuitem);
3103 menuitem = gtk_check_menu_item_new_with_label ("Check");
3104 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 5, 6);
3105 gtk_widget_show (menuitem);
3107 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3108 gtk_widget_show (menuitem);
3109 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 8);
3111 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3112 gtk_widget_show (menuitem);
3113 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 2);
3115 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3116 gtk_widget_show (menuitem);
3117 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 0);
3119 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3120 gtk_widget_show (menuitem);
3121 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, -1);
3123 /* end of items submenu */
3125 menuitem = gtk_menu_item_new_with_label ("spanning");
3126 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3128 submenu = gtk_menu_new ();
3129 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3130 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3131 gtk_widget_show (menuitem);
3134 /* now fill the spanning submenu */
3135 menuitem = gtk_menu_item_new_with_label ("a");
3136 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 2, 0, 1);
3137 gtk_widget_show (menuitem);
3139 menuitem = gtk_menu_item_new_with_label ("b");
3140 gtk_menu_attach (GTK_MENU (submenu), menuitem, 2, 3, 0, 2);
3141 gtk_widget_show (menuitem);
3143 menuitem = gtk_menu_item_new_with_label ("c");
3144 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 3);
3145 gtk_widget_show (menuitem);
3147 menuitem = gtk_menu_item_new_with_label ("d");
3148 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3149 gtk_widget_show (menuitem);
3151 menuitem = gtk_menu_item_new_with_label ("e");
3152 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 3, 2, 3);
3153 gtk_widget_show (menuitem);
3154 /* end of spanning submenu */
3156 menuitem = gtk_menu_item_new_with_label ("left");
3157 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, 1, j, j + 1);
3158 submenu = gtk_menu_new ();
3159 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3160 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3161 gtk_widget_show (menuitem);
3163 menuitem = gtk_menu_item_new_with_label ("Empty");
3164 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3165 submenu = gtk_menu_new ();
3166 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3167 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3168 gtk_widget_show (menuitem);
3170 menuitem = gtk_menu_item_new_with_label ("right");
3171 gtk_menu_attach (GTK_MENU (menu), menuitem, 1, 2, j, j + 1);
3172 submenu = gtk_menu_new ();
3173 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3174 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3175 gtk_widget_show (menuitem);
3177 menuitem = gtk_menu_item_new_with_label ("Empty");
3178 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3179 gtk_widget_show (menuitem);
3183 for (; j < rows; j++)
3184 for (i = 0; i < cols; i++)
3186 sprintf (buf, "(%d %d)", i, j);
3187 menuitem = gtk_menu_item_new_with_label (buf);
3188 gtk_menu_attach (GTK_MENU (menu), menuitem, i, i + 1, j, j + 1);
3189 gtk_widget_show (menuitem);
3192 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3193 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 8);
3194 gtk_widget_show (menuitem);
3195 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3196 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 2);
3197 gtk_widget_show (menuitem);
3198 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3199 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 0);
3200 gtk_widget_show (menuitem);
3201 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3202 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, -1);
3203 gtk_widget_show (menuitem);
3209 create_menus (GtkWidget *widget)
3211 static GtkWidget *window = NULL;
3215 GtkWidget *optionmenu;
3216 GtkWidget *separator;
3222 GtkWidget *menuitem;
3223 GtkAccelGroup *accel_group;
3225 GdkScreen *screen = gtk_widget_get_screen (widget);
3227 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3229 gtk_window_set_screen (GTK_WINDOW (window), screen);
3231 g_signal_connect (window, "destroy",
3232 G_CALLBACK (gtk_widget_destroyed),
3234 g_signal_connect (window, "delete-event",
3235 G_CALLBACK (gtk_true),
3238 accel_group = gtk_accel_group_new ();
3239 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3241 gtk_window_set_title (GTK_WINDOW (window), "menus");
3242 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3245 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
3246 gtk_container_add (GTK_CONTAINER (window), box1);
3247 gtk_widget_show (box1);
3249 menubar = gtk_menu_bar_new ();
3250 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3251 gtk_widget_show (menubar);
3253 menu = create_menu (screen, 2, 50, TRUE);
3255 menuitem = gtk_menu_item_new_with_label ("test\nline2");
3256 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3257 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3258 gtk_widget_show (menuitem);
3260 menu = create_table_menu (screen, 2, 50, TRUE);
3262 menuitem = gtk_menu_item_new_with_label ("table");
3263 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3264 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3265 gtk_widget_show (menuitem);
3267 menuitem = gtk_menu_item_new_with_label ("foo");
3268 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5, TRUE));
3269 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3270 gtk_widget_show (menuitem);
3272 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3273 GTK_ICON_SIZE_MENU);
3274 gtk_widget_show (image);
3275 menuitem = gtk_image_menu_item_new_with_label ("Help");
3276 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3277 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 4, 5, TRUE));
3278 gtk_widget_set_hexpand (menuitem, TRUE);
3279 gtk_widget_set_halign (menuitem, GTK_ALIGN_END);
3280 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3281 gtk_widget_show (menuitem);
3283 menubar = gtk_menu_bar_new ();
3284 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3285 gtk_widget_show (menubar);
3287 menu = create_menu (screen, 2, 10, TRUE);
3289 menuitem = gtk_menu_item_new_with_label ("Second menu bar");
3290 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3291 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3292 gtk_widget_show (menuitem);
3294 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3295 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3296 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3297 gtk_widget_show (box2);
3299 menu = create_menu (screen, 1, 5, FALSE);
3300 gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
3302 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
3303 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3304 gtk_widget_show (menuitem);
3306 menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
3307 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3308 gtk_widget_show (menuitem);
3309 gtk_widget_add_accelerator (menuitem,
3315 menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
3316 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3317 gtk_widget_show (menuitem);
3318 gtk_widget_add_accelerator (menuitem,
3323 GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3324 menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
3325 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3326 gtk_widget_show (menuitem);
3327 gtk_widget_add_accelerator (menuitem,
3333 gtk_widget_add_accelerator (menuitem,
3340 optionmenu = gtk_combo_box_text_new ();
3341 gtk_combo_box_set_active (GTK_COMBO_BOX (optionmenu), 3);
3342 gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
3343 gtk_widget_show (optionmenu);
3345 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
3346 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3347 gtk_widget_show (separator);
3349 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3350 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3351 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3352 gtk_widget_show (box2);
3354 button = gtk_button_new_with_label ("close");
3355 g_signal_connect_swapped (button, "clicked",
3356 G_CALLBACK (gtk_widget_destroy),
3358 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3359 gtk_widget_set_can_default (button, TRUE);
3360 gtk_widget_grab_default (button);
3361 gtk_widget_show (button);
3364 if (!gtk_widget_get_visible (window))
3365 gtk_widget_show (window);
3367 gtk_widget_destroy (window);
3370 /* GdkPixbuf RGBA C-Source image dump */
3372 static const guint8 apple[] =
3374 /* Pixbuf magic (0x47646b50) */
3376 /* length: header (24) + pixel_data (2304) */
3378 /* pixdata_type (0x1010002) */
3380 /* rowstride (96) */
3387 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3390 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3393 "\0\0\0\0\0\0\0\0\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"
3394 "\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"
3395 "\0\0\0\0\0\0\0\0\0\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"
3396 "[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"
3397 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3398 "\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"
3399 "\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"
3400 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3401 "\0\0\0\0\0\0`l\\\20iw_\356y\211h\373x\207g\364~\216i\364u\204e\366gt"
3402 "_\374^jX\241A;-_\0\0\0~\0\0\0\0SM4)SM21B9&\22\320\270\204\1\320\270\204"
3403 "\0\0\0\0\0\0\0\0\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"
3404 "]\212r\200c\366v\205f\371jx_\323_kY\232_kZH^jY\26]iW\211@G9\272:6%j\220"
3405 "\211]\320\221\211`\377\212\203Z\377~xP\377mkE\331]^;|/0\37\21\0\0\0\0"
3406 "\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["
3407 "eT<\216\200Z\203\227\211_\354\234\217c\377\232\217b\362\232\220c\337"
3408 "\243\233k\377\252\241p\377\250\236p\377\241\225h\377\231\214_\377\210"
3409 "\202U\377srI\377[]:\355KO0U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0i"
3410 "v^\200`lY\211^jY\"\0\0\0\0\221\204\\\273\250\233r\377\302\267\224\377"
3411 "\311\300\237\377\272\256\204\377\271\256\177\377\271\257\200\377\267"
3412 "\260\177\377\260\251x\377\250\236l\377\242\225e\377\226\213]\377~zP\377"
3413 "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"
3414 "\0\213\203[v\253\240t\377\334\326\301\377\344\340\317\377\321\312\253"
3415 "\377\303\271\217\377\300\270\213\377\277\267\210\377\272\264\203\377"
3416 "\261\255z\377\250\242n\377\243\232h\377\232\220`\377\210\202V\377nnE"
3417 "\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"
3418 "\234\222e\362\304\274\232\377\337\333\306\377\332\325\273\377\311\302"
3419 "\232\377\312\303\236\377\301\273\216\377\300\271\212\377\270\264\200"
3420 "\377\256\253v\377\246\243n\377\236\232h\377\230\220`\377\213\203V\377"
3421 "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"
3422 "\203Zl\242\234l\377\321\315\260\377\331\324\271\377\320\313\251\377\307"
3423 "\301\232\377\303\276\224\377\300\272\214\377\274\267\206\377\264\260"
3424 "|\377\253\251s\377\244\243n\377\232\230e\377\223\216^\377\207\200U\377"
3425 "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"
3426 "\210\204Y\240\245\237o\377\316\310\253\377\310\303\237\377\304\300\230"
3427 "\377\303\277\225\377\277\272\216\377\274\270\210\377\266\263\200\377"
3428 "\256\254v\377\247\246p\377\237\236j\377\227\226d\377\215\212[\377\203"
3429 "\177T\377qsH\377X]8\377FN.\377DK-\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3430 "\0\0\0\0\207\204X\257\244\240o\377\300\275\231\377\301\275\226\377\274"
3431 "\270\213\377\274\270\214\377\267\264\205\377\264\262\200\377\260\256"
3432 "z\377\251\251s\377\243\244n\377\231\232g\377\220\222`\377\210\211Y\377"
3433 "|}Q\377hlC\377PU3\377CK,\377DL/Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3434 "\0\0\205\204X\220\232\230h\377\261\260\204\377\266\264\212\377\261\260"
3435 "\201\377\263\260\200\377\260\257}\377\256\256x\377\253\254t\377\244\246"
3436 "o\377\233\236i\377\221\224b\377\211\214\\\377\202\204V\377txM\377]b>"
3437 "\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>"
3438 "\215\215_\377\237\237r\377\247\247x\377\247\247t\377\252\252w\377\252"
3439 "\252u\377\252\253t\377\243\246o\377\235\240j\377\223\230c\377\213\217"
3440 "]\377\201\206V\377x}P\377gkD\377RY5\377BI,\377AI,\262\0\0\0\0\0\0\0\0"
3441 "\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"
3442 "\232g\377\234\236i\377\236\241l\377\241\244n\377\240\244m\377\232\237"
3443 "i\377\223\230c\377\212\221]\377\200\210W\377v|P\377jnG\377Za>\377HP2"
3444 "\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"
3445 "\0wzQ6\177\201U\371\206\211Z\377\216\222`\377\220\225a\377\220\225b\377"
3446 "\220\226a\377\213\221_\377\204\213Z\377{\203R\377ryN\377iqH\377^fA\377"
3447 "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"
3448 "\0\0\0\0\0\0\0\0\0\0\0\0ptJTw|Q\371z\177R\377}\202T\377|\203T\377z\200"
3449 "R\377v|O\377pwL\377jpF\377dlB\377`hB\377Yb@\377LT6\377<C*\377\11\12\6"
3450 "\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"
3451 "\0\0\0\0\0\0\0\0\0\0\\`=UgnE\370hnG\377gmE\377djB\377]d>\377[c<\377Y"
3452 "b<\377Zc>\377V_>\377OW8\377BK/\377\16\20\12\377\0\0\0\377\0\0\0\377\0"
3453 "\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"
3454 "\0\1\0\0\0\40\22\24\15\260@D+\377W`;\377OV5\377.3\36\377.3\37\377IP0"
3455 "\377RZ7\377PZ8\3776=&\377\14\15\10\377\0\0\0\377\0\0\0\377\0\0\0\377"
3456 "\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"
3457 "\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"
3458 "\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"
3459 "\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"
3460 "\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"
3461 "\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"
3462 "\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"
3463 "\0\0\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"
3464 "\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"
3465 "\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
3469 accel_button_new (GtkAccelGroup *accel_group,
3474 GdkModifierType modifiers;
3478 gtk_accelerator_parse (accel, &keyval, &modifiers);
3481 button = gtk_button_new ();
3482 gtk_widget_add_accelerator (button, "activate", accel_group,
3483 keyval, modifiers, GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3485 label = gtk_accel_label_new (text);
3486 gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), button);
3487 gtk_widget_show (label);
3489 gtk_container_add (GTK_CONTAINER (button), label);
3495 create_key_lookup (GtkWidget *widget)
3497 static GtkWidget *window = NULL;
3498 gpointer window_ptr;
3502 GtkAccelGroup *accel_group = gtk_accel_group_new ();
3504 GtkWidget *content_area;
3506 window = gtk_dialog_new_with_buttons ("Key Lookup", NULL, 0,
3507 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
3510 gtk_window_set_screen (GTK_WINDOW (window),
3511 gtk_widget_get_screen (widget));
3513 /* We have to expand it so the accel labels will draw their labels
3515 gtk_window_set_default_size (GTK_WINDOW (window), 300, -1);
3517 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3519 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
3521 button = gtk_button_new_with_mnemonic ("Button 1 (_a)");
3522 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3523 button = gtk_button_new_with_mnemonic ("Button 2 (_A)");
3524 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3525 button = gtk_button_new_with_mnemonic ("Button 3 (_\321\204)");
3526 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3527 button = gtk_button_new_with_mnemonic ("Button 4 (_\320\244)");
3528 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3529 button = gtk_button_new_with_mnemonic ("Button 6 (_b)");
3530 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3531 button = accel_button_new (accel_group, "Button 7", "<Alt><Shift>b");
3532 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3533 button = accel_button_new (accel_group, "Button 8", "<Alt>d");
3534 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3535 button = accel_button_new (accel_group, "Button 9", "<Alt>Cyrillic_ve");
3536 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3537 button = gtk_button_new_with_mnemonic ("Button 10 (_1)");
3538 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3539 button = gtk_button_new_with_mnemonic ("Button 11 (_!)");
3540 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3541 button = accel_button_new (accel_group, "Button 12", "<Super>a");
3542 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3543 button = accel_button_new (accel_group, "Button 13", "<Hyper>a");
3544 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3545 button = accel_button_new (accel_group, "Button 14", "<Meta>a");
3546 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3547 button = accel_button_new (accel_group, "Button 15", "<Shift><Mod4>b");
3548 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3550 window_ptr = &window;
3551 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
3552 g_signal_connect (window, "response", G_CALLBACK (gtk_widget_destroy), NULL);
3554 gtk_widget_show_all (window);
3557 gtk_widget_destroy (window);
3566 cmw_destroy_cb(GtkWidget *widget)
3568 /* This is needed to get out of gtk_main */
3575 cmw_color (GtkWidget *widget, GtkWidget *parent)
3578 GtkWidget *colorsel;
3579 GtkWidget *ok_button, *cancel_button;
3581 csd = gtk_color_selection_dialog_new ("This is a modal color selection dialog");
3583 gtk_window_set_screen (GTK_WINDOW (csd), gtk_widget_get_screen (parent));
3585 colorsel = gtk_color_selection_dialog_get_color_selection (GTK_COLOR_SELECTION_DIALOG (csd));
3586 gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (colorsel),
3590 gtk_window_set_modal (GTK_WINDOW(csd),TRUE);
3592 /* And mark it as a transient dialog */
3593 gtk_window_set_transient_for (GTK_WINDOW (csd), GTK_WINDOW (parent));
3595 g_signal_connect (csd, "destroy",
3596 G_CALLBACK (cmw_destroy_cb), NULL);
3599 "ok-button", &ok_button,
3600 "cancel-button", &cancel_button,
3603 g_signal_connect_swapped (ok_button,
3604 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
3605 g_signal_connect_swapped (cancel_button,
3606 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
3608 /* wait until destroy calls gtk_main_quit */
3609 gtk_widget_show (csd);
3614 cmw_file (GtkWidget *widget, GtkWidget *parent)
3618 fs = gtk_file_chooser_dialog_new ("This is a modal file selection dialog",
3619 GTK_WINDOW (parent), GTK_FILE_CHOOSER_ACTION_OPEN,
3620 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
3621 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
3623 gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent));
3624 gtk_window_set_modal (GTK_WINDOW (fs), TRUE);
3626 g_signal_connect (fs, "destroy",
3627 G_CALLBACK (cmw_destroy_cb), NULL);
3628 g_signal_connect_swapped (fs, "response",
3629 G_CALLBACK (gtk_widget_destroy), fs);
3631 /* wait until destroy calls gtk_main_quit */
3632 gtk_widget_show (fs);
3638 create_modal_window (GtkWidget *widget)
3640 GtkWidget *window = NULL;
3641 GtkWidget *box1,*box2;
3643 GtkWidget *btnColor,*btnFile,*btnClose;
3645 /* Create modal window (Here you can use any window descendent )*/
3646 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3647 gtk_window_set_screen (GTK_WINDOW (window),
3648 gtk_widget_get_screen (widget));
3650 gtk_window_set_title (GTK_WINDOW(window),"This window is modal");
3652 /* Set window as modal */
3653 gtk_window_set_modal (GTK_WINDOW(window),TRUE);
3655 /* Create widgets */
3656 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
3657 frame1 = gtk_frame_new ("Standard dialogs in modal form");
3658 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
3659 gtk_box_set_homogeneous (GTK_BOX (box2), TRUE);
3660 btnColor = gtk_button_new_with_label ("Color");
3661 btnFile = gtk_button_new_with_label ("File Selection");
3662 btnClose = gtk_button_new_with_label ("Close");
3665 gtk_container_set_border_width (GTK_CONTAINER (box1), 3);
3666 gtk_container_set_border_width (GTK_CONTAINER (box2), 3);
3669 gtk_container_add (GTK_CONTAINER (window), box1);
3670 gtk_box_pack_start (GTK_BOX (box1), frame1, TRUE, TRUE, 4);
3671 gtk_container_add (GTK_CONTAINER (frame1), box2);
3672 gtk_box_pack_start (GTK_BOX (box2), btnColor, FALSE, FALSE, 4);
3673 gtk_box_pack_start (GTK_BOX (box2), btnFile, FALSE, FALSE, 4);
3674 gtk_box_pack_start (GTK_BOX (box1), gtk_separator_new (GTK_ORIENTATION_HORIZONTAL), FALSE, FALSE, 4);
3675 gtk_box_pack_start (GTK_BOX (box1), btnClose, FALSE, FALSE, 4);
3677 /* connect signals */
3678 g_signal_connect_swapped (btnClose, "clicked",
3679 G_CALLBACK (gtk_widget_destroy), window);
3681 g_signal_connect (window, "destroy",
3682 G_CALLBACK (cmw_destroy_cb), NULL);
3684 g_signal_connect (btnColor, "clicked",
3685 G_CALLBACK (cmw_color), window);
3686 g_signal_connect (btnFile, "clicked",
3687 G_CALLBACK (cmw_file), window);
3690 gtk_widget_show_all (window);
3692 /* wait until dialog get destroyed */
3701 make_message_dialog (GdkScreen *screen,
3703 GtkMessageType type,
3704 GtkButtonsType buttons,
3705 guint default_response)
3709 gtk_widget_destroy (*dialog);
3714 *dialog = gtk_message_dialog_new (NULL, 0, type, buttons,
3715 "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.)");
3717 gtk_window_set_screen (GTK_WINDOW (*dialog), screen);
3719 g_signal_connect_swapped (*dialog,
3721 G_CALLBACK (gtk_widget_destroy),
3724 g_signal_connect (*dialog,
3726 G_CALLBACK (gtk_widget_destroyed),
3729 gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
3731 gtk_widget_show (*dialog);
3735 create_message_dialog (GtkWidget *widget)
3737 static GtkWidget *info = NULL;
3738 static GtkWidget *warning = NULL;
3739 static GtkWidget *error = NULL;
3740 static GtkWidget *question = NULL;
3741 GdkScreen *screen = gtk_widget_get_screen (widget);
3743 make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK);
3744 make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE);
3745 make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK);
3746 make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_NO);
3753 static GtkWidget *sw_parent = NULL;
3754 static GtkWidget *sw_float_parent;
3755 static gulong sw_destroyed_handler = 0;
3758 scrolled_windows_delete_cb (GtkWidget *widget, GdkEventAny *event, GtkWidget *scrollwin)
3760 gtk_widget_reparent (scrollwin, sw_parent);
3762 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
3763 sw_float_parent = NULL;
3765 sw_destroyed_handler = 0;
3771 scrolled_windows_destroy_cb (GtkWidget *widget, GtkWidget *scrollwin)
3773 gtk_widget_destroy (sw_float_parent);
3775 sw_float_parent = NULL;
3777 sw_destroyed_handler = 0;
3781 scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
3785 gtk_widget_reparent (scrollwin, sw_parent);
3786 gtk_widget_destroy (sw_float_parent);
3788 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
3789 sw_float_parent = NULL;
3791 sw_destroyed_handler = 0;
3795 sw_parent = gtk_widget_get_parent (scrollwin);
3796 sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3797 gtk_window_set_screen (GTK_WINDOW (sw_float_parent),
3798 gtk_widget_get_screen (widget));
3800 gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200);
3802 gtk_widget_reparent (scrollwin, sw_float_parent);
3803 gtk_widget_show (sw_float_parent);
3805 sw_destroyed_handler =
3806 g_signal_connect (sw_parent, "destroy",
3807 G_CALLBACK (scrolled_windows_destroy_cb), scrollwin);
3808 g_signal_connect (sw_float_parent, "delete_event",
3809 G_CALLBACK (scrolled_windows_delete_cb), scrollwin);
3814 create_scrolled_windows (GtkWidget *widget)
3816 static GtkWidget *window;
3817 GtkWidget *content_area, *action_area;
3818 GtkWidget *scrolled_window;
3826 window = gtk_dialog_new ();
3828 gtk_window_set_screen (GTK_WINDOW (window),
3829 gtk_widget_get_screen (widget));
3831 g_signal_connect (window, "destroy",
3832 G_CALLBACK (gtk_widget_destroyed),
3835 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
3836 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
3838 gtk_window_set_title (GTK_WINDOW (window), "dialog");
3839 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3841 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
3842 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
3843 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
3844 GTK_POLICY_AUTOMATIC,
3845 GTK_POLICY_AUTOMATIC);
3846 gtk_box_pack_start (GTK_BOX (content_area), scrolled_window, TRUE, TRUE, 0);
3847 gtk_widget_show (scrolled_window);
3849 table = gtk_table_new (20, 20, FALSE);
3850 gtk_table_set_row_spacings (GTK_TABLE (table), 10);
3851 gtk_table_set_col_spacings (GTK_TABLE (table), 10);
3852 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
3853 gtk_container_set_focus_hadjustment (GTK_CONTAINER (table),
3854 gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
3855 gtk_container_set_focus_vadjustment (GTK_CONTAINER (table),
3856 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
3857 gtk_widget_show (table);
3859 for (i = 0; i < 20; i++)
3860 for (j = 0; j < 20; j++)
3862 sprintf (buffer, "button (%d,%d)\n", i, j);
3863 button = gtk_toggle_button_new_with_label (buffer);
3864 gtk_table_attach_defaults (GTK_TABLE (table), button,
3866 gtk_widget_show (button);
3870 button = gtk_button_new_with_label ("Close");
3871 g_signal_connect_swapped (button, "clicked",
3872 G_CALLBACK (gtk_widget_destroy),
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 button = gtk_button_new_with_label ("Reparent Out");
3880 g_signal_connect (button, "clicked",
3881 G_CALLBACK (scrolled_windows_remove),
3883 gtk_widget_set_can_default (button, TRUE);
3884 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
3885 gtk_widget_grab_default (button);
3886 gtk_widget_show (button);
3888 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
3891 if (!gtk_widget_get_visible (window))
3892 gtk_widget_show (window);
3894 gtk_widget_destroy (window);
3902 entry_toggle_frame (GtkWidget *checkbutton,
3905 gtk_entry_set_has_frame (GTK_ENTRY(entry),
3906 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
3910 entry_toggle_sensitive (GtkWidget *checkbutton,
3913 gtk_widget_set_sensitive (entry,
3914 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(checkbutton)));
3918 entry_progress_timeout (gpointer data)
3920 if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (data), "progress-pulse")))
3922 gtk_entry_progress_pulse (GTK_ENTRY (data));
3928 fraction = gtk_entry_get_progress_fraction (GTK_ENTRY (data));
3931 if (fraction > 1.0001)
3934 gtk_entry_set_progress_fraction (GTK_ENTRY (data), fraction);
3941 entry_remove_timeout (gpointer data)
3943 g_source_remove (GPOINTER_TO_UINT (data));
3947 entry_toggle_progress (GtkWidget *checkbutton,
3950 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)))
3952 guint timeout = gdk_threads_add_timeout (100,
3953 entry_progress_timeout,
3955 g_object_set_data_full (G_OBJECT (entry), "timeout-id",
3956 GUINT_TO_POINTER (timeout),
3957 entry_remove_timeout);
3961 g_object_set_data (G_OBJECT (entry), "timeout-id",
3962 GUINT_TO_POINTER (0));
3964 gtk_entry_set_progress_fraction (GTK_ENTRY (entry), 0.0);
3969 entry_toggle_pulse (GtkWidget *checkbutton,
3972 g_object_set_data (G_OBJECT (entry), "progress-pulse",
3973 GUINT_TO_POINTER ((guint) gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton))));
3977 props_clicked (GtkWidget *button,
3980 GtkWidget *window = create_prop_editor (object, 0);
3982 gtk_window_set_title (GTK_WINDOW (window), "Object Properties");
3986 create_entry (GtkWidget *widget)
3988 static GtkWidget *window = NULL;
3992 GtkWidget *has_frame_check;
3993 GtkWidget *sensitive_check;
3994 GtkWidget *progress_check;
3996 GtkComboBoxText *cb;
3997 GtkWidget *cb_entry;
3999 GtkWidget *separator;
4003 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4004 gtk_window_set_screen (GTK_WINDOW (window),
4005 gtk_widget_get_screen (widget));
4007 g_signal_connect (window, "destroy",
4008 G_CALLBACK (gtk_widget_destroyed),
4011 gtk_window_set_title (GTK_WINDOW (window), "entry");
4012 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4015 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4016 gtk_container_add (GTK_CONTAINER (window), box1);
4019 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
4020 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4021 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
4023 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
4024 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
4026 entry = gtk_entry_new ();
4027 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");
4028 gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5);
4029 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
4031 button = gtk_button_new_with_mnemonic ("_Props");
4032 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
4033 g_signal_connect (button, "clicked",
4034 G_CALLBACK (props_clicked),
4037 cb = GTK_COMBO_BOX_TEXT (gtk_combo_box_text_new_with_entry ());
4039 gtk_combo_box_text_append_text (cb, "item0");
4040 gtk_combo_box_text_append_text (cb, "item0");
4041 gtk_combo_box_text_append_text (cb, "item1 item1");
4042 gtk_combo_box_text_append_text (cb, "item2 item2 item2");
4043 gtk_combo_box_text_append_text (cb, "item3 item3 item3 item3");
4044 gtk_combo_box_text_append_text (cb, "item4 item4 item4 item4 item4");
4045 gtk_combo_box_text_append_text (cb, "item5 item5 item5 item5 item5 item5");
4046 gtk_combo_box_text_append_text (cb, "item6 item6 item6 item6 item6");
4047 gtk_combo_box_text_append_text (cb, "item7 item7 item7 item7");
4048 gtk_combo_box_text_append_text (cb, "item8 item8 item8");
4049 gtk_combo_box_text_append_text (cb, "item9 item9");
4051 cb_entry = gtk_bin_get_child (GTK_BIN (cb));
4052 gtk_entry_set_text (GTK_ENTRY (cb_entry), "hello world \n\n\n foo");
4053 gtk_editable_select_region (GTK_EDITABLE (cb_entry), 0, -1);
4054 gtk_box_pack_start (GTK_BOX (box2), GTK_WIDGET (cb), TRUE, TRUE, 0);
4056 sensitive_check = gtk_check_button_new_with_label("Sensitive");
4057 gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0);
4058 g_signal_connect (sensitive_check, "toggled",
4059 G_CALLBACK (entry_toggle_sensitive), entry);
4060 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sensitive_check), TRUE);
4062 has_frame_check = gtk_check_button_new_with_label("Has Frame");
4063 gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0);
4064 g_signal_connect (has_frame_check, "toggled",
4065 G_CALLBACK (entry_toggle_frame), entry);
4066 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
4068 progress_check = gtk_check_button_new_with_label("Show Progress");
4069 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4070 g_signal_connect (progress_check, "toggled",
4071 G_CALLBACK (entry_toggle_progress), entry);
4073 progress_check = gtk_check_button_new_with_label("Pulse Progress");
4074 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4075 g_signal_connect (progress_check, "toggled",
4076 G_CALLBACK (entry_toggle_pulse), entry);
4078 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
4079 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4081 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
4082 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4083 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4085 button = gtk_button_new_with_label ("close");
4086 g_signal_connect_swapped (button, "clicked",
4087 G_CALLBACK (gtk_widget_destroy),
4089 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4090 gtk_widget_set_can_default (button, TRUE);
4091 gtk_widget_grab_default (button);
4094 if (!gtk_widget_get_visible (window))
4095 gtk_widget_show_all (window);
4097 gtk_widget_destroy (window);
4101 create_expander (GtkWidget *widget)
4104 GtkWidget *expander;
4106 static GtkWidget *window = NULL;
4110 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4111 gtk_window_set_screen (GTK_WINDOW (window),
4112 gtk_widget_get_screen (widget));
4114 g_signal_connect (window, "destroy",
4115 G_CALLBACK (gtk_widget_destroyed),
4118 gtk_window_set_title (GTK_WINDOW (window), "expander");
4119 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4121 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4122 gtk_container_add (GTK_CONTAINER (window), box1);
4124 expander = gtk_expander_new ("The Hidden");
4126 gtk_box_pack_start (GTK_BOX (box1), expander, TRUE, TRUE, 0);
4128 hidden = gtk_label_new ("Revealed!");
4130 gtk_container_add (GTK_CONTAINER (expander), hidden);
4133 if (!gtk_widget_get_visible (window))
4134 gtk_widget_show_all (window);
4136 gtk_widget_destroy (window);
4144 event_box_label_pressed (GtkWidget *widget,
4145 GdkEventButton *event,
4148 g_print ("clicked on event box\n");
4152 event_box_button_clicked (GtkWidget *widget,
4156 g_print ("pushed button\n");
4160 event_box_toggle_visible_window (GtkWidget *checkbutton,
4161 GtkEventBox *event_box)
4163 gtk_event_box_set_visible_window (event_box,
4164 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
4168 event_box_toggle_above_child (GtkWidget *checkbutton,
4169 GtkEventBox *event_box)
4171 gtk_event_box_set_above_child (event_box,
4172 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
4176 create_event_box (GtkWidget *widget)
4178 static GtkWidget *window = NULL;
4184 GtkWidget *separator;
4185 GtkWidget *event_box;
4187 GtkWidget *visible_window_check;
4188 GtkWidget *above_child_check;
4198 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4199 gtk_window_set_screen (GTK_WINDOW (window),
4200 gtk_widget_get_screen (widget));
4202 g_signal_connect (window, "destroy",
4203 G_CALLBACK (gtk_widget_destroyed),
4206 gtk_window_set_title (GTK_WINDOW (window), "event box");
4207 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4209 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4210 gtk_container_add (GTK_CONTAINER (window), box1);
4211 gtk_widget_override_background_color (window, 0, &color);
4213 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4214 gtk_box_pack_start (GTK_BOX (box1), hbox, TRUE, FALSE, 0);
4216 event_box = gtk_event_box_new ();
4217 gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, FALSE, 0);
4219 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4220 gtk_container_add (GTK_CONTAINER (event_box), vbox);
4221 g_signal_connect (event_box, "button_press_event",
4222 G_CALLBACK (event_box_label_pressed),
4225 label = gtk_label_new ("Click on this label");
4226 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
4228 button = gtk_button_new_with_label ("button in eventbox");
4229 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, FALSE, 0);
4230 g_signal_connect (button, "clicked",
4231 G_CALLBACK (event_box_button_clicked),
4235 visible_window_check = gtk_check_button_new_with_label("Visible Window");
4236 gtk_box_pack_start (GTK_BOX (box1), visible_window_check, FALSE, TRUE, 0);
4237 g_signal_connect (visible_window_check, "toggled",
4238 G_CALLBACK (event_box_toggle_visible_window), event_box);
4239 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (visible_window_check), FALSE);
4241 above_child_check = gtk_check_button_new_with_label("Above Child");
4242 gtk_box_pack_start (GTK_BOX (box1), above_child_check, FALSE, TRUE, 0);
4243 g_signal_connect (above_child_check, "toggled",
4244 G_CALLBACK (event_box_toggle_above_child), event_box);
4245 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (above_child_check), FALSE);
4247 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
4248 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4250 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
4251 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4252 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4254 button = gtk_button_new_with_label ("close");
4255 g_signal_connect_swapped (button, "clicked",
4256 G_CALLBACK (gtk_widget_destroy),
4258 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4259 gtk_widget_set_can_default (button, TRUE);
4260 gtk_widget_grab_default (button);
4263 if (!gtk_widget_get_visible (window))
4264 gtk_widget_show_all (window);
4266 gtk_widget_destroy (window);
4274 #define SIZE_GROUP_INITIAL_SIZE 50
4277 size_group_hsize_changed (GtkSpinButton *spin_button,
4280 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4281 gtk_spin_button_get_value_as_int (spin_button),
4286 size_group_vsize_changed (GtkSpinButton *spin_button,
4289 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4291 gtk_spin_button_get_value_as_int (spin_button));
4295 create_size_group_window (GdkScreen *screen,
4296 GtkSizeGroup *master_size_group)
4298 GtkWidget *content_area;
4301 GtkWidget *main_button;
4303 GtkWidget *spin_button;
4305 GtkSizeGroup *hgroup1;
4306 GtkSizeGroup *hgroup2;
4307 GtkSizeGroup *vgroup1;
4308 GtkSizeGroup *vgroup2;
4310 window = gtk_dialog_new_with_buttons ("GtkSizeGroup",
4316 gtk_window_set_screen (GTK_WINDOW (window), screen);
4318 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
4320 g_signal_connect (window, "response",
4321 G_CALLBACK (gtk_widget_destroy),
4324 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
4326 table = gtk_table_new (2, 2, FALSE);
4327 gtk_box_pack_start (GTK_BOX (content_area), table, TRUE, TRUE, 0);
4329 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
4330 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
4331 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
4332 gtk_widget_set_size_request (table, 250, 250);
4334 hgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4335 hgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4336 vgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4337 vgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4339 main_button = gtk_button_new_with_label ("X");
4341 gtk_table_attach (GTK_TABLE (table), main_button,
4343 GTK_EXPAND, GTK_EXPAND,
4345 gtk_size_group_add_widget (master_size_group, main_button);
4346 gtk_size_group_add_widget (hgroup1, main_button);
4347 gtk_size_group_add_widget (vgroup1, main_button);
4348 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (main_button)),
4349 SIZE_GROUP_INITIAL_SIZE,
4350 SIZE_GROUP_INITIAL_SIZE);
4352 button = gtk_button_new ();
4353 gtk_table_attach (GTK_TABLE (table), button,
4355 GTK_EXPAND, GTK_EXPAND,
4357 gtk_size_group_add_widget (vgroup1, button);
4358 gtk_size_group_add_widget (vgroup2, button);
4360 button = gtk_button_new ();
4361 gtk_table_attach (GTK_TABLE (table), button,
4363 GTK_EXPAND, GTK_EXPAND,
4365 gtk_size_group_add_widget (hgroup1, button);
4366 gtk_size_group_add_widget (hgroup2, button);
4368 button = gtk_button_new ();
4369 gtk_table_attach (GTK_TABLE (table), button,
4371 GTK_EXPAND, GTK_EXPAND,
4373 gtk_size_group_add_widget (hgroup2, button);
4374 gtk_size_group_add_widget (vgroup2, button);
4376 g_object_unref (hgroup1);
4377 g_object_unref (hgroup2);
4378 g_object_unref (vgroup1);
4379 g_object_unref (vgroup2);
4381 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
4382 gtk_box_pack_start (GTK_BOX (content_area), hbox, FALSE, FALSE, 0);
4384 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4385 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4386 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4387 g_signal_connect (spin_button, "value_changed",
4388 G_CALLBACK (size_group_hsize_changed), main_button);
4390 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4391 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4392 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4393 g_signal_connect (spin_button, "value_changed",
4394 G_CALLBACK (size_group_vsize_changed), main_button);
4400 create_size_groups (GtkWidget *widget)
4402 static GtkWidget *window1 = NULL;
4403 static GtkWidget *window2 = NULL;
4404 static GtkSizeGroup *master_size_group;
4406 if (!master_size_group)
4407 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
4411 window1 = create_size_group_window (gtk_widget_get_screen (widget),
4414 g_signal_connect (window1, "destroy",
4415 G_CALLBACK (gtk_widget_destroyed),
4421 window2 = create_size_group_window (gtk_widget_get_screen (widget),
4424 g_signal_connect (window2, "destroy",
4425 G_CALLBACK (gtk_widget_destroyed),
4429 if (gtk_widget_get_visible (window1) && gtk_widget_get_visible (window2))
4431 gtk_widget_destroy (window1);
4432 gtk_widget_destroy (window2);
4436 if (!gtk_widget_get_visible (window1))
4437 gtk_widget_show_all (window1);
4438 if (!gtk_widget_get_visible (window2))
4439 gtk_widget_show_all (window2);
4447 static GtkWidget *spinner1;
4450 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
4452 gtk_spin_button_set_snap_to_ticks (spin,
4453 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
4457 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
4459 gtk_spin_button_set_numeric (spin,
4460 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
4464 change_digits (GtkWidget *widget, GtkSpinButton *spin)
4466 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
4467 gtk_spin_button_get_value_as_int (spin));
4471 get_value (GtkWidget *widget, gpointer data)
4475 GtkSpinButton *spin;
4477 spin = GTK_SPIN_BUTTON (spinner1);
4478 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
4479 if (GPOINTER_TO_INT (data) == 1)
4480 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
4482 sprintf (buf, "%0.*f",
4483 gtk_spin_button_get_digits (spin),
4484 gtk_spin_button_get_value (spin));
4486 gtk_label_set_text (label, buf);
4490 get_spin_value (GtkWidget *widget, gpointer data)
4494 GtkSpinButton *spin;
4496 spin = GTK_SPIN_BUTTON (widget);
4497 label = GTK_LABEL (data);
4499 buffer = g_strdup_printf ("%0.*f",
4500 gtk_spin_button_get_digits (spin),
4501 gtk_spin_button_get_value (spin));
4502 gtk_label_set_text (label, buffer);
4508 spin_button_time_output_func (GtkSpinButton *spin_button)
4510 GtkAdjustment *adjustment;
4511 static gchar buf[6];
4515 adjustment = gtk_spin_button_get_adjustment (spin_button);
4516 hours = gtk_adjustment_get_value (adjustment) / 60.0;
4517 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
4518 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
4519 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4520 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4525 spin_button_month_input_func (GtkSpinButton *spin_button,
4529 static gchar *month[12] = { "January", "February", "March", "April",
4530 "May", "June", "July", "August",
4531 "September", "October", "November", "December" };
4533 gboolean found = FALSE;
4535 for (i = 1; i <= 12; i++)
4537 tmp1 = g_ascii_strup (month[i - 1], -1);
4538 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
4539 if (strstr (tmp1, tmp2) == tmp1)
4549 return GTK_INPUT_ERROR;
4551 *new_val = (gdouble) i;
4556 spin_button_month_output_func (GtkSpinButton *spin_button)
4558 GtkAdjustment *adjustment;
4561 static gchar *month[12] = { "January", "February", "March", "April",
4562 "May", "June", "July", "August", "September",
4563 "October", "November", "December" };
4565 adjustment = gtk_spin_button_get_adjustment (spin_button);
4566 value = gtk_adjustment_get_value (adjustment);
4567 for (i = 1; i <= 12; i++)
4568 if (fabs (value - (double)i) < 1e-5)
4570 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
4571 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
4577 spin_button_hex_input_func (GtkSpinButton *spin_button,
4584 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
4585 res = strtol(buf, &err, 16);
4588 return GTK_INPUT_ERROR;
4594 spin_button_hex_output_func (GtkSpinButton *spin_button)
4596 GtkAdjustment *adjustment;
4597 static gchar buf[7];
4600 adjustment = gtk_spin_button_get_adjustment (spin_button);
4601 val = (gint) gtk_adjustment_get_value (adjustment);
4602 if (fabs (val) < 1e-5)
4603 sprintf (buf, "0x00");
4605 sprintf (buf, "0x%.2X", val);
4606 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4607 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4612 create_spins (GtkWidget *widget)
4614 static GtkWidget *window = NULL;
4617 GtkWidget *main_vbox;
4620 GtkWidget *spinner2;
4624 GtkWidget *val_label;
4625 GtkAdjustment *adjustment;
4629 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4630 gtk_window_set_screen (GTK_WINDOW (window),
4631 gtk_widget_get_screen (widget));
4633 g_signal_connect (window, "destroy",
4634 G_CALLBACK (gtk_widget_destroyed),
4637 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
4639 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
4640 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
4641 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4643 frame = gtk_frame_new ("Not accelerated");
4644 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4646 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4647 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4648 gtk_container_add (GTK_CONTAINER (frame), vbox);
4650 /* Time, month, hex spinners */
4652 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4653 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
4655 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4656 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4658 label = gtk_label_new ("Time :");
4659 gtk_widget_set_halign (label, GTK_ALIGN_START);
4660 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4661 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4663 adjustment = gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
4664 spinner = gtk_spin_button_new (adjustment, 0, 0);
4665 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
4666 g_signal_connect (spinner,
4668 G_CALLBACK (spin_button_time_output_func),
4670 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4671 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 5);
4672 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4674 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4675 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4677 label = gtk_label_new ("Month :");
4678 gtk_widget_set_halign (label, GTK_ALIGN_START);
4679 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4680 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4682 adjustment = gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
4684 spinner = gtk_spin_button_new (adjustment, 0, 0);
4685 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
4686 GTK_UPDATE_IF_VALID);
4687 g_signal_connect (spinner,
4689 G_CALLBACK (spin_button_month_input_func),
4691 g_signal_connect (spinner,
4693 G_CALLBACK (spin_button_month_output_func),
4695 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4696 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 9);
4697 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4699 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4700 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4702 label = gtk_label_new ("Hex :");
4703 gtk_widget_set_halign (label, GTK_ALIGN_START);
4704 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4705 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4707 adjustment = gtk_adjustment_new (0, 0, 255, 1, 16, 0);
4708 spinner = gtk_spin_button_new (adjustment, 0, 0);
4709 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
4710 g_signal_connect (spinner,
4712 G_CALLBACK (spin_button_hex_input_func),
4714 g_signal_connect (spinner,
4716 G_CALLBACK (spin_button_hex_output_func),
4718 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4719 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 4);
4720 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4722 frame = gtk_frame_new ("Accelerated");
4723 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4725 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4726 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4727 gtk_container_add (GTK_CONTAINER (frame), vbox);
4729 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4730 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4732 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4733 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4735 label = gtk_label_new ("Value :");
4736 gtk_widget_set_halign (label, GTK_ALIGN_START);
4737 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4738 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4740 adjustment = gtk_adjustment_new (0.0, -10000.0, 10000.0,
4742 spinner1 = gtk_spin_button_new (adjustment, 1.0, 2);
4743 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
4744 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
4746 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4747 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4749 label = gtk_label_new ("Digits :");
4750 gtk_widget_set_halign (label, GTK_ALIGN_START);
4751 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4752 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4754 adjustment = gtk_adjustment_new (2, 1, 15, 1, 1, 0);
4755 spinner2 = gtk_spin_button_new (adjustment, 0.0, 0);
4756 g_signal_connect (adjustment, "value_changed",
4757 G_CALLBACK (change_digits),
4759 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
4761 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4762 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
4764 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
4765 g_signal_connect (button, "clicked",
4766 G_CALLBACK (toggle_snap),
4768 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4769 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4771 button = gtk_check_button_new_with_label ("Numeric only input mode");
4772 g_signal_connect (button, "clicked",
4773 G_CALLBACK (toggle_numeric),
4775 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4776 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4778 val_label = gtk_label_new ("");
4780 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4781 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4783 button = gtk_button_new_with_label ("Value as Int");
4784 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4785 g_signal_connect (button, "clicked",
4786 G_CALLBACK (get_value),
4787 GINT_TO_POINTER (1));
4788 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4790 button = gtk_button_new_with_label ("Value as Float");
4791 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4792 g_signal_connect (button, "clicked",
4793 G_CALLBACK (get_value),
4794 GINT_TO_POINTER (2));
4795 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4797 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
4798 gtk_label_set_text (GTK_LABEL (val_label), "0");
4800 frame = gtk_frame_new ("Using Convenience Constructor");
4801 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4803 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4804 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4805 gtk_container_add (GTK_CONTAINER (frame), hbox);
4807 val_label = gtk_label_new ("0.0");
4809 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
4810 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
4811 g_signal_connect (spinner, "value_changed",
4812 G_CALLBACK (get_spin_value), val_label);
4813 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
4814 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
4816 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4817 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
4819 button = gtk_button_new_with_label ("Close");
4820 g_signal_connect_swapped (button, "clicked",
4821 G_CALLBACK (gtk_widget_destroy),
4823 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4826 if (!gtk_widget_get_visible (window))
4827 gtk_widget_show_all (window);
4829 gtk_widget_destroy (window);
4838 cursor_draw (GtkWidget *widget,
4843 GtkStyleContext *context;
4846 width = gtk_widget_get_allocated_width (widget);
4847 height = gtk_widget_get_allocated_height (widget);
4849 cairo_set_source_rgb (cr, 1, 1, 1);
4850 cairo_rectangle (cr, 0, 0, width, height / 2);
4853 cairo_set_source_rgb (cr, 0, 0, 0);
4854 cairo_rectangle (cr, 0, height / 2, width, height / 2);
4857 context = gtk_widget_get_style_context (widget);
4858 gtk_style_context_get_background_color (context, GTK_STATE_FLAG_NORMAL, &bg);
4859 gdk_cairo_set_source_rgba (cr, &bg);
4860 cairo_rectangle (cr, width / 3, height / 3, width / 3, height / 3);
4867 set_cursor (GtkWidget *spinner,
4876 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
4879 label = g_object_get_data (G_OBJECT (spinner), "user_data");
4881 class = g_type_class_ref (GDK_TYPE_CURSOR_TYPE);
4882 vals = class->values;
4884 while (vals && vals->value != c)
4887 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
4889 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
4891 g_type_class_unref (class);
4893 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
4894 gdk_window_set_cursor (gtk_widget_get_window (widget),
4896 g_object_unref (cursor);
4900 cursor_event (GtkWidget *widget,
4902 GtkSpinButton *spinner)
4904 if ((event->type == GDK_BUTTON_PRESS) &&
4905 ((event->button.button == 1) ||
4906 (event->button.button == 3)))
4908 gtk_spin_button_spin (spinner, event->button.button == 1 ?
4909 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
4916 #ifdef GDK_WINDOWING_X11
4917 #include "x11/gdkx.h"
4920 change_cursor_theme (GtkWidget *widget,
4927 children = gtk_container_get_children (GTK_CONTAINER (data));
4929 theme = gtk_entry_get_text (GTK_ENTRY (children->next->data));
4930 size = (gint) gtk_spin_button_get_value (GTK_SPIN_BUTTON (children->next->next->data));
4932 g_list_free (children);
4934 gdk_x11_display_set_cursor_theme (gtk_widget_get_display (widget),
4941 create_cursors (GtkWidget *widget)
4943 static GtkWidget *window = NULL;
4946 GtkWidget *main_vbox;
4953 GtkAdjustment *adjustment;
4959 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4960 gtk_window_set_screen (GTK_WINDOW (window),
4961 gtk_widget_get_screen (widget));
4963 g_signal_connect (window, "destroy",
4964 G_CALLBACK (gtk_widget_destroyed),
4967 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
4969 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
4970 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
4971 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4974 g_object_new (GTK_TYPE_BOX,
4975 "orientation", GTK_ORIENTATION_VERTICAL,
4976 "GtkBox::homogeneous", FALSE,
4977 "GtkBox::spacing", 5,
4978 "GtkContainer::border_width", 10,
4979 "GtkWidget::parent", main_vbox,
4980 "GtkWidget::visible", TRUE,
4983 #ifdef GDK_WINDOWING_X11
4984 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4985 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4986 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
4988 label = gtk_label_new ("Cursor Theme : ");
4989 gtk_widget_set_halign (label, GTK_ALIGN_START);
4990 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
4991 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
4993 entry = gtk_entry_new ();
4994 gtk_entry_set_text (GTK_ENTRY (entry), "default");
4995 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, TRUE, 0);
4997 size = gtk_spin_button_new_with_range (1.0, 64.0, 1.0);
4998 gtk_spin_button_set_value (GTK_SPIN_BUTTON (size), 24.0);
4999 gtk_box_pack_start (GTK_BOX (hbox), size, TRUE, TRUE, 0);
5001 g_signal_connect (entry, "changed",
5002 G_CALLBACK (change_cursor_theme), hbox);
5003 g_signal_connect (size, "changed",
5004 G_CALLBACK (change_cursor_theme), hbox);
5007 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
5008 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5009 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5011 label = gtk_label_new ("Cursor Value : ");
5012 gtk_widget_set_halign (label, GTK_ALIGN_START);
5013 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
5014 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5016 adjustment = gtk_adjustment_new (0,
5020 spinner = gtk_spin_button_new (adjustment, 0, 0);
5021 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
5024 g_object_new (gtk_frame_get_type (),
5025 "GtkFrame::label_xalign", 0.5,
5026 "GtkFrame::label", "Cursor Area",
5027 "GtkContainer::border_width", 10,
5028 "GtkWidget::parent", vbox,
5029 "GtkWidget::visible", TRUE,
5032 darea = gtk_drawing_area_new ();
5033 gtk_widget_set_size_request (darea, 80, 80);
5034 gtk_container_add (GTK_CONTAINER (frame), darea);
5035 g_signal_connect (darea,
5037 G_CALLBACK (cursor_draw),
5039 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
5040 g_signal_connect (darea,
5041 "button_press_event",
5042 G_CALLBACK (cursor_event),
5044 gtk_widget_show (darea);
5046 g_signal_connect (spinner, "changed",
5047 G_CALLBACK (set_cursor),
5050 label = g_object_new (GTK_TYPE_LABEL,
5055 gtk_container_child_set (GTK_CONTAINER (vbox), label,
5058 g_object_set_data (G_OBJECT (spinner), "user_data", label);
5060 any = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
5061 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
5063 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
5064 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
5065 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5067 button = gtk_button_new_with_label ("Close");
5068 g_signal_connect_swapped (button, "clicked",
5069 G_CALLBACK (gtk_widget_destroy),
5071 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5073 gtk_widget_show_all (window);
5075 set_cursor (spinner, darea);
5078 gtk_widget_destroy (window);
5086 color_selection_ok (GtkWidget *w,
5087 GtkColorSelectionDialog *cs)
5089 GtkWidget *colorsel;
5092 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5094 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5095 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5099 color_selection_changed (GtkWidget *w,
5100 GtkColorSelectionDialog *cs)
5102 GtkWidget *colorsel;
5105 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5106 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5107 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5112 opacity_toggled_cb (GtkWidget *w,
5113 GtkColorSelectionDialog *cs)
5115 GtkColorSelection *colorsel;
5117 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5118 gtk_color_selection_set_has_opacity_control (colorsel,
5119 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5123 palette_toggled_cb (GtkWidget *w,
5124 GtkColorSelectionDialog *cs)
5126 GtkColorSelection *colorsel;
5128 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5129 gtk_color_selection_set_has_palette (colorsel,
5130 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5135 create_color_selection (GtkWidget *widget)
5137 static GtkWidget *window = NULL;
5146 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5147 gtk_window_set_screen (GTK_WINDOW (window),
5148 gtk_widget_get_screen (widget));
5150 g_signal_connect (window, "destroy",
5151 G_CALLBACK (gtk_widget_destroyed),
5154 gtk_window_set_title (GTK_WINDOW (window), "GtkColorButton");
5155 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5157 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
5158 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5159 gtk_container_add (GTK_CONTAINER (window), hbox);
5161 label = gtk_label_new ("Pick a color");
5162 gtk_container_add (GTK_CONTAINER (hbox), label);
5164 picker = gtk_color_button_new ();
5165 gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (picker), TRUE);
5166 gtk_container_add (GTK_CONTAINER (hbox), picker);
5168 button = gtk_button_new_with_mnemonic ("_Props");
5169 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
5170 g_signal_connect (button, "clicked",
5171 G_CALLBACK (props_clicked),
5175 if (!gtk_widget_get_visible (window))
5176 gtk_widget_show_all (window);
5178 gtk_widget_destroy (window);
5182 flipping_toggled_cb (GtkWidget *widget, gpointer data)
5184 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
5185 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
5187 gtk_widget_set_default_direction (new_direction);
5191 orientable_toggle_orientation (GtkOrientable *orientable)
5193 GtkOrientation orientation;
5195 orientation = gtk_orientable_get_orientation (orientable);
5196 gtk_orientable_set_orientation (orientable,
5197 orientation == GTK_ORIENTATION_HORIZONTAL ?
5198 GTK_ORIENTATION_VERTICAL :
5199 GTK_ORIENTATION_HORIZONTAL);
5201 if (GTK_IS_CONTAINER (orientable))
5206 children = gtk_container_get_children (GTK_CONTAINER (orientable));
5208 for (child = children; child; child = child->next)
5210 if (GTK_IS_ORIENTABLE (child->data))
5211 orientable_toggle_orientation (child->data);
5214 g_list_free (children);
5219 flipping_orientation_toggled_cb (GtkWidget *widget, gpointer data)
5221 GtkWidget *content_area;
5222 GtkWidget *toplevel;
5224 toplevel = gtk_widget_get_toplevel (widget);
5225 content_area = gtk_dialog_get_content_area (GTK_DIALOG (toplevel));
5226 orientable_toggle_orientation (GTK_ORIENTABLE (content_area));
5230 set_direction_recurse (GtkWidget *widget,
5233 GtkTextDirection *dir = data;
5235 gtk_widget_set_direction (widget, *dir);
5236 if (GTK_IS_CONTAINER (widget))
5237 gtk_container_foreach (GTK_CONTAINER (widget),
5238 set_direction_recurse,
5243 create_forward_back (const char *title,
5244 GtkTextDirection text_dir)
5246 GtkWidget *frame = gtk_frame_new (title);
5247 GtkWidget *bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
5248 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
5249 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
5251 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
5253 gtk_container_add (GTK_CONTAINER (frame), bbox);
5254 gtk_container_add (GTK_CONTAINER (bbox), back_button);
5255 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
5257 set_direction_recurse (frame, &text_dir);
5263 create_flipping (GtkWidget *widget)
5265 static GtkWidget *window = NULL;
5266 GtkWidget *check_button, *button;
5267 GtkWidget *action_area, *content_area;
5271 window = gtk_dialog_new ();
5273 gtk_window_set_screen (GTK_WINDOW (window),
5274 gtk_widget_get_screen (widget));
5276 g_signal_connect (window, "destroy",
5277 G_CALLBACK (gtk_widget_destroyed),
5280 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5281 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
5283 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
5285 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
5286 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5287 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5289 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
5290 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
5292 g_signal_connect (check_button, "toggled",
5293 G_CALLBACK (flipping_toggled_cb), NULL);
5295 check_button = gtk_check_button_new_with_label ("Toggle orientation of all boxes");
5296 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5297 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5299 g_signal_connect (check_button, "toggled",
5300 G_CALLBACK (flipping_orientation_toggled_cb), NULL);
5302 gtk_box_pack_start (GTK_BOX (content_area),
5303 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
5306 gtk_box_pack_start (GTK_BOX (content_area),
5307 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
5310 gtk_box_pack_start (GTK_BOX (content_area),
5311 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
5314 button = gtk_button_new_with_label ("Close");
5315 g_signal_connect_swapped (button, "clicked",
5316 G_CALLBACK (gtk_widget_destroy), window);
5317 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5320 if (!gtk_widget_get_visible (window))
5321 gtk_widget_show_all (window);
5323 gtk_widget_destroy (window);
5331 make_focus_table (GList **list)
5336 table = gtk_table_new (5, 5, FALSE);
5349 widget = gtk_entry_new ();
5351 widget = gtk_button_new_with_label ("Foo");
5353 *list = g_list_prepend (*list, widget);
5355 gtk_table_attach (GTK_TABLE (table),
5359 GTK_EXPAND | GTK_FILL,
5360 GTK_EXPAND | GTK_FILL,
5369 *list = g_list_reverse (*list);
5375 create_focus (GtkWidget *widget)
5377 static GtkWidget *window = NULL;
5381 GtkWidget *content_area;
5386 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
5392 gtk_window_set_screen (GTK_WINDOW (window),
5393 gtk_widget_get_screen (widget));
5395 g_signal_connect (window, "destroy",
5396 G_CALLBACK (gtk_widget_destroyed),
5399 g_signal_connect (window, "response",
5400 G_CALLBACK (gtk_widget_destroy),
5403 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5405 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
5407 frame = gtk_frame_new ("Weird tab focus chain");
5409 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5411 table = make_focus_table (&list);
5413 gtk_container_add (GTK_CONTAINER (frame), table);
5415 gtk_container_set_focus_chain (GTK_CONTAINER (table),
5420 frame = gtk_frame_new ("Default tab focus chain");
5422 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5425 table = make_focus_table (&list);
5429 gtk_container_add (GTK_CONTAINER (frame), table);
5432 if (!gtk_widget_get_visible (window))
5433 gtk_widget_show_all (window);
5435 gtk_widget_destroy (window);
5443 create_font_selection (GtkWidget *widget)
5445 static GtkWidget *window = NULL;
5453 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5454 gtk_window_set_screen (GTK_WINDOW (window),
5455 gtk_widget_get_screen (widget));
5457 g_signal_connect (window, "destroy",
5458 G_CALLBACK (gtk_widget_destroyed),
5461 gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
5462 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5464 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
5465 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5466 gtk_container_add (GTK_CONTAINER (window), hbox);
5468 label = gtk_label_new ("Pick a font");
5469 gtk_container_add (GTK_CONTAINER (hbox), label);
5471 picker = gtk_font_button_new ();
5472 gtk_font_button_set_use_font (GTK_FONT_BUTTON (picker), TRUE);
5473 gtk_container_add (GTK_CONTAINER (hbox), picker);
5476 if (!gtk_widget_get_visible (window))
5477 gtk_widget_show_all (window);
5479 gtk_widget_destroy (window);
5486 static GtkWidget *dialog_window = NULL;
5489 label_toggle (GtkWidget *widget,
5494 *label = gtk_label_new ("Dialog Test");
5495 g_signal_connect (*label,
5497 G_CALLBACK (gtk_widget_destroyed),
5499 g_object_set (*label, "margin", 10, NULL);
5500 gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog_window))),
5501 *label, TRUE, TRUE, 0);
5502 gtk_widget_show (*label);
5505 gtk_widget_destroy (*label);
5509 create_dialog (GtkWidget *widget)
5511 static GtkWidget *label;
5512 GtkWidget *action_area;
5517 /* This is a terrible example; it's much simpler to create
5518 * dialogs than this. Don't use testgtk for example code,
5522 dialog_window = gtk_dialog_new ();
5523 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5524 gtk_widget_get_screen (widget));
5526 g_signal_connect (dialog_window, "destroy",
5527 G_CALLBACK (gtk_widget_destroyed),
5530 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5532 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
5533 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5535 button = gtk_button_new_with_label ("OK");
5536 gtk_widget_set_can_default (button, TRUE);
5537 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5538 gtk_widget_grab_default (button);
5539 gtk_widget_show (button);
5541 button = gtk_button_new_with_label ("Toggle");
5542 g_signal_connect (button, "clicked",
5543 G_CALLBACK (label_toggle),
5545 gtk_widget_set_can_default (button, TRUE);
5546 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5547 gtk_widget_show (button);
5552 if (!gtk_widget_get_visible (dialog_window))
5553 gtk_widget_show (dialog_window);
5555 gtk_widget_destroy (dialog_window);
5558 /* Display & Screen test
5565 GtkWidget *radio_dpy;
5566 GtkWidget *toplevel;
5567 GtkWidget *dialog_window;
5568 } ScreenDisplaySelection;
5571 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
5573 const gchar *display_name;
5574 GdkDisplay *display = gtk_widget_get_display (widget);
5576 GdkScreen *new_screen = NULL;
5577 GdkScreen *current_screen = gtk_widget_get_screen (widget);
5579 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
5581 display_name = gtk_entry_get_text (GTK_ENTRY (data->entry));
5582 display = gdk_display_open (display_name);
5586 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
5587 GTK_DIALOG_DESTROY_WITH_PARENT,
5590 "The display :\n%s\ncannot be opened",
5592 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
5593 gtk_widget_show (dialog);
5594 g_signal_connect (dialog, "response",
5595 G_CALLBACK (gtk_widget_destroy),
5600 GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (data->combo));
5603 gboolean found = FALSE;
5604 while (gtk_tree_model_iter_nth_child (model, &iter, NULL, i++))
5607 gtk_tree_model_get (model, &iter, 0, &name, -1);
5608 found = !g_ascii_strcasecmp (display_name, name);
5615 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (data->combo), display_name);
5616 new_screen = gdk_display_get_default_screen (display);
5621 gint number_of_screens = gdk_display_get_n_screens (display);
5622 gint screen_num = gdk_screen_get_number (current_screen);
5623 if ((screen_num +1) < number_of_screens)
5624 new_screen = gdk_display_get_screen (display, screen_num + 1);
5626 new_screen = gdk_display_get_screen (display, 0);
5631 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
5632 gtk_widget_destroy (data->dialog_window);
5637 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
5639 gtk_widget_destroy (data);
5643 create_display_screen (GtkWidget *widget)
5645 GtkWidget *table, *frame, *window, *combo_dpy, *vbox;
5646 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
5648 ScreenDisplaySelection *scr_dpy_data;
5649 GdkScreen *screen = gtk_widget_get_screen (widget);
5650 GdkDisplay *display = gdk_screen_get_display (screen);
5652 window = g_object_new (gtk_window_get_type (),
5655 "type", GTK_WINDOW_TOPLEVEL,
5657 "Screen or Display selection",
5658 "border_width", 10, NULL);
5659 g_signal_connect (window, "destroy",
5660 G_CALLBACK (gtk_widget_destroy), NULL);
5662 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
5663 gtk_container_add (GTK_CONTAINER (window), vbox);
5665 frame = gtk_frame_new ("Select screen or display");
5666 gtk_container_add (GTK_CONTAINER (vbox), frame);
5668 table = gtk_table_new (2, 2, TRUE);
5669 gtk_table_set_row_spacings (GTK_TABLE (table), 3);
5670 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
5672 gtk_container_add (GTK_CONTAINER (frame), table);
5674 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
5675 if (gdk_display_get_n_screens(display) > 1)
5676 radio_scr = gtk_radio_button_new_with_label
5677 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
5680 radio_scr = gtk_radio_button_new_with_label
5681 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
5682 "only one screen on the current display");
5683 gtk_widget_set_sensitive (radio_scr, FALSE);
5685 combo_dpy = gtk_combo_box_text_new_with_entry ();
5686 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_dpy), "diabolo:0.0");
5687 gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (combo_dpy))),
5688 "<hostname>:<X Server Num>.<Screen Num>");
5690 gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1);
5691 gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2);
5692 gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1);
5694 bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
5695 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
5696 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
5698 gtk_container_add (GTK_CONTAINER (vbox), bbox);
5700 gtk_container_add (GTK_CONTAINER (bbox), applyb);
5701 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
5703 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
5705 scr_dpy_data->entry = gtk_bin_get_child (GTK_BIN (combo_dpy));
5706 scr_dpy_data->radio_dpy = radio_dpy;
5707 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
5708 scr_dpy_data->dialog_window = window;
5710 g_signal_connect (cancelb, "clicked",
5711 G_CALLBACK (screen_display_destroy_diag), window);
5712 g_signal_connect (applyb, "clicked",
5713 G_CALLBACK (screen_display_check), scr_dpy_data);
5714 gtk_widget_show_all (window);
5719 static gulong event_watcher_enter_id = 0;
5720 static gulong event_watcher_leave_id = 0;
5723 event_watcher (GSignalInvocationHint *ihint,
5724 guint n_param_values,
5725 const GValue *param_values,
5728 g_print ("Watch: \"%s\" emitted for %s\n",
5729 g_signal_name (ihint->signal_id),
5730 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
5736 event_watcher_down (void)
5738 if (event_watcher_enter_id)
5742 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5743 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
5744 event_watcher_enter_id = 0;
5745 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5746 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
5747 event_watcher_leave_id = 0;
5752 event_watcher_toggle (void)
5754 if (event_watcher_enter_id)
5755 event_watcher_down ();
5760 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5761 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5762 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5763 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5768 create_event_watcher (GtkWidget *widget)
5770 GtkWidget *action_area, *content_area;
5775 dialog_window = gtk_dialog_new ();
5776 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5777 gtk_widget_get_screen (widget));
5779 g_signal_connect (dialog_window, "destroy",
5780 G_CALLBACK (gtk_widget_destroyed),
5782 g_signal_connect (dialog_window, "destroy",
5783 G_CALLBACK (event_watcher_down),
5786 content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog_window));
5787 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5789 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
5790 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5791 gtk_widget_set_size_request (dialog_window, 200, 110);
5793 button = gtk_toggle_button_new_with_label ("Activate Watch");
5794 g_signal_connect (button, "clicked",
5795 G_CALLBACK (event_watcher_toggle),
5797 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
5798 gtk_box_pack_start (GTK_BOX (content_area), button, TRUE, TRUE, 0);
5799 gtk_widget_show (button);
5801 button = gtk_button_new_with_label ("Close");
5802 g_signal_connect_swapped (button, "clicked",
5803 G_CALLBACK (gtk_widget_destroy),
5805 gtk_widget_set_can_default (button, TRUE);
5806 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5807 gtk_widget_grab_default (button);
5808 gtk_widget_show (button);
5811 if (!gtk_widget_get_visible (dialog_window))
5812 gtk_widget_show (dialog_window);
5814 gtk_widget_destroy (dialog_window);
5822 reformat_value (GtkScale *scale,
5825 return g_strdup_printf ("-->%0.*g<--",
5826 gtk_scale_get_digits (scale), value);
5830 create_range_controls (GtkWidget *widget)
5832 static GtkWidget *window = NULL;
5836 GtkWidget *scrollbar;
5838 GtkWidget *separator;
5839 GtkAdjustment *adjustment;
5844 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5846 gtk_window_set_screen (GTK_WINDOW (window),
5847 gtk_widget_get_screen (widget));
5849 g_signal_connect (window, "destroy",
5850 G_CALLBACK (gtk_widget_destroyed),
5853 gtk_window_set_title (GTK_WINDOW (window), "range controls");
5854 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5857 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
5858 gtk_container_add (GTK_CONTAINER (window), box1);
5859 gtk_widget_show (box1);
5862 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
5863 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5864 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
5865 gtk_widget_show (box2);
5868 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
5870 scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5871 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
5872 gtk_scale_set_digits (GTK_SCALE (scale), 1);
5873 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5874 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
5875 gtk_widget_show (scale);
5877 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5878 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
5879 gtk_widget_show (scrollbar);
5881 scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5882 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5883 g_signal_connect (scale,
5885 G_CALLBACK (reformat_value),
5887 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
5888 gtk_widget_show (scale);
5890 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
5892 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5893 gtk_widget_set_size_request (scale, -1, 200);
5894 gtk_scale_set_digits (GTK_SCALE (scale), 2);
5895 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5896 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5897 gtk_widget_show (scale);
5899 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5900 gtk_widget_set_size_request (scale, -1, 200);
5901 gtk_scale_set_digits (GTK_SCALE (scale), 2);
5902 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5903 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
5904 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5905 gtk_widget_show (scale);
5907 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5908 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5909 g_signal_connect (scale,
5911 G_CALLBACK (reformat_value),
5913 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5914 gtk_widget_show (scale);
5917 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
5918 gtk_widget_show (hbox);
5920 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
5921 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
5922 gtk_widget_show (separator);
5925 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
5926 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5927 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
5928 gtk_widget_show (box2);
5931 button = gtk_button_new_with_label ("close");
5932 g_signal_connect_swapped (button, "clicked",
5933 G_CALLBACK (gtk_widget_destroy),
5935 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
5936 gtk_widget_set_can_default (button, TRUE);
5937 gtk_widget_grab_default (button);
5938 gtk_widget_show (button);
5941 if (!gtk_widget_get_visible (window))
5942 gtk_widget_show (window);
5944 gtk_widget_destroy (window);
5951 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
5952 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
5953 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
5954 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
5955 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
5956 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
5957 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
5958 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
5961 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
5967 static const char * book_open_xpm[] = {
5990 static const char * book_closed_xpm[] = {
6015 GdkPixbuf *book_open;
6016 GdkPixbuf *book_closed;
6017 GtkWidget *sample_notebook;
6020 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
6022 GtkWidget *page_widget;
6025 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
6027 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
6028 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6030 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
6031 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6035 page_switch (GtkWidget *widget, gpointer *page, gint page_num)
6037 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
6038 gint old_page_num = gtk_notebook_get_current_page (notebook);
6040 if (page_num == old_page_num)
6043 set_page_image (notebook, page_num, book_open);
6045 if (old_page_num != -1)
6046 set_page_image (notebook, old_page_num, book_closed);
6050 tab_fill (GtkToggleButton *button, GtkWidget *child)
6052 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
6053 "tab-fill", gtk_toggle_button_get_active (button),
6058 tab_expand (GtkToggleButton *button, GtkWidget *child)
6060 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
6061 "tab-expand", gtk_toggle_button_get_active (button),
6066 create_pages (GtkNotebook *notebook, gint start, gint end)
6068 GtkWidget *child = NULL;
6073 GtkWidget *label_box;
6074 GtkWidget *menu_box;
6078 char accel_buffer[32];
6080 for (i = start; i <= end; i++)
6082 sprintf (buffer, "Page %d", i);
6083 sprintf (accel_buffer, "Page _%d", i);
6085 child = gtk_frame_new (buffer);
6086 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
6088 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6089 gtk_box_set_homogeneous (GTK_BOX (vbox), TRUE);
6090 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
6091 gtk_container_add (GTK_CONTAINER (child), vbox);
6093 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6094 gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE);
6095 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
6097 button = gtk_check_button_new_with_label ("Fill Tab");
6098 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6099 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
6100 g_signal_connect (button, "toggled",
6101 G_CALLBACK (tab_fill), child);
6103 button = gtk_check_button_new_with_label ("Expand Tab");
6104 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6105 g_signal_connect (button, "toggled",
6106 G_CALLBACK (tab_expand), child);
6108 button = gtk_button_new_with_label ("Hide Page");
6109 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
6110 g_signal_connect_swapped (button, "clicked",
6111 G_CALLBACK (gtk_widget_hide),
6114 gtk_widget_show_all (child);
6116 label_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6117 pixwid = gtk_image_new_from_pixbuf (book_closed);
6118 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
6120 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
6121 gtk_widget_set_margin_left (pixwid, 3);
6122 gtk_widget_set_margin_right (pixwid, 3);
6123 gtk_widget_set_margin_bottom (pixwid, 1);
6124 gtk_widget_set_margin_top (pixwid, 1);
6125 label = gtk_label_new_with_mnemonic (accel_buffer);
6126 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
6127 gtk_widget_show_all (label_box);
6130 menu_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6131 pixwid = gtk_image_new_from_pixbuf (book_closed);
6132 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
6134 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
6135 gtk_widget_set_margin_left (pixwid, 3);
6136 gtk_widget_set_margin_right (pixwid, 3);
6137 gtk_widget_set_margin_bottom (pixwid, 1);
6138 gtk_widget_set_margin_top (pixwid, 1);
6139 label = gtk_label_new (buffer);
6140 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
6141 gtk_widget_show_all (menu_box);
6143 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
6148 rotate_notebook (GtkButton *button,
6149 GtkNotebook *notebook)
6151 gtk_notebook_set_tab_pos (notebook, (gtk_notebook_get_tab_pos (notebook) + 1) % 4);
6155 show_all_pages (GtkButton *button,
6156 GtkNotebook *notebook)
6158 gtk_container_foreach (GTK_CONTAINER (notebook),
6159 (GtkCallback) gtk_widget_show, NULL);
6163 notebook_type_changed (GtkWidget *optionmenu,
6166 GtkNotebook *notebook;
6176 notebook = GTK_NOTEBOOK (data);
6178 c = gtk_combo_box_get_active (GTK_COMBO_BOX (optionmenu));
6183 /* standard notebook */
6184 gtk_notebook_set_show_tabs (notebook, TRUE);
6185 gtk_notebook_set_show_border (notebook, TRUE);
6186 gtk_notebook_set_scrollable (notebook, FALSE);
6190 /* notabs notebook */
6191 gtk_notebook_set_show_tabs (notebook, FALSE);
6192 gtk_notebook_set_show_border (notebook, TRUE);
6197 gtk_notebook_set_show_tabs (notebook, FALSE);
6198 gtk_notebook_set_show_border (notebook, FALSE);
6203 gtk_notebook_set_show_tabs (notebook, TRUE);
6204 gtk_notebook_set_show_border (notebook, TRUE);
6205 gtk_notebook_set_scrollable (notebook, TRUE);
6206 if (gtk_notebook_get_n_pages (notebook) == 5)
6207 create_pages (notebook, 6, 15);
6213 if (gtk_notebook_get_n_pages (notebook) == 15)
6214 for (i = 0; i < 10; i++)
6215 gtk_notebook_remove_page (notebook, 5);
6219 notebook_popup (GtkToggleButton *button,
6220 GtkNotebook *notebook)
6222 if (gtk_toggle_button_get_active (button))
6223 gtk_notebook_popup_enable (notebook);
6225 gtk_notebook_popup_disable (notebook);
6229 create_notebook (GtkWidget *widget)
6231 static GtkWidget *window = NULL;
6235 GtkWidget *separator;
6239 static gchar *items[] =
6249 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6250 gtk_window_set_screen (GTK_WINDOW (window),
6251 gtk_widget_get_screen (widget));
6253 g_signal_connect (window, "destroy",
6254 G_CALLBACK (gtk_widget_destroyed),
6257 gtk_window_set_title (GTK_WINDOW (window), "notebook");
6258 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6260 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6261 gtk_container_add (GTK_CONTAINER (window), box1);
6263 sample_notebook = gtk_notebook_new ();
6264 g_signal_connect (sample_notebook, "switch_page",
6265 G_CALLBACK (page_switch), NULL);
6266 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
6267 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
6268 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
6270 gtk_widget_realize (sample_notebook);
6273 book_open = gdk_pixbuf_new_from_xpm_data (book_open_xpm);
6276 book_closed = gdk_pixbuf_new_from_xpm_data (book_closed_xpm);
6278 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
6280 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
6281 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
6283 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
6284 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6285 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6287 button = gtk_check_button_new_with_label ("popup menu");
6288 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
6289 g_signal_connect (button, "clicked",
6290 G_CALLBACK (notebook_popup),
6293 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
6294 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6295 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6297 label = gtk_label_new ("Notebook Style :");
6298 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
6300 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
6301 notebook_type_changed,
6303 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
6305 button = gtk_button_new_with_label ("Show all Pages");
6306 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
6307 g_signal_connect (button, "clicked",
6308 G_CALLBACK (show_all_pages), sample_notebook);
6310 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
6311 gtk_box_set_homogeneous (GTK_BOX (box2), TRUE);
6312 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6313 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6315 button = gtk_button_new_with_label ("prev");
6316 g_signal_connect_swapped (button, "clicked",
6317 G_CALLBACK (gtk_notebook_prev_page),
6319 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6321 button = gtk_button_new_with_label ("next");
6322 g_signal_connect_swapped (button, "clicked",
6323 G_CALLBACK (gtk_notebook_next_page),
6325 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6327 button = gtk_button_new_with_label ("rotate");
6328 g_signal_connect (button, "clicked",
6329 G_CALLBACK (rotate_notebook), sample_notebook);
6330 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6332 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
6333 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
6335 button = gtk_button_new_with_label ("close");
6336 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
6337 g_signal_connect_swapped (button, "clicked",
6338 G_CALLBACK (gtk_widget_destroy),
6340 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
6341 gtk_widget_set_can_default (button, TRUE);
6342 gtk_widget_grab_default (button);
6345 if (!gtk_widget_get_visible (window))
6346 gtk_widget_show_all (window);
6348 gtk_widget_destroy (window);
6356 toggle_resize (GtkWidget *widget, GtkWidget *child)
6358 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6359 GValue value = { 0, };
6360 g_value_init (&value, G_TYPE_BOOLEAN);
6361 gtk_container_child_get_property (container, child, "resize", &value);
6362 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6363 gtk_container_child_set_property (container, child, "resize", &value);
6367 toggle_shrink (GtkWidget *widget, GtkWidget *child)
6369 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6370 GValue value = { 0, };
6371 g_value_init (&value, G_TYPE_BOOLEAN);
6372 gtk_container_child_get_property (container, child, "shrink", &value);
6373 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6374 gtk_container_child_set_property (container, child, "shrink", &value);
6378 paned_props_clicked (GtkWidget *button,
6381 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
6383 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
6387 create_pane_options (GtkPaned *paned,
6388 const gchar *frame_label,
6389 const gchar *label1,
6390 const gchar *label2)
6392 GtkWidget *child1, *child2;
6397 GtkWidget *check_button;
6399 child1 = gtk_paned_get_child1 (paned);
6400 child2 = gtk_paned_get_child2 (paned);
6402 frame = gtk_frame_new (frame_label);
6403 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
6405 table = gtk_table_new (4, 2, 4);
6406 gtk_container_add (GTK_CONTAINER (frame), table);
6408 label = gtk_label_new (label1);
6409 gtk_table_attach_defaults (GTK_TABLE (table), label,
6412 check_button = gtk_check_button_new_with_label ("Resize");
6413 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6415 g_signal_connect (check_button, "toggled",
6416 G_CALLBACK (toggle_resize),
6419 check_button = gtk_check_button_new_with_label ("Shrink");
6420 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6422 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6424 g_signal_connect (check_button, "toggled",
6425 G_CALLBACK (toggle_shrink),
6428 label = gtk_label_new (label2);
6429 gtk_table_attach_defaults (GTK_TABLE (table), label,
6432 check_button = gtk_check_button_new_with_label ("Resize");
6433 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6435 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6437 g_signal_connect (check_button, "toggled",
6438 G_CALLBACK (toggle_resize),
6441 check_button = gtk_check_button_new_with_label ("Shrink");
6442 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6444 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6446 g_signal_connect (check_button, "toggled",
6447 G_CALLBACK (toggle_shrink),
6450 button = gtk_button_new_with_mnemonic ("_Properties");
6451 gtk_table_attach_defaults (GTK_TABLE (table), button,
6453 g_signal_connect (button, "clicked",
6454 G_CALLBACK (paned_props_clicked),
6461 create_panes (GtkWidget *widget)
6463 static GtkWidget *window = NULL;
6472 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6474 gtk_window_set_screen (GTK_WINDOW (window),
6475 gtk_widget_get_screen (widget));
6477 g_signal_connect (window, "destroy",
6478 G_CALLBACK (gtk_widget_destroyed),
6481 gtk_window_set_title (GTK_WINDOW (window), "Panes");
6482 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6484 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6485 gtk_container_add (GTK_CONTAINER (window), vbox);
6487 vpaned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6488 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
6489 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
6491 hpaned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6492 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
6494 frame = gtk_frame_new (NULL);
6495 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6496 gtk_widget_set_size_request (frame, 60, 60);
6497 gtk_paned_add1 (GTK_PANED (hpaned), frame);
6499 button = gtk_button_new_with_label ("Hi there");
6500 gtk_container_add (GTK_CONTAINER(frame), button);
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, 80, 60);
6505 gtk_paned_add2 (GTK_PANED (hpaned), frame);
6507 frame = gtk_frame_new (NULL);
6508 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6509 gtk_widget_set_size_request (frame, 60, 80);
6510 gtk_paned_add2 (GTK_PANED (vpaned), frame);
6512 /* Now create toggle buttons to control sizing */
6514 gtk_box_pack_start (GTK_BOX (vbox),
6515 create_pane_options (GTK_PANED (hpaned),
6521 gtk_box_pack_start (GTK_BOX (vbox),
6522 create_pane_options (GTK_PANED (vpaned),
6528 gtk_widget_show_all (vbox);
6531 if (!gtk_widget_get_visible (window))
6532 gtk_widget_show (window);
6534 gtk_widget_destroy (window);
6538 * Paned keyboard navigation
6542 paned_keyboard_window1 (GtkWidget *widget)
6565 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6566 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
6567 gtk_window_set_screen (GTK_WINDOW (window1),
6568 gtk_widget_get_screen (widget));
6570 hpaned1 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6571 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
6573 frame1 = gtk_frame_new (NULL);
6574 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
6575 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
6577 vbox1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6578 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
6580 button7 = gtk_button_new_with_label ("button7");
6581 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
6583 button8 = gtk_button_new_with_label ("button8");
6584 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
6586 button9 = gtk_button_new_with_label ("button9");
6587 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
6589 vpaned1 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6590 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
6592 frame2 = gtk_frame_new (NULL);
6593 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
6594 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
6596 frame5 = gtk_frame_new (NULL);
6597 gtk_container_add (GTK_CONTAINER (frame2), frame5);
6599 hbox1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6600 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
6602 button5 = gtk_button_new_with_label ("button5");
6603 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
6605 button6 = gtk_button_new_with_label ("button6");
6606 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
6608 frame3 = gtk_frame_new (NULL);
6609 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
6610 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
6612 frame4 = gtk_frame_new ("Buttons");
6613 gtk_container_add (GTK_CONTAINER (frame3), frame4);
6614 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
6616 table1 = gtk_table_new (2, 2, FALSE);
6617 gtk_container_add (GTK_CONTAINER (frame4), table1);
6618 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
6620 button1 = gtk_button_new_with_label ("button1");
6621 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
6622 (GtkAttachOptions) (GTK_FILL),
6623 (GtkAttachOptions) (0), 0, 0);
6625 button2 = gtk_button_new_with_label ("button2");
6626 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
6627 (GtkAttachOptions) (GTK_FILL),
6628 (GtkAttachOptions) (0), 0, 0);
6630 button3 = gtk_button_new_with_label ("button3");
6631 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
6632 (GtkAttachOptions) (GTK_FILL),
6633 (GtkAttachOptions) (0), 0, 0);
6635 button4 = gtk_button_new_with_label ("button4");
6636 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
6637 (GtkAttachOptions) (GTK_FILL),
6638 (GtkAttachOptions) (0), 0, 0);
6644 paned_keyboard_window2 (GtkWidget *widget)
6649 GtkWidget *button13;
6653 GtkWidget *button12;
6655 GtkWidget *button11;
6656 GtkWidget *button10;
6658 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6659 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
6661 gtk_window_set_screen (GTK_WINDOW (window2),
6662 gtk_widget_get_screen (widget));
6664 hpaned2 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6665 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
6667 frame6 = gtk_frame_new (NULL);
6668 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
6669 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
6671 button13 = gtk_button_new_with_label ("button13");
6672 gtk_container_add (GTK_CONTAINER (frame6), button13);
6674 hbox2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6675 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
6677 vpaned2 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6678 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
6680 frame7 = gtk_frame_new (NULL);
6681 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
6682 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
6684 button12 = gtk_button_new_with_label ("button12");
6685 gtk_container_add (GTK_CONTAINER (frame7), button12);
6687 frame8 = gtk_frame_new (NULL);
6688 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
6689 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
6691 button11 = gtk_button_new_with_label ("button11");
6692 gtk_container_add (GTK_CONTAINER (frame8), button11);
6694 button10 = gtk_button_new_with_label ("button10");
6695 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
6701 paned_keyboard_window3 (GtkWidget *widget)
6708 GtkWidget *button14;
6711 GtkWidget *button15;
6714 GtkWidget *button16;
6716 GtkWidget *button17;
6718 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6719 g_object_set_data (G_OBJECT (window3), "window3", window3);
6720 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
6722 gtk_window_set_screen (GTK_WINDOW (window3),
6723 gtk_widget_get_screen (widget));
6726 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6727 gtk_container_add (GTK_CONTAINER (window3), vbox2);
6729 label1 = gtk_label_new ("Three panes nested inside each other");
6730 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
6732 hpaned3 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6733 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
6735 frame9 = gtk_frame_new (NULL);
6736 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
6737 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
6739 button14 = gtk_button_new_with_label ("button14");
6740 gtk_container_add (GTK_CONTAINER (frame9), button14);
6742 hpaned4 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6743 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
6745 frame10 = gtk_frame_new (NULL);
6746 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
6747 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
6749 button15 = gtk_button_new_with_label ("button15");
6750 gtk_container_add (GTK_CONTAINER (frame10), button15);
6752 hpaned5 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6753 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
6755 frame11 = gtk_frame_new (NULL);
6756 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
6757 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
6759 button16 = gtk_button_new_with_label ("button16");
6760 gtk_container_add (GTK_CONTAINER (frame11), button16);
6762 frame12 = gtk_frame_new (NULL);
6763 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
6764 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
6766 button17 = gtk_button_new_with_label ("button17");
6767 gtk_container_add (GTK_CONTAINER (frame12), button17);
6773 paned_keyboard_window4 (GtkWidget *widget)
6780 GtkWidget *button19;
6781 GtkWidget *button18;
6784 GtkWidget *button21;
6785 GtkWidget *button20;
6787 GtkWidget *button23;
6788 GtkWidget *button22;
6790 GtkWidget *button25;
6791 GtkWidget *button24;
6793 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6794 g_object_set_data (G_OBJECT (window4), "window4", window4);
6795 gtk_window_set_title (GTK_WINDOW (window4), "window4");
6797 gtk_window_set_screen (GTK_WINDOW (window4),
6798 gtk_widget_get_screen (widget));
6800 vbox3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6801 gtk_container_add (GTK_CONTAINER (window4), vbox3);
6803 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
6804 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
6805 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
6807 hpaned6 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6808 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
6810 vpaned3 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6811 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
6813 button19 = gtk_button_new_with_label ("button19");
6814 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
6816 button18 = gtk_button_new_with_label ("button18");
6817 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
6819 hbox3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6820 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
6822 vpaned4 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6823 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
6825 button21 = gtk_button_new_with_label ("button21");
6826 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
6828 button20 = gtk_button_new_with_label ("button20");
6829 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
6831 vpaned5 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6832 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
6834 button23 = gtk_button_new_with_label ("button23");
6835 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
6837 button22 = gtk_button_new_with_label ("button22");
6838 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
6840 vpaned6 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6841 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
6843 button25 = gtk_button_new_with_label ("button25");
6844 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
6846 button24 = gtk_button_new_with_label ("button24");
6847 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
6853 create_paned_keyboard_navigation (GtkWidget *widget)
6855 static GtkWidget *window1 = NULL;
6856 static GtkWidget *window2 = NULL;
6857 static GtkWidget *window3 = NULL;
6858 static GtkWidget *window4 = NULL;
6861 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
6863 gtk_widget_destroy (window1);
6864 gtk_widget_destroy (window2);
6865 gtk_widget_destroy (window3);
6866 gtk_widget_destroy (window4);
6871 window1 = paned_keyboard_window1 (widget);
6872 g_signal_connect (window1, "destroy",
6873 G_CALLBACK (gtk_widget_destroyed),
6879 window2 = paned_keyboard_window2 (widget);
6880 g_signal_connect (window2, "destroy",
6881 G_CALLBACK (gtk_widget_destroyed),
6887 window3 = paned_keyboard_window3 (widget);
6888 g_signal_connect (window3, "destroy",
6889 G_CALLBACK (gtk_widget_destroyed),
6895 window4 = paned_keyboard_window4 (widget);
6896 g_signal_connect (window4, "destroy",
6897 G_CALLBACK (gtk_widget_destroyed),
6901 if (gtk_widget_get_visible (window1))
6902 gtk_widget_destroy (GTK_WIDGET (window1));
6904 gtk_widget_show_all (GTK_WIDGET (window1));
6906 if (gtk_widget_get_visible (window2))
6907 gtk_widget_destroy (GTK_WIDGET (window2));
6909 gtk_widget_show_all (GTK_WIDGET (window2));
6911 if (gtk_widget_get_visible (window3))
6912 gtk_widget_destroy (GTK_WIDGET (window3));
6914 gtk_widget_show_all (GTK_WIDGET (window3));
6916 if (gtk_widget_get_visible (window4))
6917 gtk_widget_destroy (GTK_WIDGET (window4));
6919 gtk_widget_show_all (GTK_WIDGET (window4));
6927 typedef struct _cursoroffset {gint x,y;} CursorOffset;
6930 shape_pressed (GtkWidget *widget, GdkEventButton *event)
6934 /* ignore double and triple click */
6935 if (event->type != GDK_BUTTON_PRESS)
6938 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
6939 p->x = (int) event->x;
6940 p->y = (int) event->y;
6942 gtk_grab_add (widget);
6943 gdk_device_grab (gdk_event_get_device ((GdkEvent*)event),
6944 gtk_widget_get_window (widget),
6947 GDK_BUTTON_RELEASE_MASK |
6948 GDK_BUTTON_MOTION_MASK |
6949 GDK_POINTER_MOTION_HINT_MASK,
6955 shape_released (GtkWidget *widget,
6956 GdkEventButton *event)
6958 gtk_grab_remove (widget);
6959 gdk_device_ungrab (gdk_event_get_device ((GdkEvent*)event), event->time);
6963 shape_motion (GtkWidget *widget,
6964 GdkEventMotion *event)
6968 GdkModifierType mask;
6970 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
6973 * Can't use event->x / event->y here
6974 * because I need absolute coordinates.
6976 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
6977 gtk_window_move (GTK_WINDOW (widget), xp - p->x, yp - p->y);
6981 shape_create_icon (GdkScreen *screen,
6992 CursorOffset* icon_pos;
6993 cairo_surface_t *mask;
6994 cairo_region_t *mask_region;
6999 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
7001 window = gtk_window_new (window_type);
7002 gtk_window_set_screen (GTK_WINDOW (window), screen);
7004 fixed = gtk_fixed_new ();
7005 gtk_widget_set_size_request (fixed, 100, 100);
7006 gtk_container_add (GTK_CONTAINER (window), fixed);
7007 gtk_widget_show (fixed);
7009 gtk_widget_set_events (window,
7010 gtk_widget_get_events (window) |
7011 GDK_BUTTON_MOTION_MASK |
7012 GDK_POINTER_MOTION_HINT_MASK |
7013 GDK_BUTTON_PRESS_MASK);
7015 gtk_widget_realize (window);
7017 pixbuf = gdk_pixbuf_new_from_file (xpm_file, NULL);
7018 g_assert (pixbuf); /* FIXME: error handling */
7020 mask = cairo_image_surface_create (CAIRO_FORMAT_A1,
7021 gdk_pixbuf_get_width (pixbuf),
7022 gdk_pixbuf_get_height (pixbuf));
7023 cr = cairo_create (mask);
7024 gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
7028 mask_region = gdk_cairo_region_create_from_surface (mask);
7030 cairo_region_translate (mask_region, px, py);
7032 image = gtk_image_new_from_pixbuf (pixbuf);
7033 gtk_fixed_put (GTK_FIXED (fixed), image, px,py);
7034 gtk_widget_show (image);
7036 gtk_widget_shape_combine_region (window, mask_region);
7038 cairo_region_destroy (mask_region);
7039 cairo_surface_destroy (mask);
7040 g_object_unref (pixbuf);
7042 g_signal_connect (window, "button_press_event",
7043 G_CALLBACK (shape_pressed), NULL);
7044 g_signal_connect (window, "button_release_event",
7045 G_CALLBACK (shape_released), NULL);
7046 g_signal_connect (window, "motion_notify_event",
7047 G_CALLBACK (shape_motion), NULL);
7049 icon_pos = g_new (CursorOffset, 1);
7050 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
7052 gtk_window_move (GTK_WINDOW (window), x, y);
7053 gtk_widget_show (window);
7059 create_shapes (GtkWidget *widget)
7061 /* Variables used by the Drag/Drop and Shape Window demos */
7062 static GtkWidget *modeller = NULL;
7063 static GtkWidget *sheets = NULL;
7064 static GtkWidget *rings = NULL;
7065 static GtkWidget *with_region = NULL;
7066 GdkScreen *screen = gtk_widget_get_screen (widget);
7068 if (!(file_exists ("Modeller.xpm") &&
7069 file_exists ("FilesQueue.xpm") &&
7070 file_exists ("3DRings.xpm")))
7076 modeller = shape_create_icon (screen, "Modeller.xpm",
7077 440, 140, 0,0, GTK_WINDOW_POPUP);
7079 g_signal_connect (modeller, "destroy",
7080 G_CALLBACK (gtk_widget_destroyed),
7084 gtk_widget_destroy (modeller);
7088 sheets = shape_create_icon (screen, "FilesQueue.xpm",
7089 580, 170, 0,0, GTK_WINDOW_POPUP);
7091 g_signal_connect (sheets, "destroy",
7092 G_CALLBACK (gtk_widget_destroyed),
7097 gtk_widget_destroy (sheets);
7101 rings = shape_create_icon (screen, "3DRings.xpm",
7102 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7104 g_signal_connect (rings, "destroy",
7105 G_CALLBACK (gtk_widget_destroyed),
7109 gtk_widget_destroy (rings);
7113 cairo_region_t *region;
7116 with_region = shape_create_icon (screen, "3DRings.xpm",
7117 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7119 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
7121 g_signal_connect (with_region, "destroy",
7122 G_CALLBACK (gtk_widget_destroyed),
7125 /* reset shape from mask to a region */
7128 region = cairo_region_create ();
7140 cairo_region_union_rectangle (region, &rect);
7148 gdk_window_shape_combine_region (gtk_widget_get_window (with_region),
7153 gtk_widget_destroy (with_region);
7161 create_wmhints (GtkWidget *widget)
7163 static GtkWidget *window = NULL;
7165 GtkWidget *separator;
7169 GdkWindow *gdk_window;
7175 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7177 gtk_window_set_screen (GTK_WINDOW (window),
7178 gtk_widget_get_screen (widget));
7180 g_signal_connect (window, "destroy",
7181 G_CALLBACK (gtk_widget_destroyed),
7184 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
7185 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7187 gtk_widget_realize (window);
7189 gdk_window = gtk_widget_get_window (window);
7191 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
7192 list = g_list_prepend (NULL, pixbuf);
7194 gdk_window_set_icon_list (gdk_window, list);
7197 g_object_unref (pixbuf);
7199 gdk_window_set_icon_name (gdk_window, "WMHints Test Icon");
7201 gdk_window_set_decorations (gdk_window, GDK_DECOR_ALL | GDK_DECOR_MENU);
7202 gdk_window_set_functions (gdk_window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
7204 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7205 gtk_container_add (GTK_CONTAINER (window), box1);
7206 gtk_widget_show (box1);
7208 label = gtk_label_new ("Try iconizing me!");
7209 gtk_widget_set_size_request (label, 150, 50);
7210 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
7211 gtk_widget_show (label);
7214 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
7215 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
7216 gtk_widget_show (separator);
7219 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
7220 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7221 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7222 gtk_widget_show (box2);
7225 button = gtk_button_new_with_label ("close");
7227 g_signal_connect_swapped (button, "clicked",
7228 G_CALLBACK (gtk_widget_destroy),
7231 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7232 gtk_widget_set_can_default (button, TRUE);
7233 gtk_widget_grab_default (button);
7234 gtk_widget_show (button);
7237 if (!gtk_widget_get_visible (window))
7238 gtk_widget_show (window);
7240 gtk_widget_destroy (window);
7245 * Window state tracking
7249 window_state_callback (GtkWidget *widget,
7250 GdkEventWindowState *event,
7253 GtkWidget *label = data;
7256 msg = g_strconcat (gtk_window_get_title (GTK_WINDOW (widget)), ": ",
7257 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
7258 "withdrawn" : "not withdrawn", ", ",
7259 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
7260 "iconified" : "not iconified", ", ",
7261 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
7262 "sticky" : "not sticky", ", ",
7263 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
7264 "maximized" : "not maximized", ", ",
7265 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
7266 "fullscreen" : "not fullscreen",
7267 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
7268 "above" : "not above", ", ",
7269 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
7270 "below" : "not below", ", ",
7273 gtk_label_set_text (GTK_LABEL (label), msg);
7281 tracking_label (GtkWidget *window)
7287 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
7289 g_signal_connect_object (hbox,
7291 G_CALLBACK (gtk_widget_destroy),
7295 label = gtk_label_new ("<no window state events received>");
7296 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
7297 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
7299 g_signal_connect (window,
7300 "window_state_event",
7301 G_CALLBACK (window_state_callback),
7304 button = gtk_button_new_with_label ("Deiconify");
7305 g_signal_connect_object (button,
7307 G_CALLBACK (gtk_window_deiconify),
7310 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7312 button = gtk_button_new_with_label ("Iconify");
7313 g_signal_connect_object (button,
7315 G_CALLBACK (gtk_window_iconify),
7318 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7320 button = gtk_button_new_with_label ("Fullscreen");
7321 g_signal_connect_object (button,
7323 G_CALLBACK (gtk_window_fullscreen),
7326 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7328 button = gtk_button_new_with_label ("Unfullscreen");
7329 g_signal_connect_object (button,
7331 G_CALLBACK (gtk_window_unfullscreen),
7334 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7336 button = gtk_button_new_with_label ("Present");
7337 g_signal_connect_object (button,
7339 G_CALLBACK (gtk_window_present),
7342 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7344 button = gtk_button_new_with_label ("Show");
7345 g_signal_connect_object (button,
7347 G_CALLBACK (gtk_widget_show),
7350 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7352 gtk_widget_show_all (hbox);
7358 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
7360 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7362 gtk_window_set_keep_above (GTK_WINDOW (data),
7363 gtk_toggle_button_get_active (togglebutton));
7365 if (gtk_toggle_button_get_active (togglebutton))
7366 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7370 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
7372 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7374 gtk_window_set_keep_below (GTK_WINDOW (data),
7375 gtk_toggle_button_get_active (togglebutton));
7377 if (gtk_toggle_button_get_active (togglebutton))
7378 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7383 get_state_controls (GtkWidget *window)
7387 GtkWidget *button_above;
7388 GtkWidget *button_below;
7390 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7392 button = gtk_button_new_with_label ("Stick");
7393 g_signal_connect_object (button,
7395 G_CALLBACK (gtk_window_stick),
7398 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7400 button = gtk_button_new_with_label ("Unstick");
7401 g_signal_connect_object (button,
7403 G_CALLBACK (gtk_window_unstick),
7406 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7408 button = gtk_button_new_with_label ("Maximize");
7409 g_signal_connect_object (button,
7411 G_CALLBACK (gtk_window_maximize),
7414 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7416 button = gtk_button_new_with_label ("Unmaximize");
7417 g_signal_connect_object (button,
7419 G_CALLBACK (gtk_window_unmaximize),
7422 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7424 button = gtk_button_new_with_label ("Iconify");
7425 g_signal_connect_object (button,
7427 G_CALLBACK (gtk_window_iconify),
7430 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7432 button = gtk_button_new_with_label ("Fullscreen");
7433 g_signal_connect_object (button,
7435 G_CALLBACK (gtk_window_fullscreen),
7438 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7440 button = gtk_button_new_with_label ("Unfullscreen");
7441 g_signal_connect_object (button,
7443 G_CALLBACK (gtk_window_unfullscreen),
7446 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7448 button_above = gtk_toggle_button_new_with_label ("Keep above");
7449 g_signal_connect (button_above,
7451 G_CALLBACK (keep_window_above),
7453 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
7455 button_below = gtk_toggle_button_new_with_label ("Keep below");
7456 g_signal_connect (button_below,
7458 G_CALLBACK (keep_window_below),
7460 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
7462 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
7463 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
7465 button = gtk_button_new_with_label ("Hide (withdraw)");
7466 g_signal_connect_object (button,
7468 G_CALLBACK (gtk_widget_hide),
7471 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7473 gtk_widget_show_all (vbox);
7479 create_window_states (GtkWidget *widget)
7481 static GtkWidget *window = NULL;
7484 GtkWidget *iconified;
7486 GtkWidget *controls;
7490 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7491 gtk_window_set_screen (GTK_WINDOW (window),
7492 gtk_widget_get_screen (widget));
7494 g_signal_connect (window, "destroy",
7495 G_CALLBACK (gtk_widget_destroyed),
7498 gtk_window_set_title (GTK_WINDOW (window), "Window states");
7500 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7501 gtk_container_add (GTK_CONTAINER (window), box1);
7503 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7505 gtk_window_set_screen (GTK_WINDOW (iconified),
7506 gtk_widget_get_screen (widget));
7508 g_signal_connect_object (iconified, "destroy",
7509 G_CALLBACK (gtk_widget_destroy),
7512 gtk_window_iconify (GTK_WINDOW (iconified));
7513 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
7514 controls = get_state_controls (iconified);
7515 gtk_container_add (GTK_CONTAINER (iconified), controls);
7517 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7519 gtk_window_set_screen (GTK_WINDOW (normal),
7520 gtk_widget_get_screen (widget));
7522 g_signal_connect_object (normal, "destroy",
7523 G_CALLBACK (gtk_widget_destroy),
7527 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
7528 controls = get_state_controls (normal);
7529 gtk_container_add (GTK_CONTAINER (normal), controls);
7531 label = tracking_label (iconified);
7532 gtk_container_add (GTK_CONTAINER (box1), label);
7534 label = tracking_label (normal);
7535 gtk_container_add (GTK_CONTAINER (box1), label);
7537 gtk_widget_show_all (iconified);
7538 gtk_widget_show_all (normal);
7539 gtk_widget_show_all (box1);
7542 if (!gtk_widget_get_visible (window))
7543 gtk_widget_show (window);
7545 gtk_widget_destroy (window);
7553 configure_event_callback (GtkWidget *widget,
7554 GdkEventConfigure *event,
7557 GtkWidget *label = data;
7561 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
7563 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
7565 event->x, event->y, event->width, event->height,
7568 gtk_label_set_text (GTK_LABEL (label), msg);
7576 get_ints (GtkWidget *window,
7583 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
7584 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
7586 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
7587 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
7591 set_size_callback (GtkWidget *widget,
7596 get_ints (data, &w, &h);
7598 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
7602 unset_default_size_callback (GtkWidget *widget,
7605 gtk_window_set_default_size (g_object_get_data (data, "target"),
7610 set_default_size_callback (GtkWidget *widget,
7615 get_ints (data, &w, &h);
7617 gtk_window_set_default_size (g_object_get_data (data, "target"),
7622 unset_size_request_callback (GtkWidget *widget,
7625 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7630 set_size_request_callback (GtkWidget *widget,
7635 get_ints (data, &w, &h);
7637 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7642 set_location_callback (GtkWidget *widget,
7647 get_ints (data, &x, &y);
7649 gtk_window_move (g_object_get_data (data, "target"), x, y);
7653 move_to_position_callback (GtkWidget *widget,
7659 window = g_object_get_data (data, "target");
7661 gtk_window_get_position (window, &x, &y);
7663 gtk_window_move (window, x, y);
7667 set_geometry_callback (GtkWidget *entry,
7673 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
7675 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
7677 if (!gtk_window_parse_geometry (target, text))
7678 g_print ("Bad geometry string '%s'\n", text);
7684 resizable_callback (GtkWidget *widget,
7687 g_object_set (g_object_get_data (data, "target"),
7688 "resizable", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)),
7693 gravity_selected (GtkWidget *widget,
7696 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
7697 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GDK_GRAVITY_NORTH_WEST);
7701 pos_selected (GtkWidget *widget,
7704 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
7705 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GTK_WIN_POS_NONE);
7709 move_gravity_window_to_current_position (GtkWidget *widget,
7715 window = GTK_WINDOW (data);
7717 gtk_window_get_position (window, &x, &y);
7719 gtk_window_move (window, x, y);
7723 get_screen_corner (GtkWindow *window,
7728 GdkScreen * screen = gtk_window_get_screen (window);
7730 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
7732 switch (gtk_window_get_gravity (window))
7734 case GDK_GRAVITY_SOUTH_EAST:
7735 *x = gdk_screen_get_width (screen) - w;
7736 *y = gdk_screen_get_height (screen) - h;
7739 case GDK_GRAVITY_NORTH_EAST:
7740 *x = gdk_screen_get_width (screen) - w;
7744 case GDK_GRAVITY_SOUTH_WEST:
7746 *y = gdk_screen_get_height (screen) - h;
7749 case GDK_GRAVITY_NORTH_WEST:
7754 case GDK_GRAVITY_SOUTH:
7755 *x = (gdk_screen_get_width (screen) - w) / 2;
7756 *y = gdk_screen_get_height (screen) - h;
7759 case GDK_GRAVITY_NORTH:
7760 *x = (gdk_screen_get_width (screen) - w) / 2;
7764 case GDK_GRAVITY_WEST:
7766 *y = (gdk_screen_get_height (screen) - h) / 2;
7769 case GDK_GRAVITY_EAST:
7770 *x = gdk_screen_get_width (screen) - w;
7771 *y = (gdk_screen_get_height (screen) - h) / 2;
7774 case GDK_GRAVITY_CENTER:
7775 *x = (gdk_screen_get_width (screen) - w) / 2;
7776 *y = (gdk_screen_get_height (screen) - h) / 2;
7779 case GDK_GRAVITY_STATIC:
7780 /* pick some random numbers */
7786 g_assert_not_reached ();
7792 move_gravity_window_to_starting_position (GtkWidget *widget,
7798 window = GTK_WINDOW (data);
7800 get_screen_corner (window,
7803 gtk_window_move (window, x, y);
7807 make_gravity_window (GtkWidget *destroy_with,
7816 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7818 gtk_window_set_screen (GTK_WINDOW (window),
7819 gtk_widget_get_screen (destroy_with));
7821 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7822 gtk_widget_show (vbox);
7824 gtk_container_add (GTK_CONTAINER (window), vbox);
7825 gtk_window_set_title (GTK_WINDOW (window), title);
7826 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
7828 g_signal_connect_object (destroy_with,
7830 G_CALLBACK (gtk_widget_destroy),
7835 button = gtk_button_new_with_mnemonic ("_Move to current position");
7837 g_signal_connect (button, "clicked",
7838 G_CALLBACK (move_gravity_window_to_current_position),
7841 gtk_container_add (GTK_CONTAINER (vbox), button);
7842 gtk_widget_show (button);
7844 button = gtk_button_new_with_mnemonic ("Move to _starting position");
7846 g_signal_connect (button, "clicked",
7847 G_CALLBACK (move_gravity_window_to_starting_position),
7850 gtk_container_add (GTK_CONTAINER (vbox), button);
7851 gtk_widget_show (button);
7853 /* Pretend this is the result of --geometry.
7854 * DO NOT COPY THIS CODE unless you are setting --geometry results,
7855 * and in that case you probably should just use gtk_window_parse_geometry().
7856 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
7857 * you are parsing --geometry or equivalent.
7859 gtk_window_set_geometry_hints (GTK_WINDOW (window),
7863 gtk_window_set_default_size (GTK_WINDOW (window),
7866 get_screen_corner (GTK_WINDOW (window), &x, &y);
7868 gtk_window_move (GTK_WINDOW (window),
7875 do_gravity_test (GtkWidget *widget,
7878 GtkWidget *destroy_with = data;
7881 /* We put a window at each gravity point on the screen. */
7882 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
7884 gtk_widget_show (window);
7886 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
7888 gtk_widget_show (window);
7890 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
7892 gtk_widget_show (window);
7894 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
7896 gtk_widget_show (window);
7898 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
7900 gtk_widget_show (window);
7902 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
7904 gtk_widget_show (window);
7907 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
7909 gtk_widget_show (window);
7912 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
7914 gtk_widget_show (window);
7916 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
7918 gtk_widget_show (window);
7920 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
7922 gtk_widget_show (window);
7926 window_controls (GtkWidget *window)
7928 GtkWidget *control_window;
7933 GtkAdjustment *adjustment;
7938 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7940 gtk_window_set_screen (GTK_WINDOW (control_window),
7941 gtk_widget_get_screen (window));
7943 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
7945 g_object_set_data (G_OBJECT (control_window),
7949 g_signal_connect_object (control_window,
7951 G_CALLBACK (gtk_widget_destroy),
7955 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
7957 gtk_container_add (GTK_CONTAINER (control_window), vbox);
7959 label = gtk_label_new ("<no configure events>");
7960 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
7962 g_signal_connect (window,
7964 G_CALLBACK (configure_event_callback),
7967 adjustment = gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0, 5.0, 0.0);
7968 spin = gtk_spin_button_new (adjustment, 0, 0);
7970 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
7972 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
7974 adjustment = gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0, 5.0, 0.0);
7975 spin = gtk_spin_button_new (adjustment, 0, 0);
7977 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
7979 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
7981 entry = gtk_entry_new ();
7982 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
7984 g_signal_connect (entry, "changed",
7985 G_CALLBACK (set_geometry_callback),
7988 button = gtk_button_new_with_label ("Show gravity test windows");
7989 g_signal_connect_swapped (button,
7991 G_CALLBACK (do_gravity_test),
7993 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7995 button = gtk_button_new_with_label ("Reshow with initial size");
7996 g_signal_connect_object (button,
7998 G_CALLBACK (gtk_window_reshow_with_initial_size),
8001 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8003 button = gtk_button_new_with_label ("Queue resize");
8004 g_signal_connect_object (button,
8006 G_CALLBACK (gtk_widget_queue_resize),
8009 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8011 button = gtk_button_new_with_label ("Resize");
8012 g_signal_connect (button,
8014 G_CALLBACK (set_size_callback),
8016 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8018 button = gtk_button_new_with_label ("Set default size");
8019 g_signal_connect (button,
8021 G_CALLBACK (set_default_size_callback),
8023 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8025 button = gtk_button_new_with_label ("Unset default size");
8026 g_signal_connect (button,
8028 G_CALLBACK (unset_default_size_callback),
8030 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8032 button = gtk_button_new_with_label ("Set size request");
8033 g_signal_connect (button,
8035 G_CALLBACK (set_size_request_callback),
8037 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8039 button = gtk_button_new_with_label ("Unset size request");
8040 g_signal_connect (button,
8042 G_CALLBACK (unset_size_request_callback),
8044 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8046 button = gtk_button_new_with_label ("Move");
8047 g_signal_connect (button,
8049 G_CALLBACK (set_location_callback),
8051 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8053 button = gtk_button_new_with_label ("Move to current position");
8054 g_signal_connect (button,
8056 G_CALLBACK (move_to_position_callback),
8058 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8060 button = gtk_check_button_new_with_label ("Allow resize");
8061 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
8062 g_signal_connect (button,
8064 G_CALLBACK (resizable_callback),
8066 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8068 button = gtk_button_new_with_mnemonic ("_Show");
8069 g_signal_connect_object (button,
8071 G_CALLBACK (gtk_widget_show),
8074 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8076 button = gtk_button_new_with_mnemonic ("_Hide");
8077 g_signal_connect_object (button,
8079 G_CALLBACK (gtk_widget_hide),
8082 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8084 om = gtk_combo_box_text_new ();
8088 static gchar *names[] = {
8089 "GDK_GRAVITY_NORTH_WEST",
8090 "GDK_GRAVITY_NORTH",
8091 "GDK_GRAVITY_NORTH_EAST",
8093 "GDK_GRAVITY_CENTER",
8095 "GDK_GRAVITY_SOUTH_WEST",
8096 "GDK_GRAVITY_SOUTH",
8097 "GDK_GRAVITY_SOUTH_EAST",
8098 "GDK_GRAVITY_STATIC",
8102 g_assert (names[i]);
8103 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (om), names[i]);
8108 g_signal_connect (om,
8110 G_CALLBACK (gravity_selected),
8113 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8116 om = gtk_combo_box_text_new ();
8120 static gchar *names[] = {
8122 "GTK_WIN_POS_CENTER",
8123 "GTK_WIN_POS_MOUSE",
8124 "GTK_WIN_POS_CENTER_ALWAYS",
8125 "GTK_WIN_POS_CENTER_ON_PARENT",
8129 g_assert (names[i]);
8130 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (om), names[i]);
8135 g_signal_connect (om,
8137 G_CALLBACK (pos_selected),
8140 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8142 gtk_widget_show_all (vbox);
8144 return control_window;
8148 create_window_sizing (GtkWidget *widget)
8150 static GtkWidget *window = NULL;
8151 static GtkWidget *target_window = NULL;
8157 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8158 gtk_window_set_screen (GTK_WINDOW (target_window),
8159 gtk_widget_get_screen (widget));
8160 label = gtk_label_new (NULL);
8161 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");
8162 gtk_container_add (GTK_CONTAINER (target_window), label);
8163 gtk_widget_show (label);
8165 g_signal_connect (target_window, "destroy",
8166 G_CALLBACK (gtk_widget_destroyed),
8169 window = window_controls (target_window);
8171 g_signal_connect (window, "destroy",
8172 G_CALLBACK (gtk_widget_destroyed),
8175 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
8178 /* don't show target window by default, we want to allow testing
8179 * of behavior on first show.
8182 if (!gtk_widget_get_visible (window))
8183 gtk_widget_show (window);
8185 gtk_widget_destroy (window);
8192 typedef struct _ProgressData {
8195 GtkWidget *block_spin;
8196 GtkWidget *x_align_spin;
8197 GtkWidget *y_align_spin;
8198 GtkWidget *step_spin;
8199 GtkWidget *act_blocks_spin;
8210 progress_timeout (gpointer data)
8212 ProgressData *pdata = data;
8216 if (pdata->activity)
8218 gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar));
8220 text = g_strdup_printf ("%s", "???");
8224 new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;
8227 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);
8229 text = g_strdup_printf ("%.0f%%", 100 * new_val);
8232 gtk_label_set_text (GTK_LABEL (pdata->label), text);
8239 destroy_progress (GtkWidget *widget,
8240 ProgressData **pdata)
8242 if ((*pdata)->timer)
8244 g_source_remove ((*pdata)->timer);
8245 (*pdata)->timer = 0;
8247 (*pdata)->window = NULL;
8253 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
8255 ProgressData *pdata;
8258 pdata = (ProgressData *) data;
8260 if (!gtk_widget_get_mapped (widget))
8263 i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8265 if (i == 0 || i == 1)
8266 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_HORIZONTAL);
8268 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_VERTICAL);
8270 if (i == 1 || i == 2)
8271 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), TRUE);
8273 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), FALSE);
8277 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
8281 active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8282 gtk_progress_bar_set_show_text (GTK_PROGRESS_BAR (pdata->pbar), active);
8286 progressbar_toggle_ellipsize (GtkWidget *widget,
8289 ProgressData *pdata = data;
8290 if (gtk_widget_is_drawable (widget))
8292 gint i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8293 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar), i);
8298 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
8300 pdata->activity = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8304 toggle_running (GtkWidget *widget, ProgressData *pdata)
8306 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
8308 if (pdata->timer == 0)
8309 pdata->timer = g_timeout_add (100, (GSourceFunc)progress_timeout, pdata);
8313 if (pdata->timer != 0)
8315 g_source_remove (pdata->timer);
8322 entry_changed (GtkWidget *widget, ProgressData *pdata)
8324 gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar),
8325 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
8329 create_progress_bar (GtkWidget *widget)
8331 GtkWidget *action_area, *content_area;
8341 static ProgressData *pdata = NULL;
8343 static gchar *items1[] =
8351 static char *ellipsize_items[] = {
8352 "None", // PANGO_ELLIPSIZE_NONE,
8353 "Start", // PANGO_ELLIPSIZE_START,
8354 "Middle", // PANGO_ELLIPSIZE_MIDDLE,
8355 "End", // PANGO_ELLIPSIZE_END
8359 pdata = g_new0 (ProgressData, 1);
8363 pdata->window = gtk_dialog_new ();
8365 gtk_window_set_screen (GTK_WINDOW (pdata->window),
8366 gtk_widget_get_screen (widget));
8368 gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);
8370 g_signal_connect (pdata->window, "destroy",
8371 G_CALLBACK (destroy_progress),
8375 content_area = gtk_dialog_get_content_area (GTK_DIALOG (pdata->window));
8376 action_area = gtk_dialog_get_action_area (GTK_DIALOG (pdata->window));
8378 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
8379 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
8381 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8382 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
8383 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, TRUE, 0);
8385 frame = gtk_frame_new ("Progress");
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 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8392 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8394 pdata->pbar = gtk_progress_bar_new ();
8395 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar),
8396 PANGO_ELLIPSIZE_MIDDLE);
8398 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
8400 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8401 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8403 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
8404 gtk_container_add (GTK_CONTAINER (align), hbox);
8405 label = gtk_label_new ("Label updated by user :");
8406 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8407 pdata->label = gtk_label_new ("");
8408 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
8410 frame = gtk_frame_new ("Options");
8411 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8413 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8414 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8416 tab = gtk_table_new (7, 2, FALSE);
8417 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
8419 label = gtk_label_new ("Orientation :");
8420 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
8421 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8423 gtk_widget_set_halign (label, GTK_ALIGN_START);
8424 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
8426 pdata->omenu1 = build_option_menu (items1, 4, 0,
8427 progressbar_toggle_orientation,
8429 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8430 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
8431 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8433 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
8435 check = gtk_check_button_new_with_label ("Running");
8436 g_signal_connect (check, "toggled",
8437 G_CALLBACK (toggle_running),
8439 gtk_table_attach (GTK_TABLE (tab), check, 0, 2, 1, 2,
8440 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8442 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
8444 check = gtk_check_button_new_with_label ("Show text");
8445 g_signal_connect (check, "clicked",
8446 G_CALLBACK (toggle_show_text),
8448 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 2, 3,
8449 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8452 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8453 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 2, 3,
8454 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8457 label = gtk_label_new ("Text: ");
8458 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8460 pdata->entry = gtk_entry_new ();
8461 g_signal_connect (pdata->entry, "changed",
8462 G_CALLBACK (entry_changed),
8464 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
8465 gtk_widget_set_size_request (pdata->entry, 100, -1);
8467 label = gtk_label_new ("Ellipsize text :");
8468 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 10, 11,
8469 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8471 gtk_widget_set_halign (label, GTK_ALIGN_START);
8472 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
8473 pdata->elmenu = build_option_menu (ellipsize_items,
8474 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
8475 2, // PANGO_ELLIPSIZE_MIDDLE
8476 progressbar_toggle_ellipsize,
8478 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8479 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 10, 11,
8480 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8482 gtk_box_pack_start (GTK_BOX (hbox), pdata->elmenu, TRUE, TRUE, 0);
8484 check = gtk_check_button_new_with_label ("Activity mode");
8485 g_signal_connect (check, "clicked",
8486 G_CALLBACK (toggle_activity_mode), pdata);
8487 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 15, 16,
8488 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8491 button = gtk_button_new_with_label ("close");
8492 g_signal_connect_swapped (button, "clicked",
8493 G_CALLBACK (gtk_widget_destroy),
8495 gtk_widget_set_can_default (button, TRUE);
8496 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
8497 gtk_widget_grab_default (button);
8500 if (!gtk_widget_get_visible (pdata->window))
8501 gtk_widget_show_all (pdata->window);
8503 gtk_widget_destroy (pdata->window);
8515 GtkWidget *res_widget;
8519 find_widget (GtkWidget *widget, FindWidgetData *data)
8521 GtkAllocation new_allocation;
8525 gtk_widget_get_allocation (widget, &new_allocation);
8527 if (data->found || !gtk_widget_get_mapped (widget))
8530 /* Note that in the following code, we only count the
8531 * position as being inside a WINDOW widget if it is inside
8532 * widget->window; points that are outside of widget->window
8533 * but within the allocation are not counted. This is consistent
8534 * with the way we highlight drag targets.
8536 if (gtk_widget_get_has_window (widget))
8538 new_allocation.x = 0;
8539 new_allocation.y = 0;
8542 if (gtk_widget_get_parent (widget) && !data->first)
8544 GdkWindow *window = gtk_widget_get_window (widget);
8545 while (window != gtk_widget_get_window (gtk_widget_get_parent (widget)))
8547 gint tx, ty, twidth, theight;
8549 twidth = gdk_window_get_width (window);
8550 theight = gdk_window_get_height (window);
8552 if (new_allocation.x < 0)
8554 new_allocation.width += new_allocation.x;
8555 new_allocation.x = 0;
8557 if (new_allocation.y < 0)
8559 new_allocation.height += new_allocation.y;
8560 new_allocation.y = 0;
8562 if (new_allocation.x + new_allocation.width > twidth)
8563 new_allocation.width = twidth - new_allocation.x;
8564 if (new_allocation.y + new_allocation.height > theight)
8565 new_allocation.height = theight - new_allocation.y;
8567 gdk_window_get_position (window, &tx, &ty);
8568 new_allocation.x += tx;
8570 new_allocation.y += ty;
8573 window = gdk_window_get_parent (window);
8577 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
8578 (data->x < new_allocation.x + new_allocation.width) &&
8579 (data->y < new_allocation.y + new_allocation.height))
8581 /* First, check if the drag is in a valid drop site in
8582 * one of our children
8584 if (GTK_IS_CONTAINER (widget))
8586 FindWidgetData new_data = *data;
8588 new_data.x -= x_offset;
8589 new_data.y -= y_offset;
8590 new_data.found = FALSE;
8591 new_data.first = FALSE;
8593 gtk_container_forall (GTK_CONTAINER (widget),
8594 (GtkCallback)find_widget,
8597 data->found = new_data.found;
8599 data->res_widget = new_data.res_widget;
8602 /* If not, and this widget is registered as a drop site, check to
8603 * emit "drag_motion" to check if we are actually in
8609 data->res_widget = widget;
8615 find_widget_at_pointer (GdkDevice *device)
8617 GtkWidget *widget = NULL;
8618 GdkWindow *pointer_window;
8620 FindWidgetData data;
8622 pointer_window = gdk_device_get_window_at_position (device, NULL, NULL);
8626 gpointer widget_ptr;
8628 gdk_window_get_user_data (pointer_window, &widget_ptr);
8629 widget = widget_ptr;
8634 gdk_window_get_pointer (gtk_widget_get_window (widget),
8642 find_widget (widget, &data);
8644 return data.res_widget;
8650 struct PropertiesData {
8658 destroy_properties (GtkWidget *widget,
8659 struct PropertiesData *data)
8663 *data->window = NULL;
8664 data->window = NULL;
8669 g_object_unref (data->cursor);
8670 data->cursor = NULL;
8675 g_signal_handler_disconnect (widget, data->handler);
8683 property_query_event (GtkWidget *widget,
8685 struct PropertiesData *data)
8687 GtkWidget *res_widget = NULL;
8689 if (!data->in_query)
8692 if (event->type == GDK_BUTTON_RELEASE)
8694 gtk_grab_remove (widget);
8695 gdk_device_ungrab (gdk_event_get_device (event), GDK_CURRENT_TIME);
8697 res_widget = find_widget_at_pointer (gdk_event_get_device (event));
8700 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
8701 gtk_widget_get_screen (widget));
8702 create_prop_editor (G_OBJECT (res_widget), 0);
8705 data->in_query = FALSE;
8712 query_properties (GtkButton *button,
8713 struct PropertiesData *data)
8715 GtkWidget *widget = GTK_WIDGET (button);
8716 GdkDisplay *display;
8717 GdkDeviceManager *device_manager;
8720 g_signal_connect (button, "event",
8721 G_CALLBACK (property_query_event), data);
8723 display = gtk_widget_get_display (widget);
8726 data->cursor = gdk_cursor_new_for_display (display, GDK_TARGET);
8728 device_manager = gdk_display_get_device_manager (display);
8729 device = gdk_device_manager_get_client_pointer (device_manager);
8730 gdk_device_grab (device,
8731 gtk_widget_get_window (widget),
8734 GDK_BUTTON_RELEASE_MASK,
8737 gtk_grab_add (widget);
8739 data->in_query = TRUE;
8743 create_properties (GtkWidget *widget)
8745 static GtkWidget *window = NULL;
8749 struct PropertiesData *data;
8751 data = g_new (struct PropertiesData, 1);
8752 data->window = &window;
8753 data->in_query = FALSE;
8754 data->cursor = NULL;
8759 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8761 gtk_window_set_screen (GTK_WINDOW (window),
8762 gtk_widget_get_screen (widget));
8764 data->handler = g_signal_connect (window, "destroy",
8765 G_CALLBACK (destroy_properties),
8768 gtk_window_set_title (GTK_WINDOW (window), "test properties");
8769 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
8771 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1);
8772 gtk_container_add (GTK_CONTAINER (window), vbox);
8774 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
8775 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
8777 button = gtk_button_new_with_label ("Query properties");
8778 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8779 g_signal_connect (button, "clicked",
8780 G_CALLBACK (query_properties),
8784 if (!gtk_widget_get_visible (window))
8785 gtk_widget_show_all (window);
8787 gtk_widget_destroy (window);
8791 struct SnapshotData {
8792 GtkWidget *toplevel_button;
8796 gboolean is_toplevel;
8801 destroy_snapshot_data (GtkWidget *widget,
8802 struct SnapshotData *data)
8805 *data->window = NULL;
8809 g_object_unref (data->cursor);
8810 data->cursor = NULL;
8815 g_signal_handler_disconnect (widget, data->handler);
8823 snapshot_widget_event (GtkWidget *widget,
8825 struct SnapshotData *data)
8827 GtkWidget *res_widget = NULL;
8829 if (!data->in_query)
8832 if (event->type == GDK_BUTTON_RELEASE)
8834 gtk_grab_remove (widget);
8835 gdk_device_ungrab (gdk_event_get_device (event),
8838 res_widget = find_widget_at_pointer (gdk_event_get_device (event));
8839 if (data->is_toplevel && res_widget)
8840 res_widget = gtk_widget_get_toplevel (res_widget);
8843 cairo_surface_t *surface;
8844 GtkWidget *window, *image;
8849 width = gtk_widget_get_allocated_width (res_widget);
8850 height = gtk_widget_get_allocated_height (res_widget);
8852 surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
8854 cr = cairo_create (surface);
8855 gtk_widget_draw (res_widget, cr);
8858 pixbuf = gdk_pixbuf_get_from_surface (surface,
8861 cairo_surface_destroy (surface);
8863 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8864 image = gtk_image_new_from_pixbuf (pixbuf);
8865 g_object_unref (pixbuf);
8867 gtk_container_add (GTK_CONTAINER (window), image);
8868 gtk_widget_show_all (window);
8871 data->in_query = FALSE;
8878 snapshot_widget (GtkButton *button,
8879 struct SnapshotData *data)
8881 GtkWidget *widget = GTK_WIDGET (button);
8884 device = gtk_get_current_event_device ();
8888 if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
8889 device = gdk_device_get_associated_device (device);
8891 data->is_toplevel = widget == data->toplevel_button;
8894 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget),
8897 gdk_device_grab (device,
8898 gtk_widget_get_window (widget),
8899 GDK_OWNERSHIP_APPLICATION,
8901 GDK_BUTTON_RELEASE_MASK,
8905 g_signal_connect (button, "event",
8906 G_CALLBACK (snapshot_widget_event), data);
8908 gtk_grab_add (widget);
8910 data->in_query = TRUE;
8914 create_snapshot (GtkWidget *widget)
8916 static GtkWidget *window = NULL;
8919 struct SnapshotData *data;
8921 data = g_new (struct SnapshotData, 1);
8922 data->window = &window;
8923 data->in_query = FALSE;
8924 data->cursor = NULL;
8929 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8931 gtk_window_set_screen (GTK_WINDOW (window),
8932 gtk_widget_get_screen (widget));
8934 data->handler = g_signal_connect (window, "destroy",
8935 G_CALLBACK (destroy_snapshot_data),
8938 gtk_window_set_title (GTK_WINDOW (window), "test snapshot");
8939 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
8941 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1);
8942 gtk_container_add (GTK_CONTAINER (window), vbox);
8944 button = gtk_button_new_with_label ("Snapshot widget");
8945 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8946 g_signal_connect (button, "clicked",
8947 G_CALLBACK (snapshot_widget),
8950 button = gtk_button_new_with_label ("Snapshot toplevel");
8951 data->toplevel_button = button;
8952 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8953 g_signal_connect (button, "clicked",
8954 G_CALLBACK (snapshot_widget),
8958 if (!gtk_widget_get_visible (window))
8959 gtk_widget_show_all (window);
8961 gtk_widget_destroy (window);
8970 selection_test_received (GtkWidget *tree_view,
8971 GtkSelectionData *selection_data)
8973 GtkTreeModel *model;
8974 GtkListStore *store;
8978 if (gtk_selection_data_get_length (selection_data) < 0)
8980 g_print ("Selection retrieval failed\n");
8983 if (gtk_selection_data_get_data_type (selection_data) != GDK_SELECTION_TYPE_ATOM)
8985 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
8989 /* Clear out any current list items */
8991 model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
8992 store = GTK_LIST_STORE (model);
8993 gtk_list_store_clear (store);
8995 /* Add new items to list */
8997 gtk_selection_data_get_targets (selection_data,
9000 for (i = 0; i < l; i++)
9005 name = gdk_atom_name (atoms[i]);
9008 gtk_list_store_insert_with_values (store, &iter, i, 0, name, -1);
9012 gtk_list_store_insert_with_values (store, &iter, i, 0, "(bad atom)", -1);
9019 selection_test_get_targets (GtkWidget *widget, GtkWidget *tree_view)
9021 static GdkAtom targets_atom = GDK_NONE;
9023 if (targets_atom == GDK_NONE)
9024 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
9026 gtk_selection_convert (tree_view, GDK_SELECTION_PRIMARY, targets_atom,
9031 create_selection_test (GtkWidget *widget)
9033 static GtkWidget *window = NULL;
9034 GtkWidget *action_area, *content_area;
9037 GtkWidget *scrolled_win;
9038 GtkListStore* store;
9039 GtkWidget *tree_view;
9040 GtkTreeViewColumn *column;
9041 GtkCellRenderer *renderer;
9046 window = gtk_dialog_new ();
9048 gtk_window_set_screen (GTK_WINDOW (window),
9049 gtk_widget_get_screen (widget));
9051 g_signal_connect (window, "destroy",
9052 G_CALLBACK (gtk_widget_destroyed),
9055 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9056 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9058 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
9059 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9061 /* Create the list */
9063 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
9064 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9065 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
9067 label = gtk_label_new ("Gets available targets for current selection");
9068 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9070 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
9071 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
9072 GTK_POLICY_AUTOMATIC,
9073 GTK_POLICY_AUTOMATIC);
9074 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
9075 gtk_widget_set_size_request (scrolled_win, 100, 200);
9077 store = gtk_list_store_new (1, G_TYPE_STRING);
9078 tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
9079 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), tree_view);
9081 renderer = gtk_cell_renderer_text_new ();
9082 column = gtk_tree_view_column_new_with_attributes ("Target", renderer,
9084 gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
9086 g_signal_connect (tree_view, "selection_received",
9087 G_CALLBACK (selection_test_received), NULL);
9089 /* .. And create some buttons */
9090 button = gtk_button_new_with_label ("Get Targets");
9091 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9093 g_signal_connect (button, "clicked",
9094 G_CALLBACK (selection_test_get_targets), tree_view);
9096 button = gtk_button_new_with_label ("Quit");
9097 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9099 g_signal_connect_swapped (button, "clicked",
9100 G_CALLBACK (gtk_widget_destroy),
9104 if (!gtk_widget_get_visible (window))
9105 gtk_widget_show_all (window);
9107 gtk_widget_destroy (window);
9114 static int scroll_test_pos = 0.0;
9117 scroll_test_draw (GtkWidget *widget,
9119 GtkAdjustment *adjustment)
9122 gint imin, imax, jmin, jmax;
9125 gdk_cairo_get_clip_rectangle (cr, &clip);
9127 imin = (clip.x) / 10;
9128 imax = (clip.x + clip.width + 9) / 10;
9130 jmin = ((int)gtk_adjustment_get_value (adjustment) + clip.y) / 10;
9131 jmax = ((int)gtk_adjustment_get_value (adjustment) + clip.y + clip.height + 9) / 10;
9133 for (i=imin; i<imax; i++)
9134 for (j=jmin; j<jmax; j++)
9136 cairo_rectangle (cr, 10*i, 10*j - (int)gtk_adjustment_get_value (adjustment), 1+i%10, 1+j%10);
9144 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
9145 GtkAdjustment *adjustment)
9147 gdouble new_value = gtk_adjustment_get_value (adjustment) + ((event->direction == GDK_SCROLL_UP) ?
9148 -gtk_adjustment_get_page_increment (adjustment) / 2:
9149 gtk_adjustment_get_page_increment (adjustment) / 2);
9150 new_value = CLAMP (new_value, gtk_adjustment_get_lower (adjustment), gtk_adjustment_get_upper (adjustment) - gtk_adjustment_get_page_size (adjustment));
9151 gtk_adjustment_set_value (adjustment, new_value);
9157 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
9158 GtkAdjustment *adjustment)
9160 GtkAllocation allocation;
9162 gtk_widget_get_allocation (widget, &allocation);
9163 gtk_adjustment_configure (adjustment,
9164 gtk_adjustment_get_value (adjustment),
9165 gtk_adjustment_get_lower (adjustment),
9166 gtk_adjustment_get_upper (adjustment),
9167 0.1 * allocation.height,
9168 0.9 * allocation.height,
9173 scroll_test_adjustment_changed (GtkAdjustment *adjustment, GtkWidget *widget)
9178 dy = scroll_test_pos - (int)gtk_adjustment_get_value (adjustment);
9179 scroll_test_pos = gtk_adjustment_get_value (adjustment);
9181 if (!gtk_widget_is_drawable (widget))
9184 window = gtk_widget_get_window (widget);
9185 gdk_window_scroll (window, 0, dy);
9186 gdk_window_process_updates (window, FALSE);
9191 create_scroll_test (GtkWidget *widget)
9193 static GtkWidget *window = NULL;
9194 GtkWidget *action_area, *content_area;
9196 GtkWidget *drawing_area;
9197 GtkWidget *scrollbar;
9199 GtkAdjustment *adjustment;
9200 GdkGeometry geometry;
9201 GdkWindowHints geometry_mask;
9205 window = gtk_dialog_new ();
9207 gtk_window_set_screen (GTK_WINDOW (window),
9208 gtk_widget_get_screen (widget));
9210 g_signal_connect (window, "destroy",
9211 G_CALLBACK (gtk_widget_destroyed),
9214 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9215 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9217 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
9218 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9220 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
9221 gtk_box_pack_start (GTK_BOX (content_area), hbox, TRUE, TRUE, 0);
9222 gtk_widget_show (hbox);
9224 drawing_area = gtk_drawing_area_new ();
9225 gtk_widget_set_size_request (drawing_area, 200, 200);
9226 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
9227 gtk_widget_show (drawing_area);
9229 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
9231 adjustment = gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0);
9232 scroll_test_pos = 0.0;
9234 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, adjustment);
9235 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
9236 gtk_widget_show (scrollbar);
9238 g_signal_connect (drawing_area, "draw",
9239 G_CALLBACK (scroll_test_draw), adjustment);
9240 g_signal_connect (drawing_area, "configure_event",
9241 G_CALLBACK (scroll_test_configure), adjustment);
9242 g_signal_connect (drawing_area, "scroll_event",
9243 G_CALLBACK (scroll_test_scroll), adjustment);
9245 g_signal_connect (adjustment, "value_changed",
9246 G_CALLBACK (scroll_test_adjustment_changed),
9249 /* .. And create some buttons */
9251 button = gtk_button_new_with_label ("Quit");
9252 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9254 g_signal_connect_swapped (button, "clicked",
9255 G_CALLBACK (gtk_widget_destroy),
9257 gtk_widget_show (button);
9259 /* Set up gridded geometry */
9261 geometry_mask = GDK_HINT_MIN_SIZE |
9262 GDK_HINT_BASE_SIZE |
9263 GDK_HINT_RESIZE_INC;
9265 geometry.min_width = 20;
9266 geometry.min_height = 20;
9267 geometry.base_width = 0;
9268 geometry.base_height = 0;
9269 geometry.width_inc = 10;
9270 geometry.height_inc = 10;
9272 gtk_window_set_geometry_hints (GTK_WINDOW (window),
9273 drawing_area, &geometry, geometry_mask);
9276 if (!gtk_widget_get_visible (window))
9277 gtk_widget_show (window);
9279 gtk_widget_destroy (window);
9286 static int timer = 0;
9289 timeout_test (GtkWidget *label)
9291 static int count = 0;
9292 static char buffer[32];
9294 sprintf (buffer, "count: %d", ++count);
9295 gtk_label_set_text (GTK_LABEL (label), buffer);
9301 start_timeout_test (GtkWidget *widget,
9306 timer = g_timeout_add (100, (GSourceFunc)timeout_test, label);
9311 stop_timeout_test (GtkWidget *widget,
9316 g_source_remove (timer);
9322 destroy_timeout_test (GtkWidget *widget,
9325 stop_timeout_test (NULL, NULL);
9331 create_timeout_test (GtkWidget *widget)
9333 static GtkWidget *window = NULL;
9334 GtkWidget *action_area, *content_area;
9340 window = gtk_dialog_new ();
9342 gtk_window_set_screen (GTK_WINDOW (window),
9343 gtk_widget_get_screen (widget));
9345 g_signal_connect (window, "destroy",
9346 G_CALLBACK (destroy_timeout_test),
9349 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9350 action_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9352 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
9353 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9355 label = gtk_label_new ("count: 0");
9356 g_object_set (label, "margin", 10, NULL);
9357 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9358 gtk_widget_show (label);
9360 button = gtk_button_new_with_label ("close");
9361 g_signal_connect_swapped (button, "clicked",
9362 G_CALLBACK (gtk_widget_destroy),
9364 gtk_widget_set_can_default (button, TRUE);
9365 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9366 gtk_widget_grab_default (button);
9367 gtk_widget_show (button);
9369 button = gtk_button_new_with_label ("start");
9370 g_signal_connect (button, "clicked",
9371 G_CALLBACK(start_timeout_test),
9373 gtk_widget_set_can_default (button, TRUE);
9374 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9375 gtk_widget_show (button);
9377 button = gtk_button_new_with_label ("stop");
9378 g_signal_connect (button, "clicked",
9379 G_CALLBACK (stop_timeout_test),
9381 gtk_widget_set_can_default (button, TRUE);
9382 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9383 gtk_widget_show (button);
9386 if (!gtk_widget_get_visible (window))
9387 gtk_widget_show (window);
9389 gtk_widget_destroy (window);
9396 static int idle_id = 0;
9399 idle_test (GtkWidget *label)
9401 static int count = 0;
9402 static char buffer[32];
9404 sprintf (buffer, "count: %d", ++count);
9405 gtk_label_set_text (GTK_LABEL (label), buffer);
9411 start_idle_test (GtkWidget *widget,
9416 idle_id = g_idle_add ((GSourceFunc) idle_test, label);
9421 stop_idle_test (GtkWidget *widget,
9426 g_source_remove (idle_id);
9432 destroy_idle_test (GtkWidget *widget,
9435 stop_idle_test (NULL, NULL);
9441 toggle_idle_container (GObject *button,
9442 GtkContainer *container)
9444 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
9448 create_idle_test (GtkWidget *widget)
9450 static GtkWidget *window = NULL;
9453 GtkWidget *container;
9457 GtkWidget *action_area, *content_area;
9462 window = gtk_dialog_new ();
9464 gtk_window_set_screen (GTK_WINDOW (window),
9465 gtk_widget_get_screen (widget));
9467 g_signal_connect (window, "destroy",
9468 G_CALLBACK (destroy_idle_test),
9471 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9472 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9474 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
9475 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9477 label = gtk_label_new ("count: 0");
9478 g_object_set (label, "margin", 10, NULL);
9479 gtk_widget_show (label);
9482 g_object_new (GTK_TYPE_BOX,
9484 /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
9485 * "GtkWidget::visible", TRUE,
9490 gtk_box_pack_start (GTK_BOX (content_area), container, TRUE, TRUE, 0);
9493 g_object_new (GTK_TYPE_FRAME,
9495 "label", "Label Container",
9497 "parent", content_area,
9500 g_object_new (GTK_TYPE_BOX,
9503 "orientation", GTK_ORIENTATION_VERTICAL,
9506 g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
9507 "label", "Resize-Parent",
9508 "user_data", (void*)GTK_RESIZE_PARENT,
9512 "signal::clicked", toggle_idle_container, container,
9514 button = g_object_new (GTK_TYPE_RADIO_BUTTON,
9515 "label", "Resize-Queue",
9516 "user_data", (void*)GTK_RESIZE_QUEUE,
9521 g_object_connect (button,
9522 "signal::clicked", toggle_idle_container, container,
9524 button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
9525 "label", "Resize-Immediate",
9526 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
9528 g_object_connect (button2,
9529 "signal::clicked", toggle_idle_container, container,
9531 g_object_set (button2,
9537 button = gtk_button_new_with_label ("close");
9538 g_signal_connect_swapped (button, "clicked",
9539 G_CALLBACK (gtk_widget_destroy),
9541 gtk_widget_set_can_default (button, TRUE);
9542 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9543 gtk_widget_grab_default (button);
9544 gtk_widget_show (button);
9546 button = gtk_button_new_with_label ("start");
9547 g_signal_connect (button, "clicked",
9548 G_CALLBACK (start_idle_test),
9550 gtk_widget_set_can_default (button, TRUE);
9551 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9552 gtk_widget_show (button);
9554 button = gtk_button_new_with_label ("stop");
9555 g_signal_connect (button, "clicked",
9556 G_CALLBACK (stop_idle_test),
9558 gtk_widget_set_can_default (button, TRUE);
9559 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9560 gtk_widget_show (button);
9563 if (!gtk_widget_get_visible (window))
9564 gtk_widget_show (window);
9566 gtk_widget_destroy (window);
9574 create_rc_file (GtkWidget *widget)
9576 static GtkWidget *window = NULL;
9577 GtkWidget *action_area, *content_area;
9585 window = gtk_dialog_new ();
9587 gtk_window_set_screen (GTK_WINDOW (window),
9588 gtk_widget_get_screen (widget));
9590 g_signal_connect (window, "destroy",
9591 G_CALLBACK (gtk_widget_destroyed),
9594 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9595 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9597 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
9598 gtk_box_pack_start (GTK_BOX (content_area), frame, FALSE, FALSE, 0);
9600 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
9601 gtk_container_add (GTK_CONTAINER (frame), vbox);
9603 label = gtk_label_new ("This label should be red");
9604 gtk_widget_set_name (label, "testgtk-red-label");
9605 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9607 label = gtk_label_new ("This label should be green");
9608 gtk_widget_set_name (label, "testgtk-green-label");
9609 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9611 label = gtk_label_new ("This label should be blue");
9612 gtk_widget_set_name (label, "testgtk-blue-label");
9613 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9615 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
9616 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9618 button = gtk_button_new_with_label ("Reload");
9619 g_signal_connect_swapped (button, "clicked",
9620 G_CALLBACK (gtk_style_context_reset_widgets),
9621 gtk_widget_get_screen (button));
9622 gtk_widget_set_can_default (button, TRUE);
9623 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9624 gtk_widget_grab_default (button);
9626 button = gtk_button_new_with_label ("Close");
9627 g_signal_connect_swapped (button, "clicked",
9628 G_CALLBACK (gtk_widget_destroy),
9630 gtk_widget_set_can_default (button, TRUE);
9631 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9634 if (!gtk_widget_get_visible (window))
9635 gtk_widget_show_all (window);
9637 gtk_widget_destroy (window);
9641 * Test of recursive mainloop
9645 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
9652 create_mainloop (GtkWidget *widget)
9654 static GtkWidget *window = NULL;
9655 GtkWidget *action_area, *content_area;
9661 window = gtk_dialog_new ();
9663 gtk_window_set_screen (GTK_WINDOW (window),
9664 gtk_widget_get_screen (widget));
9666 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
9668 g_signal_connect (window, "destroy",
9669 G_CALLBACK (mainloop_destroyed),
9672 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9673 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9675 label = gtk_label_new ("In recursive main loop...");
9676 g_object_set (label, "margin", 20, NULL);
9678 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9679 gtk_widget_show (label);
9681 button = gtk_button_new_with_label ("Leave");
9682 gtk_box_pack_start (GTK_BOX (action_area), button, FALSE, TRUE, 0);
9684 g_signal_connect_swapped (button, "clicked",
9685 G_CALLBACK (gtk_widget_destroy),
9688 gtk_widget_set_can_default (button, TRUE);
9689 gtk_widget_grab_default (button);
9691 gtk_widget_show (button);
9694 if (!gtk_widget_get_visible (window))
9696 gtk_widget_show (window);
9698 g_print ("create_mainloop: start\n");
9700 g_print ("create_mainloop: done\n");
9703 gtk_widget_destroy (window);
9707 layout_draw_handler (GtkWidget *widget, cairo_t *cr)
9710 GdkWindow *bin_window;
9713 gint imin, imax, jmin, jmax;
9715 layout = GTK_LAYOUT (widget);
9716 bin_window = gtk_layout_get_bin_window (layout);
9718 if (!gtk_cairo_should_draw_window (cr, bin_window))
9721 gdk_window_get_position (bin_window, &x, &y);
9722 cairo_translate (cr, x, y);
9724 gdk_cairo_get_clip_rectangle (cr, &clip);
9726 imin = (clip.x) / 10;
9727 imax = (clip.x + clip.width + 9) / 10;
9729 jmin = (clip.y) / 10;
9730 jmax = (clip.y + clip.height + 9) / 10;
9732 for (i=imin; i<imax; i++)
9733 for (j=jmin; j<jmax; j++)
9735 cairo_rectangle (cr,
9744 void create_layout (GtkWidget *widget)
9746 GtkAdjustment *hadjustment, *vadjustment;
9748 static GtkWidget *window = NULL;
9749 GtkWidget *layout_widget;
9750 GtkWidget *scrolledwindow;
9759 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9760 gtk_window_set_screen (GTK_WINDOW (window),
9761 gtk_widget_get_screen (widget));
9763 g_signal_connect (window, "destroy",
9764 G_CALLBACK (gtk_widget_destroyed),
9767 gtk_window_set_title (GTK_WINDOW (window), "Layout");
9768 gtk_widget_set_size_request (window, 200, 200);
9770 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
9771 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
9773 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
9774 GTK_CORNER_TOP_RIGHT);
9776 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
9778 layout_widget = gtk_layout_new (NULL, NULL);
9779 layout = GTK_LAYOUT (layout_widget);
9780 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout_widget);
9782 /* We set step sizes here since GtkLayout does not set
9785 hadjustment = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (layout));
9786 vadjustment = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (layout));
9787 gtk_adjustment_set_step_increment (hadjustment, 10.0);
9788 gtk_adjustment_set_step_increment (vadjustment, 10.0);
9789 gtk_scrollable_set_hadjustment (GTK_SCROLLABLE (layout), hadjustment);
9790 gtk_scrollable_set_vadjustment (GTK_SCROLLABLE (layout), vadjustment);
9792 gtk_widget_set_events (layout_widget, GDK_EXPOSURE_MASK);
9793 g_signal_connect (layout, "draw",
9794 G_CALLBACK (layout_draw_handler), NULL);
9796 gtk_layout_set_size (layout, 1600, 128000);
9798 for (i=0 ; i < 16 ; i++)
9799 for (j=0 ; j < 16 ; j++)
9801 sprintf(buf, "Button %d, %d", i, j);
9803 button = gtk_button_new_with_label (buf);
9805 button = gtk_label_new (buf);
9807 gtk_layout_put (layout, button, j*100, i*100);
9810 for (i=16; i < 1280; i++)
9812 sprintf(buf, "Button %d, %d", i, 0);
9814 button = gtk_button_new_with_label (buf);
9816 button = gtk_label_new (buf);
9818 gtk_layout_put (layout, button, 0, i*100);
9822 if (!gtk_widget_get_visible (window))
9823 gtk_widget_show_all (window);
9825 gtk_widget_destroy (window);
9829 /* FIXME: need to completely redo this for GtkStyleContext */
9831 create_styles (GtkWidget *widget)
9833 static GtkWidget *window = NULL;
9834 GtkWidget *content_area, *action_area;
9839 static GdkRGBA red = { 1,0,0,1 };
9840 static GdkRGBA green = { 0,1,0,1 };
9841 static GdkRGBA blue = { 0,0,1,1 };
9842 static GdkRGBA yellow = { 1,1,0,1 };
9843 static GdkRGBA cyan = { 0,1,1,1 };
9844 PangoFontDescription *font_desc;
9846 GtkRcStyle *rc_style;
9850 window = gtk_dialog_new ();
9851 gtk_window_set_screen (GTK_WINDOW (window),
9852 gtk_widget_get_screen (widget));
9854 g_signal_connect (window, "destroy",
9855 G_CALLBACK (gtk_widget_destroyed),
9858 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9859 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9861 button = gtk_button_new_with_label ("Close");
9862 g_signal_connect_swapped (button, "clicked",
9863 G_CALLBACK (gtk_widget_destroy),
9865 gtk_widget_set_can_default (button, TRUE);
9866 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9867 gtk_widget_show (button);
9869 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
9870 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9871 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, FALSE, 0);
9873 label = gtk_label_new ("Font:");
9874 gtk_widget_set_halign (label, GTK_ALIGN_START);
9875 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9876 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9878 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
9880 button = gtk_button_new_with_label ("Some Text");
9881 gtk_widget_override_font (gtk_bin_get_child (GTK_BIN (button)), font_desc);
9882 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9884 label = gtk_label_new ("Foreground:");
9885 gtk_widget_set_halign (label, GTK_ALIGN_START);
9886 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9887 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9889 button = gtk_button_new_with_label ("Some Text");
9890 gtk_widget_override_color (gtk_bin_get_child (GTK_BIN (button)), 0, &red);
9891 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9893 label = gtk_label_new ("Background:");
9894 gtk_widget_set_halign (label, GTK_ALIGN_START);
9895 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9896 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9898 button = gtk_button_new_with_label ("Some Text");
9899 gtk_widget_override_background_color (button, 0, &green);
9900 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9902 label = gtk_label_new ("Text:");
9903 gtk_widget_set_halign (label, GTK_ALIGN_START);
9904 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9905 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9907 entry = gtk_entry_new ();
9908 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9909 gtk_widget_override_color (entry, 0, &blue);
9910 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9912 label = gtk_label_new ("Base:");
9913 gtk_widget_set_halign (label, GTK_ALIGN_START);
9914 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9915 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9917 entry = gtk_entry_new ();
9918 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9919 gtk_widget_override_background_color (entry, 0, &yellow);
9920 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9922 label = gtk_label_new ("Cursor:");
9923 gtk_widget_set_halign (label, GTK_ALIGN_START);
9924 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9925 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9927 entry = gtk_entry_new ();
9928 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9929 gtk_widget_modify_cursor (entry, &red, &red);
9930 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9932 label = gtk_label_new ("Multiple:");
9933 gtk_widget_set_halign (label, GTK_ALIGN_START);
9934 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
9935 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9937 button = gtk_button_new_with_label ("Some Text");
9939 rc_style = gtk_rc_style_new ();
9941 rc_style->font_desc = pango_font_description_copy (font_desc);
9942 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
9943 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
9944 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
9945 rc_style->fg[GTK_STATE_NORMAL] = yellow;
9946 rc_style->bg[GTK_STATE_NORMAL] = blue;
9947 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
9948 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
9949 rc_style->fg[GTK_STATE_ACTIVE] = red;
9950 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
9951 rc_style->xthickness = 5;
9952 rc_style->ythickness = 5;
9954 gtk_widget_modify_style (button, rc_style);
9955 gtk_widget_modify_style (gtk_bin_get_child (GTK_BIN (button)), rc_style);
9957 g_object_unref (rc_style);
9959 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9962 if (!gtk_widget_get_visible (window))
9963 gtk_widget_show_all (window);
9965 gtk_widget_destroy (window);
9970 * Main Window and Exit
9974 do_exit (GtkWidget *widget, GtkWidget *window)
9976 gtk_widget_destroy (window);
9982 void (*func) (GtkWidget *widget);
9983 gboolean do_not_benchmark;
9986 { "alpha window", create_alpha_window },
9987 { "big windows", create_big_windows },
9988 { "button box", create_button_box },
9989 { "buttons", create_buttons },
9990 { "check buttons", create_check_buttons },
9991 { "color selection", create_color_selection },
9992 { "composited window", create_composited_window },
9993 { "cursors", create_cursors },
9994 { "dialog", create_dialog },
9995 { "display & screen", create_display_screen, TRUE },
9996 { "entry", create_entry },
9997 { "event box", create_event_box },
9998 { "event watcher", create_event_watcher },
9999 { "expander", create_expander },
10000 { "flipping", create_flipping },
10001 { "focus", create_focus },
10002 { "font selection", create_font_selection },
10003 { "handle box", create_handle_box },
10004 { "image", create_image },
10005 { "key lookup", create_key_lookup },
10006 { "labels", create_labels },
10007 { "layout", create_layout },
10008 { "menus", create_menus },
10009 { "message dialog", create_message_dialog },
10010 { "modal window", create_modal_window, TRUE },
10011 { "notebook", create_notebook },
10012 { "panes", create_panes },
10013 { "paned keyboard", create_paned_keyboard_navigation },
10014 { "pixbuf", create_pixbuf },
10015 { "progress bar", create_progress_bar },
10016 { "properties", create_properties },
10017 { "radio buttons", create_radio_buttons },
10018 { "range controls", create_range_controls },
10019 { "rc file", create_rc_file },
10020 { "reparent", create_reparent },
10021 { "resize grips", create_resize_grips },
10022 { "rotated label", create_rotated_label },
10023 { "rotated text", create_rotated_text },
10024 { "saved position", create_saved_position },
10025 { "scrolled windows", create_scrolled_windows },
10026 { "shapes", create_shapes },
10027 { "size groups", create_size_groups },
10028 { "snapshot", create_snapshot },
10029 { "spinbutton", create_spins },
10030 { "statusbar", create_statusbar },
10032 { "styles", create_styles },
10034 { "test idle", create_idle_test },
10035 { "test mainloop", create_mainloop, TRUE },
10036 { "test scrolling", create_scroll_test },
10037 { "test selection", create_selection_test },
10038 { "test timeout", create_timeout_test },
10039 { "toggle buttons", create_toggle_buttons },
10040 { "toolbar", create_toolbar },
10041 { "tooltips", create_tooltips },
10042 { "WM hints", create_wmhints },
10043 { "window sizing", create_window_sizing },
10044 { "window states", create_window_states }
10046 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
10049 create_main_window (void)
10054 GtkWidget *scrolled_window;
10058 GtkWidget *separator;
10059 GdkGeometry geometry;
10062 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10063 gtk_widget_set_name (window, "main_window");
10064 gtk_window_move (GTK_WINDOW (window), 50, 20);
10065 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
10067 geometry.min_width = -1;
10068 geometry.min_height = -1;
10069 geometry.max_width = -1;
10070 geometry.max_height = G_MAXSHORT;
10071 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
10073 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
10075 g_signal_connect (window, "destroy",
10076 G_CALLBACK (gtk_main_quit),
10078 g_signal_connect (window, "delete-event",
10079 G_CALLBACK (gtk_false),
10082 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
10083 gtk_container_add (GTK_CONTAINER (window), box1);
10085 if (gtk_micro_version > 0)
10088 gtk_get_major_version (),
10089 gtk_get_minor_version (),
10090 gtk_get_micro_version ());
10094 gtk_get_major_version (),
10095 gtk_get_minor_version ());
10097 label = gtk_label_new (buffer);
10098 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
10099 gtk_widget_set_name (label, "testgtk-version-label");
10101 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
10102 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
10103 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
10105 GTK_POLICY_AUTOMATIC);
10106 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
10108 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
10109 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10110 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
10111 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
10112 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
10113 gtk_widget_show (box2);
10115 for (i = 0; i < nbuttons; i++)
10117 button = gtk_button_new_with_label (buttons[i].label);
10118 if (buttons[i].func)
10119 g_signal_connect (button,
10121 G_CALLBACK(buttons[i].func),
10124 gtk_widget_set_sensitive (button, FALSE);
10125 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10128 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
10129 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
10131 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
10132 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10133 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
10135 button = gtk_button_new_with_mnemonic ("_Close");
10136 g_signal_connect (button, "clicked",
10137 G_CALLBACK (do_exit),
10139 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10140 gtk_widget_set_can_default (button, TRUE);
10141 gtk_widget_grab_default (button);
10143 gtk_widget_show_all (window);
10149 if (g_file_test ("../modules/input/immodules.cache", G_FILE_TEST_EXISTS))
10150 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/immodules.cache", TRUE);
10154 pad (const char *str, int to)
10156 static char buf[256];
10157 int len = strlen (str);
10160 for (i = 0; i < to; i++)
10165 memcpy (buf, str, len);
10171 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
10173 fn (widget); /* on */
10174 while (g_main_context_iteration (NULL, FALSE));
10175 fn (widget); /* off */
10176 while (g_main_context_iteration (NULL, FALSE));
10180 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
10186 static gboolean printed_headers = FALSE;
10188 if (!printed_headers) {
10189 g_print ("Test Iters First Other\n");
10190 g_print ("-------------------- ----- ---------- ----------\n");
10191 printed_headers = TRUE;
10194 g_get_current_time (&tv0);
10195 bench_iteration (widget, fn);
10196 g_get_current_time (&tv1);
10198 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10199 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10201 g_get_current_time (&tv0);
10202 for (n = 0; n < num - 1; n++)
10203 bench_iteration (widget, fn);
10204 g_get_current_time (&tv1);
10205 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10206 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10208 g_print ("%s %5d ", pad (name, 20), num);
10210 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
10212 g_print ("%10.1f\n", dt_first);
10216 do_bench (char* what, int num)
10220 void (* fn) (GtkWidget *widget);
10222 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10224 if (g_ascii_strcasecmp (what, "ALL") == 0)
10226 for (i = 0; i < nbuttons; i++)
10228 if (!buttons[i].do_not_benchmark)
10229 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
10236 for (i = 0; i < nbuttons; i++)
10238 if (strcmp (buttons[i].label, what) == 0)
10240 fn = buttons[i].func;
10246 g_print ("Can't bench: \"%s\" not found.\n", what);
10248 do_real_bench (widget, fn, buttons[i].label, num);
10255 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
10260 main (int argc, char *argv[])
10262 GtkCssProvider *provider, *memory_provider;
10263 GdkDisplay *display;
10265 GtkBindingSet *binding_set;
10267 gboolean done_benchmarks = FALSE;
10269 srand (time (NULL));
10273 g_set_application_name ("GTK+ Test Program");
10275 gtk_init (&argc, &argv);
10277 provider = gtk_css_provider_new ();
10279 /* Check to see if we are being run from the correct
10282 if (file_exists ("testgtk.css"))
10283 gtk_css_provider_load_from_path (provider, "testgtk.css", NULL);
10284 else if (file_exists ("tests/testgtk.css"))
10285 gtk_css_provider_load_from_path (provider, "tests/testgtk.css", NULL);
10287 g_warning ("Couldn't find file \"testgtk.css\".");
10289 display = gdk_display_get_default ();
10290 screen = gdk_display_get_default_screen (display);
10292 gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (provider),
10293 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
10294 g_object_unref (provider);
10296 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
10305 for (i = 1; i < argc; i++)
10307 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
10314 nextarg = strchr (argv[i], '=');
10325 count = strchr (nextarg, ':');
10328 what = g_strndup (nextarg, count - nextarg);
10330 num = atoi (count);
10335 what = g_strdup (nextarg);
10337 do_bench (what, num ? num : 1);
10338 done_benchmarks = TRUE;
10343 if (done_benchmarks)
10348 binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
10349 gtk_binding_entry_add_signal (binding_set,
10350 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
10353 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
10355 memory_provider = gtk_css_provider_new ();
10356 gtk_css_provider_load_from_data (memory_provider,
10357 "#testgtk-version-label {\n"
10359 " font: Sans 18;\n"
10362 gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (memory_provider),
10363 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION + 1);
10365 create_main_window ();
10371 while (g_main_context_pending (NULL))
10372 g_main_context_iteration (NULL, FALSE);
10375 while (g_main_context_pending (NULL))
10376 g_main_context_iteration (NULL, FALSE);