1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
21 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
22 * file for a list of people on the GTK+ Team. See the ChangeLog
23 * files for a list of changes. These files are distributed with
24 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
44 #include "gdk/gdkkeysyms.h"
47 #define sleep(n) _sleep(n)
50 #include "prop-editor.h"
55 file_exists (const char *filename)
59 return stat (filename, &statbuf) == 0;
63 shape_create_icon (GdkScreen *screen,
72 build_option_menu (gchar *items[],
75 void (*func) (GtkWidget *widget, gpointer data),
78 /* macro, structure and variables used by tree window demos */
79 #define DEFAULT_NUMBER_OF_ITEM 3
80 #define DEFAULT_RECURSION_LEVEL 3
83 GSList* selection_mode_group;
84 GtkWidget* single_button;
85 GtkWidget* browse_button;
86 GtkWidget* multiple_button;
87 GtkWidget* draw_line_button;
88 GtkWidget* view_line_button;
89 GtkWidget* no_root_item_button;
90 GtkWidget* nb_item_spinner;
91 GtkWidget* recursion_spinner;
92 } sTreeSampleSelection;
94 typedef struct sTreeButtons {
96 GtkWidget* add_button;
97 GtkWidget* remove_button;
98 GtkWidget* subtree_button;
100 /* end of tree section */
103 build_option_menu (gchar *items[],
106 void (*func)(GtkWidget *widget, gpointer data),
112 omenu = gtk_combo_box_text_new ();
113 g_signal_connect (omenu, "changed",
114 G_CALLBACK (func), data);
116 for (i = 0; i < num_items; i++)
117 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (omenu), items[i]);
119 gtk_combo_box_set_active (GTK_COMBO_BOX (omenu), history);
125 * Windows with an alpha channel
130 on_alpha_window_draw (GtkWidget *widget,
133 cairo_pattern_t *pattern;
134 int radius, width, height;
136 width = gtk_widget_get_allocated_width (widget);
137 height = gtk_widget_get_allocated_height (widget);
138 radius = MIN (width, height) / 2;
139 pattern = cairo_pattern_create_radial (width / 2,
146 if (gdk_screen_get_rgba_visual (gtk_widget_get_screen (widget)) &&
147 gtk_widget_is_composited (widget))
148 cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.0); /* transparent */
150 cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* opaque white */
152 cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
155 cairo_pattern_add_color_stop_rgba (pattern, 0.0,
156 1.0, 0.75, 0.0, 1.0); /* solid orange */
157 cairo_pattern_add_color_stop_rgba (pattern, 1.0,
158 1.0, 0.75, 0.0, 0.0); /* transparent orange */
160 cairo_set_source (cr, pattern);
161 cairo_pattern_destroy (pattern);
163 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
170 build_alpha_widgets (void)
173 GtkWidget *radio_button;
178 table = gtk_table_new (1, 1, FALSE);
180 radio_button = gtk_radio_button_new_with_label (NULL, "Red");
181 gtk_table_attach (GTK_TABLE (table),
184 GTK_EXPAND | GTK_FILL, 0,
187 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Green");
188 gtk_table_attach (GTK_TABLE (table),
191 GTK_EXPAND | GTK_FILL, 0,
194 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Blue"),
195 gtk_table_attach (GTK_TABLE (table),
198 GTK_EXPAND | GTK_FILL, 0,
201 gtk_table_attach (GTK_TABLE (table),
202 gtk_check_button_new_with_label ("Sedentary"),
204 GTK_EXPAND | GTK_FILL, 0,
206 gtk_table_attach (GTK_TABLE (table),
207 gtk_check_button_new_with_label ("Nocturnal"),
209 GTK_EXPAND | GTK_FILL, 0,
211 gtk_table_attach (GTK_TABLE (table),
212 gtk_check_button_new_with_label ("Compulsive"),
214 GTK_EXPAND | GTK_FILL, 0,
217 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Green");
218 gtk_table_attach (GTK_TABLE (table),
221 GTK_EXPAND | GTK_FILL, 0,
224 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Blue"),
225 gtk_table_attach (GTK_TABLE (table),
228 GTK_EXPAND | GTK_FILL, 0,
231 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
232 label = gtk_label_new (NULL);
233 gtk_label_set_markup (GTK_LABEL (label), "<i>Entry: </i>");
234 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
235 entry = gtk_entry_new ();
236 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
237 gtk_table_attach (GTK_TABLE (table),
240 GTK_EXPAND | GTK_FILL, 0,
247 on_alpha_screen_changed (GtkWindow *window,
248 GdkScreen *old_screen,
251 GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (window));
252 GdkVisual *visual = gdk_screen_get_rgba_visual (screen);
256 visual = gdk_screen_get_system_visual (screen);
257 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen doesn't support alpha</b>");
261 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen supports alpha</b>");
264 gtk_widget_set_visual (GTK_WIDGET (window), visual);
268 on_composited_changed (GtkWidget *window,
271 gboolean is_composited = gtk_widget_is_composited (window);
274 gtk_label_set_text (label, "Composited");
276 gtk_label_set_text (label, "Not composited");
280 create_alpha_window (GtkWidget *widget)
282 static GtkWidget *window;
286 GtkWidget *content_area;
290 window = gtk_dialog_new_with_buttons ("Alpha Window",
291 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
295 gtk_widget_set_app_paintable (window, TRUE);
296 g_signal_connect (window, "draw",
297 G_CALLBACK (on_alpha_window_draw), NULL);
299 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
301 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
302 gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
303 gtk_box_pack_start (GTK_BOX (content_area), vbox,
306 label = gtk_label_new (NULL);
307 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
308 on_alpha_screen_changed (GTK_WINDOW (window), NULL, label);
309 g_signal_connect (window, "screen-changed",
310 G_CALLBACK (on_alpha_screen_changed), label);
312 label = gtk_label_new (NULL);
313 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
314 on_composited_changed (window, GTK_LABEL (label));
315 g_signal_connect (window, "composited_changed", G_CALLBACK (on_composited_changed), label);
317 gtk_box_pack_start (GTK_BOX (vbox), build_alpha_widgets (), TRUE, TRUE, 0);
319 g_signal_connect (window, "destroy",
320 G_CALLBACK (gtk_widget_destroyed),
323 g_signal_connect (window, "response",
324 G_CALLBACK (gtk_widget_destroy),
328 if (!gtk_widget_get_visible (window))
329 gtk_widget_show_all (window);
331 gtk_widget_destroy (window);
335 * Composited non-toplevel window
338 /* The draw event handler for the event box.
340 * This function simply draws a transparency onto a widget on the area
341 * for which it receives expose events. This is intended to give the
342 * event box a "transparent" background.
344 * In order for this to work properly, the widget must have an RGBA
345 * colourmap. The widget should also be set as app-paintable since it
346 * doesn't make sense for GTK to draw a background if we are drawing it
347 * (and because GTK might actually replace our transparency with its
348 * default background colour).
351 transparent_draw (GtkWidget *widget,
354 cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
360 /* The expose event handler for the window.
362 * This function performs the actual compositing of the event box onto
363 * the already-existing background of the window at 50% normal opacity.
365 * In this case we do not want app-paintable to be set on the widget
366 * since we want it to draw its own (red) background. Because of this,
367 * however, we must ensure that we use g_signal_register_after so that
368 * this handler is called after the red has been drawn. If it was
369 * called before then GTK would just blindly paint over our work.
372 window_draw (GtkWidget *widget,
375 GtkAllocation allocation;
378 /* get our child (in this case, the event box) */
379 child = gtk_bin_get_child (GTK_BIN (widget));
381 gtk_widget_get_allocation (child, &allocation);
383 /* the source data is the (composited) event box */
384 gdk_cairo_set_source_window (cr, gtk_widget_get_window (child),
388 /* composite, with a 50% opacity */
389 cairo_paint_with_alpha (cr, 0.5);
395 create_composited_window (GtkWidget *widget)
397 static GtkWidget *window;
401 GtkWidget *event, *button;
404 /* make the widgets */
405 button = gtk_button_new_with_label ("A Button");
406 event = gtk_event_box_new ();
407 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
409 g_signal_connect (window, "destroy",
410 G_CALLBACK (gtk_widget_destroyed),
413 /* put a red background on the window */
414 gdk_rgba_parse (&red, "red");
415 gtk_widget_override_background_color (window, 0, &red);
417 /* set our event box to have a fully-transparent background
418 * drawn on it. currently there is no way to simply tell gtk
419 * that "transparency" is the background colour for a widget.
421 gtk_widget_set_app_paintable (GTK_WIDGET (event), TRUE);
422 g_signal_connect (event, "draw",
423 G_CALLBACK (transparent_draw), NULL);
425 /* put them inside one another */
426 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
427 gtk_container_add (GTK_CONTAINER (window), event);
428 gtk_container_add (GTK_CONTAINER (event), button);
430 /* realise and show everything */
431 gtk_widget_realize (button);
433 /* set the event box GdkWindow to be composited.
434 * obviously must be performed after event box is realised.
436 gdk_window_set_composited (gtk_widget_get_window (event),
439 /* set up the compositing handler.
440 * note that we do _after so that the normal (red) background is drawn
441 * by gtk before our compositing occurs.
443 g_signal_connect_after (window, "draw",
444 G_CALLBACK (window_draw), NULL);
447 if (!gtk_widget_get_visible (window))
448 gtk_widget_show_all (window);
450 gtk_widget_destroy (window);
454 * Big windows and guffaw scrolling
458 pattern_set_bg (GtkWidget *widget,
462 static const GdkColor colors[] = {
463 { 0, 0x4444, 0x4444, 0xffff },
464 { 0, 0x8888, 0x8888, 0xffff },
465 { 0, 0xaaaa, 0xaaaa, 0xffff }
468 gdk_window_set_user_data (child, widget);
469 gdk_window_set_background (child, &colors[level]);
473 create_pattern (GtkWidget *widget,
484 while (2 * h <= height)
489 while (2 * w <= width)
491 if ((i + j) % 2 == 0)
496 GdkWindowAttr attributes;
498 attributes.window_type = GDK_WINDOW_CHILD;
501 attributes.width = w;
502 attributes.height = h;
503 attributes.wclass = GDK_INPUT_OUTPUT;
504 attributes.event_mask = GDK_EXPOSURE_MASK;
505 attributes.visual = gtk_widget_get_visual (widget);
507 child = gdk_window_new (parent, &attributes,
508 GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL);
510 pattern_set_bg (widget, child, level);
513 create_pattern (widget, child, level + 1, w, h);
515 gdk_window_show (child);
525 #define PATTERN_SIZE (1 << 18)
528 pattern_hadj_changed (GtkAdjustment *adjustment,
531 gint *old_value = g_object_get_data (G_OBJECT (adjustment), "old-value");
532 gint new_value = gtk_adjustment_get_value (adjustment);
534 if (gtk_widget_get_realized (darea))
536 gdk_window_scroll (gtk_widget_get_window (darea),
537 *old_value - new_value, 0);
538 *old_value = new_value;
543 pattern_vadj_changed (GtkAdjustment *adjustment,
546 gint *old_value = g_object_get_data (G_OBJECT (adjustment), "old-value");
547 gint new_value = gtk_adjustment_get_value (adjustment);
549 if (gtk_widget_get_realized (darea))
551 gdk_window_scroll (gtk_widget_get_window (darea),
552 0, *old_value - new_value);
553 *old_value = new_value;
558 pattern_realize (GtkWidget *widget,
563 window = gtk_widget_get_window (widget);
564 pattern_set_bg (widget, window, 0);
565 create_pattern (widget, window, 1, PATTERN_SIZE, PATTERN_SIZE);
569 create_big_windows (GtkWidget *widget)
571 static GtkWidget *window = NULL;
572 GtkWidget *content_area;
573 GtkWidget *darea, *table, *scrollbar;
575 GtkAdjustment *hadjustment;
576 GtkAdjustment *vadjustment;
577 static gint current_x;
578 static gint current_y;
585 window = gtk_dialog_new_with_buttons ("Big Windows",
591 gtk_window_set_screen (GTK_WINDOW (window),
592 gtk_widget_get_screen (widget));
594 gtk_window_set_default_size (GTK_WINDOW (window), 200, 300);
596 g_signal_connect (window, "destroy",
597 G_CALLBACK (gtk_widget_destroyed),
600 g_signal_connect (window, "response",
601 G_CALLBACK (gtk_widget_destroy),
604 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
606 table = gtk_table_new (2, 2, FALSE);
607 gtk_box_pack_start (GTK_BOX (content_area), table, TRUE, TRUE, 0);
609 darea = gtk_drawing_area_new ();
611 hadjustment = gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
612 g_signal_connect (hadjustment, "value_changed",
613 G_CALLBACK (pattern_hadj_changed), darea);
614 g_object_set_data (G_OBJECT (hadjustment), "old-value", ¤t_x);
616 vadjustment = gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
617 g_signal_connect (vadjustment, "value_changed",
618 G_CALLBACK (pattern_vadj_changed), darea);
619 g_object_set_data (G_OBJECT (vadjustment), "old-value", ¤t_y);
621 g_signal_connect (darea, "realize",
622 G_CALLBACK (pattern_realize),
625 eventbox = gtk_event_box_new ();
626 gtk_table_attach (GTK_TABLE (table), eventbox,
628 GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND,
631 gtk_container_add (GTK_CONTAINER (eventbox), darea);
633 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, hadjustment);
634 gtk_table_attach (GTK_TABLE (table), scrollbar,
636 GTK_FILL | GTK_EXPAND, GTK_FILL,
639 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, vadjustment);
640 gtk_table_attach (GTK_TABLE (table), scrollbar,
642 GTK_FILL, GTK_EXPAND | GTK_FILL,
647 if (!gtk_widget_get_visible (window))
648 gtk_widget_show_all (window);
650 gtk_widget_hide (window);
658 button_window (GtkWidget *widget,
661 if (!gtk_widget_get_visible (button))
662 gtk_widget_show (button);
664 gtk_widget_hide (button);
668 create_buttons (GtkWidget *widget)
670 static GtkWidget *window = NULL;
674 GtkWidget *button[10];
675 GtkWidget *separator;
679 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
680 gtk_window_set_screen (GTK_WINDOW (window),
681 gtk_widget_get_screen (widget));
683 g_signal_connect (window, "destroy",
684 G_CALLBACK (gtk_widget_destroyed),
687 gtk_window_set_title (GTK_WINDOW (window), "GtkButton");
688 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
690 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
691 gtk_container_add (GTK_CONTAINER (window), box1);
693 table = gtk_table_new (3, 3, FALSE);
694 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
695 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
696 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
697 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
699 button[0] = gtk_button_new_with_label ("button1");
700 button[1] = gtk_button_new_with_mnemonic ("_button2");
701 button[2] = gtk_button_new_with_mnemonic ("_button3");
702 button[3] = gtk_button_new_from_stock (GTK_STOCK_OK);
703 button[4] = gtk_button_new_with_label ("button5");
704 button[5] = gtk_button_new_with_label ("button6");
705 button[6] = gtk_button_new_with_label ("button7");
706 button[7] = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
707 button[8] = gtk_button_new_with_label ("button9");
709 g_signal_connect (button[0], "clicked",
710 G_CALLBACK (button_window),
713 gtk_table_attach (GTK_TABLE (table), button[0], 0, 1, 0, 1,
714 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
716 g_signal_connect (button[1], "clicked",
717 G_CALLBACK (button_window),
720 gtk_table_attach (GTK_TABLE (table), button[1], 1, 2, 1, 2,
721 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
723 g_signal_connect (button[2], "clicked",
724 G_CALLBACK (button_window),
726 gtk_table_attach (GTK_TABLE (table), button[2], 2, 3, 2, 3,
727 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
729 g_signal_connect (button[3], "clicked",
730 G_CALLBACK (button_window),
732 gtk_table_attach (GTK_TABLE (table), button[3], 0, 1, 2, 3,
733 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
735 g_signal_connect (button[4], "clicked",
736 G_CALLBACK (button_window),
738 gtk_table_attach (GTK_TABLE (table), button[4], 2, 3, 0, 1,
739 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
741 g_signal_connect (button[5], "clicked",
742 G_CALLBACK (button_window),
744 gtk_table_attach (GTK_TABLE (table), button[5], 1, 2, 2, 3,
745 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
747 g_signal_connect (button[6], "clicked",
748 G_CALLBACK (button_window),
750 gtk_table_attach (GTK_TABLE (table), button[6], 1, 2, 0, 1,
751 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
753 g_signal_connect (button[7], "clicked",
754 G_CALLBACK (button_window),
756 gtk_table_attach (GTK_TABLE (table), button[7], 2, 3, 1, 2,
757 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
759 g_signal_connect (button[8], "clicked",
760 G_CALLBACK (button_window),
762 gtk_table_attach (GTK_TABLE (table), button[8], 0, 1, 1, 2,
763 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
765 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
766 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
768 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
769 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
770 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
772 button[9] = gtk_button_new_with_label ("close");
773 g_signal_connect_swapped (button[9], "clicked",
774 G_CALLBACK (gtk_widget_destroy),
776 gtk_box_pack_start (GTK_BOX (box2), button[9], TRUE, TRUE, 0);
777 gtk_widget_set_can_default (button[9], TRUE);
778 gtk_widget_grab_default (button[9]);
781 if (!gtk_widget_get_visible (window))
782 gtk_widget_show_all (window);
784 gtk_widget_destroy (window);
792 create_toggle_buttons (GtkWidget *widget)
794 static GtkWidget *window = NULL;
798 GtkWidget *separator;
802 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
803 gtk_window_set_screen (GTK_WINDOW (window),
804 gtk_widget_get_screen (widget));
806 g_signal_connect (window, "destroy",
807 G_CALLBACK (gtk_widget_destroyed),
810 gtk_window_set_title (GTK_WINDOW (window), "GtkToggleButton");
811 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
813 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
814 gtk_container_add (GTK_CONTAINER (window), box1);
816 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
817 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
818 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
820 button = gtk_toggle_button_new_with_label ("button1");
821 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
823 button = gtk_toggle_button_new_with_label ("button2");
824 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
826 button = gtk_toggle_button_new_with_label ("button3");
827 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
829 button = gtk_toggle_button_new_with_label ("inconsistent");
830 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
831 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
833 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
834 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
836 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
837 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
838 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
840 button = gtk_button_new_with_label ("close");
841 g_signal_connect_swapped (button, "clicked",
842 G_CALLBACK (gtk_widget_destroy),
844 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
845 gtk_widget_set_can_default (button, TRUE);
846 gtk_widget_grab_default (button);
849 if (!gtk_widget_get_visible (window))
850 gtk_widget_show_all (window);
852 gtk_widget_destroy (window);
856 create_widget_grid (GType widget_type)
859 GtkWidget *group_widget = NULL;
862 table = gtk_table_new (FALSE, 3, 3);
864 for (i = 0; i < 5; i++)
866 for (j = 0; j < 5; j++)
871 if (i == 0 && j == 0)
877 tmp = g_strdup_printf ("%d", j);
878 widget = gtk_label_new (tmp);
883 tmp = g_strdup_printf ("%c", 'A' + i - 1);
884 widget = gtk_label_new (tmp);
889 widget = g_object_new (widget_type, NULL);
891 if (g_type_is_a (widget_type, GTK_TYPE_RADIO_BUTTON))
894 group_widget = widget;
896 g_object_set (widget, "group", group_widget, NULL);
901 gtk_table_attach (GTK_TABLE (table), widget,
916 create_check_buttons (GtkWidget *widget)
918 static GtkWidget *window = NULL;
922 GtkWidget *separator;
927 window = gtk_dialog_new_with_buttons ("Check Buttons",
933 gtk_window_set_screen (GTK_WINDOW (window),
934 gtk_widget_get_screen (widget));
936 g_signal_connect (window, "destroy",
937 G_CALLBACK (gtk_widget_destroyed),
939 g_signal_connect (window, "response",
940 G_CALLBACK (gtk_widget_destroy),
943 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
945 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
946 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
947 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
949 button = gtk_check_button_new_with_mnemonic ("_button1");
950 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
952 button = gtk_check_button_new_with_label ("button2");
953 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
955 button = gtk_check_button_new_with_label ("button3");
956 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
958 button = gtk_check_button_new_with_label ("inconsistent");
959 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
960 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
962 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
963 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
965 table = create_widget_grid (GTK_TYPE_CHECK_BUTTON);
966 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
967 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
970 if (!gtk_widget_get_visible (window))
971 gtk_widget_show_all (window);
973 gtk_widget_destroy (window);
981 create_radio_buttons (GtkWidget *widget)
983 static GtkWidget *window = NULL;
987 GtkWidget *separator;
992 window = gtk_dialog_new_with_buttons ("Radio Buttons",
998 gtk_window_set_screen (GTK_WINDOW (window),
999 gtk_widget_get_screen (widget));
1001 g_signal_connect (window, "destroy",
1002 G_CALLBACK (gtk_widget_destroyed),
1004 g_signal_connect (window, "response",
1005 G_CALLBACK (gtk_widget_destroy),
1008 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
1010 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1011 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1012 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1014 button = gtk_radio_button_new_with_label (NULL, "button1");
1015 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1017 button = gtk_radio_button_new_with_label (
1018 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1020 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
1021 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1023 button = gtk_radio_button_new_with_label (
1024 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1026 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1028 button = gtk_radio_button_new_with_label (
1029 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1031 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
1032 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1034 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1035 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1037 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1038 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1039 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1041 button = gtk_radio_button_new_with_label (NULL, "button4");
1042 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1043 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1045 button = gtk_radio_button_new_with_label (
1046 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1048 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
1049 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1050 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1052 button = gtk_radio_button_new_with_label (
1053 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1055 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1056 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1058 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1059 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1061 table = create_widget_grid (GTK_TYPE_RADIO_BUTTON);
1062 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
1063 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
1066 if (!gtk_widget_get_visible (window))
1067 gtk_widget_show_all (window);
1069 gtk_widget_destroy (window);
1077 create_bbox (gint horizontal,
1088 frame = gtk_frame_new (title);
1091 bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
1093 bbox = gtk_button_box_new (GTK_ORIENTATION_VERTICAL);
1095 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
1096 gtk_container_add (GTK_CONTAINER (frame), bbox);
1098 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), layout);
1099 gtk_box_set_spacing (GTK_BOX (bbox), spacing);
1101 button = gtk_button_new_with_label ("OK");
1102 gtk_container_add (GTK_CONTAINER (bbox), button);
1104 button = gtk_button_new_with_label ("Cancel");
1105 gtk_container_add (GTK_CONTAINER (bbox), button);
1107 button = gtk_button_new_with_label ("Help");
1108 gtk_container_add (GTK_CONTAINER (bbox), button);
1114 create_button_box (GtkWidget *widget)
1116 static GtkWidget* window = NULL;
1117 GtkWidget *main_vbox;
1120 GtkWidget *frame_horz;
1121 GtkWidget *frame_vert;
1125 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1126 gtk_window_set_screen (GTK_WINDOW (window), gtk_widget_get_screen (widget));
1127 gtk_window_set_title (GTK_WINDOW (window), "Button Boxes");
1129 g_signal_connect (window, "destroy",
1130 G_CALLBACK (gtk_widget_destroyed),
1133 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
1135 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1136 gtk_container_add (GTK_CONTAINER (window), main_vbox);
1138 frame_horz = gtk_frame_new ("Horizontal Button Boxes");
1139 gtk_box_pack_start (GTK_BOX (main_vbox), frame_horz, TRUE, TRUE, 10);
1141 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1142 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
1143 gtk_container_add (GTK_CONTAINER (frame_horz), vbox);
1145 gtk_box_pack_start (GTK_BOX (vbox),
1146 create_bbox (TRUE, "Spread", 40, 85, 20, GTK_BUTTONBOX_SPREAD),
1149 gtk_box_pack_start (GTK_BOX (vbox),
1150 create_bbox (TRUE, "Edge", 40, 85, 20, GTK_BUTTONBOX_EDGE),
1153 gtk_box_pack_start (GTK_BOX (vbox),
1154 create_bbox (TRUE, "Start", 40, 85, 20, GTK_BUTTONBOX_START),
1157 gtk_box_pack_start (GTK_BOX (vbox),
1158 create_bbox (TRUE, "End", 40, 85, 20, GTK_BUTTONBOX_END),
1161 gtk_box_pack_start (GTK_BOX (vbox),
1162 create_bbox (TRUE, "Center", 40, 85, 20, GTK_BUTTONBOX_CENTER),
1165 frame_vert = gtk_frame_new ("Vertical Button Boxes");
1166 gtk_box_pack_start (GTK_BOX (main_vbox), frame_vert, TRUE, TRUE, 10);
1168 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
1169 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
1170 gtk_container_add (GTK_CONTAINER (frame_vert), hbox);
1172 gtk_box_pack_start (GTK_BOX (hbox),
1173 create_bbox (FALSE, "Spread", 30, 85, 20, GTK_BUTTONBOX_SPREAD),
1176 gtk_box_pack_start (GTK_BOX (hbox),
1177 create_bbox (FALSE, "Edge", 30, 85, 20, GTK_BUTTONBOX_EDGE),
1180 gtk_box_pack_start (GTK_BOX (hbox),
1181 create_bbox (FALSE, "Start", 30, 85, 20, GTK_BUTTONBOX_START),
1184 gtk_box_pack_start (GTK_BOX (hbox),
1185 create_bbox (FALSE, "End", 30, 85, 20, GTK_BUTTONBOX_END),
1188 gtk_box_pack_start (GTK_BOX (hbox),
1189 create_bbox (FALSE, "Center", 30, 85, 20, GTK_BUTTONBOX_CENTER),
1193 if (!gtk_widget_get_visible (window))
1194 gtk_widget_show_all (window);
1196 gtk_widget_destroy (window);
1204 new_pixbuf (char *filename,
1210 if (strcmp (filename, "test.xpm") == 0)
1213 pixbuf = gdk_pixbuf_new_from_file (filename, NULL);
1216 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
1218 widget = gtk_image_new_from_pixbuf (pixbuf);
1220 g_object_unref (pixbuf);
1227 set_toolbar_small_stock (GtkWidget *widget,
1230 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_SMALL_TOOLBAR);
1234 set_toolbar_large_stock (GtkWidget *widget,
1237 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_LARGE_TOOLBAR);
1241 set_toolbar_horizontal (GtkWidget *widget,
1244 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_HORIZONTAL);
1248 set_toolbar_vertical (GtkWidget *widget,
1251 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_VERTICAL);
1255 set_toolbar_icons (GtkWidget *widget,
1258 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_ICONS);
1262 set_toolbar_text (GtkWidget *widget,
1265 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_TEXT);
1269 set_toolbar_both (GtkWidget *widget,
1272 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH);
1276 set_toolbar_both_horiz (GtkWidget *widget,
1279 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH_HORIZ);
1283 set_toolbar_enable (GtkWidget *widget,
1286 GtkSettings *settings = gtk_widget_get_settings (widget);
1287 g_object_set (settings, "gtk-enable-tooltips", TRUE, NULL);
1291 set_toolbar_disable (GtkWidget *widget,
1294 GtkSettings *settings = gtk_widget_get_settings (widget);
1295 g_object_set (settings, "gtk-enable-tooltips", FALSE, NULL);
1298 static GtkActionEntry create_toolbar_items[] = {
1299 { NULL, GTK_STOCK_NEW, NULL, NULL, "Stock icon: New",
1300 G_CALLBACK (set_toolbar_small_stock) },
1301 { NULL, GTK_STOCK_OPEN, NULL, NULL, "Stock icon: Open",
1302 G_CALLBACK (set_toolbar_large_stock) },
1303 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1304 G_CALLBACK (set_toolbar_horizontal) },
1305 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1306 G_CALLBACK (set_toolbar_vertical) },
1308 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1309 G_CALLBACK (set_toolbar_icons) },
1310 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1311 G_CALLBACK (set_toolbar_text) },
1312 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1313 G_CALLBACK (set_toolbar_both) },
1314 { NULL, NULL, "Both (horizontal)", NULL, "Show toolbar icons and text in a horizontal fashion",
1315 G_CALLBACK (set_toolbar_both_horiz) },
1317 { "entry", NULL, NULL, "This is an unusable GtkEntry ;)",
1321 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1322 G_CALLBACK (set_toolbar_enable) },
1323 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1324 G_CALLBACK (set_toolbar_disable) },
1326 { NULL, NULL, "Frobate", NULL, "Frobate tooltip",
1328 { NULL, NULL, "Baz", NULL, "Baz tooltip",
1331 { NULL, NULL, "Blah", NULL, "Blash tooltip",
1333 { NULL, NULL, "Bar", NULL, "Bar tooltip",
1338 create_toolbar (GtkWidget *widget)
1340 static GtkWidget *window = NULL;
1347 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1348 gtk_window_set_screen (GTK_WINDOW (window),
1349 gtk_widget_get_screen (widget));
1351 gtk_window_set_title (GTK_WINDOW (window), "Toolbar test");
1353 g_signal_connect (window, "destroy",
1354 G_CALLBACK (gtk_widget_destroyed),
1357 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1358 gtk_widget_realize (window);
1360 toolbar = gtk_toolbar_new ();
1361 for (i = 0; i < G_N_ELEMENTS (create_toolbar_items); i++)
1363 GtkToolItem *toolitem;
1365 if (create_toolbar_items[i].tooltip == NULL)
1366 toolitem = gtk_separator_tool_item_new ();
1367 else if (g_strcmp0 (create_toolbar_items[i].name, "entry") == 0)
1371 toolitem = gtk_tool_item_new ();
1372 entry = gtk_entry_new ();
1373 gtk_container_add (GTK_CONTAINER (toolitem), entry);
1375 else if (create_toolbar_items[i].stock_id)
1376 toolitem = gtk_tool_button_new_from_stock (create_toolbar_items[i].stock_id);
1381 icon = new_pixbuf ("test.xpm", gtk_widget_get_window (window));
1382 toolitem = gtk_tool_button_new (icon, create_toolbar_items[i].label);
1384 if (create_toolbar_items[i].callback)
1385 g_signal_connect (toolitem, "clicked",
1386 create_toolbar_items[i].callback, toolbar);
1387 gtk_tool_item_set_tooltip_text (toolitem, create_toolbar_items[i].tooltip);
1388 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1391 gtk_container_add (GTK_CONTAINER (window), toolbar);
1393 gtk_widget_set_size_request (toolbar, 200, -1);
1396 if (!gtk_widget_get_visible (window))
1397 gtk_widget_show_all (window);
1399 gtk_widget_destroy (window);
1402 static GtkActionEntry make_toolbar_items[] = {
1403 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1404 G_CALLBACK (set_toolbar_horizontal) },
1405 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1406 G_CALLBACK (set_toolbar_vertical) },
1408 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1409 G_CALLBACK (set_toolbar_icons) },
1410 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1411 G_CALLBACK (set_toolbar_text) },
1412 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1413 G_CALLBACK (set_toolbar_both) },
1415 { NULL, NULL, "Woot", NULL, "Woot woot woot",
1417 { NULL, NULL, "Blah", NULL, "Blah blah blah",
1420 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1421 G_CALLBACK (set_toolbar_enable) },
1422 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1423 G_CALLBACK (set_toolbar_disable) },
1425 { NULL, NULL, "Hoo", NULL, "Hoo tooltip",
1427 { NULL, NULL, "Woo", NULL, "Woo tooltip",
1432 make_toolbar (GtkWidget *window)
1437 if (!gtk_widget_get_realized (window))
1438 gtk_widget_realize (window);
1440 toolbar = gtk_toolbar_new ();
1441 for (i = 0; i < G_N_ELEMENTS (make_toolbar_items); i++)
1444 GtkToolItem *toolitem;
1446 if (make_toolbar_items[i].label == NULL)
1448 toolitem = gtk_separator_tool_item_new ();
1451 icon = new_pixbuf ("test.xpm", gtk_widget_get_window (window));
1452 toolitem = gtk_tool_button_new (icon, make_toolbar_items[i].label);
1453 gtk_tool_item_set_tooltip_text (toolitem, make_toolbar_items[i].tooltip);
1454 if (make_toolbar_items[i].callback != NULL)
1455 g_signal_connect (toolitem, "clicked", make_toolbar_items[i].callback, toolbar);
1456 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1466 static guint statusbar_counter = 1;
1469 statusbar_push (GtkWidget *button,
1470 GtkStatusbar *statusbar)
1474 sprintf (text, "something %d", statusbar_counter++);
1476 gtk_statusbar_push (statusbar, 1, text);
1480 statusbar_push_long (GtkWidget *button,
1481 GtkStatusbar *statusbar)
1485 sprintf (text, "Just because a system has menu choices written with English words, phrases or sentences, that is no guarantee, that it is comprehensible. Individual words may not be familiar to some users (for example, \"repaginate\"), and two menu items may appear to satisfy the users's needs, whereas only one does (for example, \"put away\" or \"eject\").");
1487 gtk_statusbar_push (statusbar, 1, text);
1491 statusbar_pop (GtkWidget *button,
1492 GtkStatusbar *statusbar)
1494 gtk_statusbar_pop (statusbar, 1);
1498 statusbar_steal (GtkWidget *button,
1499 GtkStatusbar *statusbar)
1501 gtk_statusbar_remove (statusbar, 1, 4);
1505 statusbar_popped (GtkStatusbar *statusbar,
1510 statusbar_counter = 1;
1514 statusbar_contexts (GtkStatusbar *statusbar)
1518 string = "any context";
1519 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1521 gtk_statusbar_get_context_id (statusbar, string));
1523 string = "idle messages";
1524 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1526 gtk_statusbar_get_context_id (statusbar, string));
1528 string = "some text";
1529 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1531 gtk_statusbar_get_context_id (statusbar, string));
1533 string = "hit the mouse";
1534 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1536 gtk_statusbar_get_context_id (statusbar, string));
1538 string = "hit the mouse2";
1539 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1541 gtk_statusbar_get_context_id (statusbar, string));
1545 create_statusbar (GtkWidget *widget)
1547 static GtkWidget *window = NULL;
1551 GtkWidget *separator;
1552 GtkWidget *statusbar;
1556 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1557 gtk_window_set_screen (GTK_WINDOW (window),
1558 gtk_widget_get_screen (widget));
1560 g_signal_connect (window, "destroy",
1561 G_CALLBACK (gtk_widget_destroyed),
1564 gtk_window_set_title (GTK_WINDOW (window), "statusbar");
1565 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1567 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1568 gtk_container_add (GTK_CONTAINER (window), box1);
1570 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1571 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1572 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1574 statusbar = gtk_statusbar_new ();
1575 gtk_box_pack_end (GTK_BOX (box1), statusbar, TRUE, TRUE, 0);
1576 g_signal_connect (statusbar,
1578 G_CALLBACK (statusbar_popped),
1581 button = g_object_new (gtk_button_get_type (),
1582 "label", "push something",
1586 g_object_connect (button,
1587 "signal::clicked", statusbar_push, statusbar,
1590 button = g_object_connect (g_object_new (gtk_button_get_type (),
1595 "signal_after::clicked", statusbar_pop, statusbar,
1598 button = g_object_connect (g_object_new (gtk_button_get_type (),
1599 "label", "steal #4",
1603 "signal_after::clicked", statusbar_steal, statusbar,
1606 button = g_object_connect (g_object_new (gtk_button_get_type (),
1607 "label", "test contexts",
1611 "swapped_signal_after::clicked", statusbar_contexts, statusbar,
1614 button = g_object_connect (g_object_new (gtk_button_get_type (),
1615 "label", "push something long",
1619 "signal_after::clicked", statusbar_push_long, statusbar,
1622 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1623 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1625 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1626 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1627 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
1629 button = gtk_button_new_with_label ("close");
1630 g_signal_connect_swapped (button, "clicked",
1631 G_CALLBACK (gtk_widget_destroy),
1633 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1634 gtk_widget_set_can_default (button, TRUE);
1635 gtk_widget_grab_default (button);
1638 if (!gtk_widget_get_visible (window))
1639 gtk_widget_show_all (window);
1641 gtk_widget_destroy (window);
1649 handle_box_child_signal (GtkHandleBox *hb,
1651 const gchar *action)
1653 printf ("%s: child <%s> %sed\n",
1654 g_type_name (G_OBJECT_TYPE (hb)),
1655 g_type_name (G_OBJECT_TYPE (child)),
1660 create_handle_box (GtkWidget *widget)
1662 static GtkWidget* window = NULL;
1663 GtkWidget *handle_box;
1664 GtkWidget *handle_box2;
1669 GtkWidget *separator;
1673 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1675 gtk_window_set_screen (GTK_WINDOW (window),
1676 gtk_widget_get_screen (widget));
1677 gtk_window_set_modal (GTK_WINDOW (window), FALSE);
1678 gtk_window_set_title (GTK_WINDOW (window),
1680 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
1682 g_signal_connect (window, "destroy",
1683 G_CALLBACK (gtk_widget_destroyed),
1686 gtk_container_set_border_width (GTK_CONTAINER (window), 20);
1688 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1689 gtk_container_add (GTK_CONTAINER (window), vbox);
1690 gtk_widget_show (vbox);
1692 label = gtk_label_new ("Above");
1693 gtk_container_add (GTK_CONTAINER (vbox), label);
1694 gtk_widget_show (label);
1696 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1697 gtk_container_add (GTK_CONTAINER (vbox), separator);
1698 gtk_widget_show (separator);
1700 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
1701 gtk_container_add (GTK_CONTAINER (vbox), hbox);
1702 gtk_widget_show (hbox);
1704 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1705 gtk_container_add (GTK_CONTAINER (vbox), separator);
1706 gtk_widget_show (separator);
1708 label = gtk_label_new ("Below");
1709 gtk_container_add (GTK_CONTAINER (vbox), label);
1710 gtk_widget_show (label);
1712 handle_box = gtk_handle_box_new ();
1713 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1714 g_signal_connect (handle_box,
1716 G_CALLBACK (handle_box_child_signal),
1718 g_signal_connect (handle_box,
1720 G_CALLBACK (handle_box_child_signal),
1722 gtk_widget_show (handle_box);
1724 toolbar = make_toolbar (window);
1726 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
1727 gtk_widget_show (toolbar);
1729 handle_box = gtk_handle_box_new ();
1730 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1731 g_signal_connect (handle_box,
1733 G_CALLBACK (handle_box_child_signal),
1735 g_signal_connect (handle_box,
1737 G_CALLBACK (handle_box_child_signal),
1739 gtk_widget_show (handle_box);
1741 handle_box2 = gtk_handle_box_new ();
1742 gtk_container_add (GTK_CONTAINER (handle_box), handle_box2);
1743 g_signal_connect (handle_box2,
1745 G_CALLBACK (handle_box_child_signal),
1747 g_signal_connect (handle_box2,
1749 G_CALLBACK (handle_box_child_signal),
1751 gtk_widget_show (handle_box2);
1753 hbox = g_object_new (GTK_TYPE_HBOX, "visible", 1, "parent", handle_box2, NULL);
1754 label = gtk_label_new ("Fooo!");
1755 gtk_container_add (GTK_CONTAINER (hbox), label);
1756 gtk_widget_show (label);
1757 g_object_new (GTK_TYPE_ARROW, "visible", 1, "parent", hbox, NULL);
1760 if (!gtk_widget_get_visible (window))
1761 gtk_widget_show (window);
1763 gtk_widget_destroy (window);
1770 sensitivity_toggled (GtkWidget *toggle,
1773 gtk_widget_set_sensitive (widget,
1774 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle)));
1778 create_sensitivity_control (GtkWidget *widget)
1782 button = gtk_toggle_button_new_with_label ("Sensitive");
1784 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
1785 gtk_widget_is_sensitive (widget));
1787 g_signal_connect (button,
1789 G_CALLBACK (sensitivity_toggled),
1792 gtk_widget_show_all (button);
1798 set_selectable_recursive (GtkWidget *widget,
1801 if (GTK_IS_CONTAINER (widget))
1806 children = gtk_container_get_children (GTK_CONTAINER (widget));
1810 set_selectable_recursive (tmp->data, setting);
1814 g_list_free (children);
1816 else if (GTK_IS_LABEL (widget))
1818 gtk_label_set_selectable (GTK_LABEL (widget), setting);
1823 selectable_toggled (GtkWidget *toggle,
1826 set_selectable_recursive (widget,
1827 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle)));
1831 create_selectable_control (GtkWidget *widget)
1835 button = gtk_toggle_button_new_with_label ("Selectable");
1837 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
1840 g_signal_connect (button,
1842 G_CALLBACK (selectable_toggled),
1845 gtk_widget_show_all (button);
1851 dialog_response (GtkWidget *dialog, gint response_id, GtkLabel *label)
1855 gtk_widget_destroy (dialog);
1857 text = "Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
1858 "as hyperlinks, which can be clicked\n"
1859 "or activated via <a href=\"keynav\">keynav</a>.\n"
1860 "The links remain the same.";
1861 gtk_label_set_markup (label, text);
1865 activate_link (GtkWidget *label, const gchar *uri, gpointer data)
1867 if (g_strcmp0 (uri, "keynav") == 0)
1871 dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (gtk_widget_get_toplevel (label)),
1872 GTK_DIALOG_DESTROY_WITH_PARENT,
1875 "The term <i>keynav</i> is a shorthand for "
1876 "keyboard navigation and refers to the process of using a program "
1877 "(exclusively) via keyboard input.");
1879 gtk_window_present (GTK_WINDOW (dialog));
1881 g_signal_connect (dialog, "response", G_CALLBACK (dialog_response), label);
1889 void create_labels (GtkWidget *widget)
1891 static GtkWidget *window = NULL;
1900 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1902 gtk_window_set_screen (GTK_WINDOW (window),
1903 gtk_widget_get_screen (widget));
1905 g_signal_connect (window, "destroy",
1906 G_CALLBACK (gtk_widget_destroyed),
1909 gtk_window_set_title (GTK_WINDOW (window), "Label");
1911 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1913 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
1914 gtk_container_add (GTK_CONTAINER (window), vbox);
1916 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
1918 button = create_sensitivity_control (hbox);
1920 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
1922 button = create_selectable_control (hbox);
1924 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
1926 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1928 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
1929 gtk_container_set_border_width (GTK_CONTAINER (window), 5);
1931 frame = gtk_frame_new ("Normal Label");
1932 label = gtk_label_new ("This is a Normal label");
1933 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
1934 gtk_container_add (GTK_CONTAINER (frame), label);
1935 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1937 frame = gtk_frame_new ("Multi-line Label");
1938 label = gtk_label_new ("This is a Multi-line label.\nSecond line\nThird line");
1939 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
1940 gtk_container_add (GTK_CONTAINER (frame), label);
1941 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1943 frame = gtk_frame_new ("Left Justified Label");
1944 label = gtk_label_new ("This is a Left-Justified\nMulti-line label.\nThird line");
1945 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_MIDDLE);
1946 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1947 gtk_container_add (GTK_CONTAINER (frame), label);
1948 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1950 frame = gtk_frame_new ("Right Justified Label");
1951 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
1952 label = gtk_label_new ("This is a Right-Justified\nMulti-line label.\nFourth line, (j/k)");
1953 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1954 gtk_container_add (GTK_CONTAINER (frame), label);
1955 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1957 frame = gtk_frame_new ("Internationalized Label");
1958 label = gtk_label_new (NULL);
1959 gtk_label_set_markup (GTK_LABEL (label),
1960 "French (Fran\303\247ais) Bonjour, Salut\n"
1961 "Korean (\355\225\234\352\270\200) \354\225\210\353\205\225\355\225\230\354\204\270\354\232\224, \354\225\210\353\205\225\355\225\230\354\213\255\353\213\210\352\271\214\n"
1962 "Russian (\320\240\321\203\321\201\321\201\320\272\320\270\320\271) \320\227\320\264\321\200\320\260\320\262\321\201\321\202\320\262\321\203\320\271\321\202\320\265!\n"
1963 "Chinese (Simplified) <span lang=\"zh-cn\">\345\205\203\346\260\224 \345\274\200\345\217\221</span>\n"
1964 "Chinese (Traditional) <span lang=\"zh-tw\">\345\205\203\346\260\243 \351\226\213\347\231\274</span>\n"
1965 "Japanese <span lang=\"ja\">\345\205\203\346\260\227 \351\226\213\347\231\272</span>");
1966 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1967 gtk_container_add (GTK_CONTAINER (frame), label);
1968 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1970 frame = gtk_frame_new ("Bidirection Label");
1971 label = gtk_label_new ("\342\200\217Arabic \330\247\331\204\330\263\331\204\330\247\331\205 \330\271\331\204\331\212\331\203\331\205\n"
1972 "\342\200\217Hebrew \327\251\327\234\327\225\327\235");
1973 gtk_container_add (GTK_CONTAINER (frame), label);
1974 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1976 frame = gtk_frame_new ("Links in a label");
1977 label = gtk_label_new ("Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
1978 "as hyperlinks, which can be clicked\n"
1979 "or activated via <a href=\"keynav\">keynav</a>");
1980 gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
1981 gtk_container_add (GTK_CONTAINER (frame), label);
1982 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1983 g_signal_connect (label, "activate-link", G_CALLBACK (activate_link), NULL);
1985 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1986 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
1987 frame = gtk_frame_new ("Line wrapped label");
1988 label = gtk_label_new ("This is an example of a line-wrapped label. It should not be taking "\
1989 "up the entire "/* big space to test spacing */\
1990 "width allocated to it, but automatically wraps the words to fit. "\
1991 "The time has come, for all good men, to come to the aid of their party. "\
1992 "The sixth sheik's six sheep's sick.\n"\
1993 " It supports multiple paragraphs correctly, and correctly adds "\
1994 "many extra spaces. ");
1996 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
1997 gtk_container_add (GTK_CONTAINER (frame), label);
1998 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2000 frame = gtk_frame_new ("Filled, wrapped label");
2001 label = gtk_label_new ("This is an example of a line-wrapped, filled label. It should be taking "\
2002 "up the entire width allocated to it. Here is a seneance to prove "\
2003 "my point. Here is another sentence. "\
2004 "Here comes the sun, do de do de do.\n"\
2005 " This is a new paragraph.\n"\
2006 " This is another newer, longer, better paragraph. It is coming to an end, "\
2008 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_FILL);
2009 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2010 gtk_container_add (GTK_CONTAINER (frame), label);
2011 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2013 frame = gtk_frame_new ("Underlined label");
2014 label = gtk_label_new ("This label is underlined!\n"
2015 "This one is underlined (\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257) in quite a funky fashion");
2016 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2017 gtk_label_set_pattern (GTK_LABEL (label), "_________________________ _ _________ _ _____ _ __ __ ___ ____ _____");
2018 gtk_container_add (GTK_CONTAINER (frame), label);
2019 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2021 frame = gtk_frame_new ("Markup label");
2022 label = gtk_label_new (NULL);
2024 /* There's also a gtk_label_set_markup() without accel if you
2025 * don't have an accelerator key
2027 gtk_label_set_markup_with_mnemonic (GTK_LABEL (label),
2028 "This <span foreground=\"blue\" background=\"orange\">label</span> has "
2029 "<b>markup</b> _such as "
2030 "<big><i>Big Italics</i></big>\n"
2031 "<tt>Monospace font</tt>\n"
2032 "<u>Underline!</u>\n"
2034 "<span foreground=\"green\" background=\"red\">Ugly colors</span>\n"
2035 "and nothing on this line,\n"
2038 "or even on this one\n"
2039 "la <big>la <big>la <big>la <big>la</big></big></big></big>\n"
2040 "but this _word is <span foreground=\"purple\"><big>purple</big></span>\n"
2041 "<span underline=\"double\">We like <sup>superscript</sup> and <sub>subscript</sub> too</span>");
2043 g_assert (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)) == GDK_KEY_s);
2045 gtk_container_add (GTK_CONTAINER (frame), label);
2046 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2049 if (!gtk_widget_get_visible (window))
2050 gtk_widget_show_all (window);
2052 gtk_widget_destroy (window);
2056 on_angle_scale_changed (GtkRange *range,
2059 gtk_label_set_angle (GTK_LABEL (label), gtk_range_get_value (range));
2063 create_rotated_label (GtkWidget *widget)
2065 static GtkWidget *window = NULL;
2066 GtkWidget *content_area;
2070 GtkWidget *scale_label;
2071 GtkWidget *scale_hbox;
2075 window = gtk_dialog_new_with_buttons ("Rotated Label",
2076 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2077 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2080 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2082 gtk_window_set_screen (GTK_WINDOW (window),
2083 gtk_widget_get_screen (widget));
2085 g_signal_connect (window, "response",
2086 G_CALLBACK (gtk_widget_destroy), NULL);
2087 g_signal_connect (window, "destroy",
2088 G_CALLBACK (gtk_widget_destroyed), &window);
2090 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2092 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2093 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
2094 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
2096 label = gtk_label_new (NULL);
2097 gtk_label_set_markup (GTK_LABEL (label), "Hello World\n<i>Rotate</i> <span underline='single' foreground='blue'>me</span>");
2098 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
2100 scale_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2101 gtk_box_pack_start (GTK_BOX (vbox), scale_hbox, FALSE, FALSE, 0);
2103 scale_label = gtk_label_new (NULL);
2104 gtk_label_set_markup (GTK_LABEL (scale_label), "<i>Angle: </i>");
2105 gtk_box_pack_start (GTK_BOX (scale_hbox), scale_label, FALSE, FALSE, 0);
2107 hscale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL,
2109 g_signal_connect (hscale, "value-changed",
2110 G_CALLBACK (on_angle_scale_changed), label);
2112 gtk_range_set_value (GTK_RANGE (hscale), 45);
2113 gtk_widget_set_size_request (hscale, 200, -1);
2114 gtk_box_pack_start (GTK_BOX (scale_hbox), hscale, TRUE, TRUE, 0);
2117 if (!gtk_widget_get_visible (window))
2118 gtk_widget_show_all (window);
2120 gtk_widget_destroy (window);
2123 #define DEFAULT_TEXT_RADIUS 200
2126 on_rotated_text_unrealize (GtkWidget *widget)
2128 g_object_set_data (G_OBJECT (widget), "text-gc", NULL);
2132 on_rotated_text_draw (GtkWidget *widget,
2134 GdkPixbuf *tile_pixbuf)
2136 static const gchar *words[] = { "The", "grand", "old", "Duke", "of", "York",
2137 "had", "10,000", "men" };
2142 PangoLayout *layout;
2143 PangoContext *context;
2144 PangoFontDescription *desc;
2148 gdk_cairo_set_source_pixbuf (cr, tile_pixbuf, 0, 0);
2149 cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT);
2152 cairo_set_source_rgb (cr, 0, 0, 0);
2154 width = gtk_widget_get_allocated_width (widget);
2155 height = gtk_widget_get_allocated_height (widget);
2156 radius = MIN (width, height) / 2.;
2158 cairo_translate (cr,
2159 radius + (width - 2 * radius) / 2,
2160 radius + (height - 2 * radius) / 2);
2161 cairo_scale (cr, radius / DEFAULT_TEXT_RADIUS, radius / DEFAULT_TEXT_RADIUS);
2163 context = gtk_widget_get_pango_context (widget);
2164 layout = pango_layout_new (context);
2165 desc = pango_font_description_from_string ("Sans Bold 30");
2166 pango_layout_set_font_description (layout, desc);
2167 pango_font_description_free (desc);
2169 n_words = G_N_ELEMENTS (words);
2170 for (i = 0; i < n_words; i++)
2176 cairo_rotate (cr, 2 * G_PI * i / n_words);
2177 pango_cairo_update_layout (cr, layout);
2179 pango_layout_set_text (layout, words[i], -1);
2180 pango_layout_get_size (layout, &width, &height);
2182 cairo_move_to (cr, - width / 2 / PANGO_SCALE, - DEFAULT_TEXT_RADIUS);
2183 pango_cairo_show_layout (cr, layout);
2188 g_object_unref (layout);
2194 create_rotated_text (GtkWidget *widget)
2196 static GtkWidget *window = NULL;
2200 const GdkRGBA white = { 1.0, 1.0, 1.0, 1.0 };
2201 GtkRequisition requisition;
2202 GtkWidget *content_area;
2203 GtkWidget *drawing_area;
2204 GdkPixbuf *tile_pixbuf;
2206 window = gtk_dialog_new_with_buttons ("Rotated Text",
2207 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2208 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2211 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2213 gtk_window_set_screen (GTK_WINDOW (window),
2214 gtk_widget_get_screen (widget));
2216 g_signal_connect (window, "response",
2217 G_CALLBACK (gtk_widget_destroy), NULL);
2218 g_signal_connect (window, "destroy",
2219 G_CALLBACK (gtk_widget_destroyed), &window);
2221 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2223 drawing_area = gtk_drawing_area_new ();
2224 gtk_box_pack_start (GTK_BOX (content_area), drawing_area, TRUE, TRUE, 0);
2225 gtk_widget_override_background_color (drawing_area, 0, &white);
2227 tile_pixbuf = gdk_pixbuf_new_from_file ("marble.xpm", NULL);
2229 g_signal_connect (drawing_area, "draw",
2230 G_CALLBACK (on_rotated_text_draw), tile_pixbuf);
2231 g_signal_connect (drawing_area, "unrealize",
2232 G_CALLBACK (on_rotated_text_unrealize), NULL);
2234 gtk_widget_show_all (gtk_bin_get_child (GTK_BIN (window)));
2236 gtk_widget_set_size_request (drawing_area, DEFAULT_TEXT_RADIUS * 2, DEFAULT_TEXT_RADIUS * 2);
2237 gtk_widget_get_preferred_size ( (window),
2238 &requisition, NULL);
2239 gtk_widget_set_size_request (drawing_area, -1, -1);
2240 gtk_window_resize (GTK_WINDOW (window), requisition.width, requisition.height);
2243 if (!gtk_widget_get_visible (window))
2244 gtk_widget_show (window);
2246 gtk_widget_destroy (window);
2254 reparent_label (GtkWidget *widget,
2255 GtkWidget *new_parent)
2259 label = g_object_get_data (G_OBJECT (widget), "user_data");
2261 gtk_widget_reparent (label, new_parent);
2265 set_parent_signal (GtkWidget *child,
2266 GtkWidget *old_parent,
2271 parent = gtk_widget_get_parent (child);
2272 g_message ("set_parent for \"%s\": new parent: \"%s\", old parent: \"%s\", data: %d\n",
2273 g_type_name (G_OBJECT_TYPE (child)),
2274 parent ? g_type_name (G_OBJECT_TYPE (parent)) : "NULL",
2275 old_parent ? g_type_name (G_OBJECT_TYPE (old_parent)) : "NULL",
2276 GPOINTER_TO_INT (func_data));
2280 create_reparent (GtkWidget *widget)
2282 static GtkWidget *window = NULL;
2289 GtkWidget *separator;
2290 GtkWidget *event_box;
2294 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2296 gtk_window_set_screen (GTK_WINDOW (window),
2297 gtk_widget_get_screen (widget));
2299 g_signal_connect (window, "destroy",
2300 G_CALLBACK (gtk_widget_destroyed),
2303 gtk_window_set_title (GTK_WINDOW (window), "reparent");
2304 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2306 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2307 gtk_container_add (GTK_CONTAINER (window), box1);
2309 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
2310 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2311 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2313 label = gtk_label_new ("Hello World");
2315 frame = gtk_frame_new ("Frame 1");
2316 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2318 box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2319 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2320 gtk_container_add (GTK_CONTAINER (frame), box3);
2322 button = gtk_button_new_with_label ("switch");
2323 g_object_set_data (G_OBJECT (button), "user_data", label);
2324 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2326 event_box = gtk_event_box_new ();
2327 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2328 gtk_container_add (GTK_CONTAINER (event_box), label);
2330 g_signal_connect (button, "clicked",
2331 G_CALLBACK (reparent_label),
2334 g_signal_connect (label, "parent_set",
2335 G_CALLBACK (set_parent_signal),
2336 GINT_TO_POINTER (42));
2338 frame = gtk_frame_new ("Frame 2");
2339 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2341 box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2342 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2343 gtk_container_add (GTK_CONTAINER (frame), box3);
2345 button = gtk_button_new_with_label ("switch");
2346 g_object_set_data (G_OBJECT (button), "user_data", label);
2347 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2349 event_box = gtk_event_box_new ();
2350 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2352 g_signal_connect (button, "clicked",
2353 G_CALLBACK (reparent_label),
2356 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2357 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2359 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2360 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2361 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2363 button = gtk_button_new_with_label ("close");
2364 g_signal_connect_swapped (button, "clicked",
2365 G_CALLBACK (gtk_widget_destroy), window);
2366 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2367 gtk_widget_set_can_default (button, TRUE);
2368 gtk_widget_grab_default (button);
2371 if (!gtk_widget_get_visible (window))
2372 gtk_widget_show_all (window);
2374 gtk_widget_destroy (window);
2381 grippy_button_press (GtkWidget *area, GdkEventButton *event, GdkWindowEdge edge)
2383 if (event->type == GDK_BUTTON_PRESS)
2385 if (event->button == 1)
2386 gtk_window_begin_resize_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)), edge,
2387 event->button, event->x_root, event->y_root,
2389 else if (event->button == 2)
2390 gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)),
2391 event->button, event->x_root, event->y_root,
2398 grippy_draw (GtkWidget *area, cairo_t *cr, GdkWindowEdge edge)
2400 GtkStyleContext *context;
2401 GtkJunctionSides sides;
2405 case GDK_WINDOW_EDGE_NORTH_WEST:
2406 sides = GTK_JUNCTION_CORNER_TOPLEFT;
2408 case GDK_WINDOW_EDGE_NORTH:
2409 sides = GTK_JUNCTION_TOP;
2411 case GDK_WINDOW_EDGE_NORTH_EAST:
2412 sides = GTK_JUNCTION_CORNER_TOPRIGHT;
2414 case GDK_WINDOW_EDGE_WEST:
2415 sides = GTK_JUNCTION_LEFT;
2417 case GDK_WINDOW_EDGE_EAST:
2418 sides = GTK_JUNCTION_RIGHT;
2420 case GDK_WINDOW_EDGE_SOUTH_WEST:
2421 sides = GTK_JUNCTION_CORNER_BOTTOMLEFT;
2423 case GDK_WINDOW_EDGE_SOUTH:
2424 sides = GTK_JUNCTION_BOTTOM;
2426 case GDK_WINDOW_EDGE_SOUTH_EAST:
2427 sides = GTK_JUNCTION_CORNER_BOTTOMRIGHT;
2431 context = gtk_widget_get_style_context (area);
2432 gtk_style_context_save (context);
2433 gtk_style_context_add_class (context, "grip");
2434 gtk_style_context_set_junction_sides (context, sides);
2435 gtk_render_handle (context, cr,
2437 gtk_widget_get_allocated_width (area),
2438 gtk_widget_get_allocated_height (area));
2440 gtk_style_context_restore (context);
2446 create_resize_grips (GtkWidget *widget)
2448 static GtkWidget *window = NULL;
2450 GtkWidget *hbox, *vbox;
2453 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2455 gtk_window_set_screen (GTK_WINDOW (window),
2456 gtk_widget_get_screen (widget));
2458 gtk_window_set_title (GTK_WINDOW (window), "resize grips");
2460 g_signal_connect (window, "destroy",
2461 G_CALLBACK (gtk_widget_destroyed),
2464 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2465 gtk_container_add (GTK_CONTAINER (window), vbox);
2467 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2468 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2471 area = gtk_drawing_area_new ();
2472 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2473 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2474 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2475 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2476 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2477 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2480 area = gtk_drawing_area_new ();
2481 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2482 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2483 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2484 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2485 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2486 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2489 area = gtk_drawing_area_new ();
2490 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2491 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2492 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2493 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2494 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2495 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2497 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2498 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2501 area = gtk_drawing_area_new ();
2502 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2503 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2504 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2505 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2506 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2507 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2510 area = gtk_drawing_area_new ();
2511 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2514 area = gtk_drawing_area_new ();
2515 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2516 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2517 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2518 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2519 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2520 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2523 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2524 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2527 area = gtk_drawing_area_new ();
2528 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2529 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2530 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2531 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2532 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2533 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2535 area = gtk_drawing_area_new ();
2536 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2537 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2538 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2539 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2540 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2541 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2544 area = gtk_drawing_area_new ();
2545 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2546 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2547 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2548 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2549 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2550 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2553 if (!gtk_widget_get_visible (window))
2554 gtk_widget_show_all (window);
2556 gtk_widget_destroy (window);
2562 gint upositionx = 0;
2563 gint upositiony = 0;
2566 uposition_configure (GtkWidget *window)
2572 lx = g_object_get_data (G_OBJECT (window), "x");
2573 ly = g_object_get_data (G_OBJECT (window), "y");
2575 gdk_window_get_root_origin (gtk_widget_get_window (window),
2576 &upositionx, &upositiony);
2577 sprintf (buffer, "%d", upositionx);
2578 gtk_label_set_text (lx, buffer);
2579 sprintf (buffer, "%d", upositiony);
2580 gtk_label_set_text (ly, buffer);
2586 uposition_stop_configure (GtkToggleButton *toggle,
2589 if (gtk_toggle_button_get_active (toggle))
2590 g_signal_handlers_block_by_func (window, G_CALLBACK (uposition_configure), NULL);
2592 g_signal_handlers_unblock_by_func (window, G_CALLBACK (uposition_configure), NULL);
2596 create_saved_position (GtkWidget *widget)
2598 static GtkWidget *window = NULL;
2603 GtkWidget *main_vbox;
2611 window = g_object_connect (g_object_new (GTK_TYPE_WINDOW,
2612 "type", GTK_WINDOW_TOPLEVEL,
2613 "title", "Saved Position",
2615 "signal::configure_event", uposition_configure, NULL,
2618 gtk_window_move (GTK_WINDOW (window), upositionx, upositiony);
2620 gtk_window_set_screen (GTK_WINDOW (window),
2621 gtk_widget_get_screen (widget));
2624 g_signal_connect (window, "destroy",
2625 G_CALLBACK (gtk_widget_destroyed),
2628 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2629 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
2630 gtk_container_add (GTK_CONTAINER (window), main_vbox);
2633 g_object_new (gtk_vbox_get_type (),
2634 "GtkBox::homogeneous", FALSE,
2635 "GtkBox::spacing", 5,
2636 "GtkContainer::border_width", 10,
2637 "GtkWidget::parent", main_vbox,
2638 "GtkWidget::visible", TRUE,
2639 "child", g_object_connect (g_object_new (GTK_TYPE_TOGGLE_BUTTON,
2640 "label", "Stop Events",
2644 "signal::clicked", uposition_stop_configure, window,
2648 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2649 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2650 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2652 label = gtk_label_new ("X Origin : ");
2653 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2654 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
2656 x_label = gtk_label_new ("");
2657 gtk_box_pack_start (GTK_BOX (hbox), x_label, TRUE, TRUE, 0);
2658 g_object_set_data (G_OBJECT (window), "x", x_label);
2660 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2661 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2662 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2664 label = gtk_label_new ("Y Origin : ");
2665 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2666 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
2668 y_label = gtk_label_new ("");
2669 gtk_box_pack_start (GTK_BOX (hbox), y_label, TRUE, TRUE, 0);
2670 g_object_set_data (G_OBJECT (window), "y", y_label);
2673 g_object_new (gtk_hseparator_get_type (),
2674 "GtkWidget::visible", TRUE,
2676 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
2678 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2679 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
2680 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
2682 button = gtk_button_new_with_label ("Close");
2683 g_signal_connect_swapped (button, "clicked",
2684 G_CALLBACK (gtk_widget_destroy),
2686 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
2687 gtk_widget_set_can_default (button, TRUE);
2688 gtk_widget_grab_default (button);
2690 gtk_widget_show_all (window);
2693 gtk_widget_destroy (window);
2701 create_pixbuf (GtkWidget *widget)
2703 static GtkWidget *window = NULL;
2709 GtkWidget *separator;
2710 GtkWidget *pixbufwid;
2711 GdkWindow *gdk_window;
2715 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2717 gtk_window_set_screen (GTK_WINDOW (window),
2718 gtk_widget_get_screen (widget));
2720 g_signal_connect (window, "destroy",
2721 G_CALLBACK (gtk_widget_destroyed),
2724 gtk_window_set_title (GTK_WINDOW (window), "GtkPixmap");
2725 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2726 gtk_widget_realize(window);
2728 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2729 gtk_container_add (GTK_CONTAINER (window), box1);
2731 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2732 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2733 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2735 button = gtk_button_new ();
2736 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
2738 gdk_window = gtk_widget_get_window (window);
2740 pixbufwid = new_pixbuf ("test.xpm", gdk_window);
2742 label = gtk_label_new ("Pixbuf\ntest");
2743 box3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2744 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
2745 gtk_container_add (GTK_CONTAINER (box3), pixbufwid);
2746 gtk_container_add (GTK_CONTAINER (box3), label);
2747 gtk_container_add (GTK_CONTAINER (button), box3);
2749 button = gtk_button_new ();
2750 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
2752 pixbufwid = new_pixbuf ("test.xpm", gdk_window);
2754 label = gtk_label_new ("Pixbuf\ntest");
2755 box3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2756 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
2757 gtk_container_add (GTK_CONTAINER (box3), pixbufwid);
2758 gtk_container_add (GTK_CONTAINER (box3), label);
2759 gtk_container_add (GTK_CONTAINER (button), box3);
2761 gtk_widget_set_sensitive (button, FALSE);
2763 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2764 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2766 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2767 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2768 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2770 button = gtk_button_new_with_label ("close");
2771 g_signal_connect_swapped (button, "clicked",
2772 G_CALLBACK (gtk_widget_destroy),
2774 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2775 gtk_widget_set_can_default (button, TRUE);
2776 gtk_widget_grab_default (button);
2779 if (!gtk_widget_get_visible (window))
2780 gtk_widget_show_all (window);
2782 gtk_widget_destroy (window);
2786 create_tooltips (GtkWidget *widget)
2788 static GtkWidget *window = NULL;
2795 GtkWidget *separator;
2800 g_object_new (gtk_window_get_type (),
2801 "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
2802 "GtkContainer::border_width", 0,
2803 "GtkWindow::title", "Tooltips",
2804 "GtkWindow::resizable", FALSE,
2807 gtk_window_set_screen (GTK_WINDOW (window),
2808 gtk_widget_get_screen (widget));
2810 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2811 gtk_container_add (GTK_CONTAINER (window), box1);
2813 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2814 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2815 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2817 button = gtk_toggle_button_new_with_label ("button1");
2818 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2820 gtk_widget_set_tooltip_text (button, "This is button 1");
2822 button = gtk_toggle_button_new_with_label ("button2");
2823 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2825 gtk_widget_set_tooltip_text (button,
2826 "This is button 2. This is also a really long tooltip which probably "
2827 "won't fit on a single line and will therefore need to be wrapped. "
2828 "Hopefully the wrapping will work correctly.");
2830 toggle = gtk_toggle_button_new_with_label ("Override TipsQuery Label");
2831 gtk_box_pack_start (GTK_BOX (box2), toggle, TRUE, TRUE, 0);
2833 gtk_widget_set_tooltip_text (toggle, "Toggle TipsQuery view.");
2836 g_object_new (gtk_vbox_get_type (),
2837 "homogeneous", FALSE,
2844 g_object_new (gtk_button_get_type (),
2849 gtk_box_set_child_packing (GTK_BOX (box3), button, FALSE, FALSE, 0, GTK_PACK_START);
2850 gtk_widget_set_tooltip_text (button, "Start the Tooltips Inspector");
2852 frame = g_object_new (gtk_frame_get_type (),
2853 "label", "ToolTips Inspector",
2854 "label_xalign", (double) 0.5,
2860 gtk_box_set_child_packing (GTK_BOX (box2), frame, TRUE, TRUE, 10, GTK_PACK_START);
2862 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2863 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2865 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2866 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2867 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2869 button = gtk_button_new_with_label ("close");
2870 g_signal_connect_swapped (button, "clicked",
2871 G_CALLBACK (gtk_widget_destroy),
2873 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2874 gtk_widget_set_can_default (button, TRUE);
2875 gtk_widget_grab_default (button);
2877 gtk_widget_set_tooltip_text (button, "Push this button to close window");
2880 if (!gtk_widget_get_visible (window))
2881 gtk_widget_show_all (window);
2883 gtk_widget_destroy (window);
2891 pack_image (GtkWidget *box,
2895 gtk_box_pack_start (GTK_BOX (box),
2896 gtk_label_new (text),
2899 gtk_box_pack_start (GTK_BOX (box),
2905 create_image (GtkWidget *widget)
2907 static GtkWidget *window = NULL;
2914 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2916 gtk_window_set_screen (GTK_WINDOW (window),
2917 gtk_widget_get_screen (widget));
2919 /* this is bogus for testing drawing when allocation < request,
2920 * don't copy into real code
2922 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2924 g_signal_connect (window, "destroy",
2925 G_CALLBACK (gtk_widget_destroyed),
2928 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2930 gtk_container_add (GTK_CONTAINER (window), vbox);
2932 pack_image (vbox, "Stock Warning Dialog",
2933 gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
2934 GTK_ICON_SIZE_DIALOG));
2936 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
2938 pack_image (vbox, "Pixbuf",
2939 gtk_image_new_from_pixbuf (pixbuf));
2941 g_object_unref (pixbuf);
2944 if (!gtk_widget_get_visible (window))
2945 gtk_widget_show_all (window);
2947 gtk_widget_destroy (window);
2955 create_menu (GdkScreen *screen, gint depth, gint length, gboolean tearoff)
2958 GtkWidget *menuitem;
2967 menu = gtk_menu_new ();
2968 gtk_menu_set_screen (GTK_MENU (menu), screen);
2974 menuitem = gtk_tearoff_menu_item_new ();
2975 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2976 gtk_widget_show (menuitem);
2979 image = gtk_image_new_from_stock (GTK_STOCK_OPEN,
2980 GTK_ICON_SIZE_MENU);
2981 gtk_widget_show (image);
2982 menuitem = gtk_image_menu_item_new_with_label ("Image item");
2983 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
2984 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2985 gtk_widget_show (menuitem);
2987 for (i = 0, j = 1; i < length; i++, j++)
2989 sprintf (buf, "item %2d - %d", depth, j);
2991 menuitem = gtk_radio_menu_item_new_with_label (group, buf);
2992 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
2994 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2995 gtk_widget_show (menuitem);
2997 gtk_widget_set_sensitive (menuitem, FALSE);
3000 gtk_check_menu_item_set_inconsistent (GTK_CHECK_MENU_ITEM (menuitem),
3004 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem),
3005 create_menu (screen, depth - 1, 5, TRUE));
3012 create_table_menu (GdkScreen *screen, gint cols, gint rows, gboolean tearoff)
3015 GtkWidget *menuitem;
3021 menu = gtk_menu_new ();
3022 gtk_menu_set_screen (GTK_MENU (menu), screen);
3027 menuitem = gtk_tearoff_menu_item_new ();
3028 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3029 gtk_widget_show (menuitem);
3033 menuitem = gtk_menu_item_new_with_label ("items");
3034 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3036 submenu = gtk_menu_new ();
3037 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3038 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3039 gtk_widget_show (menuitem);
3042 /* now fill the items submenu */
3043 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3044 GTK_ICON_SIZE_MENU);
3045 gtk_widget_show (image);
3046 menuitem = gtk_image_menu_item_new_with_label ("Image");
3047 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3048 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3049 gtk_widget_show (menuitem);
3051 menuitem = gtk_menu_item_new_with_label ("x");
3052 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 0, 1);
3053 gtk_widget_show (menuitem);
3055 menuitem = gtk_menu_item_new_with_label ("x");
3056 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 2);
3057 gtk_widget_show (menuitem);
3059 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3060 GTK_ICON_SIZE_MENU);
3061 gtk_widget_show (image);
3062 menuitem = gtk_image_menu_item_new_with_label ("Image");
3063 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3064 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3065 gtk_widget_show (menuitem);
3067 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3068 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 2, 3);
3069 gtk_widget_show (menuitem);
3071 menuitem = gtk_menu_item_new_with_label ("x");
3072 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 2, 3);
3073 gtk_widget_show (menuitem);
3075 menuitem = gtk_menu_item_new_with_label ("x");
3076 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 3, 4);
3077 gtk_widget_show (menuitem);
3079 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3080 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 3, 4);
3081 gtk_widget_show (menuitem);
3083 menuitem = gtk_check_menu_item_new_with_label ("Check");
3084 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 4, 5);
3085 gtk_widget_show (menuitem);
3087 menuitem = gtk_menu_item_new_with_label ("x");
3088 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 4, 5);
3089 gtk_widget_show (menuitem);
3091 menuitem = gtk_menu_item_new_with_label ("x");
3092 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 5, 6);
3093 gtk_widget_show (menuitem);
3095 menuitem = gtk_check_menu_item_new_with_label ("Check");
3096 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 5, 6);
3097 gtk_widget_show (menuitem);
3099 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3100 gtk_widget_show (menuitem);
3101 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 8);
3103 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3104 gtk_widget_show (menuitem);
3105 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 2);
3107 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3108 gtk_widget_show (menuitem);
3109 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 0);
3111 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3112 gtk_widget_show (menuitem);
3113 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, -1);
3115 /* end of items submenu */
3117 menuitem = gtk_menu_item_new_with_label ("spanning");
3118 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3120 submenu = gtk_menu_new ();
3121 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3122 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3123 gtk_widget_show (menuitem);
3126 /* now fill the spanning submenu */
3127 menuitem = gtk_menu_item_new_with_label ("a");
3128 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 2, 0, 1);
3129 gtk_widget_show (menuitem);
3131 menuitem = gtk_menu_item_new_with_label ("b");
3132 gtk_menu_attach (GTK_MENU (submenu), menuitem, 2, 3, 0, 2);
3133 gtk_widget_show (menuitem);
3135 menuitem = gtk_menu_item_new_with_label ("c");
3136 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 3);
3137 gtk_widget_show (menuitem);
3139 menuitem = gtk_menu_item_new_with_label ("d");
3140 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3141 gtk_widget_show (menuitem);
3143 menuitem = gtk_menu_item_new_with_label ("e");
3144 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 3, 2, 3);
3145 gtk_widget_show (menuitem);
3146 /* end of spanning submenu */
3148 menuitem = gtk_menu_item_new_with_label ("left");
3149 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, 1, j, j + 1);
3150 submenu = gtk_menu_new ();
3151 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3152 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3153 gtk_widget_show (menuitem);
3155 menuitem = gtk_menu_item_new_with_label ("Empty");
3156 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3157 submenu = gtk_menu_new ();
3158 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3159 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3160 gtk_widget_show (menuitem);
3162 menuitem = gtk_menu_item_new_with_label ("right");
3163 gtk_menu_attach (GTK_MENU (menu), menuitem, 1, 2, j, j + 1);
3164 submenu = gtk_menu_new ();
3165 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3166 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3167 gtk_widget_show (menuitem);
3169 menuitem = gtk_menu_item_new_with_label ("Empty");
3170 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3171 gtk_widget_show (menuitem);
3175 for (; j < rows; j++)
3176 for (i = 0; i < cols; i++)
3178 sprintf (buf, "(%d %d)", i, j);
3179 menuitem = gtk_menu_item_new_with_label (buf);
3180 gtk_menu_attach (GTK_MENU (menu), menuitem, i, i + 1, j, j + 1);
3181 gtk_widget_show (menuitem);
3184 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3185 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 8);
3186 gtk_widget_show (menuitem);
3187 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3188 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 2);
3189 gtk_widget_show (menuitem);
3190 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3191 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 0);
3192 gtk_widget_show (menuitem);
3193 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3194 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, -1);
3195 gtk_widget_show (menuitem);
3201 create_menus (GtkWidget *widget)
3203 static GtkWidget *window = NULL;
3207 GtkWidget *optionmenu;
3208 GtkWidget *separator;
3214 GtkWidget *menuitem;
3215 GtkAccelGroup *accel_group;
3217 GdkScreen *screen = gtk_widget_get_screen (widget);
3219 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3221 gtk_window_set_screen (GTK_WINDOW (window), screen);
3223 g_signal_connect (window, "destroy",
3224 G_CALLBACK (gtk_widget_destroyed),
3226 g_signal_connect (window, "delete-event",
3227 G_CALLBACK (gtk_true),
3230 accel_group = gtk_accel_group_new ();
3231 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3233 gtk_window_set_title (GTK_WINDOW (window), "menus");
3234 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3237 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
3238 gtk_container_add (GTK_CONTAINER (window), box1);
3239 gtk_widget_show (box1);
3241 menubar = gtk_menu_bar_new ();
3242 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3243 gtk_widget_show (menubar);
3245 menu = create_menu (screen, 2, 50, TRUE);
3247 menuitem = gtk_menu_item_new_with_label ("test\nline2");
3248 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3249 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3250 gtk_widget_show (menuitem);
3252 menu = create_table_menu (screen, 2, 50, TRUE);
3254 menuitem = gtk_menu_item_new_with_label ("table");
3255 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3256 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3257 gtk_widget_show (menuitem);
3259 menuitem = gtk_menu_item_new_with_label ("foo");
3260 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5, TRUE));
3261 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3262 gtk_widget_show (menuitem);
3264 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3265 GTK_ICON_SIZE_MENU);
3266 gtk_widget_show (image);
3267 menuitem = gtk_image_menu_item_new_with_label ("Help");
3268 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3269 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 4, 5, TRUE));
3270 gtk_menu_item_set_right_justified (GTK_MENU_ITEM (menuitem), TRUE);
3271 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3272 gtk_widget_show (menuitem);
3274 menubar = gtk_menu_bar_new ();
3275 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3276 gtk_widget_show (menubar);
3278 menu = create_menu (screen, 2, 10, TRUE);
3280 menuitem = gtk_menu_item_new_with_label ("Second menu bar");
3281 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3282 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3283 gtk_widget_show (menuitem);
3285 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3286 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3287 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3288 gtk_widget_show (box2);
3290 menu = create_menu (screen, 1, 5, FALSE);
3291 gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
3293 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
3294 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3295 gtk_widget_show (menuitem);
3297 menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
3298 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3299 gtk_widget_show (menuitem);
3300 gtk_widget_add_accelerator (menuitem,
3306 menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
3307 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3308 gtk_widget_show (menuitem);
3309 gtk_widget_add_accelerator (menuitem,
3314 GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3315 menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
3316 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3317 gtk_widget_show (menuitem);
3318 gtk_widget_add_accelerator (menuitem,
3324 gtk_widget_add_accelerator (menuitem,
3331 optionmenu = gtk_combo_box_text_new ();
3332 gtk_combo_box_set_active (GTK_COMBO_BOX (optionmenu), 3);
3333 gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
3334 gtk_widget_show (optionmenu);
3336 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
3337 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3338 gtk_widget_show (separator);
3340 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3341 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3342 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3343 gtk_widget_show (box2);
3345 button = gtk_button_new_with_label ("close");
3346 g_signal_connect_swapped (button, "clicked",
3347 G_CALLBACK (gtk_widget_destroy),
3349 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3350 gtk_widget_set_can_default (button, TRUE);
3351 gtk_widget_grab_default (button);
3352 gtk_widget_show (button);
3355 if (!gtk_widget_get_visible (window))
3356 gtk_widget_show (window);
3358 gtk_widget_destroy (window);
3361 /* GdkPixbuf RGBA C-Source image dump */
3363 static const guint8 apple[] =
3365 /* Pixbuf magic (0x47646b50) */
3367 /* length: header (24) + pixel_data (2304) */
3369 /* pixdata_type (0x1010002) */
3371 /* rowstride (96) */
3378 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3379 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3380 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3381 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3382 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3383 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3384 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\26\24"
3385 "\17\11\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3386 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`m"
3387 "[pn{a\344hv_\345_k[`\0\0\0\0\0\0\0\0\0\0\0\0D>/\305\0\0\0_\0\0\0\0\0"
3388 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3389 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`l[Blza\373s\202d\354w\206g\372p~c"
3390 "\374`l[y\0\0\0\0[S\77/\27\25\17\335\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0"
3391 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3392 "\0\0\0\0\0\0`l\\\20iw_\356y\211h\373x\207g\364~\216i\364u\204e\366gt"
3393 "_\374^jX\241A;-_\0\0\0~\0\0\0\0SM4)SM21B9&\22\320\270\204\1\320\270\204"
3394 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0eq"
3395 "]\212r\200c\366v\205f\371jx_\323_kY\232_kZH^jY\26]iW\211@G9\272:6%j\220"
3396 "\211]\320\221\211`\377\212\203Z\377~xP\377mkE\331]^;|/0\37\21\0\0\0\0"
3397 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0ly`\40p~b\360lz`\353^kY\246["
3398 "eT<\216\200Z\203\227\211_\354\234\217c\377\232\217b\362\232\220c\337"
3399 "\243\233k\377\252\241p\377\250\236p\377\241\225h\377\231\214_\377\210"
3400 "\202U\377srI\377[]:\355KO0U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0i"
3401 "v^\200`lY\211^jY\"\0\0\0\0\221\204\\\273\250\233r\377\302\267\224\377"
3402 "\311\300\237\377\272\256\204\377\271\256\177\377\271\257\200\377\267"
3403 "\260\177\377\260\251x\377\250\236l\377\242\225e\377\226\213]\377~zP\377"
3404 "ff@\377QT5\377LR2d\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0]iW(\0\0\0\0\0\0\0"
3405 "\0\213\203[v\253\240t\377\334\326\301\377\344\340\317\377\321\312\253"
3406 "\377\303\271\217\377\300\270\213\377\277\267\210\377\272\264\203\377"
3407 "\261\255z\377\250\242n\377\243\232h\377\232\220`\377\210\202V\377nnE"
3408 "\377SW6\377RX6\364Za<\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0b]@\20"
3409 "\234\222e\362\304\274\232\377\337\333\306\377\332\325\273\377\311\302"
3410 "\232\377\312\303\236\377\301\273\216\377\300\271\212\377\270\264\200"
3411 "\377\256\253v\377\246\243n\377\236\232h\377\230\220`\377\213\203V\377"
3412 "wvL\377X]:\377KR0\377NU5v\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\212"
3413 "\203Zl\242\234l\377\321\315\260\377\331\324\271\377\320\313\251\377\307"
3414 "\301\232\377\303\276\224\377\300\272\214\377\274\267\206\377\264\260"
3415 "|\377\253\251s\377\244\243n\377\232\230e\377\223\216^\377\207\200U\377"
3416 "ttJ\377[_<\377HO/\377GN0\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3417 "\210\204Y\240\245\237o\377\316\310\253\377\310\303\237\377\304\300\230"
3418 "\377\303\277\225\377\277\272\216\377\274\270\210\377\266\263\200\377"
3419 "\256\254v\377\247\246p\377\237\236j\377\227\226d\377\215\212[\377\203"
3420 "\177T\377qsH\377X]8\377FN.\377DK-\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3421 "\0\0\0\0\207\204X\257\244\240o\377\300\275\231\377\301\275\226\377\274"
3422 "\270\213\377\274\270\214\377\267\264\205\377\264\262\200\377\260\256"
3423 "z\377\251\251s\377\243\244n\377\231\232g\377\220\222`\377\210\211Y\377"
3424 "|}Q\377hlC\377PU3\377CK,\377DL/Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3425 "\0\0\205\204X\220\232\230h\377\261\260\204\377\266\264\212\377\261\260"
3426 "\201\377\263\260\200\377\260\257}\377\256\256x\377\253\254t\377\244\246"
3427 "o\377\233\236i\377\221\224b\377\211\214\\\377\202\204V\377txM\377]b>"
3428 "\377HP0\377@H+\373CJ-\25\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0xxO>"
3429 "\215\215_\377\237\237r\377\247\247x\377\247\247t\377\252\252w\377\252"
3430 "\252u\377\252\253t\377\243\246o\377\235\240j\377\223\230c\377\213\217"
3431 "]\377\201\206V\377x}P\377gkD\377RY5\377BI,\377AI,\262\0\0\0\0\0\0\0\0"
3432 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\202\205W\312\216\220`\377\230"
3433 "\232g\377\234\236i\377\236\241l\377\241\244n\377\240\244m\377\232\237"
3434 "i\377\223\230c\377\212\221]\377\200\210W\377v|P\377jnG\377Za>\377HP2"
3435 "\377=D)\377HQ1:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3436 "\0wzQ6\177\201U\371\206\211Z\377\216\222`\377\220\225a\377\220\225b\377"
3437 "\220\226a\377\213\221_\377\204\213Z\377{\203R\377ryN\377iqH\377^fA\377"
3438 "R[;\377BJ-\3778@'\317\0\0\0>\0\0\0\36\0\0\0\7\0\0\0\0\0\0\0\0\0\0\0\0"
3439 "\0\0\0\0\0\0\0\0\0\0\0\0ptJTw|Q\371z\177R\377}\202T\377|\203T\377z\200"
3440 "R\377v|O\377pwL\377jpF\377dlB\377`hB\377Yb@\377LT6\377<C*\377\11\12\6"
3441 "\376\0\0\0\347\0\0\0\262\0\0\0Y\0\0\0\32\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3442 "\0\0\0\0\0\0\0\0\0\0\\`=UgnE\370hnG\377gmE\377djB\377]d>\377[c<\377Y"
3443 "b<\377Zc>\377V_>\377OW8\377BK/\377\16\20\12\377\0\0\0\377\0\0\0\377\0"
3444 "\0\0\374\0\0\0\320\0\0\0I\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3445 "\0\1\0\0\0\40\22\24\15\260@D+\377W`;\377OV5\377.3\36\377.3\37\377IP0"
3446 "\377RZ7\377PZ8\3776=&\377\14\15\10\377\0\0\0\377\0\0\0\377\0\0\0\377"
3447 "\0\0\0\347\0\0\0\217\0\0\0""4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3448 "\0\0\0\0\0\0\0\20\0\0\0P\0\0\0\252\7\10\5\346\7\7\5\375\0\0\0\377\0\0"
3449 "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\374\0"
3450 "\0\0\336\0\0\0\254\0\0\0i\0\0\0""2\0\0\0\10\0\0\0\0\0\0\0\0\0\0\0\0\0"
3451 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\0\0\0\40\0\0\0D\0\0\0m\0\0\0"
3452 "\226\0\0\0\234\0\0\0\234\0\0\0\244\0\0\0\246\0\0\0\232\0\0\0\202\0\0"
3453 "\0i\0\0\0T\0\0\0,\0\0\0\15\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3454 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\6\0\0\0"
3455 "\16\0\0\0\22\0\0\0\24\0\0\0\23\0\0\0\17\0\0\0\14\0\0\0\13\0\0\0\10\0"
3456 "\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
3460 accel_button_new (GtkAccelGroup *accel_group,
3465 GdkModifierType modifiers;
3469 gtk_accelerator_parse (accel, &keyval, &modifiers);
3472 button = gtk_button_new ();
3473 gtk_widget_add_accelerator (button, "activate", accel_group,
3474 keyval, modifiers, GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3476 label = gtk_accel_label_new (text);
3477 gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), button);
3478 gtk_widget_show (label);
3480 gtk_container_add (GTK_CONTAINER (button), label);
3486 create_key_lookup (GtkWidget *widget)
3488 static GtkWidget *window = NULL;
3489 gpointer window_ptr;
3493 GtkAccelGroup *accel_group = gtk_accel_group_new ();
3495 GtkWidget *content_area;
3497 window = gtk_dialog_new_with_buttons ("Key Lookup", NULL, 0,
3498 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
3501 gtk_window_set_screen (GTK_WINDOW (window),
3502 gtk_widget_get_screen (widget));
3504 /* We have to expand it so the accel labels will draw their labels
3506 gtk_window_set_default_size (GTK_WINDOW (window), 300, -1);
3508 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3510 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
3512 button = gtk_button_new_with_mnemonic ("Button 1 (_a)");
3513 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3514 button = gtk_button_new_with_mnemonic ("Button 2 (_A)");
3515 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3516 button = gtk_button_new_with_mnemonic ("Button 3 (_\321\204)");
3517 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3518 button = gtk_button_new_with_mnemonic ("Button 4 (_\320\244)");
3519 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3520 button = gtk_button_new_with_mnemonic ("Button 6 (_b)");
3521 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3522 button = accel_button_new (accel_group, "Button 7", "<Alt><Shift>b");
3523 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3524 button = accel_button_new (accel_group, "Button 8", "<Alt>d");
3525 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3526 button = accel_button_new (accel_group, "Button 9", "<Alt>Cyrillic_ve");
3527 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3528 button = gtk_button_new_with_mnemonic ("Button 10 (_1)");
3529 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3530 button = gtk_button_new_with_mnemonic ("Button 11 (_!)");
3531 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3532 button = accel_button_new (accel_group, "Button 12", "<Super>a");
3533 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3534 button = accel_button_new (accel_group, "Button 13", "<Hyper>a");
3535 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3536 button = accel_button_new (accel_group, "Button 14", "<Meta>a");
3537 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3538 button = accel_button_new (accel_group, "Button 15", "<Shift><Mod4>b");
3539 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3541 window_ptr = &window;
3542 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
3543 g_signal_connect (window, "response", G_CALLBACK (gtk_widget_destroy), NULL);
3545 gtk_widget_show_all (window);
3548 gtk_widget_destroy (window);
3557 cmw_destroy_cb(GtkWidget *widget)
3559 /* This is needed to get out of gtk_main */
3566 cmw_color (GtkWidget *widget, GtkWidget *parent)
3569 GtkWidget *colorsel;
3570 GtkWidget *ok_button, *cancel_button;
3572 csd = gtk_color_selection_dialog_new ("This is a modal color selection dialog");
3574 gtk_window_set_screen (GTK_WINDOW (csd), gtk_widget_get_screen (parent));
3576 colorsel = gtk_color_selection_dialog_get_color_selection (GTK_COLOR_SELECTION_DIALOG (csd));
3577 gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (colorsel),
3581 gtk_window_set_modal (GTK_WINDOW(csd),TRUE);
3583 /* And mark it as a transient dialog */
3584 gtk_window_set_transient_for (GTK_WINDOW (csd), GTK_WINDOW (parent));
3586 g_signal_connect (csd, "destroy",
3587 G_CALLBACK (cmw_destroy_cb), NULL);
3590 "ok-button", &ok_button,
3591 "cancel-button", &cancel_button,
3594 g_signal_connect_swapped (ok_button,
3595 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
3596 g_signal_connect_swapped (cancel_button,
3597 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
3599 /* wait until destroy calls gtk_main_quit */
3600 gtk_widget_show (csd);
3605 cmw_file (GtkWidget *widget, GtkWidget *parent)
3609 fs = gtk_file_chooser_dialog_new ("This is a modal file selection dialog",
3610 GTK_WINDOW (parent), GTK_FILE_CHOOSER_ACTION_OPEN,
3611 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
3612 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
3614 gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent));
3615 gtk_window_set_modal (GTK_WINDOW (fs), TRUE);
3617 g_signal_connect (fs, "destroy",
3618 G_CALLBACK (cmw_destroy_cb), NULL);
3619 g_signal_connect_swapped (fs, "response",
3620 G_CALLBACK (gtk_widget_destroy), fs);
3622 /* wait until destroy calls gtk_main_quit */
3623 gtk_widget_show (fs);
3629 create_modal_window (GtkWidget *widget)
3631 GtkWidget *window = NULL;
3632 GtkWidget *box1,*box2;
3634 GtkWidget *btnColor,*btnFile,*btnClose;
3636 /* Create modal window (Here you can use any window descendent )*/
3637 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3638 gtk_window_set_screen (GTK_WINDOW (window),
3639 gtk_widget_get_screen (widget));
3641 gtk_window_set_title (GTK_WINDOW(window),"This window is modal");
3643 /* Set window as modal */
3644 gtk_window_set_modal (GTK_WINDOW(window),TRUE);
3646 /* Create widgets */
3647 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
3648 frame1 = gtk_frame_new ("Standard dialogs in modal form");
3649 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
3650 gtk_box_set_homogeneous (GTK_BOX (box2), TRUE);
3651 btnColor = gtk_button_new_with_label ("Color");
3652 btnFile = gtk_button_new_with_label ("File Selection");
3653 btnClose = gtk_button_new_with_label ("Close");
3656 gtk_container_set_border_width (GTK_CONTAINER (box1), 3);
3657 gtk_container_set_border_width (GTK_CONTAINER (box2), 3);
3660 gtk_container_add (GTK_CONTAINER (window), box1);
3661 gtk_box_pack_start (GTK_BOX (box1), frame1, TRUE, TRUE, 4);
3662 gtk_container_add (GTK_CONTAINER (frame1), box2);
3663 gtk_box_pack_start (GTK_BOX (box2), btnColor, FALSE, FALSE, 4);
3664 gtk_box_pack_start (GTK_BOX (box2), btnFile, FALSE, FALSE, 4);
3665 gtk_box_pack_start (GTK_BOX (box1), gtk_separator_new (GTK_ORIENTATION_HORIZONTAL), FALSE, FALSE, 4);
3666 gtk_box_pack_start (GTK_BOX (box1), btnClose, FALSE, FALSE, 4);
3668 /* connect signals */
3669 g_signal_connect_swapped (btnClose, "clicked",
3670 G_CALLBACK (gtk_widget_destroy), window);
3672 g_signal_connect (window, "destroy",
3673 G_CALLBACK (cmw_destroy_cb), NULL);
3675 g_signal_connect (btnColor, "clicked",
3676 G_CALLBACK (cmw_color), window);
3677 g_signal_connect (btnFile, "clicked",
3678 G_CALLBACK (cmw_file), window);
3681 gtk_widget_show_all (window);
3683 /* wait until dialog get destroyed */
3692 make_message_dialog (GdkScreen *screen,
3694 GtkMessageType type,
3695 GtkButtonsType buttons,
3696 guint default_response)
3700 gtk_widget_destroy (*dialog);
3705 *dialog = gtk_message_dialog_new (NULL, 0, type, buttons,
3706 "This is a message dialog; it can wrap long lines. This is a long line. La la la. Look this line is wrapped. Blah blah blah blah blah blah. (Note: testgtk has a nonstandard gtkrc that changes some of the message dialog icons.)");
3708 gtk_window_set_screen (GTK_WINDOW (*dialog), screen);
3710 g_signal_connect_swapped (*dialog,
3712 G_CALLBACK (gtk_widget_destroy),
3715 g_signal_connect (*dialog,
3717 G_CALLBACK (gtk_widget_destroyed),
3720 gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
3722 gtk_widget_show (*dialog);
3726 create_message_dialog (GtkWidget *widget)
3728 static GtkWidget *info = NULL;
3729 static GtkWidget *warning = NULL;
3730 static GtkWidget *error = NULL;
3731 static GtkWidget *question = NULL;
3732 GdkScreen *screen = gtk_widget_get_screen (widget);
3734 make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK);
3735 make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE);
3736 make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK);
3737 make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_NO);
3744 static GtkWidget *sw_parent = NULL;
3745 static GtkWidget *sw_float_parent;
3746 static gulong sw_destroyed_handler = 0;
3749 scrolled_windows_delete_cb (GtkWidget *widget, GdkEventAny *event, GtkWidget *scrollwin)
3751 gtk_widget_reparent (scrollwin, sw_parent);
3753 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
3754 sw_float_parent = NULL;
3756 sw_destroyed_handler = 0;
3762 scrolled_windows_destroy_cb (GtkWidget *widget, GtkWidget *scrollwin)
3764 gtk_widget_destroy (sw_float_parent);
3766 sw_float_parent = NULL;
3768 sw_destroyed_handler = 0;
3772 scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
3776 gtk_widget_reparent (scrollwin, sw_parent);
3777 gtk_widget_destroy (sw_float_parent);
3779 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
3780 sw_float_parent = NULL;
3782 sw_destroyed_handler = 0;
3786 sw_parent = gtk_widget_get_parent (scrollwin);
3787 sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3788 gtk_window_set_screen (GTK_WINDOW (sw_float_parent),
3789 gtk_widget_get_screen (widget));
3791 gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200);
3793 gtk_widget_reparent (scrollwin, sw_float_parent);
3794 gtk_widget_show (sw_float_parent);
3796 sw_destroyed_handler =
3797 g_signal_connect (sw_parent, "destroy",
3798 G_CALLBACK (scrolled_windows_destroy_cb), scrollwin);
3799 g_signal_connect (sw_float_parent, "delete_event",
3800 G_CALLBACK (scrolled_windows_delete_cb), scrollwin);
3805 create_scrolled_windows (GtkWidget *widget)
3807 static GtkWidget *window;
3808 GtkWidget *content_area, *action_area;
3809 GtkWidget *scrolled_window;
3817 window = gtk_dialog_new ();
3819 gtk_window_set_screen (GTK_WINDOW (window),
3820 gtk_widget_get_screen (widget));
3822 g_signal_connect (window, "destroy",
3823 G_CALLBACK (gtk_widget_destroyed),
3826 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
3827 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
3829 gtk_window_set_title (GTK_WINDOW (window), "dialog");
3830 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3832 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
3833 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
3834 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
3835 GTK_POLICY_AUTOMATIC,
3836 GTK_POLICY_AUTOMATIC);
3837 gtk_box_pack_start (GTK_BOX (content_area), scrolled_window, TRUE, TRUE, 0);
3838 gtk_widget_show (scrolled_window);
3840 table = gtk_table_new (20, 20, FALSE);
3841 gtk_table_set_row_spacings (GTK_TABLE (table), 10);
3842 gtk_table_set_col_spacings (GTK_TABLE (table), 10);
3843 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
3844 gtk_container_set_focus_hadjustment (GTK_CONTAINER (table),
3845 gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
3846 gtk_container_set_focus_vadjustment (GTK_CONTAINER (table),
3847 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
3848 gtk_widget_show (table);
3850 for (i = 0; i < 20; i++)
3851 for (j = 0; j < 20; j++)
3853 sprintf (buffer, "button (%d,%d)\n", i, j);
3854 button = gtk_toggle_button_new_with_label (buffer);
3855 gtk_table_attach_defaults (GTK_TABLE (table), button,
3857 gtk_widget_show (button);
3861 button = gtk_button_new_with_label ("Close");
3862 g_signal_connect_swapped (button, "clicked",
3863 G_CALLBACK (gtk_widget_destroy),
3865 gtk_widget_set_can_default (button, TRUE);
3866 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
3867 gtk_widget_grab_default (button);
3868 gtk_widget_show (button);
3870 button = gtk_button_new_with_label ("Reparent Out");
3871 g_signal_connect (button, "clicked",
3872 G_CALLBACK (scrolled_windows_remove),
3874 gtk_widget_set_can_default (button, TRUE);
3875 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
3876 gtk_widget_grab_default (button);
3877 gtk_widget_show (button);
3879 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
3882 if (!gtk_widget_get_visible (window))
3883 gtk_widget_show (window);
3885 gtk_widget_destroy (window);
3893 entry_toggle_frame (GtkWidget *checkbutton,
3896 gtk_entry_set_has_frame (GTK_ENTRY(entry),
3897 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
3901 entry_toggle_sensitive (GtkWidget *checkbutton,
3904 gtk_widget_set_sensitive (entry,
3905 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(checkbutton)));
3909 entry_progress_timeout (gpointer data)
3911 if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (data), "progress-pulse")))
3913 gtk_entry_progress_pulse (GTK_ENTRY (data));
3919 fraction = gtk_entry_get_progress_fraction (GTK_ENTRY (data));
3922 if (fraction > 1.0001)
3925 gtk_entry_set_progress_fraction (GTK_ENTRY (data), fraction);
3932 entry_remove_timeout (gpointer data)
3934 g_source_remove (GPOINTER_TO_UINT (data));
3938 entry_toggle_progress (GtkWidget *checkbutton,
3941 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)))
3943 guint timeout = gdk_threads_add_timeout (100,
3944 entry_progress_timeout,
3946 g_object_set_data_full (G_OBJECT (entry), "timeout-id",
3947 GUINT_TO_POINTER (timeout),
3948 entry_remove_timeout);
3952 g_object_set_data (G_OBJECT (entry), "timeout-id",
3953 GUINT_TO_POINTER (0));
3955 gtk_entry_set_progress_fraction (GTK_ENTRY (entry), 0.0);
3960 entry_toggle_pulse (GtkWidget *checkbutton,
3963 g_object_set_data (G_OBJECT (entry), "progress-pulse",
3964 GUINT_TO_POINTER ((guint) gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton))));
3968 props_clicked (GtkWidget *button,
3971 GtkWidget *window = create_prop_editor (object, 0);
3973 gtk_window_set_title (GTK_WINDOW (window), "Object Properties");
3977 create_entry (GtkWidget *widget)
3979 static GtkWidget *window = NULL;
3983 GtkWidget *has_frame_check;
3984 GtkWidget *sensitive_check;
3985 GtkWidget *progress_check;
3987 GtkComboBoxText *cb;
3988 GtkWidget *cb_entry;
3990 GtkWidget *separator;
3994 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3995 gtk_window_set_screen (GTK_WINDOW (window),
3996 gtk_widget_get_screen (widget));
3998 g_signal_connect (window, "destroy",
3999 G_CALLBACK (gtk_widget_destroyed),
4002 gtk_window_set_title (GTK_WINDOW (window), "entry");
4003 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4006 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4007 gtk_container_add (GTK_CONTAINER (window), box1);
4010 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
4011 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4012 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
4014 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
4015 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
4017 entry = gtk_entry_new ();
4018 gtk_entry_set_text (GTK_ENTRY (entry), "hello world \330\247\331\204\330\263\331\204\330\247\331\205 \330\271\331\204\331\212\331\203\331\205");
4019 gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5);
4020 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
4022 button = gtk_button_new_with_mnemonic ("_Props");
4023 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
4024 g_signal_connect (button, "clicked",
4025 G_CALLBACK (props_clicked),
4028 cb = GTK_COMBO_BOX_TEXT (gtk_combo_box_text_new_with_entry ());
4030 gtk_combo_box_text_append_text (cb, "item0");
4031 gtk_combo_box_text_append_text (cb, "item0");
4032 gtk_combo_box_text_append_text (cb, "item1 item1");
4033 gtk_combo_box_text_append_text (cb, "item2 item2 item2");
4034 gtk_combo_box_text_append_text (cb, "item3 item3 item3 item3");
4035 gtk_combo_box_text_append_text (cb, "item4 item4 item4 item4 item4");
4036 gtk_combo_box_text_append_text (cb, "item5 item5 item5 item5 item5 item5");
4037 gtk_combo_box_text_append_text (cb, "item6 item6 item6 item6 item6");
4038 gtk_combo_box_text_append_text (cb, "item7 item7 item7 item7");
4039 gtk_combo_box_text_append_text (cb, "item8 item8 item8");
4040 gtk_combo_box_text_append_text (cb, "item9 item9");
4042 cb_entry = gtk_bin_get_child (GTK_BIN (cb));
4043 gtk_entry_set_text (GTK_ENTRY (cb_entry), "hello world \n\n\n foo");
4044 gtk_editable_select_region (GTK_EDITABLE (cb_entry), 0, -1);
4045 gtk_box_pack_start (GTK_BOX (box2), GTK_WIDGET (cb), TRUE, TRUE, 0);
4047 sensitive_check = gtk_check_button_new_with_label("Sensitive");
4048 gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0);
4049 g_signal_connect (sensitive_check, "toggled",
4050 G_CALLBACK (entry_toggle_sensitive), entry);
4051 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sensitive_check), TRUE);
4053 has_frame_check = gtk_check_button_new_with_label("Has Frame");
4054 gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0);
4055 g_signal_connect (has_frame_check, "toggled",
4056 G_CALLBACK (entry_toggle_frame), entry);
4057 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
4059 progress_check = gtk_check_button_new_with_label("Show Progress");
4060 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4061 g_signal_connect (progress_check, "toggled",
4062 G_CALLBACK (entry_toggle_progress), entry);
4064 progress_check = gtk_check_button_new_with_label("Pulse Progress");
4065 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4066 g_signal_connect (progress_check, "toggled",
4067 G_CALLBACK (entry_toggle_pulse), entry);
4069 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
4070 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4072 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
4073 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4074 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4076 button = gtk_button_new_with_label ("close");
4077 g_signal_connect_swapped (button, "clicked",
4078 G_CALLBACK (gtk_widget_destroy),
4080 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4081 gtk_widget_set_can_default (button, TRUE);
4082 gtk_widget_grab_default (button);
4085 if (!gtk_widget_get_visible (window))
4086 gtk_widget_show_all (window);
4088 gtk_widget_destroy (window);
4092 create_expander (GtkWidget *widget)
4095 GtkWidget *expander;
4097 static GtkWidget *window = NULL;
4101 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4102 gtk_window_set_screen (GTK_WINDOW (window),
4103 gtk_widget_get_screen (widget));
4105 g_signal_connect (window, "destroy",
4106 G_CALLBACK (gtk_widget_destroyed),
4109 gtk_window_set_title (GTK_WINDOW (window), "expander");
4110 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4112 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4113 gtk_container_add (GTK_CONTAINER (window), box1);
4115 expander = gtk_expander_new ("The Hidden");
4117 gtk_box_pack_start (GTK_BOX (box1), expander, TRUE, TRUE, 0);
4119 hidden = gtk_label_new ("Revealed!");
4121 gtk_container_add (GTK_CONTAINER (expander), hidden);
4124 if (!gtk_widget_get_visible (window))
4125 gtk_widget_show_all (window);
4127 gtk_widget_destroy (window);
4135 event_box_label_pressed (GtkWidget *widget,
4136 GdkEventButton *event,
4139 g_print ("clicked on event box\n");
4143 event_box_button_clicked (GtkWidget *widget,
4147 g_print ("pushed button\n");
4151 event_box_toggle_visible_window (GtkWidget *checkbutton,
4152 GtkEventBox *event_box)
4154 gtk_event_box_set_visible_window (event_box,
4155 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
4159 event_box_toggle_above_child (GtkWidget *checkbutton,
4160 GtkEventBox *event_box)
4162 gtk_event_box_set_above_child (event_box,
4163 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
4167 create_event_box (GtkWidget *widget)
4169 static GtkWidget *window = NULL;
4175 GtkWidget *separator;
4176 GtkWidget *event_box;
4178 GtkWidget *visible_window_check;
4179 GtkWidget *above_child_check;
4189 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4190 gtk_window_set_screen (GTK_WINDOW (window),
4191 gtk_widget_get_screen (widget));
4193 g_signal_connect (window, "destroy",
4194 G_CALLBACK (gtk_widget_destroyed),
4197 gtk_window_set_title (GTK_WINDOW (window), "event box");
4198 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4200 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4201 gtk_container_add (GTK_CONTAINER (window), box1);
4202 gtk_widget_override_background_color (window, 0, &color);
4204 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4205 gtk_box_pack_start (GTK_BOX (box1), hbox, TRUE, FALSE, 0);
4207 event_box = gtk_event_box_new ();
4208 gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, FALSE, 0);
4210 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4211 gtk_container_add (GTK_CONTAINER (event_box), vbox);
4212 g_signal_connect (event_box, "button_press_event",
4213 G_CALLBACK (event_box_label_pressed),
4216 label = gtk_label_new ("Click on this label");
4217 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
4219 button = gtk_button_new_with_label ("button in eventbox");
4220 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, FALSE, 0);
4221 g_signal_connect (button, "clicked",
4222 G_CALLBACK (event_box_button_clicked),
4226 visible_window_check = gtk_check_button_new_with_label("Visible Window");
4227 gtk_box_pack_start (GTK_BOX (box1), visible_window_check, FALSE, TRUE, 0);
4228 g_signal_connect (visible_window_check, "toggled",
4229 G_CALLBACK (event_box_toggle_visible_window), event_box);
4230 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (visible_window_check), FALSE);
4232 above_child_check = gtk_check_button_new_with_label("Above Child");
4233 gtk_box_pack_start (GTK_BOX (box1), above_child_check, FALSE, TRUE, 0);
4234 g_signal_connect (above_child_check, "toggled",
4235 G_CALLBACK (event_box_toggle_above_child), event_box);
4236 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (above_child_check), FALSE);
4238 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
4239 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4241 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
4242 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4243 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4245 button = gtk_button_new_with_label ("close");
4246 g_signal_connect_swapped (button, "clicked",
4247 G_CALLBACK (gtk_widget_destroy),
4249 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4250 gtk_widget_set_can_default (button, TRUE);
4251 gtk_widget_grab_default (button);
4254 if (!gtk_widget_get_visible (window))
4255 gtk_widget_show_all (window);
4257 gtk_widget_destroy (window);
4265 #define SIZE_GROUP_INITIAL_SIZE 50
4268 size_group_hsize_changed (GtkSpinButton *spin_button,
4271 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4272 gtk_spin_button_get_value_as_int (spin_button),
4277 size_group_vsize_changed (GtkSpinButton *spin_button,
4280 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4282 gtk_spin_button_get_value_as_int (spin_button));
4286 create_size_group_window (GdkScreen *screen,
4287 GtkSizeGroup *master_size_group)
4289 GtkWidget *content_area;
4292 GtkWidget *main_button;
4294 GtkWidget *spin_button;
4296 GtkSizeGroup *hgroup1;
4297 GtkSizeGroup *hgroup2;
4298 GtkSizeGroup *vgroup1;
4299 GtkSizeGroup *vgroup2;
4301 window = gtk_dialog_new_with_buttons ("GtkSizeGroup",
4307 gtk_window_set_screen (GTK_WINDOW (window), screen);
4309 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
4311 g_signal_connect (window, "response",
4312 G_CALLBACK (gtk_widget_destroy),
4315 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
4317 table = gtk_table_new (2, 2, FALSE);
4318 gtk_box_pack_start (GTK_BOX (content_area), table, TRUE, TRUE, 0);
4320 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
4321 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
4322 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
4323 gtk_widget_set_size_request (table, 250, 250);
4325 hgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4326 hgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4327 vgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4328 vgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4330 main_button = gtk_button_new_with_label ("X");
4332 gtk_table_attach (GTK_TABLE (table), main_button,
4334 GTK_EXPAND, GTK_EXPAND,
4336 gtk_size_group_add_widget (master_size_group, main_button);
4337 gtk_size_group_add_widget (hgroup1, main_button);
4338 gtk_size_group_add_widget (vgroup1, main_button);
4339 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (main_button)),
4340 SIZE_GROUP_INITIAL_SIZE,
4341 SIZE_GROUP_INITIAL_SIZE);
4343 button = gtk_button_new ();
4344 gtk_table_attach (GTK_TABLE (table), button,
4346 GTK_EXPAND, GTK_EXPAND,
4348 gtk_size_group_add_widget (vgroup1, button);
4349 gtk_size_group_add_widget (vgroup2, button);
4351 button = gtk_button_new ();
4352 gtk_table_attach (GTK_TABLE (table), button,
4354 GTK_EXPAND, GTK_EXPAND,
4356 gtk_size_group_add_widget (hgroup1, button);
4357 gtk_size_group_add_widget (hgroup2, button);
4359 button = gtk_button_new ();
4360 gtk_table_attach (GTK_TABLE (table), button,
4362 GTK_EXPAND, GTK_EXPAND,
4364 gtk_size_group_add_widget (hgroup2, button);
4365 gtk_size_group_add_widget (vgroup2, button);
4367 g_object_unref (hgroup1);
4368 g_object_unref (hgroup2);
4369 g_object_unref (vgroup1);
4370 g_object_unref (vgroup2);
4372 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
4373 gtk_box_pack_start (GTK_BOX (content_area), hbox, FALSE, FALSE, 0);
4375 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4376 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4377 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4378 g_signal_connect (spin_button, "value_changed",
4379 G_CALLBACK (size_group_hsize_changed), main_button);
4381 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4382 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4383 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4384 g_signal_connect (spin_button, "value_changed",
4385 G_CALLBACK (size_group_vsize_changed), main_button);
4391 create_size_groups (GtkWidget *widget)
4393 static GtkWidget *window1 = NULL;
4394 static GtkWidget *window2 = NULL;
4395 static GtkSizeGroup *master_size_group;
4397 if (!master_size_group)
4398 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
4402 window1 = create_size_group_window (gtk_widget_get_screen (widget),
4405 g_signal_connect (window1, "destroy",
4406 G_CALLBACK (gtk_widget_destroyed),
4412 window2 = create_size_group_window (gtk_widget_get_screen (widget),
4415 g_signal_connect (window2, "destroy",
4416 G_CALLBACK (gtk_widget_destroyed),
4420 if (gtk_widget_get_visible (window1) && gtk_widget_get_visible (window2))
4422 gtk_widget_destroy (window1);
4423 gtk_widget_destroy (window2);
4427 if (!gtk_widget_get_visible (window1))
4428 gtk_widget_show_all (window1);
4429 if (!gtk_widget_get_visible (window2))
4430 gtk_widget_show_all (window2);
4438 static GtkWidget *spinner1;
4441 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
4443 gtk_spin_button_set_snap_to_ticks (spin,
4444 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
4448 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
4450 gtk_spin_button_set_numeric (spin,
4451 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
4455 change_digits (GtkWidget *widget, GtkSpinButton *spin)
4457 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
4458 gtk_spin_button_get_value_as_int (spin));
4462 get_value (GtkWidget *widget, gpointer data)
4466 GtkSpinButton *spin;
4468 spin = GTK_SPIN_BUTTON (spinner1);
4469 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
4470 if (GPOINTER_TO_INT (data) == 1)
4471 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
4473 sprintf (buf, "%0.*f",
4474 gtk_spin_button_get_digits (spin),
4475 gtk_spin_button_get_value (spin));
4477 gtk_label_set_text (label, buf);
4481 get_spin_value (GtkWidget *widget, gpointer data)
4485 GtkSpinButton *spin;
4487 spin = GTK_SPIN_BUTTON (widget);
4488 label = GTK_LABEL (data);
4490 buffer = g_strdup_printf ("%0.*f",
4491 gtk_spin_button_get_digits (spin),
4492 gtk_spin_button_get_value (spin));
4493 gtk_label_set_text (label, buffer);
4499 spin_button_time_output_func (GtkSpinButton *spin_button)
4501 GtkAdjustment *adjustment;
4502 static gchar buf[6];
4506 adjustment = gtk_spin_button_get_adjustment (spin_button);
4507 hours = gtk_adjustment_get_value (adjustment) / 60.0;
4508 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
4509 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
4510 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4511 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4516 spin_button_month_input_func (GtkSpinButton *spin_button,
4520 static gchar *month[12] = { "January", "February", "March", "April",
4521 "May", "June", "July", "August",
4522 "September", "October", "November", "December" };
4524 gboolean found = FALSE;
4526 for (i = 1; i <= 12; i++)
4528 tmp1 = g_ascii_strup (month[i - 1], -1);
4529 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
4530 if (strstr (tmp1, tmp2) == tmp1)
4540 return GTK_INPUT_ERROR;
4542 *new_val = (gdouble) i;
4547 spin_button_month_output_func (GtkSpinButton *spin_button)
4549 GtkAdjustment *adjustment;
4552 static gchar *month[12] = { "January", "February", "March", "April",
4553 "May", "June", "July", "August", "September",
4554 "October", "November", "December" };
4556 adjustment = gtk_spin_button_get_adjustment (spin_button);
4557 value = gtk_adjustment_get_value (adjustment);
4558 for (i = 1; i <= 12; i++)
4559 if (fabs (value - (double)i) < 1e-5)
4561 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
4562 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
4568 spin_button_hex_input_func (GtkSpinButton *spin_button,
4575 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
4576 res = strtol(buf, &err, 16);
4579 return GTK_INPUT_ERROR;
4585 spin_button_hex_output_func (GtkSpinButton *spin_button)
4587 GtkAdjustment *adjustment;
4588 static gchar buf[7];
4591 adjustment = gtk_spin_button_get_adjustment (spin_button);
4592 val = (gint) gtk_adjustment_get_value (adjustment);
4593 if (fabs (val) < 1e-5)
4594 sprintf (buf, "0x00");
4596 sprintf (buf, "0x%.2X", val);
4597 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4598 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4603 create_spins (GtkWidget *widget)
4605 static GtkWidget *window = NULL;
4608 GtkWidget *main_vbox;
4611 GtkWidget *spinner2;
4615 GtkWidget *val_label;
4616 GtkAdjustment *adjustment;
4620 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4621 gtk_window_set_screen (GTK_WINDOW (window),
4622 gtk_widget_get_screen (widget));
4624 g_signal_connect (window, "destroy",
4625 G_CALLBACK (gtk_widget_destroyed),
4628 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
4630 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
4631 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
4632 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4634 frame = gtk_frame_new ("Not accelerated");
4635 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4637 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4638 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4639 gtk_container_add (GTK_CONTAINER (frame), vbox);
4641 /* Time, month, hex spinners */
4643 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4644 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
4646 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4647 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4649 label = gtk_label_new ("Time :");
4650 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4651 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4653 adjustment = gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
4654 spinner = gtk_spin_button_new (adjustment, 0, 0);
4655 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
4656 g_signal_connect (spinner,
4658 G_CALLBACK (spin_button_time_output_func),
4660 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4661 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 5);
4662 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4664 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4665 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4667 label = gtk_label_new ("Month :");
4668 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4669 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4671 adjustment = gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
4673 spinner = gtk_spin_button_new (adjustment, 0, 0);
4674 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
4675 GTK_UPDATE_IF_VALID);
4676 g_signal_connect (spinner,
4678 G_CALLBACK (spin_button_month_input_func),
4680 g_signal_connect (spinner,
4682 G_CALLBACK (spin_button_month_output_func),
4684 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4685 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 9);
4686 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4688 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4689 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4691 label = gtk_label_new ("Hex :");
4692 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4693 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4695 adjustment = gtk_adjustment_new (0, 0, 255, 1, 16, 0);
4696 spinner = gtk_spin_button_new (adjustment, 0, 0);
4697 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
4698 g_signal_connect (spinner,
4700 G_CALLBACK (spin_button_hex_input_func),
4702 g_signal_connect (spinner,
4704 G_CALLBACK (spin_button_hex_output_func),
4706 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4707 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 4);
4708 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4710 frame = gtk_frame_new ("Accelerated");
4711 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4713 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4714 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4715 gtk_container_add (GTK_CONTAINER (frame), vbox);
4717 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4718 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4720 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4721 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4723 label = gtk_label_new ("Value :");
4724 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4725 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4727 adjustment = gtk_adjustment_new (0.0, -10000.0, 10000.0,
4729 spinner1 = gtk_spin_button_new (adjustment, 1.0, 2);
4730 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
4731 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
4733 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4734 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4736 label = gtk_label_new ("Digits :");
4737 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4738 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4740 adjustment = gtk_adjustment_new (2, 1, 15, 1, 1, 0);
4741 spinner2 = gtk_spin_button_new (adjustment, 0.0, 0);
4742 g_signal_connect (adjustment, "value_changed",
4743 G_CALLBACK (change_digits),
4745 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
4747 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4748 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
4750 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
4751 g_signal_connect (button, "clicked",
4752 G_CALLBACK (toggle_snap),
4754 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4755 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4757 button = gtk_check_button_new_with_label ("Numeric only input mode");
4758 g_signal_connect (button, "clicked",
4759 G_CALLBACK (toggle_numeric),
4761 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4762 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4764 val_label = gtk_label_new ("");
4766 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4767 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4769 button = gtk_button_new_with_label ("Value as Int");
4770 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4771 g_signal_connect (button, "clicked",
4772 G_CALLBACK (get_value),
4773 GINT_TO_POINTER (1));
4774 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4776 button = gtk_button_new_with_label ("Value as Float");
4777 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4778 g_signal_connect (button, "clicked",
4779 G_CALLBACK (get_value),
4780 GINT_TO_POINTER (2));
4781 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4783 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
4784 gtk_label_set_text (GTK_LABEL (val_label), "0");
4786 frame = gtk_frame_new ("Using Convenience Constructor");
4787 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4789 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4790 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4791 gtk_container_add (GTK_CONTAINER (frame), hbox);
4793 val_label = gtk_label_new ("0.0");
4795 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
4796 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
4797 g_signal_connect (spinner, "value_changed",
4798 G_CALLBACK (get_spin_value), val_label);
4799 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
4800 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
4802 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4803 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
4805 button = gtk_button_new_with_label ("Close");
4806 g_signal_connect_swapped (button, "clicked",
4807 G_CALLBACK (gtk_widget_destroy),
4809 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4812 if (!gtk_widget_get_visible (window))
4813 gtk_widget_show_all (window);
4815 gtk_widget_destroy (window);
4824 cursor_draw (GtkWidget *widget,
4829 GtkStyleContext *context;
4832 width = gtk_widget_get_allocated_width (widget);
4833 height = gtk_widget_get_allocated_height (widget);
4835 cairo_set_source_rgb (cr, 1, 1, 1);
4836 cairo_rectangle (cr, 0, 0, width, height / 2);
4839 cairo_set_source_rgb (cr, 0, 0, 0);
4840 cairo_rectangle (cr, 0, height / 2, width, height / 2);
4843 context = gtk_widget_get_style_context (widget);
4844 gtk_style_context_get (context, 0, "background-color", &bg, NULL);
4845 gdk_cairo_set_source_rgba (cr, bg);
4847 cairo_rectangle (cr, width / 3, height / 3, width / 3, height / 3);
4854 set_cursor (GtkWidget *spinner,
4863 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
4866 label = g_object_get_data (G_OBJECT (spinner), "user_data");
4868 class = g_type_class_ref (GDK_TYPE_CURSOR_TYPE);
4869 vals = class->values;
4871 while (vals && vals->value != c)
4874 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
4876 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
4878 g_type_class_unref (class);
4880 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
4881 gdk_window_set_cursor (gtk_widget_get_window (widget),
4883 g_object_unref (cursor);
4887 cursor_event (GtkWidget *widget,
4889 GtkSpinButton *spinner)
4891 if ((event->type == GDK_BUTTON_PRESS) &&
4892 ((event->button.button == 1) ||
4893 (event->button.button == 3)))
4895 gtk_spin_button_spin (spinner, event->button.button == 1 ?
4896 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
4903 #ifdef GDK_WINDOWING_X11
4904 #include "x11/gdkx.h"
4907 change_cursor_theme (GtkWidget *widget,
4914 children = gtk_container_get_children (GTK_CONTAINER (data));
4916 theme = gtk_entry_get_text (GTK_ENTRY (children->next->data));
4917 size = (gint) gtk_spin_button_get_value (GTK_SPIN_BUTTON (children->next->next->data));
4919 g_list_free (children);
4921 gdk_x11_display_set_cursor_theme (gtk_widget_get_display (widget),
4928 create_cursors (GtkWidget *widget)
4930 static GtkWidget *window = NULL;
4933 GtkWidget *main_vbox;
4940 GtkAdjustment *adjustment;
4946 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4947 gtk_window_set_screen (GTK_WINDOW (window),
4948 gtk_widget_get_screen (widget));
4950 g_signal_connect (window, "destroy",
4951 G_CALLBACK (gtk_widget_destroyed),
4954 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
4956 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
4957 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
4958 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4961 g_object_new (gtk_vbox_get_type (),
4962 "GtkBox::homogeneous", FALSE,
4963 "GtkBox::spacing", 5,
4964 "GtkContainer::border_width", 10,
4965 "GtkWidget::parent", main_vbox,
4966 "GtkWidget::visible", TRUE,
4969 #ifdef GDK_WINDOWING_X11
4970 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4971 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4972 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
4974 label = gtk_label_new ("Cursor Theme : ");
4975 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4976 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
4978 entry = gtk_entry_new ();
4979 gtk_entry_set_text (GTK_ENTRY (entry), "default");
4980 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, TRUE, 0);
4982 size = gtk_spin_button_new_with_range (1.0, 64.0, 1.0);
4983 gtk_spin_button_set_value (GTK_SPIN_BUTTON (size), 24.0);
4984 gtk_box_pack_start (GTK_BOX (hbox), size, TRUE, TRUE, 0);
4986 g_signal_connect (entry, "changed",
4987 G_CALLBACK (change_cursor_theme), hbox);
4988 g_signal_connect (size, "changed",
4989 G_CALLBACK (change_cursor_theme), hbox);
4992 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4993 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4994 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
4996 label = gtk_label_new ("Cursor Value : ");
4997 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4998 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5000 adjustment = gtk_adjustment_new (0,
5004 spinner = gtk_spin_button_new (adjustment, 0, 0);
5005 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
5008 g_object_new (gtk_frame_get_type (),
5009 "GtkFrame::label_xalign", 0.5,
5010 "GtkFrame::label", "Cursor Area",
5011 "GtkContainer::border_width", 10,
5012 "GtkWidget::parent", vbox,
5013 "GtkWidget::visible", TRUE,
5016 darea = gtk_drawing_area_new ();
5017 gtk_widget_set_size_request (darea, 80, 80);
5018 gtk_container_add (GTK_CONTAINER (frame), darea);
5019 g_signal_connect (darea,
5021 G_CALLBACK (cursor_draw),
5023 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
5024 g_signal_connect (darea,
5025 "button_press_event",
5026 G_CALLBACK (cursor_event),
5028 gtk_widget_show (darea);
5030 g_signal_connect (spinner, "changed",
5031 G_CALLBACK (set_cursor),
5034 label = g_object_new (GTK_TYPE_LABEL,
5039 gtk_container_child_set (GTK_CONTAINER (vbox), label,
5042 g_object_set_data (G_OBJECT (spinner), "user_data", label);
5045 g_object_new (gtk_hseparator_get_type (),
5046 "GtkWidget::visible", TRUE,
5048 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
5050 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
5051 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
5052 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5054 button = gtk_button_new_with_label ("Close");
5055 g_signal_connect_swapped (button, "clicked",
5056 G_CALLBACK (gtk_widget_destroy),
5058 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5060 gtk_widget_show_all (window);
5062 set_cursor (spinner, darea);
5065 gtk_widget_destroy (window);
5073 color_selection_ok (GtkWidget *w,
5074 GtkColorSelectionDialog *cs)
5076 GtkWidget *colorsel;
5079 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5081 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5082 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5086 color_selection_changed (GtkWidget *w,
5087 GtkColorSelectionDialog *cs)
5089 GtkWidget *colorsel;
5092 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5093 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5094 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5099 opacity_toggled_cb (GtkWidget *w,
5100 GtkColorSelectionDialog *cs)
5102 GtkColorSelection *colorsel;
5104 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5105 gtk_color_selection_set_has_opacity_control (colorsel,
5106 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5110 palette_toggled_cb (GtkWidget *w,
5111 GtkColorSelectionDialog *cs)
5113 GtkColorSelection *colorsel;
5115 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5116 gtk_color_selection_set_has_palette (colorsel,
5117 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5122 create_color_selection (GtkWidget *widget)
5124 static GtkWidget *window = NULL;
5133 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5134 gtk_window_set_screen (GTK_WINDOW (window),
5135 gtk_widget_get_screen (widget));
5137 g_signal_connect (window, "destroy",
5138 G_CALLBACK (gtk_widget_destroyed),
5141 gtk_window_set_title (GTK_WINDOW (window), "GtkColorButton");
5142 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5144 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
5145 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5146 gtk_container_add (GTK_CONTAINER (window), hbox);
5148 label = gtk_label_new ("Pick a color");
5149 gtk_container_add (GTK_CONTAINER (hbox), label);
5151 picker = gtk_color_button_new ();
5152 gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (picker), TRUE);
5153 gtk_container_add (GTK_CONTAINER (hbox), picker);
5155 button = gtk_button_new_with_mnemonic ("_Props");
5156 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
5157 g_signal_connect (button, "clicked",
5158 G_CALLBACK (props_clicked),
5162 if (!gtk_widget_get_visible (window))
5163 gtk_widget_show_all (window);
5165 gtk_widget_destroy (window);
5169 flipping_toggled_cb (GtkWidget *widget, gpointer data)
5171 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
5172 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
5174 gtk_widget_set_default_direction (new_direction);
5178 orientable_toggle_orientation (GtkOrientable *orientable)
5180 GtkOrientation orientation;
5182 orientation = gtk_orientable_get_orientation (orientable);
5183 gtk_orientable_set_orientation (orientable,
5184 orientation == GTK_ORIENTATION_HORIZONTAL ?
5185 GTK_ORIENTATION_VERTICAL :
5186 GTK_ORIENTATION_HORIZONTAL);
5188 if (GTK_IS_CONTAINER (orientable))
5193 children = gtk_container_get_children (GTK_CONTAINER (orientable));
5195 for (child = children; child; child = child->next)
5197 if (GTK_IS_ORIENTABLE (child->data))
5198 orientable_toggle_orientation (child->data);
5201 g_list_free (children);
5206 flipping_orientation_toggled_cb (GtkWidget *widget, gpointer data)
5208 GtkWidget *content_area;
5209 GtkWidget *toplevel;
5211 toplevel = gtk_widget_get_toplevel (widget);
5212 content_area = gtk_dialog_get_content_area (GTK_DIALOG (toplevel));
5213 orientable_toggle_orientation (GTK_ORIENTABLE (content_area));
5217 set_direction_recurse (GtkWidget *widget,
5220 GtkTextDirection *dir = data;
5222 gtk_widget_set_direction (widget, *dir);
5223 if (GTK_IS_CONTAINER (widget))
5224 gtk_container_foreach (GTK_CONTAINER (widget),
5225 set_direction_recurse,
5230 create_forward_back (const char *title,
5231 GtkTextDirection text_dir)
5233 GtkWidget *frame = gtk_frame_new (title);
5234 GtkWidget *bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
5235 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
5236 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
5238 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
5240 gtk_container_add (GTK_CONTAINER (frame), bbox);
5241 gtk_container_add (GTK_CONTAINER (bbox), back_button);
5242 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
5244 set_direction_recurse (frame, &text_dir);
5250 create_flipping (GtkWidget *widget)
5252 static GtkWidget *window = NULL;
5253 GtkWidget *check_button, *button;
5254 GtkWidget *action_area, *content_area;
5258 window = gtk_dialog_new ();
5260 gtk_window_set_screen (GTK_WINDOW (window),
5261 gtk_widget_get_screen (widget));
5263 g_signal_connect (window, "destroy",
5264 G_CALLBACK (gtk_widget_destroyed),
5267 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5268 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
5270 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
5272 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
5273 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5274 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5276 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
5277 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
5279 g_signal_connect (check_button, "toggled",
5280 G_CALLBACK (flipping_toggled_cb), NULL);
5282 check_button = gtk_check_button_new_with_label ("Toggle orientation of all boxes");
5283 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5284 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5286 g_signal_connect (check_button, "toggled",
5287 G_CALLBACK (flipping_orientation_toggled_cb), NULL);
5289 gtk_box_pack_start (GTK_BOX (content_area),
5290 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
5293 gtk_box_pack_start (GTK_BOX (content_area),
5294 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
5297 gtk_box_pack_start (GTK_BOX (content_area),
5298 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
5301 button = gtk_button_new_with_label ("Close");
5302 g_signal_connect_swapped (button, "clicked",
5303 G_CALLBACK (gtk_widget_destroy), window);
5304 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5307 if (!gtk_widget_get_visible (window))
5308 gtk_widget_show_all (window);
5310 gtk_widget_destroy (window);
5318 make_focus_table (GList **list)
5323 table = gtk_table_new (5, 5, FALSE);
5336 widget = gtk_entry_new ();
5338 widget = gtk_button_new_with_label ("Foo");
5340 *list = g_list_prepend (*list, widget);
5342 gtk_table_attach (GTK_TABLE (table),
5346 GTK_EXPAND | GTK_FILL,
5347 GTK_EXPAND | GTK_FILL,
5356 *list = g_list_reverse (*list);
5362 create_focus (GtkWidget *widget)
5364 static GtkWidget *window = NULL;
5368 GtkWidget *content_area;
5373 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
5379 gtk_window_set_screen (GTK_WINDOW (window),
5380 gtk_widget_get_screen (widget));
5382 g_signal_connect (window, "destroy",
5383 G_CALLBACK (gtk_widget_destroyed),
5386 g_signal_connect (window, "response",
5387 G_CALLBACK (gtk_widget_destroy),
5390 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5392 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
5394 frame = gtk_frame_new ("Weird tab focus chain");
5396 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5398 table = make_focus_table (&list);
5400 gtk_container_add (GTK_CONTAINER (frame), table);
5402 gtk_container_set_focus_chain (GTK_CONTAINER (table),
5407 frame = gtk_frame_new ("Default tab focus chain");
5409 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5412 table = make_focus_table (&list);
5416 gtk_container_add (GTK_CONTAINER (frame), table);
5419 if (!gtk_widget_get_visible (window))
5420 gtk_widget_show_all (window);
5422 gtk_widget_destroy (window);
5430 font_selection_ok (GtkWidget *w,
5431 GtkFontSelectionDialog *fs)
5433 gchar *s = gtk_font_selection_dialog_get_font_name (fs);
5435 g_print ("%s\n", s);
5437 gtk_widget_destroy (GTK_WIDGET (fs));
5441 create_font_selection (GtkWidget *widget)
5443 static GtkWidget *window = NULL;
5451 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5452 gtk_window_set_screen (GTK_WINDOW (window),
5453 gtk_widget_get_screen (widget));
5455 g_signal_connect (window, "destroy",
5456 G_CALLBACK (gtk_widget_destroyed),
5459 gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
5460 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5462 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
5463 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5464 gtk_container_add (GTK_CONTAINER (window), hbox);
5466 label = gtk_label_new ("Pick a font");
5467 gtk_container_add (GTK_CONTAINER (hbox), label);
5469 picker = gtk_font_button_new ();
5470 gtk_font_button_set_use_font (GTK_FONT_BUTTON (picker), TRUE);
5471 gtk_container_add (GTK_CONTAINER (hbox), picker);
5474 if (!gtk_widget_get_visible (window))
5475 gtk_widget_show_all (window);
5477 gtk_widget_destroy (window);
5484 static GtkWidget *dialog_window = NULL;
5487 label_toggle (GtkWidget *widget,
5492 *label = gtk_label_new ("Dialog Test");
5493 g_signal_connect (*label,
5495 G_CALLBACK (gtk_widget_destroyed),
5497 gtk_misc_set_padding (GTK_MISC (*label), 10, 10);
5498 gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog_window))),
5499 *label, TRUE, TRUE, 0);
5500 gtk_widget_show (*label);
5503 gtk_widget_destroy (*label);
5507 create_dialog (GtkWidget *widget)
5509 static GtkWidget *label;
5510 GtkWidget *action_area;
5515 /* This is a terrible example; it's much simpler to create
5516 * dialogs than this. Don't use testgtk for example code,
5520 dialog_window = gtk_dialog_new ();
5521 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5522 gtk_widget_get_screen (widget));
5524 g_signal_connect (dialog_window, "destroy",
5525 G_CALLBACK (gtk_widget_destroyed),
5528 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5530 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
5531 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5533 button = gtk_button_new_with_label ("OK");
5534 gtk_widget_set_can_default (button, TRUE);
5535 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5536 gtk_widget_grab_default (button);
5537 gtk_widget_show (button);
5539 button = gtk_button_new_with_label ("Toggle");
5540 g_signal_connect (button, "clicked",
5541 G_CALLBACK (label_toggle),
5543 gtk_widget_set_can_default (button, TRUE);
5544 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5545 gtk_widget_show (button);
5550 if (!gtk_widget_get_visible (dialog_window))
5551 gtk_widget_show (dialog_window);
5553 gtk_widget_destroy (dialog_window);
5556 /* Display & Screen test
5563 GtkWidget *radio_dpy;
5564 GtkWidget *toplevel;
5565 GtkWidget *dialog_window;
5566 } ScreenDisplaySelection;
5569 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
5571 const gchar *display_name;
5572 GdkDisplay *display = gtk_widget_get_display (widget);
5574 GdkScreen *new_screen = NULL;
5575 GdkScreen *current_screen = gtk_widget_get_screen (widget);
5577 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
5579 display_name = gtk_entry_get_text (GTK_ENTRY (data->entry));
5580 display = gdk_display_open (display_name);
5584 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
5585 GTK_DIALOG_DESTROY_WITH_PARENT,
5588 "The display :\n%s\ncannot be opened",
5590 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
5591 gtk_widget_show (dialog);
5592 g_signal_connect (dialog, "response",
5593 G_CALLBACK (gtk_widget_destroy),
5598 GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (data->combo));
5601 gboolean found = FALSE;
5602 while (gtk_tree_model_iter_nth_child (model, &iter, NULL, i++))
5605 gtk_tree_model_get (model, &iter, 0, &name, -1);
5606 found = !g_ascii_strcasecmp (display_name, name);
5613 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (data->combo), display_name);
5614 new_screen = gdk_display_get_default_screen (display);
5619 gint number_of_screens = gdk_display_get_n_screens (display);
5620 gint screen_num = gdk_screen_get_number (current_screen);
5621 if ((screen_num +1) < number_of_screens)
5622 new_screen = gdk_display_get_screen (display, screen_num + 1);
5624 new_screen = gdk_display_get_screen (display, 0);
5629 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
5630 gtk_widget_destroy (data->dialog_window);
5635 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
5637 gtk_widget_destroy (data);
5641 create_display_screen (GtkWidget *widget)
5643 GtkWidget *table, *frame, *window, *combo_dpy, *vbox;
5644 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
5646 ScreenDisplaySelection *scr_dpy_data;
5647 GdkScreen *screen = gtk_widget_get_screen (widget);
5648 GdkDisplay *display = gdk_screen_get_display (screen);
5650 window = g_object_new (gtk_window_get_type (),
5653 "type", GTK_WINDOW_TOPLEVEL,
5655 "Screen or Display selection",
5656 "border_width", 10, NULL);
5657 g_signal_connect (window, "destroy",
5658 G_CALLBACK (gtk_widget_destroy), NULL);
5660 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
5661 gtk_container_add (GTK_CONTAINER (window), vbox);
5663 frame = gtk_frame_new ("Select screen or display");
5664 gtk_container_add (GTK_CONTAINER (vbox), frame);
5666 table = gtk_table_new (2, 2, TRUE);
5667 gtk_table_set_row_spacings (GTK_TABLE (table), 3);
5668 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
5670 gtk_container_add (GTK_CONTAINER (frame), table);
5672 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
5673 if (gdk_display_get_n_screens(display) > 1)
5674 radio_scr = gtk_radio_button_new_with_label
5675 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
5678 radio_scr = gtk_radio_button_new_with_label
5679 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
5680 "only one screen on the current display");
5681 gtk_widget_set_sensitive (radio_scr, FALSE);
5683 combo_dpy = gtk_combo_box_text_new_with_entry ();
5684 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_dpy), "diabolo:0.0");
5685 gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (combo_dpy))),
5686 "<hostname>:<X Server Num>.<Screen Num>");
5688 gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1);
5689 gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2);
5690 gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1);
5692 bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
5693 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
5694 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
5696 gtk_container_add (GTK_CONTAINER (vbox), bbox);
5698 gtk_container_add (GTK_CONTAINER (bbox), applyb);
5699 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
5701 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
5703 scr_dpy_data->entry = gtk_bin_get_child (GTK_BIN (combo_dpy));
5704 scr_dpy_data->radio_dpy = radio_dpy;
5705 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
5706 scr_dpy_data->dialog_window = window;
5708 g_signal_connect (cancelb, "clicked",
5709 G_CALLBACK (screen_display_destroy_diag), window);
5710 g_signal_connect (applyb, "clicked",
5711 G_CALLBACK (screen_display_check), scr_dpy_data);
5712 gtk_widget_show_all (window);
5717 static gulong event_watcher_enter_id = 0;
5718 static gulong event_watcher_leave_id = 0;
5721 event_watcher (GSignalInvocationHint *ihint,
5722 guint n_param_values,
5723 const GValue *param_values,
5726 g_print ("Watch: \"%s\" emitted for %s\n",
5727 g_signal_name (ihint->signal_id),
5728 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
5734 event_watcher_down (void)
5736 if (event_watcher_enter_id)
5740 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5741 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
5742 event_watcher_enter_id = 0;
5743 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5744 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
5745 event_watcher_leave_id = 0;
5750 event_watcher_toggle (void)
5752 if (event_watcher_enter_id)
5753 event_watcher_down ();
5758 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5759 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5760 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5761 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5766 create_event_watcher (GtkWidget *widget)
5768 GtkWidget *action_area, *content_area;
5773 dialog_window = gtk_dialog_new ();
5774 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5775 gtk_widget_get_screen (widget));
5777 g_signal_connect (dialog_window, "destroy",
5778 G_CALLBACK (gtk_widget_destroyed),
5780 g_signal_connect (dialog_window, "destroy",
5781 G_CALLBACK (event_watcher_down),
5784 content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog_window));
5785 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5787 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
5788 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5789 gtk_widget_set_size_request (dialog_window, 200, 110);
5791 button = gtk_toggle_button_new_with_label ("Activate Watch");
5792 g_signal_connect (button, "clicked",
5793 G_CALLBACK (event_watcher_toggle),
5795 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
5796 gtk_box_pack_start (GTK_BOX (content_area), button, TRUE, TRUE, 0);
5797 gtk_widget_show (button);
5799 button = gtk_button_new_with_label ("Close");
5800 g_signal_connect_swapped (button, "clicked",
5801 G_CALLBACK (gtk_widget_destroy),
5803 gtk_widget_set_can_default (button, TRUE);
5804 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5805 gtk_widget_grab_default (button);
5806 gtk_widget_show (button);
5809 if (!gtk_widget_get_visible (dialog_window))
5810 gtk_widget_show (dialog_window);
5812 gtk_widget_destroy (dialog_window);
5820 reformat_value (GtkScale *scale,
5823 return g_strdup_printf ("-->%0.*g<--",
5824 gtk_scale_get_digits (scale), value);
5828 create_range_controls (GtkWidget *widget)
5830 static GtkWidget *window = NULL;
5834 GtkWidget *scrollbar;
5836 GtkWidget *separator;
5837 GtkAdjustment *adjustment;
5842 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5844 gtk_window_set_screen (GTK_WINDOW (window),
5845 gtk_widget_get_screen (widget));
5847 g_signal_connect (window, "destroy",
5848 G_CALLBACK (gtk_widget_destroyed),
5851 gtk_window_set_title (GTK_WINDOW (window), "range controls");
5852 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5855 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
5856 gtk_container_add (GTK_CONTAINER (window), box1);
5857 gtk_widget_show (box1);
5860 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
5861 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5862 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
5863 gtk_widget_show (box2);
5866 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
5868 scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5869 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
5870 gtk_scale_set_digits (GTK_SCALE (scale), 1);
5871 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5872 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
5873 gtk_widget_show (scale);
5875 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5876 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
5877 gtk_widget_show (scrollbar);
5879 scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5880 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5881 g_signal_connect (scale,
5883 G_CALLBACK (reformat_value),
5885 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
5886 gtk_widget_show (scale);
5888 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
5890 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5891 gtk_widget_set_size_request (scale, -1, 200);
5892 gtk_scale_set_digits (GTK_SCALE (scale), 2);
5893 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5894 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5895 gtk_widget_show (scale);
5897 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5898 gtk_widget_set_size_request (scale, -1, 200);
5899 gtk_scale_set_digits (GTK_SCALE (scale), 2);
5900 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5901 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
5902 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5903 gtk_widget_show (scale);
5905 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5906 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5907 g_signal_connect (scale,
5909 G_CALLBACK (reformat_value),
5911 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5912 gtk_widget_show (scale);
5915 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
5916 gtk_widget_show (hbox);
5918 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
5919 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
5920 gtk_widget_show (separator);
5923 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
5924 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5925 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
5926 gtk_widget_show (box2);
5929 button = gtk_button_new_with_label ("close");
5930 g_signal_connect_swapped (button, "clicked",
5931 G_CALLBACK (gtk_widget_destroy),
5933 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
5934 gtk_widget_set_can_default (button, TRUE);
5935 gtk_widget_grab_default (button);
5936 gtk_widget_show (button);
5939 if (!gtk_widget_get_visible (window))
5940 gtk_widget_show (window);
5942 gtk_widget_destroy (window);
5949 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
5950 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
5951 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
5952 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
5953 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
5954 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
5955 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
5956 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
5959 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
5965 static const char * book_open_xpm[] = {
5988 static const char * book_closed_xpm[] = {
6013 GdkPixbuf *book_open;
6014 GdkPixbuf *book_closed;
6015 GtkWidget *sample_notebook;
6018 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
6020 GtkWidget *page_widget;
6023 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
6025 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
6026 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6028 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
6029 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6033 page_switch (GtkWidget *widget, gpointer *page, gint page_num)
6035 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
6036 gint old_page_num = gtk_notebook_get_current_page (notebook);
6038 if (page_num == old_page_num)
6041 set_page_image (notebook, page_num, book_open);
6043 if (old_page_num != -1)
6044 set_page_image (notebook, old_page_num, book_closed);
6048 tab_fill (GtkToggleButton *button, GtkWidget *child)
6050 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
6051 "tab-fill", gtk_toggle_button_get_active (button),
6056 tab_expand (GtkToggleButton *button, GtkWidget *child)
6058 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
6059 "tab-expand", gtk_toggle_button_get_active (button),
6064 create_pages (GtkNotebook *notebook, gint start, gint end)
6066 GtkWidget *child = NULL;
6071 GtkWidget *label_box;
6072 GtkWidget *menu_box;
6076 char accel_buffer[32];
6078 for (i = start; i <= end; i++)
6080 sprintf (buffer, "Page %d", i);
6081 sprintf (accel_buffer, "Page _%d", i);
6083 child = gtk_frame_new (buffer);
6084 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
6086 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6087 gtk_box_set_homogeneous (GTK_BOX (vbox), TRUE);
6088 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
6089 gtk_container_add (GTK_CONTAINER (child), vbox);
6091 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6092 gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE);
6093 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
6095 button = gtk_check_button_new_with_label ("Fill Tab");
6096 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6097 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
6098 g_signal_connect (button, "toggled",
6099 G_CALLBACK (tab_fill), child);
6101 button = gtk_check_button_new_with_label ("Expand Tab");
6102 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6103 g_signal_connect (button, "toggled",
6104 G_CALLBACK (tab_expand), child);
6106 button = gtk_button_new_with_label ("Hide Page");
6107 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
6108 g_signal_connect_swapped (button, "clicked",
6109 G_CALLBACK (gtk_widget_hide),
6112 gtk_widget_show_all (child);
6114 label_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6115 pixwid = gtk_image_new_from_pixbuf (book_closed);
6116 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
6118 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
6119 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6120 label = gtk_label_new_with_mnemonic (accel_buffer);
6121 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
6122 gtk_widget_show_all (label_box);
6125 menu_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6126 pixwid = gtk_image_new_from_pixbuf (book_closed);
6127 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
6129 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
6130 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6131 label = gtk_label_new (buffer);
6132 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
6133 gtk_widget_show_all (menu_box);
6135 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
6140 rotate_notebook (GtkButton *button,
6141 GtkNotebook *notebook)
6143 gtk_notebook_set_tab_pos (notebook, (gtk_notebook_get_tab_pos (notebook) + 1) % 4);
6147 show_all_pages (GtkButton *button,
6148 GtkNotebook *notebook)
6150 gtk_container_foreach (GTK_CONTAINER (notebook),
6151 (GtkCallback) gtk_widget_show, NULL);
6155 notebook_type_changed (GtkWidget *optionmenu,
6158 GtkNotebook *notebook;
6168 notebook = GTK_NOTEBOOK (data);
6170 c = gtk_combo_box_get_active (GTK_COMBO_BOX (optionmenu));
6175 /* standard notebook */
6176 gtk_notebook_set_show_tabs (notebook, TRUE);
6177 gtk_notebook_set_show_border (notebook, TRUE);
6178 gtk_notebook_set_scrollable (notebook, FALSE);
6182 /* notabs notebook */
6183 gtk_notebook_set_show_tabs (notebook, FALSE);
6184 gtk_notebook_set_show_border (notebook, TRUE);
6189 gtk_notebook_set_show_tabs (notebook, FALSE);
6190 gtk_notebook_set_show_border (notebook, FALSE);
6195 gtk_notebook_set_show_tabs (notebook, TRUE);
6196 gtk_notebook_set_show_border (notebook, TRUE);
6197 gtk_notebook_set_scrollable (notebook, TRUE);
6198 if (gtk_notebook_get_n_pages (notebook) == 5)
6199 create_pages (notebook, 6, 15);
6205 if (gtk_notebook_get_n_pages (notebook) == 15)
6206 for (i = 0; i < 10; i++)
6207 gtk_notebook_remove_page (notebook, 5);
6211 notebook_popup (GtkToggleButton *button,
6212 GtkNotebook *notebook)
6214 if (gtk_toggle_button_get_active (button))
6215 gtk_notebook_popup_enable (notebook);
6217 gtk_notebook_popup_disable (notebook);
6221 create_notebook (GtkWidget *widget)
6223 static GtkWidget *window = NULL;
6227 GtkWidget *separator;
6231 static gchar *items[] =
6241 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6242 gtk_window_set_screen (GTK_WINDOW (window),
6243 gtk_widget_get_screen (widget));
6245 g_signal_connect (window, "destroy",
6246 G_CALLBACK (gtk_widget_destroyed),
6249 gtk_window_set_title (GTK_WINDOW (window), "notebook");
6250 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6252 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6253 gtk_container_add (GTK_CONTAINER (window), box1);
6255 sample_notebook = gtk_notebook_new ();
6256 g_signal_connect (sample_notebook, "switch_page",
6257 G_CALLBACK (page_switch), NULL);
6258 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
6259 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
6260 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
6262 gtk_widget_realize (sample_notebook);
6265 book_open = gdk_pixbuf_new_from_xpm_data (book_open_xpm);
6268 book_closed = gdk_pixbuf_new_from_xpm_data (book_closed_xpm);
6270 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
6272 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
6273 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
6275 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
6276 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6277 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6279 button = gtk_check_button_new_with_label ("popup menu");
6280 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
6281 g_signal_connect (button, "clicked",
6282 G_CALLBACK (notebook_popup),
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 label = gtk_label_new ("Notebook Style :");
6290 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
6292 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
6293 notebook_type_changed,
6295 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
6297 button = gtk_button_new_with_label ("Show all Pages");
6298 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
6299 g_signal_connect (button, "clicked",
6300 G_CALLBACK (show_all_pages), sample_notebook);
6302 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
6303 gtk_box_set_homogeneous (GTK_BOX (box2), TRUE);
6304 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6305 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6307 button = gtk_button_new_with_label ("prev");
6308 g_signal_connect_swapped (button, "clicked",
6309 G_CALLBACK (gtk_notebook_prev_page),
6311 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6313 button = gtk_button_new_with_label ("next");
6314 g_signal_connect_swapped (button, "clicked",
6315 G_CALLBACK (gtk_notebook_next_page),
6317 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6319 button = gtk_button_new_with_label ("rotate");
6320 g_signal_connect (button, "clicked",
6321 G_CALLBACK (rotate_notebook), sample_notebook);
6322 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6324 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
6325 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
6327 button = gtk_button_new_with_label ("close");
6328 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
6329 g_signal_connect_swapped (button, "clicked",
6330 G_CALLBACK (gtk_widget_destroy),
6332 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
6333 gtk_widget_set_can_default (button, TRUE);
6334 gtk_widget_grab_default (button);
6337 if (!gtk_widget_get_visible (window))
6338 gtk_widget_show_all (window);
6340 gtk_widget_destroy (window);
6348 toggle_resize (GtkWidget *widget, GtkWidget *child)
6350 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6351 GValue value = { 0, };
6352 g_value_init (&value, G_TYPE_BOOLEAN);
6353 gtk_container_child_get_property (container, child, "resize", &value);
6354 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6355 gtk_container_child_set_property (container, child, "resize", &value);
6359 toggle_shrink (GtkWidget *widget, GtkWidget *child)
6361 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6362 GValue value = { 0, };
6363 g_value_init (&value, G_TYPE_BOOLEAN);
6364 gtk_container_child_get_property (container, child, "shrink", &value);
6365 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6366 gtk_container_child_set_property (container, child, "shrink", &value);
6370 paned_props_clicked (GtkWidget *button,
6373 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
6375 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
6379 create_pane_options (GtkPaned *paned,
6380 const gchar *frame_label,
6381 const gchar *label1,
6382 const gchar *label2)
6384 GtkWidget *child1, *child2;
6389 GtkWidget *check_button;
6391 child1 = gtk_paned_get_child1 (paned);
6392 child2 = gtk_paned_get_child2 (paned);
6394 frame = gtk_frame_new (frame_label);
6395 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
6397 table = gtk_table_new (4, 2, 4);
6398 gtk_container_add (GTK_CONTAINER (frame), table);
6400 label = gtk_label_new (label1);
6401 gtk_table_attach_defaults (GTK_TABLE (table), label,
6404 check_button = gtk_check_button_new_with_label ("Resize");
6405 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6407 g_signal_connect (check_button, "toggled",
6408 G_CALLBACK (toggle_resize),
6411 check_button = gtk_check_button_new_with_label ("Shrink");
6412 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6414 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6416 g_signal_connect (check_button, "toggled",
6417 G_CALLBACK (toggle_shrink),
6420 label = gtk_label_new (label2);
6421 gtk_table_attach_defaults (GTK_TABLE (table), label,
6424 check_button = gtk_check_button_new_with_label ("Resize");
6425 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6427 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6429 g_signal_connect (check_button, "toggled",
6430 G_CALLBACK (toggle_resize),
6433 check_button = gtk_check_button_new_with_label ("Shrink");
6434 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6436 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6438 g_signal_connect (check_button, "toggled",
6439 G_CALLBACK (toggle_shrink),
6442 button = gtk_button_new_with_mnemonic ("_Properties");
6443 gtk_table_attach_defaults (GTK_TABLE (table), button,
6445 g_signal_connect (button, "clicked",
6446 G_CALLBACK (paned_props_clicked),
6453 create_panes (GtkWidget *widget)
6455 static GtkWidget *window = NULL;
6464 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6466 gtk_window_set_screen (GTK_WINDOW (window),
6467 gtk_widget_get_screen (widget));
6469 g_signal_connect (window, "destroy",
6470 G_CALLBACK (gtk_widget_destroyed),
6473 gtk_window_set_title (GTK_WINDOW (window), "Panes");
6474 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6476 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6477 gtk_container_add (GTK_CONTAINER (window), vbox);
6479 vpaned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6480 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
6481 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
6483 hpaned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6484 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
6486 frame = gtk_frame_new (NULL);
6487 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6488 gtk_widget_set_size_request (frame, 60, 60);
6489 gtk_paned_add1 (GTK_PANED (hpaned), frame);
6491 button = gtk_button_new_with_label ("Hi there");
6492 gtk_container_add (GTK_CONTAINER(frame), button);
6494 frame = gtk_frame_new (NULL);
6495 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6496 gtk_widget_set_size_request (frame, 80, 60);
6497 gtk_paned_add2 (GTK_PANED (hpaned), frame);
6499 frame = gtk_frame_new (NULL);
6500 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6501 gtk_widget_set_size_request (frame, 60, 80);
6502 gtk_paned_add2 (GTK_PANED (vpaned), frame);
6504 /* Now create toggle buttons to control sizing */
6506 gtk_box_pack_start (GTK_BOX (vbox),
6507 create_pane_options (GTK_PANED (hpaned),
6513 gtk_box_pack_start (GTK_BOX (vbox),
6514 create_pane_options (GTK_PANED (vpaned),
6520 gtk_widget_show_all (vbox);
6523 if (!gtk_widget_get_visible (window))
6524 gtk_widget_show (window);
6526 gtk_widget_destroy (window);
6530 * Paned keyboard navigation
6534 paned_keyboard_window1 (GtkWidget *widget)
6557 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6558 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
6559 gtk_window_set_screen (GTK_WINDOW (window1),
6560 gtk_widget_get_screen (widget));
6562 hpaned1 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6563 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
6565 frame1 = gtk_frame_new (NULL);
6566 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
6567 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
6569 vbox1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6570 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
6572 button7 = gtk_button_new_with_label ("button7");
6573 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
6575 button8 = gtk_button_new_with_label ("button8");
6576 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
6578 button9 = gtk_button_new_with_label ("button9");
6579 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
6581 vpaned1 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6582 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
6584 frame2 = gtk_frame_new (NULL);
6585 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
6586 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
6588 frame5 = gtk_frame_new (NULL);
6589 gtk_container_add (GTK_CONTAINER (frame2), frame5);
6591 hbox1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6592 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
6594 button5 = gtk_button_new_with_label ("button5");
6595 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
6597 button6 = gtk_button_new_with_label ("button6");
6598 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
6600 frame3 = gtk_frame_new (NULL);
6601 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
6602 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
6604 frame4 = gtk_frame_new ("Buttons");
6605 gtk_container_add (GTK_CONTAINER (frame3), frame4);
6606 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
6608 table1 = gtk_table_new (2, 2, FALSE);
6609 gtk_container_add (GTK_CONTAINER (frame4), table1);
6610 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
6612 button1 = gtk_button_new_with_label ("button1");
6613 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
6614 (GtkAttachOptions) (GTK_FILL),
6615 (GtkAttachOptions) (0), 0, 0);
6617 button2 = gtk_button_new_with_label ("button2");
6618 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
6619 (GtkAttachOptions) (GTK_FILL),
6620 (GtkAttachOptions) (0), 0, 0);
6622 button3 = gtk_button_new_with_label ("button3");
6623 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
6624 (GtkAttachOptions) (GTK_FILL),
6625 (GtkAttachOptions) (0), 0, 0);
6627 button4 = gtk_button_new_with_label ("button4");
6628 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
6629 (GtkAttachOptions) (GTK_FILL),
6630 (GtkAttachOptions) (0), 0, 0);
6636 paned_keyboard_window2 (GtkWidget *widget)
6641 GtkWidget *button13;
6645 GtkWidget *button12;
6647 GtkWidget *button11;
6648 GtkWidget *button10;
6650 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6651 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
6653 gtk_window_set_screen (GTK_WINDOW (window2),
6654 gtk_widget_get_screen (widget));
6656 hpaned2 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6657 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
6659 frame6 = gtk_frame_new (NULL);
6660 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
6661 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
6663 button13 = gtk_button_new_with_label ("button13");
6664 gtk_container_add (GTK_CONTAINER (frame6), button13);
6666 hbox2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6667 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
6669 vpaned2 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6670 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
6672 frame7 = gtk_frame_new (NULL);
6673 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
6674 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
6676 button12 = gtk_button_new_with_label ("button12");
6677 gtk_container_add (GTK_CONTAINER (frame7), button12);
6679 frame8 = gtk_frame_new (NULL);
6680 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
6681 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
6683 button11 = gtk_button_new_with_label ("button11");
6684 gtk_container_add (GTK_CONTAINER (frame8), button11);
6686 button10 = gtk_button_new_with_label ("button10");
6687 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
6693 paned_keyboard_window3 (GtkWidget *widget)
6700 GtkWidget *button14;
6703 GtkWidget *button15;
6706 GtkWidget *button16;
6708 GtkWidget *button17;
6710 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6711 g_object_set_data (G_OBJECT (window3), "window3", window3);
6712 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
6714 gtk_window_set_screen (GTK_WINDOW (window3),
6715 gtk_widget_get_screen (widget));
6718 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6719 gtk_container_add (GTK_CONTAINER (window3), vbox2);
6721 label1 = gtk_label_new ("Three panes nested inside each other");
6722 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
6724 hpaned3 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6725 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
6727 frame9 = gtk_frame_new (NULL);
6728 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
6729 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
6731 button14 = gtk_button_new_with_label ("button14");
6732 gtk_container_add (GTK_CONTAINER (frame9), button14);
6734 hpaned4 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6735 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
6737 frame10 = gtk_frame_new (NULL);
6738 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
6739 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
6741 button15 = gtk_button_new_with_label ("button15");
6742 gtk_container_add (GTK_CONTAINER (frame10), button15);
6744 hpaned5 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6745 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
6747 frame11 = gtk_frame_new (NULL);
6748 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
6749 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
6751 button16 = gtk_button_new_with_label ("button16");
6752 gtk_container_add (GTK_CONTAINER (frame11), button16);
6754 frame12 = gtk_frame_new (NULL);
6755 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
6756 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
6758 button17 = gtk_button_new_with_label ("button17");
6759 gtk_container_add (GTK_CONTAINER (frame12), button17);
6765 paned_keyboard_window4 (GtkWidget *widget)
6772 GtkWidget *button19;
6773 GtkWidget *button18;
6776 GtkWidget *button21;
6777 GtkWidget *button20;
6779 GtkWidget *button23;
6780 GtkWidget *button22;
6782 GtkWidget *button25;
6783 GtkWidget *button24;
6785 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6786 g_object_set_data (G_OBJECT (window4), "window4", window4);
6787 gtk_window_set_title (GTK_WINDOW (window4), "window4");
6789 gtk_window_set_screen (GTK_WINDOW (window4),
6790 gtk_widget_get_screen (widget));
6792 vbox3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6793 gtk_container_add (GTK_CONTAINER (window4), vbox3);
6795 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
6796 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
6797 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
6799 hpaned6 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6800 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
6802 vpaned3 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6803 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
6805 button19 = gtk_button_new_with_label ("button19");
6806 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
6808 button18 = gtk_button_new_with_label ("button18");
6809 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
6811 hbox3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6812 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
6814 vpaned4 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6815 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
6817 button21 = gtk_button_new_with_label ("button21");
6818 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
6820 button20 = gtk_button_new_with_label ("button20");
6821 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
6823 vpaned5 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6824 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
6826 button23 = gtk_button_new_with_label ("button23");
6827 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
6829 button22 = gtk_button_new_with_label ("button22");
6830 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
6832 vpaned6 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6833 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
6835 button25 = gtk_button_new_with_label ("button25");
6836 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
6838 button24 = gtk_button_new_with_label ("button24");
6839 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
6845 create_paned_keyboard_navigation (GtkWidget *widget)
6847 static GtkWidget *window1 = NULL;
6848 static GtkWidget *window2 = NULL;
6849 static GtkWidget *window3 = NULL;
6850 static GtkWidget *window4 = NULL;
6853 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
6855 gtk_widget_destroy (window1);
6856 gtk_widget_destroy (window2);
6857 gtk_widget_destroy (window3);
6858 gtk_widget_destroy (window4);
6863 window1 = paned_keyboard_window1 (widget);
6864 g_signal_connect (window1, "destroy",
6865 G_CALLBACK (gtk_widget_destroyed),
6871 window2 = paned_keyboard_window2 (widget);
6872 g_signal_connect (window2, "destroy",
6873 G_CALLBACK (gtk_widget_destroyed),
6879 window3 = paned_keyboard_window3 (widget);
6880 g_signal_connect (window3, "destroy",
6881 G_CALLBACK (gtk_widget_destroyed),
6887 window4 = paned_keyboard_window4 (widget);
6888 g_signal_connect (window4, "destroy",
6889 G_CALLBACK (gtk_widget_destroyed),
6893 if (gtk_widget_get_visible (window1))
6894 gtk_widget_destroy (GTK_WIDGET (window1));
6896 gtk_widget_show_all (GTK_WIDGET (window1));
6898 if (gtk_widget_get_visible (window2))
6899 gtk_widget_destroy (GTK_WIDGET (window2));
6901 gtk_widget_show_all (GTK_WIDGET (window2));
6903 if (gtk_widget_get_visible (window3))
6904 gtk_widget_destroy (GTK_WIDGET (window3));
6906 gtk_widget_show_all (GTK_WIDGET (window3));
6908 if (gtk_widget_get_visible (window4))
6909 gtk_widget_destroy (GTK_WIDGET (window4));
6911 gtk_widget_show_all (GTK_WIDGET (window4));
6919 typedef struct _cursoroffset {gint x,y;} CursorOffset;
6922 shape_pressed (GtkWidget *widget, GdkEventButton *event)
6926 /* ignore double and triple click */
6927 if (event->type != GDK_BUTTON_PRESS)
6930 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
6931 p->x = (int) event->x;
6932 p->y = (int) event->y;
6934 gtk_grab_add (widget);
6935 gdk_device_grab (gdk_event_get_device ((GdkEvent*)event),
6936 gtk_widget_get_window (widget),
6939 GDK_BUTTON_RELEASE_MASK |
6940 GDK_BUTTON_MOTION_MASK |
6941 GDK_POINTER_MOTION_HINT_MASK,
6947 shape_released (GtkWidget *widget,
6948 GdkEventButton *event)
6950 gtk_grab_remove (widget);
6951 gdk_device_ungrab (gdk_event_get_device ((GdkEvent*)event), event->time);
6955 shape_motion (GtkWidget *widget,
6956 GdkEventMotion *event)
6960 GdkModifierType mask;
6962 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
6965 * Can't use event->x / event->y here
6966 * because I need absolute coordinates.
6968 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
6969 gtk_window_move (GTK_WINDOW (widget), xp - p->x, yp - p->y);
6973 shape_create_icon (GdkScreen *screen,
6984 CursorOffset* icon_pos;
6985 cairo_surface_t *mask;
6986 cairo_region_t *mask_region;
6991 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
6993 window = gtk_window_new (window_type);
6994 gtk_window_set_screen (GTK_WINDOW (window), screen);
6996 fixed = gtk_fixed_new ();
6997 gtk_widget_set_size_request (fixed, 100, 100);
6998 gtk_container_add (GTK_CONTAINER (window), fixed);
6999 gtk_widget_show (fixed);
7001 gtk_widget_set_events (window,
7002 gtk_widget_get_events (window) |
7003 GDK_BUTTON_MOTION_MASK |
7004 GDK_POINTER_MOTION_HINT_MASK |
7005 GDK_BUTTON_PRESS_MASK);
7007 gtk_widget_realize (window);
7009 pixbuf = gdk_pixbuf_new_from_file (xpm_file, NULL);
7010 g_assert (pixbuf); /* FIXME: error handling */
7012 mask = cairo_image_surface_create (CAIRO_FORMAT_A1,
7013 gdk_pixbuf_get_width (pixbuf),
7014 gdk_pixbuf_get_height (pixbuf));
7015 cr = cairo_create (mask);
7016 gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
7020 mask_region = gdk_cairo_region_create_from_surface (mask);
7022 cairo_region_translate (mask_region, px, py);
7024 image = gtk_image_new_from_pixbuf (pixbuf);
7025 gtk_fixed_put (GTK_FIXED (fixed), image, px,py);
7026 gtk_widget_show (image);
7028 gtk_widget_shape_combine_region (window, mask_region);
7030 cairo_region_destroy (mask_region);
7031 cairo_surface_destroy (mask);
7032 g_object_unref (pixbuf);
7034 g_signal_connect (window, "button_press_event",
7035 G_CALLBACK (shape_pressed), NULL);
7036 g_signal_connect (window, "button_release_event",
7037 G_CALLBACK (shape_released), NULL);
7038 g_signal_connect (window, "motion_notify_event",
7039 G_CALLBACK (shape_motion), NULL);
7041 icon_pos = g_new (CursorOffset, 1);
7042 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
7044 gtk_window_move (GTK_WINDOW (window), x, y);
7045 gtk_widget_show (window);
7051 create_shapes (GtkWidget *widget)
7053 /* Variables used by the Drag/Drop and Shape Window demos */
7054 static GtkWidget *modeller = NULL;
7055 static GtkWidget *sheets = NULL;
7056 static GtkWidget *rings = NULL;
7057 static GtkWidget *with_region = NULL;
7058 GdkScreen *screen = gtk_widget_get_screen (widget);
7060 if (!(file_exists ("Modeller.xpm") &&
7061 file_exists ("FilesQueue.xpm") &&
7062 file_exists ("3DRings.xpm")))
7068 modeller = shape_create_icon (screen, "Modeller.xpm",
7069 440, 140, 0,0, GTK_WINDOW_POPUP);
7071 g_signal_connect (modeller, "destroy",
7072 G_CALLBACK (gtk_widget_destroyed),
7076 gtk_widget_destroy (modeller);
7080 sheets = shape_create_icon (screen, "FilesQueue.xpm",
7081 580, 170, 0,0, GTK_WINDOW_POPUP);
7083 g_signal_connect (sheets, "destroy",
7084 G_CALLBACK (gtk_widget_destroyed),
7089 gtk_widget_destroy (sheets);
7093 rings = shape_create_icon (screen, "3DRings.xpm",
7094 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7096 g_signal_connect (rings, "destroy",
7097 G_CALLBACK (gtk_widget_destroyed),
7101 gtk_widget_destroy (rings);
7105 cairo_region_t *region;
7108 with_region = shape_create_icon (screen, "3DRings.xpm",
7109 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7111 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
7113 g_signal_connect (with_region, "destroy",
7114 G_CALLBACK (gtk_widget_destroyed),
7117 /* reset shape from mask to a region */
7120 region = cairo_region_create ();
7132 cairo_region_union_rectangle (region, &rect);
7140 gdk_window_shape_combine_region (gtk_widget_get_window (with_region),
7145 gtk_widget_destroy (with_region);
7153 create_wmhints (GtkWidget *widget)
7155 static GtkWidget *window = NULL;
7157 GtkWidget *separator;
7161 GdkWindow *gdk_window;
7167 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7169 gtk_window_set_screen (GTK_WINDOW (window),
7170 gtk_widget_get_screen (widget));
7172 g_signal_connect (window, "destroy",
7173 G_CALLBACK (gtk_widget_destroyed),
7176 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
7177 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7179 gtk_widget_realize (window);
7181 gdk_window = gtk_widget_get_window (window);
7183 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
7184 list = g_list_prepend (NULL, pixbuf);
7186 gdk_window_set_icon_list (gdk_window, list);
7189 g_object_unref (pixbuf);
7191 gdk_window_set_icon_name (gdk_window, "WMHints Test Icon");
7193 gdk_window_set_decorations (gdk_window, GDK_DECOR_ALL | GDK_DECOR_MENU);
7194 gdk_window_set_functions (gdk_window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
7196 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7197 gtk_container_add (GTK_CONTAINER (window), box1);
7198 gtk_widget_show (box1);
7200 label = gtk_label_new ("Try iconizing me!");
7201 gtk_widget_set_size_request (label, 150, 50);
7202 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
7203 gtk_widget_show (label);
7206 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
7207 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
7208 gtk_widget_show (separator);
7211 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
7212 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7213 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7214 gtk_widget_show (box2);
7217 button = gtk_button_new_with_label ("close");
7219 g_signal_connect_swapped (button, "clicked",
7220 G_CALLBACK (gtk_widget_destroy),
7223 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7224 gtk_widget_set_can_default (button, TRUE);
7225 gtk_widget_grab_default (button);
7226 gtk_widget_show (button);
7229 if (!gtk_widget_get_visible (window))
7230 gtk_widget_show (window);
7232 gtk_widget_destroy (window);
7237 * Window state tracking
7241 window_state_callback (GtkWidget *widget,
7242 GdkEventWindowState *event,
7245 GtkWidget *label = data;
7248 msg = g_strconcat (gtk_window_get_title (GTK_WINDOW (widget)), ": ",
7249 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
7250 "withdrawn" : "not withdrawn", ", ",
7251 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
7252 "iconified" : "not iconified", ", ",
7253 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
7254 "sticky" : "not sticky", ", ",
7255 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
7256 "maximized" : "not maximized", ", ",
7257 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
7258 "fullscreen" : "not fullscreen",
7259 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
7260 "above" : "not above", ", ",
7261 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
7262 "below" : "not below", ", ",
7265 gtk_label_set_text (GTK_LABEL (label), msg);
7273 tracking_label (GtkWidget *window)
7279 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
7281 g_signal_connect_object (hbox,
7283 G_CALLBACK (gtk_widget_destroy),
7287 label = gtk_label_new ("<no window state events received>");
7288 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
7289 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
7291 g_signal_connect (window,
7292 "window_state_event",
7293 G_CALLBACK (window_state_callback),
7296 button = gtk_button_new_with_label ("Deiconify");
7297 g_signal_connect_object (button,
7299 G_CALLBACK (gtk_window_deiconify),
7302 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7304 button = gtk_button_new_with_label ("Iconify");
7305 g_signal_connect_object (button,
7307 G_CALLBACK (gtk_window_iconify),
7310 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7312 button = gtk_button_new_with_label ("Fullscreen");
7313 g_signal_connect_object (button,
7315 G_CALLBACK (gtk_window_fullscreen),
7318 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7320 button = gtk_button_new_with_label ("Unfullscreen");
7321 g_signal_connect_object (button,
7323 G_CALLBACK (gtk_window_unfullscreen),
7326 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7328 button = gtk_button_new_with_label ("Present");
7329 g_signal_connect_object (button,
7331 G_CALLBACK (gtk_window_present),
7334 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7336 button = gtk_button_new_with_label ("Show");
7337 g_signal_connect_object (button,
7339 G_CALLBACK (gtk_widget_show),
7342 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7344 gtk_widget_show_all (hbox);
7350 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
7352 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7354 gtk_window_set_keep_above (GTK_WINDOW (data),
7355 gtk_toggle_button_get_active (togglebutton));
7357 if (gtk_toggle_button_get_active (togglebutton))
7358 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7362 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
7364 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7366 gtk_window_set_keep_below (GTK_WINDOW (data),
7367 gtk_toggle_button_get_active (togglebutton));
7369 if (gtk_toggle_button_get_active (togglebutton))
7370 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7375 get_state_controls (GtkWidget *window)
7379 GtkWidget *button_above;
7380 GtkWidget *button_below;
7382 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7384 button = gtk_button_new_with_label ("Stick");
7385 g_signal_connect_object (button,
7387 G_CALLBACK (gtk_window_stick),
7390 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7392 button = gtk_button_new_with_label ("Unstick");
7393 g_signal_connect_object (button,
7395 G_CALLBACK (gtk_window_unstick),
7398 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7400 button = gtk_button_new_with_label ("Maximize");
7401 g_signal_connect_object (button,
7403 G_CALLBACK (gtk_window_maximize),
7406 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7408 button = gtk_button_new_with_label ("Unmaximize");
7409 g_signal_connect_object (button,
7411 G_CALLBACK (gtk_window_unmaximize),
7414 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7416 button = gtk_button_new_with_label ("Iconify");
7417 g_signal_connect_object (button,
7419 G_CALLBACK (gtk_window_iconify),
7422 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7424 button = gtk_button_new_with_label ("Fullscreen");
7425 g_signal_connect_object (button,
7427 G_CALLBACK (gtk_window_fullscreen),
7430 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7432 button = gtk_button_new_with_label ("Unfullscreen");
7433 g_signal_connect_object (button,
7435 G_CALLBACK (gtk_window_unfullscreen),
7438 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7440 button_above = gtk_toggle_button_new_with_label ("Keep above");
7441 g_signal_connect (button_above,
7443 G_CALLBACK (keep_window_above),
7445 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
7447 button_below = gtk_toggle_button_new_with_label ("Keep below");
7448 g_signal_connect (button_below,
7450 G_CALLBACK (keep_window_below),
7452 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
7454 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
7455 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
7457 button = gtk_button_new_with_label ("Hide (withdraw)");
7458 g_signal_connect_object (button,
7460 G_CALLBACK (gtk_widget_hide),
7463 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7465 gtk_widget_show_all (vbox);
7471 create_window_states (GtkWidget *widget)
7473 static GtkWidget *window = NULL;
7476 GtkWidget *iconified;
7478 GtkWidget *controls;
7482 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7483 gtk_window_set_screen (GTK_WINDOW (window),
7484 gtk_widget_get_screen (widget));
7486 g_signal_connect (window, "destroy",
7487 G_CALLBACK (gtk_widget_destroyed),
7490 gtk_window_set_title (GTK_WINDOW (window), "Window states");
7492 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7493 gtk_container_add (GTK_CONTAINER (window), box1);
7495 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7497 gtk_window_set_screen (GTK_WINDOW (iconified),
7498 gtk_widget_get_screen (widget));
7500 g_signal_connect_object (iconified, "destroy",
7501 G_CALLBACK (gtk_widget_destroy),
7504 gtk_window_iconify (GTK_WINDOW (iconified));
7505 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
7506 controls = get_state_controls (iconified);
7507 gtk_container_add (GTK_CONTAINER (iconified), controls);
7509 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7511 gtk_window_set_screen (GTK_WINDOW (normal),
7512 gtk_widget_get_screen (widget));
7514 g_signal_connect_object (normal, "destroy",
7515 G_CALLBACK (gtk_widget_destroy),
7519 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
7520 controls = get_state_controls (normal);
7521 gtk_container_add (GTK_CONTAINER (normal), controls);
7523 label = tracking_label (iconified);
7524 gtk_container_add (GTK_CONTAINER (box1), label);
7526 label = tracking_label (normal);
7527 gtk_container_add (GTK_CONTAINER (box1), label);
7529 gtk_widget_show_all (iconified);
7530 gtk_widget_show_all (normal);
7531 gtk_widget_show_all (box1);
7534 if (!gtk_widget_get_visible (window))
7535 gtk_widget_show (window);
7537 gtk_widget_destroy (window);
7545 configure_event_callback (GtkWidget *widget,
7546 GdkEventConfigure *event,
7549 GtkWidget *label = data;
7553 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
7555 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
7557 event->x, event->y, event->width, event->height,
7560 gtk_label_set_text (GTK_LABEL (label), msg);
7568 get_ints (GtkWidget *window,
7575 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
7576 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
7578 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
7579 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
7583 set_size_callback (GtkWidget *widget,
7588 get_ints (data, &w, &h);
7590 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
7594 unset_default_size_callback (GtkWidget *widget,
7597 gtk_window_set_default_size (g_object_get_data (data, "target"),
7602 set_default_size_callback (GtkWidget *widget,
7607 get_ints (data, &w, &h);
7609 gtk_window_set_default_size (g_object_get_data (data, "target"),
7614 unset_size_request_callback (GtkWidget *widget,
7617 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7622 set_size_request_callback (GtkWidget *widget,
7627 get_ints (data, &w, &h);
7629 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7634 set_location_callback (GtkWidget *widget,
7639 get_ints (data, &x, &y);
7641 gtk_window_move (g_object_get_data (data, "target"), x, y);
7645 move_to_position_callback (GtkWidget *widget,
7651 window = g_object_get_data (data, "target");
7653 gtk_window_get_position (window, &x, &y);
7655 gtk_window_move (window, x, y);
7659 set_geometry_callback (GtkWidget *entry,
7665 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
7667 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
7669 if (!gtk_window_parse_geometry (target, text))
7670 g_print ("Bad geometry string '%s'\n", text);
7676 resizable_callback (GtkWidget *widget,
7679 g_object_set (g_object_get_data (data, "target"),
7680 "resizable", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)),
7685 gravity_selected (GtkWidget *widget,
7688 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
7689 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GDK_GRAVITY_NORTH_WEST);
7693 pos_selected (GtkWidget *widget,
7696 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
7697 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GTK_WIN_POS_NONE);
7701 move_gravity_window_to_current_position (GtkWidget *widget,
7707 window = GTK_WINDOW (data);
7709 gtk_window_get_position (window, &x, &y);
7711 gtk_window_move (window, x, y);
7715 get_screen_corner (GtkWindow *window,
7720 GdkScreen * screen = gtk_window_get_screen (window);
7722 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
7724 switch (gtk_window_get_gravity (window))
7726 case GDK_GRAVITY_SOUTH_EAST:
7727 *x = gdk_screen_get_width (screen) - w;
7728 *y = gdk_screen_get_height (screen) - h;
7731 case GDK_GRAVITY_NORTH_EAST:
7732 *x = gdk_screen_get_width (screen) - w;
7736 case GDK_GRAVITY_SOUTH_WEST:
7738 *y = gdk_screen_get_height (screen) - h;
7741 case GDK_GRAVITY_NORTH_WEST:
7746 case GDK_GRAVITY_SOUTH:
7747 *x = (gdk_screen_get_width (screen) - w) / 2;
7748 *y = gdk_screen_get_height (screen) - h;
7751 case GDK_GRAVITY_NORTH:
7752 *x = (gdk_screen_get_width (screen) - w) / 2;
7756 case GDK_GRAVITY_WEST:
7758 *y = (gdk_screen_get_height (screen) - h) / 2;
7761 case GDK_GRAVITY_EAST:
7762 *x = gdk_screen_get_width (screen) - w;
7763 *y = (gdk_screen_get_height (screen) - h) / 2;
7766 case GDK_GRAVITY_CENTER:
7767 *x = (gdk_screen_get_width (screen) - w) / 2;
7768 *y = (gdk_screen_get_height (screen) - h) / 2;
7771 case GDK_GRAVITY_STATIC:
7772 /* pick some random numbers */
7778 g_assert_not_reached ();
7784 move_gravity_window_to_starting_position (GtkWidget *widget,
7790 window = GTK_WINDOW (data);
7792 get_screen_corner (window,
7795 gtk_window_move (window, x, y);
7799 make_gravity_window (GtkWidget *destroy_with,
7808 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7810 gtk_window_set_screen (GTK_WINDOW (window),
7811 gtk_widget_get_screen (destroy_with));
7813 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7814 gtk_widget_show (vbox);
7816 gtk_container_add (GTK_CONTAINER (window), vbox);
7817 gtk_window_set_title (GTK_WINDOW (window), title);
7818 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
7820 g_signal_connect_object (destroy_with,
7822 G_CALLBACK (gtk_widget_destroy),
7827 button = gtk_button_new_with_mnemonic ("_Move to current position");
7829 g_signal_connect (button, "clicked",
7830 G_CALLBACK (move_gravity_window_to_current_position),
7833 gtk_container_add (GTK_CONTAINER (vbox), button);
7834 gtk_widget_show (button);
7836 button = gtk_button_new_with_mnemonic ("Move to _starting position");
7838 g_signal_connect (button, "clicked",
7839 G_CALLBACK (move_gravity_window_to_starting_position),
7842 gtk_container_add (GTK_CONTAINER (vbox), button);
7843 gtk_widget_show (button);
7845 /* Pretend this is the result of --geometry.
7846 * DO NOT COPY THIS CODE unless you are setting --geometry results,
7847 * and in that case you probably should just use gtk_window_parse_geometry().
7848 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
7849 * you are parsing --geometry or equivalent.
7851 gtk_window_set_geometry_hints (GTK_WINDOW (window),
7855 gtk_window_set_default_size (GTK_WINDOW (window),
7858 get_screen_corner (GTK_WINDOW (window), &x, &y);
7860 gtk_window_move (GTK_WINDOW (window),
7867 do_gravity_test (GtkWidget *widget,
7870 GtkWidget *destroy_with = data;
7873 /* We put a window at each gravity point on the screen. */
7874 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
7876 gtk_widget_show (window);
7878 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
7880 gtk_widget_show (window);
7882 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
7884 gtk_widget_show (window);
7886 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
7888 gtk_widget_show (window);
7890 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
7892 gtk_widget_show (window);
7894 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
7896 gtk_widget_show (window);
7899 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
7901 gtk_widget_show (window);
7904 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
7906 gtk_widget_show (window);
7908 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
7910 gtk_widget_show (window);
7912 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
7914 gtk_widget_show (window);
7918 window_controls (GtkWidget *window)
7920 GtkWidget *control_window;
7925 GtkAdjustment *adjustment;
7930 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7932 gtk_window_set_screen (GTK_WINDOW (control_window),
7933 gtk_widget_get_screen (window));
7935 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
7937 g_object_set_data (G_OBJECT (control_window),
7941 g_signal_connect_object (control_window,
7943 G_CALLBACK (gtk_widget_destroy),
7947 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
7949 gtk_container_add (GTK_CONTAINER (control_window), vbox);
7951 label = gtk_label_new ("<no configure events>");
7952 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
7954 g_signal_connect (window,
7956 G_CALLBACK (configure_event_callback),
7959 adjustment = gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0, 5.0, 0.0);
7960 spin = gtk_spin_button_new (adjustment, 0, 0);
7962 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
7964 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
7966 adjustment = gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0, 5.0, 0.0);
7967 spin = gtk_spin_button_new (adjustment, 0, 0);
7969 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
7971 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
7973 entry = gtk_entry_new ();
7974 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
7976 g_signal_connect (entry, "changed",
7977 G_CALLBACK (set_geometry_callback),
7980 button = gtk_button_new_with_label ("Show gravity test windows");
7981 g_signal_connect_swapped (button,
7983 G_CALLBACK (do_gravity_test),
7985 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7987 button = gtk_button_new_with_label ("Reshow with initial size");
7988 g_signal_connect_object (button,
7990 G_CALLBACK (gtk_window_reshow_with_initial_size),
7993 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7995 button = gtk_button_new_with_label ("Queue resize");
7996 g_signal_connect_object (button,
7998 G_CALLBACK (gtk_widget_queue_resize),
8001 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8003 button = gtk_button_new_with_label ("Resize");
8004 g_signal_connect (button,
8006 G_CALLBACK (set_size_callback),
8008 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8010 button = gtk_button_new_with_label ("Set default size");
8011 g_signal_connect (button,
8013 G_CALLBACK (set_default_size_callback),
8015 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8017 button = gtk_button_new_with_label ("Unset default size");
8018 g_signal_connect (button,
8020 G_CALLBACK (unset_default_size_callback),
8022 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8024 button = gtk_button_new_with_label ("Set size request");
8025 g_signal_connect (button,
8027 G_CALLBACK (set_size_request_callback),
8029 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8031 button = gtk_button_new_with_label ("Unset size request");
8032 g_signal_connect (button,
8034 G_CALLBACK (unset_size_request_callback),
8036 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8038 button = gtk_button_new_with_label ("Move");
8039 g_signal_connect (button,
8041 G_CALLBACK (set_location_callback),
8043 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8045 button = gtk_button_new_with_label ("Move to current position");
8046 g_signal_connect (button,
8048 G_CALLBACK (move_to_position_callback),
8050 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8052 button = gtk_check_button_new_with_label ("Allow resize");
8053 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
8054 g_signal_connect (button,
8056 G_CALLBACK (resizable_callback),
8058 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8060 button = gtk_button_new_with_mnemonic ("_Show");
8061 g_signal_connect_object (button,
8063 G_CALLBACK (gtk_widget_show),
8066 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8068 button = gtk_button_new_with_mnemonic ("_Hide");
8069 g_signal_connect_object (button,
8071 G_CALLBACK (gtk_widget_hide),
8074 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8076 om = gtk_combo_box_text_new ();
8080 static gchar *names[] = {
8081 "GDK_GRAVITY_NORTH_WEST",
8082 "GDK_GRAVITY_NORTH",
8083 "GDK_GRAVITY_NORTH_EAST",
8085 "GDK_GRAVITY_CENTER",
8087 "GDK_GRAVITY_SOUTH_WEST",
8088 "GDK_GRAVITY_SOUTH",
8089 "GDK_GRAVITY_SOUTH_EAST",
8090 "GDK_GRAVITY_STATIC",
8094 g_assert (names[i]);
8095 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (om), names[i]);
8100 g_signal_connect (om,
8102 G_CALLBACK (gravity_selected),
8105 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8108 om = gtk_combo_box_text_new ();
8112 static gchar *names[] = {
8114 "GTK_WIN_POS_CENTER",
8115 "GTK_WIN_POS_MOUSE",
8116 "GTK_WIN_POS_CENTER_ALWAYS",
8117 "GTK_WIN_POS_CENTER_ON_PARENT",
8121 g_assert (names[i]);
8122 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (om), names[i]);
8127 g_signal_connect (om,
8129 G_CALLBACK (pos_selected),
8132 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8134 gtk_widget_show_all (vbox);
8136 return control_window;
8140 create_window_sizing (GtkWidget *widget)
8142 static GtkWidget *window = NULL;
8143 static GtkWidget *target_window = NULL;
8149 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8150 gtk_window_set_screen (GTK_WINDOW (target_window),
8151 gtk_widget_get_screen (widget));
8152 label = gtk_label_new (NULL);
8153 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");
8154 gtk_container_add (GTK_CONTAINER (target_window), label);
8155 gtk_widget_show (label);
8157 g_signal_connect (target_window, "destroy",
8158 G_CALLBACK (gtk_widget_destroyed),
8161 window = window_controls (target_window);
8163 g_signal_connect (window, "destroy",
8164 G_CALLBACK (gtk_widget_destroyed),
8167 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
8170 /* don't show target window by default, we want to allow testing
8171 * of behavior on first show.
8174 if (!gtk_widget_get_visible (window))
8175 gtk_widget_show (window);
8177 gtk_widget_destroy (window);
8184 typedef struct _ProgressData {
8187 GtkWidget *block_spin;
8188 GtkWidget *x_align_spin;
8189 GtkWidget *y_align_spin;
8190 GtkWidget *step_spin;
8191 GtkWidget *act_blocks_spin;
8202 progress_timeout (gpointer data)
8204 ProgressData *pdata = data;
8208 if (pdata->activity)
8210 gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar));
8212 text = g_strdup_printf ("%s", "???");
8216 new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;
8219 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);
8221 text = g_strdup_printf ("%.0f%%", 100 * new_val);
8224 gtk_label_set_text (GTK_LABEL (pdata->label), text);
8231 destroy_progress (GtkWidget *widget,
8232 ProgressData **pdata)
8234 g_source_remove ((*pdata)->timer);
8235 (*pdata)->timer = 0;
8236 (*pdata)->window = NULL;
8242 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
8244 ProgressData *pdata;
8247 pdata = (ProgressData *) data;
8249 if (!gtk_widget_get_mapped (widget))
8252 i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8254 if (i == 0 || i == 1)
8255 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_HORIZONTAL);
8257 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_VERTICAL);
8259 if (i == 1 || i == 2)
8260 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), TRUE);
8262 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), FALSE);
8266 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
8270 active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8271 gtk_progress_bar_set_show_text (GTK_PROGRESS_BAR (pdata->pbar), active);
8275 progressbar_toggle_ellipsize (GtkWidget *widget,
8278 ProgressData *pdata = data;
8279 if (gtk_widget_is_drawable (widget))
8281 gint i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8282 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar), i);
8287 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
8289 pdata->activity = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8293 entry_changed (GtkWidget *widget, ProgressData *pdata)
8295 gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar),
8296 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
8300 create_progress_bar (GtkWidget *widget)
8302 GtkWidget *action_area, *content_area;
8312 static ProgressData *pdata = NULL;
8314 static gchar *items1[] =
8322 static char *ellipsize_items[] = {
8323 "None", // PANGO_ELLIPSIZE_NONE,
8324 "Start", // PANGO_ELLIPSIZE_START,
8325 "Middle", // PANGO_ELLIPSIZE_MIDDLE,
8326 "End", // PANGO_ELLIPSIZE_END
8330 pdata = g_new0 (ProgressData, 1);
8334 pdata->window = gtk_dialog_new ();
8336 gtk_window_set_screen (GTK_WINDOW (pdata->window),
8337 gtk_widget_get_screen (widget));
8339 gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);
8341 g_signal_connect (pdata->window, "destroy",
8342 G_CALLBACK (destroy_progress),
8346 content_area = gtk_dialog_get_content_area (GTK_DIALOG (pdata->window));
8347 action_area = gtk_dialog_get_action_area (GTK_DIALOG (pdata->window));
8349 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
8350 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
8352 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8353 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
8354 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, TRUE, 0);
8356 frame = gtk_frame_new ("Progress");
8357 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8359 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8360 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8362 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8363 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8365 pdata->pbar = gtk_progress_bar_new ();
8366 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar),
8367 PANGO_ELLIPSIZE_MIDDLE);
8369 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
8370 pdata->timer = g_timeout_add (100, (GSourceFunc)progress_timeout, pdata);
8372 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8373 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8375 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
8376 gtk_container_add (GTK_CONTAINER (align), hbox);
8377 label = gtk_label_new ("Label updated by user :");
8378 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8379 pdata->label = gtk_label_new ("");
8380 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
8382 frame = gtk_frame_new ("Options");
8383 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8385 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8386 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8388 tab = gtk_table_new (7, 2, FALSE);
8389 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
8391 label = gtk_label_new ("Orientation :");
8392 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
8393 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8395 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
8397 pdata->omenu1 = build_option_menu (items1, 4, 0,
8398 progressbar_toggle_orientation,
8400 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8401 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
8402 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8404 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
8406 check = gtk_check_button_new_with_label ("Show text");
8407 g_signal_connect (check, "clicked",
8408 G_CALLBACK (toggle_show_text),
8410 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 1, 2,
8411 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8414 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8415 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 1, 2,
8416 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8419 label = gtk_label_new ("Text: ");
8420 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8422 pdata->entry = gtk_entry_new ();
8423 g_signal_connect (pdata->entry, "changed",
8424 G_CALLBACK (entry_changed),
8426 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
8427 gtk_widget_set_size_request (pdata->entry, 100, -1);
8429 label = gtk_label_new ("Ellipsize text :");
8430 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 10, 11,
8431 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8433 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
8434 pdata->elmenu = build_option_menu (ellipsize_items,
8435 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
8436 2, // PANGO_ELLIPSIZE_MIDDLE
8437 progressbar_toggle_ellipsize,
8439 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8440 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 10, 11,
8441 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8443 gtk_box_pack_start (GTK_BOX (hbox), pdata->elmenu, TRUE, TRUE, 0);
8445 check = gtk_check_button_new_with_label ("Activity mode");
8446 g_signal_connect (check, "clicked",
8447 G_CALLBACK (toggle_activity_mode), pdata);
8448 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 15, 16,
8449 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8452 button = gtk_button_new_with_label ("close");
8453 g_signal_connect_swapped (button, "clicked",
8454 G_CALLBACK (gtk_widget_destroy),
8456 gtk_widget_set_can_default (button, TRUE);
8457 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
8458 gtk_widget_grab_default (button);
8461 if (!gtk_widget_get_visible (pdata->window))
8462 gtk_widget_show_all (pdata->window);
8464 gtk_widget_destroy (pdata->window);
8476 GtkWidget *res_widget;
8480 find_widget (GtkWidget *widget, FindWidgetData *data)
8482 GtkAllocation new_allocation;
8486 gtk_widget_get_allocation (widget, &new_allocation);
8488 if (data->found || !gtk_widget_get_mapped (widget))
8491 /* Note that in the following code, we only count the
8492 * position as being inside a WINDOW widget if it is inside
8493 * widget->window; points that are outside of widget->window
8494 * but within the allocation are not counted. This is consistent
8495 * with the way we highlight drag targets.
8497 if (gtk_widget_get_has_window (widget))
8499 new_allocation.x = 0;
8500 new_allocation.y = 0;
8503 if (gtk_widget_get_parent (widget) && !data->first)
8505 GdkWindow *window = gtk_widget_get_window (widget);
8506 while (window != gtk_widget_get_window (gtk_widget_get_parent (widget)))
8508 gint tx, ty, twidth, theight;
8510 twidth = gdk_window_get_width (window);
8511 theight = gdk_window_get_height (window);
8513 if (new_allocation.x < 0)
8515 new_allocation.width += new_allocation.x;
8516 new_allocation.x = 0;
8518 if (new_allocation.y < 0)
8520 new_allocation.height += new_allocation.y;
8521 new_allocation.y = 0;
8523 if (new_allocation.x + new_allocation.width > twidth)
8524 new_allocation.width = twidth - new_allocation.x;
8525 if (new_allocation.y + new_allocation.height > theight)
8526 new_allocation.height = theight - new_allocation.y;
8528 gdk_window_get_position (window, &tx, &ty);
8529 new_allocation.x += tx;
8531 new_allocation.y += ty;
8534 window = gdk_window_get_parent (window);
8538 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
8539 (data->x < new_allocation.x + new_allocation.width) &&
8540 (data->y < new_allocation.y + new_allocation.height))
8542 /* First, check if the drag is in a valid drop site in
8543 * one of our children
8545 if (GTK_IS_CONTAINER (widget))
8547 FindWidgetData new_data = *data;
8549 new_data.x -= x_offset;
8550 new_data.y -= y_offset;
8551 new_data.found = FALSE;
8552 new_data.first = FALSE;
8554 gtk_container_forall (GTK_CONTAINER (widget),
8555 (GtkCallback)find_widget,
8558 data->found = new_data.found;
8560 data->res_widget = new_data.res_widget;
8563 /* If not, and this widget is registered as a drop site, check to
8564 * emit "drag_motion" to check if we are actually in
8570 data->res_widget = widget;
8576 find_widget_at_pointer (GdkDevice *device)
8578 GtkWidget *widget = NULL;
8579 GdkWindow *pointer_window;
8581 FindWidgetData data;
8583 pointer_window = gdk_device_get_window_at_position (device, NULL, NULL);
8587 gpointer widget_ptr;
8589 gdk_window_get_user_data (pointer_window, &widget_ptr);
8590 widget = widget_ptr;
8595 gdk_window_get_pointer (gtk_widget_get_window (widget),
8603 find_widget (widget, &data);
8605 return data.res_widget;
8611 struct PropertiesData {
8619 destroy_properties (GtkWidget *widget,
8620 struct PropertiesData *data)
8624 *data->window = NULL;
8625 data->window = NULL;
8630 g_object_unref (data->cursor);
8631 data->cursor = NULL;
8636 g_signal_handler_disconnect (widget, data->handler);
8644 property_query_event (GtkWidget *widget,
8646 struct PropertiesData *data)
8648 GtkWidget *res_widget = NULL;
8650 if (!data->in_query)
8653 if (event->type == GDK_BUTTON_RELEASE)
8655 gtk_grab_remove (widget);
8656 gdk_device_ungrab (gdk_event_get_device (event), GDK_CURRENT_TIME);
8658 res_widget = find_widget_at_pointer (gdk_event_get_device (event));
8661 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
8662 gtk_widget_get_screen (widget));
8663 create_prop_editor (G_OBJECT (res_widget), 0);
8666 data->in_query = FALSE;
8673 query_properties (GtkButton *button,
8674 struct PropertiesData *data)
8676 GtkWidget *widget = GTK_WIDGET (button);
8677 GdkDisplay *display;
8678 GdkDeviceManager *device_manager;
8681 g_signal_connect (button, "event",
8682 G_CALLBACK (property_query_event), data);
8684 display = gtk_widget_get_display (widget);
8687 data->cursor = gdk_cursor_new_for_display (display, GDK_TARGET);
8689 device_manager = gdk_display_get_device_manager (display);
8690 device = gdk_device_manager_get_client_pointer (device_manager);
8691 gdk_device_grab (device,
8692 gtk_widget_get_window (widget),
8695 GDK_BUTTON_RELEASE_MASK,
8698 gtk_grab_add (widget);
8700 data->in_query = TRUE;
8704 create_properties (GtkWidget *widget)
8706 static GtkWidget *window = NULL;
8710 struct PropertiesData *data;
8712 data = g_new (struct PropertiesData, 1);
8713 data->window = &window;
8714 data->in_query = FALSE;
8715 data->cursor = NULL;
8720 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8722 gtk_window_set_screen (GTK_WINDOW (window),
8723 gtk_widget_get_screen (widget));
8725 data->handler = g_signal_connect (window, "destroy",
8726 G_CALLBACK (destroy_properties),
8729 gtk_window_set_title (GTK_WINDOW (window), "test properties");
8730 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
8732 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1);
8733 gtk_container_add (GTK_CONTAINER (window), vbox);
8735 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
8736 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
8738 button = gtk_button_new_with_label ("Query properties");
8739 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8740 g_signal_connect (button, "clicked",
8741 G_CALLBACK (query_properties),
8745 if (!gtk_widget_get_visible (window))
8746 gtk_widget_show_all (window);
8748 gtk_widget_destroy (window);
8752 struct SnapshotData {
8753 GtkWidget *toplevel_button;
8757 gboolean is_toplevel;
8762 destroy_snapshot_data (GtkWidget *widget,
8763 struct SnapshotData *data)
8766 *data->window = NULL;
8770 g_object_unref (data->cursor);
8771 data->cursor = NULL;
8776 g_signal_handler_disconnect (widget, data->handler);
8784 snapshot_widget_event (GtkWidget *widget,
8786 struct SnapshotData *data)
8788 GtkWidget *res_widget = NULL;
8790 if (!data->in_query)
8793 if (event->type == GDK_BUTTON_RELEASE)
8795 gtk_grab_remove (widget);
8796 gdk_device_ungrab (gdk_event_get_device (event),
8799 res_widget = find_widget_at_pointer (gdk_event_get_device (event));
8800 if (data->is_toplevel && res_widget)
8801 res_widget = gtk_widget_get_toplevel (res_widget);
8804 cairo_surface_t *surface;
8805 GtkWidget *window, *image;
8810 width = gtk_widget_get_allocated_width (res_widget);
8811 height = gtk_widget_get_allocated_height (res_widget);
8813 surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
8815 cr = cairo_create (surface);
8816 gtk_widget_draw (res_widget, cr);
8819 pixbuf = gdk_pixbuf_get_from_surface (surface,
8822 cairo_surface_destroy (surface);
8824 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8825 image = gtk_image_new_from_pixbuf (pixbuf);
8826 g_object_unref (pixbuf);
8828 gtk_container_add (GTK_CONTAINER (window), image);
8829 gtk_widget_show_all (window);
8832 data->in_query = FALSE;
8839 snapshot_widget (GtkButton *button,
8840 struct SnapshotData *data)
8842 GtkWidget *widget = GTK_WIDGET (button);
8846 device = gtk_get_current_event_device ();
8850 if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
8851 device = gdk_device_get_associated_device (device);
8853 data->is_toplevel = widget == data->toplevel_button;
8856 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget),
8859 failure = gdk_device_grab (device,
8860 gtk_widget_get_window (widget),
8861 GDK_OWNERSHIP_APPLICATION,
8863 GDK_BUTTON_RELEASE_MASK,
8867 g_signal_connect (button, "event",
8868 G_CALLBACK (snapshot_widget_event), data);
8870 gtk_grab_add (widget);
8872 data->in_query = TRUE;
8876 create_snapshot (GtkWidget *widget)
8878 static GtkWidget *window = NULL;
8881 struct SnapshotData *data;
8883 data = g_new (struct SnapshotData, 1);
8884 data->window = &window;
8885 data->in_query = FALSE;
8886 data->cursor = NULL;
8891 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8893 gtk_window_set_screen (GTK_WINDOW (window),
8894 gtk_widget_get_screen (widget));
8896 data->handler = g_signal_connect (window, "destroy",
8897 G_CALLBACK (destroy_snapshot_data),
8900 gtk_window_set_title (GTK_WINDOW (window), "test snapshot");
8901 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
8903 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1);
8904 gtk_container_add (GTK_CONTAINER (window), vbox);
8906 button = gtk_button_new_with_label ("Snapshot widget");
8907 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8908 g_signal_connect (button, "clicked",
8909 G_CALLBACK (snapshot_widget),
8912 button = gtk_button_new_with_label ("Snapshot toplevel");
8913 data->toplevel_button = button;
8914 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8915 g_signal_connect (button, "clicked",
8916 G_CALLBACK (snapshot_widget),
8920 if (!gtk_widget_get_visible (window))
8921 gtk_widget_show_all (window);
8923 gtk_widget_destroy (window);
8932 selection_test_received (GtkWidget *tree_view,
8933 GtkSelectionData *selection_data)
8935 GtkTreeModel *model;
8936 GtkListStore *store;
8940 if (gtk_selection_data_get_length (selection_data) < 0)
8942 g_print ("Selection retrieval failed\n");
8945 if (gtk_selection_data_get_data_type (selection_data) != GDK_SELECTION_TYPE_ATOM)
8947 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
8951 /* Clear out any current list items */
8953 model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
8954 store = GTK_LIST_STORE (model);
8955 gtk_list_store_clear (store);
8957 /* Add new items to list */
8959 gtk_selection_data_get_targets (selection_data,
8962 for (i = 0; i < l; i++)
8967 name = gdk_atom_name (atoms[i]);
8970 gtk_list_store_insert_with_values (store, &iter, i, 0, name, -1);
8974 gtk_list_store_insert_with_values (store, &iter, i, 0, "(bad atom)", -1);
8981 selection_test_get_targets (GtkWidget *widget, GtkWidget *tree_view)
8983 static GdkAtom targets_atom = GDK_NONE;
8985 if (targets_atom == GDK_NONE)
8986 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
8988 gtk_selection_convert (tree_view, GDK_SELECTION_PRIMARY, targets_atom,
8993 create_selection_test (GtkWidget *widget)
8995 static GtkWidget *window = NULL;
8996 GtkWidget *action_area, *content_area;
8999 GtkWidget *scrolled_win;
9000 GtkListStore* store;
9001 GtkWidget *tree_view;
9002 GtkTreeViewColumn *column;
9003 GtkCellRenderer *renderer;
9008 window = gtk_dialog_new ();
9010 gtk_window_set_screen (GTK_WINDOW (window),
9011 gtk_widget_get_screen (widget));
9013 g_signal_connect (window, "destroy",
9014 G_CALLBACK (gtk_widget_destroyed),
9017 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9018 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9020 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
9021 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9023 /* Create the list */
9025 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
9026 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9027 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
9029 label = gtk_label_new ("Gets available targets for current selection");
9030 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9032 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
9033 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
9034 GTK_POLICY_AUTOMATIC,
9035 GTK_POLICY_AUTOMATIC);
9036 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
9037 gtk_widget_set_size_request (scrolled_win, 100, 200);
9039 store = gtk_list_store_new (1, G_TYPE_STRING);
9040 tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
9041 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), tree_view);
9043 renderer = gtk_cell_renderer_text_new ();
9044 column = gtk_tree_view_column_new_with_attributes ("Target", renderer,
9046 gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
9048 g_signal_connect (tree_view, "selection_received",
9049 G_CALLBACK (selection_test_received), NULL);
9051 /* .. And create some buttons */
9052 button = gtk_button_new_with_label ("Get Targets");
9053 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9055 g_signal_connect (button, "clicked",
9056 G_CALLBACK (selection_test_get_targets), tree_view);
9058 button = gtk_button_new_with_label ("Quit");
9059 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9061 g_signal_connect_swapped (button, "clicked",
9062 G_CALLBACK (gtk_widget_destroy),
9066 if (!gtk_widget_get_visible (window))
9067 gtk_widget_show_all (window);
9069 gtk_widget_destroy (window);
9076 static int scroll_test_pos = 0.0;
9079 scroll_test_draw (GtkWidget *widget,
9081 GtkAdjustment *adjustment)
9084 gint imin, imax, jmin, jmax;
9087 gdk_cairo_get_clip_rectangle (cr, &clip);
9089 imin = (clip.x) / 10;
9090 imax = (clip.x + clip.width + 9) / 10;
9092 jmin = ((int)gtk_adjustment_get_value (adjustment) + clip.y) / 10;
9093 jmax = ((int)gtk_adjustment_get_value (adjustment) + clip.y + clip.height + 9) / 10;
9095 for (i=imin; i<imax; i++)
9096 for (j=jmin; j<jmax; j++)
9098 cairo_rectangle (cr, 10*i, 10*j - (int)gtk_adjustment_get_value (adjustment), 1+i%10, 1+j%10);
9106 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
9107 GtkAdjustment *adjustment)
9109 gdouble new_value = gtk_adjustment_get_value (adjustment) + ((event->direction == GDK_SCROLL_UP) ?
9110 -gtk_adjustment_get_page_increment (adjustment) / 2:
9111 gtk_adjustment_get_page_increment (adjustment) / 2);
9112 new_value = CLAMP (new_value, gtk_adjustment_get_lower (adjustment), gtk_adjustment_get_upper (adjustment) - gtk_adjustment_get_page_size (adjustment));
9113 gtk_adjustment_set_value (adjustment, new_value);
9119 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
9120 GtkAdjustment *adjustment)
9122 GtkAllocation allocation;
9124 gtk_widget_get_allocation (widget, &allocation);
9125 gtk_adjustment_configure (adjustment,
9126 gtk_adjustment_get_value (adjustment),
9127 gtk_adjustment_get_lower (adjustment),
9128 gtk_adjustment_get_upper (adjustment),
9129 0.1 * allocation.height,
9130 0.9 * allocation.height,
9135 scroll_test_adjustment_changed (GtkAdjustment *adjustment, GtkWidget *widget)
9140 dy = scroll_test_pos - (int)gtk_adjustment_get_value (adjustment);
9141 scroll_test_pos = gtk_adjustment_get_value (adjustment);
9143 if (!gtk_widget_is_drawable (widget))
9146 window = gtk_widget_get_window (widget);
9147 gdk_window_scroll (window, 0, dy);
9148 gdk_window_process_updates (window, FALSE);
9153 create_scroll_test (GtkWidget *widget)
9155 static GtkWidget *window = NULL;
9156 GtkWidget *action_area, *content_area;
9158 GtkWidget *drawing_area;
9159 GtkWidget *scrollbar;
9161 GtkAdjustment *adjustment;
9162 GdkGeometry geometry;
9163 GdkWindowHints geometry_mask;
9167 window = gtk_dialog_new ();
9169 gtk_window_set_screen (GTK_WINDOW (window),
9170 gtk_widget_get_screen (widget));
9172 g_signal_connect (window, "destroy",
9173 G_CALLBACK (gtk_widget_destroyed),
9176 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9177 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9179 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
9180 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9182 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
9183 gtk_box_pack_start (GTK_BOX (content_area), hbox, TRUE, TRUE, 0);
9184 gtk_widget_show (hbox);
9186 drawing_area = gtk_drawing_area_new ();
9187 gtk_widget_set_size_request (drawing_area, 200, 200);
9188 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
9189 gtk_widget_show (drawing_area);
9191 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
9193 adjustment = gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0);
9194 scroll_test_pos = 0.0;
9196 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, adjustment);
9197 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
9198 gtk_widget_show (scrollbar);
9200 g_signal_connect (drawing_area, "draw",
9201 G_CALLBACK (scroll_test_draw), adjustment);
9202 g_signal_connect (drawing_area, "configure_event",
9203 G_CALLBACK (scroll_test_configure), adjustment);
9204 g_signal_connect (drawing_area, "scroll_event",
9205 G_CALLBACK (scroll_test_scroll), adjustment);
9207 g_signal_connect (adjustment, "value_changed",
9208 G_CALLBACK (scroll_test_adjustment_changed),
9211 /* .. And create some buttons */
9213 button = gtk_button_new_with_label ("Quit");
9214 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9216 g_signal_connect_swapped (button, "clicked",
9217 G_CALLBACK (gtk_widget_destroy),
9219 gtk_widget_show (button);
9221 /* Set up gridded geometry */
9223 geometry_mask = GDK_HINT_MIN_SIZE |
9224 GDK_HINT_BASE_SIZE |
9225 GDK_HINT_RESIZE_INC;
9227 geometry.min_width = 20;
9228 geometry.min_height = 20;
9229 geometry.base_width = 0;
9230 geometry.base_height = 0;
9231 geometry.width_inc = 10;
9232 geometry.height_inc = 10;
9234 gtk_window_set_geometry_hints (GTK_WINDOW (window),
9235 drawing_area, &geometry, geometry_mask);
9238 if (!gtk_widget_get_visible (window))
9239 gtk_widget_show (window);
9241 gtk_widget_destroy (window);
9248 static int timer = 0;
9251 timeout_test (GtkWidget *label)
9253 static int count = 0;
9254 static char buffer[32];
9256 sprintf (buffer, "count: %d", ++count);
9257 gtk_label_set_text (GTK_LABEL (label), buffer);
9263 start_timeout_test (GtkWidget *widget,
9268 timer = g_timeout_add (100, (GSourceFunc)timeout_test, label);
9273 stop_timeout_test (GtkWidget *widget,
9278 g_source_remove (timer);
9284 destroy_timeout_test (GtkWidget *widget,
9287 stop_timeout_test (NULL, NULL);
9293 create_timeout_test (GtkWidget *widget)
9295 static GtkWidget *window = NULL;
9296 GtkWidget *action_area, *content_area;
9302 window = gtk_dialog_new ();
9304 gtk_window_set_screen (GTK_WINDOW (window),
9305 gtk_widget_get_screen (widget));
9307 g_signal_connect (window, "destroy",
9308 G_CALLBACK (destroy_timeout_test),
9311 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9312 action_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9314 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
9315 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9317 label = gtk_label_new ("count: 0");
9318 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
9319 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9320 gtk_widget_show (label);
9322 button = gtk_button_new_with_label ("close");
9323 g_signal_connect_swapped (button, "clicked",
9324 G_CALLBACK (gtk_widget_destroy),
9326 gtk_widget_set_can_default (button, TRUE);
9327 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9328 gtk_widget_grab_default (button);
9329 gtk_widget_show (button);
9331 button = gtk_button_new_with_label ("start");
9332 g_signal_connect (button, "clicked",
9333 G_CALLBACK(start_timeout_test),
9335 gtk_widget_set_can_default (button, TRUE);
9336 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9337 gtk_widget_show (button);
9339 button = gtk_button_new_with_label ("stop");
9340 g_signal_connect (button, "clicked",
9341 G_CALLBACK (stop_timeout_test),
9343 gtk_widget_set_can_default (button, TRUE);
9344 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9345 gtk_widget_show (button);
9348 if (!gtk_widget_get_visible (window))
9349 gtk_widget_show (window);
9351 gtk_widget_destroy (window);
9358 static int idle_id = 0;
9361 idle_test (GtkWidget *label)
9363 static int count = 0;
9364 static char buffer[32];
9366 sprintf (buffer, "count: %d", ++count);
9367 gtk_label_set_text (GTK_LABEL (label), buffer);
9373 start_idle_test (GtkWidget *widget,
9378 idle_id = g_idle_add ((GSourceFunc) idle_test, label);
9383 stop_idle_test (GtkWidget *widget,
9388 g_source_remove (idle_id);
9394 destroy_idle_test (GtkWidget *widget,
9397 stop_idle_test (NULL, NULL);
9403 toggle_idle_container (GObject *button,
9404 GtkContainer *container)
9406 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
9410 create_idle_test (GtkWidget *widget)
9412 static GtkWidget *window = NULL;
9415 GtkWidget *container;
9419 GtkWidget *action_area, *content_area;
9424 window = gtk_dialog_new ();
9426 gtk_window_set_screen (GTK_WINDOW (window),
9427 gtk_widget_get_screen (widget));
9429 g_signal_connect (window, "destroy",
9430 G_CALLBACK (destroy_idle_test),
9433 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9434 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9436 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
9437 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9439 label = gtk_label_new ("count: 0");
9440 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
9441 gtk_widget_show (label);
9444 g_object_new (GTK_TYPE_HBOX,
9446 /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
9447 * "GtkWidget::visible", TRUE,
9452 gtk_box_pack_start (GTK_BOX (content_area), container, TRUE, TRUE, 0);
9455 g_object_new (GTK_TYPE_FRAME,
9457 "label", "Label Container",
9459 "parent", content_area,
9462 g_object_new (GTK_TYPE_VBOX,
9467 g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
9468 "label", "Resize-Parent",
9469 "user_data", (void*)GTK_RESIZE_PARENT,
9473 "signal::clicked", toggle_idle_container, container,
9475 button = g_object_new (GTK_TYPE_RADIO_BUTTON,
9476 "label", "Resize-Queue",
9477 "user_data", (void*)GTK_RESIZE_QUEUE,
9482 g_object_connect (button,
9483 "signal::clicked", toggle_idle_container, container,
9485 button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
9486 "label", "Resize-Immediate",
9487 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
9489 g_object_connect (button2,
9490 "signal::clicked", toggle_idle_container, container,
9492 g_object_set (button2,
9498 button = gtk_button_new_with_label ("close");
9499 g_signal_connect_swapped (button, "clicked",
9500 G_CALLBACK (gtk_widget_destroy),
9502 gtk_widget_set_can_default (button, TRUE);
9503 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9504 gtk_widget_grab_default (button);
9505 gtk_widget_show (button);
9507 button = gtk_button_new_with_label ("start");
9508 g_signal_connect (button, "clicked",
9509 G_CALLBACK (start_idle_test),
9511 gtk_widget_set_can_default (button, TRUE);
9512 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9513 gtk_widget_show (button);
9515 button = gtk_button_new_with_label ("stop");
9516 g_signal_connect (button, "clicked",
9517 G_CALLBACK (stop_idle_test),
9519 gtk_widget_set_can_default (button, TRUE);
9520 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9521 gtk_widget_show (button);
9524 if (!gtk_widget_get_visible (window))
9525 gtk_widget_show (window);
9527 gtk_widget_destroy (window);
9535 reload_all_rc_files (void)
9537 static GdkAtom atom_rcfiles = GDK_NONE;
9539 GdkEvent *send_event = gdk_event_new (GDK_CLIENT_EVENT);
9543 atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
9545 for(i = 0; i < 5; i++)
9546 send_event->client.data.l[i] = 0;
9547 send_event->client.data_format = 32;
9548 send_event->client.message_type = atom_rcfiles;
9549 gdk_event_send_clientmessage_toall (send_event);
9551 gdk_event_free (send_event);
9555 create_rc_file (GtkWidget *widget)
9557 static GtkWidget *window = NULL;
9558 GtkWidget *action_area, *content_area;
9566 window = gtk_dialog_new ();
9568 gtk_window_set_screen (GTK_WINDOW (window),
9569 gtk_widget_get_screen (widget));
9571 g_signal_connect (window, "destroy",
9572 G_CALLBACK (gtk_widget_destroyed),
9575 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9576 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9578 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
9579 gtk_box_pack_start (GTK_BOX (content_area), frame, FALSE, FALSE, 0);
9581 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
9582 gtk_container_add (GTK_CONTAINER (frame), vbox);
9584 label = gtk_label_new ("This label should be red");
9585 gtk_widget_set_name (label, "testgtk-red-label");
9586 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9588 label = gtk_label_new ("This label should be green");
9589 gtk_widget_set_name (label, "testgtk-green-label");
9590 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9592 label = gtk_label_new ("This label should be blue");
9593 gtk_widget_set_name (label, "testgtk-blue-label");
9594 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9596 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
9597 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9599 button = gtk_button_new_with_label ("Reload");
9600 g_signal_connect_swapped (button, "clicked",
9601 G_CALLBACK (gtk_style_context_reset_widgets),
9602 gtk_widget_get_screen (button));
9603 gtk_widget_set_can_default (button, TRUE);
9604 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9605 gtk_widget_grab_default (button);
9607 button = gtk_button_new_with_label ("Reload All");
9608 g_signal_connect (button, "clicked",
9609 G_CALLBACK (reload_all_rc_files), NULL);
9610 gtk_widget_set_can_default (button, TRUE);
9611 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9613 button = gtk_button_new_with_label ("Close");
9614 g_signal_connect_swapped (button, "clicked",
9615 G_CALLBACK (gtk_widget_destroy),
9617 gtk_widget_set_can_default (button, TRUE);
9618 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9621 if (!gtk_widget_get_visible (window))
9622 gtk_widget_show_all (window);
9624 gtk_widget_destroy (window);
9628 * Test of recursive mainloop
9632 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
9639 create_mainloop (GtkWidget *widget)
9641 static GtkWidget *window = NULL;
9642 GtkWidget *action_area, *content_area;
9648 window = gtk_dialog_new ();
9650 gtk_window_set_screen (GTK_WINDOW (window),
9651 gtk_widget_get_screen (widget));
9653 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
9655 g_signal_connect (window, "destroy",
9656 G_CALLBACK (mainloop_destroyed),
9659 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9660 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9662 label = gtk_label_new ("In recursive main loop...");
9663 gtk_misc_set_padding (GTK_MISC(label), 20, 20);
9665 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9666 gtk_widget_show (label);
9668 button = gtk_button_new_with_label ("Leave");
9669 gtk_box_pack_start (GTK_BOX (action_area), button, FALSE, TRUE, 0);
9671 g_signal_connect_swapped (button, "clicked",
9672 G_CALLBACK (gtk_widget_destroy),
9675 gtk_widget_set_can_default (button, TRUE);
9676 gtk_widget_grab_default (button);
9678 gtk_widget_show (button);
9681 if (!gtk_widget_get_visible (window))
9683 gtk_widget_show (window);
9685 g_print ("create_mainloop: start\n");
9687 g_print ("create_mainloop: done\n");
9690 gtk_widget_destroy (window);
9694 layout_draw_handler (GtkWidget *widget, cairo_t *cr)
9697 GdkWindow *bin_window;
9700 gint imin, imax, jmin, jmax;
9702 layout = GTK_LAYOUT (widget);
9703 bin_window = gtk_layout_get_bin_window (layout);
9705 if (!gtk_cairo_should_draw_window (cr, bin_window))
9708 gdk_window_get_position (bin_window, &x, &y);
9709 cairo_translate (cr, x, y);
9711 gdk_cairo_get_clip_rectangle (cr, &clip);
9713 imin = (clip.x) / 10;
9714 imax = (clip.x + clip.width + 9) / 10;
9716 jmin = (clip.y) / 10;
9717 jmax = (clip.y + clip.height + 9) / 10;
9719 for (i=imin; i<imax; i++)
9720 for (j=jmin; j<jmax; j++)
9722 cairo_rectangle (cr,
9731 void create_layout (GtkWidget *widget)
9733 GtkAdjustment *hadjustment, *vadjustment;
9735 static GtkWidget *window = NULL;
9736 GtkWidget *layout_widget;
9737 GtkWidget *scrolledwindow;
9746 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9747 gtk_window_set_screen (GTK_WINDOW (window),
9748 gtk_widget_get_screen (widget));
9750 g_signal_connect (window, "destroy",
9751 G_CALLBACK (gtk_widget_destroyed),
9754 gtk_window_set_title (GTK_WINDOW (window), "Layout");
9755 gtk_widget_set_size_request (window, 200, 200);
9757 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
9758 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
9760 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
9761 GTK_CORNER_TOP_RIGHT);
9763 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
9765 layout_widget = gtk_layout_new (NULL, NULL);
9766 layout = GTK_LAYOUT (layout_widget);
9767 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout_widget);
9769 /* We set step sizes here since GtkLayout does not set
9772 hadjustment = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (layout));
9773 vadjustment = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (layout));
9774 gtk_adjustment_set_step_increment (hadjustment, 10.0);
9775 gtk_adjustment_set_step_increment (vadjustment, 10.0);
9776 gtk_scrollable_set_hadjustment (GTK_SCROLLABLE (layout), hadjustment);
9777 gtk_scrollable_set_vadjustment (GTK_SCROLLABLE (layout), vadjustment);
9779 gtk_widget_set_events (layout_widget, GDK_EXPOSURE_MASK);
9780 g_signal_connect (layout, "draw",
9781 G_CALLBACK (layout_draw_handler), NULL);
9783 gtk_layout_set_size (layout, 1600, 128000);
9785 for (i=0 ; i < 16 ; i++)
9786 for (j=0 ; j < 16 ; j++)
9788 sprintf(buf, "Button %d, %d", i, j);
9790 button = gtk_button_new_with_label (buf);
9792 button = gtk_label_new (buf);
9794 gtk_layout_put (layout, button, j*100, i*100);
9797 for (i=16; i < 1280; i++)
9799 sprintf(buf, "Button %d, %d", i, 0);
9801 button = gtk_button_new_with_label (buf);
9803 button = gtk_label_new (buf);
9805 gtk_layout_put (layout, button, 0, i*100);
9809 if (!gtk_widget_get_visible (window))
9810 gtk_widget_show_all (window);
9812 gtk_widget_destroy (window);
9816 /* FIXME: need to completely redo this for GtkStyleContext */
9818 create_styles (GtkWidget *widget)
9820 static GtkWidget *window = NULL;
9821 GtkWidget *content_area, *action_area;
9826 static GdkRGBA red = { 1,0,0,1 };
9827 static GdkRGBA green = { 0,1,0,1 };
9828 static GdkRGBA blue = { 0,0,1,1 };
9829 static GdkRGBA yellow = { 1,1,0,1 };
9830 static GdkRGBA cyan = { 0,1,1,1 };
9831 PangoFontDescription *font_desc;
9833 GtkRcStyle *rc_style;
9837 window = gtk_dialog_new ();
9838 gtk_window_set_screen (GTK_WINDOW (window),
9839 gtk_widget_get_screen (widget));
9841 g_signal_connect (window, "destroy",
9842 G_CALLBACK (gtk_widget_destroyed),
9845 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9846 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9848 button = gtk_button_new_with_label ("Close");
9849 g_signal_connect_swapped (button, "clicked",
9850 G_CALLBACK (gtk_widget_destroy),
9852 gtk_widget_set_can_default (button, TRUE);
9853 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9854 gtk_widget_show (button);
9856 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
9857 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9858 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, FALSE, 0);
9860 label = gtk_label_new ("Font:");
9861 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9862 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9864 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
9866 button = gtk_button_new_with_label ("Some Text");
9867 gtk_widget_override_font (gtk_bin_get_child (GTK_BIN (button)), font_desc);
9868 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9870 label = gtk_label_new ("Foreground:");
9871 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9872 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9874 button = gtk_button_new_with_label ("Some Text");
9875 gtk_widget_override_color (gtk_bin_get_child (GTK_BIN (button)), 0, &red);
9876 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9878 label = gtk_label_new ("Background:");
9879 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9880 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9882 button = gtk_button_new_with_label ("Some Text");
9883 gtk_widget_override_background_color (button, 0, &green);
9884 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9886 label = gtk_label_new ("Text:");
9887 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9888 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9890 entry = gtk_entry_new ();
9891 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9892 gtk_widget_override_color (entry, 0, &blue);
9893 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9895 label = gtk_label_new ("Base:");
9896 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9897 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9899 entry = gtk_entry_new ();
9900 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9901 gtk_widget_override_background_color (entry, 0, &yellow);
9902 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9904 label = gtk_label_new ("Cursor:");
9905 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9906 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9908 entry = gtk_entry_new ();
9909 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9910 gtk_widget_modify_cursor (entry, &red, &red);
9911 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9913 label = gtk_label_new ("Multiple:");
9914 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9915 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9917 button = gtk_button_new_with_label ("Some Text");
9919 rc_style = gtk_rc_style_new ();
9921 rc_style->font_desc = pango_font_description_copy (font_desc);
9922 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
9923 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
9924 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
9925 rc_style->fg[GTK_STATE_NORMAL] = yellow;
9926 rc_style->bg[GTK_STATE_NORMAL] = blue;
9927 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
9928 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
9929 rc_style->fg[GTK_STATE_ACTIVE] = red;
9930 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
9931 rc_style->xthickness = 5;
9932 rc_style->ythickness = 5;
9934 gtk_widget_modify_style (button, rc_style);
9935 gtk_widget_modify_style (gtk_bin_get_child (GTK_BIN (button)), rc_style);
9937 g_object_unref (rc_style);
9939 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9942 if (!gtk_widget_get_visible (window))
9943 gtk_widget_show_all (window);
9945 gtk_widget_destroy (window);
9950 * Main Window and Exit
9954 do_exit (GtkWidget *widget, GtkWidget *window)
9956 gtk_widget_destroy (window);
9962 void (*func) (GtkWidget *widget);
9963 gboolean do_not_benchmark;
9966 { "alpha window", create_alpha_window },
9967 { "big windows", create_big_windows },
9968 { "button box", create_button_box },
9969 { "buttons", create_buttons },
9970 { "check buttons", create_check_buttons },
9971 { "color selection", create_color_selection },
9972 { "composited window", create_composited_window },
9973 { "cursors", create_cursors },
9974 { "dialog", create_dialog },
9975 { "display & screen", create_display_screen, TRUE },
9976 { "entry", create_entry },
9977 { "event box", create_event_box },
9978 { "event watcher", create_event_watcher },
9979 { "expander", create_expander },
9980 { "flipping", create_flipping },
9981 { "focus", create_focus },
9982 { "font selection", create_font_selection },
9983 { "handle box", create_handle_box },
9984 { "image", create_image },
9985 { "key lookup", create_key_lookup },
9986 { "labels", create_labels },
9987 { "layout", create_layout },
9988 { "menus", create_menus },
9989 { "message dialog", create_message_dialog },
9990 { "modal window", create_modal_window, TRUE },
9991 { "notebook", create_notebook },
9992 { "panes", create_panes },
9993 { "paned keyboard", create_paned_keyboard_navigation },
9994 { "pixbuf", create_pixbuf },
9995 { "progress bar", create_progress_bar },
9996 { "properties", create_properties },
9997 { "radio buttons", create_radio_buttons },
9998 { "range controls", create_range_controls },
9999 { "rc file", create_rc_file },
10000 { "reparent", create_reparent },
10001 { "resize grips", create_resize_grips },
10002 { "rotated label", create_rotated_label },
10003 { "rotated text", create_rotated_text },
10004 { "saved position", create_saved_position },
10005 { "scrolled windows", create_scrolled_windows },
10006 { "shapes", create_shapes },
10007 { "size groups", create_size_groups },
10008 { "snapshot", create_snapshot },
10009 { "spinbutton", create_spins },
10010 { "statusbar", create_statusbar },
10012 { "styles", create_styles },
10014 { "test idle", create_idle_test },
10015 { "test mainloop", create_mainloop, TRUE },
10016 { "test scrolling", create_scroll_test },
10017 { "test selection", create_selection_test },
10018 { "test timeout", create_timeout_test },
10019 { "toggle buttons", create_toggle_buttons },
10020 { "toolbar", create_toolbar },
10021 { "tooltips", create_tooltips },
10022 { "WM hints", create_wmhints },
10023 { "window sizing", create_window_sizing },
10024 { "window states", create_window_states }
10026 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
10029 create_main_window (void)
10034 GtkWidget *scrolled_window;
10038 GtkWidget *separator;
10039 GdkGeometry geometry;
10042 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10043 gtk_widget_set_name (window, "main_window");
10044 gtk_window_move (GTK_WINDOW (window), 50, 20);
10045 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
10047 geometry.min_width = -1;
10048 geometry.min_height = -1;
10049 geometry.max_width = -1;
10050 geometry.max_height = G_MAXSHORT;
10051 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
10053 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
10055 g_signal_connect (window, "destroy",
10056 G_CALLBACK (gtk_main_quit),
10058 g_signal_connect (window, "delete-event",
10059 G_CALLBACK (gtk_false),
10062 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
10063 gtk_container_add (GTK_CONTAINER (window), box1);
10065 if (gtk_micro_version > 0)
10068 gtk_get_major_version (),
10069 gtk_get_minor_version (),
10070 gtk_get_micro_version ());
10074 gtk_get_major_version (),
10075 gtk_get_minor_version ());
10077 label = gtk_label_new (buffer);
10078 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
10079 gtk_widget_set_name (label, "testgtk-version-label");
10081 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
10082 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
10083 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
10085 GTK_POLICY_AUTOMATIC);
10086 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
10088 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
10089 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10090 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
10091 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
10092 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
10093 gtk_widget_show (box2);
10095 for (i = 0; i < nbuttons; i++)
10097 button = gtk_button_new_with_label (buttons[i].label);
10098 if (buttons[i].func)
10099 g_signal_connect (button,
10101 G_CALLBACK(buttons[i].func),
10104 gtk_widget_set_sensitive (button, FALSE);
10105 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10108 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
10109 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
10111 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
10112 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10113 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
10115 button = gtk_button_new_with_mnemonic ("_Close");
10116 g_signal_connect (button, "clicked",
10117 G_CALLBACK (do_exit),
10119 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10120 gtk_widget_set_can_default (button, TRUE);
10121 gtk_widget_grab_default (button);
10123 gtk_widget_show_all (window);
10129 if (g_file_test ("../gdk-pixbuf/libpixbufloader-pnm.la",
10130 G_FILE_TEST_EXISTS))
10132 g_setenv ("GDK_PIXBUF_MODULE_FILE", "../gdk-pixbuf/loaders.cache", TRUE);
10133 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/immodules.cache", TRUE);
10138 pad (const char *str, int to)
10140 static char buf[256];
10141 int len = strlen (str);
10144 for (i = 0; i < to; i++)
10149 memcpy (buf, str, len);
10155 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
10157 fn (widget); /* on */
10158 while (g_main_context_iteration (NULL, FALSE));
10159 fn (widget); /* off */
10160 while (g_main_context_iteration (NULL, FALSE));
10164 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
10170 static gboolean printed_headers = FALSE;
10172 if (!printed_headers) {
10173 g_print ("Test Iters First Other\n");
10174 g_print ("-------------------- ----- ---------- ----------\n");
10175 printed_headers = TRUE;
10178 g_get_current_time (&tv0);
10179 bench_iteration (widget, fn);
10180 g_get_current_time (&tv1);
10182 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10183 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10185 g_get_current_time (&tv0);
10186 for (n = 0; n < num - 1; n++)
10187 bench_iteration (widget, fn);
10188 g_get_current_time (&tv1);
10189 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10190 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10192 g_print ("%s %5d ", pad (name, 20), num);
10194 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
10196 g_print ("%10.1f\n", dt_first);
10200 do_bench (char* what, int num)
10204 void (* fn) (GtkWidget *widget);
10206 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10208 if (g_ascii_strcasecmp (what, "ALL") == 0)
10210 for (i = 0; i < nbuttons; i++)
10212 if (!buttons[i].do_not_benchmark)
10213 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
10220 for (i = 0; i < nbuttons; i++)
10222 if (strcmp (buttons[i].label, what) == 0)
10224 fn = buttons[i].func;
10230 g_print ("Can't bench: \"%s\" not found.\n", what);
10232 do_real_bench (widget, fn, buttons[i].label, num);
10239 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
10244 main (int argc, char *argv[])
10246 GtkCssProvider *provider, *memory_provider;
10247 GdkDisplay *display;
10249 GtkBindingSet *binding_set;
10251 gboolean done_benchmarks = FALSE;
10253 srand (time (NULL));
10257 g_set_application_name ("GTK+ Test Program");
10259 gtk_init (&argc, &argv);
10261 provider = gtk_css_provider_new ();
10263 /* Check to see if we are being run from the correct
10266 if (file_exists ("testgtk.css"))
10267 gtk_css_provider_load_from_path (provider, "testgtk.css", NULL);
10268 else if (file_exists ("tests/testgtk.css"))
10269 gtk_css_provider_load_from_path (provider, "tests/testgtk.css", NULL);
10271 g_warning ("Couldn't find file \"testgtk.css\".");
10273 display = gdk_display_get_default ();
10274 screen = gdk_display_get_default_screen (display);
10276 gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (provider),
10277 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
10278 g_object_unref (provider);
10280 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
10289 for (i = 1; i < argc; i++)
10291 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
10298 nextarg = strchr (argv[i], '=');
10309 count = strchr (nextarg, ':');
10312 what = g_strndup (nextarg, count - nextarg);
10314 num = atoi (count);
10319 what = g_strdup (nextarg);
10321 do_bench (what, num ? num : 1);
10322 done_benchmarks = TRUE;
10327 if (done_benchmarks)
10332 binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
10333 gtk_binding_entry_add_signal (binding_set,
10334 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
10337 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
10339 memory_provider = gtk_css_provider_new ();
10340 gtk_css_provider_load_from_data (memory_provider,
10341 "#testgtk-version-label {\n"
10343 " font: Sans 18;\n"
10346 gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (memory_provider),
10347 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION + 1);
10349 create_main_window ();
10355 while (g_main_context_pending (NULL))
10356 g_main_context_iteration (NULL, FALSE);
10359 while (g_main_context_pending (NULL))
10360 g_main_context_iteration (NULL, FALSE);