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 ();
1451 icon = new_pixbuf ("test.xpm", gtk_widget_get_window (window));
1452 toolitem = gtk_tool_button_new (icon, make_toolbar_items[i].label);
1453 gtk_tool_item_set_tooltip_text (toolitem, make_toolbar_items[i].tooltip);
1454 if (make_toolbar_items[i].callback != NULL)
1455 g_signal_connect (toolitem, "clicked", make_toolbar_items[i].callback, toolbar);
1456 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1466 static guint statusbar_counter = 1;
1469 statusbar_push (GtkWidget *button,
1470 GtkStatusbar *statusbar)
1474 sprintf (text, "something %d", statusbar_counter++);
1476 gtk_statusbar_push (statusbar, 1, text);
1480 statusbar_push_long (GtkWidget *button,
1481 GtkStatusbar *statusbar)
1485 sprintf (text, "Just because a system has menu choices written with English words, phrases or sentences, that is no guarantee, that it is comprehensible. Individual words may not be familiar to some users (for example, \"repaginate\"), and two menu items may appear to satisfy the users's needs, whereas only one does (for example, \"put away\" or \"eject\").");
1487 gtk_statusbar_push (statusbar, 1, text);
1491 statusbar_pop (GtkWidget *button,
1492 GtkStatusbar *statusbar)
1494 gtk_statusbar_pop (statusbar, 1);
1498 statusbar_steal (GtkWidget *button,
1499 GtkStatusbar *statusbar)
1501 gtk_statusbar_remove (statusbar, 1, 4);
1505 statusbar_popped (GtkStatusbar *statusbar,
1510 statusbar_counter = 1;
1514 statusbar_contexts (GtkStatusbar *statusbar)
1518 string = "any context";
1519 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1521 gtk_statusbar_get_context_id (statusbar, string));
1523 string = "idle messages";
1524 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1526 gtk_statusbar_get_context_id (statusbar, string));
1528 string = "some text";
1529 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1531 gtk_statusbar_get_context_id (statusbar, string));
1533 string = "hit the mouse";
1534 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1536 gtk_statusbar_get_context_id (statusbar, string));
1538 string = "hit the mouse2";
1539 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1541 gtk_statusbar_get_context_id (statusbar, string));
1545 create_statusbar (GtkWidget *widget)
1547 static GtkWidget *window = NULL;
1551 GtkWidget *separator;
1552 GtkWidget *statusbar;
1556 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1557 gtk_window_set_screen (GTK_WINDOW (window),
1558 gtk_widget_get_screen (widget));
1560 g_signal_connect (window, "destroy",
1561 G_CALLBACK (gtk_widget_destroyed),
1564 gtk_window_set_title (GTK_WINDOW (window), "statusbar");
1565 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1567 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1568 gtk_container_add (GTK_CONTAINER (window), box1);
1570 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1571 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1572 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1574 statusbar = gtk_statusbar_new ();
1575 gtk_box_pack_end (GTK_BOX (box1), statusbar, TRUE, TRUE, 0);
1576 g_signal_connect (statusbar,
1578 G_CALLBACK (statusbar_popped),
1581 button = g_object_new (gtk_button_get_type (),
1582 "label", "push something",
1586 g_object_connect (button,
1587 "signal::clicked", statusbar_push, statusbar,
1590 button = g_object_connect (g_object_new (gtk_button_get_type (),
1595 "signal_after::clicked", statusbar_pop, statusbar,
1598 button = g_object_connect (g_object_new (gtk_button_get_type (),
1599 "label", "steal #4",
1603 "signal_after::clicked", statusbar_steal, statusbar,
1606 button = g_object_connect (g_object_new (gtk_button_get_type (),
1607 "label", "test contexts",
1611 "swapped_signal_after::clicked", statusbar_contexts, statusbar,
1614 button = g_object_connect (g_object_new (gtk_button_get_type (),
1615 "label", "push something long",
1619 "signal_after::clicked", statusbar_push_long, statusbar,
1622 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1623 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1625 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1626 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1627 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
1629 button = gtk_button_new_with_label ("close");
1630 g_signal_connect_swapped (button, "clicked",
1631 G_CALLBACK (gtk_widget_destroy),
1633 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1634 gtk_widget_set_can_default (button, TRUE);
1635 gtk_widget_grab_default (button);
1638 if (!gtk_widget_get_visible (window))
1639 gtk_widget_show_all (window);
1641 gtk_widget_destroy (window);
1649 handle_box_child_signal (GtkHandleBox *hb,
1651 const gchar *action)
1653 printf ("%s: child <%s> %sed\n",
1654 g_type_name (G_OBJECT_TYPE (hb)),
1655 g_type_name (G_OBJECT_TYPE (child)),
1660 create_handle_box (GtkWidget *widget)
1662 static GtkWidget* window = NULL;
1663 GtkWidget *handle_box;
1664 GtkWidget *handle_box2;
1669 GtkWidget *separator;
1673 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1675 gtk_window_set_screen (GTK_WINDOW (window),
1676 gtk_widget_get_screen (widget));
1677 gtk_window_set_modal (GTK_WINDOW (window), FALSE);
1678 gtk_window_set_title (GTK_WINDOW (window),
1680 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
1682 g_signal_connect (window, "destroy",
1683 G_CALLBACK (gtk_widget_destroyed),
1686 gtk_container_set_border_width (GTK_CONTAINER (window), 20);
1688 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1689 gtk_container_add (GTK_CONTAINER (window), vbox);
1690 gtk_widget_show (vbox);
1692 label = gtk_label_new ("Above");
1693 gtk_container_add (GTK_CONTAINER (vbox), label);
1694 gtk_widget_show (label);
1696 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1697 gtk_container_add (GTK_CONTAINER (vbox), separator);
1698 gtk_widget_show (separator);
1700 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
1701 gtk_container_add (GTK_CONTAINER (vbox), hbox);
1702 gtk_widget_show (hbox);
1704 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1705 gtk_container_add (GTK_CONTAINER (vbox), separator);
1706 gtk_widget_show (separator);
1708 label = gtk_label_new ("Below");
1709 gtk_container_add (GTK_CONTAINER (vbox), label);
1710 gtk_widget_show (label);
1712 handle_box = gtk_handle_box_new ();
1713 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1714 g_signal_connect (handle_box,
1716 G_CALLBACK (handle_box_child_signal),
1718 g_signal_connect (handle_box,
1720 G_CALLBACK (handle_box_child_signal),
1722 gtk_widget_show (handle_box);
1724 toolbar = make_toolbar (window);
1726 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
1727 gtk_widget_show (toolbar);
1729 handle_box = gtk_handle_box_new ();
1730 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1731 g_signal_connect (handle_box,
1733 G_CALLBACK (handle_box_child_signal),
1735 g_signal_connect (handle_box,
1737 G_CALLBACK (handle_box_child_signal),
1739 gtk_widget_show (handle_box);
1741 handle_box2 = gtk_handle_box_new ();
1742 gtk_container_add (GTK_CONTAINER (handle_box), handle_box2);
1743 g_signal_connect (handle_box2,
1745 G_CALLBACK (handle_box_child_signal),
1747 g_signal_connect (handle_box2,
1749 G_CALLBACK (handle_box_child_signal),
1751 gtk_widget_show (handle_box2);
1753 hbox = g_object_new (GTK_TYPE_HBOX, "visible", 1, "parent", handle_box2, NULL);
1754 label = gtk_label_new ("Fooo!");
1755 gtk_container_add (GTK_CONTAINER (hbox), label);
1756 gtk_widget_show (label);
1757 g_object_new (GTK_TYPE_ARROW, "visible", 1, "parent", hbox, NULL);
1760 if (!gtk_widget_get_visible (window))
1761 gtk_widget_show (window);
1763 gtk_widget_destroy (window);
1770 sensitivity_toggled (GtkWidget *toggle,
1773 gtk_widget_set_sensitive (widget,
1774 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle)));
1778 create_sensitivity_control (GtkWidget *widget)
1782 button = gtk_toggle_button_new_with_label ("Sensitive");
1784 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
1785 gtk_widget_is_sensitive (widget));
1787 g_signal_connect (button,
1789 G_CALLBACK (sensitivity_toggled),
1792 gtk_widget_show_all (button);
1798 set_selectable_recursive (GtkWidget *widget,
1801 if (GTK_IS_CONTAINER (widget))
1806 children = gtk_container_get_children (GTK_CONTAINER (widget));
1810 set_selectable_recursive (tmp->data, setting);
1814 g_list_free (children);
1816 else if (GTK_IS_LABEL (widget))
1818 gtk_label_set_selectable (GTK_LABEL (widget), setting);
1823 selectable_toggled (GtkWidget *toggle,
1826 set_selectable_recursive (widget,
1827 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle)));
1831 create_selectable_control (GtkWidget *widget)
1835 button = gtk_toggle_button_new_with_label ("Selectable");
1837 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
1840 g_signal_connect (button,
1842 G_CALLBACK (selectable_toggled),
1845 gtk_widget_show_all (button);
1851 dialog_response (GtkWidget *dialog, gint response_id, GtkLabel *label)
1855 gtk_widget_destroy (dialog);
1857 text = "Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
1858 "as hyperlinks, which can be clicked\n"
1859 "or activated via <a href=\"keynav\">keynav</a>.\n"
1860 "The links remain the same.";
1861 gtk_label_set_markup (label, text);
1865 activate_link (GtkWidget *label, const gchar *uri, gpointer data)
1867 if (g_strcmp0 (uri, "keynav") == 0)
1871 dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (gtk_widget_get_toplevel (label)),
1872 GTK_DIALOG_DESTROY_WITH_PARENT,
1875 "The term <i>keynav</i> is a shorthand for "
1876 "keyboard navigation and refers to the process of using a program "
1877 "(exclusively) via keyboard input.");
1879 gtk_window_present (GTK_WINDOW (dialog));
1881 g_signal_connect (dialog, "response", G_CALLBACK (dialog_response), label);
1889 void create_labels (GtkWidget *widget)
1891 static GtkWidget *window = NULL;
1900 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1902 gtk_window_set_screen (GTK_WINDOW (window),
1903 gtk_widget_get_screen (widget));
1905 g_signal_connect (window, "destroy",
1906 G_CALLBACK (gtk_widget_destroyed),
1909 gtk_window_set_title (GTK_WINDOW (window), "Label");
1911 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1913 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
1914 gtk_container_add (GTK_CONTAINER (window), vbox);
1916 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
1918 button = create_sensitivity_control (hbox);
1920 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
1922 button = create_selectable_control (hbox);
1924 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
1926 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1928 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
1929 gtk_container_set_border_width (GTK_CONTAINER (window), 5);
1931 frame = gtk_frame_new ("Normal Label");
1932 label = gtk_label_new ("This is a Normal label");
1933 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
1934 gtk_container_add (GTK_CONTAINER (frame), label);
1935 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1937 frame = gtk_frame_new ("Multi-line Label");
1938 label = gtk_label_new ("This is a Multi-line label.\nSecond line\nThird line");
1939 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
1940 gtk_container_add (GTK_CONTAINER (frame), label);
1941 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1943 frame = gtk_frame_new ("Left Justified Label");
1944 label = gtk_label_new ("This is a Left-Justified\nMulti-line label.\nThird line");
1945 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_MIDDLE);
1946 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1947 gtk_container_add (GTK_CONTAINER (frame), label);
1948 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1950 frame = gtk_frame_new ("Right Justified Label");
1951 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
1952 label = gtk_label_new ("This is a Right-Justified\nMulti-line label.\nFourth line, (j/k)");
1953 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1954 gtk_container_add (GTK_CONTAINER (frame), label);
1955 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1957 frame = gtk_frame_new ("Internationalized Label");
1958 label = gtk_label_new (NULL);
1959 gtk_label_set_markup (GTK_LABEL (label),
1960 "French (Fran\303\247ais) Bonjour, Salut\n"
1961 "Korean (\355\225\234\352\270\200) \354\225\210\353\205\225\355\225\230\354\204\270\354\232\224, \354\225\210\353\205\225\355\225\230\354\213\255\353\213\210\352\271\214\n"
1962 "Russian (\320\240\321\203\321\201\321\201\320\272\320\270\320\271) \320\227\320\264\321\200\320\260\320\262\321\201\321\202\320\262\321\203\320\271\321\202\320\265!\n"
1963 "Chinese (Simplified) <span lang=\"zh-cn\">\345\205\203\346\260\224 \345\274\200\345\217\221</span>\n"
1964 "Chinese (Traditional) <span lang=\"zh-tw\">\345\205\203\346\260\243 \351\226\213\347\231\274</span>\n"
1965 "Japanese <span lang=\"ja\">\345\205\203\346\260\227 \351\226\213\347\231\272</span>");
1966 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1967 gtk_container_add (GTK_CONTAINER (frame), label);
1968 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1970 frame = gtk_frame_new ("Bidirection Label");
1971 label = gtk_label_new ("\342\200\217Arabic \330\247\331\204\330\263\331\204\330\247\331\205 \330\271\331\204\331\212\331\203\331\205\n"
1972 "\342\200\217Hebrew \327\251\327\234\327\225\327\235");
1973 gtk_container_add (GTK_CONTAINER (frame), label);
1974 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1976 frame = gtk_frame_new ("Links in a label");
1977 label = gtk_label_new ("Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
1978 "as hyperlinks, which can be clicked\n"
1979 "or activated via <a href=\"keynav\">keynav</a>");
1980 gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
1981 gtk_container_add (GTK_CONTAINER (frame), label);
1982 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1983 g_signal_connect (label, "activate-link", G_CALLBACK (activate_link), NULL);
1985 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1986 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
1987 frame = gtk_frame_new ("Line wrapped label");
1988 label = gtk_label_new ("This is an example of a line-wrapped label. It should not be taking "\
1989 "up the entire "/* big space to test spacing */\
1990 "width allocated to it, but automatically wraps the words to fit. "\
1991 "The time has come, for all good men, to come to the aid of their party. "\
1992 "The sixth sheik's six sheep's sick.\n"\
1993 " It supports multiple paragraphs correctly, and correctly adds "\
1994 "many extra spaces. ");
1996 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
1997 gtk_container_add (GTK_CONTAINER (frame), label);
1998 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2000 frame = gtk_frame_new ("Filled, wrapped label");
2001 label = gtk_label_new ("This is an example of a line-wrapped, filled label. It should be taking "\
2002 "up the entire width allocated to it. Here is a seneance to prove "\
2003 "my point. Here is another sentence. "\
2004 "Here comes the sun, do de do de do.\n"\
2005 " This is a new paragraph.\n"\
2006 " This is another newer, longer, better paragraph. It is coming to an end, "\
2008 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_FILL);
2009 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2010 gtk_container_add (GTK_CONTAINER (frame), label);
2011 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2013 frame = gtk_frame_new ("Underlined label");
2014 label = gtk_label_new ("This label is underlined!\n"
2015 "This one is underlined (\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257) in quite a funky fashion");
2016 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2017 gtk_label_set_pattern (GTK_LABEL (label), "_________________________ _ _________ _ _____ _ __ __ ___ ____ _____");
2018 gtk_container_add (GTK_CONTAINER (frame), label);
2019 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2021 frame = gtk_frame_new ("Markup label");
2022 label = gtk_label_new (NULL);
2024 /* There's also a gtk_label_set_markup() without accel if you
2025 * don't have an accelerator key
2027 gtk_label_set_markup_with_mnemonic (GTK_LABEL (label),
2028 "This <span foreground=\"blue\" background=\"orange\">label</span> has "
2029 "<b>markup</b> _such as "
2030 "<big><i>Big Italics</i></big>\n"
2031 "<tt>Monospace font</tt>\n"
2032 "<u>Underline!</u>\n"
2034 "<span foreground=\"green\" background=\"red\">Ugly colors</span>\n"
2035 "and nothing on this line,\n"
2038 "or even on this one\n"
2039 "la <big>la <big>la <big>la <big>la</big></big></big></big>\n"
2040 "but this _word is <span foreground=\"purple\"><big>purple</big></span>\n"
2041 "<span underline=\"double\">We like <sup>superscript</sup> and <sub>subscript</sub> too</span>");
2043 g_assert (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)) == GDK_KEY_s);
2045 gtk_container_add (GTK_CONTAINER (frame), label);
2046 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2049 if (!gtk_widget_get_visible (window))
2050 gtk_widget_show_all (window);
2052 gtk_widget_destroy (window);
2056 on_angle_scale_changed (GtkRange *range,
2059 gtk_label_set_angle (GTK_LABEL (label), gtk_range_get_value (range));
2063 create_rotated_label (GtkWidget *widget)
2065 static GtkWidget *window = NULL;
2066 GtkWidget *content_area;
2070 GtkWidget *scale_label;
2071 GtkWidget *scale_hbox;
2075 window = gtk_dialog_new_with_buttons ("Rotated Label",
2076 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2077 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2080 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2082 gtk_window_set_screen (GTK_WINDOW (window),
2083 gtk_widget_get_screen (widget));
2085 g_signal_connect (window, "response",
2086 G_CALLBACK (gtk_widget_destroy), NULL);
2087 g_signal_connect (window, "destroy",
2088 G_CALLBACK (gtk_widget_destroyed), &window);
2090 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2092 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2093 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
2094 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
2096 label = gtk_label_new (NULL);
2097 gtk_label_set_markup (GTK_LABEL (label), "Hello World\n<i>Rotate</i> <span underline='single' foreground='blue'>me</span>");
2098 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
2100 scale_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2101 gtk_box_pack_start (GTK_BOX (vbox), scale_hbox, FALSE, FALSE, 0);
2103 scale_label = gtk_label_new (NULL);
2104 gtk_label_set_markup (GTK_LABEL (scale_label), "<i>Angle: </i>");
2105 gtk_box_pack_start (GTK_BOX (scale_hbox), scale_label, FALSE, FALSE, 0);
2107 hscale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL,
2109 g_signal_connect (hscale, "value-changed",
2110 G_CALLBACK (on_angle_scale_changed), label);
2112 gtk_range_set_value (GTK_RANGE (hscale), 45);
2113 gtk_widget_set_size_request (hscale, 200, -1);
2114 gtk_box_pack_start (GTK_BOX (scale_hbox), hscale, TRUE, TRUE, 0);
2117 if (!gtk_widget_get_visible (window))
2118 gtk_widget_show_all (window);
2120 gtk_widget_destroy (window);
2123 #define DEFAULT_TEXT_RADIUS 200
2126 on_rotated_text_unrealize (GtkWidget *widget)
2128 g_object_set_data (G_OBJECT (widget), "text-gc", NULL);
2132 on_rotated_text_draw (GtkWidget *widget,
2134 GdkPixbuf *tile_pixbuf)
2136 static const gchar *words[] = { "The", "grand", "old", "Duke", "of", "York",
2137 "had", "10,000", "men" };
2142 PangoLayout *layout;
2143 PangoContext *context;
2144 PangoFontDescription *desc;
2148 gdk_cairo_set_source_pixbuf (cr, tile_pixbuf, 0, 0);
2149 cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT);
2152 cairo_set_source_rgb (cr, 0, 0, 0);
2154 width = gtk_widget_get_allocated_width (widget);
2155 height = gtk_widget_get_allocated_height (widget);
2156 radius = MIN (width, height) / 2.;
2158 cairo_translate (cr,
2159 radius + (width - 2 * radius) / 2,
2160 radius + (height - 2 * radius) / 2);
2161 cairo_scale (cr, radius / DEFAULT_TEXT_RADIUS, radius / DEFAULT_TEXT_RADIUS);
2163 context = gtk_widget_get_pango_context (widget);
2164 layout = pango_layout_new (context);
2165 desc = pango_font_description_from_string ("Sans Bold 30");
2166 pango_layout_set_font_description (layout, desc);
2167 pango_font_description_free (desc);
2169 n_words = G_N_ELEMENTS (words);
2170 for (i = 0; i < n_words; i++)
2176 cairo_rotate (cr, 2 * G_PI * i / n_words);
2177 pango_cairo_update_layout (cr, layout);
2179 pango_layout_set_text (layout, words[i], -1);
2180 pango_layout_get_size (layout, &width, &height);
2182 cairo_move_to (cr, - width / 2 / PANGO_SCALE, - DEFAULT_TEXT_RADIUS);
2183 pango_cairo_show_layout (cr, layout);
2188 g_object_unref (layout);
2194 create_rotated_text (GtkWidget *widget)
2196 static GtkWidget *window = NULL;
2200 const GdkRGBA white = { 1.0, 1.0, 1.0, 1.0 };
2201 GtkRequisition requisition;
2202 GtkWidget *content_area;
2203 GtkWidget *drawing_area;
2204 GdkPixbuf *tile_pixbuf;
2206 window = gtk_dialog_new_with_buttons ("Rotated Text",
2207 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2208 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2211 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2213 gtk_window_set_screen (GTK_WINDOW (window),
2214 gtk_widget_get_screen (widget));
2216 g_signal_connect (window, "response",
2217 G_CALLBACK (gtk_widget_destroy), NULL);
2218 g_signal_connect (window, "destroy",
2219 G_CALLBACK (gtk_widget_destroyed), &window);
2221 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2223 drawing_area = gtk_drawing_area_new ();
2224 gtk_box_pack_start (GTK_BOX (content_area), drawing_area, TRUE, TRUE, 0);
2225 gtk_widget_override_background_color (drawing_area, 0, &white);
2227 tile_pixbuf = gdk_pixbuf_new_from_file ("marble.xpm", NULL);
2229 g_signal_connect (drawing_area, "draw",
2230 G_CALLBACK (on_rotated_text_draw), tile_pixbuf);
2231 g_signal_connect (drawing_area, "unrealize",
2232 G_CALLBACK (on_rotated_text_unrealize), NULL);
2234 gtk_widget_show_all (gtk_bin_get_child (GTK_BIN (window)));
2236 gtk_widget_set_size_request (drawing_area, DEFAULT_TEXT_RADIUS * 2, DEFAULT_TEXT_RADIUS * 2);
2237 gtk_widget_get_preferred_size ( (window),
2238 &requisition, NULL);
2239 gtk_widget_set_size_request (drawing_area, -1, -1);
2240 gtk_window_resize (GTK_WINDOW (window), requisition.width, requisition.height);
2243 if (!gtk_widget_get_visible (window))
2244 gtk_widget_show (window);
2246 gtk_widget_destroy (window);
2254 reparent_label (GtkWidget *widget,
2255 GtkWidget *new_parent)
2259 label = g_object_get_data (G_OBJECT (widget), "user_data");
2261 gtk_widget_reparent (label, new_parent);
2265 set_parent_signal (GtkWidget *child,
2266 GtkWidget *old_parent,
2271 parent = gtk_widget_get_parent (child);
2272 g_message ("set_parent for \"%s\": new parent: \"%s\", old parent: \"%s\", data: %d\n",
2273 g_type_name (G_OBJECT_TYPE (child)),
2274 parent ? g_type_name (G_OBJECT_TYPE (parent)) : "NULL",
2275 old_parent ? g_type_name (G_OBJECT_TYPE (old_parent)) : "NULL",
2276 GPOINTER_TO_INT (func_data));
2280 create_reparent (GtkWidget *widget)
2282 static GtkWidget *window = NULL;
2289 GtkWidget *separator;
2290 GtkWidget *event_box;
2294 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2296 gtk_window_set_screen (GTK_WINDOW (window),
2297 gtk_widget_get_screen (widget));
2299 g_signal_connect (window, "destroy",
2300 G_CALLBACK (gtk_widget_destroyed),
2303 gtk_window_set_title (GTK_WINDOW (window), "reparent");
2304 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2306 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2307 gtk_container_add (GTK_CONTAINER (window), box1);
2309 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
2310 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2311 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2313 label = gtk_label_new ("Hello World");
2315 frame = gtk_frame_new ("Frame 1");
2316 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2318 box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2319 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2320 gtk_container_add (GTK_CONTAINER (frame), box3);
2322 button = gtk_button_new_with_label ("switch");
2323 g_object_set_data (G_OBJECT (button), "user_data", label);
2324 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2326 event_box = gtk_event_box_new ();
2327 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2328 gtk_container_add (GTK_CONTAINER (event_box), label);
2330 g_signal_connect (button, "clicked",
2331 G_CALLBACK (reparent_label),
2334 g_signal_connect (label, "parent_set",
2335 G_CALLBACK (set_parent_signal),
2336 GINT_TO_POINTER (42));
2338 frame = gtk_frame_new ("Frame 2");
2339 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2341 box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2342 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2343 gtk_container_add (GTK_CONTAINER (frame), box3);
2345 button = gtk_button_new_with_label ("switch");
2346 g_object_set_data (G_OBJECT (button), "user_data", label);
2347 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2349 event_box = gtk_event_box_new ();
2350 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2352 g_signal_connect (button, "clicked",
2353 G_CALLBACK (reparent_label),
2356 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2357 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2359 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2360 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2361 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2363 button = gtk_button_new_with_label ("close");
2364 g_signal_connect_swapped (button, "clicked",
2365 G_CALLBACK (gtk_widget_destroy), window);
2366 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2367 gtk_widget_set_can_default (button, TRUE);
2368 gtk_widget_grab_default (button);
2371 if (!gtk_widget_get_visible (window))
2372 gtk_widget_show_all (window);
2374 gtk_widget_destroy (window);
2381 grippy_button_press (GtkWidget *area, GdkEventButton *event, GdkWindowEdge edge)
2383 if (event->type == GDK_BUTTON_PRESS)
2385 if (event->button == 1)
2386 gtk_window_begin_resize_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)), edge,
2387 event->button, event->x_root, event->y_root,
2389 else if (event->button == 2)
2390 gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)),
2391 event->button, event->x_root, event->y_root,
2398 grippy_draw (GtkWidget *area, cairo_t *cr, GdkWindowEdge edge)
2400 GtkStyleContext *context;
2401 GtkJunctionSides sides;
2405 case GDK_WINDOW_EDGE_NORTH_WEST:
2406 sides = GTK_JUNCTION_CORNER_TOPLEFT;
2408 case GDK_WINDOW_EDGE_NORTH:
2409 sides = GTK_JUNCTION_TOP;
2411 case GDK_WINDOW_EDGE_NORTH_EAST:
2412 sides = GTK_JUNCTION_CORNER_TOPRIGHT;
2414 case GDK_WINDOW_EDGE_WEST:
2415 sides = GTK_JUNCTION_LEFT;
2417 case GDK_WINDOW_EDGE_EAST:
2418 sides = GTK_JUNCTION_RIGHT;
2420 case GDK_WINDOW_EDGE_SOUTH_WEST:
2421 sides = GTK_JUNCTION_CORNER_BOTTOMLEFT;
2423 case GDK_WINDOW_EDGE_SOUTH:
2424 sides = GTK_JUNCTION_BOTTOM;
2426 case GDK_WINDOW_EDGE_SOUTH_EAST:
2427 sides = GTK_JUNCTION_CORNER_BOTTOMRIGHT;
2430 g_assert_not_reached();
2433 context = gtk_widget_get_style_context (area);
2434 gtk_style_context_save (context);
2435 gtk_style_context_add_class (context, "grip");
2436 gtk_style_context_set_junction_sides (context, sides);
2437 gtk_render_handle (context, cr,
2439 gtk_widget_get_allocated_width (area),
2440 gtk_widget_get_allocated_height (area));
2442 gtk_style_context_restore (context);
2448 create_resize_grips (GtkWidget *widget)
2450 static GtkWidget *window = NULL;
2452 GtkWidget *hbox, *vbox;
2455 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2457 gtk_window_set_screen (GTK_WINDOW (window),
2458 gtk_widget_get_screen (widget));
2460 gtk_window_set_title (GTK_WINDOW (window), "resize grips");
2462 g_signal_connect (window, "destroy",
2463 G_CALLBACK (gtk_widget_destroyed),
2466 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2467 gtk_container_add (GTK_CONTAINER (window), vbox);
2469 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2470 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2473 area = gtk_drawing_area_new ();
2474 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2475 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2476 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2477 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2478 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2479 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2482 area = gtk_drawing_area_new ();
2483 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2484 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2485 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2486 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2487 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2488 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2491 area = gtk_drawing_area_new ();
2492 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2493 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2494 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2495 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2496 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2497 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2499 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2500 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2503 area = gtk_drawing_area_new ();
2504 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2505 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2506 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2507 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2508 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2509 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2512 area = gtk_drawing_area_new ();
2513 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2516 area = gtk_drawing_area_new ();
2517 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2518 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2519 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2520 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2521 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2522 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2525 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2526 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2529 area = gtk_drawing_area_new ();
2530 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2531 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2532 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2533 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2534 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2535 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2537 area = gtk_drawing_area_new ();
2538 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2539 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2540 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2541 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2542 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2543 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2546 area = gtk_drawing_area_new ();
2547 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2548 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2549 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2550 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2551 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2552 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2555 if (!gtk_widget_get_visible (window))
2556 gtk_widget_show_all (window);
2558 gtk_widget_destroy (window);
2564 gint upositionx = 0;
2565 gint upositiony = 0;
2568 uposition_configure (GtkWidget *window)
2574 lx = g_object_get_data (G_OBJECT (window), "x");
2575 ly = g_object_get_data (G_OBJECT (window), "y");
2577 gdk_window_get_root_origin (gtk_widget_get_window (window),
2578 &upositionx, &upositiony);
2579 sprintf (buffer, "%d", upositionx);
2580 gtk_label_set_text (lx, buffer);
2581 sprintf (buffer, "%d", upositiony);
2582 gtk_label_set_text (ly, buffer);
2588 uposition_stop_configure (GtkToggleButton *toggle,
2591 if (gtk_toggle_button_get_active (toggle))
2592 g_signal_handlers_block_by_func (window, G_CALLBACK (uposition_configure), NULL);
2594 g_signal_handlers_unblock_by_func (window, G_CALLBACK (uposition_configure), NULL);
2598 create_saved_position (GtkWidget *widget)
2600 static GtkWidget *window = NULL;
2605 GtkWidget *main_vbox;
2613 window = g_object_connect (g_object_new (GTK_TYPE_WINDOW,
2614 "type", GTK_WINDOW_TOPLEVEL,
2615 "title", "Saved Position",
2617 "signal::configure_event", uposition_configure, NULL,
2620 gtk_window_move (GTK_WINDOW (window), upositionx, upositiony);
2622 gtk_window_set_screen (GTK_WINDOW (window),
2623 gtk_widget_get_screen (widget));
2626 g_signal_connect (window, "destroy",
2627 G_CALLBACK (gtk_widget_destroyed),
2630 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2631 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
2632 gtk_container_add (GTK_CONTAINER (window), main_vbox);
2635 g_object_new (GTK_TYPE_BOX,
2636 "orientation", GTK_ORIENTATION_VERTICAL,
2637 "GtkBox::homogeneous", FALSE,
2638 "GtkBox::spacing", 5,
2639 "GtkContainer::border_width", 10,
2640 "GtkWidget::parent", main_vbox,
2641 "GtkWidget::visible", TRUE,
2642 "child", g_object_connect (g_object_new (GTK_TYPE_TOGGLE_BUTTON,
2643 "label", "Stop Events",
2647 "signal::clicked", uposition_stop_configure, window,
2651 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2652 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2653 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2655 label = gtk_label_new ("X Origin : ");
2656 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2657 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
2659 x_label = gtk_label_new ("");
2660 gtk_box_pack_start (GTK_BOX (hbox), x_label, TRUE, TRUE, 0);
2661 g_object_set_data (G_OBJECT (window), "x", x_label);
2663 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2664 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2665 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2667 label = gtk_label_new ("Y Origin : ");
2668 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2669 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
2671 y_label = gtk_label_new ("");
2672 gtk_box_pack_start (GTK_BOX (hbox), y_label, TRUE, TRUE, 0);
2673 g_object_set_data (G_OBJECT (window), "y", y_label);
2676 g_object_new (gtk_hseparator_get_type (),
2677 "GtkWidget::visible", TRUE,
2679 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
2681 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2682 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
2683 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
2685 button = gtk_button_new_with_label ("Close");
2686 g_signal_connect_swapped (button, "clicked",
2687 G_CALLBACK (gtk_widget_destroy),
2689 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
2690 gtk_widget_set_can_default (button, TRUE);
2691 gtk_widget_grab_default (button);
2693 gtk_widget_show_all (window);
2696 gtk_widget_destroy (window);
2704 create_pixbuf (GtkWidget *widget)
2706 static GtkWidget *window = NULL;
2712 GtkWidget *separator;
2713 GtkWidget *pixbufwid;
2714 GdkWindow *gdk_window;
2718 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2720 gtk_window_set_screen (GTK_WINDOW (window),
2721 gtk_widget_get_screen (widget));
2723 g_signal_connect (window, "destroy",
2724 G_CALLBACK (gtk_widget_destroyed),
2727 gtk_window_set_title (GTK_WINDOW (window), "GtkPixmap");
2728 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2729 gtk_widget_realize(window);
2731 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2732 gtk_container_add (GTK_CONTAINER (window), box1);
2734 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2735 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2736 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2738 button = gtk_button_new ();
2739 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
2741 gdk_window = gtk_widget_get_window (window);
2743 pixbufwid = new_pixbuf ("test.xpm", gdk_window);
2745 label = gtk_label_new ("Pixbuf\ntest");
2746 box3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2747 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
2748 gtk_container_add (GTK_CONTAINER (box3), pixbufwid);
2749 gtk_container_add (GTK_CONTAINER (box3), label);
2750 gtk_container_add (GTK_CONTAINER (button), box3);
2752 button = gtk_button_new ();
2753 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
2755 pixbufwid = new_pixbuf ("test.xpm", gdk_window);
2757 label = gtk_label_new ("Pixbuf\ntest");
2758 box3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2759 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
2760 gtk_container_add (GTK_CONTAINER (box3), pixbufwid);
2761 gtk_container_add (GTK_CONTAINER (box3), label);
2762 gtk_container_add (GTK_CONTAINER (button), box3);
2764 gtk_widget_set_sensitive (button, FALSE);
2766 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2767 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2769 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2770 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2771 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2773 button = gtk_button_new_with_label ("close");
2774 g_signal_connect_swapped (button, "clicked",
2775 G_CALLBACK (gtk_widget_destroy),
2777 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2778 gtk_widget_set_can_default (button, TRUE);
2779 gtk_widget_grab_default (button);
2782 if (!gtk_widget_get_visible (window))
2783 gtk_widget_show_all (window);
2785 gtk_widget_destroy (window);
2789 create_tooltips (GtkWidget *widget)
2791 static GtkWidget *window = NULL;
2798 GtkWidget *separator;
2803 g_object_new (gtk_window_get_type (),
2804 "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
2805 "GtkContainer::border_width", 0,
2806 "GtkWindow::title", "Tooltips",
2807 "GtkWindow::resizable", FALSE,
2810 gtk_window_set_screen (GTK_WINDOW (window),
2811 gtk_widget_get_screen (widget));
2813 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2814 gtk_container_add (GTK_CONTAINER (window), box1);
2816 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2817 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2818 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2820 button = gtk_toggle_button_new_with_label ("button1");
2821 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2823 gtk_widget_set_tooltip_text (button, "This is button 1");
2825 button = gtk_toggle_button_new_with_label ("button2");
2826 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2828 gtk_widget_set_tooltip_text (button,
2829 "This is button 2. This is also a really long tooltip which probably "
2830 "won't fit on a single line and will therefore need to be wrapped. "
2831 "Hopefully the wrapping will work correctly.");
2833 toggle = gtk_toggle_button_new_with_label ("Override TipsQuery Label");
2834 gtk_box_pack_start (GTK_BOX (box2), toggle, TRUE, TRUE, 0);
2836 gtk_widget_set_tooltip_text (toggle, "Toggle TipsQuery view.");
2839 g_object_new (GTK_TYPE_BOX,
2840 "orientation", GTK_ORIENTATION_VERTICAL,
2841 "homogeneous", FALSE,
2848 g_object_new (gtk_button_get_type (),
2853 gtk_box_set_child_packing (GTK_BOX (box3), button, FALSE, FALSE, 0, GTK_PACK_START);
2854 gtk_widget_set_tooltip_text (button, "Start the Tooltips Inspector");
2856 frame = g_object_new (gtk_frame_get_type (),
2857 "label", "ToolTips Inspector",
2858 "label_xalign", (double) 0.5,
2864 gtk_box_set_child_packing (GTK_BOX (box2), frame, TRUE, TRUE, 10, GTK_PACK_START);
2866 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2867 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2869 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2870 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2871 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2873 button = gtk_button_new_with_label ("close");
2874 g_signal_connect_swapped (button, "clicked",
2875 G_CALLBACK (gtk_widget_destroy),
2877 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2878 gtk_widget_set_can_default (button, TRUE);
2879 gtk_widget_grab_default (button);
2881 gtk_widget_set_tooltip_text (button, "Push this button to close window");
2884 if (!gtk_widget_get_visible (window))
2885 gtk_widget_show_all (window);
2887 gtk_widget_destroy (window);
2895 pack_image (GtkWidget *box,
2899 gtk_box_pack_start (GTK_BOX (box),
2900 gtk_label_new (text),
2903 gtk_box_pack_start (GTK_BOX (box),
2909 create_image (GtkWidget *widget)
2911 static GtkWidget *window = NULL;
2918 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2920 gtk_window_set_screen (GTK_WINDOW (window),
2921 gtk_widget_get_screen (widget));
2923 /* this is bogus for testing drawing when allocation < request,
2924 * don't copy into real code
2926 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2928 g_signal_connect (window, "destroy",
2929 G_CALLBACK (gtk_widget_destroyed),
2932 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2934 gtk_container_add (GTK_CONTAINER (window), vbox);
2936 pack_image (vbox, "Stock Warning Dialog",
2937 gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
2938 GTK_ICON_SIZE_DIALOG));
2940 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
2942 pack_image (vbox, "Pixbuf",
2943 gtk_image_new_from_pixbuf (pixbuf));
2945 g_object_unref (pixbuf);
2948 if (!gtk_widget_get_visible (window))
2949 gtk_widget_show_all (window);
2951 gtk_widget_destroy (window);
2959 create_menu (GdkScreen *screen, gint depth, gint length, gboolean tearoff)
2962 GtkWidget *menuitem;
2971 menu = gtk_menu_new ();
2972 gtk_menu_set_screen (GTK_MENU (menu), screen);
2978 menuitem = gtk_tearoff_menu_item_new ();
2979 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2980 gtk_widget_show (menuitem);
2983 image = gtk_image_new_from_stock (GTK_STOCK_OPEN,
2984 GTK_ICON_SIZE_MENU);
2985 gtk_widget_show (image);
2986 menuitem = gtk_image_menu_item_new_with_label ("Image item");
2987 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
2988 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2989 gtk_widget_show (menuitem);
2991 for (i = 0, j = 1; i < length; i++, j++)
2993 sprintf (buf, "item %2d - %d", depth, j);
2995 menuitem = gtk_radio_menu_item_new_with_label (group, buf);
2996 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
2998 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2999 gtk_widget_show (menuitem);
3001 gtk_widget_set_sensitive (menuitem, FALSE);
3004 gtk_check_menu_item_set_inconsistent (GTK_CHECK_MENU_ITEM (menuitem),
3008 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem),
3009 create_menu (screen, depth - 1, 5, TRUE));
3016 create_table_menu (GdkScreen *screen, gint cols, gint rows, gboolean tearoff)
3019 GtkWidget *menuitem;
3025 menu = gtk_menu_new ();
3026 gtk_menu_set_screen (GTK_MENU (menu), screen);
3031 menuitem = gtk_tearoff_menu_item_new ();
3032 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3033 gtk_widget_show (menuitem);
3037 menuitem = gtk_menu_item_new_with_label ("items");
3038 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3040 submenu = gtk_menu_new ();
3041 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3042 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3043 gtk_widget_show (menuitem);
3046 /* now fill the items submenu */
3047 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3048 GTK_ICON_SIZE_MENU);
3049 gtk_widget_show (image);
3050 menuitem = gtk_image_menu_item_new_with_label ("Image");
3051 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3052 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3053 gtk_widget_show (menuitem);
3055 menuitem = gtk_menu_item_new_with_label ("x");
3056 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 0, 1);
3057 gtk_widget_show (menuitem);
3059 menuitem = gtk_menu_item_new_with_label ("x");
3060 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 2);
3061 gtk_widget_show (menuitem);
3063 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3064 GTK_ICON_SIZE_MENU);
3065 gtk_widget_show (image);
3066 menuitem = gtk_image_menu_item_new_with_label ("Image");
3067 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3068 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3069 gtk_widget_show (menuitem);
3071 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3072 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 2, 3);
3073 gtk_widget_show (menuitem);
3075 menuitem = gtk_menu_item_new_with_label ("x");
3076 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 2, 3);
3077 gtk_widget_show (menuitem);
3079 menuitem = gtk_menu_item_new_with_label ("x");
3080 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 3, 4);
3081 gtk_widget_show (menuitem);
3083 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3084 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 3, 4);
3085 gtk_widget_show (menuitem);
3087 menuitem = gtk_check_menu_item_new_with_label ("Check");
3088 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 4, 5);
3089 gtk_widget_show (menuitem);
3091 menuitem = gtk_menu_item_new_with_label ("x");
3092 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 4, 5);
3093 gtk_widget_show (menuitem);
3095 menuitem = gtk_menu_item_new_with_label ("x");
3096 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 5, 6);
3097 gtk_widget_show (menuitem);
3099 menuitem = gtk_check_menu_item_new_with_label ("Check");
3100 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 5, 6);
3101 gtk_widget_show (menuitem);
3103 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3104 gtk_widget_show (menuitem);
3105 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 8);
3107 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3108 gtk_widget_show (menuitem);
3109 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 2);
3111 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3112 gtk_widget_show (menuitem);
3113 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 0);
3115 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3116 gtk_widget_show (menuitem);
3117 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, -1);
3119 /* end of items submenu */
3121 menuitem = gtk_menu_item_new_with_label ("spanning");
3122 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3124 submenu = gtk_menu_new ();
3125 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3126 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3127 gtk_widget_show (menuitem);
3130 /* now fill the spanning submenu */
3131 menuitem = gtk_menu_item_new_with_label ("a");
3132 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 2, 0, 1);
3133 gtk_widget_show (menuitem);
3135 menuitem = gtk_menu_item_new_with_label ("b");
3136 gtk_menu_attach (GTK_MENU (submenu), menuitem, 2, 3, 0, 2);
3137 gtk_widget_show (menuitem);
3139 menuitem = gtk_menu_item_new_with_label ("c");
3140 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 3);
3141 gtk_widget_show (menuitem);
3143 menuitem = gtk_menu_item_new_with_label ("d");
3144 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3145 gtk_widget_show (menuitem);
3147 menuitem = gtk_menu_item_new_with_label ("e");
3148 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 3, 2, 3);
3149 gtk_widget_show (menuitem);
3150 /* end of spanning submenu */
3152 menuitem = gtk_menu_item_new_with_label ("left");
3153 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, 1, j, j + 1);
3154 submenu = gtk_menu_new ();
3155 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3156 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3157 gtk_widget_show (menuitem);
3159 menuitem = gtk_menu_item_new_with_label ("Empty");
3160 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3161 submenu = gtk_menu_new ();
3162 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3163 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3164 gtk_widget_show (menuitem);
3166 menuitem = gtk_menu_item_new_with_label ("right");
3167 gtk_menu_attach (GTK_MENU (menu), menuitem, 1, 2, j, j + 1);
3168 submenu = gtk_menu_new ();
3169 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3170 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3171 gtk_widget_show (menuitem);
3173 menuitem = gtk_menu_item_new_with_label ("Empty");
3174 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3175 gtk_widget_show (menuitem);
3179 for (; j < rows; j++)
3180 for (i = 0; i < cols; i++)
3182 sprintf (buf, "(%d %d)", i, j);
3183 menuitem = gtk_menu_item_new_with_label (buf);
3184 gtk_menu_attach (GTK_MENU (menu), menuitem, i, i + 1, j, j + 1);
3185 gtk_widget_show (menuitem);
3188 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3189 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 8);
3190 gtk_widget_show (menuitem);
3191 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3192 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 2);
3193 gtk_widget_show (menuitem);
3194 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3195 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 0);
3196 gtk_widget_show (menuitem);
3197 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3198 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, -1);
3199 gtk_widget_show (menuitem);
3205 create_menus (GtkWidget *widget)
3207 static GtkWidget *window = NULL;
3211 GtkWidget *optionmenu;
3212 GtkWidget *separator;
3218 GtkWidget *menuitem;
3219 GtkAccelGroup *accel_group;
3221 GdkScreen *screen = gtk_widget_get_screen (widget);
3223 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3225 gtk_window_set_screen (GTK_WINDOW (window), screen);
3227 g_signal_connect (window, "destroy",
3228 G_CALLBACK (gtk_widget_destroyed),
3230 g_signal_connect (window, "delete-event",
3231 G_CALLBACK (gtk_true),
3234 accel_group = gtk_accel_group_new ();
3235 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3237 gtk_window_set_title (GTK_WINDOW (window), "menus");
3238 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3241 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
3242 gtk_container_add (GTK_CONTAINER (window), box1);
3243 gtk_widget_show (box1);
3245 menubar = gtk_menu_bar_new ();
3246 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3247 gtk_widget_show (menubar);
3249 menu = create_menu (screen, 2, 50, TRUE);
3251 menuitem = gtk_menu_item_new_with_label ("test\nline2");
3252 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3253 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3254 gtk_widget_show (menuitem);
3256 menu = create_table_menu (screen, 2, 50, TRUE);
3258 menuitem = gtk_menu_item_new_with_label ("table");
3259 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3260 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3261 gtk_widget_show (menuitem);
3263 menuitem = gtk_menu_item_new_with_label ("foo");
3264 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5, TRUE));
3265 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3266 gtk_widget_show (menuitem);
3268 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3269 GTK_ICON_SIZE_MENU);
3270 gtk_widget_show (image);
3271 menuitem = gtk_image_menu_item_new_with_label ("Help");
3272 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3273 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 4, 5, TRUE));
3274 gtk_widget_set_hexpand (menuitem, TRUE);
3275 gtk_widget_set_halign (menuitem, GTK_ALIGN_END);
3276 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3277 gtk_widget_show (menuitem);
3279 menubar = gtk_menu_bar_new ();
3280 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3281 gtk_widget_show (menubar);
3283 menu = create_menu (screen, 2, 10, TRUE);
3285 menuitem = gtk_menu_item_new_with_label ("Second menu bar");
3286 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3287 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3288 gtk_widget_show (menuitem);
3290 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3291 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3292 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3293 gtk_widget_show (box2);
3295 menu = create_menu (screen, 1, 5, FALSE);
3296 gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
3298 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
3299 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3300 gtk_widget_show (menuitem);
3302 menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
3303 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3304 gtk_widget_show (menuitem);
3305 gtk_widget_add_accelerator (menuitem,
3311 menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
3312 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3313 gtk_widget_show (menuitem);
3314 gtk_widget_add_accelerator (menuitem,
3319 GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3320 menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
3321 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3322 gtk_widget_show (menuitem);
3323 gtk_widget_add_accelerator (menuitem,
3329 gtk_widget_add_accelerator (menuitem,
3336 optionmenu = gtk_combo_box_text_new ();
3337 gtk_combo_box_set_active (GTK_COMBO_BOX (optionmenu), 3);
3338 gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
3339 gtk_widget_show (optionmenu);
3341 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
3342 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3343 gtk_widget_show (separator);
3345 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3346 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3347 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3348 gtk_widget_show (box2);
3350 button = gtk_button_new_with_label ("close");
3351 g_signal_connect_swapped (button, "clicked",
3352 G_CALLBACK (gtk_widget_destroy),
3354 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3355 gtk_widget_set_can_default (button, TRUE);
3356 gtk_widget_grab_default (button);
3357 gtk_widget_show (button);
3360 if (!gtk_widget_get_visible (window))
3361 gtk_widget_show (window);
3363 gtk_widget_destroy (window);
3366 /* GdkPixbuf RGBA C-Source image dump */
3368 static const guint8 apple[] =
3370 /* Pixbuf magic (0x47646b50) */
3372 /* length: header (24) + pixel_data (2304) */
3374 /* pixdata_type (0x1010002) */
3376 /* rowstride (96) */
3383 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3384 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3385 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3386 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
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\26\24"
3390 "\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"
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`m"
3392 "[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"
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\0\0"
3394 "\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"
3395 "\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"
3396 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3397 "\0\0\0\0\0\0`l\\\20iw_\356y\211h\373x\207g\364~\216i\364u\204e\366gt"
3398 "_\374^jX\241A;-_\0\0\0~\0\0\0\0SM4)SM21B9&\22\320\270\204\1\320\270\204"
3399 "\0\0\0\0\0\0\0\0\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"
3400 "]\212r\200c\366v\205f\371jx_\323_kY\232_kZH^jY\26]iW\211@G9\272:6%j\220"
3401 "\211]\320\221\211`\377\212\203Z\377~xP\377mkE\331]^;|/0\37\21\0\0\0\0"
3402 "\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["
3403 "eT<\216\200Z\203\227\211_\354\234\217c\377\232\217b\362\232\220c\337"
3404 "\243\233k\377\252\241p\377\250\236p\377\241\225h\377\231\214_\377\210"
3405 "\202U\377srI\377[]:\355KO0U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0i"
3406 "v^\200`lY\211^jY\"\0\0\0\0\221\204\\\273\250\233r\377\302\267\224\377"
3407 "\311\300\237\377\272\256\204\377\271\256\177\377\271\257\200\377\267"
3408 "\260\177\377\260\251x\377\250\236l\377\242\225e\377\226\213]\377~zP\377"
3409 "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"
3410 "\0\213\203[v\253\240t\377\334\326\301\377\344\340\317\377\321\312\253"
3411 "\377\303\271\217\377\300\270\213\377\277\267\210\377\272\264\203\377"
3412 "\261\255z\377\250\242n\377\243\232h\377\232\220`\377\210\202V\377nnE"
3413 "\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"
3414 "\234\222e\362\304\274\232\377\337\333\306\377\332\325\273\377\311\302"
3415 "\232\377\312\303\236\377\301\273\216\377\300\271\212\377\270\264\200"
3416 "\377\256\253v\377\246\243n\377\236\232h\377\230\220`\377\213\203V\377"
3417 "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"
3418 "\203Zl\242\234l\377\321\315\260\377\331\324\271\377\320\313\251\377\307"
3419 "\301\232\377\303\276\224\377\300\272\214\377\274\267\206\377\264\260"
3420 "|\377\253\251s\377\244\243n\377\232\230e\377\223\216^\377\207\200U\377"
3421 "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"
3422 "\210\204Y\240\245\237o\377\316\310\253\377\310\303\237\377\304\300\230"
3423 "\377\303\277\225\377\277\272\216\377\274\270\210\377\266\263\200\377"
3424 "\256\254v\377\247\246p\377\237\236j\377\227\226d\377\215\212[\377\203"
3425 "\177T\377qsH\377X]8\377FN.\377DK-\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3426 "\0\0\0\0\207\204X\257\244\240o\377\300\275\231\377\301\275\226\377\274"
3427 "\270\213\377\274\270\214\377\267\264\205\377\264\262\200\377\260\256"
3428 "z\377\251\251s\377\243\244n\377\231\232g\377\220\222`\377\210\211Y\377"
3429 "|}Q\377hlC\377PU3\377CK,\377DL/Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3430 "\0\0\205\204X\220\232\230h\377\261\260\204\377\266\264\212\377\261\260"
3431 "\201\377\263\260\200\377\260\257}\377\256\256x\377\253\254t\377\244\246"
3432 "o\377\233\236i\377\221\224b\377\211\214\\\377\202\204V\377txM\377]b>"
3433 "\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>"
3434 "\215\215_\377\237\237r\377\247\247x\377\247\247t\377\252\252w\377\252"
3435 "\252u\377\252\253t\377\243\246o\377\235\240j\377\223\230c\377\213\217"
3436 "]\377\201\206V\377x}P\377gkD\377RY5\377BI,\377AI,\262\0\0\0\0\0\0\0\0"
3437 "\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"
3438 "\232g\377\234\236i\377\236\241l\377\241\244n\377\240\244m\377\232\237"
3439 "i\377\223\230c\377\212\221]\377\200\210W\377v|P\377jnG\377Za>\377HP2"
3440 "\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"
3441 "\0wzQ6\177\201U\371\206\211Z\377\216\222`\377\220\225a\377\220\225b\377"
3442 "\220\226a\377\213\221_\377\204\213Z\377{\203R\377ryN\377iqH\377^fA\377"
3443 "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"
3444 "\0\0\0\0\0\0\0\0\0\0\0\0ptJTw|Q\371z\177R\377}\202T\377|\203T\377z\200"
3445 "R\377v|O\377pwL\377jpF\377dlB\377`hB\377Yb@\377LT6\377<C*\377\11\12\6"
3446 "\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"
3447 "\0\0\0\0\0\0\0\0\0\0\\`=UgnE\370hnG\377gmE\377djB\377]d>\377[c<\377Y"
3448 "b<\377Zc>\377V_>\377OW8\377BK/\377\16\20\12\377\0\0\0\377\0\0\0\377\0"
3449 "\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"
3450 "\0\1\0\0\0\40\22\24\15\260@D+\377W`;\377OV5\377.3\36\377.3\37\377IP0"
3451 "\377RZ7\377PZ8\3776=&\377\14\15\10\377\0\0\0\377\0\0\0\377\0\0\0\377"
3452 "\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"
3453 "\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"
3454 "\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"
3455 "\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"
3456 "\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"
3457 "\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"
3458 "\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"
3459 "\0\0\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"
3460 "\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"
3461 "\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
3465 accel_button_new (GtkAccelGroup *accel_group,
3470 GdkModifierType modifiers;
3474 gtk_accelerator_parse (accel, &keyval, &modifiers);
3477 button = gtk_button_new ();
3478 gtk_widget_add_accelerator (button, "activate", accel_group,
3479 keyval, modifiers, GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3481 label = gtk_accel_label_new (text);
3482 gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), button);
3483 gtk_widget_show (label);
3485 gtk_container_add (GTK_CONTAINER (button), label);
3491 create_key_lookup (GtkWidget *widget)
3493 static GtkWidget *window = NULL;
3494 gpointer window_ptr;
3498 GtkAccelGroup *accel_group = gtk_accel_group_new ();
3500 GtkWidget *content_area;
3502 window = gtk_dialog_new_with_buttons ("Key Lookup", NULL, 0,
3503 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
3506 gtk_window_set_screen (GTK_WINDOW (window),
3507 gtk_widget_get_screen (widget));
3509 /* We have to expand it so the accel labels will draw their labels
3511 gtk_window_set_default_size (GTK_WINDOW (window), 300, -1);
3513 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3515 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
3517 button = gtk_button_new_with_mnemonic ("Button 1 (_a)");
3518 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3519 button = gtk_button_new_with_mnemonic ("Button 2 (_A)");
3520 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3521 button = gtk_button_new_with_mnemonic ("Button 3 (_\321\204)");
3522 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3523 button = gtk_button_new_with_mnemonic ("Button 4 (_\320\244)");
3524 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3525 button = gtk_button_new_with_mnemonic ("Button 6 (_b)");
3526 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3527 button = accel_button_new (accel_group, "Button 7", "<Alt><Shift>b");
3528 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3529 button = accel_button_new (accel_group, "Button 8", "<Alt>d");
3530 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3531 button = accel_button_new (accel_group, "Button 9", "<Alt>Cyrillic_ve");
3532 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3533 button = gtk_button_new_with_mnemonic ("Button 10 (_1)");
3534 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3535 button = gtk_button_new_with_mnemonic ("Button 11 (_!)");
3536 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3537 button = accel_button_new (accel_group, "Button 12", "<Super>a");
3538 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3539 button = accel_button_new (accel_group, "Button 13", "<Hyper>a");
3540 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3541 button = accel_button_new (accel_group, "Button 14", "<Meta>a");
3542 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3543 button = accel_button_new (accel_group, "Button 15", "<Shift><Mod4>b");
3544 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3546 window_ptr = &window;
3547 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
3548 g_signal_connect (window, "response", G_CALLBACK (gtk_widget_destroy), NULL);
3550 gtk_widget_show_all (window);
3553 gtk_widget_destroy (window);
3562 cmw_destroy_cb(GtkWidget *widget)
3564 /* This is needed to get out of gtk_main */
3571 cmw_color (GtkWidget *widget, GtkWidget *parent)
3574 GtkWidget *colorsel;
3575 GtkWidget *ok_button, *cancel_button;
3577 csd = gtk_color_selection_dialog_new ("This is a modal color selection dialog");
3579 gtk_window_set_screen (GTK_WINDOW (csd), gtk_widget_get_screen (parent));
3581 colorsel = gtk_color_selection_dialog_get_color_selection (GTK_COLOR_SELECTION_DIALOG (csd));
3582 gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (colorsel),
3586 gtk_window_set_modal (GTK_WINDOW(csd),TRUE);
3588 /* And mark it as a transient dialog */
3589 gtk_window_set_transient_for (GTK_WINDOW (csd), GTK_WINDOW (parent));
3591 g_signal_connect (csd, "destroy",
3592 G_CALLBACK (cmw_destroy_cb), NULL);
3595 "ok-button", &ok_button,
3596 "cancel-button", &cancel_button,
3599 g_signal_connect_swapped (ok_button,
3600 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
3601 g_signal_connect_swapped (cancel_button,
3602 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
3604 /* wait until destroy calls gtk_main_quit */
3605 gtk_widget_show (csd);
3610 cmw_file (GtkWidget *widget, GtkWidget *parent)
3614 fs = gtk_file_chooser_dialog_new ("This is a modal file selection dialog",
3615 GTK_WINDOW (parent), GTK_FILE_CHOOSER_ACTION_OPEN,
3616 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
3617 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
3619 gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent));
3620 gtk_window_set_modal (GTK_WINDOW (fs), TRUE);
3622 g_signal_connect (fs, "destroy",
3623 G_CALLBACK (cmw_destroy_cb), NULL);
3624 g_signal_connect_swapped (fs, "response",
3625 G_CALLBACK (gtk_widget_destroy), fs);
3627 /* wait until destroy calls gtk_main_quit */
3628 gtk_widget_show (fs);
3634 create_modal_window (GtkWidget *widget)
3636 GtkWidget *window = NULL;
3637 GtkWidget *box1,*box2;
3639 GtkWidget *btnColor,*btnFile,*btnClose;
3641 /* Create modal window (Here you can use any window descendent )*/
3642 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3643 gtk_window_set_screen (GTK_WINDOW (window),
3644 gtk_widget_get_screen (widget));
3646 gtk_window_set_title (GTK_WINDOW(window),"This window is modal");
3648 /* Set window as modal */
3649 gtk_window_set_modal (GTK_WINDOW(window),TRUE);
3651 /* Create widgets */
3652 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
3653 frame1 = gtk_frame_new ("Standard dialogs in modal form");
3654 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
3655 gtk_box_set_homogeneous (GTK_BOX (box2), TRUE);
3656 btnColor = gtk_button_new_with_label ("Color");
3657 btnFile = gtk_button_new_with_label ("File Selection");
3658 btnClose = gtk_button_new_with_label ("Close");
3661 gtk_container_set_border_width (GTK_CONTAINER (box1), 3);
3662 gtk_container_set_border_width (GTK_CONTAINER (box2), 3);
3665 gtk_container_add (GTK_CONTAINER (window), box1);
3666 gtk_box_pack_start (GTK_BOX (box1), frame1, TRUE, TRUE, 4);
3667 gtk_container_add (GTK_CONTAINER (frame1), box2);
3668 gtk_box_pack_start (GTK_BOX (box2), btnColor, FALSE, FALSE, 4);
3669 gtk_box_pack_start (GTK_BOX (box2), btnFile, FALSE, FALSE, 4);
3670 gtk_box_pack_start (GTK_BOX (box1), gtk_separator_new (GTK_ORIENTATION_HORIZONTAL), FALSE, FALSE, 4);
3671 gtk_box_pack_start (GTK_BOX (box1), btnClose, FALSE, FALSE, 4);
3673 /* connect signals */
3674 g_signal_connect_swapped (btnClose, "clicked",
3675 G_CALLBACK (gtk_widget_destroy), window);
3677 g_signal_connect (window, "destroy",
3678 G_CALLBACK (cmw_destroy_cb), NULL);
3680 g_signal_connect (btnColor, "clicked",
3681 G_CALLBACK (cmw_color), window);
3682 g_signal_connect (btnFile, "clicked",
3683 G_CALLBACK (cmw_file), window);
3686 gtk_widget_show_all (window);
3688 /* wait until dialog get destroyed */
3697 make_message_dialog (GdkScreen *screen,
3699 GtkMessageType type,
3700 GtkButtonsType buttons,
3701 guint default_response)
3705 gtk_widget_destroy (*dialog);
3710 *dialog = gtk_message_dialog_new (NULL, 0, type, buttons,
3711 "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.)");
3713 gtk_window_set_screen (GTK_WINDOW (*dialog), screen);
3715 g_signal_connect_swapped (*dialog,
3717 G_CALLBACK (gtk_widget_destroy),
3720 g_signal_connect (*dialog,
3722 G_CALLBACK (gtk_widget_destroyed),
3725 gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
3727 gtk_widget_show (*dialog);
3731 create_message_dialog (GtkWidget *widget)
3733 static GtkWidget *info = NULL;
3734 static GtkWidget *warning = NULL;
3735 static GtkWidget *error = NULL;
3736 static GtkWidget *question = NULL;
3737 GdkScreen *screen = gtk_widget_get_screen (widget);
3739 make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK);
3740 make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE);
3741 make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK);
3742 make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_NO);
3749 static GtkWidget *sw_parent = NULL;
3750 static GtkWidget *sw_float_parent;
3751 static gulong sw_destroyed_handler = 0;
3754 scrolled_windows_delete_cb (GtkWidget *widget, GdkEventAny *event, GtkWidget *scrollwin)
3756 gtk_widget_reparent (scrollwin, sw_parent);
3758 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
3759 sw_float_parent = NULL;
3761 sw_destroyed_handler = 0;
3767 scrolled_windows_destroy_cb (GtkWidget *widget, GtkWidget *scrollwin)
3769 gtk_widget_destroy (sw_float_parent);
3771 sw_float_parent = NULL;
3773 sw_destroyed_handler = 0;
3777 scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
3781 gtk_widget_reparent (scrollwin, sw_parent);
3782 gtk_widget_destroy (sw_float_parent);
3784 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
3785 sw_float_parent = NULL;
3787 sw_destroyed_handler = 0;
3791 sw_parent = gtk_widget_get_parent (scrollwin);
3792 sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3793 gtk_window_set_screen (GTK_WINDOW (sw_float_parent),
3794 gtk_widget_get_screen (widget));
3796 gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200);
3798 gtk_widget_reparent (scrollwin, sw_float_parent);
3799 gtk_widget_show (sw_float_parent);
3801 sw_destroyed_handler =
3802 g_signal_connect (sw_parent, "destroy",
3803 G_CALLBACK (scrolled_windows_destroy_cb), scrollwin);
3804 g_signal_connect (sw_float_parent, "delete_event",
3805 G_CALLBACK (scrolled_windows_delete_cb), scrollwin);
3810 create_scrolled_windows (GtkWidget *widget)
3812 static GtkWidget *window;
3813 GtkWidget *content_area, *action_area;
3814 GtkWidget *scrolled_window;
3822 window = gtk_dialog_new ();
3824 gtk_window_set_screen (GTK_WINDOW (window),
3825 gtk_widget_get_screen (widget));
3827 g_signal_connect (window, "destroy",
3828 G_CALLBACK (gtk_widget_destroyed),
3831 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
3832 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
3834 gtk_window_set_title (GTK_WINDOW (window), "dialog");
3835 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3837 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
3838 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
3839 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
3840 GTK_POLICY_AUTOMATIC,
3841 GTK_POLICY_AUTOMATIC);
3842 gtk_box_pack_start (GTK_BOX (content_area), scrolled_window, TRUE, TRUE, 0);
3843 gtk_widget_show (scrolled_window);
3845 table = gtk_table_new (20, 20, FALSE);
3846 gtk_table_set_row_spacings (GTK_TABLE (table), 10);
3847 gtk_table_set_col_spacings (GTK_TABLE (table), 10);
3848 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
3849 gtk_container_set_focus_hadjustment (GTK_CONTAINER (table),
3850 gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
3851 gtk_container_set_focus_vadjustment (GTK_CONTAINER (table),
3852 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
3853 gtk_widget_show (table);
3855 for (i = 0; i < 20; i++)
3856 for (j = 0; j < 20; j++)
3858 sprintf (buffer, "button (%d,%d)\n", i, j);
3859 button = gtk_toggle_button_new_with_label (buffer);
3860 gtk_table_attach_defaults (GTK_TABLE (table), button,
3862 gtk_widget_show (button);
3866 button = gtk_button_new_with_label ("Close");
3867 g_signal_connect_swapped (button, "clicked",
3868 G_CALLBACK (gtk_widget_destroy),
3870 gtk_widget_set_can_default (button, TRUE);
3871 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
3872 gtk_widget_grab_default (button);
3873 gtk_widget_show (button);
3875 button = gtk_button_new_with_label ("Reparent Out");
3876 g_signal_connect (button, "clicked",
3877 G_CALLBACK (scrolled_windows_remove),
3879 gtk_widget_set_can_default (button, TRUE);
3880 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
3881 gtk_widget_grab_default (button);
3882 gtk_widget_show (button);
3884 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
3887 if (!gtk_widget_get_visible (window))
3888 gtk_widget_show (window);
3890 gtk_widget_destroy (window);
3898 entry_toggle_frame (GtkWidget *checkbutton,
3901 gtk_entry_set_has_frame (GTK_ENTRY(entry),
3902 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
3906 entry_toggle_sensitive (GtkWidget *checkbutton,
3909 gtk_widget_set_sensitive (entry,
3910 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(checkbutton)));
3914 entry_progress_timeout (gpointer data)
3916 if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (data), "progress-pulse")))
3918 gtk_entry_progress_pulse (GTK_ENTRY (data));
3924 fraction = gtk_entry_get_progress_fraction (GTK_ENTRY (data));
3927 if (fraction > 1.0001)
3930 gtk_entry_set_progress_fraction (GTK_ENTRY (data), fraction);
3937 entry_remove_timeout (gpointer data)
3939 g_source_remove (GPOINTER_TO_UINT (data));
3943 entry_toggle_progress (GtkWidget *checkbutton,
3946 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)))
3948 guint timeout = gdk_threads_add_timeout (100,
3949 entry_progress_timeout,
3951 g_object_set_data_full (G_OBJECT (entry), "timeout-id",
3952 GUINT_TO_POINTER (timeout),
3953 entry_remove_timeout);
3957 g_object_set_data (G_OBJECT (entry), "timeout-id",
3958 GUINT_TO_POINTER (0));
3960 gtk_entry_set_progress_fraction (GTK_ENTRY (entry), 0.0);
3965 entry_toggle_pulse (GtkWidget *checkbutton,
3968 g_object_set_data (G_OBJECT (entry), "progress-pulse",
3969 GUINT_TO_POINTER ((guint) gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton))));
3973 props_clicked (GtkWidget *button,
3976 GtkWidget *window = create_prop_editor (object, 0);
3978 gtk_window_set_title (GTK_WINDOW (window), "Object Properties");
3982 create_entry (GtkWidget *widget)
3984 static GtkWidget *window = NULL;
3988 GtkWidget *has_frame_check;
3989 GtkWidget *sensitive_check;
3990 GtkWidget *progress_check;
3992 GtkComboBoxText *cb;
3993 GtkWidget *cb_entry;
3995 GtkWidget *separator;
3999 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4000 gtk_window_set_screen (GTK_WINDOW (window),
4001 gtk_widget_get_screen (widget));
4003 g_signal_connect (window, "destroy",
4004 G_CALLBACK (gtk_widget_destroyed),
4007 gtk_window_set_title (GTK_WINDOW (window), "entry");
4008 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4011 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4012 gtk_container_add (GTK_CONTAINER (window), box1);
4015 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
4016 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4017 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
4019 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
4020 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
4022 entry = gtk_entry_new ();
4023 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");
4024 gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5);
4025 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
4027 button = gtk_button_new_with_mnemonic ("_Props");
4028 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
4029 g_signal_connect (button, "clicked",
4030 G_CALLBACK (props_clicked),
4033 cb = GTK_COMBO_BOX_TEXT (gtk_combo_box_text_new_with_entry ());
4035 gtk_combo_box_text_append_text (cb, "item0");
4036 gtk_combo_box_text_append_text (cb, "item0");
4037 gtk_combo_box_text_append_text (cb, "item1 item1");
4038 gtk_combo_box_text_append_text (cb, "item2 item2 item2");
4039 gtk_combo_box_text_append_text (cb, "item3 item3 item3 item3");
4040 gtk_combo_box_text_append_text (cb, "item4 item4 item4 item4 item4");
4041 gtk_combo_box_text_append_text (cb, "item5 item5 item5 item5 item5 item5");
4042 gtk_combo_box_text_append_text (cb, "item6 item6 item6 item6 item6");
4043 gtk_combo_box_text_append_text (cb, "item7 item7 item7 item7");
4044 gtk_combo_box_text_append_text (cb, "item8 item8 item8");
4045 gtk_combo_box_text_append_text (cb, "item9 item9");
4047 cb_entry = gtk_bin_get_child (GTK_BIN (cb));
4048 gtk_entry_set_text (GTK_ENTRY (cb_entry), "hello world \n\n\n foo");
4049 gtk_editable_select_region (GTK_EDITABLE (cb_entry), 0, -1);
4050 gtk_box_pack_start (GTK_BOX (box2), GTK_WIDGET (cb), TRUE, TRUE, 0);
4052 sensitive_check = gtk_check_button_new_with_label("Sensitive");
4053 gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0);
4054 g_signal_connect (sensitive_check, "toggled",
4055 G_CALLBACK (entry_toggle_sensitive), entry);
4056 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sensitive_check), TRUE);
4058 has_frame_check = gtk_check_button_new_with_label("Has Frame");
4059 gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0);
4060 g_signal_connect (has_frame_check, "toggled",
4061 G_CALLBACK (entry_toggle_frame), entry);
4062 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
4064 progress_check = gtk_check_button_new_with_label("Show Progress");
4065 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4066 g_signal_connect (progress_check, "toggled",
4067 G_CALLBACK (entry_toggle_progress), entry);
4069 progress_check = gtk_check_button_new_with_label("Pulse Progress");
4070 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4071 g_signal_connect (progress_check, "toggled",
4072 G_CALLBACK (entry_toggle_pulse), entry);
4074 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
4075 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4077 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
4078 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4079 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4081 button = gtk_button_new_with_label ("close");
4082 g_signal_connect_swapped (button, "clicked",
4083 G_CALLBACK (gtk_widget_destroy),
4085 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4086 gtk_widget_set_can_default (button, TRUE);
4087 gtk_widget_grab_default (button);
4090 if (!gtk_widget_get_visible (window))
4091 gtk_widget_show_all (window);
4093 gtk_widget_destroy (window);
4097 create_expander (GtkWidget *widget)
4100 GtkWidget *expander;
4102 static GtkWidget *window = NULL;
4106 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4107 gtk_window_set_screen (GTK_WINDOW (window),
4108 gtk_widget_get_screen (widget));
4110 g_signal_connect (window, "destroy",
4111 G_CALLBACK (gtk_widget_destroyed),
4114 gtk_window_set_title (GTK_WINDOW (window), "expander");
4115 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4117 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4118 gtk_container_add (GTK_CONTAINER (window), box1);
4120 expander = gtk_expander_new ("The Hidden");
4122 gtk_box_pack_start (GTK_BOX (box1), expander, TRUE, TRUE, 0);
4124 hidden = gtk_label_new ("Revealed!");
4126 gtk_container_add (GTK_CONTAINER (expander), hidden);
4129 if (!gtk_widget_get_visible (window))
4130 gtk_widget_show_all (window);
4132 gtk_widget_destroy (window);
4140 event_box_label_pressed (GtkWidget *widget,
4141 GdkEventButton *event,
4144 g_print ("clicked on event box\n");
4148 event_box_button_clicked (GtkWidget *widget,
4152 g_print ("pushed button\n");
4156 event_box_toggle_visible_window (GtkWidget *checkbutton,
4157 GtkEventBox *event_box)
4159 gtk_event_box_set_visible_window (event_box,
4160 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
4164 event_box_toggle_above_child (GtkWidget *checkbutton,
4165 GtkEventBox *event_box)
4167 gtk_event_box_set_above_child (event_box,
4168 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
4172 create_event_box (GtkWidget *widget)
4174 static GtkWidget *window = NULL;
4180 GtkWidget *separator;
4181 GtkWidget *event_box;
4183 GtkWidget *visible_window_check;
4184 GtkWidget *above_child_check;
4194 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4195 gtk_window_set_screen (GTK_WINDOW (window),
4196 gtk_widget_get_screen (widget));
4198 g_signal_connect (window, "destroy",
4199 G_CALLBACK (gtk_widget_destroyed),
4202 gtk_window_set_title (GTK_WINDOW (window), "event box");
4203 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4205 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4206 gtk_container_add (GTK_CONTAINER (window), box1);
4207 gtk_widget_override_background_color (window, 0, &color);
4209 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4210 gtk_box_pack_start (GTK_BOX (box1), hbox, TRUE, FALSE, 0);
4212 event_box = gtk_event_box_new ();
4213 gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, FALSE, 0);
4215 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4216 gtk_container_add (GTK_CONTAINER (event_box), vbox);
4217 g_signal_connect (event_box, "button_press_event",
4218 G_CALLBACK (event_box_label_pressed),
4221 label = gtk_label_new ("Click on this label");
4222 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
4224 button = gtk_button_new_with_label ("button in eventbox");
4225 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, FALSE, 0);
4226 g_signal_connect (button, "clicked",
4227 G_CALLBACK (event_box_button_clicked),
4231 visible_window_check = gtk_check_button_new_with_label("Visible Window");
4232 gtk_box_pack_start (GTK_BOX (box1), visible_window_check, FALSE, TRUE, 0);
4233 g_signal_connect (visible_window_check, "toggled",
4234 G_CALLBACK (event_box_toggle_visible_window), event_box);
4235 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (visible_window_check), FALSE);
4237 above_child_check = gtk_check_button_new_with_label("Above Child");
4238 gtk_box_pack_start (GTK_BOX (box1), above_child_check, FALSE, TRUE, 0);
4239 g_signal_connect (above_child_check, "toggled",
4240 G_CALLBACK (event_box_toggle_above_child), event_box);
4241 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (above_child_check), FALSE);
4243 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
4244 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4246 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
4247 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4248 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4250 button = gtk_button_new_with_label ("close");
4251 g_signal_connect_swapped (button, "clicked",
4252 G_CALLBACK (gtk_widget_destroy),
4254 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4255 gtk_widget_set_can_default (button, TRUE);
4256 gtk_widget_grab_default (button);
4259 if (!gtk_widget_get_visible (window))
4260 gtk_widget_show_all (window);
4262 gtk_widget_destroy (window);
4270 #define SIZE_GROUP_INITIAL_SIZE 50
4273 size_group_hsize_changed (GtkSpinButton *spin_button,
4276 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4277 gtk_spin_button_get_value_as_int (spin_button),
4282 size_group_vsize_changed (GtkSpinButton *spin_button,
4285 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4287 gtk_spin_button_get_value_as_int (spin_button));
4291 create_size_group_window (GdkScreen *screen,
4292 GtkSizeGroup *master_size_group)
4294 GtkWidget *content_area;
4297 GtkWidget *main_button;
4299 GtkWidget *spin_button;
4301 GtkSizeGroup *hgroup1;
4302 GtkSizeGroup *hgroup2;
4303 GtkSizeGroup *vgroup1;
4304 GtkSizeGroup *vgroup2;
4306 window = gtk_dialog_new_with_buttons ("GtkSizeGroup",
4312 gtk_window_set_screen (GTK_WINDOW (window), screen);
4314 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
4316 g_signal_connect (window, "response",
4317 G_CALLBACK (gtk_widget_destroy),
4320 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
4322 table = gtk_table_new (2, 2, FALSE);
4323 gtk_box_pack_start (GTK_BOX (content_area), table, TRUE, TRUE, 0);
4325 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
4326 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
4327 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
4328 gtk_widget_set_size_request (table, 250, 250);
4330 hgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4331 hgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4332 vgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4333 vgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4335 main_button = gtk_button_new_with_label ("X");
4337 gtk_table_attach (GTK_TABLE (table), main_button,
4339 GTK_EXPAND, GTK_EXPAND,
4341 gtk_size_group_add_widget (master_size_group, main_button);
4342 gtk_size_group_add_widget (hgroup1, main_button);
4343 gtk_size_group_add_widget (vgroup1, main_button);
4344 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (main_button)),
4345 SIZE_GROUP_INITIAL_SIZE,
4346 SIZE_GROUP_INITIAL_SIZE);
4348 button = gtk_button_new ();
4349 gtk_table_attach (GTK_TABLE (table), button,
4351 GTK_EXPAND, GTK_EXPAND,
4353 gtk_size_group_add_widget (vgroup1, button);
4354 gtk_size_group_add_widget (vgroup2, button);
4356 button = gtk_button_new ();
4357 gtk_table_attach (GTK_TABLE (table), button,
4359 GTK_EXPAND, GTK_EXPAND,
4361 gtk_size_group_add_widget (hgroup1, button);
4362 gtk_size_group_add_widget (hgroup2, button);
4364 button = gtk_button_new ();
4365 gtk_table_attach (GTK_TABLE (table), button,
4367 GTK_EXPAND, GTK_EXPAND,
4369 gtk_size_group_add_widget (hgroup2, button);
4370 gtk_size_group_add_widget (vgroup2, button);
4372 g_object_unref (hgroup1);
4373 g_object_unref (hgroup2);
4374 g_object_unref (vgroup1);
4375 g_object_unref (vgroup2);
4377 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
4378 gtk_box_pack_start (GTK_BOX (content_area), hbox, FALSE, FALSE, 0);
4380 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4381 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4382 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4383 g_signal_connect (spin_button, "value_changed",
4384 G_CALLBACK (size_group_hsize_changed), main_button);
4386 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4387 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4388 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4389 g_signal_connect (spin_button, "value_changed",
4390 G_CALLBACK (size_group_vsize_changed), main_button);
4396 create_size_groups (GtkWidget *widget)
4398 static GtkWidget *window1 = NULL;
4399 static GtkWidget *window2 = NULL;
4400 static GtkSizeGroup *master_size_group;
4402 if (!master_size_group)
4403 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
4407 window1 = create_size_group_window (gtk_widget_get_screen (widget),
4410 g_signal_connect (window1, "destroy",
4411 G_CALLBACK (gtk_widget_destroyed),
4417 window2 = create_size_group_window (gtk_widget_get_screen (widget),
4420 g_signal_connect (window2, "destroy",
4421 G_CALLBACK (gtk_widget_destroyed),
4425 if (gtk_widget_get_visible (window1) && gtk_widget_get_visible (window2))
4427 gtk_widget_destroy (window1);
4428 gtk_widget_destroy (window2);
4432 if (!gtk_widget_get_visible (window1))
4433 gtk_widget_show_all (window1);
4434 if (!gtk_widget_get_visible (window2))
4435 gtk_widget_show_all (window2);
4443 static GtkWidget *spinner1;
4446 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
4448 gtk_spin_button_set_snap_to_ticks (spin,
4449 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
4453 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
4455 gtk_spin_button_set_numeric (spin,
4456 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
4460 change_digits (GtkWidget *widget, GtkSpinButton *spin)
4462 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
4463 gtk_spin_button_get_value_as_int (spin));
4467 get_value (GtkWidget *widget, gpointer data)
4471 GtkSpinButton *spin;
4473 spin = GTK_SPIN_BUTTON (spinner1);
4474 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
4475 if (GPOINTER_TO_INT (data) == 1)
4476 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
4478 sprintf (buf, "%0.*f",
4479 gtk_spin_button_get_digits (spin),
4480 gtk_spin_button_get_value (spin));
4482 gtk_label_set_text (label, buf);
4486 get_spin_value (GtkWidget *widget, gpointer data)
4490 GtkSpinButton *spin;
4492 spin = GTK_SPIN_BUTTON (widget);
4493 label = GTK_LABEL (data);
4495 buffer = g_strdup_printf ("%0.*f",
4496 gtk_spin_button_get_digits (spin),
4497 gtk_spin_button_get_value (spin));
4498 gtk_label_set_text (label, buffer);
4504 spin_button_time_output_func (GtkSpinButton *spin_button)
4506 GtkAdjustment *adjustment;
4507 static gchar buf[6];
4511 adjustment = gtk_spin_button_get_adjustment (spin_button);
4512 hours = gtk_adjustment_get_value (adjustment) / 60.0;
4513 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
4514 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
4515 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4516 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4521 spin_button_month_input_func (GtkSpinButton *spin_button,
4525 static gchar *month[12] = { "January", "February", "March", "April",
4526 "May", "June", "July", "August",
4527 "September", "October", "November", "December" };
4529 gboolean found = FALSE;
4531 for (i = 1; i <= 12; i++)
4533 tmp1 = g_ascii_strup (month[i - 1], -1);
4534 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
4535 if (strstr (tmp1, tmp2) == tmp1)
4545 return GTK_INPUT_ERROR;
4547 *new_val = (gdouble) i;
4552 spin_button_month_output_func (GtkSpinButton *spin_button)
4554 GtkAdjustment *adjustment;
4557 static gchar *month[12] = { "January", "February", "March", "April",
4558 "May", "June", "July", "August", "September",
4559 "October", "November", "December" };
4561 adjustment = gtk_spin_button_get_adjustment (spin_button);
4562 value = gtk_adjustment_get_value (adjustment);
4563 for (i = 1; i <= 12; i++)
4564 if (fabs (value - (double)i) < 1e-5)
4566 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
4567 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
4573 spin_button_hex_input_func (GtkSpinButton *spin_button,
4580 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
4581 res = strtol(buf, &err, 16);
4584 return GTK_INPUT_ERROR;
4590 spin_button_hex_output_func (GtkSpinButton *spin_button)
4592 GtkAdjustment *adjustment;
4593 static gchar buf[7];
4596 adjustment = gtk_spin_button_get_adjustment (spin_button);
4597 val = (gint) gtk_adjustment_get_value (adjustment);
4598 if (fabs (val) < 1e-5)
4599 sprintf (buf, "0x00");
4601 sprintf (buf, "0x%.2X", val);
4602 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4603 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4608 create_spins (GtkWidget *widget)
4610 static GtkWidget *window = NULL;
4613 GtkWidget *main_vbox;
4616 GtkWidget *spinner2;
4620 GtkWidget *val_label;
4621 GtkAdjustment *adjustment;
4625 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4626 gtk_window_set_screen (GTK_WINDOW (window),
4627 gtk_widget_get_screen (widget));
4629 g_signal_connect (window, "destroy",
4630 G_CALLBACK (gtk_widget_destroyed),
4633 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
4635 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
4636 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
4637 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4639 frame = gtk_frame_new ("Not accelerated");
4640 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4642 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4643 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4644 gtk_container_add (GTK_CONTAINER (frame), vbox);
4646 /* Time, month, hex spinners */
4648 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4649 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
4651 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4652 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4654 label = gtk_label_new ("Time :");
4655 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4656 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4658 adjustment = gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
4659 spinner = gtk_spin_button_new (adjustment, 0, 0);
4660 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
4661 g_signal_connect (spinner,
4663 G_CALLBACK (spin_button_time_output_func),
4665 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4666 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 5);
4667 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4669 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4670 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4672 label = gtk_label_new ("Month :");
4673 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4674 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4676 adjustment = gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
4678 spinner = gtk_spin_button_new (adjustment, 0, 0);
4679 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
4680 GTK_UPDATE_IF_VALID);
4681 g_signal_connect (spinner,
4683 G_CALLBACK (spin_button_month_input_func),
4685 g_signal_connect (spinner,
4687 G_CALLBACK (spin_button_month_output_func),
4689 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4690 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 9);
4691 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4693 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4694 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4696 label = gtk_label_new ("Hex :");
4697 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4698 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4700 adjustment = gtk_adjustment_new (0, 0, 255, 1, 16, 0);
4701 spinner = gtk_spin_button_new (adjustment, 0, 0);
4702 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
4703 g_signal_connect (spinner,
4705 G_CALLBACK (spin_button_hex_input_func),
4707 g_signal_connect (spinner,
4709 G_CALLBACK (spin_button_hex_output_func),
4711 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4712 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 4);
4713 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4715 frame = gtk_frame_new ("Accelerated");
4716 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4718 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4719 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4720 gtk_container_add (GTK_CONTAINER (frame), vbox);
4722 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4723 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4725 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4726 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4728 label = gtk_label_new ("Value :");
4729 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4730 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4732 adjustment = gtk_adjustment_new (0.0, -10000.0, 10000.0,
4734 spinner1 = gtk_spin_button_new (adjustment, 1.0, 2);
4735 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
4736 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
4738 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4739 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4741 label = gtk_label_new ("Digits :");
4742 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4743 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4745 adjustment = gtk_adjustment_new (2, 1, 15, 1, 1, 0);
4746 spinner2 = gtk_spin_button_new (adjustment, 0.0, 0);
4747 g_signal_connect (adjustment, "value_changed",
4748 G_CALLBACK (change_digits),
4750 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
4752 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4753 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
4755 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
4756 g_signal_connect (button, "clicked",
4757 G_CALLBACK (toggle_snap),
4759 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4760 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4762 button = gtk_check_button_new_with_label ("Numeric only input mode");
4763 g_signal_connect (button, "clicked",
4764 G_CALLBACK (toggle_numeric),
4766 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4767 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4769 val_label = gtk_label_new ("");
4771 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4772 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4774 button = gtk_button_new_with_label ("Value as Int");
4775 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4776 g_signal_connect (button, "clicked",
4777 G_CALLBACK (get_value),
4778 GINT_TO_POINTER (1));
4779 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4781 button = gtk_button_new_with_label ("Value as Float");
4782 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4783 g_signal_connect (button, "clicked",
4784 G_CALLBACK (get_value),
4785 GINT_TO_POINTER (2));
4786 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4788 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
4789 gtk_label_set_text (GTK_LABEL (val_label), "0");
4791 frame = gtk_frame_new ("Using Convenience Constructor");
4792 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4794 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4795 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4796 gtk_container_add (GTK_CONTAINER (frame), hbox);
4798 val_label = gtk_label_new ("0.0");
4800 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
4801 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
4802 g_signal_connect (spinner, "value_changed",
4803 G_CALLBACK (get_spin_value), val_label);
4804 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
4805 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
4807 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4808 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
4810 button = gtk_button_new_with_label ("Close");
4811 g_signal_connect_swapped (button, "clicked",
4812 G_CALLBACK (gtk_widget_destroy),
4814 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4817 if (!gtk_widget_get_visible (window))
4818 gtk_widget_show_all (window);
4820 gtk_widget_destroy (window);
4829 cursor_draw (GtkWidget *widget,
4834 GtkStyleContext *context;
4837 width = gtk_widget_get_allocated_width (widget);
4838 height = gtk_widget_get_allocated_height (widget);
4840 cairo_set_source_rgb (cr, 1, 1, 1);
4841 cairo_rectangle (cr, 0, 0, width, height / 2);
4844 cairo_set_source_rgb (cr, 0, 0, 0);
4845 cairo_rectangle (cr, 0, height / 2, width, height / 2);
4848 context = gtk_widget_get_style_context (widget);
4849 gtk_style_context_get (context, 0, "background-color", &bg, NULL);
4850 gdk_cairo_set_source_rgba (cr, bg);
4852 cairo_rectangle (cr, width / 3, height / 3, width / 3, height / 3);
4859 set_cursor (GtkWidget *spinner,
4868 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
4871 label = g_object_get_data (G_OBJECT (spinner), "user_data");
4873 class = g_type_class_ref (GDK_TYPE_CURSOR_TYPE);
4874 vals = class->values;
4876 while (vals && vals->value != c)
4879 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
4881 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
4883 g_type_class_unref (class);
4885 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
4886 gdk_window_set_cursor (gtk_widget_get_window (widget),
4888 g_object_unref (cursor);
4892 cursor_event (GtkWidget *widget,
4894 GtkSpinButton *spinner)
4896 if ((event->type == GDK_BUTTON_PRESS) &&
4897 ((event->button.button == 1) ||
4898 (event->button.button == 3)))
4900 gtk_spin_button_spin (spinner, event->button.button == 1 ?
4901 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
4908 #ifdef GDK_WINDOWING_X11
4909 #include "x11/gdkx.h"
4912 change_cursor_theme (GtkWidget *widget,
4919 children = gtk_container_get_children (GTK_CONTAINER (data));
4921 theme = gtk_entry_get_text (GTK_ENTRY (children->next->data));
4922 size = (gint) gtk_spin_button_get_value (GTK_SPIN_BUTTON (children->next->next->data));
4924 g_list_free (children);
4926 gdk_x11_display_set_cursor_theme (gtk_widget_get_display (widget),
4933 create_cursors (GtkWidget *widget)
4935 static GtkWidget *window = NULL;
4938 GtkWidget *main_vbox;
4945 GtkAdjustment *adjustment;
4951 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4952 gtk_window_set_screen (GTK_WINDOW (window),
4953 gtk_widget_get_screen (widget));
4955 g_signal_connect (window, "destroy",
4956 G_CALLBACK (gtk_widget_destroyed),
4959 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
4961 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
4962 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
4963 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4966 g_object_new (GTK_TYPE_BOX,
4967 "orientation", GTK_ORIENTATION_VERTICAL,
4968 "GtkBox::homogeneous", FALSE,
4969 "GtkBox::spacing", 5,
4970 "GtkContainer::border_width", 10,
4971 "GtkWidget::parent", main_vbox,
4972 "GtkWidget::visible", TRUE,
4975 #ifdef GDK_WINDOWING_X11
4976 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4977 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4978 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
4980 label = gtk_label_new ("Cursor Theme : ");
4981 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4982 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
4984 entry = gtk_entry_new ();
4985 gtk_entry_set_text (GTK_ENTRY (entry), "default");
4986 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, TRUE, 0);
4988 size = gtk_spin_button_new_with_range (1.0, 64.0, 1.0);
4989 gtk_spin_button_set_value (GTK_SPIN_BUTTON (size), 24.0);
4990 gtk_box_pack_start (GTK_BOX (hbox), size, TRUE, TRUE, 0);
4992 g_signal_connect (entry, "changed",
4993 G_CALLBACK (change_cursor_theme), hbox);
4994 g_signal_connect (size, "changed",
4995 G_CALLBACK (change_cursor_theme), hbox);
4998 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4999 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5000 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5002 label = gtk_label_new ("Cursor Value : ");
5003 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5004 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5006 adjustment = gtk_adjustment_new (0,
5010 spinner = gtk_spin_button_new (adjustment, 0, 0);
5011 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
5014 g_object_new (gtk_frame_get_type (),
5015 "GtkFrame::label_xalign", 0.5,
5016 "GtkFrame::label", "Cursor Area",
5017 "GtkContainer::border_width", 10,
5018 "GtkWidget::parent", vbox,
5019 "GtkWidget::visible", TRUE,
5022 darea = gtk_drawing_area_new ();
5023 gtk_widget_set_size_request (darea, 80, 80);
5024 gtk_container_add (GTK_CONTAINER (frame), darea);
5025 g_signal_connect (darea,
5027 G_CALLBACK (cursor_draw),
5029 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
5030 g_signal_connect (darea,
5031 "button_press_event",
5032 G_CALLBACK (cursor_event),
5034 gtk_widget_show (darea);
5036 g_signal_connect (spinner, "changed",
5037 G_CALLBACK (set_cursor),
5040 label = g_object_new (GTK_TYPE_LABEL,
5045 gtk_container_child_set (GTK_CONTAINER (vbox), label,
5048 g_object_set_data (G_OBJECT (spinner), "user_data", label);
5051 g_object_new (gtk_hseparator_get_type (),
5052 "GtkWidget::visible", TRUE,
5054 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
5056 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
5057 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
5058 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5060 button = gtk_button_new_with_label ("Close");
5061 g_signal_connect_swapped (button, "clicked",
5062 G_CALLBACK (gtk_widget_destroy),
5064 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5066 gtk_widget_show_all (window);
5068 set_cursor (spinner, darea);
5071 gtk_widget_destroy (window);
5079 color_selection_ok (GtkWidget *w,
5080 GtkColorSelectionDialog *cs)
5082 GtkWidget *colorsel;
5085 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5087 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5088 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5092 color_selection_changed (GtkWidget *w,
5093 GtkColorSelectionDialog *cs)
5095 GtkWidget *colorsel;
5098 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5099 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5100 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5105 opacity_toggled_cb (GtkWidget *w,
5106 GtkColorSelectionDialog *cs)
5108 GtkColorSelection *colorsel;
5110 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5111 gtk_color_selection_set_has_opacity_control (colorsel,
5112 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5116 palette_toggled_cb (GtkWidget *w,
5117 GtkColorSelectionDialog *cs)
5119 GtkColorSelection *colorsel;
5121 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5122 gtk_color_selection_set_has_palette (colorsel,
5123 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5128 create_color_selection (GtkWidget *widget)
5130 static GtkWidget *window = NULL;
5139 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5140 gtk_window_set_screen (GTK_WINDOW (window),
5141 gtk_widget_get_screen (widget));
5143 g_signal_connect (window, "destroy",
5144 G_CALLBACK (gtk_widget_destroyed),
5147 gtk_window_set_title (GTK_WINDOW (window), "GtkColorButton");
5148 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5150 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
5151 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5152 gtk_container_add (GTK_CONTAINER (window), hbox);
5154 label = gtk_label_new ("Pick a color");
5155 gtk_container_add (GTK_CONTAINER (hbox), label);
5157 picker = gtk_color_button_new ();
5158 gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (picker), TRUE);
5159 gtk_container_add (GTK_CONTAINER (hbox), picker);
5161 button = gtk_button_new_with_mnemonic ("_Props");
5162 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
5163 g_signal_connect (button, "clicked",
5164 G_CALLBACK (props_clicked),
5168 if (!gtk_widget_get_visible (window))
5169 gtk_widget_show_all (window);
5171 gtk_widget_destroy (window);
5175 flipping_toggled_cb (GtkWidget *widget, gpointer data)
5177 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
5178 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
5180 gtk_widget_set_default_direction (new_direction);
5184 orientable_toggle_orientation (GtkOrientable *orientable)
5186 GtkOrientation orientation;
5188 orientation = gtk_orientable_get_orientation (orientable);
5189 gtk_orientable_set_orientation (orientable,
5190 orientation == GTK_ORIENTATION_HORIZONTAL ?
5191 GTK_ORIENTATION_VERTICAL :
5192 GTK_ORIENTATION_HORIZONTAL);
5194 if (GTK_IS_CONTAINER (orientable))
5199 children = gtk_container_get_children (GTK_CONTAINER (orientable));
5201 for (child = children; child; child = child->next)
5203 if (GTK_IS_ORIENTABLE (child->data))
5204 orientable_toggle_orientation (child->data);
5207 g_list_free (children);
5212 flipping_orientation_toggled_cb (GtkWidget *widget, gpointer data)
5214 GtkWidget *content_area;
5215 GtkWidget *toplevel;
5217 toplevel = gtk_widget_get_toplevel (widget);
5218 content_area = gtk_dialog_get_content_area (GTK_DIALOG (toplevel));
5219 orientable_toggle_orientation (GTK_ORIENTABLE (content_area));
5223 set_direction_recurse (GtkWidget *widget,
5226 GtkTextDirection *dir = data;
5228 gtk_widget_set_direction (widget, *dir);
5229 if (GTK_IS_CONTAINER (widget))
5230 gtk_container_foreach (GTK_CONTAINER (widget),
5231 set_direction_recurse,
5236 create_forward_back (const char *title,
5237 GtkTextDirection text_dir)
5239 GtkWidget *frame = gtk_frame_new (title);
5240 GtkWidget *bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
5241 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
5242 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
5244 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
5246 gtk_container_add (GTK_CONTAINER (frame), bbox);
5247 gtk_container_add (GTK_CONTAINER (bbox), back_button);
5248 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
5250 set_direction_recurse (frame, &text_dir);
5256 create_flipping (GtkWidget *widget)
5258 static GtkWidget *window = NULL;
5259 GtkWidget *check_button, *button;
5260 GtkWidget *action_area, *content_area;
5264 window = gtk_dialog_new ();
5266 gtk_window_set_screen (GTK_WINDOW (window),
5267 gtk_widget_get_screen (widget));
5269 g_signal_connect (window, "destroy",
5270 G_CALLBACK (gtk_widget_destroyed),
5273 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5274 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
5276 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
5278 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
5279 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5280 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5282 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
5283 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
5285 g_signal_connect (check_button, "toggled",
5286 G_CALLBACK (flipping_toggled_cb), NULL);
5288 check_button = gtk_check_button_new_with_label ("Toggle orientation of all boxes");
5289 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5290 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5292 g_signal_connect (check_button, "toggled",
5293 G_CALLBACK (flipping_orientation_toggled_cb), NULL);
5295 gtk_box_pack_start (GTK_BOX (content_area),
5296 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
5299 gtk_box_pack_start (GTK_BOX (content_area),
5300 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
5303 gtk_box_pack_start (GTK_BOX (content_area),
5304 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
5307 button = gtk_button_new_with_label ("Close");
5308 g_signal_connect_swapped (button, "clicked",
5309 G_CALLBACK (gtk_widget_destroy), window);
5310 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5313 if (!gtk_widget_get_visible (window))
5314 gtk_widget_show_all (window);
5316 gtk_widget_destroy (window);
5324 make_focus_table (GList **list)
5329 table = gtk_table_new (5, 5, FALSE);
5342 widget = gtk_entry_new ();
5344 widget = gtk_button_new_with_label ("Foo");
5346 *list = g_list_prepend (*list, widget);
5348 gtk_table_attach (GTK_TABLE (table),
5352 GTK_EXPAND | GTK_FILL,
5353 GTK_EXPAND | GTK_FILL,
5362 *list = g_list_reverse (*list);
5368 create_focus (GtkWidget *widget)
5370 static GtkWidget *window = NULL;
5374 GtkWidget *content_area;
5379 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
5385 gtk_window_set_screen (GTK_WINDOW (window),
5386 gtk_widget_get_screen (widget));
5388 g_signal_connect (window, "destroy",
5389 G_CALLBACK (gtk_widget_destroyed),
5392 g_signal_connect (window, "response",
5393 G_CALLBACK (gtk_widget_destroy),
5396 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5398 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
5400 frame = gtk_frame_new ("Weird tab focus chain");
5402 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5404 table = make_focus_table (&list);
5406 gtk_container_add (GTK_CONTAINER (frame), table);
5408 gtk_container_set_focus_chain (GTK_CONTAINER (table),
5413 frame = gtk_frame_new ("Default tab focus chain");
5415 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5418 table = make_focus_table (&list);
5422 gtk_container_add (GTK_CONTAINER (frame), table);
5425 if (!gtk_widget_get_visible (window))
5426 gtk_widget_show_all (window);
5428 gtk_widget_destroy (window);
5436 font_selection_ok (GtkWidget *w,
5437 GtkFontSelectionDialog *fs)
5439 gchar *s = gtk_font_selection_dialog_get_font_name (fs);
5441 g_print ("%s\n", s);
5443 gtk_widget_destroy (GTK_WIDGET (fs));
5447 create_font_selection (GtkWidget *widget)
5449 static GtkWidget *window = NULL;
5457 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5458 gtk_window_set_screen (GTK_WINDOW (window),
5459 gtk_widget_get_screen (widget));
5461 g_signal_connect (window, "destroy",
5462 G_CALLBACK (gtk_widget_destroyed),
5465 gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
5466 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5468 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
5469 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5470 gtk_container_add (GTK_CONTAINER (window), hbox);
5472 label = gtk_label_new ("Pick a font");
5473 gtk_container_add (GTK_CONTAINER (hbox), label);
5475 picker = gtk_font_button_new ();
5476 gtk_font_button_set_use_font (GTK_FONT_BUTTON (picker), TRUE);
5477 gtk_container_add (GTK_CONTAINER (hbox), picker);
5480 if (!gtk_widget_get_visible (window))
5481 gtk_widget_show_all (window);
5483 gtk_widget_destroy (window);
5490 static GtkWidget *dialog_window = NULL;
5493 label_toggle (GtkWidget *widget,
5498 *label = gtk_label_new ("Dialog Test");
5499 g_signal_connect (*label,
5501 G_CALLBACK (gtk_widget_destroyed),
5503 gtk_misc_set_padding (GTK_MISC (*label), 10, 10);
5504 gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog_window))),
5505 *label, TRUE, TRUE, 0);
5506 gtk_widget_show (*label);
5509 gtk_widget_destroy (*label);
5513 create_dialog (GtkWidget *widget)
5515 static GtkWidget *label;
5516 GtkWidget *action_area;
5521 /* This is a terrible example; it's much simpler to create
5522 * dialogs than this. Don't use testgtk for example code,
5526 dialog_window = gtk_dialog_new ();
5527 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5528 gtk_widget_get_screen (widget));
5530 g_signal_connect (dialog_window, "destroy",
5531 G_CALLBACK (gtk_widget_destroyed),
5534 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5536 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
5537 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5539 button = gtk_button_new_with_label ("OK");
5540 gtk_widget_set_can_default (button, TRUE);
5541 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5542 gtk_widget_grab_default (button);
5543 gtk_widget_show (button);
5545 button = gtk_button_new_with_label ("Toggle");
5546 g_signal_connect (button, "clicked",
5547 G_CALLBACK (label_toggle),
5549 gtk_widget_set_can_default (button, TRUE);
5550 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5551 gtk_widget_show (button);
5556 if (!gtk_widget_get_visible (dialog_window))
5557 gtk_widget_show (dialog_window);
5559 gtk_widget_destroy (dialog_window);
5562 /* Display & Screen test
5569 GtkWidget *radio_dpy;
5570 GtkWidget *toplevel;
5571 GtkWidget *dialog_window;
5572 } ScreenDisplaySelection;
5575 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
5577 const gchar *display_name;
5578 GdkDisplay *display = gtk_widget_get_display (widget);
5580 GdkScreen *new_screen = NULL;
5581 GdkScreen *current_screen = gtk_widget_get_screen (widget);
5583 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
5585 display_name = gtk_entry_get_text (GTK_ENTRY (data->entry));
5586 display = gdk_display_open (display_name);
5590 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
5591 GTK_DIALOG_DESTROY_WITH_PARENT,
5594 "The display :\n%s\ncannot be opened",
5596 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
5597 gtk_widget_show (dialog);
5598 g_signal_connect (dialog, "response",
5599 G_CALLBACK (gtk_widget_destroy),
5604 GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (data->combo));
5607 gboolean found = FALSE;
5608 while (gtk_tree_model_iter_nth_child (model, &iter, NULL, i++))
5611 gtk_tree_model_get (model, &iter, 0, &name, -1);
5612 found = !g_ascii_strcasecmp (display_name, name);
5619 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (data->combo), display_name);
5620 new_screen = gdk_display_get_default_screen (display);
5625 gint number_of_screens = gdk_display_get_n_screens (display);
5626 gint screen_num = gdk_screen_get_number (current_screen);
5627 if ((screen_num +1) < number_of_screens)
5628 new_screen = gdk_display_get_screen (display, screen_num + 1);
5630 new_screen = gdk_display_get_screen (display, 0);
5635 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
5636 gtk_widget_destroy (data->dialog_window);
5641 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
5643 gtk_widget_destroy (data);
5647 create_display_screen (GtkWidget *widget)
5649 GtkWidget *table, *frame, *window, *combo_dpy, *vbox;
5650 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
5652 ScreenDisplaySelection *scr_dpy_data;
5653 GdkScreen *screen = gtk_widget_get_screen (widget);
5654 GdkDisplay *display = gdk_screen_get_display (screen);
5656 window = g_object_new (gtk_window_get_type (),
5659 "type", GTK_WINDOW_TOPLEVEL,
5661 "Screen or Display selection",
5662 "border_width", 10, NULL);
5663 g_signal_connect (window, "destroy",
5664 G_CALLBACK (gtk_widget_destroy), NULL);
5666 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
5667 gtk_container_add (GTK_CONTAINER (window), vbox);
5669 frame = gtk_frame_new ("Select screen or display");
5670 gtk_container_add (GTK_CONTAINER (vbox), frame);
5672 table = gtk_table_new (2, 2, TRUE);
5673 gtk_table_set_row_spacings (GTK_TABLE (table), 3);
5674 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
5676 gtk_container_add (GTK_CONTAINER (frame), table);
5678 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
5679 if (gdk_display_get_n_screens(display) > 1)
5680 radio_scr = gtk_radio_button_new_with_label
5681 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
5684 radio_scr = gtk_radio_button_new_with_label
5685 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
5686 "only one screen on the current display");
5687 gtk_widget_set_sensitive (radio_scr, FALSE);
5689 combo_dpy = gtk_combo_box_text_new_with_entry ();
5690 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_dpy), "diabolo:0.0");
5691 gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (combo_dpy))),
5692 "<hostname>:<X Server Num>.<Screen Num>");
5694 gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1);
5695 gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2);
5696 gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1);
5698 bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
5699 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
5700 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
5702 gtk_container_add (GTK_CONTAINER (vbox), bbox);
5704 gtk_container_add (GTK_CONTAINER (bbox), applyb);
5705 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
5707 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
5709 scr_dpy_data->entry = gtk_bin_get_child (GTK_BIN (combo_dpy));
5710 scr_dpy_data->radio_dpy = radio_dpy;
5711 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
5712 scr_dpy_data->dialog_window = window;
5714 g_signal_connect (cancelb, "clicked",
5715 G_CALLBACK (screen_display_destroy_diag), window);
5716 g_signal_connect (applyb, "clicked",
5717 G_CALLBACK (screen_display_check), scr_dpy_data);
5718 gtk_widget_show_all (window);
5723 static gulong event_watcher_enter_id = 0;
5724 static gulong event_watcher_leave_id = 0;
5727 event_watcher (GSignalInvocationHint *ihint,
5728 guint n_param_values,
5729 const GValue *param_values,
5732 g_print ("Watch: \"%s\" emitted for %s\n",
5733 g_signal_name (ihint->signal_id),
5734 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
5740 event_watcher_down (void)
5742 if (event_watcher_enter_id)
5746 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5747 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
5748 event_watcher_enter_id = 0;
5749 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5750 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
5751 event_watcher_leave_id = 0;
5756 event_watcher_toggle (void)
5758 if (event_watcher_enter_id)
5759 event_watcher_down ();
5764 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5765 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5766 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5767 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5772 create_event_watcher (GtkWidget *widget)
5774 GtkWidget *action_area, *content_area;
5779 dialog_window = gtk_dialog_new ();
5780 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5781 gtk_widget_get_screen (widget));
5783 g_signal_connect (dialog_window, "destroy",
5784 G_CALLBACK (gtk_widget_destroyed),
5786 g_signal_connect (dialog_window, "destroy",
5787 G_CALLBACK (event_watcher_down),
5790 content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog_window));
5791 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5793 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
5794 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5795 gtk_widget_set_size_request (dialog_window, 200, 110);
5797 button = gtk_toggle_button_new_with_label ("Activate Watch");
5798 g_signal_connect (button, "clicked",
5799 G_CALLBACK (event_watcher_toggle),
5801 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
5802 gtk_box_pack_start (GTK_BOX (content_area), button, TRUE, TRUE, 0);
5803 gtk_widget_show (button);
5805 button = gtk_button_new_with_label ("Close");
5806 g_signal_connect_swapped (button, "clicked",
5807 G_CALLBACK (gtk_widget_destroy),
5809 gtk_widget_set_can_default (button, TRUE);
5810 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5811 gtk_widget_grab_default (button);
5812 gtk_widget_show (button);
5815 if (!gtk_widget_get_visible (dialog_window))
5816 gtk_widget_show (dialog_window);
5818 gtk_widget_destroy (dialog_window);
5826 reformat_value (GtkScale *scale,
5829 return g_strdup_printf ("-->%0.*g<--",
5830 gtk_scale_get_digits (scale), value);
5834 create_range_controls (GtkWidget *widget)
5836 static GtkWidget *window = NULL;
5840 GtkWidget *scrollbar;
5842 GtkWidget *separator;
5843 GtkAdjustment *adjustment;
5848 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5850 gtk_window_set_screen (GTK_WINDOW (window),
5851 gtk_widget_get_screen (widget));
5853 g_signal_connect (window, "destroy",
5854 G_CALLBACK (gtk_widget_destroyed),
5857 gtk_window_set_title (GTK_WINDOW (window), "range controls");
5858 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5861 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
5862 gtk_container_add (GTK_CONTAINER (window), box1);
5863 gtk_widget_show (box1);
5866 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
5867 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5868 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
5869 gtk_widget_show (box2);
5872 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
5874 scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5875 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
5876 gtk_scale_set_digits (GTK_SCALE (scale), 1);
5877 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5878 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
5879 gtk_widget_show (scale);
5881 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5882 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
5883 gtk_widget_show (scrollbar);
5885 scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5886 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5887 g_signal_connect (scale,
5889 G_CALLBACK (reformat_value),
5891 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
5892 gtk_widget_show (scale);
5894 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
5896 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5897 gtk_widget_set_size_request (scale, -1, 200);
5898 gtk_scale_set_digits (GTK_SCALE (scale), 2);
5899 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5900 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5901 gtk_widget_show (scale);
5903 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5904 gtk_widget_set_size_request (scale, -1, 200);
5905 gtk_scale_set_digits (GTK_SCALE (scale), 2);
5906 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5907 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
5908 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5909 gtk_widget_show (scale);
5911 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5912 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5913 g_signal_connect (scale,
5915 G_CALLBACK (reformat_value),
5917 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5918 gtk_widget_show (scale);
5921 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
5922 gtk_widget_show (hbox);
5924 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
5925 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
5926 gtk_widget_show (separator);
5929 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
5930 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5931 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
5932 gtk_widget_show (box2);
5935 button = gtk_button_new_with_label ("close");
5936 g_signal_connect_swapped (button, "clicked",
5937 G_CALLBACK (gtk_widget_destroy),
5939 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
5940 gtk_widget_set_can_default (button, TRUE);
5941 gtk_widget_grab_default (button);
5942 gtk_widget_show (button);
5945 if (!gtk_widget_get_visible (window))
5946 gtk_widget_show (window);
5948 gtk_widget_destroy (window);
5955 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
5956 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
5957 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
5958 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
5959 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
5960 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
5961 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
5962 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
5965 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
5971 static const char * book_open_xpm[] = {
5994 static const char * book_closed_xpm[] = {
6019 GdkPixbuf *book_open;
6020 GdkPixbuf *book_closed;
6021 GtkWidget *sample_notebook;
6024 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
6026 GtkWidget *page_widget;
6029 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
6031 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
6032 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6034 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
6035 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6039 page_switch (GtkWidget *widget, gpointer *page, gint page_num)
6041 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
6042 gint old_page_num = gtk_notebook_get_current_page (notebook);
6044 if (page_num == old_page_num)
6047 set_page_image (notebook, page_num, book_open);
6049 if (old_page_num != -1)
6050 set_page_image (notebook, old_page_num, book_closed);
6054 tab_fill (GtkToggleButton *button, GtkWidget *child)
6056 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
6057 "tab-fill", gtk_toggle_button_get_active (button),
6062 tab_expand (GtkToggleButton *button, GtkWidget *child)
6064 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
6065 "tab-expand", gtk_toggle_button_get_active (button),
6070 create_pages (GtkNotebook *notebook, gint start, gint end)
6072 GtkWidget *child = NULL;
6077 GtkWidget *label_box;
6078 GtkWidget *menu_box;
6082 char accel_buffer[32];
6084 for (i = start; i <= end; i++)
6086 sprintf (buffer, "Page %d", i);
6087 sprintf (accel_buffer, "Page _%d", i);
6089 child = gtk_frame_new (buffer);
6090 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
6092 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6093 gtk_box_set_homogeneous (GTK_BOX (vbox), TRUE);
6094 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
6095 gtk_container_add (GTK_CONTAINER (child), vbox);
6097 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6098 gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE);
6099 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
6101 button = gtk_check_button_new_with_label ("Fill Tab");
6102 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6103 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
6104 g_signal_connect (button, "toggled",
6105 G_CALLBACK (tab_fill), child);
6107 button = gtk_check_button_new_with_label ("Expand Tab");
6108 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6109 g_signal_connect (button, "toggled",
6110 G_CALLBACK (tab_expand), child);
6112 button = gtk_button_new_with_label ("Hide Page");
6113 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
6114 g_signal_connect_swapped (button, "clicked",
6115 G_CALLBACK (gtk_widget_hide),
6118 gtk_widget_show_all (child);
6120 label_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6121 pixwid = gtk_image_new_from_pixbuf (book_closed);
6122 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
6124 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
6125 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6126 label = gtk_label_new_with_mnemonic (accel_buffer);
6127 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
6128 gtk_widget_show_all (label_box);
6131 menu_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6132 pixwid = gtk_image_new_from_pixbuf (book_closed);
6133 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
6135 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
6136 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6137 label = gtk_label_new (buffer);
6138 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
6139 gtk_widget_show_all (menu_box);
6141 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
6146 rotate_notebook (GtkButton *button,
6147 GtkNotebook *notebook)
6149 gtk_notebook_set_tab_pos (notebook, (gtk_notebook_get_tab_pos (notebook) + 1) % 4);
6153 show_all_pages (GtkButton *button,
6154 GtkNotebook *notebook)
6156 gtk_container_foreach (GTK_CONTAINER (notebook),
6157 (GtkCallback) gtk_widget_show, NULL);
6161 notebook_type_changed (GtkWidget *optionmenu,
6164 GtkNotebook *notebook;
6174 notebook = GTK_NOTEBOOK (data);
6176 c = gtk_combo_box_get_active (GTK_COMBO_BOX (optionmenu));
6181 /* standard notebook */
6182 gtk_notebook_set_show_tabs (notebook, TRUE);
6183 gtk_notebook_set_show_border (notebook, TRUE);
6184 gtk_notebook_set_scrollable (notebook, FALSE);
6188 /* notabs notebook */
6189 gtk_notebook_set_show_tabs (notebook, FALSE);
6190 gtk_notebook_set_show_border (notebook, TRUE);
6195 gtk_notebook_set_show_tabs (notebook, FALSE);
6196 gtk_notebook_set_show_border (notebook, FALSE);
6201 gtk_notebook_set_show_tabs (notebook, TRUE);
6202 gtk_notebook_set_show_border (notebook, TRUE);
6203 gtk_notebook_set_scrollable (notebook, TRUE);
6204 if (gtk_notebook_get_n_pages (notebook) == 5)
6205 create_pages (notebook, 6, 15);
6211 if (gtk_notebook_get_n_pages (notebook) == 15)
6212 for (i = 0; i < 10; i++)
6213 gtk_notebook_remove_page (notebook, 5);
6217 notebook_popup (GtkToggleButton *button,
6218 GtkNotebook *notebook)
6220 if (gtk_toggle_button_get_active (button))
6221 gtk_notebook_popup_enable (notebook);
6223 gtk_notebook_popup_disable (notebook);
6227 create_notebook (GtkWidget *widget)
6229 static GtkWidget *window = NULL;
6233 GtkWidget *separator;
6237 static gchar *items[] =
6247 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6248 gtk_window_set_screen (GTK_WINDOW (window),
6249 gtk_widget_get_screen (widget));
6251 g_signal_connect (window, "destroy",
6252 G_CALLBACK (gtk_widget_destroyed),
6255 gtk_window_set_title (GTK_WINDOW (window), "notebook");
6256 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6258 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6259 gtk_container_add (GTK_CONTAINER (window), box1);
6261 sample_notebook = gtk_notebook_new ();
6262 g_signal_connect (sample_notebook, "switch_page",
6263 G_CALLBACK (page_switch), NULL);
6264 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
6265 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
6266 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
6268 gtk_widget_realize (sample_notebook);
6271 book_open = gdk_pixbuf_new_from_xpm_data (book_open_xpm);
6274 book_closed = gdk_pixbuf_new_from_xpm_data (book_closed_xpm);
6276 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
6278 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
6279 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
6281 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
6282 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6283 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6285 button = gtk_check_button_new_with_label ("popup menu");
6286 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
6287 g_signal_connect (button, "clicked",
6288 G_CALLBACK (notebook_popup),
6291 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
6292 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6293 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6295 label = gtk_label_new ("Notebook Style :");
6296 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
6298 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
6299 notebook_type_changed,
6301 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
6303 button = gtk_button_new_with_label ("Show all Pages");
6304 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
6305 g_signal_connect (button, "clicked",
6306 G_CALLBACK (show_all_pages), sample_notebook);
6308 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
6309 gtk_box_set_homogeneous (GTK_BOX (box2), TRUE);
6310 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6311 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6313 button = gtk_button_new_with_label ("prev");
6314 g_signal_connect_swapped (button, "clicked",
6315 G_CALLBACK (gtk_notebook_prev_page),
6317 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6319 button = gtk_button_new_with_label ("next");
6320 g_signal_connect_swapped (button, "clicked",
6321 G_CALLBACK (gtk_notebook_next_page),
6323 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6325 button = gtk_button_new_with_label ("rotate");
6326 g_signal_connect (button, "clicked",
6327 G_CALLBACK (rotate_notebook), sample_notebook);
6328 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6330 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
6331 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
6333 button = gtk_button_new_with_label ("close");
6334 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
6335 g_signal_connect_swapped (button, "clicked",
6336 G_CALLBACK (gtk_widget_destroy),
6338 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
6339 gtk_widget_set_can_default (button, TRUE);
6340 gtk_widget_grab_default (button);
6343 if (!gtk_widget_get_visible (window))
6344 gtk_widget_show_all (window);
6346 gtk_widget_destroy (window);
6354 toggle_resize (GtkWidget *widget, GtkWidget *child)
6356 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6357 GValue value = { 0, };
6358 g_value_init (&value, G_TYPE_BOOLEAN);
6359 gtk_container_child_get_property (container, child, "resize", &value);
6360 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6361 gtk_container_child_set_property (container, child, "resize", &value);
6365 toggle_shrink (GtkWidget *widget, GtkWidget *child)
6367 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6368 GValue value = { 0, };
6369 g_value_init (&value, G_TYPE_BOOLEAN);
6370 gtk_container_child_get_property (container, child, "shrink", &value);
6371 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6372 gtk_container_child_set_property (container, child, "shrink", &value);
6376 paned_props_clicked (GtkWidget *button,
6379 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
6381 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
6385 create_pane_options (GtkPaned *paned,
6386 const gchar *frame_label,
6387 const gchar *label1,
6388 const gchar *label2)
6390 GtkWidget *child1, *child2;
6395 GtkWidget *check_button;
6397 child1 = gtk_paned_get_child1 (paned);
6398 child2 = gtk_paned_get_child2 (paned);
6400 frame = gtk_frame_new (frame_label);
6401 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
6403 table = gtk_table_new (4, 2, 4);
6404 gtk_container_add (GTK_CONTAINER (frame), table);
6406 label = gtk_label_new (label1);
6407 gtk_table_attach_defaults (GTK_TABLE (table), label,
6410 check_button = gtk_check_button_new_with_label ("Resize");
6411 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6413 g_signal_connect (check_button, "toggled",
6414 G_CALLBACK (toggle_resize),
6417 check_button = gtk_check_button_new_with_label ("Shrink");
6418 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6420 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6422 g_signal_connect (check_button, "toggled",
6423 G_CALLBACK (toggle_shrink),
6426 label = gtk_label_new (label2);
6427 gtk_table_attach_defaults (GTK_TABLE (table), label,
6430 check_button = gtk_check_button_new_with_label ("Resize");
6431 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6433 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6435 g_signal_connect (check_button, "toggled",
6436 G_CALLBACK (toggle_resize),
6439 check_button = gtk_check_button_new_with_label ("Shrink");
6440 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6442 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6444 g_signal_connect (check_button, "toggled",
6445 G_CALLBACK (toggle_shrink),
6448 button = gtk_button_new_with_mnemonic ("_Properties");
6449 gtk_table_attach_defaults (GTK_TABLE (table), button,
6451 g_signal_connect (button, "clicked",
6452 G_CALLBACK (paned_props_clicked),
6459 create_panes (GtkWidget *widget)
6461 static GtkWidget *window = NULL;
6470 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6472 gtk_window_set_screen (GTK_WINDOW (window),
6473 gtk_widget_get_screen (widget));
6475 g_signal_connect (window, "destroy",
6476 G_CALLBACK (gtk_widget_destroyed),
6479 gtk_window_set_title (GTK_WINDOW (window), "Panes");
6480 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6482 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6483 gtk_container_add (GTK_CONTAINER (window), vbox);
6485 vpaned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6486 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
6487 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
6489 hpaned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6490 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
6492 frame = gtk_frame_new (NULL);
6493 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6494 gtk_widget_set_size_request (frame, 60, 60);
6495 gtk_paned_add1 (GTK_PANED (hpaned), frame);
6497 button = gtk_button_new_with_label ("Hi there");
6498 gtk_container_add (GTK_CONTAINER(frame), button);
6500 frame = gtk_frame_new (NULL);
6501 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6502 gtk_widget_set_size_request (frame, 80, 60);
6503 gtk_paned_add2 (GTK_PANED (hpaned), frame);
6505 frame = gtk_frame_new (NULL);
6506 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6507 gtk_widget_set_size_request (frame, 60, 80);
6508 gtk_paned_add2 (GTK_PANED (vpaned), frame);
6510 /* Now create toggle buttons to control sizing */
6512 gtk_box_pack_start (GTK_BOX (vbox),
6513 create_pane_options (GTK_PANED (hpaned),
6519 gtk_box_pack_start (GTK_BOX (vbox),
6520 create_pane_options (GTK_PANED (vpaned),
6526 gtk_widget_show_all (vbox);
6529 if (!gtk_widget_get_visible (window))
6530 gtk_widget_show (window);
6532 gtk_widget_destroy (window);
6536 * Paned keyboard navigation
6540 paned_keyboard_window1 (GtkWidget *widget)
6563 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6564 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
6565 gtk_window_set_screen (GTK_WINDOW (window1),
6566 gtk_widget_get_screen (widget));
6568 hpaned1 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6569 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
6571 frame1 = gtk_frame_new (NULL);
6572 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
6573 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
6575 vbox1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6576 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
6578 button7 = gtk_button_new_with_label ("button7");
6579 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
6581 button8 = gtk_button_new_with_label ("button8");
6582 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
6584 button9 = gtk_button_new_with_label ("button9");
6585 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
6587 vpaned1 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6588 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
6590 frame2 = gtk_frame_new (NULL);
6591 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
6592 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
6594 frame5 = gtk_frame_new (NULL);
6595 gtk_container_add (GTK_CONTAINER (frame2), frame5);
6597 hbox1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6598 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
6600 button5 = gtk_button_new_with_label ("button5");
6601 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
6603 button6 = gtk_button_new_with_label ("button6");
6604 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
6606 frame3 = gtk_frame_new (NULL);
6607 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
6608 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
6610 frame4 = gtk_frame_new ("Buttons");
6611 gtk_container_add (GTK_CONTAINER (frame3), frame4);
6612 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
6614 table1 = gtk_table_new (2, 2, FALSE);
6615 gtk_container_add (GTK_CONTAINER (frame4), table1);
6616 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
6618 button1 = gtk_button_new_with_label ("button1");
6619 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
6620 (GtkAttachOptions) (GTK_FILL),
6621 (GtkAttachOptions) (0), 0, 0);
6623 button2 = gtk_button_new_with_label ("button2");
6624 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
6625 (GtkAttachOptions) (GTK_FILL),
6626 (GtkAttachOptions) (0), 0, 0);
6628 button3 = gtk_button_new_with_label ("button3");
6629 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
6630 (GtkAttachOptions) (GTK_FILL),
6631 (GtkAttachOptions) (0), 0, 0);
6633 button4 = gtk_button_new_with_label ("button4");
6634 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
6635 (GtkAttachOptions) (GTK_FILL),
6636 (GtkAttachOptions) (0), 0, 0);
6642 paned_keyboard_window2 (GtkWidget *widget)
6647 GtkWidget *button13;
6651 GtkWidget *button12;
6653 GtkWidget *button11;
6654 GtkWidget *button10;
6656 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6657 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
6659 gtk_window_set_screen (GTK_WINDOW (window2),
6660 gtk_widget_get_screen (widget));
6662 hpaned2 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6663 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
6665 frame6 = gtk_frame_new (NULL);
6666 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
6667 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
6669 button13 = gtk_button_new_with_label ("button13");
6670 gtk_container_add (GTK_CONTAINER (frame6), button13);
6672 hbox2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6673 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
6675 vpaned2 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6676 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
6678 frame7 = gtk_frame_new (NULL);
6679 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
6680 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
6682 button12 = gtk_button_new_with_label ("button12");
6683 gtk_container_add (GTK_CONTAINER (frame7), button12);
6685 frame8 = gtk_frame_new (NULL);
6686 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
6687 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
6689 button11 = gtk_button_new_with_label ("button11");
6690 gtk_container_add (GTK_CONTAINER (frame8), button11);
6692 button10 = gtk_button_new_with_label ("button10");
6693 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
6699 paned_keyboard_window3 (GtkWidget *widget)
6706 GtkWidget *button14;
6709 GtkWidget *button15;
6712 GtkWidget *button16;
6714 GtkWidget *button17;
6716 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6717 g_object_set_data (G_OBJECT (window3), "window3", window3);
6718 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
6720 gtk_window_set_screen (GTK_WINDOW (window3),
6721 gtk_widget_get_screen (widget));
6724 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6725 gtk_container_add (GTK_CONTAINER (window3), vbox2);
6727 label1 = gtk_label_new ("Three panes nested inside each other");
6728 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
6730 hpaned3 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6731 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
6733 frame9 = gtk_frame_new (NULL);
6734 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
6735 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
6737 button14 = gtk_button_new_with_label ("button14");
6738 gtk_container_add (GTK_CONTAINER (frame9), button14);
6740 hpaned4 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6741 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
6743 frame10 = gtk_frame_new (NULL);
6744 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
6745 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
6747 button15 = gtk_button_new_with_label ("button15");
6748 gtk_container_add (GTK_CONTAINER (frame10), button15);
6750 hpaned5 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6751 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
6753 frame11 = gtk_frame_new (NULL);
6754 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
6755 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
6757 button16 = gtk_button_new_with_label ("button16");
6758 gtk_container_add (GTK_CONTAINER (frame11), button16);
6760 frame12 = gtk_frame_new (NULL);
6761 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
6762 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
6764 button17 = gtk_button_new_with_label ("button17");
6765 gtk_container_add (GTK_CONTAINER (frame12), button17);
6771 paned_keyboard_window4 (GtkWidget *widget)
6778 GtkWidget *button19;
6779 GtkWidget *button18;
6782 GtkWidget *button21;
6783 GtkWidget *button20;
6785 GtkWidget *button23;
6786 GtkWidget *button22;
6788 GtkWidget *button25;
6789 GtkWidget *button24;
6791 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6792 g_object_set_data (G_OBJECT (window4), "window4", window4);
6793 gtk_window_set_title (GTK_WINDOW (window4), "window4");
6795 gtk_window_set_screen (GTK_WINDOW (window4),
6796 gtk_widget_get_screen (widget));
6798 vbox3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6799 gtk_container_add (GTK_CONTAINER (window4), vbox3);
6801 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
6802 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
6803 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
6805 hpaned6 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6806 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
6808 vpaned3 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6809 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
6811 button19 = gtk_button_new_with_label ("button19");
6812 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
6814 button18 = gtk_button_new_with_label ("button18");
6815 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
6817 hbox3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6818 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
6820 vpaned4 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6821 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
6823 button21 = gtk_button_new_with_label ("button21");
6824 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
6826 button20 = gtk_button_new_with_label ("button20");
6827 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
6829 vpaned5 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6830 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
6832 button23 = gtk_button_new_with_label ("button23");
6833 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
6835 button22 = gtk_button_new_with_label ("button22");
6836 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
6838 vpaned6 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6839 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
6841 button25 = gtk_button_new_with_label ("button25");
6842 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
6844 button24 = gtk_button_new_with_label ("button24");
6845 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
6851 create_paned_keyboard_navigation (GtkWidget *widget)
6853 static GtkWidget *window1 = NULL;
6854 static GtkWidget *window2 = NULL;
6855 static GtkWidget *window3 = NULL;
6856 static GtkWidget *window4 = NULL;
6859 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
6861 gtk_widget_destroy (window1);
6862 gtk_widget_destroy (window2);
6863 gtk_widget_destroy (window3);
6864 gtk_widget_destroy (window4);
6869 window1 = paned_keyboard_window1 (widget);
6870 g_signal_connect (window1, "destroy",
6871 G_CALLBACK (gtk_widget_destroyed),
6877 window2 = paned_keyboard_window2 (widget);
6878 g_signal_connect (window2, "destroy",
6879 G_CALLBACK (gtk_widget_destroyed),
6885 window3 = paned_keyboard_window3 (widget);
6886 g_signal_connect (window3, "destroy",
6887 G_CALLBACK (gtk_widget_destroyed),
6893 window4 = paned_keyboard_window4 (widget);
6894 g_signal_connect (window4, "destroy",
6895 G_CALLBACK (gtk_widget_destroyed),
6899 if (gtk_widget_get_visible (window1))
6900 gtk_widget_destroy (GTK_WIDGET (window1));
6902 gtk_widget_show_all (GTK_WIDGET (window1));
6904 if (gtk_widget_get_visible (window2))
6905 gtk_widget_destroy (GTK_WIDGET (window2));
6907 gtk_widget_show_all (GTK_WIDGET (window2));
6909 if (gtk_widget_get_visible (window3))
6910 gtk_widget_destroy (GTK_WIDGET (window3));
6912 gtk_widget_show_all (GTK_WIDGET (window3));
6914 if (gtk_widget_get_visible (window4))
6915 gtk_widget_destroy (GTK_WIDGET (window4));
6917 gtk_widget_show_all (GTK_WIDGET (window4));
6925 typedef struct _cursoroffset {gint x,y;} CursorOffset;
6928 shape_pressed (GtkWidget *widget, GdkEventButton *event)
6932 /* ignore double and triple click */
6933 if (event->type != GDK_BUTTON_PRESS)
6936 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
6937 p->x = (int) event->x;
6938 p->y = (int) event->y;
6940 gtk_grab_add (widget);
6941 gdk_device_grab (gdk_event_get_device ((GdkEvent*)event),
6942 gtk_widget_get_window (widget),
6945 GDK_BUTTON_RELEASE_MASK |
6946 GDK_BUTTON_MOTION_MASK |
6947 GDK_POINTER_MOTION_HINT_MASK,
6953 shape_released (GtkWidget *widget,
6954 GdkEventButton *event)
6956 gtk_grab_remove (widget);
6957 gdk_device_ungrab (gdk_event_get_device ((GdkEvent*)event), event->time);
6961 shape_motion (GtkWidget *widget,
6962 GdkEventMotion *event)
6966 GdkModifierType mask;
6968 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
6971 * Can't use event->x / event->y here
6972 * because I need absolute coordinates.
6974 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
6975 gtk_window_move (GTK_WINDOW (widget), xp - p->x, yp - p->y);
6979 shape_create_icon (GdkScreen *screen,
6990 CursorOffset* icon_pos;
6991 cairo_surface_t *mask;
6992 cairo_region_t *mask_region;
6997 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
6999 window = gtk_window_new (window_type);
7000 gtk_window_set_screen (GTK_WINDOW (window), screen);
7002 fixed = gtk_fixed_new ();
7003 gtk_widget_set_size_request (fixed, 100, 100);
7004 gtk_container_add (GTK_CONTAINER (window), fixed);
7005 gtk_widget_show (fixed);
7007 gtk_widget_set_events (window,
7008 gtk_widget_get_events (window) |
7009 GDK_BUTTON_MOTION_MASK |
7010 GDK_POINTER_MOTION_HINT_MASK |
7011 GDK_BUTTON_PRESS_MASK);
7013 gtk_widget_realize (window);
7015 pixbuf = gdk_pixbuf_new_from_file (xpm_file, NULL);
7016 g_assert (pixbuf); /* FIXME: error handling */
7018 mask = cairo_image_surface_create (CAIRO_FORMAT_A1,
7019 gdk_pixbuf_get_width (pixbuf),
7020 gdk_pixbuf_get_height (pixbuf));
7021 cr = cairo_create (mask);
7022 gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
7026 mask_region = gdk_cairo_region_create_from_surface (mask);
7028 cairo_region_translate (mask_region, px, py);
7030 image = gtk_image_new_from_pixbuf (pixbuf);
7031 gtk_fixed_put (GTK_FIXED (fixed), image, px,py);
7032 gtk_widget_show (image);
7034 gtk_widget_shape_combine_region (window, mask_region);
7036 cairo_region_destroy (mask_region);
7037 cairo_surface_destroy (mask);
7038 g_object_unref (pixbuf);
7040 g_signal_connect (window, "button_press_event",
7041 G_CALLBACK (shape_pressed), NULL);
7042 g_signal_connect (window, "button_release_event",
7043 G_CALLBACK (shape_released), NULL);
7044 g_signal_connect (window, "motion_notify_event",
7045 G_CALLBACK (shape_motion), NULL);
7047 icon_pos = g_new (CursorOffset, 1);
7048 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
7050 gtk_window_move (GTK_WINDOW (window), x, y);
7051 gtk_widget_show (window);
7057 create_shapes (GtkWidget *widget)
7059 /* Variables used by the Drag/Drop and Shape Window demos */
7060 static GtkWidget *modeller = NULL;
7061 static GtkWidget *sheets = NULL;
7062 static GtkWidget *rings = NULL;
7063 static GtkWidget *with_region = NULL;
7064 GdkScreen *screen = gtk_widget_get_screen (widget);
7066 if (!(file_exists ("Modeller.xpm") &&
7067 file_exists ("FilesQueue.xpm") &&
7068 file_exists ("3DRings.xpm")))
7074 modeller = shape_create_icon (screen, "Modeller.xpm",
7075 440, 140, 0,0, GTK_WINDOW_POPUP);
7077 g_signal_connect (modeller, "destroy",
7078 G_CALLBACK (gtk_widget_destroyed),
7082 gtk_widget_destroy (modeller);
7086 sheets = shape_create_icon (screen, "FilesQueue.xpm",
7087 580, 170, 0,0, GTK_WINDOW_POPUP);
7089 g_signal_connect (sheets, "destroy",
7090 G_CALLBACK (gtk_widget_destroyed),
7095 gtk_widget_destroy (sheets);
7099 rings = shape_create_icon (screen, "3DRings.xpm",
7100 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7102 g_signal_connect (rings, "destroy",
7103 G_CALLBACK (gtk_widget_destroyed),
7107 gtk_widget_destroy (rings);
7111 cairo_region_t *region;
7114 with_region = shape_create_icon (screen, "3DRings.xpm",
7115 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7117 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
7119 g_signal_connect (with_region, "destroy",
7120 G_CALLBACK (gtk_widget_destroyed),
7123 /* reset shape from mask to a region */
7126 region = cairo_region_create ();
7138 cairo_region_union_rectangle (region, &rect);
7146 gdk_window_shape_combine_region (gtk_widget_get_window (with_region),
7151 gtk_widget_destroy (with_region);
7159 create_wmhints (GtkWidget *widget)
7161 static GtkWidget *window = NULL;
7163 GtkWidget *separator;
7167 GdkWindow *gdk_window;
7173 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7175 gtk_window_set_screen (GTK_WINDOW (window),
7176 gtk_widget_get_screen (widget));
7178 g_signal_connect (window, "destroy",
7179 G_CALLBACK (gtk_widget_destroyed),
7182 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
7183 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7185 gtk_widget_realize (window);
7187 gdk_window = gtk_widget_get_window (window);
7189 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
7190 list = g_list_prepend (NULL, pixbuf);
7192 gdk_window_set_icon_list (gdk_window, list);
7195 g_object_unref (pixbuf);
7197 gdk_window_set_icon_name (gdk_window, "WMHints Test Icon");
7199 gdk_window_set_decorations (gdk_window, GDK_DECOR_ALL | GDK_DECOR_MENU);
7200 gdk_window_set_functions (gdk_window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
7202 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7203 gtk_container_add (GTK_CONTAINER (window), box1);
7204 gtk_widget_show (box1);
7206 label = gtk_label_new ("Try iconizing me!");
7207 gtk_widget_set_size_request (label, 150, 50);
7208 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
7209 gtk_widget_show (label);
7212 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
7213 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
7214 gtk_widget_show (separator);
7217 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
7218 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7219 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7220 gtk_widget_show (box2);
7223 button = gtk_button_new_with_label ("close");
7225 g_signal_connect_swapped (button, "clicked",
7226 G_CALLBACK (gtk_widget_destroy),
7229 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7230 gtk_widget_set_can_default (button, TRUE);
7231 gtk_widget_grab_default (button);
7232 gtk_widget_show (button);
7235 if (!gtk_widget_get_visible (window))
7236 gtk_widget_show (window);
7238 gtk_widget_destroy (window);
7243 * Window state tracking
7247 window_state_callback (GtkWidget *widget,
7248 GdkEventWindowState *event,
7251 GtkWidget *label = data;
7254 msg = g_strconcat (gtk_window_get_title (GTK_WINDOW (widget)), ": ",
7255 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
7256 "withdrawn" : "not withdrawn", ", ",
7257 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
7258 "iconified" : "not iconified", ", ",
7259 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
7260 "sticky" : "not sticky", ", ",
7261 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
7262 "maximized" : "not maximized", ", ",
7263 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
7264 "fullscreen" : "not fullscreen",
7265 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
7266 "above" : "not above", ", ",
7267 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
7268 "below" : "not below", ", ",
7271 gtk_label_set_text (GTK_LABEL (label), msg);
7279 tracking_label (GtkWidget *window)
7285 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
7287 g_signal_connect_object (hbox,
7289 G_CALLBACK (gtk_widget_destroy),
7293 label = gtk_label_new ("<no window state events received>");
7294 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
7295 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
7297 g_signal_connect (window,
7298 "window_state_event",
7299 G_CALLBACK (window_state_callback),
7302 button = gtk_button_new_with_label ("Deiconify");
7303 g_signal_connect_object (button,
7305 G_CALLBACK (gtk_window_deiconify),
7308 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7310 button = gtk_button_new_with_label ("Iconify");
7311 g_signal_connect_object (button,
7313 G_CALLBACK (gtk_window_iconify),
7316 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7318 button = gtk_button_new_with_label ("Fullscreen");
7319 g_signal_connect_object (button,
7321 G_CALLBACK (gtk_window_fullscreen),
7324 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7326 button = gtk_button_new_with_label ("Unfullscreen");
7327 g_signal_connect_object (button,
7329 G_CALLBACK (gtk_window_unfullscreen),
7332 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7334 button = gtk_button_new_with_label ("Present");
7335 g_signal_connect_object (button,
7337 G_CALLBACK (gtk_window_present),
7340 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7342 button = gtk_button_new_with_label ("Show");
7343 g_signal_connect_object (button,
7345 G_CALLBACK (gtk_widget_show),
7348 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7350 gtk_widget_show_all (hbox);
7356 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
7358 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7360 gtk_window_set_keep_above (GTK_WINDOW (data),
7361 gtk_toggle_button_get_active (togglebutton));
7363 if (gtk_toggle_button_get_active (togglebutton))
7364 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7368 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
7370 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7372 gtk_window_set_keep_below (GTK_WINDOW (data),
7373 gtk_toggle_button_get_active (togglebutton));
7375 if (gtk_toggle_button_get_active (togglebutton))
7376 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7381 get_state_controls (GtkWidget *window)
7385 GtkWidget *button_above;
7386 GtkWidget *button_below;
7388 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7390 button = gtk_button_new_with_label ("Stick");
7391 g_signal_connect_object (button,
7393 G_CALLBACK (gtk_window_stick),
7396 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7398 button = gtk_button_new_with_label ("Unstick");
7399 g_signal_connect_object (button,
7401 G_CALLBACK (gtk_window_unstick),
7404 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7406 button = gtk_button_new_with_label ("Maximize");
7407 g_signal_connect_object (button,
7409 G_CALLBACK (gtk_window_maximize),
7412 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7414 button = gtk_button_new_with_label ("Unmaximize");
7415 g_signal_connect_object (button,
7417 G_CALLBACK (gtk_window_unmaximize),
7420 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7422 button = gtk_button_new_with_label ("Iconify");
7423 g_signal_connect_object (button,
7425 G_CALLBACK (gtk_window_iconify),
7428 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7430 button = gtk_button_new_with_label ("Fullscreen");
7431 g_signal_connect_object (button,
7433 G_CALLBACK (gtk_window_fullscreen),
7436 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7438 button = gtk_button_new_with_label ("Unfullscreen");
7439 g_signal_connect_object (button,
7441 G_CALLBACK (gtk_window_unfullscreen),
7444 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7446 button_above = gtk_toggle_button_new_with_label ("Keep above");
7447 g_signal_connect (button_above,
7449 G_CALLBACK (keep_window_above),
7451 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
7453 button_below = gtk_toggle_button_new_with_label ("Keep below");
7454 g_signal_connect (button_below,
7456 G_CALLBACK (keep_window_below),
7458 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
7460 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
7461 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
7463 button = gtk_button_new_with_label ("Hide (withdraw)");
7464 g_signal_connect_object (button,
7466 G_CALLBACK (gtk_widget_hide),
7469 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7471 gtk_widget_show_all (vbox);
7477 create_window_states (GtkWidget *widget)
7479 static GtkWidget *window = NULL;
7482 GtkWidget *iconified;
7484 GtkWidget *controls;
7488 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7489 gtk_window_set_screen (GTK_WINDOW (window),
7490 gtk_widget_get_screen (widget));
7492 g_signal_connect (window, "destroy",
7493 G_CALLBACK (gtk_widget_destroyed),
7496 gtk_window_set_title (GTK_WINDOW (window), "Window states");
7498 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7499 gtk_container_add (GTK_CONTAINER (window), box1);
7501 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7503 gtk_window_set_screen (GTK_WINDOW (iconified),
7504 gtk_widget_get_screen (widget));
7506 g_signal_connect_object (iconified, "destroy",
7507 G_CALLBACK (gtk_widget_destroy),
7510 gtk_window_iconify (GTK_WINDOW (iconified));
7511 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
7512 controls = get_state_controls (iconified);
7513 gtk_container_add (GTK_CONTAINER (iconified), controls);
7515 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7517 gtk_window_set_screen (GTK_WINDOW (normal),
7518 gtk_widget_get_screen (widget));
7520 g_signal_connect_object (normal, "destroy",
7521 G_CALLBACK (gtk_widget_destroy),
7525 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
7526 controls = get_state_controls (normal);
7527 gtk_container_add (GTK_CONTAINER (normal), controls);
7529 label = tracking_label (iconified);
7530 gtk_container_add (GTK_CONTAINER (box1), label);
7532 label = tracking_label (normal);
7533 gtk_container_add (GTK_CONTAINER (box1), label);
7535 gtk_widget_show_all (iconified);
7536 gtk_widget_show_all (normal);
7537 gtk_widget_show_all (box1);
7540 if (!gtk_widget_get_visible (window))
7541 gtk_widget_show (window);
7543 gtk_widget_destroy (window);
7551 configure_event_callback (GtkWidget *widget,
7552 GdkEventConfigure *event,
7555 GtkWidget *label = data;
7559 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
7561 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
7563 event->x, event->y, event->width, event->height,
7566 gtk_label_set_text (GTK_LABEL (label), msg);
7574 get_ints (GtkWidget *window,
7581 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
7582 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
7584 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
7585 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
7589 set_size_callback (GtkWidget *widget,
7594 get_ints (data, &w, &h);
7596 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
7600 unset_default_size_callback (GtkWidget *widget,
7603 gtk_window_set_default_size (g_object_get_data (data, "target"),
7608 set_default_size_callback (GtkWidget *widget,
7613 get_ints (data, &w, &h);
7615 gtk_window_set_default_size (g_object_get_data (data, "target"),
7620 unset_size_request_callback (GtkWidget *widget,
7623 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7628 set_size_request_callback (GtkWidget *widget,
7633 get_ints (data, &w, &h);
7635 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7640 set_location_callback (GtkWidget *widget,
7645 get_ints (data, &x, &y);
7647 gtk_window_move (g_object_get_data (data, "target"), x, y);
7651 move_to_position_callback (GtkWidget *widget,
7657 window = g_object_get_data (data, "target");
7659 gtk_window_get_position (window, &x, &y);
7661 gtk_window_move (window, x, y);
7665 set_geometry_callback (GtkWidget *entry,
7671 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
7673 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
7675 if (!gtk_window_parse_geometry (target, text))
7676 g_print ("Bad geometry string '%s'\n", text);
7682 resizable_callback (GtkWidget *widget,
7685 g_object_set (g_object_get_data (data, "target"),
7686 "resizable", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)),
7691 gravity_selected (GtkWidget *widget,
7694 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
7695 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GDK_GRAVITY_NORTH_WEST);
7699 pos_selected (GtkWidget *widget,
7702 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
7703 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GTK_WIN_POS_NONE);
7707 move_gravity_window_to_current_position (GtkWidget *widget,
7713 window = GTK_WINDOW (data);
7715 gtk_window_get_position (window, &x, &y);
7717 gtk_window_move (window, x, y);
7721 get_screen_corner (GtkWindow *window,
7726 GdkScreen * screen = gtk_window_get_screen (window);
7728 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
7730 switch (gtk_window_get_gravity (window))
7732 case GDK_GRAVITY_SOUTH_EAST:
7733 *x = gdk_screen_get_width (screen) - w;
7734 *y = gdk_screen_get_height (screen) - h;
7737 case GDK_GRAVITY_NORTH_EAST:
7738 *x = gdk_screen_get_width (screen) - w;
7742 case GDK_GRAVITY_SOUTH_WEST:
7744 *y = gdk_screen_get_height (screen) - h;
7747 case GDK_GRAVITY_NORTH_WEST:
7752 case GDK_GRAVITY_SOUTH:
7753 *x = (gdk_screen_get_width (screen) - w) / 2;
7754 *y = gdk_screen_get_height (screen) - h;
7757 case GDK_GRAVITY_NORTH:
7758 *x = (gdk_screen_get_width (screen) - w) / 2;
7762 case GDK_GRAVITY_WEST:
7764 *y = (gdk_screen_get_height (screen) - h) / 2;
7767 case GDK_GRAVITY_EAST:
7768 *x = gdk_screen_get_width (screen) - w;
7769 *y = (gdk_screen_get_height (screen) - h) / 2;
7772 case GDK_GRAVITY_CENTER:
7773 *x = (gdk_screen_get_width (screen) - w) / 2;
7774 *y = (gdk_screen_get_height (screen) - h) / 2;
7777 case GDK_GRAVITY_STATIC:
7778 /* pick some random numbers */
7784 g_assert_not_reached ();
7790 move_gravity_window_to_starting_position (GtkWidget *widget,
7796 window = GTK_WINDOW (data);
7798 get_screen_corner (window,
7801 gtk_window_move (window, x, y);
7805 make_gravity_window (GtkWidget *destroy_with,
7814 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7816 gtk_window_set_screen (GTK_WINDOW (window),
7817 gtk_widget_get_screen (destroy_with));
7819 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7820 gtk_widget_show (vbox);
7822 gtk_container_add (GTK_CONTAINER (window), vbox);
7823 gtk_window_set_title (GTK_WINDOW (window), title);
7824 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
7826 g_signal_connect_object (destroy_with,
7828 G_CALLBACK (gtk_widget_destroy),
7833 button = gtk_button_new_with_mnemonic ("_Move to current position");
7835 g_signal_connect (button, "clicked",
7836 G_CALLBACK (move_gravity_window_to_current_position),
7839 gtk_container_add (GTK_CONTAINER (vbox), button);
7840 gtk_widget_show (button);
7842 button = gtk_button_new_with_mnemonic ("Move to _starting position");
7844 g_signal_connect (button, "clicked",
7845 G_CALLBACK (move_gravity_window_to_starting_position),
7848 gtk_container_add (GTK_CONTAINER (vbox), button);
7849 gtk_widget_show (button);
7851 /* Pretend this is the result of --geometry.
7852 * DO NOT COPY THIS CODE unless you are setting --geometry results,
7853 * and in that case you probably should just use gtk_window_parse_geometry().
7854 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
7855 * you are parsing --geometry or equivalent.
7857 gtk_window_set_geometry_hints (GTK_WINDOW (window),
7861 gtk_window_set_default_size (GTK_WINDOW (window),
7864 get_screen_corner (GTK_WINDOW (window), &x, &y);
7866 gtk_window_move (GTK_WINDOW (window),
7873 do_gravity_test (GtkWidget *widget,
7876 GtkWidget *destroy_with = data;
7879 /* We put a window at each gravity point on the screen. */
7880 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
7882 gtk_widget_show (window);
7884 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
7886 gtk_widget_show (window);
7888 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
7890 gtk_widget_show (window);
7892 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
7894 gtk_widget_show (window);
7896 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
7898 gtk_widget_show (window);
7900 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
7902 gtk_widget_show (window);
7905 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
7907 gtk_widget_show (window);
7910 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
7912 gtk_widget_show (window);
7914 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
7916 gtk_widget_show (window);
7918 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
7920 gtk_widget_show (window);
7924 window_controls (GtkWidget *window)
7926 GtkWidget *control_window;
7931 GtkAdjustment *adjustment;
7936 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7938 gtk_window_set_screen (GTK_WINDOW (control_window),
7939 gtk_widget_get_screen (window));
7941 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
7943 g_object_set_data (G_OBJECT (control_window),
7947 g_signal_connect_object (control_window,
7949 G_CALLBACK (gtk_widget_destroy),
7953 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
7955 gtk_container_add (GTK_CONTAINER (control_window), vbox);
7957 label = gtk_label_new ("<no configure events>");
7958 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
7960 g_signal_connect (window,
7962 G_CALLBACK (configure_event_callback),
7965 adjustment = gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0, 5.0, 0.0);
7966 spin = gtk_spin_button_new (adjustment, 0, 0);
7968 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
7970 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
7972 adjustment = gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0, 5.0, 0.0);
7973 spin = gtk_spin_button_new (adjustment, 0, 0);
7975 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
7977 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
7979 entry = gtk_entry_new ();
7980 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
7982 g_signal_connect (entry, "changed",
7983 G_CALLBACK (set_geometry_callback),
7986 button = gtk_button_new_with_label ("Show gravity test windows");
7987 g_signal_connect_swapped (button,
7989 G_CALLBACK (do_gravity_test),
7991 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7993 button = gtk_button_new_with_label ("Reshow with initial size");
7994 g_signal_connect_object (button,
7996 G_CALLBACK (gtk_window_reshow_with_initial_size),
7999 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8001 button = gtk_button_new_with_label ("Queue resize");
8002 g_signal_connect_object (button,
8004 G_CALLBACK (gtk_widget_queue_resize),
8007 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8009 button = gtk_button_new_with_label ("Resize");
8010 g_signal_connect (button,
8012 G_CALLBACK (set_size_callback),
8014 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8016 button = gtk_button_new_with_label ("Set default size");
8017 g_signal_connect (button,
8019 G_CALLBACK (set_default_size_callback),
8021 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8023 button = gtk_button_new_with_label ("Unset default size");
8024 g_signal_connect (button,
8026 G_CALLBACK (unset_default_size_callback),
8028 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8030 button = gtk_button_new_with_label ("Set size request");
8031 g_signal_connect (button,
8033 G_CALLBACK (set_size_request_callback),
8035 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8037 button = gtk_button_new_with_label ("Unset size request");
8038 g_signal_connect (button,
8040 G_CALLBACK (unset_size_request_callback),
8042 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8044 button = gtk_button_new_with_label ("Move");
8045 g_signal_connect (button,
8047 G_CALLBACK (set_location_callback),
8049 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8051 button = gtk_button_new_with_label ("Move to current position");
8052 g_signal_connect (button,
8054 G_CALLBACK (move_to_position_callback),
8056 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8058 button = gtk_check_button_new_with_label ("Allow resize");
8059 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
8060 g_signal_connect (button,
8062 G_CALLBACK (resizable_callback),
8064 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8066 button = gtk_button_new_with_mnemonic ("_Show");
8067 g_signal_connect_object (button,
8069 G_CALLBACK (gtk_widget_show),
8072 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8074 button = gtk_button_new_with_mnemonic ("_Hide");
8075 g_signal_connect_object (button,
8077 G_CALLBACK (gtk_widget_hide),
8080 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8082 om = gtk_combo_box_text_new ();
8086 static gchar *names[] = {
8087 "GDK_GRAVITY_NORTH_WEST",
8088 "GDK_GRAVITY_NORTH",
8089 "GDK_GRAVITY_NORTH_EAST",
8091 "GDK_GRAVITY_CENTER",
8093 "GDK_GRAVITY_SOUTH_WEST",
8094 "GDK_GRAVITY_SOUTH",
8095 "GDK_GRAVITY_SOUTH_EAST",
8096 "GDK_GRAVITY_STATIC",
8100 g_assert (names[i]);
8101 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (om), names[i]);
8106 g_signal_connect (om,
8108 G_CALLBACK (gravity_selected),
8111 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8114 om = gtk_combo_box_text_new ();
8118 static gchar *names[] = {
8120 "GTK_WIN_POS_CENTER",
8121 "GTK_WIN_POS_MOUSE",
8122 "GTK_WIN_POS_CENTER_ALWAYS",
8123 "GTK_WIN_POS_CENTER_ON_PARENT",
8127 g_assert (names[i]);
8128 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (om), names[i]);
8133 g_signal_connect (om,
8135 G_CALLBACK (pos_selected),
8138 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8140 gtk_widget_show_all (vbox);
8142 return control_window;
8146 create_window_sizing (GtkWidget *widget)
8148 static GtkWidget *window = NULL;
8149 static GtkWidget *target_window = NULL;
8155 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8156 gtk_window_set_screen (GTK_WINDOW (target_window),
8157 gtk_widget_get_screen (widget));
8158 label = gtk_label_new (NULL);
8159 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");
8160 gtk_container_add (GTK_CONTAINER (target_window), label);
8161 gtk_widget_show (label);
8163 g_signal_connect (target_window, "destroy",
8164 G_CALLBACK (gtk_widget_destroyed),
8167 window = window_controls (target_window);
8169 g_signal_connect (window, "destroy",
8170 G_CALLBACK (gtk_widget_destroyed),
8173 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
8176 /* don't show target window by default, we want to allow testing
8177 * of behavior on first show.
8180 if (!gtk_widget_get_visible (window))
8181 gtk_widget_show (window);
8183 gtk_widget_destroy (window);
8190 typedef struct _ProgressData {
8193 GtkWidget *block_spin;
8194 GtkWidget *x_align_spin;
8195 GtkWidget *y_align_spin;
8196 GtkWidget *step_spin;
8197 GtkWidget *act_blocks_spin;
8208 progress_timeout (gpointer data)
8210 ProgressData *pdata = data;
8214 if (pdata->activity)
8216 gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar));
8218 text = g_strdup_printf ("%s", "???");
8222 new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;
8225 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);
8227 text = g_strdup_printf ("%.0f%%", 100 * new_val);
8230 gtk_label_set_text (GTK_LABEL (pdata->label), text);
8237 destroy_progress (GtkWidget *widget,
8238 ProgressData **pdata)
8240 if ((*pdata)->timer)
8242 g_source_remove ((*pdata)->timer);
8243 (*pdata)->timer = 0;
8245 (*pdata)->window = NULL;
8251 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
8253 ProgressData *pdata;
8256 pdata = (ProgressData *) data;
8258 if (!gtk_widget_get_mapped (widget))
8261 i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8263 if (i == 0 || i == 1)
8264 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_HORIZONTAL);
8266 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_VERTICAL);
8268 if (i == 1 || i == 2)
8269 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), TRUE);
8271 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), FALSE);
8275 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
8279 active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8280 gtk_progress_bar_set_show_text (GTK_PROGRESS_BAR (pdata->pbar), active);
8284 progressbar_toggle_ellipsize (GtkWidget *widget,
8287 ProgressData *pdata = data;
8288 if (gtk_widget_is_drawable (widget))
8290 gint i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8291 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar), i);
8296 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
8298 pdata->activity = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8302 toggle_running (GtkWidget *widget, ProgressData *pdata)
8304 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
8306 if (pdata->timer == 0)
8307 pdata->timer = g_timeout_add (100, (GSourceFunc)progress_timeout, pdata);
8311 if (pdata->timer != 0)
8313 g_source_remove (pdata->timer);
8320 entry_changed (GtkWidget *widget, ProgressData *pdata)
8322 gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar),
8323 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
8327 create_progress_bar (GtkWidget *widget)
8329 GtkWidget *action_area, *content_area;
8339 static ProgressData *pdata = NULL;
8341 static gchar *items1[] =
8349 static char *ellipsize_items[] = {
8350 "None", // PANGO_ELLIPSIZE_NONE,
8351 "Start", // PANGO_ELLIPSIZE_START,
8352 "Middle", // PANGO_ELLIPSIZE_MIDDLE,
8353 "End", // PANGO_ELLIPSIZE_END
8357 pdata = g_new0 (ProgressData, 1);
8361 pdata->window = gtk_dialog_new ();
8363 gtk_window_set_screen (GTK_WINDOW (pdata->window),
8364 gtk_widget_get_screen (widget));
8366 gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);
8368 g_signal_connect (pdata->window, "destroy",
8369 G_CALLBACK (destroy_progress),
8373 content_area = gtk_dialog_get_content_area (GTK_DIALOG (pdata->window));
8374 action_area = gtk_dialog_get_action_area (GTK_DIALOG (pdata->window));
8376 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
8377 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
8379 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8380 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
8381 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, TRUE, 0);
8383 frame = gtk_frame_new ("Progress");
8384 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8386 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8387 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8389 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8390 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8392 pdata->pbar = gtk_progress_bar_new ();
8393 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar),
8394 PANGO_ELLIPSIZE_MIDDLE);
8396 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
8398 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8399 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8401 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
8402 gtk_container_add (GTK_CONTAINER (align), hbox);
8403 label = gtk_label_new ("Label updated by user :");
8404 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8405 pdata->label = gtk_label_new ("");
8406 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
8408 frame = gtk_frame_new ("Options");
8409 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8411 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8412 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8414 tab = gtk_table_new (7, 2, FALSE);
8415 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
8417 label = gtk_label_new ("Orientation :");
8418 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
8419 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8421 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
8423 pdata->omenu1 = build_option_menu (items1, 4, 0,
8424 progressbar_toggle_orientation,
8426 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8427 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
8428 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8430 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
8432 check = gtk_check_button_new_with_label ("Running");
8433 g_signal_connect (check, "toggled",
8434 G_CALLBACK (toggle_running),
8436 gtk_table_attach (GTK_TABLE (tab), check, 0, 2, 1, 2,
8437 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8439 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
8441 check = gtk_check_button_new_with_label ("Show text");
8442 g_signal_connect (check, "clicked",
8443 G_CALLBACK (toggle_show_text),
8445 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 2, 3,
8446 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8449 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8450 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 2, 3,
8451 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8454 label = gtk_label_new ("Text: ");
8455 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8457 pdata->entry = gtk_entry_new ();
8458 g_signal_connect (pdata->entry, "changed",
8459 G_CALLBACK (entry_changed),
8461 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
8462 gtk_widget_set_size_request (pdata->entry, 100, -1);
8464 label = gtk_label_new ("Ellipsize text :");
8465 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 10, 11,
8466 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8468 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
8469 pdata->elmenu = build_option_menu (ellipsize_items,
8470 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
8471 2, // PANGO_ELLIPSIZE_MIDDLE
8472 progressbar_toggle_ellipsize,
8474 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8475 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 10, 11,
8476 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8478 gtk_box_pack_start (GTK_BOX (hbox), pdata->elmenu, TRUE, TRUE, 0);
8480 check = gtk_check_button_new_with_label ("Activity mode");
8481 g_signal_connect (check, "clicked",
8482 G_CALLBACK (toggle_activity_mode), pdata);
8483 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 15, 16,
8484 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8487 button = gtk_button_new_with_label ("close");
8488 g_signal_connect_swapped (button, "clicked",
8489 G_CALLBACK (gtk_widget_destroy),
8491 gtk_widget_set_can_default (button, TRUE);
8492 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
8493 gtk_widget_grab_default (button);
8496 if (!gtk_widget_get_visible (pdata->window))
8497 gtk_widget_show_all (pdata->window);
8499 gtk_widget_destroy (pdata->window);
8511 GtkWidget *res_widget;
8515 find_widget (GtkWidget *widget, FindWidgetData *data)
8517 GtkAllocation new_allocation;
8521 gtk_widget_get_allocation (widget, &new_allocation);
8523 if (data->found || !gtk_widget_get_mapped (widget))
8526 /* Note that in the following code, we only count the
8527 * position as being inside a WINDOW widget if it is inside
8528 * widget->window; points that are outside of widget->window
8529 * but within the allocation are not counted. This is consistent
8530 * with the way we highlight drag targets.
8532 if (gtk_widget_get_has_window (widget))
8534 new_allocation.x = 0;
8535 new_allocation.y = 0;
8538 if (gtk_widget_get_parent (widget) && !data->first)
8540 GdkWindow *window = gtk_widget_get_window (widget);
8541 while (window != gtk_widget_get_window (gtk_widget_get_parent (widget)))
8543 gint tx, ty, twidth, theight;
8545 twidth = gdk_window_get_width (window);
8546 theight = gdk_window_get_height (window);
8548 if (new_allocation.x < 0)
8550 new_allocation.width += new_allocation.x;
8551 new_allocation.x = 0;
8553 if (new_allocation.y < 0)
8555 new_allocation.height += new_allocation.y;
8556 new_allocation.y = 0;
8558 if (new_allocation.x + new_allocation.width > twidth)
8559 new_allocation.width = twidth - new_allocation.x;
8560 if (new_allocation.y + new_allocation.height > theight)
8561 new_allocation.height = theight - new_allocation.y;
8563 gdk_window_get_position (window, &tx, &ty);
8564 new_allocation.x += tx;
8566 new_allocation.y += ty;
8569 window = gdk_window_get_parent (window);
8573 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
8574 (data->x < new_allocation.x + new_allocation.width) &&
8575 (data->y < new_allocation.y + new_allocation.height))
8577 /* First, check if the drag is in a valid drop site in
8578 * one of our children
8580 if (GTK_IS_CONTAINER (widget))
8582 FindWidgetData new_data = *data;
8584 new_data.x -= x_offset;
8585 new_data.y -= y_offset;
8586 new_data.found = FALSE;
8587 new_data.first = FALSE;
8589 gtk_container_forall (GTK_CONTAINER (widget),
8590 (GtkCallback)find_widget,
8593 data->found = new_data.found;
8595 data->res_widget = new_data.res_widget;
8598 /* If not, and this widget is registered as a drop site, check to
8599 * emit "drag_motion" to check if we are actually in
8605 data->res_widget = widget;
8611 find_widget_at_pointer (GdkDevice *device)
8613 GtkWidget *widget = NULL;
8614 GdkWindow *pointer_window;
8616 FindWidgetData data;
8618 pointer_window = gdk_device_get_window_at_position (device, NULL, NULL);
8622 gpointer widget_ptr;
8624 gdk_window_get_user_data (pointer_window, &widget_ptr);
8625 widget = widget_ptr;
8630 gdk_window_get_pointer (gtk_widget_get_window (widget),
8638 find_widget (widget, &data);
8640 return data.res_widget;
8646 struct PropertiesData {
8654 destroy_properties (GtkWidget *widget,
8655 struct PropertiesData *data)
8659 *data->window = NULL;
8660 data->window = NULL;
8665 g_object_unref (data->cursor);
8666 data->cursor = NULL;
8671 g_signal_handler_disconnect (widget, data->handler);
8679 property_query_event (GtkWidget *widget,
8681 struct PropertiesData *data)
8683 GtkWidget *res_widget = NULL;
8685 if (!data->in_query)
8688 if (event->type == GDK_BUTTON_RELEASE)
8690 gtk_grab_remove (widget);
8691 gdk_device_ungrab (gdk_event_get_device (event), GDK_CURRENT_TIME);
8693 res_widget = find_widget_at_pointer (gdk_event_get_device (event));
8696 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
8697 gtk_widget_get_screen (widget));
8698 create_prop_editor (G_OBJECT (res_widget), 0);
8701 data->in_query = FALSE;
8708 query_properties (GtkButton *button,
8709 struct PropertiesData *data)
8711 GtkWidget *widget = GTK_WIDGET (button);
8712 GdkDisplay *display;
8713 GdkDeviceManager *device_manager;
8716 g_signal_connect (button, "event",
8717 G_CALLBACK (property_query_event), data);
8719 display = gtk_widget_get_display (widget);
8722 data->cursor = gdk_cursor_new_for_display (display, GDK_TARGET);
8724 device_manager = gdk_display_get_device_manager (display);
8725 device = gdk_device_manager_get_client_pointer (device_manager);
8726 gdk_device_grab (device,
8727 gtk_widget_get_window (widget),
8730 GDK_BUTTON_RELEASE_MASK,
8733 gtk_grab_add (widget);
8735 data->in_query = TRUE;
8739 create_properties (GtkWidget *widget)
8741 static GtkWidget *window = NULL;
8745 struct PropertiesData *data;
8747 data = g_new (struct PropertiesData, 1);
8748 data->window = &window;
8749 data->in_query = FALSE;
8750 data->cursor = NULL;
8755 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8757 gtk_window_set_screen (GTK_WINDOW (window),
8758 gtk_widget_get_screen (widget));
8760 data->handler = g_signal_connect (window, "destroy",
8761 G_CALLBACK (destroy_properties),
8764 gtk_window_set_title (GTK_WINDOW (window), "test properties");
8765 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
8767 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1);
8768 gtk_container_add (GTK_CONTAINER (window), vbox);
8770 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
8771 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
8773 button = gtk_button_new_with_label ("Query properties");
8774 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8775 g_signal_connect (button, "clicked",
8776 G_CALLBACK (query_properties),
8780 if (!gtk_widget_get_visible (window))
8781 gtk_widget_show_all (window);
8783 gtk_widget_destroy (window);
8787 struct SnapshotData {
8788 GtkWidget *toplevel_button;
8792 gboolean is_toplevel;
8797 destroy_snapshot_data (GtkWidget *widget,
8798 struct SnapshotData *data)
8801 *data->window = NULL;
8805 g_object_unref (data->cursor);
8806 data->cursor = NULL;
8811 g_signal_handler_disconnect (widget, data->handler);
8819 snapshot_widget_event (GtkWidget *widget,
8821 struct SnapshotData *data)
8823 GtkWidget *res_widget = NULL;
8825 if (!data->in_query)
8828 if (event->type == GDK_BUTTON_RELEASE)
8830 gtk_grab_remove (widget);
8831 gdk_device_ungrab (gdk_event_get_device (event),
8834 res_widget = find_widget_at_pointer (gdk_event_get_device (event));
8835 if (data->is_toplevel && res_widget)
8836 res_widget = gtk_widget_get_toplevel (res_widget);
8839 cairo_surface_t *surface;
8840 GtkWidget *window, *image;
8845 width = gtk_widget_get_allocated_width (res_widget);
8846 height = gtk_widget_get_allocated_height (res_widget);
8848 surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
8850 cr = cairo_create (surface);
8851 gtk_widget_draw (res_widget, cr);
8854 pixbuf = gdk_pixbuf_get_from_surface (surface,
8857 cairo_surface_destroy (surface);
8859 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8860 image = gtk_image_new_from_pixbuf (pixbuf);
8861 g_object_unref (pixbuf);
8863 gtk_container_add (GTK_CONTAINER (window), image);
8864 gtk_widget_show_all (window);
8867 data->in_query = FALSE;
8874 snapshot_widget (GtkButton *button,
8875 struct SnapshotData *data)
8877 GtkWidget *widget = GTK_WIDGET (button);
8880 device = gtk_get_current_event_device ();
8884 if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
8885 device = gdk_device_get_associated_device (device);
8887 data->is_toplevel = widget == data->toplevel_button;
8890 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget),
8893 gdk_device_grab (device,
8894 gtk_widget_get_window (widget),
8895 GDK_OWNERSHIP_APPLICATION,
8897 GDK_BUTTON_RELEASE_MASK,
8901 g_signal_connect (button, "event",
8902 G_CALLBACK (snapshot_widget_event), data);
8904 gtk_grab_add (widget);
8906 data->in_query = TRUE;
8910 create_snapshot (GtkWidget *widget)
8912 static GtkWidget *window = NULL;
8915 struct SnapshotData *data;
8917 data = g_new (struct SnapshotData, 1);
8918 data->window = &window;
8919 data->in_query = FALSE;
8920 data->cursor = NULL;
8925 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8927 gtk_window_set_screen (GTK_WINDOW (window),
8928 gtk_widget_get_screen (widget));
8930 data->handler = g_signal_connect (window, "destroy",
8931 G_CALLBACK (destroy_snapshot_data),
8934 gtk_window_set_title (GTK_WINDOW (window), "test snapshot");
8935 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
8937 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1);
8938 gtk_container_add (GTK_CONTAINER (window), vbox);
8940 button = gtk_button_new_with_label ("Snapshot widget");
8941 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8942 g_signal_connect (button, "clicked",
8943 G_CALLBACK (snapshot_widget),
8946 button = gtk_button_new_with_label ("Snapshot toplevel");
8947 data->toplevel_button = button;
8948 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8949 g_signal_connect (button, "clicked",
8950 G_CALLBACK (snapshot_widget),
8954 if (!gtk_widget_get_visible (window))
8955 gtk_widget_show_all (window);
8957 gtk_widget_destroy (window);
8966 selection_test_received (GtkWidget *tree_view,
8967 GtkSelectionData *selection_data)
8969 GtkTreeModel *model;
8970 GtkListStore *store;
8974 if (gtk_selection_data_get_length (selection_data) < 0)
8976 g_print ("Selection retrieval failed\n");
8979 if (gtk_selection_data_get_data_type (selection_data) != GDK_SELECTION_TYPE_ATOM)
8981 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
8985 /* Clear out any current list items */
8987 model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
8988 store = GTK_LIST_STORE (model);
8989 gtk_list_store_clear (store);
8991 /* Add new items to list */
8993 gtk_selection_data_get_targets (selection_data,
8996 for (i = 0; i < l; i++)
9001 name = gdk_atom_name (atoms[i]);
9004 gtk_list_store_insert_with_values (store, &iter, i, 0, name, -1);
9008 gtk_list_store_insert_with_values (store, &iter, i, 0, "(bad atom)", -1);
9015 selection_test_get_targets (GtkWidget *widget, GtkWidget *tree_view)
9017 static GdkAtom targets_atom = GDK_NONE;
9019 if (targets_atom == GDK_NONE)
9020 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
9022 gtk_selection_convert (tree_view, GDK_SELECTION_PRIMARY, targets_atom,
9027 create_selection_test (GtkWidget *widget)
9029 static GtkWidget *window = NULL;
9030 GtkWidget *action_area, *content_area;
9033 GtkWidget *scrolled_win;
9034 GtkListStore* store;
9035 GtkWidget *tree_view;
9036 GtkTreeViewColumn *column;
9037 GtkCellRenderer *renderer;
9042 window = gtk_dialog_new ();
9044 gtk_window_set_screen (GTK_WINDOW (window),
9045 gtk_widget_get_screen (widget));
9047 g_signal_connect (window, "destroy",
9048 G_CALLBACK (gtk_widget_destroyed),
9051 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9052 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9054 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
9055 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9057 /* Create the list */
9059 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
9060 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9061 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
9063 label = gtk_label_new ("Gets available targets for current selection");
9064 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9066 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
9067 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
9068 GTK_POLICY_AUTOMATIC,
9069 GTK_POLICY_AUTOMATIC);
9070 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
9071 gtk_widget_set_size_request (scrolled_win, 100, 200);
9073 store = gtk_list_store_new (1, G_TYPE_STRING);
9074 tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
9075 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), tree_view);
9077 renderer = gtk_cell_renderer_text_new ();
9078 column = gtk_tree_view_column_new_with_attributes ("Target", renderer,
9080 gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
9082 g_signal_connect (tree_view, "selection_received",
9083 G_CALLBACK (selection_test_received), NULL);
9085 /* .. And create some buttons */
9086 button = gtk_button_new_with_label ("Get Targets");
9087 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9089 g_signal_connect (button, "clicked",
9090 G_CALLBACK (selection_test_get_targets), tree_view);
9092 button = gtk_button_new_with_label ("Quit");
9093 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9095 g_signal_connect_swapped (button, "clicked",
9096 G_CALLBACK (gtk_widget_destroy),
9100 if (!gtk_widget_get_visible (window))
9101 gtk_widget_show_all (window);
9103 gtk_widget_destroy (window);
9110 static int scroll_test_pos = 0.0;
9113 scroll_test_draw (GtkWidget *widget,
9115 GtkAdjustment *adjustment)
9118 gint imin, imax, jmin, jmax;
9121 gdk_cairo_get_clip_rectangle (cr, &clip);
9123 imin = (clip.x) / 10;
9124 imax = (clip.x + clip.width + 9) / 10;
9126 jmin = ((int)gtk_adjustment_get_value (adjustment) + clip.y) / 10;
9127 jmax = ((int)gtk_adjustment_get_value (adjustment) + clip.y + clip.height + 9) / 10;
9129 for (i=imin; i<imax; i++)
9130 for (j=jmin; j<jmax; j++)
9132 cairo_rectangle (cr, 10*i, 10*j - (int)gtk_adjustment_get_value (adjustment), 1+i%10, 1+j%10);
9140 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
9141 GtkAdjustment *adjustment)
9143 gdouble new_value = gtk_adjustment_get_value (adjustment) + ((event->direction == GDK_SCROLL_UP) ?
9144 -gtk_adjustment_get_page_increment (adjustment) / 2:
9145 gtk_adjustment_get_page_increment (adjustment) / 2);
9146 new_value = CLAMP (new_value, gtk_adjustment_get_lower (adjustment), gtk_adjustment_get_upper (adjustment) - gtk_adjustment_get_page_size (adjustment));
9147 gtk_adjustment_set_value (adjustment, new_value);
9153 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
9154 GtkAdjustment *adjustment)
9156 GtkAllocation allocation;
9158 gtk_widget_get_allocation (widget, &allocation);
9159 gtk_adjustment_configure (adjustment,
9160 gtk_adjustment_get_value (adjustment),
9161 gtk_adjustment_get_lower (adjustment),
9162 gtk_adjustment_get_upper (adjustment),
9163 0.1 * allocation.height,
9164 0.9 * allocation.height,
9169 scroll_test_adjustment_changed (GtkAdjustment *adjustment, GtkWidget *widget)
9174 dy = scroll_test_pos - (int)gtk_adjustment_get_value (adjustment);
9175 scroll_test_pos = gtk_adjustment_get_value (adjustment);
9177 if (!gtk_widget_is_drawable (widget))
9180 window = gtk_widget_get_window (widget);
9181 gdk_window_scroll (window, 0, dy);
9182 gdk_window_process_updates (window, FALSE);
9187 create_scroll_test (GtkWidget *widget)
9189 static GtkWidget *window = NULL;
9190 GtkWidget *action_area, *content_area;
9192 GtkWidget *drawing_area;
9193 GtkWidget *scrollbar;
9195 GtkAdjustment *adjustment;
9196 GdkGeometry geometry;
9197 GdkWindowHints geometry_mask;
9201 window = gtk_dialog_new ();
9203 gtk_window_set_screen (GTK_WINDOW (window),
9204 gtk_widget_get_screen (widget));
9206 g_signal_connect (window, "destroy",
9207 G_CALLBACK (gtk_widget_destroyed),
9210 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9211 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9213 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
9214 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9216 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
9217 gtk_box_pack_start (GTK_BOX (content_area), hbox, TRUE, TRUE, 0);
9218 gtk_widget_show (hbox);
9220 drawing_area = gtk_drawing_area_new ();
9221 gtk_widget_set_size_request (drawing_area, 200, 200);
9222 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
9223 gtk_widget_show (drawing_area);
9225 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
9227 adjustment = gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0);
9228 scroll_test_pos = 0.0;
9230 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, adjustment);
9231 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
9232 gtk_widget_show (scrollbar);
9234 g_signal_connect (drawing_area, "draw",
9235 G_CALLBACK (scroll_test_draw), adjustment);
9236 g_signal_connect (drawing_area, "configure_event",
9237 G_CALLBACK (scroll_test_configure), adjustment);
9238 g_signal_connect (drawing_area, "scroll_event",
9239 G_CALLBACK (scroll_test_scroll), adjustment);
9241 g_signal_connect (adjustment, "value_changed",
9242 G_CALLBACK (scroll_test_adjustment_changed),
9245 /* .. And create some buttons */
9247 button = gtk_button_new_with_label ("Quit");
9248 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9250 g_signal_connect_swapped (button, "clicked",
9251 G_CALLBACK (gtk_widget_destroy),
9253 gtk_widget_show (button);
9255 /* Set up gridded geometry */
9257 geometry_mask = GDK_HINT_MIN_SIZE |
9258 GDK_HINT_BASE_SIZE |
9259 GDK_HINT_RESIZE_INC;
9261 geometry.min_width = 20;
9262 geometry.min_height = 20;
9263 geometry.base_width = 0;
9264 geometry.base_height = 0;
9265 geometry.width_inc = 10;
9266 geometry.height_inc = 10;
9268 gtk_window_set_geometry_hints (GTK_WINDOW (window),
9269 drawing_area, &geometry, geometry_mask);
9272 if (!gtk_widget_get_visible (window))
9273 gtk_widget_show (window);
9275 gtk_widget_destroy (window);
9282 static int timer = 0;
9285 timeout_test (GtkWidget *label)
9287 static int count = 0;
9288 static char buffer[32];
9290 sprintf (buffer, "count: %d", ++count);
9291 gtk_label_set_text (GTK_LABEL (label), buffer);
9297 start_timeout_test (GtkWidget *widget,
9302 timer = g_timeout_add (100, (GSourceFunc)timeout_test, label);
9307 stop_timeout_test (GtkWidget *widget,
9312 g_source_remove (timer);
9318 destroy_timeout_test (GtkWidget *widget,
9321 stop_timeout_test (NULL, NULL);
9327 create_timeout_test (GtkWidget *widget)
9329 static GtkWidget *window = NULL;
9330 GtkWidget *action_area, *content_area;
9336 window = gtk_dialog_new ();
9338 gtk_window_set_screen (GTK_WINDOW (window),
9339 gtk_widget_get_screen (widget));
9341 g_signal_connect (window, "destroy",
9342 G_CALLBACK (destroy_timeout_test),
9345 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9346 action_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9348 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
9349 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9351 label = gtk_label_new ("count: 0");
9352 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
9353 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9354 gtk_widget_show (label);
9356 button = gtk_button_new_with_label ("close");
9357 g_signal_connect_swapped (button, "clicked",
9358 G_CALLBACK (gtk_widget_destroy),
9360 gtk_widget_set_can_default (button, TRUE);
9361 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9362 gtk_widget_grab_default (button);
9363 gtk_widget_show (button);
9365 button = gtk_button_new_with_label ("start");
9366 g_signal_connect (button, "clicked",
9367 G_CALLBACK(start_timeout_test),
9369 gtk_widget_set_can_default (button, TRUE);
9370 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9371 gtk_widget_show (button);
9373 button = gtk_button_new_with_label ("stop");
9374 g_signal_connect (button, "clicked",
9375 G_CALLBACK (stop_timeout_test),
9377 gtk_widget_set_can_default (button, TRUE);
9378 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9379 gtk_widget_show (button);
9382 if (!gtk_widget_get_visible (window))
9383 gtk_widget_show (window);
9385 gtk_widget_destroy (window);
9392 static int idle_id = 0;
9395 idle_test (GtkWidget *label)
9397 static int count = 0;
9398 static char buffer[32];
9400 sprintf (buffer, "count: %d", ++count);
9401 gtk_label_set_text (GTK_LABEL (label), buffer);
9407 start_idle_test (GtkWidget *widget,
9412 idle_id = g_idle_add ((GSourceFunc) idle_test, label);
9417 stop_idle_test (GtkWidget *widget,
9422 g_source_remove (idle_id);
9428 destroy_idle_test (GtkWidget *widget,
9431 stop_idle_test (NULL, NULL);
9437 toggle_idle_container (GObject *button,
9438 GtkContainer *container)
9440 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
9444 create_idle_test (GtkWidget *widget)
9446 static GtkWidget *window = NULL;
9449 GtkWidget *container;
9453 GtkWidget *action_area, *content_area;
9458 window = gtk_dialog_new ();
9460 gtk_window_set_screen (GTK_WINDOW (window),
9461 gtk_widget_get_screen (widget));
9463 g_signal_connect (window, "destroy",
9464 G_CALLBACK (destroy_idle_test),
9467 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9468 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9470 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
9471 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9473 label = gtk_label_new ("count: 0");
9474 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
9475 gtk_widget_show (label);
9478 g_object_new (GTK_TYPE_HBOX,
9480 /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
9481 * "GtkWidget::visible", TRUE,
9486 gtk_box_pack_start (GTK_BOX (content_area), container, TRUE, TRUE, 0);
9489 g_object_new (GTK_TYPE_FRAME,
9491 "label", "Label Container",
9493 "parent", content_area,
9496 g_object_new (GTK_TYPE_VBOX,
9501 g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
9502 "label", "Resize-Parent",
9503 "user_data", (void*)GTK_RESIZE_PARENT,
9507 "signal::clicked", toggle_idle_container, container,
9509 button = g_object_new (GTK_TYPE_RADIO_BUTTON,
9510 "label", "Resize-Queue",
9511 "user_data", (void*)GTK_RESIZE_QUEUE,
9516 g_object_connect (button,
9517 "signal::clicked", toggle_idle_container, container,
9519 button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
9520 "label", "Resize-Immediate",
9521 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
9523 g_object_connect (button2,
9524 "signal::clicked", toggle_idle_container, container,
9526 g_object_set (button2,
9532 button = gtk_button_new_with_label ("close");
9533 g_signal_connect_swapped (button, "clicked",
9534 G_CALLBACK (gtk_widget_destroy),
9536 gtk_widget_set_can_default (button, TRUE);
9537 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9538 gtk_widget_grab_default (button);
9539 gtk_widget_show (button);
9541 button = gtk_button_new_with_label ("start");
9542 g_signal_connect (button, "clicked",
9543 G_CALLBACK (start_idle_test),
9545 gtk_widget_set_can_default (button, TRUE);
9546 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9547 gtk_widget_show (button);
9549 button = gtk_button_new_with_label ("stop");
9550 g_signal_connect (button, "clicked",
9551 G_CALLBACK (stop_idle_test),
9553 gtk_widget_set_can_default (button, TRUE);
9554 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9555 gtk_widget_show (button);
9558 if (!gtk_widget_get_visible (window))
9559 gtk_widget_show (window);
9561 gtk_widget_destroy (window);
9569 create_rc_file (GtkWidget *widget)
9571 static GtkWidget *window = NULL;
9572 GtkWidget *action_area, *content_area;
9580 window = gtk_dialog_new ();
9582 gtk_window_set_screen (GTK_WINDOW (window),
9583 gtk_widget_get_screen (widget));
9585 g_signal_connect (window, "destroy",
9586 G_CALLBACK (gtk_widget_destroyed),
9589 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9590 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9592 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
9593 gtk_box_pack_start (GTK_BOX (content_area), frame, FALSE, FALSE, 0);
9595 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
9596 gtk_container_add (GTK_CONTAINER (frame), vbox);
9598 label = gtk_label_new ("This label should be red");
9599 gtk_widget_set_name (label, "testgtk-red-label");
9600 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9602 label = gtk_label_new ("This label should be green");
9603 gtk_widget_set_name (label, "testgtk-green-label");
9604 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9606 label = gtk_label_new ("This label should be blue");
9607 gtk_widget_set_name (label, "testgtk-blue-label");
9608 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9610 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
9611 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9613 button = gtk_button_new_with_label ("Reload");
9614 g_signal_connect_swapped (button, "clicked",
9615 G_CALLBACK (gtk_style_context_reset_widgets),
9616 gtk_widget_get_screen (button));
9617 gtk_widget_set_can_default (button, TRUE);
9618 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9619 gtk_widget_grab_default (button);
9621 button = gtk_button_new_with_label ("Close");
9622 g_signal_connect_swapped (button, "clicked",
9623 G_CALLBACK (gtk_widget_destroy),
9625 gtk_widget_set_can_default (button, TRUE);
9626 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9629 if (!gtk_widget_get_visible (window))
9630 gtk_widget_show_all (window);
9632 gtk_widget_destroy (window);
9636 * Test of recursive mainloop
9640 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
9647 create_mainloop (GtkWidget *widget)
9649 static GtkWidget *window = NULL;
9650 GtkWidget *action_area, *content_area;
9656 window = gtk_dialog_new ();
9658 gtk_window_set_screen (GTK_WINDOW (window),
9659 gtk_widget_get_screen (widget));
9661 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
9663 g_signal_connect (window, "destroy",
9664 G_CALLBACK (mainloop_destroyed),
9667 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9668 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9670 label = gtk_label_new ("In recursive main loop...");
9671 gtk_misc_set_padding (GTK_MISC(label), 20, 20);
9673 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9674 gtk_widget_show (label);
9676 button = gtk_button_new_with_label ("Leave");
9677 gtk_box_pack_start (GTK_BOX (action_area), button, FALSE, TRUE, 0);
9679 g_signal_connect_swapped (button, "clicked",
9680 G_CALLBACK (gtk_widget_destroy),
9683 gtk_widget_set_can_default (button, TRUE);
9684 gtk_widget_grab_default (button);
9686 gtk_widget_show (button);
9689 if (!gtk_widget_get_visible (window))
9691 gtk_widget_show (window);
9693 g_print ("create_mainloop: start\n");
9695 g_print ("create_mainloop: done\n");
9698 gtk_widget_destroy (window);
9702 layout_draw_handler (GtkWidget *widget, cairo_t *cr)
9705 GdkWindow *bin_window;
9708 gint imin, imax, jmin, jmax;
9710 layout = GTK_LAYOUT (widget);
9711 bin_window = gtk_layout_get_bin_window (layout);
9713 if (!gtk_cairo_should_draw_window (cr, bin_window))
9716 gdk_window_get_position (bin_window, &x, &y);
9717 cairo_translate (cr, x, y);
9719 gdk_cairo_get_clip_rectangle (cr, &clip);
9721 imin = (clip.x) / 10;
9722 imax = (clip.x + clip.width + 9) / 10;
9724 jmin = (clip.y) / 10;
9725 jmax = (clip.y + clip.height + 9) / 10;
9727 for (i=imin; i<imax; i++)
9728 for (j=jmin; j<jmax; j++)
9730 cairo_rectangle (cr,
9739 void create_layout (GtkWidget *widget)
9741 GtkAdjustment *hadjustment, *vadjustment;
9743 static GtkWidget *window = NULL;
9744 GtkWidget *layout_widget;
9745 GtkWidget *scrolledwindow;
9754 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9755 gtk_window_set_screen (GTK_WINDOW (window),
9756 gtk_widget_get_screen (widget));
9758 g_signal_connect (window, "destroy",
9759 G_CALLBACK (gtk_widget_destroyed),
9762 gtk_window_set_title (GTK_WINDOW (window), "Layout");
9763 gtk_widget_set_size_request (window, 200, 200);
9765 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
9766 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
9768 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
9769 GTK_CORNER_TOP_RIGHT);
9771 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
9773 layout_widget = gtk_layout_new (NULL, NULL);
9774 layout = GTK_LAYOUT (layout_widget);
9775 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout_widget);
9777 /* We set step sizes here since GtkLayout does not set
9780 hadjustment = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (layout));
9781 vadjustment = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (layout));
9782 gtk_adjustment_set_step_increment (hadjustment, 10.0);
9783 gtk_adjustment_set_step_increment (vadjustment, 10.0);
9784 gtk_scrollable_set_hadjustment (GTK_SCROLLABLE (layout), hadjustment);
9785 gtk_scrollable_set_vadjustment (GTK_SCROLLABLE (layout), vadjustment);
9787 gtk_widget_set_events (layout_widget, GDK_EXPOSURE_MASK);
9788 g_signal_connect (layout, "draw",
9789 G_CALLBACK (layout_draw_handler), NULL);
9791 gtk_layout_set_size (layout, 1600, 128000);
9793 for (i=0 ; i < 16 ; i++)
9794 for (j=0 ; j < 16 ; j++)
9796 sprintf(buf, "Button %d, %d", i, j);
9798 button = gtk_button_new_with_label (buf);
9800 button = gtk_label_new (buf);
9802 gtk_layout_put (layout, button, j*100, i*100);
9805 for (i=16; i < 1280; i++)
9807 sprintf(buf, "Button %d, %d", i, 0);
9809 button = gtk_button_new_with_label (buf);
9811 button = gtk_label_new (buf);
9813 gtk_layout_put (layout, button, 0, i*100);
9817 if (!gtk_widget_get_visible (window))
9818 gtk_widget_show_all (window);
9820 gtk_widget_destroy (window);
9824 /* FIXME: need to completely redo this for GtkStyleContext */
9826 create_styles (GtkWidget *widget)
9828 static GtkWidget *window = NULL;
9829 GtkWidget *content_area, *action_area;
9834 static GdkRGBA red = { 1,0,0,1 };
9835 static GdkRGBA green = { 0,1,0,1 };
9836 static GdkRGBA blue = { 0,0,1,1 };
9837 static GdkRGBA yellow = { 1,1,0,1 };
9838 static GdkRGBA cyan = { 0,1,1,1 };
9839 PangoFontDescription *font_desc;
9841 GtkRcStyle *rc_style;
9845 window = gtk_dialog_new ();
9846 gtk_window_set_screen (GTK_WINDOW (window),
9847 gtk_widget_get_screen (widget));
9849 g_signal_connect (window, "destroy",
9850 G_CALLBACK (gtk_widget_destroyed),
9853 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9854 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9856 button = gtk_button_new_with_label ("Close");
9857 g_signal_connect_swapped (button, "clicked",
9858 G_CALLBACK (gtk_widget_destroy),
9860 gtk_widget_set_can_default (button, TRUE);
9861 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9862 gtk_widget_show (button);
9864 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
9865 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9866 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, FALSE, 0);
9868 label = gtk_label_new ("Font:");
9869 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9870 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9872 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
9874 button = gtk_button_new_with_label ("Some Text");
9875 gtk_widget_override_font (gtk_bin_get_child (GTK_BIN (button)), font_desc);
9876 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9878 label = gtk_label_new ("Foreground:");
9879 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9880 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9882 button = gtk_button_new_with_label ("Some Text");
9883 gtk_widget_override_color (gtk_bin_get_child (GTK_BIN (button)), 0, &red);
9884 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9886 label = gtk_label_new ("Background:");
9887 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9888 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9890 button = gtk_button_new_with_label ("Some Text");
9891 gtk_widget_override_background_color (button, 0, &green);
9892 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9894 label = gtk_label_new ("Text:");
9895 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9896 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9898 entry = gtk_entry_new ();
9899 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9900 gtk_widget_override_color (entry, 0, &blue);
9901 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9903 label = gtk_label_new ("Base:");
9904 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
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_background_color (entry, 0, &yellow);
9910 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9912 label = gtk_label_new ("Cursor:");
9913 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9914 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9916 entry = gtk_entry_new ();
9917 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9918 gtk_widget_modify_cursor (entry, &red, &red);
9919 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9921 label = gtk_label_new ("Multiple:");
9922 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9923 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9925 button = gtk_button_new_with_label ("Some Text");
9927 rc_style = gtk_rc_style_new ();
9929 rc_style->font_desc = pango_font_description_copy (font_desc);
9930 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
9931 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
9932 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
9933 rc_style->fg[GTK_STATE_NORMAL] = yellow;
9934 rc_style->bg[GTK_STATE_NORMAL] = blue;
9935 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
9936 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
9937 rc_style->fg[GTK_STATE_ACTIVE] = red;
9938 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
9939 rc_style->xthickness = 5;
9940 rc_style->ythickness = 5;
9942 gtk_widget_modify_style (button, rc_style);
9943 gtk_widget_modify_style (gtk_bin_get_child (GTK_BIN (button)), rc_style);
9945 g_object_unref (rc_style);
9947 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9950 if (!gtk_widget_get_visible (window))
9951 gtk_widget_show_all (window);
9953 gtk_widget_destroy (window);
9958 * Main Window and Exit
9962 do_exit (GtkWidget *widget, GtkWidget *window)
9964 gtk_widget_destroy (window);
9970 void (*func) (GtkWidget *widget);
9971 gboolean do_not_benchmark;
9974 { "alpha window", create_alpha_window },
9975 { "big windows", create_big_windows },
9976 { "button box", create_button_box },
9977 { "buttons", create_buttons },
9978 { "check buttons", create_check_buttons },
9979 { "color selection", create_color_selection },
9980 { "composited window", create_composited_window },
9981 { "cursors", create_cursors },
9982 { "dialog", create_dialog },
9983 { "display & screen", create_display_screen, TRUE },
9984 { "entry", create_entry },
9985 { "event box", create_event_box },
9986 { "event watcher", create_event_watcher },
9987 { "expander", create_expander },
9988 { "flipping", create_flipping },
9989 { "focus", create_focus },
9990 { "font selection", create_font_selection },
9991 { "handle box", create_handle_box },
9992 { "image", create_image },
9993 { "key lookup", create_key_lookup },
9994 { "labels", create_labels },
9995 { "layout", create_layout },
9996 { "menus", create_menus },
9997 { "message dialog", create_message_dialog },
9998 { "modal window", create_modal_window, TRUE },
9999 { "notebook", create_notebook },
10000 { "panes", create_panes },
10001 { "paned keyboard", create_paned_keyboard_navigation },
10002 { "pixbuf", create_pixbuf },
10003 { "progress bar", create_progress_bar },
10004 { "properties", create_properties },
10005 { "radio buttons", create_radio_buttons },
10006 { "range controls", create_range_controls },
10007 { "rc file", create_rc_file },
10008 { "reparent", create_reparent },
10009 { "resize grips", create_resize_grips },
10010 { "rotated label", create_rotated_label },
10011 { "rotated text", create_rotated_text },
10012 { "saved position", create_saved_position },
10013 { "scrolled windows", create_scrolled_windows },
10014 { "shapes", create_shapes },
10015 { "size groups", create_size_groups },
10016 { "snapshot", create_snapshot },
10017 { "spinbutton", create_spins },
10018 { "statusbar", create_statusbar },
10020 { "styles", create_styles },
10022 { "test idle", create_idle_test },
10023 { "test mainloop", create_mainloop, TRUE },
10024 { "test scrolling", create_scroll_test },
10025 { "test selection", create_selection_test },
10026 { "test timeout", create_timeout_test },
10027 { "toggle buttons", create_toggle_buttons },
10028 { "toolbar", create_toolbar },
10029 { "tooltips", create_tooltips },
10030 { "WM hints", create_wmhints },
10031 { "window sizing", create_window_sizing },
10032 { "window states", create_window_states }
10034 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
10037 create_main_window (void)
10042 GtkWidget *scrolled_window;
10046 GtkWidget *separator;
10047 GdkGeometry geometry;
10050 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10051 gtk_widget_set_name (window, "main_window");
10052 gtk_window_move (GTK_WINDOW (window), 50, 20);
10053 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
10055 geometry.min_width = -1;
10056 geometry.min_height = -1;
10057 geometry.max_width = -1;
10058 geometry.max_height = G_MAXSHORT;
10059 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
10061 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
10063 g_signal_connect (window, "destroy",
10064 G_CALLBACK (gtk_main_quit),
10066 g_signal_connect (window, "delete-event",
10067 G_CALLBACK (gtk_false),
10070 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
10071 gtk_container_add (GTK_CONTAINER (window), box1);
10073 if (gtk_micro_version > 0)
10076 gtk_get_major_version (),
10077 gtk_get_minor_version (),
10078 gtk_get_micro_version ());
10082 gtk_get_major_version (),
10083 gtk_get_minor_version ());
10085 label = gtk_label_new (buffer);
10086 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
10087 gtk_widget_set_name (label, "testgtk-version-label");
10089 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
10090 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
10091 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
10093 GTK_POLICY_AUTOMATIC);
10094 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
10096 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
10097 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10098 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
10099 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
10100 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
10101 gtk_widget_show (box2);
10103 for (i = 0; i < nbuttons; i++)
10105 button = gtk_button_new_with_label (buttons[i].label);
10106 if (buttons[i].func)
10107 g_signal_connect (button,
10109 G_CALLBACK(buttons[i].func),
10112 gtk_widget_set_sensitive (button, FALSE);
10113 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10116 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
10117 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
10119 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
10120 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10121 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
10123 button = gtk_button_new_with_mnemonic ("_Close");
10124 g_signal_connect (button, "clicked",
10125 G_CALLBACK (do_exit),
10127 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10128 gtk_widget_set_can_default (button, TRUE);
10129 gtk_widget_grab_default (button);
10131 gtk_widget_show_all (window);
10137 if (g_file_test ("../modules/input/immodules.cache", G_FILE_TEST_EXISTS))
10138 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/immodules.cache", TRUE);
10142 pad (const char *str, int to)
10144 static char buf[256];
10145 int len = strlen (str);
10148 for (i = 0; i < to; i++)
10153 memcpy (buf, str, len);
10159 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
10161 fn (widget); /* on */
10162 while (g_main_context_iteration (NULL, FALSE));
10163 fn (widget); /* off */
10164 while (g_main_context_iteration (NULL, FALSE));
10168 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
10174 static gboolean printed_headers = FALSE;
10176 if (!printed_headers) {
10177 g_print ("Test Iters First Other\n");
10178 g_print ("-------------------- ----- ---------- ----------\n");
10179 printed_headers = TRUE;
10182 g_get_current_time (&tv0);
10183 bench_iteration (widget, fn);
10184 g_get_current_time (&tv1);
10186 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10187 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10189 g_get_current_time (&tv0);
10190 for (n = 0; n < num - 1; n++)
10191 bench_iteration (widget, fn);
10192 g_get_current_time (&tv1);
10193 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10194 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10196 g_print ("%s %5d ", pad (name, 20), num);
10198 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
10200 g_print ("%10.1f\n", dt_first);
10204 do_bench (char* what, int num)
10208 void (* fn) (GtkWidget *widget);
10210 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10212 if (g_ascii_strcasecmp (what, "ALL") == 0)
10214 for (i = 0; i < nbuttons; i++)
10216 if (!buttons[i].do_not_benchmark)
10217 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
10224 for (i = 0; i < nbuttons; i++)
10226 if (strcmp (buttons[i].label, what) == 0)
10228 fn = buttons[i].func;
10234 g_print ("Can't bench: \"%s\" not found.\n", what);
10236 do_real_bench (widget, fn, buttons[i].label, num);
10243 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
10248 main (int argc, char *argv[])
10250 GtkCssProvider *provider, *memory_provider;
10251 GdkDisplay *display;
10253 GtkBindingSet *binding_set;
10255 gboolean done_benchmarks = FALSE;
10257 srand (time (NULL));
10261 g_set_application_name ("GTK+ Test Program");
10263 gtk_init (&argc, &argv);
10265 provider = gtk_css_provider_new ();
10267 /* Check to see if we are being run from the correct
10270 if (file_exists ("testgtk.css"))
10271 gtk_css_provider_load_from_path (provider, "testgtk.css", NULL);
10272 else if (file_exists ("tests/testgtk.css"))
10273 gtk_css_provider_load_from_path (provider, "tests/testgtk.css", NULL);
10275 g_warning ("Couldn't find file \"testgtk.css\".");
10277 display = gdk_display_get_default ();
10278 screen = gdk_display_get_default_screen (display);
10280 gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (provider),
10281 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
10282 g_object_unref (provider);
10284 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
10293 for (i = 1; i < argc; i++)
10295 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
10302 nextarg = strchr (argv[i], '=');
10313 count = strchr (nextarg, ':');
10316 what = g_strndup (nextarg, count - nextarg);
10318 num = atoi (count);
10323 what = g_strdup (nextarg);
10325 do_bench (what, num ? num : 1);
10326 done_benchmarks = TRUE;
10331 if (done_benchmarks)
10336 binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
10337 gtk_binding_entry_add_signal (binding_set,
10338 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
10341 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
10343 memory_provider = gtk_css_provider_new ();
10344 gtk_css_provider_load_from_data (memory_provider,
10345 "#testgtk-version-label {\n"
10347 " font: Sans 18;\n"
10350 gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (memory_provider),
10351 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION + 1);
10353 create_main_window ();
10359 while (g_main_context_pending (NULL))
10360 g_main_context_iteration (NULL, FALSE);
10363 while (g_main_context_pending (NULL))
10364 g_main_context_iteration (NULL, FALSE);