1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
21 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
22 * file for a list of people on the GTK+ Team. See the ChangeLog
23 * files for a list of changes. These files are distributed with
24 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
44 #include "gdk/gdkkeysyms.h"
47 #define sleep(n) _sleep(n)
50 #include "prop-editor.h"
55 file_exists (const char *filename)
59 return stat (filename, &statbuf) == 0;
63 shape_create_icon (GdkScreen *screen,
72 build_option_menu (gchar *items[],
75 void (*func) (GtkWidget *widget, gpointer data),
78 /* macro, structure and variables used by tree window demos */
79 #define DEFAULT_NUMBER_OF_ITEM 3
80 #define DEFAULT_RECURSION_LEVEL 3
83 GSList* selection_mode_group;
84 GtkWidget* single_button;
85 GtkWidget* browse_button;
86 GtkWidget* multiple_button;
87 GtkWidget* draw_line_button;
88 GtkWidget* view_line_button;
89 GtkWidget* no_root_item_button;
90 GtkWidget* nb_item_spinner;
91 GtkWidget* recursion_spinner;
92 } sTreeSampleSelection;
94 typedef struct sTreeButtons {
96 GtkWidget* add_button;
97 GtkWidget* remove_button;
98 GtkWidget* subtree_button;
100 /* end of tree section */
103 build_option_menu (gchar *items[],
106 void (*func)(GtkWidget *widget, gpointer data),
112 omenu = gtk_combo_box_text_new ();
113 g_signal_connect (omenu, "changed",
114 G_CALLBACK (func), data);
116 for (i = 0; i < num_items; i++)
117 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (omenu), items[i]);
119 gtk_combo_box_set_active (GTK_COMBO_BOX (omenu), history);
125 * Windows with an alpha channel
130 on_alpha_window_draw (GtkWidget *widget,
133 cairo_pattern_t *pattern;
134 int radius, width, height;
136 width = gtk_widget_get_allocated_width (widget);
137 height = gtk_widget_get_allocated_height (widget);
138 radius = MIN (width, height) / 2;
139 pattern = cairo_pattern_create_radial (width / 2,
146 if (gdk_screen_get_rgba_visual (gtk_widget_get_screen (widget)) &&
147 gtk_widget_is_composited (widget))
148 cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.0); /* transparent */
150 cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* opaque white */
152 cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
155 cairo_pattern_add_color_stop_rgba (pattern, 0.0,
156 1.0, 0.75, 0.0, 1.0); /* solid orange */
157 cairo_pattern_add_color_stop_rgba (pattern, 1.0,
158 1.0, 0.75, 0.0, 0.0); /* transparent orange */
160 cairo_set_source (cr, pattern);
161 cairo_pattern_destroy (pattern);
163 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
170 build_alpha_widgets (void)
173 GtkWidget *radio_button;
178 table = gtk_table_new (1, 1, FALSE);
180 radio_button = gtk_radio_button_new_with_label (NULL, "Red");
181 gtk_table_attach (GTK_TABLE (table),
184 GTK_EXPAND | GTK_FILL, 0,
187 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Green");
188 gtk_table_attach (GTK_TABLE (table),
191 GTK_EXPAND | GTK_FILL, 0,
194 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Blue"),
195 gtk_table_attach (GTK_TABLE (table),
198 GTK_EXPAND | GTK_FILL, 0,
201 gtk_table_attach (GTK_TABLE (table),
202 gtk_check_button_new_with_label ("Sedentary"),
204 GTK_EXPAND | GTK_FILL, 0,
206 gtk_table_attach (GTK_TABLE (table),
207 gtk_check_button_new_with_label ("Nocturnal"),
209 GTK_EXPAND | GTK_FILL, 0,
211 gtk_table_attach (GTK_TABLE (table),
212 gtk_check_button_new_with_label ("Compulsive"),
214 GTK_EXPAND | GTK_FILL, 0,
217 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Green");
218 gtk_table_attach (GTK_TABLE (table),
221 GTK_EXPAND | GTK_FILL, 0,
224 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Blue"),
225 gtk_table_attach (GTK_TABLE (table),
228 GTK_EXPAND | GTK_FILL, 0,
231 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
232 label = gtk_label_new (NULL);
233 gtk_label_set_markup (GTK_LABEL (label), "<i>Entry: </i>");
234 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
235 entry = gtk_entry_new ();
236 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
237 gtk_table_attach (GTK_TABLE (table),
240 GTK_EXPAND | GTK_FILL, 0,
247 on_alpha_screen_changed (GtkWindow *window,
248 GdkScreen *old_screen,
251 GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (window));
252 GdkVisual *visual = gdk_screen_get_rgba_visual (screen);
256 visual = gdk_screen_get_system_visual (screen);
257 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen doesn't support alpha</b>");
261 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen supports alpha</b>");
264 gtk_widget_set_visual (GTK_WIDGET (window), visual);
268 on_composited_changed (GtkWidget *window,
271 gboolean is_composited = gtk_widget_is_composited (window);
274 gtk_label_set_text (label, "Composited");
276 gtk_label_set_text (label, "Not composited");
280 create_alpha_window (GtkWidget *widget)
282 static GtkWidget *window;
286 GtkWidget *content_area;
290 window = gtk_dialog_new_with_buttons ("Alpha Window",
291 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
295 gtk_widget_set_app_paintable (window, TRUE);
296 g_signal_connect (window, "draw",
297 G_CALLBACK (on_alpha_window_draw), NULL);
299 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
301 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
302 gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
303 gtk_box_pack_start (GTK_BOX (content_area), vbox,
306 label = gtk_label_new (NULL);
307 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
308 on_alpha_screen_changed (GTK_WINDOW (window), NULL, label);
309 g_signal_connect (window, "screen-changed",
310 G_CALLBACK (on_alpha_screen_changed), label);
312 label = gtk_label_new (NULL);
313 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
314 on_composited_changed (window, GTK_LABEL (label));
315 g_signal_connect (window, "composited_changed", G_CALLBACK (on_composited_changed), label);
317 gtk_box_pack_start (GTK_BOX (vbox), build_alpha_widgets (), TRUE, TRUE, 0);
319 g_signal_connect (window, "destroy",
320 G_CALLBACK (gtk_widget_destroyed),
323 g_signal_connect (window, "response",
324 G_CALLBACK (gtk_widget_destroy),
328 if (!gtk_widget_get_visible (window))
329 gtk_widget_show_all (window);
331 gtk_widget_destroy (window);
335 * Composited non-toplevel window
338 /* The draw event handler for the event box.
340 * This function simply draws a transparency onto a widget on the area
341 * for which it receives expose events. This is intended to give the
342 * event box a "transparent" background.
344 * In order for this to work properly, the widget must have an RGBA
345 * colourmap. The widget should also be set as app-paintable since it
346 * doesn't make sense for GTK to draw a background if we are drawing it
347 * (and because GTK might actually replace our transparency with its
348 * default background colour).
351 transparent_draw (GtkWidget *widget,
354 cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
360 /* The expose event handler for the window.
362 * This function performs the actual compositing of the event box onto
363 * the already-existing background of the window at 50% normal opacity.
365 * In this case we do not want app-paintable to be set on the widget
366 * since we want it to draw its own (red) background. Because of this,
367 * however, we must ensure that we use g_signal_register_after so that
368 * this handler is called after the red has been drawn. If it was
369 * called before then GTK would just blindly paint over our work.
372 window_draw (GtkWidget *widget,
375 GtkAllocation allocation;
378 /* get our child (in this case, the event box) */
379 child = gtk_bin_get_child (GTK_BIN (widget));
381 gtk_widget_get_allocation (child, &allocation);
383 /* the source data is the (composited) event box */
384 gdk_cairo_set_source_window (cr, gtk_widget_get_window (child),
388 /* composite, with a 50% opacity */
389 cairo_paint_with_alpha (cr, 0.5);
395 create_composited_window (GtkWidget *widget)
397 static GtkWidget *window;
401 GtkWidget *event, *button;
404 /* make the widgets */
405 button = gtk_button_new_with_label ("A Button");
406 event = gtk_event_box_new ();
407 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
409 g_signal_connect (window, "destroy",
410 G_CALLBACK (gtk_widget_destroyed),
413 /* put a red background on the window */
414 gdk_rgba_parse (&red, "red");
415 gtk_widget_override_background_color (window, 0, &red);
417 /* set our event box to have a fully-transparent background
418 * drawn on it. currently there is no way to simply tell gtk
419 * that "transparency" is the background colour for a widget.
421 gtk_widget_set_app_paintable (GTK_WIDGET (event), TRUE);
422 g_signal_connect (event, "draw",
423 G_CALLBACK (transparent_draw), NULL);
425 /* put them inside one another */
426 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
427 gtk_container_add (GTK_CONTAINER (window), event);
428 gtk_container_add (GTK_CONTAINER (event), button);
430 /* realise and show everything */
431 gtk_widget_realize (button);
433 /* set the event box GdkWindow to be composited.
434 * obviously must be performed after event box is realised.
436 gdk_window_set_composited (gtk_widget_get_window (event),
439 /* set up the compositing handler.
440 * note that we do _after so that the normal (red) background is drawn
441 * by gtk before our compositing occurs.
443 g_signal_connect_after (window, "draw",
444 G_CALLBACK (window_draw), NULL);
447 if (!gtk_widget_get_visible (window))
448 gtk_widget_show_all (window);
450 gtk_widget_destroy (window);
454 * Big windows and guffaw scrolling
458 pattern_set_bg (GtkWidget *widget,
462 static const GdkColor colors[] = {
463 { 0, 0x4444, 0x4444, 0xffff },
464 { 0, 0x8888, 0x8888, 0xffff },
465 { 0, 0xaaaa, 0xaaaa, 0xffff }
468 gdk_window_set_user_data (child, widget);
469 gdk_window_set_background (child, &colors[level]);
473 create_pattern (GtkWidget *widget,
484 while (2 * h <= height)
489 while (2 * w <= width)
491 if ((i + j) % 2 == 0)
496 GdkWindowAttr attributes;
498 attributes.window_type = GDK_WINDOW_CHILD;
501 attributes.width = w;
502 attributes.height = h;
503 attributes.wclass = GDK_INPUT_OUTPUT;
504 attributes.event_mask = GDK_EXPOSURE_MASK;
505 attributes.visual = gtk_widget_get_visual (widget);
507 child = gdk_window_new (parent, &attributes,
508 GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL);
510 pattern_set_bg (widget, child, level);
513 create_pattern (widget, child, level + 1, w, h);
515 gdk_window_show (child);
525 #define PATTERN_SIZE (1 << 18)
528 pattern_hadj_changed (GtkAdjustment *adjustment,
531 gint *old_value = g_object_get_data (G_OBJECT (adjustment), "old-value");
532 gint new_value = gtk_adjustment_get_value (adjustment);
534 if (gtk_widget_get_realized (darea))
536 gdk_window_scroll (gtk_widget_get_window (darea),
537 *old_value - new_value, 0);
538 *old_value = new_value;
543 pattern_vadj_changed (GtkAdjustment *adjustment,
546 gint *old_value = g_object_get_data (G_OBJECT (adjustment), "old-value");
547 gint new_value = gtk_adjustment_get_value (adjustment);
549 if (gtk_widget_get_realized (darea))
551 gdk_window_scroll (gtk_widget_get_window (darea),
552 0, *old_value - new_value);
553 *old_value = new_value;
558 pattern_realize (GtkWidget *widget,
563 window = gtk_widget_get_window (widget);
564 pattern_set_bg (widget, window, 0);
565 create_pattern (widget, window, 1, PATTERN_SIZE, PATTERN_SIZE);
569 create_big_windows (GtkWidget *widget)
571 static GtkWidget *window = NULL;
572 GtkWidget *content_area;
573 GtkWidget *darea, *table, *scrollbar;
575 GtkAdjustment *hadjustment;
576 GtkAdjustment *vadjustment;
577 static gint current_x;
578 static gint current_y;
585 window = gtk_dialog_new_with_buttons ("Big Windows",
591 gtk_window_set_screen (GTK_WINDOW (window),
592 gtk_widget_get_screen (widget));
594 gtk_window_set_default_size (GTK_WINDOW (window), 200, 300);
596 g_signal_connect (window, "destroy",
597 G_CALLBACK (gtk_widget_destroyed),
600 g_signal_connect (window, "response",
601 G_CALLBACK (gtk_widget_destroy),
604 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
606 table = gtk_table_new (2, 2, FALSE);
607 gtk_box_pack_start (GTK_BOX (content_area), table, TRUE, TRUE, 0);
609 darea = gtk_drawing_area_new ();
611 hadjustment = gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
612 g_signal_connect (hadjustment, "value_changed",
613 G_CALLBACK (pattern_hadj_changed), darea);
614 g_object_set_data (G_OBJECT (hadjustment), "old-value", ¤t_x);
616 vadjustment = gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
617 g_signal_connect (vadjustment, "value_changed",
618 G_CALLBACK (pattern_vadj_changed), darea);
619 g_object_set_data (G_OBJECT (vadjustment), "old-value", ¤t_y);
621 g_signal_connect (darea, "realize",
622 G_CALLBACK (pattern_realize),
625 eventbox = gtk_event_box_new ();
626 gtk_table_attach (GTK_TABLE (table), eventbox,
628 GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND,
631 gtk_container_add (GTK_CONTAINER (eventbox), darea);
633 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, hadjustment);
634 gtk_table_attach (GTK_TABLE (table), scrollbar,
636 GTK_FILL | GTK_EXPAND, GTK_FILL,
639 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, vadjustment);
640 gtk_table_attach (GTK_TABLE (table), scrollbar,
642 GTK_FILL, GTK_EXPAND | GTK_FILL,
647 if (!gtk_widget_get_visible (window))
648 gtk_widget_show_all (window);
650 gtk_widget_hide (window);
658 button_window (GtkWidget *widget,
661 if (!gtk_widget_get_visible (button))
662 gtk_widget_show (button);
664 gtk_widget_hide (button);
668 create_buttons (GtkWidget *widget)
670 static GtkWidget *window = NULL;
674 GtkWidget *button[10];
675 GtkWidget *separator;
679 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
680 gtk_window_set_screen (GTK_WINDOW (window),
681 gtk_widget_get_screen (widget));
683 g_signal_connect (window, "destroy",
684 G_CALLBACK (gtk_widget_destroyed),
687 gtk_window_set_title (GTK_WINDOW (window), "GtkButton");
688 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
690 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
691 gtk_container_add (GTK_CONTAINER (window), box1);
693 table = gtk_table_new (3, 3, FALSE);
694 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
695 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
696 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
697 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
699 button[0] = gtk_button_new_with_label ("button1");
700 button[1] = gtk_button_new_with_mnemonic ("_button2");
701 button[2] = gtk_button_new_with_mnemonic ("_button3");
702 button[3] = gtk_button_new_from_stock (GTK_STOCK_OK);
703 button[4] = gtk_button_new_with_label ("button5");
704 button[5] = gtk_button_new_with_label ("button6");
705 button[6] = gtk_button_new_with_label ("button7");
706 button[7] = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
707 button[8] = gtk_button_new_with_label ("button9");
709 g_signal_connect (button[0], "clicked",
710 G_CALLBACK (button_window),
713 gtk_table_attach (GTK_TABLE (table), button[0], 0, 1, 0, 1,
714 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
716 g_signal_connect (button[1], "clicked",
717 G_CALLBACK (button_window),
720 gtk_table_attach (GTK_TABLE (table), button[1], 1, 2, 1, 2,
721 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
723 g_signal_connect (button[2], "clicked",
724 G_CALLBACK (button_window),
726 gtk_table_attach (GTK_TABLE (table), button[2], 2, 3, 2, 3,
727 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
729 g_signal_connect (button[3], "clicked",
730 G_CALLBACK (button_window),
732 gtk_table_attach (GTK_TABLE (table), button[3], 0, 1, 2, 3,
733 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
735 g_signal_connect (button[4], "clicked",
736 G_CALLBACK (button_window),
738 gtk_table_attach (GTK_TABLE (table), button[4], 2, 3, 0, 1,
739 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
741 g_signal_connect (button[5], "clicked",
742 G_CALLBACK (button_window),
744 gtk_table_attach (GTK_TABLE (table), button[5], 1, 2, 2, 3,
745 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
747 g_signal_connect (button[6], "clicked",
748 G_CALLBACK (button_window),
750 gtk_table_attach (GTK_TABLE (table), button[6], 1, 2, 0, 1,
751 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
753 g_signal_connect (button[7], "clicked",
754 G_CALLBACK (button_window),
756 gtk_table_attach (GTK_TABLE (table), button[7], 2, 3, 1, 2,
757 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
759 g_signal_connect (button[8], "clicked",
760 G_CALLBACK (button_window),
762 gtk_table_attach (GTK_TABLE (table), button[8], 0, 1, 1, 2,
763 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
765 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
766 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
768 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
769 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
770 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
772 button[9] = gtk_button_new_with_label ("close");
773 g_signal_connect_swapped (button[9], "clicked",
774 G_CALLBACK (gtk_widget_destroy),
776 gtk_box_pack_start (GTK_BOX (box2), button[9], TRUE, TRUE, 0);
777 gtk_widget_set_can_default (button[9], TRUE);
778 gtk_widget_grab_default (button[9]);
781 if (!gtk_widget_get_visible (window))
782 gtk_widget_show_all (window);
784 gtk_widget_destroy (window);
792 create_toggle_buttons (GtkWidget *widget)
794 static GtkWidget *window = NULL;
798 GtkWidget *separator;
802 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
803 gtk_window_set_screen (GTK_WINDOW (window),
804 gtk_widget_get_screen (widget));
806 g_signal_connect (window, "destroy",
807 G_CALLBACK (gtk_widget_destroyed),
810 gtk_window_set_title (GTK_WINDOW (window), "GtkToggleButton");
811 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
813 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
814 gtk_container_add (GTK_CONTAINER (window), box1);
816 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
817 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
818 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
820 button = gtk_toggle_button_new_with_label ("button1");
821 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
823 button = gtk_toggle_button_new_with_label ("button2");
824 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
826 button = gtk_toggle_button_new_with_label ("button3");
827 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
829 button = gtk_toggle_button_new_with_label ("inconsistent");
830 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
831 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
833 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
834 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
836 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
837 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
838 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
840 button = gtk_button_new_with_label ("close");
841 g_signal_connect_swapped (button, "clicked",
842 G_CALLBACK (gtk_widget_destroy),
844 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
845 gtk_widget_set_can_default (button, TRUE);
846 gtk_widget_grab_default (button);
849 if (!gtk_widget_get_visible (window))
850 gtk_widget_show_all (window);
852 gtk_widget_destroy (window);
856 create_widget_grid (GType widget_type)
859 GtkWidget *group_widget = NULL;
862 table = gtk_table_new (FALSE, 3, 3);
864 for (i = 0; i < 5; i++)
866 for (j = 0; j < 5; j++)
871 if (i == 0 && j == 0)
877 tmp = g_strdup_printf ("%d", j);
878 widget = gtk_label_new (tmp);
883 tmp = g_strdup_printf ("%c", 'A' + i - 1);
884 widget = gtk_label_new (tmp);
889 widget = g_object_new (widget_type, NULL);
891 if (g_type_is_a (widget_type, GTK_TYPE_RADIO_BUTTON))
894 group_widget = widget;
896 g_object_set (widget, "group", group_widget, NULL);
901 gtk_table_attach (GTK_TABLE (table), widget,
916 create_check_buttons (GtkWidget *widget)
918 static GtkWidget *window = NULL;
922 GtkWidget *separator;
927 window = gtk_dialog_new_with_buttons ("Check Buttons",
933 gtk_window_set_screen (GTK_WINDOW (window),
934 gtk_widget_get_screen (widget));
936 g_signal_connect (window, "destroy",
937 G_CALLBACK (gtk_widget_destroyed),
939 g_signal_connect (window, "response",
940 G_CALLBACK (gtk_widget_destroy),
943 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
945 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
946 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
947 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
949 button = gtk_check_button_new_with_mnemonic ("_button1");
950 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
952 button = gtk_check_button_new_with_label ("button2");
953 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
955 button = gtk_check_button_new_with_label ("button3");
956 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
958 button = gtk_check_button_new_with_label ("inconsistent");
959 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
960 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
962 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
963 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
965 table = create_widget_grid (GTK_TYPE_CHECK_BUTTON);
966 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
967 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
970 if (!gtk_widget_get_visible (window))
971 gtk_widget_show_all (window);
973 gtk_widget_destroy (window);
981 create_radio_buttons (GtkWidget *widget)
983 static GtkWidget *window = NULL;
987 GtkWidget *separator;
992 window = gtk_dialog_new_with_buttons ("Radio Buttons",
998 gtk_window_set_screen (GTK_WINDOW (window),
999 gtk_widget_get_screen (widget));
1001 g_signal_connect (window, "destroy",
1002 G_CALLBACK (gtk_widget_destroyed),
1004 g_signal_connect (window, "response",
1005 G_CALLBACK (gtk_widget_destroy),
1008 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
1010 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1011 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1012 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1014 button = gtk_radio_button_new_with_label (NULL, "button1");
1015 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1017 button = gtk_radio_button_new_with_label (
1018 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1020 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
1021 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1023 button = gtk_radio_button_new_with_label (
1024 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1026 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1028 button = gtk_radio_button_new_with_label (
1029 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1031 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
1032 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1034 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1035 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1037 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1038 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1039 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1041 button = gtk_radio_button_new_with_label (NULL, "button4");
1042 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1043 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1045 button = gtk_radio_button_new_with_label (
1046 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1048 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
1049 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1050 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1052 button = gtk_radio_button_new_with_label (
1053 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1055 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1056 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1058 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1059 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1061 table = create_widget_grid (GTK_TYPE_RADIO_BUTTON);
1062 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
1063 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
1066 if (!gtk_widget_get_visible (window))
1067 gtk_widget_show_all (window);
1069 gtk_widget_destroy (window);
1077 create_bbox (gint horizontal,
1088 frame = gtk_frame_new (title);
1091 bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
1093 bbox = gtk_button_box_new (GTK_ORIENTATION_VERTICAL);
1095 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
1096 gtk_container_add (GTK_CONTAINER (frame), bbox);
1098 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), layout);
1099 gtk_box_set_spacing (GTK_BOX (bbox), spacing);
1101 button = gtk_button_new_with_label ("OK");
1102 gtk_container_add (GTK_CONTAINER (bbox), button);
1104 button = gtk_button_new_with_label ("Cancel");
1105 gtk_container_add (GTK_CONTAINER (bbox), button);
1107 button = gtk_button_new_with_label ("Help");
1108 gtk_container_add (GTK_CONTAINER (bbox), button);
1114 create_button_box (GtkWidget *widget)
1116 static GtkWidget* window = NULL;
1117 GtkWidget *main_vbox;
1120 GtkWidget *frame_horz;
1121 GtkWidget *frame_vert;
1125 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1126 gtk_window_set_screen (GTK_WINDOW (window), gtk_widget_get_screen (widget));
1127 gtk_window_set_title (GTK_WINDOW (window), "Button Boxes");
1129 g_signal_connect (window, "destroy",
1130 G_CALLBACK (gtk_widget_destroyed),
1133 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
1135 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1136 gtk_container_add (GTK_CONTAINER (window), main_vbox);
1138 frame_horz = gtk_frame_new ("Horizontal Button Boxes");
1139 gtk_box_pack_start (GTK_BOX (main_vbox), frame_horz, TRUE, TRUE, 10);
1141 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1142 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
1143 gtk_container_add (GTK_CONTAINER (frame_horz), vbox);
1145 gtk_box_pack_start (GTK_BOX (vbox),
1146 create_bbox (TRUE, "Spread", 40, 85, 20, GTK_BUTTONBOX_SPREAD),
1149 gtk_box_pack_start (GTK_BOX (vbox),
1150 create_bbox (TRUE, "Edge", 40, 85, 20, GTK_BUTTONBOX_EDGE),
1153 gtk_box_pack_start (GTK_BOX (vbox),
1154 create_bbox (TRUE, "Start", 40, 85, 20, GTK_BUTTONBOX_START),
1157 gtk_box_pack_start (GTK_BOX (vbox),
1158 create_bbox (TRUE, "End", 40, 85, 20, GTK_BUTTONBOX_END),
1161 gtk_box_pack_start (GTK_BOX (vbox),
1162 create_bbox (TRUE, "Center", 40, 85, 20, GTK_BUTTONBOX_CENTER),
1165 frame_vert = gtk_frame_new ("Vertical Button Boxes");
1166 gtk_box_pack_start (GTK_BOX (main_vbox), frame_vert, TRUE, TRUE, 10);
1168 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
1169 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
1170 gtk_container_add (GTK_CONTAINER (frame_vert), hbox);
1172 gtk_box_pack_start (GTK_BOX (hbox),
1173 create_bbox (FALSE, "Spread", 30, 85, 20, GTK_BUTTONBOX_SPREAD),
1176 gtk_box_pack_start (GTK_BOX (hbox),
1177 create_bbox (FALSE, "Edge", 30, 85, 20, GTK_BUTTONBOX_EDGE),
1180 gtk_box_pack_start (GTK_BOX (hbox),
1181 create_bbox (FALSE, "Start", 30, 85, 20, GTK_BUTTONBOX_START),
1184 gtk_box_pack_start (GTK_BOX (hbox),
1185 create_bbox (FALSE, "End", 30, 85, 20, GTK_BUTTONBOX_END),
1188 gtk_box_pack_start (GTK_BOX (hbox),
1189 create_bbox (FALSE, "Center", 30, 85, 20, GTK_BUTTONBOX_CENTER),
1193 if (!gtk_widget_get_visible (window))
1194 gtk_widget_show_all (window);
1196 gtk_widget_destroy (window);
1204 new_pixbuf (char *filename,
1210 if (strcmp (filename, "test.xpm") == 0)
1213 pixbuf = gdk_pixbuf_new_from_file (filename, NULL);
1216 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
1218 widget = gtk_image_new_from_pixbuf (pixbuf);
1220 g_object_unref (pixbuf);
1227 set_toolbar_small_stock (GtkWidget *widget,
1230 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_SMALL_TOOLBAR);
1234 set_toolbar_large_stock (GtkWidget *widget,
1237 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_LARGE_TOOLBAR);
1241 set_toolbar_horizontal (GtkWidget *widget,
1244 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_HORIZONTAL);
1248 set_toolbar_vertical (GtkWidget *widget,
1251 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_VERTICAL);
1255 set_toolbar_icons (GtkWidget *widget,
1258 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_ICONS);
1262 set_toolbar_text (GtkWidget *widget,
1265 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_TEXT);
1269 set_toolbar_both (GtkWidget *widget,
1272 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH);
1276 set_toolbar_both_horiz (GtkWidget *widget,
1279 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH_HORIZ);
1283 set_toolbar_enable (GtkWidget *widget,
1286 GtkSettings *settings = gtk_widget_get_settings (widget);
1287 g_object_set (settings, "gtk-enable-tooltips", TRUE, NULL);
1291 set_toolbar_disable (GtkWidget *widget,
1294 GtkSettings *settings = gtk_widget_get_settings (widget);
1295 g_object_set (settings, "gtk-enable-tooltips", FALSE, NULL);
1298 static GtkActionEntry create_toolbar_items[] = {
1299 { NULL, GTK_STOCK_NEW, NULL, NULL, "Stock icon: New",
1300 G_CALLBACK (set_toolbar_small_stock) },
1301 { NULL, GTK_STOCK_OPEN, NULL, NULL, "Stock icon: Open",
1302 G_CALLBACK (set_toolbar_large_stock) },
1303 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1304 G_CALLBACK (set_toolbar_horizontal) },
1305 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1306 G_CALLBACK (set_toolbar_vertical) },
1308 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1309 G_CALLBACK (set_toolbar_icons) },
1310 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1311 G_CALLBACK (set_toolbar_text) },
1312 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1313 G_CALLBACK (set_toolbar_both) },
1314 { NULL, NULL, "Both (horizontal)", NULL, "Show toolbar icons and text in a horizontal fashion",
1315 G_CALLBACK (set_toolbar_both_horiz) },
1317 { "entry", NULL, NULL, "This is an unusable GtkEntry ;)",
1321 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1322 G_CALLBACK (set_toolbar_enable) },
1323 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1324 G_CALLBACK (set_toolbar_disable) },
1326 { NULL, NULL, "Frobate", NULL, "Frobate tooltip",
1328 { NULL, NULL, "Baz", NULL, "Baz tooltip",
1331 { NULL, NULL, "Blah", NULL, "Blash tooltip",
1333 { NULL, NULL, "Bar", NULL, "Bar tooltip",
1338 create_toolbar (GtkWidget *widget)
1340 static GtkWidget *window = NULL;
1347 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1348 gtk_window_set_screen (GTK_WINDOW (window),
1349 gtk_widget_get_screen (widget));
1351 gtk_window_set_title (GTK_WINDOW (window), "Toolbar test");
1353 g_signal_connect (window, "destroy",
1354 G_CALLBACK (gtk_widget_destroyed),
1357 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1358 gtk_widget_realize (window);
1360 toolbar = gtk_toolbar_new ();
1361 for (i = 0; i < G_N_ELEMENTS (create_toolbar_items); i++)
1363 GtkToolItem *toolitem;
1365 if (create_toolbar_items[i].tooltip == NULL)
1366 toolitem = gtk_separator_tool_item_new ();
1367 else if (g_strcmp0 (create_toolbar_items[i].name, "entry") == 0)
1371 toolitem = gtk_tool_item_new ();
1372 entry = gtk_entry_new ();
1373 gtk_container_add (GTK_CONTAINER (toolitem), entry);
1375 else if (create_toolbar_items[i].stock_id)
1376 toolitem = gtk_tool_button_new_from_stock (create_toolbar_items[i].stock_id);
1381 icon = new_pixbuf ("test.xpm", gtk_widget_get_window (window));
1382 toolitem = gtk_tool_button_new (icon, create_toolbar_items[i].label);
1384 if (create_toolbar_items[i].callback)
1385 g_signal_connect (toolitem, "clicked",
1386 create_toolbar_items[i].callback, toolbar);
1387 gtk_tool_item_set_tooltip_text (toolitem, create_toolbar_items[i].tooltip);
1388 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1391 gtk_container_add (GTK_CONTAINER (window), toolbar);
1393 gtk_widget_set_size_request (toolbar, 200, -1);
1396 if (!gtk_widget_get_visible (window))
1397 gtk_widget_show_all (window);
1399 gtk_widget_destroy (window);
1402 static GtkActionEntry make_toolbar_items[] = {
1403 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1404 G_CALLBACK (set_toolbar_horizontal) },
1405 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1406 G_CALLBACK (set_toolbar_vertical) },
1408 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1409 G_CALLBACK (set_toolbar_icons) },
1410 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1411 G_CALLBACK (set_toolbar_text) },
1412 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1413 G_CALLBACK (set_toolbar_both) },
1415 { NULL, NULL, "Woot", NULL, "Woot woot woot",
1417 { NULL, NULL, "Blah", NULL, "Blah blah blah",
1420 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1421 G_CALLBACK (set_toolbar_enable) },
1422 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1423 G_CALLBACK (set_toolbar_disable) },
1425 { NULL, NULL, "Hoo", NULL, "Hoo tooltip",
1427 { NULL, NULL, "Woo", NULL, "Woo tooltip",
1432 make_toolbar (GtkWidget *window)
1437 if (!gtk_widget_get_realized (window))
1438 gtk_widget_realize (window);
1440 toolbar = gtk_toolbar_new ();
1441 for (i = 0; i < G_N_ELEMENTS (make_toolbar_items); i++)
1444 GtkToolItem *toolitem;
1446 if (make_toolbar_items[i].label == NULL)
1448 toolitem = gtk_separator_tool_item_new ();
1452 icon = new_pixbuf ("test.xpm", gtk_widget_get_window (window));
1453 toolitem = gtk_tool_button_new (icon, make_toolbar_items[i].label);
1454 gtk_tool_item_set_tooltip_text (toolitem, make_toolbar_items[i].tooltip);
1455 if (make_toolbar_items[i].callback != NULL)
1456 g_signal_connect (toolitem, "clicked", make_toolbar_items[i].callback, toolbar);
1458 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1468 static guint statusbar_counter = 1;
1471 statusbar_push (GtkWidget *button,
1472 GtkStatusbar *statusbar)
1476 sprintf (text, "something %d", statusbar_counter++);
1478 gtk_statusbar_push (statusbar, 1, text);
1482 statusbar_push_long (GtkWidget *button,
1483 GtkStatusbar *statusbar)
1487 sprintf (text, "Just because a system has menu choices written with English words, phrases or sentences, that is no guarantee, that it is comprehensible. Individual words may not be familiar to some users (for example, \"repaginate\"), and two menu items may appear to satisfy the users's needs, whereas only one does (for example, \"put away\" or \"eject\").");
1489 gtk_statusbar_push (statusbar, 1, text);
1493 statusbar_pop (GtkWidget *button,
1494 GtkStatusbar *statusbar)
1496 gtk_statusbar_pop (statusbar, 1);
1500 statusbar_steal (GtkWidget *button,
1501 GtkStatusbar *statusbar)
1503 gtk_statusbar_remove (statusbar, 1, 4);
1507 statusbar_popped (GtkStatusbar *statusbar,
1512 statusbar_counter = 1;
1516 statusbar_contexts (GtkStatusbar *statusbar)
1520 string = "any context";
1521 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1523 gtk_statusbar_get_context_id (statusbar, string));
1525 string = "idle messages";
1526 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1528 gtk_statusbar_get_context_id (statusbar, string));
1530 string = "some text";
1531 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1533 gtk_statusbar_get_context_id (statusbar, string));
1535 string = "hit the mouse";
1536 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1538 gtk_statusbar_get_context_id (statusbar, string));
1540 string = "hit the mouse2";
1541 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1543 gtk_statusbar_get_context_id (statusbar, string));
1547 create_statusbar (GtkWidget *widget)
1549 static GtkWidget *window = NULL;
1553 GtkWidget *separator;
1554 GtkWidget *statusbar;
1558 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1559 gtk_window_set_screen (GTK_WINDOW (window),
1560 gtk_widget_get_screen (widget));
1562 g_signal_connect (window, "destroy",
1563 G_CALLBACK (gtk_widget_destroyed),
1566 gtk_window_set_title (GTK_WINDOW (window), "statusbar");
1567 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1569 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1570 gtk_container_add (GTK_CONTAINER (window), box1);
1572 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1573 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1574 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1576 statusbar = gtk_statusbar_new ();
1577 gtk_box_pack_end (GTK_BOX (box1), statusbar, TRUE, TRUE, 0);
1578 g_signal_connect (statusbar,
1580 G_CALLBACK (statusbar_popped),
1583 button = g_object_new (gtk_button_get_type (),
1584 "label", "push something",
1588 g_object_connect (button,
1589 "signal::clicked", statusbar_push, statusbar,
1592 button = g_object_connect (g_object_new (gtk_button_get_type (),
1597 "signal_after::clicked", statusbar_pop, statusbar,
1600 button = g_object_connect (g_object_new (gtk_button_get_type (),
1601 "label", "steal #4",
1605 "signal_after::clicked", statusbar_steal, statusbar,
1608 button = g_object_connect (g_object_new (gtk_button_get_type (),
1609 "label", "test contexts",
1613 "swapped_signal_after::clicked", statusbar_contexts, statusbar,
1616 button = g_object_connect (g_object_new (gtk_button_get_type (),
1617 "label", "push something long",
1621 "signal_after::clicked", statusbar_push_long, statusbar,
1624 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1625 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1627 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1628 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1629 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
1631 button = gtk_button_new_with_label ("close");
1632 g_signal_connect_swapped (button, "clicked",
1633 G_CALLBACK (gtk_widget_destroy),
1635 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1636 gtk_widget_set_can_default (button, TRUE);
1637 gtk_widget_grab_default (button);
1640 if (!gtk_widget_get_visible (window))
1641 gtk_widget_show_all (window);
1643 gtk_widget_destroy (window);
1651 handle_box_child_signal (GtkHandleBox *hb,
1653 const gchar *action)
1655 printf ("%s: child <%s> %sed\n",
1656 g_type_name (G_OBJECT_TYPE (hb)),
1657 g_type_name (G_OBJECT_TYPE (child)),
1662 create_handle_box (GtkWidget *widget)
1664 static GtkWidget* window = NULL;
1665 GtkWidget *handle_box;
1666 GtkWidget *handle_box2;
1671 GtkWidget *separator;
1675 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1677 gtk_window_set_screen (GTK_WINDOW (window),
1678 gtk_widget_get_screen (widget));
1679 gtk_window_set_modal (GTK_WINDOW (window), FALSE);
1680 gtk_window_set_title (GTK_WINDOW (window),
1682 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
1684 g_signal_connect (window, "destroy",
1685 G_CALLBACK (gtk_widget_destroyed),
1688 gtk_container_set_border_width (GTK_CONTAINER (window), 20);
1690 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1691 gtk_container_add (GTK_CONTAINER (window), vbox);
1692 gtk_widget_show (vbox);
1694 label = gtk_label_new ("Above");
1695 gtk_container_add (GTK_CONTAINER (vbox), label);
1696 gtk_widget_show (label);
1698 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1699 gtk_container_add (GTK_CONTAINER (vbox), separator);
1700 gtk_widget_show (separator);
1702 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
1703 gtk_container_add (GTK_CONTAINER (vbox), hbox);
1704 gtk_widget_show (hbox);
1706 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1707 gtk_container_add (GTK_CONTAINER (vbox), separator);
1708 gtk_widget_show (separator);
1710 label = gtk_label_new ("Below");
1711 gtk_container_add (GTK_CONTAINER (vbox), label);
1712 gtk_widget_show (label);
1714 handle_box = gtk_handle_box_new ();
1715 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1716 g_signal_connect (handle_box,
1718 G_CALLBACK (handle_box_child_signal),
1720 g_signal_connect (handle_box,
1722 G_CALLBACK (handle_box_child_signal),
1724 gtk_widget_show (handle_box);
1726 toolbar = make_toolbar (window);
1728 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
1729 gtk_widget_show (toolbar);
1731 handle_box = gtk_handle_box_new ();
1732 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1733 g_signal_connect (handle_box,
1735 G_CALLBACK (handle_box_child_signal),
1737 g_signal_connect (handle_box,
1739 G_CALLBACK (handle_box_child_signal),
1741 gtk_widget_show (handle_box);
1743 handle_box2 = gtk_handle_box_new ();
1744 gtk_container_add (GTK_CONTAINER (handle_box), handle_box2);
1745 g_signal_connect (handle_box2,
1747 G_CALLBACK (handle_box_child_signal),
1749 g_signal_connect (handle_box2,
1751 G_CALLBACK (handle_box_child_signal),
1753 gtk_widget_show (handle_box2);
1755 hbox = g_object_new (GTK_TYPE_BOX, "visible", 1, "parent", handle_box2, NULL);
1756 label = gtk_label_new ("Fooo!");
1757 gtk_container_add (GTK_CONTAINER (hbox), label);
1758 gtk_widget_show (label);
1759 g_object_new (GTK_TYPE_ARROW, "visible", 1, "parent", hbox, NULL);
1762 if (!gtk_widget_get_visible (window))
1763 gtk_widget_show (window);
1765 gtk_widget_destroy (window);
1772 sensitivity_toggled (GtkWidget *toggle,
1775 gtk_widget_set_sensitive (widget,
1776 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle)));
1780 create_sensitivity_control (GtkWidget *widget)
1784 button = gtk_toggle_button_new_with_label ("Sensitive");
1786 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
1787 gtk_widget_is_sensitive (widget));
1789 g_signal_connect (button,
1791 G_CALLBACK (sensitivity_toggled),
1794 gtk_widget_show_all (button);
1800 set_selectable_recursive (GtkWidget *widget,
1803 if (GTK_IS_CONTAINER (widget))
1808 children = gtk_container_get_children (GTK_CONTAINER (widget));
1812 set_selectable_recursive (tmp->data, setting);
1816 g_list_free (children);
1818 else if (GTK_IS_LABEL (widget))
1820 gtk_label_set_selectable (GTK_LABEL (widget), setting);
1825 selectable_toggled (GtkWidget *toggle,
1828 set_selectable_recursive (widget,
1829 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle)));
1833 create_selectable_control (GtkWidget *widget)
1837 button = gtk_toggle_button_new_with_label ("Selectable");
1839 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
1842 g_signal_connect (button,
1844 G_CALLBACK (selectable_toggled),
1847 gtk_widget_show_all (button);
1853 dialog_response (GtkWidget *dialog, gint response_id, GtkLabel *label)
1857 gtk_widget_destroy (dialog);
1859 text = "Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
1860 "as hyperlinks, which can be clicked\n"
1861 "or activated via <a href=\"keynav\">keynav</a>.\n"
1862 "The links remain the same.";
1863 gtk_label_set_markup (label, text);
1867 activate_link (GtkWidget *label, const gchar *uri, gpointer data)
1869 if (g_strcmp0 (uri, "keynav") == 0)
1873 dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (gtk_widget_get_toplevel (label)),
1874 GTK_DIALOG_DESTROY_WITH_PARENT,
1877 "The term <i>keynav</i> is a shorthand for "
1878 "keyboard navigation and refers to the process of using a program "
1879 "(exclusively) via keyboard input.");
1881 gtk_window_present (GTK_WINDOW (dialog));
1883 g_signal_connect (dialog, "response", G_CALLBACK (dialog_response), label);
1891 void create_labels (GtkWidget *widget)
1893 static GtkWidget *window = NULL;
1902 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1904 gtk_window_set_screen (GTK_WINDOW (window),
1905 gtk_widget_get_screen (widget));
1907 g_signal_connect (window, "destroy",
1908 G_CALLBACK (gtk_widget_destroyed),
1911 gtk_window_set_title (GTK_WINDOW (window), "Label");
1913 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1915 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
1916 gtk_container_add (GTK_CONTAINER (window), vbox);
1918 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
1920 button = create_sensitivity_control (hbox);
1922 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
1924 button = create_selectable_control (hbox);
1926 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
1928 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1930 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
1931 gtk_container_set_border_width (GTK_CONTAINER (window), 5);
1933 frame = gtk_frame_new ("Normal Label");
1934 label = gtk_label_new ("This is a Normal label");
1935 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
1936 gtk_container_add (GTK_CONTAINER (frame), label);
1937 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1939 frame = gtk_frame_new ("Multi-line Label");
1940 label = gtk_label_new ("This is a Multi-line label.\nSecond line\nThird line");
1941 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
1942 gtk_container_add (GTK_CONTAINER (frame), label);
1943 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1945 frame = gtk_frame_new ("Left Justified Label");
1946 label = gtk_label_new ("This is a Left-Justified\nMulti-line label.\nThird line");
1947 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_MIDDLE);
1948 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1949 gtk_container_add (GTK_CONTAINER (frame), label);
1950 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1952 frame = gtk_frame_new ("Right Justified Label");
1953 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
1954 label = gtk_label_new ("This is a Right-Justified\nMulti-line label.\nFourth line, (j/k)");
1955 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1956 gtk_container_add (GTK_CONTAINER (frame), label);
1957 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1959 frame = gtk_frame_new ("Internationalized Label");
1960 label = gtk_label_new (NULL);
1961 gtk_label_set_markup (GTK_LABEL (label),
1962 "French (Fran\303\247ais) Bonjour, Salut\n"
1963 "Korean (\355\225\234\352\270\200) \354\225\210\353\205\225\355\225\230\354\204\270\354\232\224, \354\225\210\353\205\225\355\225\230\354\213\255\353\213\210\352\271\214\n"
1964 "Russian (\320\240\321\203\321\201\321\201\320\272\320\270\320\271) \320\227\320\264\321\200\320\260\320\262\321\201\321\202\320\262\321\203\320\271\321\202\320\265!\n"
1965 "Chinese (Simplified) <span lang=\"zh-cn\">\345\205\203\346\260\224 \345\274\200\345\217\221</span>\n"
1966 "Chinese (Traditional) <span lang=\"zh-tw\">\345\205\203\346\260\243 \351\226\213\347\231\274</span>\n"
1967 "Japanese <span lang=\"ja\">\345\205\203\346\260\227 \351\226\213\347\231\272</span>");
1968 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1969 gtk_container_add (GTK_CONTAINER (frame), label);
1970 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1972 frame = gtk_frame_new ("Bidirection Label");
1973 label = gtk_label_new ("\342\200\217Arabic \330\247\331\204\330\263\331\204\330\247\331\205 \330\271\331\204\331\212\331\203\331\205\n"
1974 "\342\200\217Hebrew \327\251\327\234\327\225\327\235");
1975 gtk_container_add (GTK_CONTAINER (frame), label);
1976 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1978 frame = gtk_frame_new ("Links in a label");
1979 label = gtk_label_new ("Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
1980 "as hyperlinks, which can be clicked\n"
1981 "or activated via <a href=\"keynav\">keynav</a>");
1982 gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
1983 gtk_container_add (GTK_CONTAINER (frame), label);
1984 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1985 g_signal_connect (label, "activate-link", G_CALLBACK (activate_link), NULL);
1987 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1988 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
1989 frame = gtk_frame_new ("Line wrapped label");
1990 label = gtk_label_new ("This is an example of a line-wrapped label. It should not be taking "\
1991 "up the entire "/* big space to test spacing */\
1992 "width allocated to it, but automatically wraps the words to fit. "\
1993 "The time has come, for all good men, to come to the aid of their party. "\
1994 "The sixth sheik's six sheep's sick.\n"\
1995 " It supports multiple paragraphs correctly, and correctly adds "\
1996 "many extra spaces. ");
1998 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
1999 gtk_container_add (GTK_CONTAINER (frame), label);
2000 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2002 frame = gtk_frame_new ("Filled, wrapped label");
2003 label = gtk_label_new ("This is an example of a line-wrapped, filled label. It should be taking "\
2004 "up the entire width allocated to it. Here is a seneance to prove "\
2005 "my point. Here is another sentence. "\
2006 "Here comes the sun, do de do de do.\n"\
2007 " This is a new paragraph.\n"\
2008 " This is another newer, longer, better paragraph. It is coming to an end, "\
2010 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_FILL);
2011 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2012 gtk_container_add (GTK_CONTAINER (frame), label);
2013 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2015 frame = gtk_frame_new ("Underlined label");
2016 label = gtk_label_new ("This label is underlined!\n"
2017 "This one is underlined (\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257) in quite a funky fashion");
2018 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2019 gtk_label_set_pattern (GTK_LABEL (label), "_________________________ _ _________ _ _____ _ __ __ ___ ____ _____");
2020 gtk_container_add (GTK_CONTAINER (frame), label);
2021 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2023 frame = gtk_frame_new ("Markup label");
2024 label = gtk_label_new (NULL);
2026 /* There's also a gtk_label_set_markup() without accel if you
2027 * don't have an accelerator key
2029 gtk_label_set_markup_with_mnemonic (GTK_LABEL (label),
2030 "This <span foreground=\"blue\" background=\"orange\">label</span> has "
2031 "<b>markup</b> _such as "
2032 "<big><i>Big Italics</i></big>\n"
2033 "<tt>Monospace font</tt>\n"
2034 "<u>Underline!</u>\n"
2036 "<span foreground=\"green\" background=\"red\">Ugly colors</span>\n"
2037 "and nothing on this line,\n"
2040 "or even on this one\n"
2041 "la <big>la <big>la <big>la <big>la</big></big></big></big>\n"
2042 "but this _word is <span foreground=\"purple\"><big>purple</big></span>\n"
2043 "<span underline=\"double\">We like <sup>superscript</sup> and <sub>subscript</sub> too</span>");
2045 g_assert (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)) == GDK_KEY_s);
2047 gtk_container_add (GTK_CONTAINER (frame), label);
2048 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2051 if (!gtk_widget_get_visible (window))
2052 gtk_widget_show_all (window);
2054 gtk_widget_destroy (window);
2058 on_angle_scale_changed (GtkRange *range,
2061 gtk_label_set_angle (GTK_LABEL (label), gtk_range_get_value (range));
2065 create_rotated_label (GtkWidget *widget)
2067 static GtkWidget *window = NULL;
2068 GtkWidget *content_area;
2072 GtkWidget *scale_label;
2073 GtkWidget *scale_hbox;
2077 window = gtk_dialog_new_with_buttons ("Rotated Label",
2078 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2079 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2082 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2084 gtk_window_set_screen (GTK_WINDOW (window),
2085 gtk_widget_get_screen (widget));
2087 g_signal_connect (window, "response",
2088 G_CALLBACK (gtk_widget_destroy), NULL);
2089 g_signal_connect (window, "destroy",
2090 G_CALLBACK (gtk_widget_destroyed), &window);
2092 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2094 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2095 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
2096 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
2098 label = gtk_label_new (NULL);
2099 gtk_label_set_markup (GTK_LABEL (label), "Hello World\n<i>Rotate</i> <span underline='single' foreground='blue'>me</span>");
2100 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
2102 scale_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2103 gtk_box_pack_start (GTK_BOX (vbox), scale_hbox, FALSE, FALSE, 0);
2105 scale_label = gtk_label_new (NULL);
2106 gtk_label_set_markup (GTK_LABEL (scale_label), "<i>Angle: </i>");
2107 gtk_box_pack_start (GTK_BOX (scale_hbox), scale_label, FALSE, FALSE, 0);
2109 hscale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL,
2111 g_signal_connect (hscale, "value-changed",
2112 G_CALLBACK (on_angle_scale_changed), label);
2114 gtk_range_set_value (GTK_RANGE (hscale), 45);
2115 gtk_widget_set_size_request (hscale, 200, -1);
2116 gtk_box_pack_start (GTK_BOX (scale_hbox), hscale, TRUE, TRUE, 0);
2119 if (!gtk_widget_get_visible (window))
2120 gtk_widget_show_all (window);
2122 gtk_widget_destroy (window);
2125 #define DEFAULT_TEXT_RADIUS 200
2128 on_rotated_text_unrealize (GtkWidget *widget)
2130 g_object_set_data (G_OBJECT (widget), "text-gc", NULL);
2134 on_rotated_text_draw (GtkWidget *widget,
2136 GdkPixbuf *tile_pixbuf)
2138 static const gchar *words[] = { "The", "grand", "old", "Duke", "of", "York",
2139 "had", "10,000", "men" };
2144 PangoLayout *layout;
2145 PangoContext *context;
2146 PangoFontDescription *desc;
2150 gdk_cairo_set_source_pixbuf (cr, tile_pixbuf, 0, 0);
2151 cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT);
2154 cairo_set_source_rgb (cr, 0, 0, 0);
2156 width = gtk_widget_get_allocated_width (widget);
2157 height = gtk_widget_get_allocated_height (widget);
2158 radius = MIN (width, height) / 2.;
2160 cairo_translate (cr,
2161 radius + (width - 2 * radius) / 2,
2162 radius + (height - 2 * radius) / 2);
2163 cairo_scale (cr, radius / DEFAULT_TEXT_RADIUS, radius / DEFAULT_TEXT_RADIUS);
2165 context = gtk_widget_get_pango_context (widget);
2166 layout = pango_layout_new (context);
2167 desc = pango_font_description_from_string ("Sans Bold 30");
2168 pango_layout_set_font_description (layout, desc);
2169 pango_font_description_free (desc);
2171 n_words = G_N_ELEMENTS (words);
2172 for (i = 0; i < n_words; i++)
2178 cairo_rotate (cr, 2 * G_PI * i / n_words);
2179 pango_cairo_update_layout (cr, layout);
2181 pango_layout_set_text (layout, words[i], -1);
2182 pango_layout_get_size (layout, &width, &height);
2184 cairo_move_to (cr, - width / 2 / PANGO_SCALE, - DEFAULT_TEXT_RADIUS);
2185 pango_cairo_show_layout (cr, layout);
2190 g_object_unref (layout);
2196 create_rotated_text (GtkWidget *widget)
2198 static GtkWidget *window = NULL;
2202 const GdkRGBA white = { 1.0, 1.0, 1.0, 1.0 };
2203 GtkRequisition requisition;
2204 GtkWidget *content_area;
2205 GtkWidget *drawing_area;
2206 GdkPixbuf *tile_pixbuf;
2208 window = gtk_dialog_new_with_buttons ("Rotated Text",
2209 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2210 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2213 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2215 gtk_window_set_screen (GTK_WINDOW (window),
2216 gtk_widget_get_screen (widget));
2218 g_signal_connect (window, "response",
2219 G_CALLBACK (gtk_widget_destroy), NULL);
2220 g_signal_connect (window, "destroy",
2221 G_CALLBACK (gtk_widget_destroyed), &window);
2223 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2225 drawing_area = gtk_drawing_area_new ();
2226 gtk_box_pack_start (GTK_BOX (content_area), drawing_area, TRUE, TRUE, 0);
2227 gtk_widget_override_background_color (drawing_area, 0, &white);
2229 tile_pixbuf = gdk_pixbuf_new_from_file ("marble.xpm", NULL);
2231 g_signal_connect (drawing_area, "draw",
2232 G_CALLBACK (on_rotated_text_draw), tile_pixbuf);
2233 g_signal_connect (drawing_area, "unrealize",
2234 G_CALLBACK (on_rotated_text_unrealize), NULL);
2236 gtk_widget_show_all (gtk_bin_get_child (GTK_BIN (window)));
2238 gtk_widget_set_size_request (drawing_area, DEFAULT_TEXT_RADIUS * 2, DEFAULT_TEXT_RADIUS * 2);
2239 gtk_widget_get_preferred_size ( (window),
2240 &requisition, NULL);
2241 gtk_widget_set_size_request (drawing_area, -1, -1);
2242 gtk_window_resize (GTK_WINDOW (window), requisition.width, requisition.height);
2245 if (!gtk_widget_get_visible (window))
2246 gtk_widget_show (window);
2248 gtk_widget_destroy (window);
2256 reparent_label (GtkWidget *widget,
2257 GtkWidget *new_parent)
2261 label = g_object_get_data (G_OBJECT (widget), "user_data");
2263 gtk_widget_reparent (label, new_parent);
2267 set_parent_signal (GtkWidget *child,
2268 GtkWidget *old_parent,
2273 parent = gtk_widget_get_parent (child);
2274 g_message ("set_parent for \"%s\": new parent: \"%s\", old parent: \"%s\", data: %d\n",
2275 g_type_name (G_OBJECT_TYPE (child)),
2276 parent ? g_type_name (G_OBJECT_TYPE (parent)) : "NULL",
2277 old_parent ? g_type_name (G_OBJECT_TYPE (old_parent)) : "NULL",
2278 GPOINTER_TO_INT (func_data));
2282 create_reparent (GtkWidget *widget)
2284 static GtkWidget *window = NULL;
2291 GtkWidget *separator;
2292 GtkWidget *event_box;
2296 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2298 gtk_window_set_screen (GTK_WINDOW (window),
2299 gtk_widget_get_screen (widget));
2301 g_signal_connect (window, "destroy",
2302 G_CALLBACK (gtk_widget_destroyed),
2305 gtk_window_set_title (GTK_WINDOW (window), "reparent");
2306 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2308 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2309 gtk_container_add (GTK_CONTAINER (window), box1);
2311 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
2312 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2313 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2315 label = gtk_label_new ("Hello World");
2317 frame = gtk_frame_new ("Frame 1");
2318 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2320 box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2321 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2322 gtk_container_add (GTK_CONTAINER (frame), box3);
2324 button = gtk_button_new_with_label ("switch");
2325 g_object_set_data (G_OBJECT (button), "user_data", label);
2326 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2328 event_box = gtk_event_box_new ();
2329 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2330 gtk_container_add (GTK_CONTAINER (event_box), label);
2332 g_signal_connect (button, "clicked",
2333 G_CALLBACK (reparent_label),
2336 g_signal_connect (label, "parent_set",
2337 G_CALLBACK (set_parent_signal),
2338 GINT_TO_POINTER (42));
2340 frame = gtk_frame_new ("Frame 2");
2341 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2343 box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2344 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2345 gtk_container_add (GTK_CONTAINER (frame), box3);
2347 button = gtk_button_new_with_label ("switch");
2348 g_object_set_data (G_OBJECT (button), "user_data", label);
2349 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2351 event_box = gtk_event_box_new ();
2352 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2354 g_signal_connect (button, "clicked",
2355 G_CALLBACK (reparent_label),
2358 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2359 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2361 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2362 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2363 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2365 button = gtk_button_new_with_label ("close");
2366 g_signal_connect_swapped (button, "clicked",
2367 G_CALLBACK (gtk_widget_destroy), window);
2368 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2369 gtk_widget_set_can_default (button, TRUE);
2370 gtk_widget_grab_default (button);
2373 if (!gtk_widget_get_visible (window))
2374 gtk_widget_show_all (window);
2376 gtk_widget_destroy (window);
2383 grippy_button_press (GtkWidget *area, GdkEventButton *event, GdkWindowEdge edge)
2385 if (event->type == GDK_BUTTON_PRESS)
2387 if (event->button == 1)
2388 gtk_window_begin_resize_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)), edge,
2389 event->button, event->x_root, event->y_root,
2391 else if (event->button == 2)
2392 gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)),
2393 event->button, event->x_root, event->y_root,
2400 grippy_draw (GtkWidget *area, cairo_t *cr, GdkWindowEdge edge)
2402 GtkStyleContext *context;
2403 GtkJunctionSides sides;
2407 case GDK_WINDOW_EDGE_NORTH_WEST:
2408 sides = GTK_JUNCTION_CORNER_TOPLEFT;
2410 case GDK_WINDOW_EDGE_NORTH:
2411 sides = GTK_JUNCTION_TOP;
2413 case GDK_WINDOW_EDGE_NORTH_EAST:
2414 sides = GTK_JUNCTION_CORNER_TOPRIGHT;
2416 case GDK_WINDOW_EDGE_WEST:
2417 sides = GTK_JUNCTION_LEFT;
2419 case GDK_WINDOW_EDGE_EAST:
2420 sides = GTK_JUNCTION_RIGHT;
2422 case GDK_WINDOW_EDGE_SOUTH_WEST:
2423 sides = GTK_JUNCTION_CORNER_BOTTOMLEFT;
2425 case GDK_WINDOW_EDGE_SOUTH:
2426 sides = GTK_JUNCTION_BOTTOM;
2428 case GDK_WINDOW_EDGE_SOUTH_EAST:
2429 sides = GTK_JUNCTION_CORNER_BOTTOMRIGHT;
2432 g_assert_not_reached();
2435 context = gtk_widget_get_style_context (area);
2436 gtk_style_context_save (context);
2437 gtk_style_context_add_class (context, "grip");
2438 gtk_style_context_set_junction_sides (context, sides);
2439 gtk_render_handle (context, cr,
2441 gtk_widget_get_allocated_width (area),
2442 gtk_widget_get_allocated_height (area));
2444 gtk_style_context_restore (context);
2450 create_resize_grips (GtkWidget *widget)
2452 static GtkWidget *window = NULL;
2454 GtkWidget *hbox, *vbox;
2457 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2459 gtk_window_set_screen (GTK_WINDOW (window),
2460 gtk_widget_get_screen (widget));
2462 gtk_window_set_title (GTK_WINDOW (window), "resize grips");
2464 g_signal_connect (window, "destroy",
2465 G_CALLBACK (gtk_widget_destroyed),
2468 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2469 gtk_container_add (GTK_CONTAINER (window), vbox);
2471 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2472 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2475 area = gtk_drawing_area_new ();
2476 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2477 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2478 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2479 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2480 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2481 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2484 area = gtk_drawing_area_new ();
2485 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2486 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2487 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2488 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2489 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2490 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2493 area = gtk_drawing_area_new ();
2494 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2495 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2496 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2497 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2498 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2499 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2501 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2502 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2505 area = gtk_drawing_area_new ();
2506 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2507 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2508 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2509 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2510 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2511 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2514 area = gtk_drawing_area_new ();
2515 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2518 area = gtk_drawing_area_new ();
2519 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2520 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2521 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2522 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2523 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2524 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2527 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2528 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2531 area = gtk_drawing_area_new ();
2532 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2533 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2534 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2535 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2536 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2537 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2539 area = gtk_drawing_area_new ();
2540 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2541 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2542 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2543 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2544 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2545 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2548 area = gtk_drawing_area_new ();
2549 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2550 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2551 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2552 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2553 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2554 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2557 if (!gtk_widget_get_visible (window))
2558 gtk_widget_show_all (window);
2560 gtk_widget_destroy (window);
2566 gint upositionx = 0;
2567 gint upositiony = 0;
2570 uposition_configure (GtkWidget *window)
2576 lx = g_object_get_data (G_OBJECT (window), "x");
2577 ly = g_object_get_data (G_OBJECT (window), "y");
2579 gdk_window_get_root_origin (gtk_widget_get_window (window),
2580 &upositionx, &upositiony);
2581 sprintf (buffer, "%d", upositionx);
2582 gtk_label_set_text (lx, buffer);
2583 sprintf (buffer, "%d", upositiony);
2584 gtk_label_set_text (ly, buffer);
2590 uposition_stop_configure (GtkToggleButton *toggle,
2593 if (gtk_toggle_button_get_active (toggle))
2594 g_signal_handlers_block_by_func (window, G_CALLBACK (uposition_configure), NULL);
2596 g_signal_handlers_unblock_by_func (window, G_CALLBACK (uposition_configure), NULL);
2600 create_saved_position (GtkWidget *widget)
2602 static GtkWidget *window = NULL;
2607 GtkWidget *main_vbox;
2615 window = g_object_connect (g_object_new (GTK_TYPE_WINDOW,
2616 "type", GTK_WINDOW_TOPLEVEL,
2617 "title", "Saved Position",
2619 "signal::configure_event", uposition_configure, NULL,
2622 gtk_window_move (GTK_WINDOW (window), upositionx, upositiony);
2624 gtk_window_set_screen (GTK_WINDOW (window),
2625 gtk_widget_get_screen (widget));
2628 g_signal_connect (window, "destroy",
2629 G_CALLBACK (gtk_widget_destroyed),
2632 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2633 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
2634 gtk_container_add (GTK_CONTAINER (window), main_vbox);
2637 g_object_new (GTK_TYPE_BOX,
2638 "orientation", GTK_ORIENTATION_VERTICAL,
2639 "GtkBox::homogeneous", FALSE,
2640 "GtkBox::spacing", 5,
2641 "GtkContainer::border_width", 10,
2642 "GtkWidget::parent", main_vbox,
2643 "GtkWidget::visible", TRUE,
2644 "child", g_object_connect (g_object_new (GTK_TYPE_TOGGLE_BUTTON,
2645 "label", "Stop Events",
2649 "signal::clicked", uposition_stop_configure, window,
2653 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2654 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2655 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2657 label = gtk_label_new ("X Origin : ");
2658 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2659 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
2661 x_label = gtk_label_new ("");
2662 gtk_box_pack_start (GTK_BOX (hbox), x_label, TRUE, TRUE, 0);
2663 g_object_set_data (G_OBJECT (window), "x", x_label);
2665 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2666 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2667 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2669 label = gtk_label_new ("Y Origin : ");
2670 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2671 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
2673 y_label = gtk_label_new ("");
2674 gtk_box_pack_start (GTK_BOX (hbox), y_label, TRUE, TRUE, 0);
2675 g_object_set_data (G_OBJECT (window), "y", y_label);
2678 g_object_new (gtk_separator_get_type (),
2679 "GtkWidget::visible", TRUE,
2681 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
2683 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2684 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
2685 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
2687 button = gtk_button_new_with_label ("Close");
2688 g_signal_connect_swapped (button, "clicked",
2689 G_CALLBACK (gtk_widget_destroy),
2691 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
2692 gtk_widget_set_can_default (button, TRUE);
2693 gtk_widget_grab_default (button);
2695 gtk_widget_show_all (window);
2698 gtk_widget_destroy (window);
2706 create_pixbuf (GtkWidget *widget)
2708 static GtkWidget *window = NULL;
2714 GtkWidget *separator;
2715 GtkWidget *pixbufwid;
2716 GdkWindow *gdk_window;
2720 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2722 gtk_window_set_screen (GTK_WINDOW (window),
2723 gtk_widget_get_screen (widget));
2725 g_signal_connect (window, "destroy",
2726 G_CALLBACK (gtk_widget_destroyed),
2729 gtk_window_set_title (GTK_WINDOW (window), "GtkPixmap");
2730 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2731 gtk_widget_realize(window);
2733 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2734 gtk_container_add (GTK_CONTAINER (window), box1);
2736 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2737 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2738 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2740 button = gtk_button_new ();
2741 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
2743 gdk_window = gtk_widget_get_window (window);
2745 pixbufwid = new_pixbuf ("test.xpm", gdk_window);
2747 label = gtk_label_new ("Pixbuf\ntest");
2748 box3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2749 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
2750 gtk_container_add (GTK_CONTAINER (box3), pixbufwid);
2751 gtk_container_add (GTK_CONTAINER (box3), label);
2752 gtk_container_add (GTK_CONTAINER (button), box3);
2754 button = gtk_button_new ();
2755 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
2757 pixbufwid = new_pixbuf ("test.xpm", gdk_window);
2759 label = gtk_label_new ("Pixbuf\ntest");
2760 box3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2761 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
2762 gtk_container_add (GTK_CONTAINER (box3), pixbufwid);
2763 gtk_container_add (GTK_CONTAINER (box3), label);
2764 gtk_container_add (GTK_CONTAINER (button), box3);
2766 gtk_widget_set_sensitive (button, FALSE);
2768 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2769 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2771 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2772 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2773 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2775 button = gtk_button_new_with_label ("close");
2776 g_signal_connect_swapped (button, "clicked",
2777 G_CALLBACK (gtk_widget_destroy),
2779 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2780 gtk_widget_set_can_default (button, TRUE);
2781 gtk_widget_grab_default (button);
2784 if (!gtk_widget_get_visible (window))
2785 gtk_widget_show_all (window);
2787 gtk_widget_destroy (window);
2791 create_tooltips (GtkWidget *widget)
2793 static GtkWidget *window = NULL;
2800 GtkWidget *separator;
2805 g_object_new (gtk_window_get_type (),
2806 "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
2807 "GtkContainer::border_width", 0,
2808 "GtkWindow::title", "Tooltips",
2809 "GtkWindow::resizable", FALSE,
2812 gtk_window_set_screen (GTK_WINDOW (window),
2813 gtk_widget_get_screen (widget));
2815 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2816 gtk_container_add (GTK_CONTAINER (window), box1);
2818 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2819 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2820 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2822 button = gtk_toggle_button_new_with_label ("button1");
2823 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2825 gtk_widget_set_tooltip_text (button, "This is button 1");
2827 button = gtk_toggle_button_new_with_label ("button2");
2828 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2830 gtk_widget_set_tooltip_text (button,
2831 "This is button 2. This is also a really long tooltip which probably "
2832 "won't fit on a single line and will therefore need to be wrapped. "
2833 "Hopefully the wrapping will work correctly.");
2835 toggle = gtk_toggle_button_new_with_label ("Override TipsQuery Label");
2836 gtk_box_pack_start (GTK_BOX (box2), toggle, TRUE, TRUE, 0);
2838 gtk_widget_set_tooltip_text (toggle, "Toggle TipsQuery view.");
2841 g_object_new (GTK_TYPE_BOX,
2842 "orientation", GTK_ORIENTATION_VERTICAL,
2843 "homogeneous", FALSE,
2850 g_object_new (gtk_button_get_type (),
2855 gtk_box_set_child_packing (GTK_BOX (box3), button, FALSE, FALSE, 0, GTK_PACK_START);
2856 gtk_widget_set_tooltip_text (button, "Start the Tooltips Inspector");
2858 frame = g_object_new (gtk_frame_get_type (),
2859 "label", "ToolTips Inspector",
2860 "label_xalign", (double) 0.5,
2866 gtk_box_set_child_packing (GTK_BOX (box2), frame, TRUE, TRUE, 10, GTK_PACK_START);
2868 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2869 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2871 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2872 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2873 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2875 button = gtk_button_new_with_label ("close");
2876 g_signal_connect_swapped (button, "clicked",
2877 G_CALLBACK (gtk_widget_destroy),
2879 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2880 gtk_widget_set_can_default (button, TRUE);
2881 gtk_widget_grab_default (button);
2883 gtk_widget_set_tooltip_text (button, "Push this button to close window");
2886 if (!gtk_widget_get_visible (window))
2887 gtk_widget_show_all (window);
2889 gtk_widget_destroy (window);
2897 pack_image (GtkWidget *box,
2901 gtk_box_pack_start (GTK_BOX (box),
2902 gtk_label_new (text),
2905 gtk_box_pack_start (GTK_BOX (box),
2911 create_image (GtkWidget *widget)
2913 static GtkWidget *window = NULL;
2920 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2922 gtk_window_set_screen (GTK_WINDOW (window),
2923 gtk_widget_get_screen (widget));
2925 /* this is bogus for testing drawing when allocation < request,
2926 * don't copy into real code
2928 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2930 g_signal_connect (window, "destroy",
2931 G_CALLBACK (gtk_widget_destroyed),
2934 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2936 gtk_container_add (GTK_CONTAINER (window), vbox);
2938 pack_image (vbox, "Stock Warning Dialog",
2939 gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
2940 GTK_ICON_SIZE_DIALOG));
2942 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
2944 pack_image (vbox, "Pixbuf",
2945 gtk_image_new_from_pixbuf (pixbuf));
2947 g_object_unref (pixbuf);
2950 if (!gtk_widget_get_visible (window))
2951 gtk_widget_show_all (window);
2953 gtk_widget_destroy (window);
2961 create_menu (GdkScreen *screen, gint depth, gint length, gboolean tearoff)
2964 GtkWidget *menuitem;
2973 menu = gtk_menu_new ();
2974 gtk_menu_set_screen (GTK_MENU (menu), screen);
2980 menuitem = gtk_tearoff_menu_item_new ();
2981 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2982 gtk_widget_show (menuitem);
2985 image = gtk_image_new_from_stock (GTK_STOCK_OPEN,
2986 GTK_ICON_SIZE_MENU);
2987 gtk_widget_show (image);
2988 menuitem = gtk_image_menu_item_new_with_label ("Image item");
2989 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
2990 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2991 gtk_widget_show (menuitem);
2993 for (i = 0, j = 1; i < length; i++, j++)
2995 sprintf (buf, "item %2d - %d", depth, j);
2997 menuitem = gtk_radio_menu_item_new_with_label (group, buf);
2998 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
3000 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3001 gtk_widget_show (menuitem);
3003 gtk_widget_set_sensitive (menuitem, FALSE);
3006 gtk_check_menu_item_set_inconsistent (GTK_CHECK_MENU_ITEM (menuitem),
3010 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem),
3011 create_menu (screen, depth - 1, 5, TRUE));
3018 create_table_menu (GdkScreen *screen, gint cols, gint rows, gboolean tearoff)
3021 GtkWidget *menuitem;
3027 menu = gtk_menu_new ();
3028 gtk_menu_set_screen (GTK_MENU (menu), screen);
3033 menuitem = gtk_tearoff_menu_item_new ();
3034 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3035 gtk_widget_show (menuitem);
3039 menuitem = gtk_menu_item_new_with_label ("items");
3040 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3042 submenu = gtk_menu_new ();
3043 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3044 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3045 gtk_widget_show (menuitem);
3048 /* now fill the items submenu */
3049 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3050 GTK_ICON_SIZE_MENU);
3051 gtk_widget_show (image);
3052 menuitem = gtk_image_menu_item_new_with_label ("Image");
3053 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3054 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3055 gtk_widget_show (menuitem);
3057 menuitem = gtk_menu_item_new_with_label ("x");
3058 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 0, 1);
3059 gtk_widget_show (menuitem);
3061 menuitem = gtk_menu_item_new_with_label ("x");
3062 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 2);
3063 gtk_widget_show (menuitem);
3065 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3066 GTK_ICON_SIZE_MENU);
3067 gtk_widget_show (image);
3068 menuitem = gtk_image_menu_item_new_with_label ("Image");
3069 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3070 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3071 gtk_widget_show (menuitem);
3073 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3074 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 2, 3);
3075 gtk_widget_show (menuitem);
3077 menuitem = gtk_menu_item_new_with_label ("x");
3078 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 2, 3);
3079 gtk_widget_show (menuitem);
3081 menuitem = gtk_menu_item_new_with_label ("x");
3082 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 3, 4);
3083 gtk_widget_show (menuitem);
3085 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3086 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 3, 4);
3087 gtk_widget_show (menuitem);
3089 menuitem = gtk_check_menu_item_new_with_label ("Check");
3090 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 4, 5);
3091 gtk_widget_show (menuitem);
3093 menuitem = gtk_menu_item_new_with_label ("x");
3094 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 4, 5);
3095 gtk_widget_show (menuitem);
3097 menuitem = gtk_menu_item_new_with_label ("x");
3098 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 5, 6);
3099 gtk_widget_show (menuitem);
3101 menuitem = gtk_check_menu_item_new_with_label ("Check");
3102 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 5, 6);
3103 gtk_widget_show (menuitem);
3105 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3106 gtk_widget_show (menuitem);
3107 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 8);
3109 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3110 gtk_widget_show (menuitem);
3111 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 2);
3113 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3114 gtk_widget_show (menuitem);
3115 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 0);
3117 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3118 gtk_widget_show (menuitem);
3119 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, -1);
3121 /* end of items submenu */
3123 menuitem = gtk_menu_item_new_with_label ("spanning");
3124 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3126 submenu = gtk_menu_new ();
3127 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3128 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3129 gtk_widget_show (menuitem);
3132 /* now fill the spanning submenu */
3133 menuitem = gtk_menu_item_new_with_label ("a");
3134 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 2, 0, 1);
3135 gtk_widget_show (menuitem);
3137 menuitem = gtk_menu_item_new_with_label ("b");
3138 gtk_menu_attach (GTK_MENU (submenu), menuitem, 2, 3, 0, 2);
3139 gtk_widget_show (menuitem);
3141 menuitem = gtk_menu_item_new_with_label ("c");
3142 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 3);
3143 gtk_widget_show (menuitem);
3145 menuitem = gtk_menu_item_new_with_label ("d");
3146 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3147 gtk_widget_show (menuitem);
3149 menuitem = gtk_menu_item_new_with_label ("e");
3150 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 3, 2, 3);
3151 gtk_widget_show (menuitem);
3152 /* end of spanning submenu */
3154 menuitem = gtk_menu_item_new_with_label ("left");
3155 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, 1, j, j + 1);
3156 submenu = gtk_menu_new ();
3157 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3158 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3159 gtk_widget_show (menuitem);
3161 menuitem = gtk_menu_item_new_with_label ("Empty");
3162 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3163 submenu = gtk_menu_new ();
3164 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3165 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3166 gtk_widget_show (menuitem);
3168 menuitem = gtk_menu_item_new_with_label ("right");
3169 gtk_menu_attach (GTK_MENU (menu), menuitem, 1, 2, j, j + 1);
3170 submenu = gtk_menu_new ();
3171 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3172 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3173 gtk_widget_show (menuitem);
3175 menuitem = gtk_menu_item_new_with_label ("Empty");
3176 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3177 gtk_widget_show (menuitem);
3181 for (; j < rows; j++)
3182 for (i = 0; i < cols; i++)
3184 sprintf (buf, "(%d %d)", i, j);
3185 menuitem = gtk_menu_item_new_with_label (buf);
3186 gtk_menu_attach (GTK_MENU (menu), menuitem, i, i + 1, j, j + 1);
3187 gtk_widget_show (menuitem);
3190 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3191 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 8);
3192 gtk_widget_show (menuitem);
3193 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3194 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 2);
3195 gtk_widget_show (menuitem);
3196 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3197 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 0);
3198 gtk_widget_show (menuitem);
3199 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3200 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, -1);
3201 gtk_widget_show (menuitem);
3207 create_menus (GtkWidget *widget)
3209 static GtkWidget *window = NULL;
3213 GtkWidget *optionmenu;
3214 GtkWidget *separator;
3220 GtkWidget *menuitem;
3221 GtkAccelGroup *accel_group;
3223 GdkScreen *screen = gtk_widget_get_screen (widget);
3225 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3227 gtk_window_set_screen (GTK_WINDOW (window), screen);
3229 g_signal_connect (window, "destroy",
3230 G_CALLBACK (gtk_widget_destroyed),
3232 g_signal_connect (window, "delete-event",
3233 G_CALLBACK (gtk_true),
3236 accel_group = gtk_accel_group_new ();
3237 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3239 gtk_window_set_title (GTK_WINDOW (window), "menus");
3240 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3243 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
3244 gtk_container_add (GTK_CONTAINER (window), box1);
3245 gtk_widget_show (box1);
3247 menubar = gtk_menu_bar_new ();
3248 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3249 gtk_widget_show (menubar);
3251 menu = create_menu (screen, 2, 50, TRUE);
3253 menuitem = gtk_menu_item_new_with_label ("test\nline2");
3254 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3255 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3256 gtk_widget_show (menuitem);
3258 menu = create_table_menu (screen, 2, 50, TRUE);
3260 menuitem = gtk_menu_item_new_with_label ("table");
3261 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3262 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3263 gtk_widget_show (menuitem);
3265 menuitem = gtk_menu_item_new_with_label ("foo");
3266 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5, TRUE));
3267 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3268 gtk_widget_show (menuitem);
3270 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3271 GTK_ICON_SIZE_MENU);
3272 gtk_widget_show (image);
3273 menuitem = gtk_image_menu_item_new_with_label ("Help");
3274 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3275 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 4, 5, TRUE));
3276 gtk_widget_set_hexpand (menuitem, TRUE);
3277 gtk_widget_set_halign (menuitem, GTK_ALIGN_END);
3278 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3279 gtk_widget_show (menuitem);
3281 menubar = gtk_menu_bar_new ();
3282 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3283 gtk_widget_show (menubar);
3285 menu = create_menu (screen, 2, 10, TRUE);
3287 menuitem = gtk_menu_item_new_with_label ("Second menu bar");
3288 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3289 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3290 gtk_widget_show (menuitem);
3292 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3293 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3294 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3295 gtk_widget_show (box2);
3297 menu = create_menu (screen, 1, 5, FALSE);
3298 gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
3300 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
3301 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3302 gtk_widget_show (menuitem);
3304 menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
3305 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3306 gtk_widget_show (menuitem);
3307 gtk_widget_add_accelerator (menuitem,
3313 menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
3314 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3315 gtk_widget_show (menuitem);
3316 gtk_widget_add_accelerator (menuitem,
3321 GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3322 menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
3323 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3324 gtk_widget_show (menuitem);
3325 gtk_widget_add_accelerator (menuitem,
3331 gtk_widget_add_accelerator (menuitem,
3338 optionmenu = gtk_combo_box_text_new ();
3339 gtk_combo_box_set_active (GTK_COMBO_BOX (optionmenu), 3);
3340 gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
3341 gtk_widget_show (optionmenu);
3343 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
3344 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3345 gtk_widget_show (separator);
3347 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3348 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3349 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3350 gtk_widget_show (box2);
3352 button = gtk_button_new_with_label ("close");
3353 g_signal_connect_swapped (button, "clicked",
3354 G_CALLBACK (gtk_widget_destroy),
3356 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3357 gtk_widget_set_can_default (button, TRUE);
3358 gtk_widget_grab_default (button);
3359 gtk_widget_show (button);
3362 if (!gtk_widget_get_visible (window))
3363 gtk_widget_show (window);
3365 gtk_widget_destroy (window);
3368 /* GdkPixbuf RGBA C-Source image dump */
3370 static const guint8 apple[] =
3372 /* Pixbuf magic (0x47646b50) */
3374 /* length: header (24) + pixel_data (2304) */
3376 /* pixdata_type (0x1010002) */
3378 /* rowstride (96) */
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\0\0"
3390 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3391 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\26\24"
3392 "\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"
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`m"
3394 "[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"
3395 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3396 "\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"
3397 "\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"
3398 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3399 "\0\0\0\0\0\0`l\\\20iw_\356y\211h\373x\207g\364~\216i\364u\204e\366gt"
3400 "_\374^jX\241A;-_\0\0\0~\0\0\0\0SM4)SM21B9&\22\320\270\204\1\320\270\204"
3401 "\0\0\0\0\0\0\0\0\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"
3402 "]\212r\200c\366v\205f\371jx_\323_kY\232_kZH^jY\26]iW\211@G9\272:6%j\220"
3403 "\211]\320\221\211`\377\212\203Z\377~xP\377mkE\331]^;|/0\37\21\0\0\0\0"
3404 "\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["
3405 "eT<\216\200Z\203\227\211_\354\234\217c\377\232\217b\362\232\220c\337"
3406 "\243\233k\377\252\241p\377\250\236p\377\241\225h\377\231\214_\377\210"
3407 "\202U\377srI\377[]:\355KO0U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0i"
3408 "v^\200`lY\211^jY\"\0\0\0\0\221\204\\\273\250\233r\377\302\267\224\377"
3409 "\311\300\237\377\272\256\204\377\271\256\177\377\271\257\200\377\267"
3410 "\260\177\377\260\251x\377\250\236l\377\242\225e\377\226\213]\377~zP\377"
3411 "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"
3412 "\0\213\203[v\253\240t\377\334\326\301\377\344\340\317\377\321\312\253"
3413 "\377\303\271\217\377\300\270\213\377\277\267\210\377\272\264\203\377"
3414 "\261\255z\377\250\242n\377\243\232h\377\232\220`\377\210\202V\377nnE"
3415 "\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"
3416 "\234\222e\362\304\274\232\377\337\333\306\377\332\325\273\377\311\302"
3417 "\232\377\312\303\236\377\301\273\216\377\300\271\212\377\270\264\200"
3418 "\377\256\253v\377\246\243n\377\236\232h\377\230\220`\377\213\203V\377"
3419 "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"
3420 "\203Zl\242\234l\377\321\315\260\377\331\324\271\377\320\313\251\377\307"
3421 "\301\232\377\303\276\224\377\300\272\214\377\274\267\206\377\264\260"
3422 "|\377\253\251s\377\244\243n\377\232\230e\377\223\216^\377\207\200U\377"
3423 "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"
3424 "\210\204Y\240\245\237o\377\316\310\253\377\310\303\237\377\304\300\230"
3425 "\377\303\277\225\377\277\272\216\377\274\270\210\377\266\263\200\377"
3426 "\256\254v\377\247\246p\377\237\236j\377\227\226d\377\215\212[\377\203"
3427 "\177T\377qsH\377X]8\377FN.\377DK-\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3428 "\0\0\0\0\207\204X\257\244\240o\377\300\275\231\377\301\275\226\377\274"
3429 "\270\213\377\274\270\214\377\267\264\205\377\264\262\200\377\260\256"
3430 "z\377\251\251s\377\243\244n\377\231\232g\377\220\222`\377\210\211Y\377"
3431 "|}Q\377hlC\377PU3\377CK,\377DL/Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3432 "\0\0\205\204X\220\232\230h\377\261\260\204\377\266\264\212\377\261\260"
3433 "\201\377\263\260\200\377\260\257}\377\256\256x\377\253\254t\377\244\246"
3434 "o\377\233\236i\377\221\224b\377\211\214\\\377\202\204V\377txM\377]b>"
3435 "\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>"
3436 "\215\215_\377\237\237r\377\247\247x\377\247\247t\377\252\252w\377\252"
3437 "\252u\377\252\253t\377\243\246o\377\235\240j\377\223\230c\377\213\217"
3438 "]\377\201\206V\377x}P\377gkD\377RY5\377BI,\377AI,\262\0\0\0\0\0\0\0\0"
3439 "\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"
3440 "\232g\377\234\236i\377\236\241l\377\241\244n\377\240\244m\377\232\237"
3441 "i\377\223\230c\377\212\221]\377\200\210W\377v|P\377jnG\377Za>\377HP2"
3442 "\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"
3443 "\0wzQ6\177\201U\371\206\211Z\377\216\222`\377\220\225a\377\220\225b\377"
3444 "\220\226a\377\213\221_\377\204\213Z\377{\203R\377ryN\377iqH\377^fA\377"
3445 "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"
3446 "\0\0\0\0\0\0\0\0\0\0\0\0ptJTw|Q\371z\177R\377}\202T\377|\203T\377z\200"
3447 "R\377v|O\377pwL\377jpF\377dlB\377`hB\377Yb@\377LT6\377<C*\377\11\12\6"
3448 "\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"
3449 "\0\0\0\0\0\0\0\0\0\0\\`=UgnE\370hnG\377gmE\377djB\377]d>\377[c<\377Y"
3450 "b<\377Zc>\377V_>\377OW8\377BK/\377\16\20\12\377\0\0\0\377\0\0\0\377\0"
3451 "\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"
3452 "\0\1\0\0\0\40\22\24\15\260@D+\377W`;\377OV5\377.3\36\377.3\37\377IP0"
3453 "\377RZ7\377PZ8\3776=&\377\14\15\10\377\0\0\0\377\0\0\0\377\0\0\0\377"
3454 "\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"
3455 "\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"
3456 "\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"
3457 "\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"
3458 "\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"
3459 "\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"
3460 "\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"
3461 "\0\0\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"
3462 "\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"
3463 "\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
3467 accel_button_new (GtkAccelGroup *accel_group,
3472 GdkModifierType modifiers;
3476 gtk_accelerator_parse (accel, &keyval, &modifiers);
3479 button = gtk_button_new ();
3480 gtk_widget_add_accelerator (button, "activate", accel_group,
3481 keyval, modifiers, GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3483 label = gtk_accel_label_new (text);
3484 gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), button);
3485 gtk_widget_show (label);
3487 gtk_container_add (GTK_CONTAINER (button), label);
3493 create_key_lookup (GtkWidget *widget)
3495 static GtkWidget *window = NULL;
3496 gpointer window_ptr;
3500 GtkAccelGroup *accel_group = gtk_accel_group_new ();
3502 GtkWidget *content_area;
3504 window = gtk_dialog_new_with_buttons ("Key Lookup", NULL, 0,
3505 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
3508 gtk_window_set_screen (GTK_WINDOW (window),
3509 gtk_widget_get_screen (widget));
3511 /* We have to expand it so the accel labels will draw their labels
3513 gtk_window_set_default_size (GTK_WINDOW (window), 300, -1);
3515 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3517 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
3519 button = gtk_button_new_with_mnemonic ("Button 1 (_a)");
3520 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3521 button = gtk_button_new_with_mnemonic ("Button 2 (_A)");
3522 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3523 button = gtk_button_new_with_mnemonic ("Button 3 (_\321\204)");
3524 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3525 button = gtk_button_new_with_mnemonic ("Button 4 (_\320\244)");
3526 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3527 button = gtk_button_new_with_mnemonic ("Button 6 (_b)");
3528 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3529 button = accel_button_new (accel_group, "Button 7", "<Alt><Shift>b");
3530 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3531 button = accel_button_new (accel_group, "Button 8", "<Alt>d");
3532 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3533 button = accel_button_new (accel_group, "Button 9", "<Alt>Cyrillic_ve");
3534 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3535 button = gtk_button_new_with_mnemonic ("Button 10 (_1)");
3536 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3537 button = gtk_button_new_with_mnemonic ("Button 11 (_!)");
3538 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3539 button = accel_button_new (accel_group, "Button 12", "<Super>a");
3540 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3541 button = accel_button_new (accel_group, "Button 13", "<Hyper>a");
3542 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3543 button = accel_button_new (accel_group, "Button 14", "<Meta>a");
3544 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3545 button = accel_button_new (accel_group, "Button 15", "<Shift><Mod4>b");
3546 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3548 window_ptr = &window;
3549 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
3550 g_signal_connect (window, "response", G_CALLBACK (gtk_widget_destroy), NULL);
3552 gtk_widget_show_all (window);
3555 gtk_widget_destroy (window);
3564 cmw_destroy_cb(GtkWidget *widget)
3566 /* This is needed to get out of gtk_main */
3573 cmw_color (GtkWidget *widget, GtkWidget *parent)
3576 GtkWidget *colorsel;
3577 GtkWidget *ok_button, *cancel_button;
3579 csd = gtk_color_selection_dialog_new ("This is a modal color selection dialog");
3581 gtk_window_set_screen (GTK_WINDOW (csd), gtk_widget_get_screen (parent));
3583 colorsel = gtk_color_selection_dialog_get_color_selection (GTK_COLOR_SELECTION_DIALOG (csd));
3584 gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (colorsel),
3588 gtk_window_set_modal (GTK_WINDOW(csd),TRUE);
3590 /* And mark it as a transient dialog */
3591 gtk_window_set_transient_for (GTK_WINDOW (csd), GTK_WINDOW (parent));
3593 g_signal_connect (csd, "destroy",
3594 G_CALLBACK (cmw_destroy_cb), NULL);
3597 "ok-button", &ok_button,
3598 "cancel-button", &cancel_button,
3601 g_signal_connect_swapped (ok_button,
3602 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
3603 g_signal_connect_swapped (cancel_button,
3604 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
3606 /* wait until destroy calls gtk_main_quit */
3607 gtk_widget_show (csd);
3612 cmw_file (GtkWidget *widget, GtkWidget *parent)
3616 fs = gtk_file_chooser_dialog_new ("This is a modal file selection dialog",
3617 GTK_WINDOW (parent), GTK_FILE_CHOOSER_ACTION_OPEN,
3618 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
3619 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
3621 gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent));
3622 gtk_window_set_modal (GTK_WINDOW (fs), TRUE);
3624 g_signal_connect (fs, "destroy",
3625 G_CALLBACK (cmw_destroy_cb), NULL);
3626 g_signal_connect_swapped (fs, "response",
3627 G_CALLBACK (gtk_widget_destroy), fs);
3629 /* wait until destroy calls gtk_main_quit */
3630 gtk_widget_show (fs);
3636 create_modal_window (GtkWidget *widget)
3638 GtkWidget *window = NULL;
3639 GtkWidget *box1,*box2;
3641 GtkWidget *btnColor,*btnFile,*btnClose;
3643 /* Create modal window (Here you can use any window descendent )*/
3644 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3645 gtk_window_set_screen (GTK_WINDOW (window),
3646 gtk_widget_get_screen (widget));
3648 gtk_window_set_title (GTK_WINDOW(window),"This window is modal");
3650 /* Set window as modal */
3651 gtk_window_set_modal (GTK_WINDOW(window),TRUE);
3653 /* Create widgets */
3654 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
3655 frame1 = gtk_frame_new ("Standard dialogs in modal form");
3656 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
3657 gtk_box_set_homogeneous (GTK_BOX (box2), TRUE);
3658 btnColor = gtk_button_new_with_label ("Color");
3659 btnFile = gtk_button_new_with_label ("File Selection");
3660 btnClose = gtk_button_new_with_label ("Close");
3663 gtk_container_set_border_width (GTK_CONTAINER (box1), 3);
3664 gtk_container_set_border_width (GTK_CONTAINER (box2), 3);
3667 gtk_container_add (GTK_CONTAINER (window), box1);
3668 gtk_box_pack_start (GTK_BOX (box1), frame1, TRUE, TRUE, 4);
3669 gtk_container_add (GTK_CONTAINER (frame1), box2);
3670 gtk_box_pack_start (GTK_BOX (box2), btnColor, FALSE, FALSE, 4);
3671 gtk_box_pack_start (GTK_BOX (box2), btnFile, FALSE, FALSE, 4);
3672 gtk_box_pack_start (GTK_BOX (box1), gtk_separator_new (GTK_ORIENTATION_HORIZONTAL), FALSE, FALSE, 4);
3673 gtk_box_pack_start (GTK_BOX (box1), btnClose, FALSE, FALSE, 4);
3675 /* connect signals */
3676 g_signal_connect_swapped (btnClose, "clicked",
3677 G_CALLBACK (gtk_widget_destroy), window);
3679 g_signal_connect (window, "destroy",
3680 G_CALLBACK (cmw_destroy_cb), NULL);
3682 g_signal_connect (btnColor, "clicked",
3683 G_CALLBACK (cmw_color), window);
3684 g_signal_connect (btnFile, "clicked",
3685 G_CALLBACK (cmw_file), window);
3688 gtk_widget_show_all (window);
3690 /* wait until dialog get destroyed */
3699 make_message_dialog (GdkScreen *screen,
3701 GtkMessageType type,
3702 GtkButtonsType buttons,
3703 guint default_response)
3707 gtk_widget_destroy (*dialog);
3712 *dialog = gtk_message_dialog_new (NULL, 0, type, buttons,
3713 "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.)");
3715 gtk_window_set_screen (GTK_WINDOW (*dialog), screen);
3717 g_signal_connect_swapped (*dialog,
3719 G_CALLBACK (gtk_widget_destroy),
3722 g_signal_connect (*dialog,
3724 G_CALLBACK (gtk_widget_destroyed),
3727 gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
3729 gtk_widget_show (*dialog);
3733 create_message_dialog (GtkWidget *widget)
3735 static GtkWidget *info = NULL;
3736 static GtkWidget *warning = NULL;
3737 static GtkWidget *error = NULL;
3738 static GtkWidget *question = NULL;
3739 GdkScreen *screen = gtk_widget_get_screen (widget);
3741 make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK);
3742 make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE);
3743 make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK);
3744 make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_NO);
3751 static GtkWidget *sw_parent = NULL;
3752 static GtkWidget *sw_float_parent;
3753 static gulong sw_destroyed_handler = 0;
3756 scrolled_windows_delete_cb (GtkWidget *widget, GdkEventAny *event, GtkWidget *scrollwin)
3758 gtk_widget_reparent (scrollwin, sw_parent);
3760 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
3761 sw_float_parent = NULL;
3763 sw_destroyed_handler = 0;
3769 scrolled_windows_destroy_cb (GtkWidget *widget, GtkWidget *scrollwin)
3771 gtk_widget_destroy (sw_float_parent);
3773 sw_float_parent = NULL;
3775 sw_destroyed_handler = 0;
3779 scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
3783 gtk_widget_reparent (scrollwin, sw_parent);
3784 gtk_widget_destroy (sw_float_parent);
3786 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
3787 sw_float_parent = NULL;
3789 sw_destroyed_handler = 0;
3793 sw_parent = gtk_widget_get_parent (scrollwin);
3794 sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3795 gtk_window_set_screen (GTK_WINDOW (sw_float_parent),
3796 gtk_widget_get_screen (widget));
3798 gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200);
3800 gtk_widget_reparent (scrollwin, sw_float_parent);
3801 gtk_widget_show (sw_float_parent);
3803 sw_destroyed_handler =
3804 g_signal_connect (sw_parent, "destroy",
3805 G_CALLBACK (scrolled_windows_destroy_cb), scrollwin);
3806 g_signal_connect (sw_float_parent, "delete_event",
3807 G_CALLBACK (scrolled_windows_delete_cb), scrollwin);
3812 create_scrolled_windows (GtkWidget *widget)
3814 static GtkWidget *window;
3815 GtkWidget *content_area, *action_area;
3816 GtkWidget *scrolled_window;
3824 window = gtk_dialog_new ();
3826 gtk_window_set_screen (GTK_WINDOW (window),
3827 gtk_widget_get_screen (widget));
3829 g_signal_connect (window, "destroy",
3830 G_CALLBACK (gtk_widget_destroyed),
3833 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
3834 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
3836 gtk_window_set_title (GTK_WINDOW (window), "dialog");
3837 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3839 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
3840 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
3841 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
3842 GTK_POLICY_AUTOMATIC,
3843 GTK_POLICY_AUTOMATIC);
3844 gtk_box_pack_start (GTK_BOX (content_area), scrolled_window, TRUE, TRUE, 0);
3845 gtk_widget_show (scrolled_window);
3847 table = gtk_table_new (20, 20, FALSE);
3848 gtk_table_set_row_spacings (GTK_TABLE (table), 10);
3849 gtk_table_set_col_spacings (GTK_TABLE (table), 10);
3850 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
3851 gtk_container_set_focus_hadjustment (GTK_CONTAINER (table),
3852 gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
3853 gtk_container_set_focus_vadjustment (GTK_CONTAINER (table),
3854 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
3855 gtk_widget_show (table);
3857 for (i = 0; i < 20; i++)
3858 for (j = 0; j < 20; j++)
3860 sprintf (buffer, "button (%d,%d)\n", i, j);
3861 button = gtk_toggle_button_new_with_label (buffer);
3862 gtk_table_attach_defaults (GTK_TABLE (table), button,
3864 gtk_widget_show (button);
3868 button = gtk_button_new_with_label ("Close");
3869 g_signal_connect_swapped (button, "clicked",
3870 G_CALLBACK (gtk_widget_destroy),
3872 gtk_widget_set_can_default (button, TRUE);
3873 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
3874 gtk_widget_grab_default (button);
3875 gtk_widget_show (button);
3877 button = gtk_button_new_with_label ("Reparent Out");
3878 g_signal_connect (button, "clicked",
3879 G_CALLBACK (scrolled_windows_remove),
3881 gtk_widget_set_can_default (button, TRUE);
3882 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
3883 gtk_widget_grab_default (button);
3884 gtk_widget_show (button);
3886 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
3889 if (!gtk_widget_get_visible (window))
3890 gtk_widget_show (window);
3892 gtk_widget_destroy (window);
3900 entry_toggle_frame (GtkWidget *checkbutton,
3903 gtk_entry_set_has_frame (GTK_ENTRY(entry),
3904 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
3908 entry_toggle_sensitive (GtkWidget *checkbutton,
3911 gtk_widget_set_sensitive (entry,
3912 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(checkbutton)));
3916 entry_progress_timeout (gpointer data)
3918 if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (data), "progress-pulse")))
3920 gtk_entry_progress_pulse (GTK_ENTRY (data));
3926 fraction = gtk_entry_get_progress_fraction (GTK_ENTRY (data));
3929 if (fraction > 1.0001)
3932 gtk_entry_set_progress_fraction (GTK_ENTRY (data), fraction);
3939 entry_remove_timeout (gpointer data)
3941 g_source_remove (GPOINTER_TO_UINT (data));
3945 entry_toggle_progress (GtkWidget *checkbutton,
3948 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)))
3950 guint timeout = gdk_threads_add_timeout (100,
3951 entry_progress_timeout,
3953 g_object_set_data_full (G_OBJECT (entry), "timeout-id",
3954 GUINT_TO_POINTER (timeout),
3955 entry_remove_timeout);
3959 g_object_set_data (G_OBJECT (entry), "timeout-id",
3960 GUINT_TO_POINTER (0));
3962 gtk_entry_set_progress_fraction (GTK_ENTRY (entry), 0.0);
3967 entry_toggle_pulse (GtkWidget *checkbutton,
3970 g_object_set_data (G_OBJECT (entry), "progress-pulse",
3971 GUINT_TO_POINTER ((guint) gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton))));
3975 props_clicked (GtkWidget *button,
3978 GtkWidget *window = create_prop_editor (object, 0);
3980 gtk_window_set_title (GTK_WINDOW (window), "Object Properties");
3984 create_entry (GtkWidget *widget)
3986 static GtkWidget *window = NULL;
3990 GtkWidget *has_frame_check;
3991 GtkWidget *sensitive_check;
3992 GtkWidget *progress_check;
3994 GtkComboBoxText *cb;
3995 GtkWidget *cb_entry;
3997 GtkWidget *separator;
4001 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4002 gtk_window_set_screen (GTK_WINDOW (window),
4003 gtk_widget_get_screen (widget));
4005 g_signal_connect (window, "destroy",
4006 G_CALLBACK (gtk_widget_destroyed),
4009 gtk_window_set_title (GTK_WINDOW (window), "entry");
4010 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4013 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4014 gtk_container_add (GTK_CONTAINER (window), box1);
4017 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
4018 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4019 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
4021 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
4022 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
4024 entry = gtk_entry_new ();
4025 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");
4026 gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5);
4027 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
4029 button = gtk_button_new_with_mnemonic ("_Props");
4030 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
4031 g_signal_connect (button, "clicked",
4032 G_CALLBACK (props_clicked),
4035 cb = GTK_COMBO_BOX_TEXT (gtk_combo_box_text_new_with_entry ());
4037 gtk_combo_box_text_append_text (cb, "item0");
4038 gtk_combo_box_text_append_text (cb, "item0");
4039 gtk_combo_box_text_append_text (cb, "item1 item1");
4040 gtk_combo_box_text_append_text (cb, "item2 item2 item2");
4041 gtk_combo_box_text_append_text (cb, "item3 item3 item3 item3");
4042 gtk_combo_box_text_append_text (cb, "item4 item4 item4 item4 item4");
4043 gtk_combo_box_text_append_text (cb, "item5 item5 item5 item5 item5 item5");
4044 gtk_combo_box_text_append_text (cb, "item6 item6 item6 item6 item6");
4045 gtk_combo_box_text_append_text (cb, "item7 item7 item7 item7");
4046 gtk_combo_box_text_append_text (cb, "item8 item8 item8");
4047 gtk_combo_box_text_append_text (cb, "item9 item9");
4049 cb_entry = gtk_bin_get_child (GTK_BIN (cb));
4050 gtk_entry_set_text (GTK_ENTRY (cb_entry), "hello world \n\n\n foo");
4051 gtk_editable_select_region (GTK_EDITABLE (cb_entry), 0, -1);
4052 gtk_box_pack_start (GTK_BOX (box2), GTK_WIDGET (cb), TRUE, TRUE, 0);
4054 sensitive_check = gtk_check_button_new_with_label("Sensitive");
4055 gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0);
4056 g_signal_connect (sensitive_check, "toggled",
4057 G_CALLBACK (entry_toggle_sensitive), entry);
4058 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sensitive_check), TRUE);
4060 has_frame_check = gtk_check_button_new_with_label("Has Frame");
4061 gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0);
4062 g_signal_connect (has_frame_check, "toggled",
4063 G_CALLBACK (entry_toggle_frame), entry);
4064 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
4066 progress_check = gtk_check_button_new_with_label("Show Progress");
4067 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4068 g_signal_connect (progress_check, "toggled",
4069 G_CALLBACK (entry_toggle_progress), entry);
4071 progress_check = gtk_check_button_new_with_label("Pulse Progress");
4072 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4073 g_signal_connect (progress_check, "toggled",
4074 G_CALLBACK (entry_toggle_pulse), entry);
4076 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
4077 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4079 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
4080 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4081 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4083 button = gtk_button_new_with_label ("close");
4084 g_signal_connect_swapped (button, "clicked",
4085 G_CALLBACK (gtk_widget_destroy),
4087 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4088 gtk_widget_set_can_default (button, TRUE);
4089 gtk_widget_grab_default (button);
4092 if (!gtk_widget_get_visible (window))
4093 gtk_widget_show_all (window);
4095 gtk_widget_destroy (window);
4099 create_expander (GtkWidget *widget)
4102 GtkWidget *expander;
4104 static GtkWidget *window = NULL;
4108 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4109 gtk_window_set_screen (GTK_WINDOW (window),
4110 gtk_widget_get_screen (widget));
4112 g_signal_connect (window, "destroy",
4113 G_CALLBACK (gtk_widget_destroyed),
4116 gtk_window_set_title (GTK_WINDOW (window), "expander");
4117 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4119 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4120 gtk_container_add (GTK_CONTAINER (window), box1);
4122 expander = gtk_expander_new ("The Hidden");
4124 gtk_box_pack_start (GTK_BOX (box1), expander, TRUE, TRUE, 0);
4126 hidden = gtk_label_new ("Revealed!");
4128 gtk_container_add (GTK_CONTAINER (expander), hidden);
4131 if (!gtk_widget_get_visible (window))
4132 gtk_widget_show_all (window);
4134 gtk_widget_destroy (window);
4142 event_box_label_pressed (GtkWidget *widget,
4143 GdkEventButton *event,
4146 g_print ("clicked on event box\n");
4150 event_box_button_clicked (GtkWidget *widget,
4154 g_print ("pushed button\n");
4158 event_box_toggle_visible_window (GtkWidget *checkbutton,
4159 GtkEventBox *event_box)
4161 gtk_event_box_set_visible_window (event_box,
4162 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
4166 event_box_toggle_above_child (GtkWidget *checkbutton,
4167 GtkEventBox *event_box)
4169 gtk_event_box_set_above_child (event_box,
4170 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
4174 create_event_box (GtkWidget *widget)
4176 static GtkWidget *window = NULL;
4182 GtkWidget *separator;
4183 GtkWidget *event_box;
4185 GtkWidget *visible_window_check;
4186 GtkWidget *above_child_check;
4196 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4197 gtk_window_set_screen (GTK_WINDOW (window),
4198 gtk_widget_get_screen (widget));
4200 g_signal_connect (window, "destroy",
4201 G_CALLBACK (gtk_widget_destroyed),
4204 gtk_window_set_title (GTK_WINDOW (window), "event box");
4205 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4207 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4208 gtk_container_add (GTK_CONTAINER (window), box1);
4209 gtk_widget_override_background_color (window, 0, &color);
4211 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4212 gtk_box_pack_start (GTK_BOX (box1), hbox, TRUE, FALSE, 0);
4214 event_box = gtk_event_box_new ();
4215 gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, FALSE, 0);
4217 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4218 gtk_container_add (GTK_CONTAINER (event_box), vbox);
4219 g_signal_connect (event_box, "button_press_event",
4220 G_CALLBACK (event_box_label_pressed),
4223 label = gtk_label_new ("Click on this label");
4224 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
4226 button = gtk_button_new_with_label ("button in eventbox");
4227 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, FALSE, 0);
4228 g_signal_connect (button, "clicked",
4229 G_CALLBACK (event_box_button_clicked),
4233 visible_window_check = gtk_check_button_new_with_label("Visible Window");
4234 gtk_box_pack_start (GTK_BOX (box1), visible_window_check, FALSE, TRUE, 0);
4235 g_signal_connect (visible_window_check, "toggled",
4236 G_CALLBACK (event_box_toggle_visible_window), event_box);
4237 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (visible_window_check), FALSE);
4239 above_child_check = gtk_check_button_new_with_label("Above Child");
4240 gtk_box_pack_start (GTK_BOX (box1), above_child_check, FALSE, TRUE, 0);
4241 g_signal_connect (above_child_check, "toggled",
4242 G_CALLBACK (event_box_toggle_above_child), event_box);
4243 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (above_child_check), FALSE);
4245 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
4246 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4248 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
4249 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4250 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4252 button = gtk_button_new_with_label ("close");
4253 g_signal_connect_swapped (button, "clicked",
4254 G_CALLBACK (gtk_widget_destroy),
4256 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4257 gtk_widget_set_can_default (button, TRUE);
4258 gtk_widget_grab_default (button);
4261 if (!gtk_widget_get_visible (window))
4262 gtk_widget_show_all (window);
4264 gtk_widget_destroy (window);
4272 #define SIZE_GROUP_INITIAL_SIZE 50
4275 size_group_hsize_changed (GtkSpinButton *spin_button,
4278 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4279 gtk_spin_button_get_value_as_int (spin_button),
4284 size_group_vsize_changed (GtkSpinButton *spin_button,
4287 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4289 gtk_spin_button_get_value_as_int (spin_button));
4293 create_size_group_window (GdkScreen *screen,
4294 GtkSizeGroup *master_size_group)
4296 GtkWidget *content_area;
4299 GtkWidget *main_button;
4301 GtkWidget *spin_button;
4303 GtkSizeGroup *hgroup1;
4304 GtkSizeGroup *hgroup2;
4305 GtkSizeGroup *vgroup1;
4306 GtkSizeGroup *vgroup2;
4308 window = gtk_dialog_new_with_buttons ("GtkSizeGroup",
4314 gtk_window_set_screen (GTK_WINDOW (window), screen);
4316 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
4318 g_signal_connect (window, "response",
4319 G_CALLBACK (gtk_widget_destroy),
4322 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
4324 table = gtk_table_new (2, 2, FALSE);
4325 gtk_box_pack_start (GTK_BOX (content_area), table, TRUE, TRUE, 0);
4327 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
4328 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
4329 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
4330 gtk_widget_set_size_request (table, 250, 250);
4332 hgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4333 hgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4334 vgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4335 vgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4337 main_button = gtk_button_new_with_label ("X");
4339 gtk_table_attach (GTK_TABLE (table), main_button,
4341 GTK_EXPAND, GTK_EXPAND,
4343 gtk_size_group_add_widget (master_size_group, main_button);
4344 gtk_size_group_add_widget (hgroup1, main_button);
4345 gtk_size_group_add_widget (vgroup1, main_button);
4346 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (main_button)),
4347 SIZE_GROUP_INITIAL_SIZE,
4348 SIZE_GROUP_INITIAL_SIZE);
4350 button = gtk_button_new ();
4351 gtk_table_attach (GTK_TABLE (table), button,
4353 GTK_EXPAND, GTK_EXPAND,
4355 gtk_size_group_add_widget (vgroup1, button);
4356 gtk_size_group_add_widget (vgroup2, button);
4358 button = gtk_button_new ();
4359 gtk_table_attach (GTK_TABLE (table), button,
4361 GTK_EXPAND, GTK_EXPAND,
4363 gtk_size_group_add_widget (hgroup1, button);
4364 gtk_size_group_add_widget (hgroup2, button);
4366 button = gtk_button_new ();
4367 gtk_table_attach (GTK_TABLE (table), button,
4369 GTK_EXPAND, GTK_EXPAND,
4371 gtk_size_group_add_widget (hgroup2, button);
4372 gtk_size_group_add_widget (vgroup2, button);
4374 g_object_unref (hgroup1);
4375 g_object_unref (hgroup2);
4376 g_object_unref (vgroup1);
4377 g_object_unref (vgroup2);
4379 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
4380 gtk_box_pack_start (GTK_BOX (content_area), hbox, FALSE, FALSE, 0);
4382 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4383 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4384 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4385 g_signal_connect (spin_button, "value_changed",
4386 G_CALLBACK (size_group_hsize_changed), main_button);
4388 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4389 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4390 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4391 g_signal_connect (spin_button, "value_changed",
4392 G_CALLBACK (size_group_vsize_changed), main_button);
4398 create_size_groups (GtkWidget *widget)
4400 static GtkWidget *window1 = NULL;
4401 static GtkWidget *window2 = NULL;
4402 static GtkSizeGroup *master_size_group;
4404 if (!master_size_group)
4405 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
4409 window1 = create_size_group_window (gtk_widget_get_screen (widget),
4412 g_signal_connect (window1, "destroy",
4413 G_CALLBACK (gtk_widget_destroyed),
4419 window2 = create_size_group_window (gtk_widget_get_screen (widget),
4422 g_signal_connect (window2, "destroy",
4423 G_CALLBACK (gtk_widget_destroyed),
4427 if (gtk_widget_get_visible (window1) && gtk_widget_get_visible (window2))
4429 gtk_widget_destroy (window1);
4430 gtk_widget_destroy (window2);
4434 if (!gtk_widget_get_visible (window1))
4435 gtk_widget_show_all (window1);
4436 if (!gtk_widget_get_visible (window2))
4437 gtk_widget_show_all (window2);
4445 static GtkWidget *spinner1;
4448 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
4450 gtk_spin_button_set_snap_to_ticks (spin,
4451 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
4455 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
4457 gtk_spin_button_set_numeric (spin,
4458 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
4462 change_digits (GtkWidget *widget, GtkSpinButton *spin)
4464 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
4465 gtk_spin_button_get_value_as_int (spin));
4469 get_value (GtkWidget *widget, gpointer data)
4473 GtkSpinButton *spin;
4475 spin = GTK_SPIN_BUTTON (spinner1);
4476 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
4477 if (GPOINTER_TO_INT (data) == 1)
4478 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
4480 sprintf (buf, "%0.*f",
4481 gtk_spin_button_get_digits (spin),
4482 gtk_spin_button_get_value (spin));
4484 gtk_label_set_text (label, buf);
4488 get_spin_value (GtkWidget *widget, gpointer data)
4492 GtkSpinButton *spin;
4494 spin = GTK_SPIN_BUTTON (widget);
4495 label = GTK_LABEL (data);
4497 buffer = g_strdup_printf ("%0.*f",
4498 gtk_spin_button_get_digits (spin),
4499 gtk_spin_button_get_value (spin));
4500 gtk_label_set_text (label, buffer);
4506 spin_button_time_output_func (GtkSpinButton *spin_button)
4508 GtkAdjustment *adjustment;
4509 static gchar buf[6];
4513 adjustment = gtk_spin_button_get_adjustment (spin_button);
4514 hours = gtk_adjustment_get_value (adjustment) / 60.0;
4515 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
4516 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
4517 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4518 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4523 spin_button_month_input_func (GtkSpinButton *spin_button,
4527 static gchar *month[12] = { "January", "February", "March", "April",
4528 "May", "June", "July", "August",
4529 "September", "October", "November", "December" };
4531 gboolean found = FALSE;
4533 for (i = 1; i <= 12; i++)
4535 tmp1 = g_ascii_strup (month[i - 1], -1);
4536 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
4537 if (strstr (tmp1, tmp2) == tmp1)
4547 return GTK_INPUT_ERROR;
4549 *new_val = (gdouble) i;
4554 spin_button_month_output_func (GtkSpinButton *spin_button)
4556 GtkAdjustment *adjustment;
4559 static gchar *month[12] = { "January", "February", "March", "April",
4560 "May", "June", "July", "August", "September",
4561 "October", "November", "December" };
4563 adjustment = gtk_spin_button_get_adjustment (spin_button);
4564 value = gtk_adjustment_get_value (adjustment);
4565 for (i = 1; i <= 12; i++)
4566 if (fabs (value - (double)i) < 1e-5)
4568 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
4569 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
4575 spin_button_hex_input_func (GtkSpinButton *spin_button,
4582 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
4583 res = strtol(buf, &err, 16);
4586 return GTK_INPUT_ERROR;
4592 spin_button_hex_output_func (GtkSpinButton *spin_button)
4594 GtkAdjustment *adjustment;
4595 static gchar buf[7];
4598 adjustment = gtk_spin_button_get_adjustment (spin_button);
4599 val = (gint) gtk_adjustment_get_value (adjustment);
4600 if (fabs (val) < 1e-5)
4601 sprintf (buf, "0x00");
4603 sprintf (buf, "0x%.2X", val);
4604 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4605 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4610 create_spins (GtkWidget *widget)
4612 static GtkWidget *window = NULL;
4615 GtkWidget *main_vbox;
4618 GtkWidget *spinner2;
4622 GtkWidget *val_label;
4623 GtkAdjustment *adjustment;
4627 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4628 gtk_window_set_screen (GTK_WINDOW (window),
4629 gtk_widget_get_screen (widget));
4631 g_signal_connect (window, "destroy",
4632 G_CALLBACK (gtk_widget_destroyed),
4635 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
4637 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
4638 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
4639 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4641 frame = gtk_frame_new ("Not accelerated");
4642 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4644 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4645 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4646 gtk_container_add (GTK_CONTAINER (frame), vbox);
4648 /* Time, month, hex spinners */
4650 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4651 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
4653 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4654 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4656 label = gtk_label_new ("Time :");
4657 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4658 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4660 adjustment = gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
4661 spinner = gtk_spin_button_new (adjustment, 0, 0);
4662 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
4663 g_signal_connect (spinner,
4665 G_CALLBACK (spin_button_time_output_func),
4667 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4668 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 5);
4669 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4671 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4672 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4674 label = gtk_label_new ("Month :");
4675 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4676 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4678 adjustment = gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
4680 spinner = gtk_spin_button_new (adjustment, 0, 0);
4681 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
4682 GTK_UPDATE_IF_VALID);
4683 g_signal_connect (spinner,
4685 G_CALLBACK (spin_button_month_input_func),
4687 g_signal_connect (spinner,
4689 G_CALLBACK (spin_button_month_output_func),
4691 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4692 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 9);
4693 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4695 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4696 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4698 label = gtk_label_new ("Hex :");
4699 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4700 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4702 adjustment = gtk_adjustment_new (0, 0, 255, 1, 16, 0);
4703 spinner = gtk_spin_button_new (adjustment, 0, 0);
4704 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
4705 g_signal_connect (spinner,
4707 G_CALLBACK (spin_button_hex_input_func),
4709 g_signal_connect (spinner,
4711 G_CALLBACK (spin_button_hex_output_func),
4713 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4714 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 4);
4715 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4717 frame = gtk_frame_new ("Accelerated");
4718 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4720 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4721 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4722 gtk_container_add (GTK_CONTAINER (frame), vbox);
4724 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4725 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4727 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4728 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4730 label = gtk_label_new ("Value :");
4731 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4732 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4734 adjustment = gtk_adjustment_new (0.0, -10000.0, 10000.0,
4736 spinner1 = gtk_spin_button_new (adjustment, 1.0, 2);
4737 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
4738 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
4740 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4741 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4743 label = gtk_label_new ("Digits :");
4744 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4745 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4747 adjustment = gtk_adjustment_new (2, 1, 15, 1, 1, 0);
4748 spinner2 = gtk_spin_button_new (adjustment, 0.0, 0);
4749 g_signal_connect (adjustment, "value_changed",
4750 G_CALLBACK (change_digits),
4752 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
4754 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4755 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
4757 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
4758 g_signal_connect (button, "clicked",
4759 G_CALLBACK (toggle_snap),
4761 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4762 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4764 button = gtk_check_button_new_with_label ("Numeric only input mode");
4765 g_signal_connect (button, "clicked",
4766 G_CALLBACK (toggle_numeric),
4768 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4769 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4771 val_label = gtk_label_new ("");
4773 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4774 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4776 button = gtk_button_new_with_label ("Value as Int");
4777 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4778 g_signal_connect (button, "clicked",
4779 G_CALLBACK (get_value),
4780 GINT_TO_POINTER (1));
4781 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4783 button = gtk_button_new_with_label ("Value as Float");
4784 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4785 g_signal_connect (button, "clicked",
4786 G_CALLBACK (get_value),
4787 GINT_TO_POINTER (2));
4788 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4790 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
4791 gtk_label_set_text (GTK_LABEL (val_label), "0");
4793 frame = gtk_frame_new ("Using Convenience Constructor");
4794 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4796 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4797 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4798 gtk_container_add (GTK_CONTAINER (frame), hbox);
4800 val_label = gtk_label_new ("0.0");
4802 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
4803 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
4804 g_signal_connect (spinner, "value_changed",
4805 G_CALLBACK (get_spin_value), val_label);
4806 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
4807 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
4809 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4810 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
4812 button = gtk_button_new_with_label ("Close");
4813 g_signal_connect_swapped (button, "clicked",
4814 G_CALLBACK (gtk_widget_destroy),
4816 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4819 if (!gtk_widget_get_visible (window))
4820 gtk_widget_show_all (window);
4822 gtk_widget_destroy (window);
4831 cursor_draw (GtkWidget *widget,
4836 GtkStyleContext *context;
4839 width = gtk_widget_get_allocated_width (widget);
4840 height = gtk_widget_get_allocated_height (widget);
4842 cairo_set_source_rgb (cr, 1, 1, 1);
4843 cairo_rectangle (cr, 0, 0, width, height / 2);
4846 cairo_set_source_rgb (cr, 0, 0, 0);
4847 cairo_rectangle (cr, 0, height / 2, width, height / 2);
4850 context = gtk_widget_get_style_context (widget);
4851 gtk_style_context_get_background_color (context, GTK_STATE_FLAG_NORMAL, &bg);
4852 gdk_cairo_set_source_rgba (cr, &bg);
4853 cairo_rectangle (cr, width / 3, height / 3, width / 3, height / 3);
4860 set_cursor (GtkWidget *spinner,
4869 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
4872 label = g_object_get_data (G_OBJECT (spinner), "user_data");
4874 class = g_type_class_ref (GDK_TYPE_CURSOR_TYPE);
4875 vals = class->values;
4877 while (vals && vals->value != c)
4880 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
4882 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
4884 g_type_class_unref (class);
4886 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
4887 gdk_window_set_cursor (gtk_widget_get_window (widget),
4889 g_object_unref (cursor);
4893 cursor_event (GtkWidget *widget,
4895 GtkSpinButton *spinner)
4897 if ((event->type == GDK_BUTTON_PRESS) &&
4898 ((event->button.button == 1) ||
4899 (event->button.button == 3)))
4901 gtk_spin_button_spin (spinner, event->button.button == 1 ?
4902 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
4909 #ifdef GDK_WINDOWING_X11
4910 #include "x11/gdkx.h"
4913 change_cursor_theme (GtkWidget *widget,
4920 children = gtk_container_get_children (GTK_CONTAINER (data));
4922 theme = gtk_entry_get_text (GTK_ENTRY (children->next->data));
4923 size = (gint) gtk_spin_button_get_value (GTK_SPIN_BUTTON (children->next->next->data));
4925 g_list_free (children);
4927 gdk_x11_display_set_cursor_theme (gtk_widget_get_display (widget),
4934 create_cursors (GtkWidget *widget)
4936 static GtkWidget *window = NULL;
4939 GtkWidget *main_vbox;
4946 GtkAdjustment *adjustment;
4952 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4953 gtk_window_set_screen (GTK_WINDOW (window),
4954 gtk_widget_get_screen (widget));
4956 g_signal_connect (window, "destroy",
4957 G_CALLBACK (gtk_widget_destroyed),
4960 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
4962 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
4963 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
4964 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4967 g_object_new (GTK_TYPE_BOX,
4968 "orientation", GTK_ORIENTATION_VERTICAL,
4969 "GtkBox::homogeneous", FALSE,
4970 "GtkBox::spacing", 5,
4971 "GtkContainer::border_width", 10,
4972 "GtkWidget::parent", main_vbox,
4973 "GtkWidget::visible", TRUE,
4976 #ifdef GDK_WINDOWING_X11
4977 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4978 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4979 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
4981 label = gtk_label_new ("Cursor Theme : ");
4982 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4983 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
4985 entry = gtk_entry_new ();
4986 gtk_entry_set_text (GTK_ENTRY (entry), "default");
4987 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, TRUE, 0);
4989 size = gtk_spin_button_new_with_range (1.0, 64.0, 1.0);
4990 gtk_spin_button_set_value (GTK_SPIN_BUTTON (size), 24.0);
4991 gtk_box_pack_start (GTK_BOX (hbox), size, TRUE, TRUE, 0);
4993 g_signal_connect (entry, "changed",
4994 G_CALLBACK (change_cursor_theme), hbox);
4995 g_signal_connect (size, "changed",
4996 G_CALLBACK (change_cursor_theme), hbox);
4999 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
5000 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
5001 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5003 label = gtk_label_new ("Cursor Value : ");
5004 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5005 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5007 adjustment = gtk_adjustment_new (0,
5011 spinner = gtk_spin_button_new (adjustment, 0, 0);
5012 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
5015 g_object_new (gtk_frame_get_type (),
5016 "GtkFrame::label_xalign", 0.5,
5017 "GtkFrame::label", "Cursor Area",
5018 "GtkContainer::border_width", 10,
5019 "GtkWidget::parent", vbox,
5020 "GtkWidget::visible", TRUE,
5023 darea = gtk_drawing_area_new ();
5024 gtk_widget_set_size_request (darea, 80, 80);
5025 gtk_container_add (GTK_CONTAINER (frame), darea);
5026 g_signal_connect (darea,
5028 G_CALLBACK (cursor_draw),
5030 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
5031 g_signal_connect (darea,
5032 "button_press_event",
5033 G_CALLBACK (cursor_event),
5035 gtk_widget_show (darea);
5037 g_signal_connect (spinner, "changed",
5038 G_CALLBACK (set_cursor),
5041 label = g_object_new (GTK_TYPE_LABEL,
5046 gtk_container_child_set (GTK_CONTAINER (vbox), label,
5049 g_object_set_data (G_OBJECT (spinner), "user_data", label);
5051 any = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
5052 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
5054 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
5055 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
5056 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5058 button = gtk_button_new_with_label ("Close");
5059 g_signal_connect_swapped (button, "clicked",
5060 G_CALLBACK (gtk_widget_destroy),
5062 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5064 gtk_widget_show_all (window);
5066 set_cursor (spinner, darea);
5069 gtk_widget_destroy (window);
5077 color_selection_ok (GtkWidget *w,
5078 GtkColorSelectionDialog *cs)
5080 GtkWidget *colorsel;
5083 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5085 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5086 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5090 color_selection_changed (GtkWidget *w,
5091 GtkColorSelectionDialog *cs)
5093 GtkWidget *colorsel;
5096 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5097 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5098 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5103 opacity_toggled_cb (GtkWidget *w,
5104 GtkColorSelectionDialog *cs)
5106 GtkColorSelection *colorsel;
5108 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5109 gtk_color_selection_set_has_opacity_control (colorsel,
5110 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5114 palette_toggled_cb (GtkWidget *w,
5115 GtkColorSelectionDialog *cs)
5117 GtkColorSelection *colorsel;
5119 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5120 gtk_color_selection_set_has_palette (colorsel,
5121 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5126 create_color_selection (GtkWidget *widget)
5128 static GtkWidget *window = NULL;
5137 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5138 gtk_window_set_screen (GTK_WINDOW (window),
5139 gtk_widget_get_screen (widget));
5141 g_signal_connect (window, "destroy",
5142 G_CALLBACK (gtk_widget_destroyed),
5145 gtk_window_set_title (GTK_WINDOW (window), "GtkColorButton");
5146 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5148 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
5149 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5150 gtk_container_add (GTK_CONTAINER (window), hbox);
5152 label = gtk_label_new ("Pick a color");
5153 gtk_container_add (GTK_CONTAINER (hbox), label);
5155 picker = gtk_color_button_new ();
5156 gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (picker), TRUE);
5157 gtk_container_add (GTK_CONTAINER (hbox), picker);
5159 button = gtk_button_new_with_mnemonic ("_Props");
5160 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
5161 g_signal_connect (button, "clicked",
5162 G_CALLBACK (props_clicked),
5166 if (!gtk_widget_get_visible (window))
5167 gtk_widget_show_all (window);
5169 gtk_widget_destroy (window);
5173 flipping_toggled_cb (GtkWidget *widget, gpointer data)
5175 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
5176 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
5178 gtk_widget_set_default_direction (new_direction);
5182 orientable_toggle_orientation (GtkOrientable *orientable)
5184 GtkOrientation orientation;
5186 orientation = gtk_orientable_get_orientation (orientable);
5187 gtk_orientable_set_orientation (orientable,
5188 orientation == GTK_ORIENTATION_HORIZONTAL ?
5189 GTK_ORIENTATION_VERTICAL :
5190 GTK_ORIENTATION_HORIZONTAL);
5192 if (GTK_IS_CONTAINER (orientable))
5197 children = gtk_container_get_children (GTK_CONTAINER (orientable));
5199 for (child = children; child; child = child->next)
5201 if (GTK_IS_ORIENTABLE (child->data))
5202 orientable_toggle_orientation (child->data);
5205 g_list_free (children);
5210 flipping_orientation_toggled_cb (GtkWidget *widget, gpointer data)
5212 GtkWidget *content_area;
5213 GtkWidget *toplevel;
5215 toplevel = gtk_widget_get_toplevel (widget);
5216 content_area = gtk_dialog_get_content_area (GTK_DIALOG (toplevel));
5217 orientable_toggle_orientation (GTK_ORIENTABLE (content_area));
5221 set_direction_recurse (GtkWidget *widget,
5224 GtkTextDirection *dir = data;
5226 gtk_widget_set_direction (widget, *dir);
5227 if (GTK_IS_CONTAINER (widget))
5228 gtk_container_foreach (GTK_CONTAINER (widget),
5229 set_direction_recurse,
5234 create_forward_back (const char *title,
5235 GtkTextDirection text_dir)
5237 GtkWidget *frame = gtk_frame_new (title);
5238 GtkWidget *bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
5239 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
5240 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
5242 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
5244 gtk_container_add (GTK_CONTAINER (frame), bbox);
5245 gtk_container_add (GTK_CONTAINER (bbox), back_button);
5246 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
5248 set_direction_recurse (frame, &text_dir);
5254 create_flipping (GtkWidget *widget)
5256 static GtkWidget *window = NULL;
5257 GtkWidget *check_button, *button;
5258 GtkWidget *action_area, *content_area;
5262 window = gtk_dialog_new ();
5264 gtk_window_set_screen (GTK_WINDOW (window),
5265 gtk_widget_get_screen (widget));
5267 g_signal_connect (window, "destroy",
5268 G_CALLBACK (gtk_widget_destroyed),
5271 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5272 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
5274 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
5276 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
5277 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5278 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5280 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
5281 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
5283 g_signal_connect (check_button, "toggled",
5284 G_CALLBACK (flipping_toggled_cb), NULL);
5286 check_button = gtk_check_button_new_with_label ("Toggle orientation of all boxes");
5287 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5288 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5290 g_signal_connect (check_button, "toggled",
5291 G_CALLBACK (flipping_orientation_toggled_cb), NULL);
5293 gtk_box_pack_start (GTK_BOX (content_area),
5294 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
5297 gtk_box_pack_start (GTK_BOX (content_area),
5298 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
5301 gtk_box_pack_start (GTK_BOX (content_area),
5302 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
5305 button = gtk_button_new_with_label ("Close");
5306 g_signal_connect_swapped (button, "clicked",
5307 G_CALLBACK (gtk_widget_destroy), window);
5308 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5311 if (!gtk_widget_get_visible (window))
5312 gtk_widget_show_all (window);
5314 gtk_widget_destroy (window);
5322 make_focus_table (GList **list)
5327 table = gtk_table_new (5, 5, FALSE);
5340 widget = gtk_entry_new ();
5342 widget = gtk_button_new_with_label ("Foo");
5344 *list = g_list_prepend (*list, widget);
5346 gtk_table_attach (GTK_TABLE (table),
5350 GTK_EXPAND | GTK_FILL,
5351 GTK_EXPAND | GTK_FILL,
5360 *list = g_list_reverse (*list);
5366 create_focus (GtkWidget *widget)
5368 static GtkWidget *window = NULL;
5372 GtkWidget *content_area;
5377 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
5383 gtk_window_set_screen (GTK_WINDOW (window),
5384 gtk_widget_get_screen (widget));
5386 g_signal_connect (window, "destroy",
5387 G_CALLBACK (gtk_widget_destroyed),
5390 g_signal_connect (window, "response",
5391 G_CALLBACK (gtk_widget_destroy),
5394 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5396 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
5398 frame = gtk_frame_new ("Weird tab focus chain");
5400 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5402 table = make_focus_table (&list);
5404 gtk_container_add (GTK_CONTAINER (frame), table);
5406 gtk_container_set_focus_chain (GTK_CONTAINER (table),
5411 frame = gtk_frame_new ("Default tab focus chain");
5413 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5416 table = make_focus_table (&list);
5420 gtk_container_add (GTK_CONTAINER (frame), table);
5423 if (!gtk_widget_get_visible (window))
5424 gtk_widget_show_all (window);
5426 gtk_widget_destroy (window);
5434 font_selection_ok (GtkWidget *w,
5435 GtkFontSelectionDialog *fs)
5437 gchar *s = gtk_font_selection_dialog_get_font_name (fs);
5439 g_print ("%s\n", s);
5441 gtk_widget_destroy (GTK_WIDGET (fs));
5445 create_font_selection (GtkWidget *widget)
5447 static GtkWidget *window = NULL;
5455 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5456 gtk_window_set_screen (GTK_WINDOW (window),
5457 gtk_widget_get_screen (widget));
5459 g_signal_connect (window, "destroy",
5460 G_CALLBACK (gtk_widget_destroyed),
5463 gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
5464 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5466 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
5467 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5468 gtk_container_add (GTK_CONTAINER (window), hbox);
5470 label = gtk_label_new ("Pick a font");
5471 gtk_container_add (GTK_CONTAINER (hbox), label);
5473 picker = gtk_font_button_new ();
5474 gtk_font_button_set_use_font (GTK_FONT_BUTTON (picker), TRUE);
5475 gtk_container_add (GTK_CONTAINER (hbox), picker);
5478 if (!gtk_widget_get_visible (window))
5479 gtk_widget_show_all (window);
5481 gtk_widget_destroy (window);
5488 static GtkWidget *dialog_window = NULL;
5491 label_toggle (GtkWidget *widget,
5496 *label = gtk_label_new ("Dialog Test");
5497 g_signal_connect (*label,
5499 G_CALLBACK (gtk_widget_destroyed),
5501 g_object_set (*label, "margin", 10, NULL);
5502 gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog_window))),
5503 *label, TRUE, TRUE, 0);
5504 gtk_widget_show (*label);
5507 gtk_widget_destroy (*label);
5511 create_dialog (GtkWidget *widget)
5513 static GtkWidget *label;
5514 GtkWidget *action_area;
5519 /* This is a terrible example; it's much simpler to create
5520 * dialogs than this. Don't use testgtk for example code,
5524 dialog_window = gtk_dialog_new ();
5525 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5526 gtk_widget_get_screen (widget));
5528 g_signal_connect (dialog_window, "destroy",
5529 G_CALLBACK (gtk_widget_destroyed),
5532 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5534 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
5535 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5537 button = gtk_button_new_with_label ("OK");
5538 gtk_widget_set_can_default (button, TRUE);
5539 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5540 gtk_widget_grab_default (button);
5541 gtk_widget_show (button);
5543 button = gtk_button_new_with_label ("Toggle");
5544 g_signal_connect (button, "clicked",
5545 G_CALLBACK (label_toggle),
5547 gtk_widget_set_can_default (button, TRUE);
5548 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5549 gtk_widget_show (button);
5554 if (!gtk_widget_get_visible (dialog_window))
5555 gtk_widget_show (dialog_window);
5557 gtk_widget_destroy (dialog_window);
5560 /* Display & Screen test
5567 GtkWidget *radio_dpy;
5568 GtkWidget *toplevel;
5569 GtkWidget *dialog_window;
5570 } ScreenDisplaySelection;
5573 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
5575 const gchar *display_name;
5576 GdkDisplay *display = gtk_widget_get_display (widget);
5578 GdkScreen *new_screen = NULL;
5579 GdkScreen *current_screen = gtk_widget_get_screen (widget);
5581 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
5583 display_name = gtk_entry_get_text (GTK_ENTRY (data->entry));
5584 display = gdk_display_open (display_name);
5588 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
5589 GTK_DIALOG_DESTROY_WITH_PARENT,
5592 "The display :\n%s\ncannot be opened",
5594 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
5595 gtk_widget_show (dialog);
5596 g_signal_connect (dialog, "response",
5597 G_CALLBACK (gtk_widget_destroy),
5602 GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (data->combo));
5605 gboolean found = FALSE;
5606 while (gtk_tree_model_iter_nth_child (model, &iter, NULL, i++))
5609 gtk_tree_model_get (model, &iter, 0, &name, -1);
5610 found = !g_ascii_strcasecmp (display_name, name);
5617 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (data->combo), display_name);
5618 new_screen = gdk_display_get_default_screen (display);
5623 gint number_of_screens = gdk_display_get_n_screens (display);
5624 gint screen_num = gdk_screen_get_number (current_screen);
5625 if ((screen_num +1) < number_of_screens)
5626 new_screen = gdk_display_get_screen (display, screen_num + 1);
5628 new_screen = gdk_display_get_screen (display, 0);
5633 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
5634 gtk_widget_destroy (data->dialog_window);
5639 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
5641 gtk_widget_destroy (data);
5645 create_display_screen (GtkWidget *widget)
5647 GtkWidget *table, *frame, *window, *combo_dpy, *vbox;
5648 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
5650 ScreenDisplaySelection *scr_dpy_data;
5651 GdkScreen *screen = gtk_widget_get_screen (widget);
5652 GdkDisplay *display = gdk_screen_get_display (screen);
5654 window = g_object_new (gtk_window_get_type (),
5657 "type", GTK_WINDOW_TOPLEVEL,
5659 "Screen or Display selection",
5660 "border_width", 10, NULL);
5661 g_signal_connect (window, "destroy",
5662 G_CALLBACK (gtk_widget_destroy), NULL);
5664 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
5665 gtk_container_add (GTK_CONTAINER (window), vbox);
5667 frame = gtk_frame_new ("Select screen or display");
5668 gtk_container_add (GTK_CONTAINER (vbox), frame);
5670 table = gtk_table_new (2, 2, TRUE);
5671 gtk_table_set_row_spacings (GTK_TABLE (table), 3);
5672 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
5674 gtk_container_add (GTK_CONTAINER (frame), table);
5676 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
5677 if (gdk_display_get_n_screens(display) > 1)
5678 radio_scr = gtk_radio_button_new_with_label
5679 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
5682 radio_scr = gtk_radio_button_new_with_label
5683 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
5684 "only one screen on the current display");
5685 gtk_widget_set_sensitive (radio_scr, FALSE);
5687 combo_dpy = gtk_combo_box_text_new_with_entry ();
5688 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_dpy), "diabolo:0.0");
5689 gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (combo_dpy))),
5690 "<hostname>:<X Server Num>.<Screen Num>");
5692 gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1);
5693 gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2);
5694 gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1);
5696 bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
5697 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
5698 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
5700 gtk_container_add (GTK_CONTAINER (vbox), bbox);
5702 gtk_container_add (GTK_CONTAINER (bbox), applyb);
5703 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
5705 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
5707 scr_dpy_data->entry = gtk_bin_get_child (GTK_BIN (combo_dpy));
5708 scr_dpy_data->radio_dpy = radio_dpy;
5709 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
5710 scr_dpy_data->dialog_window = window;
5712 g_signal_connect (cancelb, "clicked",
5713 G_CALLBACK (screen_display_destroy_diag), window);
5714 g_signal_connect (applyb, "clicked",
5715 G_CALLBACK (screen_display_check), scr_dpy_data);
5716 gtk_widget_show_all (window);
5721 static gulong event_watcher_enter_id = 0;
5722 static gulong event_watcher_leave_id = 0;
5725 event_watcher (GSignalInvocationHint *ihint,
5726 guint n_param_values,
5727 const GValue *param_values,
5730 g_print ("Watch: \"%s\" emitted for %s\n",
5731 g_signal_name (ihint->signal_id),
5732 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
5738 event_watcher_down (void)
5740 if (event_watcher_enter_id)
5744 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5745 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
5746 event_watcher_enter_id = 0;
5747 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5748 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
5749 event_watcher_leave_id = 0;
5754 event_watcher_toggle (void)
5756 if (event_watcher_enter_id)
5757 event_watcher_down ();
5762 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5763 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5764 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5765 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5770 create_event_watcher (GtkWidget *widget)
5772 GtkWidget *action_area, *content_area;
5777 dialog_window = gtk_dialog_new ();
5778 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5779 gtk_widget_get_screen (widget));
5781 g_signal_connect (dialog_window, "destroy",
5782 G_CALLBACK (gtk_widget_destroyed),
5784 g_signal_connect (dialog_window, "destroy",
5785 G_CALLBACK (event_watcher_down),
5788 content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog_window));
5789 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5791 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
5792 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5793 gtk_widget_set_size_request (dialog_window, 200, 110);
5795 button = gtk_toggle_button_new_with_label ("Activate Watch");
5796 g_signal_connect (button, "clicked",
5797 G_CALLBACK (event_watcher_toggle),
5799 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
5800 gtk_box_pack_start (GTK_BOX (content_area), button, TRUE, TRUE, 0);
5801 gtk_widget_show (button);
5803 button = gtk_button_new_with_label ("Close");
5804 g_signal_connect_swapped (button, "clicked",
5805 G_CALLBACK (gtk_widget_destroy),
5807 gtk_widget_set_can_default (button, TRUE);
5808 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5809 gtk_widget_grab_default (button);
5810 gtk_widget_show (button);
5813 if (!gtk_widget_get_visible (dialog_window))
5814 gtk_widget_show (dialog_window);
5816 gtk_widget_destroy (dialog_window);
5824 reformat_value (GtkScale *scale,
5827 return g_strdup_printf ("-->%0.*g<--",
5828 gtk_scale_get_digits (scale), value);
5832 create_range_controls (GtkWidget *widget)
5834 static GtkWidget *window = NULL;
5838 GtkWidget *scrollbar;
5840 GtkWidget *separator;
5841 GtkAdjustment *adjustment;
5846 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5848 gtk_window_set_screen (GTK_WINDOW (window),
5849 gtk_widget_get_screen (widget));
5851 g_signal_connect (window, "destroy",
5852 G_CALLBACK (gtk_widget_destroyed),
5855 gtk_window_set_title (GTK_WINDOW (window), "range controls");
5856 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5859 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
5860 gtk_container_add (GTK_CONTAINER (window), box1);
5861 gtk_widget_show (box1);
5864 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
5865 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5866 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
5867 gtk_widget_show (box2);
5870 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
5872 scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5873 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
5874 gtk_scale_set_digits (GTK_SCALE (scale), 1);
5875 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5876 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
5877 gtk_widget_show (scale);
5879 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5880 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
5881 gtk_widget_show (scrollbar);
5883 scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5884 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5885 g_signal_connect (scale,
5887 G_CALLBACK (reformat_value),
5889 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
5890 gtk_widget_show (scale);
5892 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
5894 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5895 gtk_widget_set_size_request (scale, -1, 200);
5896 gtk_scale_set_digits (GTK_SCALE (scale), 2);
5897 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5898 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5899 gtk_widget_show (scale);
5901 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5902 gtk_widget_set_size_request (scale, -1, 200);
5903 gtk_scale_set_digits (GTK_SCALE (scale), 2);
5904 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5905 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
5906 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5907 gtk_widget_show (scale);
5909 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5910 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5911 g_signal_connect (scale,
5913 G_CALLBACK (reformat_value),
5915 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5916 gtk_widget_show (scale);
5919 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
5920 gtk_widget_show (hbox);
5922 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
5923 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
5924 gtk_widget_show (separator);
5927 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
5928 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5929 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
5930 gtk_widget_show (box2);
5933 button = gtk_button_new_with_label ("close");
5934 g_signal_connect_swapped (button, "clicked",
5935 G_CALLBACK (gtk_widget_destroy),
5937 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
5938 gtk_widget_set_can_default (button, TRUE);
5939 gtk_widget_grab_default (button);
5940 gtk_widget_show (button);
5943 if (!gtk_widget_get_visible (window))
5944 gtk_widget_show (window);
5946 gtk_widget_destroy (window);
5953 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
5954 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
5955 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
5956 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
5957 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
5958 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
5959 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
5960 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
5963 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
5969 static const char * book_open_xpm[] = {
5992 static const char * book_closed_xpm[] = {
6017 GdkPixbuf *book_open;
6018 GdkPixbuf *book_closed;
6019 GtkWidget *sample_notebook;
6022 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
6024 GtkWidget *page_widget;
6027 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
6029 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
6030 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6032 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
6033 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6037 page_switch (GtkWidget *widget, gpointer *page, gint page_num)
6039 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
6040 gint old_page_num = gtk_notebook_get_current_page (notebook);
6042 if (page_num == old_page_num)
6045 set_page_image (notebook, page_num, book_open);
6047 if (old_page_num != -1)
6048 set_page_image (notebook, old_page_num, book_closed);
6052 tab_fill (GtkToggleButton *button, GtkWidget *child)
6054 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
6055 "tab-fill", gtk_toggle_button_get_active (button),
6060 tab_expand (GtkToggleButton *button, GtkWidget *child)
6062 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
6063 "tab-expand", gtk_toggle_button_get_active (button),
6068 create_pages (GtkNotebook *notebook, gint start, gint end)
6070 GtkWidget *child = NULL;
6075 GtkWidget *label_box;
6076 GtkWidget *menu_box;
6080 char accel_buffer[32];
6082 for (i = start; i <= end; i++)
6084 sprintf (buffer, "Page %d", i);
6085 sprintf (accel_buffer, "Page _%d", i);
6087 child = gtk_frame_new (buffer);
6088 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
6090 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6091 gtk_box_set_homogeneous (GTK_BOX (vbox), TRUE);
6092 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
6093 gtk_container_add (GTK_CONTAINER (child), vbox);
6095 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6096 gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE);
6097 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
6099 button = gtk_check_button_new_with_label ("Fill Tab");
6100 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6101 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
6102 g_signal_connect (button, "toggled",
6103 G_CALLBACK (tab_fill), child);
6105 button = gtk_check_button_new_with_label ("Expand Tab");
6106 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6107 g_signal_connect (button, "toggled",
6108 G_CALLBACK (tab_expand), child);
6110 button = gtk_button_new_with_label ("Hide Page");
6111 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
6112 g_signal_connect_swapped (button, "clicked",
6113 G_CALLBACK (gtk_widget_hide),
6116 gtk_widget_show_all (child);
6118 label_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6119 pixwid = gtk_image_new_from_pixbuf (book_closed);
6120 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
6122 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
6123 gtk_widget_set_margin_left (pixwid, 3);
6124 gtk_widget_set_margin_right (pixwid, 3);
6125 gtk_widget_set_margin_bottom (pixwid, 1);
6126 gtk_widget_set_margin_top (pixwid, 1);
6127 label = gtk_label_new_with_mnemonic (accel_buffer);
6128 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
6129 gtk_widget_show_all (label_box);
6132 menu_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6133 pixwid = gtk_image_new_from_pixbuf (book_closed);
6134 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
6136 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
6137 gtk_widget_set_margin_left (pixwid, 3);
6138 gtk_widget_set_margin_right (pixwid, 3);
6139 gtk_widget_set_margin_bottom (pixwid, 1);
6140 gtk_widget_set_margin_top (pixwid, 1);
6141 label = gtk_label_new (buffer);
6142 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
6143 gtk_widget_show_all (menu_box);
6145 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
6150 rotate_notebook (GtkButton *button,
6151 GtkNotebook *notebook)
6153 gtk_notebook_set_tab_pos (notebook, (gtk_notebook_get_tab_pos (notebook) + 1) % 4);
6157 show_all_pages (GtkButton *button,
6158 GtkNotebook *notebook)
6160 gtk_container_foreach (GTK_CONTAINER (notebook),
6161 (GtkCallback) gtk_widget_show, NULL);
6165 notebook_type_changed (GtkWidget *optionmenu,
6168 GtkNotebook *notebook;
6178 notebook = GTK_NOTEBOOK (data);
6180 c = gtk_combo_box_get_active (GTK_COMBO_BOX (optionmenu));
6185 /* standard notebook */
6186 gtk_notebook_set_show_tabs (notebook, TRUE);
6187 gtk_notebook_set_show_border (notebook, TRUE);
6188 gtk_notebook_set_scrollable (notebook, FALSE);
6192 /* notabs notebook */
6193 gtk_notebook_set_show_tabs (notebook, FALSE);
6194 gtk_notebook_set_show_border (notebook, TRUE);
6199 gtk_notebook_set_show_tabs (notebook, FALSE);
6200 gtk_notebook_set_show_border (notebook, FALSE);
6205 gtk_notebook_set_show_tabs (notebook, TRUE);
6206 gtk_notebook_set_show_border (notebook, TRUE);
6207 gtk_notebook_set_scrollable (notebook, TRUE);
6208 if (gtk_notebook_get_n_pages (notebook) == 5)
6209 create_pages (notebook, 6, 15);
6215 if (gtk_notebook_get_n_pages (notebook) == 15)
6216 for (i = 0; i < 10; i++)
6217 gtk_notebook_remove_page (notebook, 5);
6221 notebook_popup (GtkToggleButton *button,
6222 GtkNotebook *notebook)
6224 if (gtk_toggle_button_get_active (button))
6225 gtk_notebook_popup_enable (notebook);
6227 gtk_notebook_popup_disable (notebook);
6231 create_notebook (GtkWidget *widget)
6233 static GtkWidget *window = NULL;
6237 GtkWidget *separator;
6241 static gchar *items[] =
6251 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6252 gtk_window_set_screen (GTK_WINDOW (window),
6253 gtk_widget_get_screen (widget));
6255 g_signal_connect (window, "destroy",
6256 G_CALLBACK (gtk_widget_destroyed),
6259 gtk_window_set_title (GTK_WINDOW (window), "notebook");
6260 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6262 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6263 gtk_container_add (GTK_CONTAINER (window), box1);
6265 sample_notebook = gtk_notebook_new ();
6266 g_signal_connect (sample_notebook, "switch_page",
6267 G_CALLBACK (page_switch), NULL);
6268 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
6269 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
6270 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
6272 gtk_widget_realize (sample_notebook);
6275 book_open = gdk_pixbuf_new_from_xpm_data (book_open_xpm);
6278 book_closed = gdk_pixbuf_new_from_xpm_data (book_closed_xpm);
6280 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
6282 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
6283 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
6285 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
6286 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6287 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6289 button = gtk_check_button_new_with_label ("popup menu");
6290 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
6291 g_signal_connect (button, "clicked",
6292 G_CALLBACK (notebook_popup),
6295 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
6296 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6297 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6299 label = gtk_label_new ("Notebook Style :");
6300 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
6302 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
6303 notebook_type_changed,
6305 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
6307 button = gtk_button_new_with_label ("Show all Pages");
6308 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
6309 g_signal_connect (button, "clicked",
6310 G_CALLBACK (show_all_pages), sample_notebook);
6312 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
6313 gtk_box_set_homogeneous (GTK_BOX (box2), TRUE);
6314 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6315 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6317 button = gtk_button_new_with_label ("prev");
6318 g_signal_connect_swapped (button, "clicked",
6319 G_CALLBACK (gtk_notebook_prev_page),
6321 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6323 button = gtk_button_new_with_label ("next");
6324 g_signal_connect_swapped (button, "clicked",
6325 G_CALLBACK (gtk_notebook_next_page),
6327 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6329 button = gtk_button_new_with_label ("rotate");
6330 g_signal_connect (button, "clicked",
6331 G_CALLBACK (rotate_notebook), sample_notebook);
6332 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6334 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
6335 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
6337 button = gtk_button_new_with_label ("close");
6338 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
6339 g_signal_connect_swapped (button, "clicked",
6340 G_CALLBACK (gtk_widget_destroy),
6342 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
6343 gtk_widget_set_can_default (button, TRUE);
6344 gtk_widget_grab_default (button);
6347 if (!gtk_widget_get_visible (window))
6348 gtk_widget_show_all (window);
6350 gtk_widget_destroy (window);
6358 toggle_resize (GtkWidget *widget, GtkWidget *child)
6360 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6361 GValue value = { 0, };
6362 g_value_init (&value, G_TYPE_BOOLEAN);
6363 gtk_container_child_get_property (container, child, "resize", &value);
6364 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6365 gtk_container_child_set_property (container, child, "resize", &value);
6369 toggle_shrink (GtkWidget *widget, GtkWidget *child)
6371 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6372 GValue value = { 0, };
6373 g_value_init (&value, G_TYPE_BOOLEAN);
6374 gtk_container_child_get_property (container, child, "shrink", &value);
6375 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6376 gtk_container_child_set_property (container, child, "shrink", &value);
6380 paned_props_clicked (GtkWidget *button,
6383 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
6385 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
6389 create_pane_options (GtkPaned *paned,
6390 const gchar *frame_label,
6391 const gchar *label1,
6392 const gchar *label2)
6394 GtkWidget *child1, *child2;
6399 GtkWidget *check_button;
6401 child1 = gtk_paned_get_child1 (paned);
6402 child2 = gtk_paned_get_child2 (paned);
6404 frame = gtk_frame_new (frame_label);
6405 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
6407 table = gtk_table_new (4, 2, 4);
6408 gtk_container_add (GTK_CONTAINER (frame), table);
6410 label = gtk_label_new (label1);
6411 gtk_table_attach_defaults (GTK_TABLE (table), label,
6414 check_button = gtk_check_button_new_with_label ("Resize");
6415 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6417 g_signal_connect (check_button, "toggled",
6418 G_CALLBACK (toggle_resize),
6421 check_button = gtk_check_button_new_with_label ("Shrink");
6422 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6424 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6426 g_signal_connect (check_button, "toggled",
6427 G_CALLBACK (toggle_shrink),
6430 label = gtk_label_new (label2);
6431 gtk_table_attach_defaults (GTK_TABLE (table), label,
6434 check_button = gtk_check_button_new_with_label ("Resize");
6435 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6437 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6439 g_signal_connect (check_button, "toggled",
6440 G_CALLBACK (toggle_resize),
6443 check_button = gtk_check_button_new_with_label ("Shrink");
6444 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6446 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6448 g_signal_connect (check_button, "toggled",
6449 G_CALLBACK (toggle_shrink),
6452 button = gtk_button_new_with_mnemonic ("_Properties");
6453 gtk_table_attach_defaults (GTK_TABLE (table), button,
6455 g_signal_connect (button, "clicked",
6456 G_CALLBACK (paned_props_clicked),
6463 create_panes (GtkWidget *widget)
6465 static GtkWidget *window = NULL;
6474 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6476 gtk_window_set_screen (GTK_WINDOW (window),
6477 gtk_widget_get_screen (widget));
6479 g_signal_connect (window, "destroy",
6480 G_CALLBACK (gtk_widget_destroyed),
6483 gtk_window_set_title (GTK_WINDOW (window), "Panes");
6484 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6486 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6487 gtk_container_add (GTK_CONTAINER (window), vbox);
6489 vpaned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6490 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
6491 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
6493 hpaned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6494 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
6496 frame = gtk_frame_new (NULL);
6497 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6498 gtk_widget_set_size_request (frame, 60, 60);
6499 gtk_paned_add1 (GTK_PANED (hpaned), frame);
6501 button = gtk_button_new_with_label ("Hi there");
6502 gtk_container_add (GTK_CONTAINER(frame), button);
6504 frame = gtk_frame_new (NULL);
6505 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6506 gtk_widget_set_size_request (frame, 80, 60);
6507 gtk_paned_add2 (GTK_PANED (hpaned), frame);
6509 frame = gtk_frame_new (NULL);
6510 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6511 gtk_widget_set_size_request (frame, 60, 80);
6512 gtk_paned_add2 (GTK_PANED (vpaned), frame);
6514 /* Now create toggle buttons to control sizing */
6516 gtk_box_pack_start (GTK_BOX (vbox),
6517 create_pane_options (GTK_PANED (hpaned),
6523 gtk_box_pack_start (GTK_BOX (vbox),
6524 create_pane_options (GTK_PANED (vpaned),
6530 gtk_widget_show_all (vbox);
6533 if (!gtk_widget_get_visible (window))
6534 gtk_widget_show (window);
6536 gtk_widget_destroy (window);
6540 * Paned keyboard navigation
6544 paned_keyboard_window1 (GtkWidget *widget)
6567 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6568 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
6569 gtk_window_set_screen (GTK_WINDOW (window1),
6570 gtk_widget_get_screen (widget));
6572 hpaned1 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6573 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
6575 frame1 = gtk_frame_new (NULL);
6576 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
6577 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
6579 vbox1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6580 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
6582 button7 = gtk_button_new_with_label ("button7");
6583 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
6585 button8 = gtk_button_new_with_label ("button8");
6586 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
6588 button9 = gtk_button_new_with_label ("button9");
6589 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
6591 vpaned1 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6592 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
6594 frame2 = gtk_frame_new (NULL);
6595 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
6596 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
6598 frame5 = gtk_frame_new (NULL);
6599 gtk_container_add (GTK_CONTAINER (frame2), frame5);
6601 hbox1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6602 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
6604 button5 = gtk_button_new_with_label ("button5");
6605 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
6607 button6 = gtk_button_new_with_label ("button6");
6608 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
6610 frame3 = gtk_frame_new (NULL);
6611 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
6612 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
6614 frame4 = gtk_frame_new ("Buttons");
6615 gtk_container_add (GTK_CONTAINER (frame3), frame4);
6616 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
6618 table1 = gtk_table_new (2, 2, FALSE);
6619 gtk_container_add (GTK_CONTAINER (frame4), table1);
6620 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
6622 button1 = gtk_button_new_with_label ("button1");
6623 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
6624 (GtkAttachOptions) (GTK_FILL),
6625 (GtkAttachOptions) (0), 0, 0);
6627 button2 = gtk_button_new_with_label ("button2");
6628 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
6629 (GtkAttachOptions) (GTK_FILL),
6630 (GtkAttachOptions) (0), 0, 0);
6632 button3 = gtk_button_new_with_label ("button3");
6633 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
6634 (GtkAttachOptions) (GTK_FILL),
6635 (GtkAttachOptions) (0), 0, 0);
6637 button4 = gtk_button_new_with_label ("button4");
6638 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
6639 (GtkAttachOptions) (GTK_FILL),
6640 (GtkAttachOptions) (0), 0, 0);
6646 paned_keyboard_window2 (GtkWidget *widget)
6651 GtkWidget *button13;
6655 GtkWidget *button12;
6657 GtkWidget *button11;
6658 GtkWidget *button10;
6660 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6661 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
6663 gtk_window_set_screen (GTK_WINDOW (window2),
6664 gtk_widget_get_screen (widget));
6666 hpaned2 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6667 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
6669 frame6 = gtk_frame_new (NULL);
6670 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
6671 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
6673 button13 = gtk_button_new_with_label ("button13");
6674 gtk_container_add (GTK_CONTAINER (frame6), button13);
6676 hbox2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6677 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
6679 vpaned2 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6680 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
6682 frame7 = gtk_frame_new (NULL);
6683 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
6684 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
6686 button12 = gtk_button_new_with_label ("button12");
6687 gtk_container_add (GTK_CONTAINER (frame7), button12);
6689 frame8 = gtk_frame_new (NULL);
6690 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
6691 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
6693 button11 = gtk_button_new_with_label ("button11");
6694 gtk_container_add (GTK_CONTAINER (frame8), button11);
6696 button10 = gtk_button_new_with_label ("button10");
6697 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
6703 paned_keyboard_window3 (GtkWidget *widget)
6710 GtkWidget *button14;
6713 GtkWidget *button15;
6716 GtkWidget *button16;
6718 GtkWidget *button17;
6720 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6721 g_object_set_data (G_OBJECT (window3), "window3", window3);
6722 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
6724 gtk_window_set_screen (GTK_WINDOW (window3),
6725 gtk_widget_get_screen (widget));
6728 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6729 gtk_container_add (GTK_CONTAINER (window3), vbox2);
6731 label1 = gtk_label_new ("Three panes nested inside each other");
6732 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
6734 hpaned3 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6735 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
6737 frame9 = gtk_frame_new (NULL);
6738 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
6739 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
6741 button14 = gtk_button_new_with_label ("button14");
6742 gtk_container_add (GTK_CONTAINER (frame9), button14);
6744 hpaned4 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6745 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
6747 frame10 = gtk_frame_new (NULL);
6748 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
6749 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
6751 button15 = gtk_button_new_with_label ("button15");
6752 gtk_container_add (GTK_CONTAINER (frame10), button15);
6754 hpaned5 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6755 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
6757 frame11 = gtk_frame_new (NULL);
6758 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
6759 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
6761 button16 = gtk_button_new_with_label ("button16");
6762 gtk_container_add (GTK_CONTAINER (frame11), button16);
6764 frame12 = gtk_frame_new (NULL);
6765 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
6766 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
6768 button17 = gtk_button_new_with_label ("button17");
6769 gtk_container_add (GTK_CONTAINER (frame12), button17);
6775 paned_keyboard_window4 (GtkWidget *widget)
6782 GtkWidget *button19;
6783 GtkWidget *button18;
6786 GtkWidget *button21;
6787 GtkWidget *button20;
6789 GtkWidget *button23;
6790 GtkWidget *button22;
6792 GtkWidget *button25;
6793 GtkWidget *button24;
6795 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6796 g_object_set_data (G_OBJECT (window4), "window4", window4);
6797 gtk_window_set_title (GTK_WINDOW (window4), "window4");
6799 gtk_window_set_screen (GTK_WINDOW (window4),
6800 gtk_widget_get_screen (widget));
6802 vbox3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6803 gtk_container_add (GTK_CONTAINER (window4), vbox3);
6805 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
6806 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
6807 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
6809 hpaned6 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6810 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
6812 vpaned3 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6813 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
6815 button19 = gtk_button_new_with_label ("button19");
6816 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
6818 button18 = gtk_button_new_with_label ("button18");
6819 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
6821 hbox3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6822 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
6824 vpaned4 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6825 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
6827 button21 = gtk_button_new_with_label ("button21");
6828 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
6830 button20 = gtk_button_new_with_label ("button20");
6831 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
6833 vpaned5 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6834 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
6836 button23 = gtk_button_new_with_label ("button23");
6837 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
6839 button22 = gtk_button_new_with_label ("button22");
6840 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
6842 vpaned6 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6843 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
6845 button25 = gtk_button_new_with_label ("button25");
6846 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
6848 button24 = gtk_button_new_with_label ("button24");
6849 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
6855 create_paned_keyboard_navigation (GtkWidget *widget)
6857 static GtkWidget *window1 = NULL;
6858 static GtkWidget *window2 = NULL;
6859 static GtkWidget *window3 = NULL;
6860 static GtkWidget *window4 = NULL;
6863 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
6865 gtk_widget_destroy (window1);
6866 gtk_widget_destroy (window2);
6867 gtk_widget_destroy (window3);
6868 gtk_widget_destroy (window4);
6873 window1 = paned_keyboard_window1 (widget);
6874 g_signal_connect (window1, "destroy",
6875 G_CALLBACK (gtk_widget_destroyed),
6881 window2 = paned_keyboard_window2 (widget);
6882 g_signal_connect (window2, "destroy",
6883 G_CALLBACK (gtk_widget_destroyed),
6889 window3 = paned_keyboard_window3 (widget);
6890 g_signal_connect (window3, "destroy",
6891 G_CALLBACK (gtk_widget_destroyed),
6897 window4 = paned_keyboard_window4 (widget);
6898 g_signal_connect (window4, "destroy",
6899 G_CALLBACK (gtk_widget_destroyed),
6903 if (gtk_widget_get_visible (window1))
6904 gtk_widget_destroy (GTK_WIDGET (window1));
6906 gtk_widget_show_all (GTK_WIDGET (window1));
6908 if (gtk_widget_get_visible (window2))
6909 gtk_widget_destroy (GTK_WIDGET (window2));
6911 gtk_widget_show_all (GTK_WIDGET (window2));
6913 if (gtk_widget_get_visible (window3))
6914 gtk_widget_destroy (GTK_WIDGET (window3));
6916 gtk_widget_show_all (GTK_WIDGET (window3));
6918 if (gtk_widget_get_visible (window4))
6919 gtk_widget_destroy (GTK_WIDGET (window4));
6921 gtk_widget_show_all (GTK_WIDGET (window4));
6929 typedef struct _cursoroffset {gint x,y;} CursorOffset;
6932 shape_pressed (GtkWidget *widget, GdkEventButton *event)
6936 /* ignore double and triple click */
6937 if (event->type != GDK_BUTTON_PRESS)
6940 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
6941 p->x = (int) event->x;
6942 p->y = (int) event->y;
6944 gtk_grab_add (widget);
6945 gdk_device_grab (gdk_event_get_device ((GdkEvent*)event),
6946 gtk_widget_get_window (widget),
6949 GDK_BUTTON_RELEASE_MASK |
6950 GDK_BUTTON_MOTION_MASK |
6951 GDK_POINTER_MOTION_HINT_MASK,
6957 shape_released (GtkWidget *widget,
6958 GdkEventButton *event)
6960 gtk_grab_remove (widget);
6961 gdk_device_ungrab (gdk_event_get_device ((GdkEvent*)event), event->time);
6965 shape_motion (GtkWidget *widget,
6966 GdkEventMotion *event)
6970 GdkModifierType mask;
6972 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
6975 * Can't use event->x / event->y here
6976 * because I need absolute coordinates.
6978 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
6979 gtk_window_move (GTK_WINDOW (widget), xp - p->x, yp - p->y);
6983 shape_create_icon (GdkScreen *screen,
6994 CursorOffset* icon_pos;
6995 cairo_surface_t *mask;
6996 cairo_region_t *mask_region;
7001 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
7003 window = gtk_window_new (window_type);
7004 gtk_window_set_screen (GTK_WINDOW (window), screen);
7006 fixed = gtk_fixed_new ();
7007 gtk_widget_set_size_request (fixed, 100, 100);
7008 gtk_container_add (GTK_CONTAINER (window), fixed);
7009 gtk_widget_show (fixed);
7011 gtk_widget_set_events (window,
7012 gtk_widget_get_events (window) |
7013 GDK_BUTTON_MOTION_MASK |
7014 GDK_POINTER_MOTION_HINT_MASK |
7015 GDK_BUTTON_PRESS_MASK);
7017 gtk_widget_realize (window);
7019 pixbuf = gdk_pixbuf_new_from_file (xpm_file, NULL);
7020 g_assert (pixbuf); /* FIXME: error handling */
7022 mask = cairo_image_surface_create (CAIRO_FORMAT_A1,
7023 gdk_pixbuf_get_width (pixbuf),
7024 gdk_pixbuf_get_height (pixbuf));
7025 cr = cairo_create (mask);
7026 gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
7030 mask_region = gdk_cairo_region_create_from_surface (mask);
7032 cairo_region_translate (mask_region, px, py);
7034 image = gtk_image_new_from_pixbuf (pixbuf);
7035 gtk_fixed_put (GTK_FIXED (fixed), image, px,py);
7036 gtk_widget_show (image);
7038 gtk_widget_shape_combine_region (window, mask_region);
7040 cairo_region_destroy (mask_region);
7041 cairo_surface_destroy (mask);
7042 g_object_unref (pixbuf);
7044 g_signal_connect (window, "button_press_event",
7045 G_CALLBACK (shape_pressed), NULL);
7046 g_signal_connect (window, "button_release_event",
7047 G_CALLBACK (shape_released), NULL);
7048 g_signal_connect (window, "motion_notify_event",
7049 G_CALLBACK (shape_motion), NULL);
7051 icon_pos = g_new (CursorOffset, 1);
7052 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
7054 gtk_window_move (GTK_WINDOW (window), x, y);
7055 gtk_widget_show (window);
7061 create_shapes (GtkWidget *widget)
7063 /* Variables used by the Drag/Drop and Shape Window demos */
7064 static GtkWidget *modeller = NULL;
7065 static GtkWidget *sheets = NULL;
7066 static GtkWidget *rings = NULL;
7067 static GtkWidget *with_region = NULL;
7068 GdkScreen *screen = gtk_widget_get_screen (widget);
7070 if (!(file_exists ("Modeller.xpm") &&
7071 file_exists ("FilesQueue.xpm") &&
7072 file_exists ("3DRings.xpm")))
7078 modeller = shape_create_icon (screen, "Modeller.xpm",
7079 440, 140, 0,0, GTK_WINDOW_POPUP);
7081 g_signal_connect (modeller, "destroy",
7082 G_CALLBACK (gtk_widget_destroyed),
7086 gtk_widget_destroy (modeller);
7090 sheets = shape_create_icon (screen, "FilesQueue.xpm",
7091 580, 170, 0,0, GTK_WINDOW_POPUP);
7093 g_signal_connect (sheets, "destroy",
7094 G_CALLBACK (gtk_widget_destroyed),
7099 gtk_widget_destroy (sheets);
7103 rings = shape_create_icon (screen, "3DRings.xpm",
7104 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7106 g_signal_connect (rings, "destroy",
7107 G_CALLBACK (gtk_widget_destroyed),
7111 gtk_widget_destroy (rings);
7115 cairo_region_t *region;
7118 with_region = shape_create_icon (screen, "3DRings.xpm",
7119 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7121 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
7123 g_signal_connect (with_region, "destroy",
7124 G_CALLBACK (gtk_widget_destroyed),
7127 /* reset shape from mask to a region */
7130 region = cairo_region_create ();
7142 cairo_region_union_rectangle (region, &rect);
7150 gdk_window_shape_combine_region (gtk_widget_get_window (with_region),
7155 gtk_widget_destroy (with_region);
7163 create_wmhints (GtkWidget *widget)
7165 static GtkWidget *window = NULL;
7167 GtkWidget *separator;
7171 GdkWindow *gdk_window;
7177 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7179 gtk_window_set_screen (GTK_WINDOW (window),
7180 gtk_widget_get_screen (widget));
7182 g_signal_connect (window, "destroy",
7183 G_CALLBACK (gtk_widget_destroyed),
7186 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
7187 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7189 gtk_widget_realize (window);
7191 gdk_window = gtk_widget_get_window (window);
7193 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
7194 list = g_list_prepend (NULL, pixbuf);
7196 gdk_window_set_icon_list (gdk_window, list);
7199 g_object_unref (pixbuf);
7201 gdk_window_set_icon_name (gdk_window, "WMHints Test Icon");
7203 gdk_window_set_decorations (gdk_window, GDK_DECOR_ALL | GDK_DECOR_MENU);
7204 gdk_window_set_functions (gdk_window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
7206 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7207 gtk_container_add (GTK_CONTAINER (window), box1);
7208 gtk_widget_show (box1);
7210 label = gtk_label_new ("Try iconizing me!");
7211 gtk_widget_set_size_request (label, 150, 50);
7212 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
7213 gtk_widget_show (label);
7216 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
7217 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
7218 gtk_widget_show (separator);
7221 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
7222 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7223 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7224 gtk_widget_show (box2);
7227 button = gtk_button_new_with_label ("close");
7229 g_signal_connect_swapped (button, "clicked",
7230 G_CALLBACK (gtk_widget_destroy),
7233 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7234 gtk_widget_set_can_default (button, TRUE);
7235 gtk_widget_grab_default (button);
7236 gtk_widget_show (button);
7239 if (!gtk_widget_get_visible (window))
7240 gtk_widget_show (window);
7242 gtk_widget_destroy (window);
7247 * Window state tracking
7251 window_state_callback (GtkWidget *widget,
7252 GdkEventWindowState *event,
7255 GtkWidget *label = data;
7258 msg = g_strconcat (gtk_window_get_title (GTK_WINDOW (widget)), ": ",
7259 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
7260 "withdrawn" : "not withdrawn", ", ",
7261 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
7262 "iconified" : "not iconified", ", ",
7263 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
7264 "sticky" : "not sticky", ", ",
7265 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
7266 "maximized" : "not maximized", ", ",
7267 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
7268 "fullscreen" : "not fullscreen",
7269 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
7270 "above" : "not above", ", ",
7271 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
7272 "below" : "not below", ", ",
7275 gtk_label_set_text (GTK_LABEL (label), msg);
7283 tracking_label (GtkWidget *window)
7289 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
7291 g_signal_connect_object (hbox,
7293 G_CALLBACK (gtk_widget_destroy),
7297 label = gtk_label_new ("<no window state events received>");
7298 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
7299 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
7301 g_signal_connect (window,
7302 "window_state_event",
7303 G_CALLBACK (window_state_callback),
7306 button = gtk_button_new_with_label ("Deiconify");
7307 g_signal_connect_object (button,
7309 G_CALLBACK (gtk_window_deiconify),
7312 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7314 button = gtk_button_new_with_label ("Iconify");
7315 g_signal_connect_object (button,
7317 G_CALLBACK (gtk_window_iconify),
7320 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7322 button = gtk_button_new_with_label ("Fullscreen");
7323 g_signal_connect_object (button,
7325 G_CALLBACK (gtk_window_fullscreen),
7328 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7330 button = gtk_button_new_with_label ("Unfullscreen");
7331 g_signal_connect_object (button,
7333 G_CALLBACK (gtk_window_unfullscreen),
7336 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7338 button = gtk_button_new_with_label ("Present");
7339 g_signal_connect_object (button,
7341 G_CALLBACK (gtk_window_present),
7344 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7346 button = gtk_button_new_with_label ("Show");
7347 g_signal_connect_object (button,
7349 G_CALLBACK (gtk_widget_show),
7352 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7354 gtk_widget_show_all (hbox);
7360 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
7362 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7364 gtk_window_set_keep_above (GTK_WINDOW (data),
7365 gtk_toggle_button_get_active (togglebutton));
7367 if (gtk_toggle_button_get_active (togglebutton))
7368 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7372 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
7374 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7376 gtk_window_set_keep_below (GTK_WINDOW (data),
7377 gtk_toggle_button_get_active (togglebutton));
7379 if (gtk_toggle_button_get_active (togglebutton))
7380 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7385 get_state_controls (GtkWidget *window)
7389 GtkWidget *button_above;
7390 GtkWidget *button_below;
7392 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7394 button = gtk_button_new_with_label ("Stick");
7395 g_signal_connect_object (button,
7397 G_CALLBACK (gtk_window_stick),
7400 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7402 button = gtk_button_new_with_label ("Unstick");
7403 g_signal_connect_object (button,
7405 G_CALLBACK (gtk_window_unstick),
7408 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7410 button = gtk_button_new_with_label ("Maximize");
7411 g_signal_connect_object (button,
7413 G_CALLBACK (gtk_window_maximize),
7416 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7418 button = gtk_button_new_with_label ("Unmaximize");
7419 g_signal_connect_object (button,
7421 G_CALLBACK (gtk_window_unmaximize),
7424 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7426 button = gtk_button_new_with_label ("Iconify");
7427 g_signal_connect_object (button,
7429 G_CALLBACK (gtk_window_iconify),
7432 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7434 button = gtk_button_new_with_label ("Fullscreen");
7435 g_signal_connect_object (button,
7437 G_CALLBACK (gtk_window_fullscreen),
7440 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7442 button = gtk_button_new_with_label ("Unfullscreen");
7443 g_signal_connect_object (button,
7445 G_CALLBACK (gtk_window_unfullscreen),
7448 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7450 button_above = gtk_toggle_button_new_with_label ("Keep above");
7451 g_signal_connect (button_above,
7453 G_CALLBACK (keep_window_above),
7455 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
7457 button_below = gtk_toggle_button_new_with_label ("Keep below");
7458 g_signal_connect (button_below,
7460 G_CALLBACK (keep_window_below),
7462 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
7464 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
7465 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
7467 button = gtk_button_new_with_label ("Hide (withdraw)");
7468 g_signal_connect_object (button,
7470 G_CALLBACK (gtk_widget_hide),
7473 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7475 gtk_widget_show_all (vbox);
7481 create_window_states (GtkWidget *widget)
7483 static GtkWidget *window = NULL;
7486 GtkWidget *iconified;
7488 GtkWidget *controls;
7492 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7493 gtk_window_set_screen (GTK_WINDOW (window),
7494 gtk_widget_get_screen (widget));
7496 g_signal_connect (window, "destroy",
7497 G_CALLBACK (gtk_widget_destroyed),
7500 gtk_window_set_title (GTK_WINDOW (window), "Window states");
7502 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7503 gtk_container_add (GTK_CONTAINER (window), box1);
7505 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7507 gtk_window_set_screen (GTK_WINDOW (iconified),
7508 gtk_widget_get_screen (widget));
7510 g_signal_connect_object (iconified, "destroy",
7511 G_CALLBACK (gtk_widget_destroy),
7514 gtk_window_iconify (GTK_WINDOW (iconified));
7515 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
7516 controls = get_state_controls (iconified);
7517 gtk_container_add (GTK_CONTAINER (iconified), controls);
7519 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7521 gtk_window_set_screen (GTK_WINDOW (normal),
7522 gtk_widget_get_screen (widget));
7524 g_signal_connect_object (normal, "destroy",
7525 G_CALLBACK (gtk_widget_destroy),
7529 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
7530 controls = get_state_controls (normal);
7531 gtk_container_add (GTK_CONTAINER (normal), controls);
7533 label = tracking_label (iconified);
7534 gtk_container_add (GTK_CONTAINER (box1), label);
7536 label = tracking_label (normal);
7537 gtk_container_add (GTK_CONTAINER (box1), label);
7539 gtk_widget_show_all (iconified);
7540 gtk_widget_show_all (normal);
7541 gtk_widget_show_all (box1);
7544 if (!gtk_widget_get_visible (window))
7545 gtk_widget_show (window);
7547 gtk_widget_destroy (window);
7555 configure_event_callback (GtkWidget *widget,
7556 GdkEventConfigure *event,
7559 GtkWidget *label = data;
7563 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
7565 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
7567 event->x, event->y, event->width, event->height,
7570 gtk_label_set_text (GTK_LABEL (label), msg);
7578 get_ints (GtkWidget *window,
7585 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
7586 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
7588 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
7589 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
7593 set_size_callback (GtkWidget *widget,
7598 get_ints (data, &w, &h);
7600 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
7604 unset_default_size_callback (GtkWidget *widget,
7607 gtk_window_set_default_size (g_object_get_data (data, "target"),
7612 set_default_size_callback (GtkWidget *widget,
7617 get_ints (data, &w, &h);
7619 gtk_window_set_default_size (g_object_get_data (data, "target"),
7624 unset_size_request_callback (GtkWidget *widget,
7627 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7632 set_size_request_callback (GtkWidget *widget,
7637 get_ints (data, &w, &h);
7639 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7644 set_location_callback (GtkWidget *widget,
7649 get_ints (data, &x, &y);
7651 gtk_window_move (g_object_get_data (data, "target"), x, y);
7655 move_to_position_callback (GtkWidget *widget,
7661 window = g_object_get_data (data, "target");
7663 gtk_window_get_position (window, &x, &y);
7665 gtk_window_move (window, x, y);
7669 set_geometry_callback (GtkWidget *entry,
7675 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
7677 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
7679 if (!gtk_window_parse_geometry (target, text))
7680 g_print ("Bad geometry string '%s'\n", text);
7686 resizable_callback (GtkWidget *widget,
7689 g_object_set (g_object_get_data (data, "target"),
7690 "resizable", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)),
7695 gravity_selected (GtkWidget *widget,
7698 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
7699 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GDK_GRAVITY_NORTH_WEST);
7703 pos_selected (GtkWidget *widget,
7706 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
7707 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GTK_WIN_POS_NONE);
7711 move_gravity_window_to_current_position (GtkWidget *widget,
7717 window = GTK_WINDOW (data);
7719 gtk_window_get_position (window, &x, &y);
7721 gtk_window_move (window, x, y);
7725 get_screen_corner (GtkWindow *window,
7730 GdkScreen * screen = gtk_window_get_screen (window);
7732 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
7734 switch (gtk_window_get_gravity (window))
7736 case GDK_GRAVITY_SOUTH_EAST:
7737 *x = gdk_screen_get_width (screen) - w;
7738 *y = gdk_screen_get_height (screen) - h;
7741 case GDK_GRAVITY_NORTH_EAST:
7742 *x = gdk_screen_get_width (screen) - w;
7746 case GDK_GRAVITY_SOUTH_WEST:
7748 *y = gdk_screen_get_height (screen) - h;
7751 case GDK_GRAVITY_NORTH_WEST:
7756 case GDK_GRAVITY_SOUTH:
7757 *x = (gdk_screen_get_width (screen) - w) / 2;
7758 *y = gdk_screen_get_height (screen) - h;
7761 case GDK_GRAVITY_NORTH:
7762 *x = (gdk_screen_get_width (screen) - w) / 2;
7766 case GDK_GRAVITY_WEST:
7768 *y = (gdk_screen_get_height (screen) - h) / 2;
7771 case GDK_GRAVITY_EAST:
7772 *x = gdk_screen_get_width (screen) - w;
7773 *y = (gdk_screen_get_height (screen) - h) / 2;
7776 case GDK_GRAVITY_CENTER:
7777 *x = (gdk_screen_get_width (screen) - w) / 2;
7778 *y = (gdk_screen_get_height (screen) - h) / 2;
7781 case GDK_GRAVITY_STATIC:
7782 /* pick some random numbers */
7788 g_assert_not_reached ();
7794 move_gravity_window_to_starting_position (GtkWidget *widget,
7800 window = GTK_WINDOW (data);
7802 get_screen_corner (window,
7805 gtk_window_move (window, x, y);
7809 make_gravity_window (GtkWidget *destroy_with,
7818 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7820 gtk_window_set_screen (GTK_WINDOW (window),
7821 gtk_widget_get_screen (destroy_with));
7823 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7824 gtk_widget_show (vbox);
7826 gtk_container_add (GTK_CONTAINER (window), vbox);
7827 gtk_window_set_title (GTK_WINDOW (window), title);
7828 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
7830 g_signal_connect_object (destroy_with,
7832 G_CALLBACK (gtk_widget_destroy),
7837 button = gtk_button_new_with_mnemonic ("_Move to current position");
7839 g_signal_connect (button, "clicked",
7840 G_CALLBACK (move_gravity_window_to_current_position),
7843 gtk_container_add (GTK_CONTAINER (vbox), button);
7844 gtk_widget_show (button);
7846 button = gtk_button_new_with_mnemonic ("Move to _starting position");
7848 g_signal_connect (button, "clicked",
7849 G_CALLBACK (move_gravity_window_to_starting_position),
7852 gtk_container_add (GTK_CONTAINER (vbox), button);
7853 gtk_widget_show (button);
7855 /* Pretend this is the result of --geometry.
7856 * DO NOT COPY THIS CODE unless you are setting --geometry results,
7857 * and in that case you probably should just use gtk_window_parse_geometry().
7858 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
7859 * you are parsing --geometry or equivalent.
7861 gtk_window_set_geometry_hints (GTK_WINDOW (window),
7865 gtk_window_set_default_size (GTK_WINDOW (window),
7868 get_screen_corner (GTK_WINDOW (window), &x, &y);
7870 gtk_window_move (GTK_WINDOW (window),
7877 do_gravity_test (GtkWidget *widget,
7880 GtkWidget *destroy_with = data;
7883 /* We put a window at each gravity point on the screen. */
7884 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
7886 gtk_widget_show (window);
7888 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
7890 gtk_widget_show (window);
7892 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
7894 gtk_widget_show (window);
7896 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
7898 gtk_widget_show (window);
7900 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
7902 gtk_widget_show (window);
7904 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
7906 gtk_widget_show (window);
7909 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
7911 gtk_widget_show (window);
7914 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
7916 gtk_widget_show (window);
7918 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
7920 gtk_widget_show (window);
7922 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
7924 gtk_widget_show (window);
7928 window_controls (GtkWidget *window)
7930 GtkWidget *control_window;
7935 GtkAdjustment *adjustment;
7940 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7942 gtk_window_set_screen (GTK_WINDOW (control_window),
7943 gtk_widget_get_screen (window));
7945 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
7947 g_object_set_data (G_OBJECT (control_window),
7951 g_signal_connect_object (control_window,
7953 G_CALLBACK (gtk_widget_destroy),
7957 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
7959 gtk_container_add (GTK_CONTAINER (control_window), vbox);
7961 label = gtk_label_new ("<no configure events>");
7962 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
7964 g_signal_connect (window,
7966 G_CALLBACK (configure_event_callback),
7969 adjustment = gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0, 5.0, 0.0);
7970 spin = gtk_spin_button_new (adjustment, 0, 0);
7972 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
7974 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
7976 adjustment = gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0, 5.0, 0.0);
7977 spin = gtk_spin_button_new (adjustment, 0, 0);
7979 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
7981 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
7983 entry = gtk_entry_new ();
7984 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
7986 g_signal_connect (entry, "changed",
7987 G_CALLBACK (set_geometry_callback),
7990 button = gtk_button_new_with_label ("Show gravity test windows");
7991 g_signal_connect_swapped (button,
7993 G_CALLBACK (do_gravity_test),
7995 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7997 button = gtk_button_new_with_label ("Reshow with initial size");
7998 g_signal_connect_object (button,
8000 G_CALLBACK (gtk_window_reshow_with_initial_size),
8003 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8005 button = gtk_button_new_with_label ("Queue resize");
8006 g_signal_connect_object (button,
8008 G_CALLBACK (gtk_widget_queue_resize),
8011 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8013 button = gtk_button_new_with_label ("Resize");
8014 g_signal_connect (button,
8016 G_CALLBACK (set_size_callback),
8018 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8020 button = gtk_button_new_with_label ("Set default size");
8021 g_signal_connect (button,
8023 G_CALLBACK (set_default_size_callback),
8025 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8027 button = gtk_button_new_with_label ("Unset default size");
8028 g_signal_connect (button,
8030 G_CALLBACK (unset_default_size_callback),
8032 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8034 button = gtk_button_new_with_label ("Set size request");
8035 g_signal_connect (button,
8037 G_CALLBACK (set_size_request_callback),
8039 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8041 button = gtk_button_new_with_label ("Unset size request");
8042 g_signal_connect (button,
8044 G_CALLBACK (unset_size_request_callback),
8046 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8048 button = gtk_button_new_with_label ("Move");
8049 g_signal_connect (button,
8051 G_CALLBACK (set_location_callback),
8053 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8055 button = gtk_button_new_with_label ("Move to current position");
8056 g_signal_connect (button,
8058 G_CALLBACK (move_to_position_callback),
8060 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8062 button = gtk_check_button_new_with_label ("Allow resize");
8063 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
8064 g_signal_connect (button,
8066 G_CALLBACK (resizable_callback),
8068 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8070 button = gtk_button_new_with_mnemonic ("_Show");
8071 g_signal_connect_object (button,
8073 G_CALLBACK (gtk_widget_show),
8076 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8078 button = gtk_button_new_with_mnemonic ("_Hide");
8079 g_signal_connect_object (button,
8081 G_CALLBACK (gtk_widget_hide),
8084 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8086 om = gtk_combo_box_text_new ();
8090 static gchar *names[] = {
8091 "GDK_GRAVITY_NORTH_WEST",
8092 "GDK_GRAVITY_NORTH",
8093 "GDK_GRAVITY_NORTH_EAST",
8095 "GDK_GRAVITY_CENTER",
8097 "GDK_GRAVITY_SOUTH_WEST",
8098 "GDK_GRAVITY_SOUTH",
8099 "GDK_GRAVITY_SOUTH_EAST",
8100 "GDK_GRAVITY_STATIC",
8104 g_assert (names[i]);
8105 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (om), names[i]);
8110 g_signal_connect (om,
8112 G_CALLBACK (gravity_selected),
8115 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8118 om = gtk_combo_box_text_new ();
8122 static gchar *names[] = {
8124 "GTK_WIN_POS_CENTER",
8125 "GTK_WIN_POS_MOUSE",
8126 "GTK_WIN_POS_CENTER_ALWAYS",
8127 "GTK_WIN_POS_CENTER_ON_PARENT",
8131 g_assert (names[i]);
8132 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (om), names[i]);
8137 g_signal_connect (om,
8139 G_CALLBACK (pos_selected),
8142 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8144 gtk_widget_show_all (vbox);
8146 return control_window;
8150 create_window_sizing (GtkWidget *widget)
8152 static GtkWidget *window = NULL;
8153 static GtkWidget *target_window = NULL;
8159 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8160 gtk_window_set_screen (GTK_WINDOW (target_window),
8161 gtk_widget_get_screen (widget));
8162 label = gtk_label_new (NULL);
8163 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");
8164 gtk_container_add (GTK_CONTAINER (target_window), label);
8165 gtk_widget_show (label);
8167 g_signal_connect (target_window, "destroy",
8168 G_CALLBACK (gtk_widget_destroyed),
8171 window = window_controls (target_window);
8173 g_signal_connect (window, "destroy",
8174 G_CALLBACK (gtk_widget_destroyed),
8177 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
8180 /* don't show target window by default, we want to allow testing
8181 * of behavior on first show.
8184 if (!gtk_widget_get_visible (window))
8185 gtk_widget_show (window);
8187 gtk_widget_destroy (window);
8194 typedef struct _ProgressData {
8197 GtkWidget *block_spin;
8198 GtkWidget *x_align_spin;
8199 GtkWidget *y_align_spin;
8200 GtkWidget *step_spin;
8201 GtkWidget *act_blocks_spin;
8212 progress_timeout (gpointer data)
8214 ProgressData *pdata = data;
8218 if (pdata->activity)
8220 gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar));
8222 text = g_strdup_printf ("%s", "???");
8226 new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;
8229 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);
8231 text = g_strdup_printf ("%.0f%%", 100 * new_val);
8234 gtk_label_set_text (GTK_LABEL (pdata->label), text);
8241 destroy_progress (GtkWidget *widget,
8242 ProgressData **pdata)
8244 if ((*pdata)->timer)
8246 g_source_remove ((*pdata)->timer);
8247 (*pdata)->timer = 0;
8249 (*pdata)->window = NULL;
8255 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
8257 ProgressData *pdata;
8260 pdata = (ProgressData *) data;
8262 if (!gtk_widget_get_mapped (widget))
8265 i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8267 if (i == 0 || i == 1)
8268 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_HORIZONTAL);
8270 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_VERTICAL);
8272 if (i == 1 || i == 2)
8273 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), TRUE);
8275 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), FALSE);
8279 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
8283 active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8284 gtk_progress_bar_set_show_text (GTK_PROGRESS_BAR (pdata->pbar), active);
8288 progressbar_toggle_ellipsize (GtkWidget *widget,
8291 ProgressData *pdata = data;
8292 if (gtk_widget_is_drawable (widget))
8294 gint i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8295 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar), i);
8300 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
8302 pdata->activity = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8306 toggle_running (GtkWidget *widget, ProgressData *pdata)
8308 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
8310 if (pdata->timer == 0)
8311 pdata->timer = g_timeout_add (100, (GSourceFunc)progress_timeout, pdata);
8315 if (pdata->timer != 0)
8317 g_source_remove (pdata->timer);
8324 entry_changed (GtkWidget *widget, ProgressData *pdata)
8326 gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar),
8327 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
8331 create_progress_bar (GtkWidget *widget)
8333 GtkWidget *action_area, *content_area;
8343 static ProgressData *pdata = NULL;
8345 static gchar *items1[] =
8353 static char *ellipsize_items[] = {
8354 "None", // PANGO_ELLIPSIZE_NONE,
8355 "Start", // PANGO_ELLIPSIZE_START,
8356 "Middle", // PANGO_ELLIPSIZE_MIDDLE,
8357 "End", // PANGO_ELLIPSIZE_END
8361 pdata = g_new0 (ProgressData, 1);
8365 pdata->window = gtk_dialog_new ();
8367 gtk_window_set_screen (GTK_WINDOW (pdata->window),
8368 gtk_widget_get_screen (widget));
8370 gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);
8372 g_signal_connect (pdata->window, "destroy",
8373 G_CALLBACK (destroy_progress),
8377 content_area = gtk_dialog_get_content_area (GTK_DIALOG (pdata->window));
8378 action_area = gtk_dialog_get_action_area (GTK_DIALOG (pdata->window));
8380 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
8381 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
8383 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8384 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
8385 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, TRUE, 0);
8387 frame = gtk_frame_new ("Progress");
8388 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8390 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8391 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8393 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8394 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8396 pdata->pbar = gtk_progress_bar_new ();
8397 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar),
8398 PANGO_ELLIPSIZE_MIDDLE);
8400 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
8402 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8403 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8405 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
8406 gtk_container_add (GTK_CONTAINER (align), hbox);
8407 label = gtk_label_new ("Label updated by user :");
8408 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8409 pdata->label = gtk_label_new ("");
8410 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
8412 frame = gtk_frame_new ("Options");
8413 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8415 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8416 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8418 tab = gtk_table_new (7, 2, FALSE);
8419 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
8421 label = gtk_label_new ("Orientation :");
8422 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
8423 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8425 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
8427 pdata->omenu1 = build_option_menu (items1, 4, 0,
8428 progressbar_toggle_orientation,
8430 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8431 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
8432 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8434 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
8436 check = gtk_check_button_new_with_label ("Running");
8437 g_signal_connect (check, "toggled",
8438 G_CALLBACK (toggle_running),
8440 gtk_table_attach (GTK_TABLE (tab), check, 0, 2, 1, 2,
8441 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8443 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
8445 check = gtk_check_button_new_with_label ("Show text");
8446 g_signal_connect (check, "clicked",
8447 G_CALLBACK (toggle_show_text),
8449 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 2, 3,
8450 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8453 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8454 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 2, 3,
8455 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8458 label = gtk_label_new ("Text: ");
8459 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8461 pdata->entry = gtk_entry_new ();
8462 g_signal_connect (pdata->entry, "changed",
8463 G_CALLBACK (entry_changed),
8465 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
8466 gtk_widget_set_size_request (pdata->entry, 100, -1);
8468 label = gtk_label_new ("Ellipsize text :");
8469 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 10, 11,
8470 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8472 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
8473 pdata->elmenu = build_option_menu (ellipsize_items,
8474 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
8475 2, // PANGO_ELLIPSIZE_MIDDLE
8476 progressbar_toggle_ellipsize,
8478 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8479 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 10, 11,
8480 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8482 gtk_box_pack_start (GTK_BOX (hbox), pdata->elmenu, TRUE, TRUE, 0);
8484 check = gtk_check_button_new_with_label ("Activity mode");
8485 g_signal_connect (check, "clicked",
8486 G_CALLBACK (toggle_activity_mode), pdata);
8487 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 15, 16,
8488 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8491 button = gtk_button_new_with_label ("close");
8492 g_signal_connect_swapped (button, "clicked",
8493 G_CALLBACK (gtk_widget_destroy),
8495 gtk_widget_set_can_default (button, TRUE);
8496 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
8497 gtk_widget_grab_default (button);
8500 if (!gtk_widget_get_visible (pdata->window))
8501 gtk_widget_show_all (pdata->window);
8503 gtk_widget_destroy (pdata->window);
8515 GtkWidget *res_widget;
8519 find_widget (GtkWidget *widget, FindWidgetData *data)
8521 GtkAllocation new_allocation;
8525 gtk_widget_get_allocation (widget, &new_allocation);
8527 if (data->found || !gtk_widget_get_mapped (widget))
8530 /* Note that in the following code, we only count the
8531 * position as being inside a WINDOW widget if it is inside
8532 * widget->window; points that are outside of widget->window
8533 * but within the allocation are not counted. This is consistent
8534 * with the way we highlight drag targets.
8536 if (gtk_widget_get_has_window (widget))
8538 new_allocation.x = 0;
8539 new_allocation.y = 0;
8542 if (gtk_widget_get_parent (widget) && !data->first)
8544 GdkWindow *window = gtk_widget_get_window (widget);
8545 while (window != gtk_widget_get_window (gtk_widget_get_parent (widget)))
8547 gint tx, ty, twidth, theight;
8549 twidth = gdk_window_get_width (window);
8550 theight = gdk_window_get_height (window);
8552 if (new_allocation.x < 0)
8554 new_allocation.width += new_allocation.x;
8555 new_allocation.x = 0;
8557 if (new_allocation.y < 0)
8559 new_allocation.height += new_allocation.y;
8560 new_allocation.y = 0;
8562 if (new_allocation.x + new_allocation.width > twidth)
8563 new_allocation.width = twidth - new_allocation.x;
8564 if (new_allocation.y + new_allocation.height > theight)
8565 new_allocation.height = theight - new_allocation.y;
8567 gdk_window_get_position (window, &tx, &ty);
8568 new_allocation.x += tx;
8570 new_allocation.y += ty;
8573 window = gdk_window_get_parent (window);
8577 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
8578 (data->x < new_allocation.x + new_allocation.width) &&
8579 (data->y < new_allocation.y + new_allocation.height))
8581 /* First, check if the drag is in a valid drop site in
8582 * one of our children
8584 if (GTK_IS_CONTAINER (widget))
8586 FindWidgetData new_data = *data;
8588 new_data.x -= x_offset;
8589 new_data.y -= y_offset;
8590 new_data.found = FALSE;
8591 new_data.first = FALSE;
8593 gtk_container_forall (GTK_CONTAINER (widget),
8594 (GtkCallback)find_widget,
8597 data->found = new_data.found;
8599 data->res_widget = new_data.res_widget;
8602 /* If not, and this widget is registered as a drop site, check to
8603 * emit "drag_motion" to check if we are actually in
8609 data->res_widget = widget;
8615 find_widget_at_pointer (GdkDevice *device)
8617 GtkWidget *widget = NULL;
8618 GdkWindow *pointer_window;
8620 FindWidgetData data;
8622 pointer_window = gdk_device_get_window_at_position (device, NULL, NULL);
8626 gpointer widget_ptr;
8628 gdk_window_get_user_data (pointer_window, &widget_ptr);
8629 widget = widget_ptr;
8634 gdk_window_get_pointer (gtk_widget_get_window (widget),
8642 find_widget (widget, &data);
8644 return data.res_widget;
8650 struct PropertiesData {
8658 destroy_properties (GtkWidget *widget,
8659 struct PropertiesData *data)
8663 *data->window = NULL;
8664 data->window = NULL;
8669 g_object_unref (data->cursor);
8670 data->cursor = NULL;
8675 g_signal_handler_disconnect (widget, data->handler);
8683 property_query_event (GtkWidget *widget,
8685 struct PropertiesData *data)
8687 GtkWidget *res_widget = NULL;
8689 if (!data->in_query)
8692 if (event->type == GDK_BUTTON_RELEASE)
8694 gtk_grab_remove (widget);
8695 gdk_device_ungrab (gdk_event_get_device (event), GDK_CURRENT_TIME);
8697 res_widget = find_widget_at_pointer (gdk_event_get_device (event));
8700 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
8701 gtk_widget_get_screen (widget));
8702 create_prop_editor (G_OBJECT (res_widget), 0);
8705 data->in_query = FALSE;
8712 query_properties (GtkButton *button,
8713 struct PropertiesData *data)
8715 GtkWidget *widget = GTK_WIDGET (button);
8716 GdkDisplay *display;
8717 GdkDeviceManager *device_manager;
8720 g_signal_connect (button, "event",
8721 G_CALLBACK (property_query_event), data);
8723 display = gtk_widget_get_display (widget);
8726 data->cursor = gdk_cursor_new_for_display (display, GDK_TARGET);
8728 device_manager = gdk_display_get_device_manager (display);
8729 device = gdk_device_manager_get_client_pointer (device_manager);
8730 gdk_device_grab (device,
8731 gtk_widget_get_window (widget),
8734 GDK_BUTTON_RELEASE_MASK,
8737 gtk_grab_add (widget);
8739 data->in_query = TRUE;
8743 create_properties (GtkWidget *widget)
8745 static GtkWidget *window = NULL;
8749 struct PropertiesData *data;
8751 data = g_new (struct PropertiesData, 1);
8752 data->window = &window;
8753 data->in_query = FALSE;
8754 data->cursor = NULL;
8759 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8761 gtk_window_set_screen (GTK_WINDOW (window),
8762 gtk_widget_get_screen (widget));
8764 data->handler = g_signal_connect (window, "destroy",
8765 G_CALLBACK (destroy_properties),
8768 gtk_window_set_title (GTK_WINDOW (window), "test properties");
8769 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
8771 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1);
8772 gtk_container_add (GTK_CONTAINER (window), vbox);
8774 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
8775 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
8777 button = gtk_button_new_with_label ("Query properties");
8778 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8779 g_signal_connect (button, "clicked",
8780 G_CALLBACK (query_properties),
8784 if (!gtk_widget_get_visible (window))
8785 gtk_widget_show_all (window);
8787 gtk_widget_destroy (window);
8791 struct SnapshotData {
8792 GtkWidget *toplevel_button;
8796 gboolean is_toplevel;
8801 destroy_snapshot_data (GtkWidget *widget,
8802 struct SnapshotData *data)
8805 *data->window = NULL;
8809 g_object_unref (data->cursor);
8810 data->cursor = NULL;
8815 g_signal_handler_disconnect (widget, data->handler);
8823 snapshot_widget_event (GtkWidget *widget,
8825 struct SnapshotData *data)
8827 GtkWidget *res_widget = NULL;
8829 if (!data->in_query)
8832 if (event->type == GDK_BUTTON_RELEASE)
8834 gtk_grab_remove (widget);
8835 gdk_device_ungrab (gdk_event_get_device (event),
8838 res_widget = find_widget_at_pointer (gdk_event_get_device (event));
8839 if (data->is_toplevel && res_widget)
8840 res_widget = gtk_widget_get_toplevel (res_widget);
8843 cairo_surface_t *surface;
8844 GtkWidget *window, *image;
8849 width = gtk_widget_get_allocated_width (res_widget);
8850 height = gtk_widget_get_allocated_height (res_widget);
8852 surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
8854 cr = cairo_create (surface);
8855 gtk_widget_draw (res_widget, cr);
8858 pixbuf = gdk_pixbuf_get_from_surface (surface,
8861 cairo_surface_destroy (surface);
8863 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8864 image = gtk_image_new_from_pixbuf (pixbuf);
8865 g_object_unref (pixbuf);
8867 gtk_container_add (GTK_CONTAINER (window), image);
8868 gtk_widget_show_all (window);
8871 data->in_query = FALSE;
8878 snapshot_widget (GtkButton *button,
8879 struct SnapshotData *data)
8881 GtkWidget *widget = GTK_WIDGET (button);
8884 device = gtk_get_current_event_device ();
8888 if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
8889 device = gdk_device_get_associated_device (device);
8891 data->is_toplevel = widget == data->toplevel_button;
8894 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget),
8897 gdk_device_grab (device,
8898 gtk_widget_get_window (widget),
8899 GDK_OWNERSHIP_APPLICATION,
8901 GDK_BUTTON_RELEASE_MASK,
8905 g_signal_connect (button, "event",
8906 G_CALLBACK (snapshot_widget_event), data);
8908 gtk_grab_add (widget);
8910 data->in_query = TRUE;
8914 create_snapshot (GtkWidget *widget)
8916 static GtkWidget *window = NULL;
8919 struct SnapshotData *data;
8921 data = g_new (struct SnapshotData, 1);
8922 data->window = &window;
8923 data->in_query = FALSE;
8924 data->cursor = NULL;
8929 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8931 gtk_window_set_screen (GTK_WINDOW (window),
8932 gtk_widget_get_screen (widget));
8934 data->handler = g_signal_connect (window, "destroy",
8935 G_CALLBACK (destroy_snapshot_data),
8938 gtk_window_set_title (GTK_WINDOW (window), "test snapshot");
8939 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
8941 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1);
8942 gtk_container_add (GTK_CONTAINER (window), vbox);
8944 button = gtk_button_new_with_label ("Snapshot widget");
8945 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8946 g_signal_connect (button, "clicked",
8947 G_CALLBACK (snapshot_widget),
8950 button = gtk_button_new_with_label ("Snapshot toplevel");
8951 data->toplevel_button = button;
8952 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8953 g_signal_connect (button, "clicked",
8954 G_CALLBACK (snapshot_widget),
8958 if (!gtk_widget_get_visible (window))
8959 gtk_widget_show_all (window);
8961 gtk_widget_destroy (window);
8970 selection_test_received (GtkWidget *tree_view,
8971 GtkSelectionData *selection_data)
8973 GtkTreeModel *model;
8974 GtkListStore *store;
8978 if (gtk_selection_data_get_length (selection_data) < 0)
8980 g_print ("Selection retrieval failed\n");
8983 if (gtk_selection_data_get_data_type (selection_data) != GDK_SELECTION_TYPE_ATOM)
8985 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
8989 /* Clear out any current list items */
8991 model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
8992 store = GTK_LIST_STORE (model);
8993 gtk_list_store_clear (store);
8995 /* Add new items to list */
8997 gtk_selection_data_get_targets (selection_data,
9000 for (i = 0; i < l; i++)
9005 name = gdk_atom_name (atoms[i]);
9008 gtk_list_store_insert_with_values (store, &iter, i, 0, name, -1);
9012 gtk_list_store_insert_with_values (store, &iter, i, 0, "(bad atom)", -1);
9019 selection_test_get_targets (GtkWidget *widget, GtkWidget *tree_view)
9021 static GdkAtom targets_atom = GDK_NONE;
9023 if (targets_atom == GDK_NONE)
9024 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
9026 gtk_selection_convert (tree_view, GDK_SELECTION_PRIMARY, targets_atom,
9031 create_selection_test (GtkWidget *widget)
9033 static GtkWidget *window = NULL;
9034 GtkWidget *action_area, *content_area;
9037 GtkWidget *scrolled_win;
9038 GtkListStore* store;
9039 GtkWidget *tree_view;
9040 GtkTreeViewColumn *column;
9041 GtkCellRenderer *renderer;
9046 window = gtk_dialog_new ();
9048 gtk_window_set_screen (GTK_WINDOW (window),
9049 gtk_widget_get_screen (widget));
9051 g_signal_connect (window, "destroy",
9052 G_CALLBACK (gtk_widget_destroyed),
9055 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9056 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9058 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
9059 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9061 /* Create the list */
9063 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
9064 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9065 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
9067 label = gtk_label_new ("Gets available targets for current selection");
9068 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9070 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
9071 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
9072 GTK_POLICY_AUTOMATIC,
9073 GTK_POLICY_AUTOMATIC);
9074 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
9075 gtk_widget_set_size_request (scrolled_win, 100, 200);
9077 store = gtk_list_store_new (1, G_TYPE_STRING);
9078 tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
9079 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), tree_view);
9081 renderer = gtk_cell_renderer_text_new ();
9082 column = gtk_tree_view_column_new_with_attributes ("Target", renderer,
9084 gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
9086 g_signal_connect (tree_view, "selection_received",
9087 G_CALLBACK (selection_test_received), NULL);
9089 /* .. And create some buttons */
9090 button = gtk_button_new_with_label ("Get Targets");
9091 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9093 g_signal_connect (button, "clicked",
9094 G_CALLBACK (selection_test_get_targets), tree_view);
9096 button = gtk_button_new_with_label ("Quit");
9097 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9099 g_signal_connect_swapped (button, "clicked",
9100 G_CALLBACK (gtk_widget_destroy),
9104 if (!gtk_widget_get_visible (window))
9105 gtk_widget_show_all (window);
9107 gtk_widget_destroy (window);
9114 static int scroll_test_pos = 0.0;
9117 scroll_test_draw (GtkWidget *widget,
9119 GtkAdjustment *adjustment)
9122 gint imin, imax, jmin, jmax;
9125 gdk_cairo_get_clip_rectangle (cr, &clip);
9127 imin = (clip.x) / 10;
9128 imax = (clip.x + clip.width + 9) / 10;
9130 jmin = ((int)gtk_adjustment_get_value (adjustment) + clip.y) / 10;
9131 jmax = ((int)gtk_adjustment_get_value (adjustment) + clip.y + clip.height + 9) / 10;
9133 for (i=imin; i<imax; i++)
9134 for (j=jmin; j<jmax; j++)
9136 cairo_rectangle (cr, 10*i, 10*j - (int)gtk_adjustment_get_value (adjustment), 1+i%10, 1+j%10);
9144 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
9145 GtkAdjustment *adjustment)
9147 gdouble new_value = gtk_adjustment_get_value (adjustment) + ((event->direction == GDK_SCROLL_UP) ?
9148 -gtk_adjustment_get_page_increment (adjustment) / 2:
9149 gtk_adjustment_get_page_increment (adjustment) / 2);
9150 new_value = CLAMP (new_value, gtk_adjustment_get_lower (adjustment), gtk_adjustment_get_upper (adjustment) - gtk_adjustment_get_page_size (adjustment));
9151 gtk_adjustment_set_value (adjustment, new_value);
9157 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
9158 GtkAdjustment *adjustment)
9160 GtkAllocation allocation;
9162 gtk_widget_get_allocation (widget, &allocation);
9163 gtk_adjustment_configure (adjustment,
9164 gtk_adjustment_get_value (adjustment),
9165 gtk_adjustment_get_lower (adjustment),
9166 gtk_adjustment_get_upper (adjustment),
9167 0.1 * allocation.height,
9168 0.9 * allocation.height,
9173 scroll_test_adjustment_changed (GtkAdjustment *adjustment, GtkWidget *widget)
9178 dy = scroll_test_pos - (int)gtk_adjustment_get_value (adjustment);
9179 scroll_test_pos = gtk_adjustment_get_value (adjustment);
9181 if (!gtk_widget_is_drawable (widget))
9184 window = gtk_widget_get_window (widget);
9185 gdk_window_scroll (window, 0, dy);
9186 gdk_window_process_updates (window, FALSE);
9191 create_scroll_test (GtkWidget *widget)
9193 static GtkWidget *window = NULL;
9194 GtkWidget *action_area, *content_area;
9196 GtkWidget *drawing_area;
9197 GtkWidget *scrollbar;
9199 GtkAdjustment *adjustment;
9200 GdkGeometry geometry;
9201 GdkWindowHints geometry_mask;
9205 window = gtk_dialog_new ();
9207 gtk_window_set_screen (GTK_WINDOW (window),
9208 gtk_widget_get_screen (widget));
9210 g_signal_connect (window, "destroy",
9211 G_CALLBACK (gtk_widget_destroyed),
9214 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9215 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9217 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
9218 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9220 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
9221 gtk_box_pack_start (GTK_BOX (content_area), hbox, TRUE, TRUE, 0);
9222 gtk_widget_show (hbox);
9224 drawing_area = gtk_drawing_area_new ();
9225 gtk_widget_set_size_request (drawing_area, 200, 200);
9226 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
9227 gtk_widget_show (drawing_area);
9229 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
9231 adjustment = gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0);
9232 scroll_test_pos = 0.0;
9234 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, adjustment);
9235 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
9236 gtk_widget_show (scrollbar);
9238 g_signal_connect (drawing_area, "draw",
9239 G_CALLBACK (scroll_test_draw), adjustment);
9240 g_signal_connect (drawing_area, "configure_event",
9241 G_CALLBACK (scroll_test_configure), adjustment);
9242 g_signal_connect (drawing_area, "scroll_event",
9243 G_CALLBACK (scroll_test_scroll), adjustment);
9245 g_signal_connect (adjustment, "value_changed",
9246 G_CALLBACK (scroll_test_adjustment_changed),
9249 /* .. And create some buttons */
9251 button = gtk_button_new_with_label ("Quit");
9252 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9254 g_signal_connect_swapped (button, "clicked",
9255 G_CALLBACK (gtk_widget_destroy),
9257 gtk_widget_show (button);
9259 /* Set up gridded geometry */
9261 geometry_mask = GDK_HINT_MIN_SIZE |
9262 GDK_HINT_BASE_SIZE |
9263 GDK_HINT_RESIZE_INC;
9265 geometry.min_width = 20;
9266 geometry.min_height = 20;
9267 geometry.base_width = 0;
9268 geometry.base_height = 0;
9269 geometry.width_inc = 10;
9270 geometry.height_inc = 10;
9272 gtk_window_set_geometry_hints (GTK_WINDOW (window),
9273 drawing_area, &geometry, geometry_mask);
9276 if (!gtk_widget_get_visible (window))
9277 gtk_widget_show (window);
9279 gtk_widget_destroy (window);
9286 static int timer = 0;
9289 timeout_test (GtkWidget *label)
9291 static int count = 0;
9292 static char buffer[32];
9294 sprintf (buffer, "count: %d", ++count);
9295 gtk_label_set_text (GTK_LABEL (label), buffer);
9301 start_timeout_test (GtkWidget *widget,
9306 timer = g_timeout_add (100, (GSourceFunc)timeout_test, label);
9311 stop_timeout_test (GtkWidget *widget,
9316 g_source_remove (timer);
9322 destroy_timeout_test (GtkWidget *widget,
9325 stop_timeout_test (NULL, NULL);
9331 create_timeout_test (GtkWidget *widget)
9333 static GtkWidget *window = NULL;
9334 GtkWidget *action_area, *content_area;
9340 window = gtk_dialog_new ();
9342 gtk_window_set_screen (GTK_WINDOW (window),
9343 gtk_widget_get_screen (widget));
9345 g_signal_connect (window, "destroy",
9346 G_CALLBACK (destroy_timeout_test),
9349 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9350 action_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9352 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
9353 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9355 label = gtk_label_new ("count: 0");
9356 g_object_set (label, "margin", 10, NULL);
9357 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9358 gtk_widget_show (label);
9360 button = gtk_button_new_with_label ("close");
9361 g_signal_connect_swapped (button, "clicked",
9362 G_CALLBACK (gtk_widget_destroy),
9364 gtk_widget_set_can_default (button, TRUE);
9365 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9366 gtk_widget_grab_default (button);
9367 gtk_widget_show (button);
9369 button = gtk_button_new_with_label ("start");
9370 g_signal_connect (button, "clicked",
9371 G_CALLBACK(start_timeout_test),
9373 gtk_widget_set_can_default (button, TRUE);
9374 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9375 gtk_widget_show (button);
9377 button = gtk_button_new_with_label ("stop");
9378 g_signal_connect (button, "clicked",
9379 G_CALLBACK (stop_timeout_test),
9381 gtk_widget_set_can_default (button, TRUE);
9382 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9383 gtk_widget_show (button);
9386 if (!gtk_widget_get_visible (window))
9387 gtk_widget_show (window);
9389 gtk_widget_destroy (window);
9396 static int idle_id = 0;
9399 idle_test (GtkWidget *label)
9401 static int count = 0;
9402 static char buffer[32];
9404 sprintf (buffer, "count: %d", ++count);
9405 gtk_label_set_text (GTK_LABEL (label), buffer);
9411 start_idle_test (GtkWidget *widget,
9416 idle_id = g_idle_add ((GSourceFunc) idle_test, label);
9421 stop_idle_test (GtkWidget *widget,
9426 g_source_remove (idle_id);
9432 destroy_idle_test (GtkWidget *widget,
9435 stop_idle_test (NULL, NULL);
9441 toggle_idle_container (GObject *button,
9442 GtkContainer *container)
9444 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
9448 create_idle_test (GtkWidget *widget)
9450 static GtkWidget *window = NULL;
9453 GtkWidget *container;
9457 GtkWidget *action_area, *content_area;
9462 window = gtk_dialog_new ();
9464 gtk_window_set_screen (GTK_WINDOW (window),
9465 gtk_widget_get_screen (widget));
9467 g_signal_connect (window, "destroy",
9468 G_CALLBACK (destroy_idle_test),
9471 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9472 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9474 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
9475 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9477 label = gtk_label_new ("count: 0");
9478 g_object_set (label, "margin", 10, NULL);
9479 gtk_widget_show (label);
9482 g_object_new (GTK_TYPE_BOX,
9484 /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
9485 * "GtkWidget::visible", TRUE,
9490 gtk_box_pack_start (GTK_BOX (content_area), container, TRUE, TRUE, 0);
9493 g_object_new (GTK_TYPE_FRAME,
9495 "label", "Label Container",
9497 "parent", content_area,
9500 g_object_new (GTK_TYPE_BOX,
9503 "orientation", GTK_ORIENTATION_VERTICAL,
9506 g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
9507 "label", "Resize-Parent",
9508 "user_data", (void*)GTK_RESIZE_PARENT,
9512 "signal::clicked", toggle_idle_container, container,
9514 button = g_object_new (GTK_TYPE_RADIO_BUTTON,
9515 "label", "Resize-Queue",
9516 "user_data", (void*)GTK_RESIZE_QUEUE,
9521 g_object_connect (button,
9522 "signal::clicked", toggle_idle_container, container,
9524 button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
9525 "label", "Resize-Immediate",
9526 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
9528 g_object_connect (button2,
9529 "signal::clicked", toggle_idle_container, container,
9531 g_object_set (button2,
9537 button = gtk_button_new_with_label ("close");
9538 g_signal_connect_swapped (button, "clicked",
9539 G_CALLBACK (gtk_widget_destroy),
9541 gtk_widget_set_can_default (button, TRUE);
9542 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9543 gtk_widget_grab_default (button);
9544 gtk_widget_show (button);
9546 button = gtk_button_new_with_label ("start");
9547 g_signal_connect (button, "clicked",
9548 G_CALLBACK (start_idle_test),
9550 gtk_widget_set_can_default (button, TRUE);
9551 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9552 gtk_widget_show (button);
9554 button = gtk_button_new_with_label ("stop");
9555 g_signal_connect (button, "clicked",
9556 G_CALLBACK (stop_idle_test),
9558 gtk_widget_set_can_default (button, TRUE);
9559 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9560 gtk_widget_show (button);
9563 if (!gtk_widget_get_visible (window))
9564 gtk_widget_show (window);
9566 gtk_widget_destroy (window);
9574 create_rc_file (GtkWidget *widget)
9576 static GtkWidget *window = NULL;
9577 GtkWidget *action_area, *content_area;
9585 window = gtk_dialog_new ();
9587 gtk_window_set_screen (GTK_WINDOW (window),
9588 gtk_widget_get_screen (widget));
9590 g_signal_connect (window, "destroy",
9591 G_CALLBACK (gtk_widget_destroyed),
9594 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9595 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9597 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
9598 gtk_box_pack_start (GTK_BOX (content_area), frame, FALSE, FALSE, 0);
9600 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
9601 gtk_container_add (GTK_CONTAINER (frame), vbox);
9603 label = gtk_label_new ("This label should be red");
9604 gtk_widget_set_name (label, "testgtk-red-label");
9605 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9607 label = gtk_label_new ("This label should be green");
9608 gtk_widget_set_name (label, "testgtk-green-label");
9609 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9611 label = gtk_label_new ("This label should be blue");
9612 gtk_widget_set_name (label, "testgtk-blue-label");
9613 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9615 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
9616 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9618 button = gtk_button_new_with_label ("Reload");
9619 g_signal_connect_swapped (button, "clicked",
9620 G_CALLBACK (gtk_style_context_reset_widgets),
9621 gtk_widget_get_screen (button));
9622 gtk_widget_set_can_default (button, TRUE);
9623 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9624 gtk_widget_grab_default (button);
9626 button = gtk_button_new_with_label ("Close");
9627 g_signal_connect_swapped (button, "clicked",
9628 G_CALLBACK (gtk_widget_destroy),
9630 gtk_widget_set_can_default (button, TRUE);
9631 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9634 if (!gtk_widget_get_visible (window))
9635 gtk_widget_show_all (window);
9637 gtk_widget_destroy (window);
9641 * Test of recursive mainloop
9645 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
9652 create_mainloop (GtkWidget *widget)
9654 static GtkWidget *window = NULL;
9655 GtkWidget *action_area, *content_area;
9661 window = gtk_dialog_new ();
9663 gtk_window_set_screen (GTK_WINDOW (window),
9664 gtk_widget_get_screen (widget));
9666 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
9668 g_signal_connect (window, "destroy",
9669 G_CALLBACK (mainloop_destroyed),
9672 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9673 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9675 label = gtk_label_new ("In recursive main loop...");
9676 g_object_set (label, "margin", 20, NULL);
9678 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9679 gtk_widget_show (label);
9681 button = gtk_button_new_with_label ("Leave");
9682 gtk_box_pack_start (GTK_BOX (action_area), button, FALSE, TRUE, 0);
9684 g_signal_connect_swapped (button, "clicked",
9685 G_CALLBACK (gtk_widget_destroy),
9688 gtk_widget_set_can_default (button, TRUE);
9689 gtk_widget_grab_default (button);
9691 gtk_widget_show (button);
9694 if (!gtk_widget_get_visible (window))
9696 gtk_widget_show (window);
9698 g_print ("create_mainloop: start\n");
9700 g_print ("create_mainloop: done\n");
9703 gtk_widget_destroy (window);
9707 layout_draw_handler (GtkWidget *widget, cairo_t *cr)
9710 GdkWindow *bin_window;
9713 gint imin, imax, jmin, jmax;
9715 layout = GTK_LAYOUT (widget);
9716 bin_window = gtk_layout_get_bin_window (layout);
9718 if (!gtk_cairo_should_draw_window (cr, bin_window))
9721 gdk_window_get_position (bin_window, &x, &y);
9722 cairo_translate (cr, x, y);
9724 gdk_cairo_get_clip_rectangle (cr, &clip);
9726 imin = (clip.x) / 10;
9727 imax = (clip.x + clip.width + 9) / 10;
9729 jmin = (clip.y) / 10;
9730 jmax = (clip.y + clip.height + 9) / 10;
9732 for (i=imin; i<imax; i++)
9733 for (j=jmin; j<jmax; j++)
9735 cairo_rectangle (cr,
9744 void create_layout (GtkWidget *widget)
9746 GtkAdjustment *hadjustment, *vadjustment;
9748 static GtkWidget *window = NULL;
9749 GtkWidget *layout_widget;
9750 GtkWidget *scrolledwindow;
9759 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9760 gtk_window_set_screen (GTK_WINDOW (window),
9761 gtk_widget_get_screen (widget));
9763 g_signal_connect (window, "destroy",
9764 G_CALLBACK (gtk_widget_destroyed),
9767 gtk_window_set_title (GTK_WINDOW (window), "Layout");
9768 gtk_widget_set_size_request (window, 200, 200);
9770 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
9771 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
9773 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
9774 GTK_CORNER_TOP_RIGHT);
9776 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
9778 layout_widget = gtk_layout_new (NULL, NULL);
9779 layout = GTK_LAYOUT (layout_widget);
9780 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout_widget);
9782 /* We set step sizes here since GtkLayout does not set
9785 hadjustment = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (layout));
9786 vadjustment = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (layout));
9787 gtk_adjustment_set_step_increment (hadjustment, 10.0);
9788 gtk_adjustment_set_step_increment (vadjustment, 10.0);
9789 gtk_scrollable_set_hadjustment (GTK_SCROLLABLE (layout), hadjustment);
9790 gtk_scrollable_set_vadjustment (GTK_SCROLLABLE (layout), vadjustment);
9792 gtk_widget_set_events (layout_widget, GDK_EXPOSURE_MASK);
9793 g_signal_connect (layout, "draw",
9794 G_CALLBACK (layout_draw_handler), NULL);
9796 gtk_layout_set_size (layout, 1600, 128000);
9798 for (i=0 ; i < 16 ; i++)
9799 for (j=0 ; j < 16 ; j++)
9801 sprintf(buf, "Button %d, %d", i, j);
9803 button = gtk_button_new_with_label (buf);
9805 button = gtk_label_new (buf);
9807 gtk_layout_put (layout, button, j*100, i*100);
9810 for (i=16; i < 1280; i++)
9812 sprintf(buf, "Button %d, %d", i, 0);
9814 button = gtk_button_new_with_label (buf);
9816 button = gtk_label_new (buf);
9818 gtk_layout_put (layout, button, 0, i*100);
9822 if (!gtk_widget_get_visible (window))
9823 gtk_widget_show_all (window);
9825 gtk_widget_destroy (window);
9829 /* FIXME: need to completely redo this for GtkStyleContext */
9831 create_styles (GtkWidget *widget)
9833 static GtkWidget *window = NULL;
9834 GtkWidget *content_area, *action_area;
9839 static GdkRGBA red = { 1,0,0,1 };
9840 static GdkRGBA green = { 0,1,0,1 };
9841 static GdkRGBA blue = { 0,0,1,1 };
9842 static GdkRGBA yellow = { 1,1,0,1 };
9843 static GdkRGBA cyan = { 0,1,1,1 };
9844 PangoFontDescription *font_desc;
9846 GtkRcStyle *rc_style;
9850 window = gtk_dialog_new ();
9851 gtk_window_set_screen (GTK_WINDOW (window),
9852 gtk_widget_get_screen (widget));
9854 g_signal_connect (window, "destroy",
9855 G_CALLBACK (gtk_widget_destroyed),
9858 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9859 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9861 button = gtk_button_new_with_label ("Close");
9862 g_signal_connect_swapped (button, "clicked",
9863 G_CALLBACK (gtk_widget_destroy),
9865 gtk_widget_set_can_default (button, TRUE);
9866 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9867 gtk_widget_show (button);
9869 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
9870 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9871 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, FALSE, 0);
9873 label = gtk_label_new ("Font:");
9874 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9875 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9877 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
9879 button = gtk_button_new_with_label ("Some Text");
9880 gtk_widget_override_font (gtk_bin_get_child (GTK_BIN (button)), font_desc);
9881 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9883 label = gtk_label_new ("Foreground:");
9884 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9885 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9887 button = gtk_button_new_with_label ("Some Text");
9888 gtk_widget_override_color (gtk_bin_get_child (GTK_BIN (button)), 0, &red);
9889 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9891 label = gtk_label_new ("Background:");
9892 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9893 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9895 button = gtk_button_new_with_label ("Some Text");
9896 gtk_widget_override_background_color (button, 0, &green);
9897 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9899 label = gtk_label_new ("Text:");
9900 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9901 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9903 entry = gtk_entry_new ();
9904 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9905 gtk_widget_override_color (entry, 0, &blue);
9906 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9908 label = gtk_label_new ("Base:");
9909 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9910 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9912 entry = gtk_entry_new ();
9913 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9914 gtk_widget_override_background_color (entry, 0, &yellow);
9915 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9917 label = gtk_label_new ("Cursor:");
9918 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9919 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9921 entry = gtk_entry_new ();
9922 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9923 gtk_widget_modify_cursor (entry, &red, &red);
9924 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9926 label = gtk_label_new ("Multiple:");
9927 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9928 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9930 button = gtk_button_new_with_label ("Some Text");
9932 rc_style = gtk_rc_style_new ();
9934 rc_style->font_desc = pango_font_description_copy (font_desc);
9935 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
9936 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
9937 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
9938 rc_style->fg[GTK_STATE_NORMAL] = yellow;
9939 rc_style->bg[GTK_STATE_NORMAL] = blue;
9940 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
9941 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
9942 rc_style->fg[GTK_STATE_ACTIVE] = red;
9943 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
9944 rc_style->xthickness = 5;
9945 rc_style->ythickness = 5;
9947 gtk_widget_modify_style (button, rc_style);
9948 gtk_widget_modify_style (gtk_bin_get_child (GTK_BIN (button)), rc_style);
9950 g_object_unref (rc_style);
9952 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9955 if (!gtk_widget_get_visible (window))
9956 gtk_widget_show_all (window);
9958 gtk_widget_destroy (window);
9963 * Main Window and Exit
9967 do_exit (GtkWidget *widget, GtkWidget *window)
9969 gtk_widget_destroy (window);
9975 void (*func) (GtkWidget *widget);
9976 gboolean do_not_benchmark;
9979 { "alpha window", create_alpha_window },
9980 { "big windows", create_big_windows },
9981 { "button box", create_button_box },
9982 { "buttons", create_buttons },
9983 { "check buttons", create_check_buttons },
9984 { "color selection", create_color_selection },
9985 { "composited window", create_composited_window },
9986 { "cursors", create_cursors },
9987 { "dialog", create_dialog },
9988 { "display & screen", create_display_screen, TRUE },
9989 { "entry", create_entry },
9990 { "event box", create_event_box },
9991 { "event watcher", create_event_watcher },
9992 { "expander", create_expander },
9993 { "flipping", create_flipping },
9994 { "focus", create_focus },
9995 { "font selection", create_font_selection },
9996 { "handle box", create_handle_box },
9997 { "image", create_image },
9998 { "key lookup", create_key_lookup },
9999 { "labels", create_labels },
10000 { "layout", create_layout },
10001 { "menus", create_menus },
10002 { "message dialog", create_message_dialog },
10003 { "modal window", create_modal_window, TRUE },
10004 { "notebook", create_notebook },
10005 { "panes", create_panes },
10006 { "paned keyboard", create_paned_keyboard_navigation },
10007 { "pixbuf", create_pixbuf },
10008 { "progress bar", create_progress_bar },
10009 { "properties", create_properties },
10010 { "radio buttons", create_radio_buttons },
10011 { "range controls", create_range_controls },
10012 { "rc file", create_rc_file },
10013 { "reparent", create_reparent },
10014 { "resize grips", create_resize_grips },
10015 { "rotated label", create_rotated_label },
10016 { "rotated text", create_rotated_text },
10017 { "saved position", create_saved_position },
10018 { "scrolled windows", create_scrolled_windows },
10019 { "shapes", create_shapes },
10020 { "size groups", create_size_groups },
10021 { "snapshot", create_snapshot },
10022 { "spinbutton", create_spins },
10023 { "statusbar", create_statusbar },
10025 { "styles", create_styles },
10027 { "test idle", create_idle_test },
10028 { "test mainloop", create_mainloop, TRUE },
10029 { "test scrolling", create_scroll_test },
10030 { "test selection", create_selection_test },
10031 { "test timeout", create_timeout_test },
10032 { "toggle buttons", create_toggle_buttons },
10033 { "toolbar", create_toolbar },
10034 { "tooltips", create_tooltips },
10035 { "WM hints", create_wmhints },
10036 { "window sizing", create_window_sizing },
10037 { "window states", create_window_states }
10039 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
10042 create_main_window (void)
10047 GtkWidget *scrolled_window;
10051 GtkWidget *separator;
10052 GdkGeometry geometry;
10055 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10056 gtk_widget_set_name (window, "main_window");
10057 gtk_window_move (GTK_WINDOW (window), 50, 20);
10058 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
10060 geometry.min_width = -1;
10061 geometry.min_height = -1;
10062 geometry.max_width = -1;
10063 geometry.max_height = G_MAXSHORT;
10064 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
10066 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
10068 g_signal_connect (window, "destroy",
10069 G_CALLBACK (gtk_main_quit),
10071 g_signal_connect (window, "delete-event",
10072 G_CALLBACK (gtk_false),
10075 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
10076 gtk_container_add (GTK_CONTAINER (window), box1);
10078 if (gtk_micro_version > 0)
10081 gtk_get_major_version (),
10082 gtk_get_minor_version (),
10083 gtk_get_micro_version ());
10087 gtk_get_major_version (),
10088 gtk_get_minor_version ());
10090 label = gtk_label_new (buffer);
10091 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
10092 gtk_widget_set_name (label, "testgtk-version-label");
10094 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
10095 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
10096 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
10098 GTK_POLICY_AUTOMATIC);
10099 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
10101 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
10102 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10103 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
10104 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
10105 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
10106 gtk_widget_show (box2);
10108 for (i = 0; i < nbuttons; i++)
10110 button = gtk_button_new_with_label (buttons[i].label);
10111 if (buttons[i].func)
10112 g_signal_connect (button,
10114 G_CALLBACK(buttons[i].func),
10117 gtk_widget_set_sensitive (button, FALSE);
10118 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10121 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
10122 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
10124 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
10125 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10126 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
10128 button = gtk_button_new_with_mnemonic ("_Close");
10129 g_signal_connect (button, "clicked",
10130 G_CALLBACK (do_exit),
10132 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10133 gtk_widget_set_can_default (button, TRUE);
10134 gtk_widget_grab_default (button);
10136 gtk_widget_show_all (window);
10142 if (g_file_test ("../modules/input/immodules.cache", G_FILE_TEST_EXISTS))
10143 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/immodules.cache", TRUE);
10147 pad (const char *str, int to)
10149 static char buf[256];
10150 int len = strlen (str);
10153 for (i = 0; i < to; i++)
10158 memcpy (buf, str, len);
10164 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
10166 fn (widget); /* on */
10167 while (g_main_context_iteration (NULL, FALSE));
10168 fn (widget); /* off */
10169 while (g_main_context_iteration (NULL, FALSE));
10173 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
10179 static gboolean printed_headers = FALSE;
10181 if (!printed_headers) {
10182 g_print ("Test Iters First Other\n");
10183 g_print ("-------------------- ----- ---------- ----------\n");
10184 printed_headers = TRUE;
10187 g_get_current_time (&tv0);
10188 bench_iteration (widget, fn);
10189 g_get_current_time (&tv1);
10191 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10192 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10194 g_get_current_time (&tv0);
10195 for (n = 0; n < num - 1; n++)
10196 bench_iteration (widget, fn);
10197 g_get_current_time (&tv1);
10198 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10199 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10201 g_print ("%s %5d ", pad (name, 20), num);
10203 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
10205 g_print ("%10.1f\n", dt_first);
10209 do_bench (char* what, int num)
10213 void (* fn) (GtkWidget *widget);
10215 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10217 if (g_ascii_strcasecmp (what, "ALL") == 0)
10219 for (i = 0; i < nbuttons; i++)
10221 if (!buttons[i].do_not_benchmark)
10222 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
10229 for (i = 0; i < nbuttons; i++)
10231 if (strcmp (buttons[i].label, what) == 0)
10233 fn = buttons[i].func;
10239 g_print ("Can't bench: \"%s\" not found.\n", what);
10241 do_real_bench (widget, fn, buttons[i].label, num);
10248 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
10253 main (int argc, char *argv[])
10255 GtkCssProvider *provider, *memory_provider;
10256 GdkDisplay *display;
10258 GtkBindingSet *binding_set;
10260 gboolean done_benchmarks = FALSE;
10262 srand (time (NULL));
10266 g_set_application_name ("GTK+ Test Program");
10268 gtk_init (&argc, &argv);
10270 provider = gtk_css_provider_new ();
10272 /* Check to see if we are being run from the correct
10275 if (file_exists ("testgtk.css"))
10276 gtk_css_provider_load_from_path (provider, "testgtk.css", NULL);
10277 else if (file_exists ("tests/testgtk.css"))
10278 gtk_css_provider_load_from_path (provider, "tests/testgtk.css", NULL);
10280 g_warning ("Couldn't find file \"testgtk.css\".");
10282 display = gdk_display_get_default ();
10283 screen = gdk_display_get_default_screen (display);
10285 gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (provider),
10286 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
10287 g_object_unref (provider);
10289 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
10298 for (i = 1; i < argc; i++)
10300 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
10307 nextarg = strchr (argv[i], '=');
10318 count = strchr (nextarg, ':');
10321 what = g_strndup (nextarg, count - nextarg);
10323 num = atoi (count);
10328 what = g_strdup (nextarg);
10330 do_bench (what, num ? num : 1);
10331 done_benchmarks = TRUE;
10336 if (done_benchmarks)
10341 binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
10342 gtk_binding_entry_add_signal (binding_set,
10343 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
10346 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
10348 memory_provider = gtk_css_provider_new ();
10349 gtk_css_provider_load_from_data (memory_provider,
10350 "#testgtk-version-label {\n"
10352 " font: Sans 18;\n"
10355 gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (memory_provider),
10356 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION + 1);
10358 create_main_window ();
10364 while (g_main_context_pending (NULL))
10365 g_main_context_iteration (NULL, FALSE);
10368 while (g_main_context_pending (NULL))
10369 g_main_context_iteration (NULL, FALSE);