1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
21 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
22 * file for a list of people on the GTK+ Team. See the ChangeLog
23 * files for a list of changes. These files are distributed with
24 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
44 #include "gdk/gdkkeysyms.h"
47 #define sleep(n) _sleep(n)
50 #include "prop-editor.h"
55 file_exists (const char *filename)
59 return stat (filename, &statbuf) == 0;
63 shape_create_icon (GdkScreen *screen,
72 build_option_menu (gchar *items[],
75 void (*func) (GtkWidget *widget, gpointer data),
78 /* macro, structure and variables used by tree window demos */
79 #define DEFAULT_NUMBER_OF_ITEM 3
80 #define DEFAULT_RECURSION_LEVEL 3
83 GSList* selection_mode_group;
84 GtkWidget* single_button;
85 GtkWidget* browse_button;
86 GtkWidget* multiple_button;
87 GtkWidget* draw_line_button;
88 GtkWidget* view_line_button;
89 GtkWidget* no_root_item_button;
90 GtkWidget* nb_item_spinner;
91 GtkWidget* recursion_spinner;
92 } sTreeSampleSelection;
94 typedef struct sTreeButtons {
96 GtkWidget* add_button;
97 GtkWidget* remove_button;
98 GtkWidget* subtree_button;
100 /* end of tree section */
103 build_option_menu (gchar *items[],
106 void (*func)(GtkWidget *widget, gpointer data),
112 omenu = gtk_combo_box_text_new ();
113 g_signal_connect (omenu, "changed",
114 G_CALLBACK (func), data);
116 for (i = 0; i < num_items; i++)
117 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (omenu), items[i]);
119 gtk_combo_box_set_active (GTK_COMBO_BOX (omenu), history);
125 * Windows with an alpha channel
130 on_alpha_window_draw (GtkWidget *widget,
133 cairo_pattern_t *pattern;
134 int radius, width, height;
136 width = gtk_widget_get_allocated_width (widget);
137 height = gtk_widget_get_allocated_height (widget);
138 radius = MIN (width, height) / 2;
139 pattern = cairo_pattern_create_radial (width / 2,
146 if (gdk_screen_get_rgba_visual (gtk_widget_get_screen (widget)) &&
147 gtk_widget_is_composited (widget))
148 cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.0); /* transparent */
150 cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* opaque white */
152 cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
155 cairo_pattern_add_color_stop_rgba (pattern, 0.0,
156 1.0, 0.75, 0.0, 1.0); /* solid orange */
157 cairo_pattern_add_color_stop_rgba (pattern, 1.0,
158 1.0, 0.75, 0.0, 0.0); /* transparent orange */
160 cairo_set_source (cr, pattern);
161 cairo_pattern_destroy (pattern);
163 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
170 build_alpha_widgets (void)
173 GtkWidget *radio_button;
178 table = gtk_table_new (1, 1, FALSE);
180 radio_button = gtk_radio_button_new_with_label (NULL, "Red");
181 gtk_table_attach (GTK_TABLE (table),
184 GTK_EXPAND | GTK_FILL, 0,
187 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Green");
188 gtk_table_attach (GTK_TABLE (table),
191 GTK_EXPAND | GTK_FILL, 0,
194 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Blue"),
195 gtk_table_attach (GTK_TABLE (table),
198 GTK_EXPAND | GTK_FILL, 0,
201 gtk_table_attach (GTK_TABLE (table),
202 gtk_check_button_new_with_label ("Sedentary"),
204 GTK_EXPAND | GTK_FILL, 0,
206 gtk_table_attach (GTK_TABLE (table),
207 gtk_check_button_new_with_label ("Nocturnal"),
209 GTK_EXPAND | GTK_FILL, 0,
211 gtk_table_attach (GTK_TABLE (table),
212 gtk_check_button_new_with_label ("Compulsive"),
214 GTK_EXPAND | GTK_FILL, 0,
217 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Green");
218 gtk_table_attach (GTK_TABLE (table),
221 GTK_EXPAND | GTK_FILL, 0,
224 radio_button = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio_button), "Blue"),
225 gtk_table_attach (GTK_TABLE (table),
228 GTK_EXPAND | GTK_FILL, 0,
231 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
232 label = gtk_label_new (NULL);
233 gtk_label_set_markup (GTK_LABEL (label), "<i>Entry: </i>");
234 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
235 entry = gtk_entry_new ();
236 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
237 gtk_table_attach (GTK_TABLE (table),
240 GTK_EXPAND | GTK_FILL, 0,
247 on_alpha_screen_changed (GtkWindow *window,
248 GdkScreen *old_screen,
251 GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (window));
252 GdkVisual *visual = gdk_screen_get_rgba_visual (screen);
256 visual = gdk_screen_get_system_visual (screen);
257 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen doesn't support alpha</b>");
261 gtk_label_set_markup (GTK_LABEL (label), "<b>Screen supports alpha</b>");
264 gtk_widget_set_visual (GTK_WIDGET (window), visual);
268 on_composited_changed (GtkWidget *window,
271 gboolean is_composited = gtk_widget_is_composited (window);
274 gtk_label_set_text (label, "Composited");
276 gtk_label_set_text (label, "Not composited");
280 create_alpha_window (GtkWidget *widget)
282 static GtkWidget *window;
286 GtkWidget *content_area;
290 window = gtk_dialog_new_with_buttons ("Alpha Window",
291 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
295 gtk_widget_set_app_paintable (window, TRUE);
296 g_signal_connect (window, "draw",
297 G_CALLBACK (on_alpha_window_draw), NULL);
299 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
301 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
302 gtk_container_set_border_width (GTK_CONTAINER (vbox), 12);
303 gtk_box_pack_start (GTK_BOX (content_area), vbox,
306 label = gtk_label_new (NULL);
307 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
308 on_alpha_screen_changed (GTK_WINDOW (window), NULL, label);
309 g_signal_connect (window, "screen-changed",
310 G_CALLBACK (on_alpha_screen_changed), label);
312 label = gtk_label_new (NULL);
313 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
314 on_composited_changed (window, GTK_LABEL (label));
315 g_signal_connect (window, "composited_changed", G_CALLBACK (on_composited_changed), label);
317 gtk_box_pack_start (GTK_BOX (vbox), build_alpha_widgets (), TRUE, TRUE, 0);
319 g_signal_connect (window, "destroy",
320 G_CALLBACK (gtk_widget_destroyed),
323 g_signal_connect (window, "response",
324 G_CALLBACK (gtk_widget_destroy),
328 if (!gtk_widget_get_visible (window))
329 gtk_widget_show_all (window);
331 gtk_widget_destroy (window);
335 * Composited non-toplevel window
338 /* The draw event handler for the event box.
340 * This function simply draws a transparency onto a widget on the area
341 * for which it receives expose events. This is intended to give the
342 * event box a "transparent" background.
344 * In order for this to work properly, the widget must have an RGBA
345 * colourmap. The widget should also be set as app-paintable since it
346 * doesn't make sense for GTK to draw a background if we are drawing it
347 * (and because GTK might actually replace our transparency with its
348 * default background colour).
351 transparent_draw (GtkWidget *widget,
354 cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
360 /* The expose event handler for the window.
362 * This function performs the actual compositing of the event box onto
363 * the already-existing background of the window at 50% normal opacity.
365 * In this case we do not want app-paintable to be set on the widget
366 * since we want it to draw its own (red) background. Because of this,
367 * however, we must ensure that we use g_signal_register_after so that
368 * this handler is called after the red has been drawn. If it was
369 * called before then GTK would just blindly paint over our work.
372 window_draw (GtkWidget *widget,
375 GtkAllocation allocation;
378 /* get our child (in this case, the event box) */
379 child = gtk_bin_get_child (GTK_BIN (widget));
381 gtk_widget_get_allocation (child, &allocation);
383 /* the source data is the (composited) event box */
384 gdk_cairo_set_source_window (cr, gtk_widget_get_window (child),
388 /* composite, with a 50% opacity */
389 cairo_paint_with_alpha (cr, 0.5);
395 create_composited_window (GtkWidget *widget)
397 static GtkWidget *window;
401 GtkWidget *event, *button;
404 /* make the widgets */
405 button = gtk_button_new_with_label ("A Button");
406 event = gtk_event_box_new ();
407 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
409 g_signal_connect (window, "destroy",
410 G_CALLBACK (gtk_widget_destroyed),
413 /* put a red background on the window */
414 gdk_rgba_parse (&red, "red");
415 gtk_widget_override_background_color (window, 0, &red);
417 /* set our event box to have a fully-transparent background
418 * drawn on it. currently there is no way to simply tell gtk
419 * that "transparency" is the background colour for a widget.
421 gtk_widget_set_app_paintable (GTK_WIDGET (event), TRUE);
422 g_signal_connect (event, "draw",
423 G_CALLBACK (transparent_draw), NULL);
425 /* put them inside one another */
426 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
427 gtk_container_add (GTK_CONTAINER (window), event);
428 gtk_container_add (GTK_CONTAINER (event), button);
430 /* realise and show everything */
431 gtk_widget_realize (button);
433 /* set the event box GdkWindow to be composited.
434 * obviously must be performed after event box is realised.
436 gdk_window_set_composited (gtk_widget_get_window (event),
439 /* set up the compositing handler.
440 * note that we do _after so that the normal (red) background is drawn
441 * by gtk before our compositing occurs.
443 g_signal_connect_after (window, "draw",
444 G_CALLBACK (window_draw), NULL);
447 if (!gtk_widget_get_visible (window))
448 gtk_widget_show_all (window);
450 gtk_widget_destroy (window);
454 * Big windows and guffaw scrolling
458 pattern_set_bg (GtkWidget *widget,
462 static const GdkColor colors[] = {
463 { 0, 0x4444, 0x4444, 0xffff },
464 { 0, 0x8888, 0x8888, 0xffff },
465 { 0, 0xaaaa, 0xaaaa, 0xffff }
468 gdk_window_set_user_data (child, widget);
469 gdk_window_set_background (child, &colors[level]);
473 create_pattern (GtkWidget *widget,
484 while (2 * h <= height)
489 while (2 * w <= width)
491 if ((i + j) % 2 == 0)
496 GdkWindowAttr attributes;
498 attributes.window_type = GDK_WINDOW_CHILD;
501 attributes.width = w;
502 attributes.height = h;
503 attributes.wclass = GDK_INPUT_OUTPUT;
504 attributes.event_mask = GDK_EXPOSURE_MASK;
505 attributes.visual = gtk_widget_get_visual (widget);
507 child = gdk_window_new (parent, &attributes,
508 GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL);
510 pattern_set_bg (widget, child, level);
513 create_pattern (widget, child, level + 1, w, h);
515 gdk_window_show (child);
525 #define PATTERN_SIZE (1 << 18)
528 pattern_hadj_changed (GtkAdjustment *adjustment,
531 gint *old_value = g_object_get_data (G_OBJECT (adjustment), "old-value");
532 gint new_value = gtk_adjustment_get_value (adjustment);
534 if (gtk_widget_get_realized (darea))
536 gdk_window_scroll (gtk_widget_get_window (darea),
537 *old_value - new_value, 0);
538 *old_value = new_value;
543 pattern_vadj_changed (GtkAdjustment *adjustment,
546 gint *old_value = g_object_get_data (G_OBJECT (adjustment), "old-value");
547 gint new_value = gtk_adjustment_get_value (adjustment);
549 if (gtk_widget_get_realized (darea))
551 gdk_window_scroll (gtk_widget_get_window (darea),
552 0, *old_value - new_value);
553 *old_value = new_value;
558 pattern_realize (GtkWidget *widget,
563 window = gtk_widget_get_window (widget);
564 pattern_set_bg (widget, window, 0);
565 create_pattern (widget, window, 1, PATTERN_SIZE, PATTERN_SIZE);
569 create_big_windows (GtkWidget *widget)
571 static GtkWidget *window = NULL;
572 GtkWidget *content_area;
573 GtkWidget *darea, *table, *scrollbar;
575 GtkAdjustment *hadjustment;
576 GtkAdjustment *vadjustment;
577 static gint current_x;
578 static gint current_y;
585 window = gtk_dialog_new_with_buttons ("Big Windows",
591 gtk_window_set_screen (GTK_WINDOW (window),
592 gtk_widget_get_screen (widget));
594 gtk_window_set_default_size (GTK_WINDOW (window), 200, 300);
596 g_signal_connect (window, "destroy",
597 G_CALLBACK (gtk_widget_destroyed),
600 g_signal_connect (window, "response",
601 G_CALLBACK (gtk_widget_destroy),
604 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
606 table = gtk_table_new (2, 2, FALSE);
607 gtk_box_pack_start (GTK_BOX (content_area), table, TRUE, TRUE, 0);
609 darea = gtk_drawing_area_new ();
611 hadjustment = gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
612 g_signal_connect (hadjustment, "value_changed",
613 G_CALLBACK (pattern_hadj_changed), darea);
614 g_object_set_data (G_OBJECT (hadjustment), "old-value", ¤t_x);
616 vadjustment = gtk_adjustment_new (0, 0, PATTERN_SIZE, 10, 100, 100);
617 g_signal_connect (vadjustment, "value_changed",
618 G_CALLBACK (pattern_vadj_changed), darea);
619 g_object_set_data (G_OBJECT (vadjustment), "old-value", ¤t_y);
621 g_signal_connect (darea, "realize",
622 G_CALLBACK (pattern_realize),
625 eventbox = gtk_event_box_new ();
626 gtk_table_attach (GTK_TABLE (table), eventbox,
628 GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND,
631 gtk_container_add (GTK_CONTAINER (eventbox), darea);
633 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, hadjustment);
634 gtk_table_attach (GTK_TABLE (table), scrollbar,
636 GTK_FILL | GTK_EXPAND, GTK_FILL,
639 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, vadjustment);
640 gtk_table_attach (GTK_TABLE (table), scrollbar,
642 GTK_FILL, GTK_EXPAND | GTK_FILL,
647 if (!gtk_widget_get_visible (window))
648 gtk_widget_show_all (window);
650 gtk_widget_hide (window);
658 button_window (GtkWidget *widget,
661 if (!gtk_widget_get_visible (button))
662 gtk_widget_show (button);
664 gtk_widget_hide (button);
668 create_buttons (GtkWidget *widget)
670 static GtkWidget *window = NULL;
674 GtkWidget *button[10];
675 GtkWidget *separator;
679 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
680 gtk_window_set_screen (GTK_WINDOW (window),
681 gtk_widget_get_screen (widget));
683 g_signal_connect (window, "destroy",
684 G_CALLBACK (gtk_widget_destroyed),
687 gtk_window_set_title (GTK_WINDOW (window), "GtkButton");
688 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
690 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
691 gtk_container_add (GTK_CONTAINER (window), box1);
693 table = gtk_table_new (3, 3, FALSE);
694 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
695 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
696 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
697 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
699 button[0] = gtk_button_new_with_label ("button1");
700 button[1] = gtk_button_new_with_mnemonic ("_button2");
701 button[2] = gtk_button_new_with_mnemonic ("_button3");
702 button[3] = gtk_button_new_from_stock (GTK_STOCK_OK);
703 button[4] = gtk_button_new_with_label ("button5");
704 button[5] = gtk_button_new_with_label ("button6");
705 button[6] = gtk_button_new_with_label ("button7");
706 button[7] = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
707 button[8] = gtk_button_new_with_label ("button9");
709 g_signal_connect (button[0], "clicked",
710 G_CALLBACK (button_window),
713 gtk_table_attach (GTK_TABLE (table), button[0], 0, 1, 0, 1,
714 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
716 g_signal_connect (button[1], "clicked",
717 G_CALLBACK (button_window),
720 gtk_table_attach (GTK_TABLE (table), button[1], 1, 2, 1, 2,
721 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
723 g_signal_connect (button[2], "clicked",
724 G_CALLBACK (button_window),
726 gtk_table_attach (GTK_TABLE (table), button[2], 2, 3, 2, 3,
727 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
729 g_signal_connect (button[3], "clicked",
730 G_CALLBACK (button_window),
732 gtk_table_attach (GTK_TABLE (table), button[3], 0, 1, 2, 3,
733 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
735 g_signal_connect (button[4], "clicked",
736 G_CALLBACK (button_window),
738 gtk_table_attach (GTK_TABLE (table), button[4], 2, 3, 0, 1,
739 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
741 g_signal_connect (button[5], "clicked",
742 G_CALLBACK (button_window),
744 gtk_table_attach (GTK_TABLE (table), button[5], 1, 2, 2, 3,
745 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
747 g_signal_connect (button[6], "clicked",
748 G_CALLBACK (button_window),
750 gtk_table_attach (GTK_TABLE (table), button[6], 1, 2, 0, 1,
751 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
753 g_signal_connect (button[7], "clicked",
754 G_CALLBACK (button_window),
756 gtk_table_attach (GTK_TABLE (table), button[7], 2, 3, 1, 2,
757 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
759 g_signal_connect (button[8], "clicked",
760 G_CALLBACK (button_window),
762 gtk_table_attach (GTK_TABLE (table), button[8], 0, 1, 1, 2,
763 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
765 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
766 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
768 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
769 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
770 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
772 button[9] = gtk_button_new_with_label ("close");
773 g_signal_connect_swapped (button[9], "clicked",
774 G_CALLBACK (gtk_widget_destroy),
776 gtk_box_pack_start (GTK_BOX (box2), button[9], TRUE, TRUE, 0);
777 gtk_widget_set_can_default (button[9], TRUE);
778 gtk_widget_grab_default (button[9]);
781 if (!gtk_widget_get_visible (window))
782 gtk_widget_show_all (window);
784 gtk_widget_destroy (window);
792 create_toggle_buttons (GtkWidget *widget)
794 static GtkWidget *window = NULL;
798 GtkWidget *separator;
802 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
803 gtk_window_set_screen (GTK_WINDOW (window),
804 gtk_widget_get_screen (widget));
806 g_signal_connect (window, "destroy",
807 G_CALLBACK (gtk_widget_destroyed),
810 gtk_window_set_title (GTK_WINDOW (window), "GtkToggleButton");
811 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
813 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
814 gtk_container_add (GTK_CONTAINER (window), box1);
816 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
817 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
818 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
820 button = gtk_toggle_button_new_with_label ("button1");
821 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
823 button = gtk_toggle_button_new_with_label ("button2");
824 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
826 button = gtk_toggle_button_new_with_label ("button3");
827 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
829 button = gtk_toggle_button_new_with_label ("inconsistent");
830 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
831 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
833 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
834 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
836 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
837 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
838 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
840 button = gtk_button_new_with_label ("close");
841 g_signal_connect_swapped (button, "clicked",
842 G_CALLBACK (gtk_widget_destroy),
844 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
845 gtk_widget_set_can_default (button, TRUE);
846 gtk_widget_grab_default (button);
849 if (!gtk_widget_get_visible (window))
850 gtk_widget_show_all (window);
852 gtk_widget_destroy (window);
856 create_widget_grid (GType widget_type)
859 GtkWidget *group_widget = NULL;
862 table = gtk_table_new (FALSE, 3, 3);
864 for (i = 0; i < 5; i++)
866 for (j = 0; j < 5; j++)
871 if (i == 0 && j == 0)
877 tmp = g_strdup_printf ("%d", j);
878 widget = gtk_label_new (tmp);
883 tmp = g_strdup_printf ("%c", 'A' + i - 1);
884 widget = gtk_label_new (tmp);
889 widget = g_object_new (widget_type, NULL);
891 if (g_type_is_a (widget_type, GTK_TYPE_RADIO_BUTTON))
894 group_widget = widget;
896 g_object_set (widget, "group", group_widget, NULL);
901 gtk_table_attach (GTK_TABLE (table), widget,
916 create_check_buttons (GtkWidget *widget)
918 static GtkWidget *window = NULL;
922 GtkWidget *separator;
927 window = gtk_dialog_new_with_buttons ("Check Buttons",
933 gtk_window_set_screen (GTK_WINDOW (window),
934 gtk_widget_get_screen (widget));
936 g_signal_connect (window, "destroy",
937 G_CALLBACK (gtk_widget_destroyed),
939 g_signal_connect (window, "response",
940 G_CALLBACK (gtk_widget_destroy),
943 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
945 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
946 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
947 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
949 button = gtk_check_button_new_with_mnemonic ("_button1");
950 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
952 button = gtk_check_button_new_with_label ("button2");
953 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
955 button = gtk_check_button_new_with_label ("button3");
956 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
958 button = gtk_check_button_new_with_label ("inconsistent");
959 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
960 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
962 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
963 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
965 table = create_widget_grid (GTK_TYPE_CHECK_BUTTON);
966 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
967 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
970 if (!gtk_widget_get_visible (window))
971 gtk_widget_show_all (window);
973 gtk_widget_destroy (window);
981 create_radio_buttons (GtkWidget *widget)
983 static GtkWidget *window = NULL;
987 GtkWidget *separator;
992 window = gtk_dialog_new_with_buttons ("Radio Buttons",
998 gtk_window_set_screen (GTK_WINDOW (window),
999 gtk_widget_get_screen (widget));
1001 g_signal_connect (window, "destroy",
1002 G_CALLBACK (gtk_widget_destroyed),
1004 g_signal_connect (window, "response",
1005 G_CALLBACK (gtk_widget_destroy),
1008 box1 = gtk_dialog_get_content_area (GTK_DIALOG (window));
1010 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1011 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1012 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1014 button = gtk_radio_button_new_with_label (NULL, "button1");
1015 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1017 button = gtk_radio_button_new_with_label (
1018 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1020 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
1021 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1023 button = gtk_radio_button_new_with_label (
1024 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1026 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1028 button = gtk_radio_button_new_with_label (
1029 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1031 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (button), TRUE);
1032 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1034 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1035 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1037 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1038 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1039 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1041 button = gtk_radio_button_new_with_label (NULL, "button4");
1042 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1043 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1045 button = gtk_radio_button_new_with_label (
1046 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1048 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
1049 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1050 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1052 button = gtk_radio_button_new_with_label (
1053 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
1055 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
1056 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1058 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1059 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1061 table = create_widget_grid (GTK_TYPE_RADIO_BUTTON);
1062 gtk_container_set_border_width (GTK_CONTAINER (table), 10);
1063 gtk_box_pack_start (GTK_BOX (box1), table, TRUE, TRUE, 0);
1066 if (!gtk_widget_get_visible (window))
1067 gtk_widget_show_all (window);
1069 gtk_widget_destroy (window);
1077 create_bbox (gint horizontal,
1088 frame = gtk_frame_new (title);
1091 bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
1093 bbox = gtk_button_box_new (GTK_ORIENTATION_VERTICAL);
1095 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
1096 gtk_container_add (GTK_CONTAINER (frame), bbox);
1098 gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), layout);
1099 gtk_box_set_spacing (GTK_BOX (bbox), spacing);
1101 button = gtk_button_new_with_label ("OK");
1102 gtk_container_add (GTK_CONTAINER (bbox), button);
1104 button = gtk_button_new_with_label ("Cancel");
1105 gtk_container_add (GTK_CONTAINER (bbox), button);
1107 button = gtk_button_new_with_label ("Help");
1108 gtk_container_add (GTK_CONTAINER (bbox), button);
1114 create_button_box (GtkWidget *widget)
1116 static GtkWidget* window = NULL;
1117 GtkWidget *main_vbox;
1120 GtkWidget *frame_horz;
1121 GtkWidget *frame_vert;
1125 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1126 gtk_window_set_screen (GTK_WINDOW (window), gtk_widget_get_screen (widget));
1127 gtk_window_set_title (GTK_WINDOW (window), "Button Boxes");
1129 g_signal_connect (window, "destroy",
1130 G_CALLBACK (gtk_widget_destroyed),
1133 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
1135 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1136 gtk_container_add (GTK_CONTAINER (window), main_vbox);
1138 frame_horz = gtk_frame_new ("Horizontal Button Boxes");
1139 gtk_box_pack_start (GTK_BOX (main_vbox), frame_horz, TRUE, TRUE, 10);
1141 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1142 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
1143 gtk_container_add (GTK_CONTAINER (frame_horz), vbox);
1145 gtk_box_pack_start (GTK_BOX (vbox),
1146 create_bbox (TRUE, "Spread", 40, 85, 20, GTK_BUTTONBOX_SPREAD),
1149 gtk_box_pack_start (GTK_BOX (vbox),
1150 create_bbox (TRUE, "Edge", 40, 85, 20, GTK_BUTTONBOX_EDGE),
1153 gtk_box_pack_start (GTK_BOX (vbox),
1154 create_bbox (TRUE, "Start", 40, 85, 20, GTK_BUTTONBOX_START),
1157 gtk_box_pack_start (GTK_BOX (vbox),
1158 create_bbox (TRUE, "End", 40, 85, 20, GTK_BUTTONBOX_END),
1161 gtk_box_pack_start (GTK_BOX (vbox),
1162 create_bbox (TRUE, "Center", 40, 85, 20, GTK_BUTTONBOX_CENTER),
1165 frame_vert = gtk_frame_new ("Vertical Button Boxes");
1166 gtk_box_pack_start (GTK_BOX (main_vbox), frame_vert, TRUE, TRUE, 10);
1168 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
1169 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
1170 gtk_container_add (GTK_CONTAINER (frame_vert), hbox);
1172 gtk_box_pack_start (GTK_BOX (hbox),
1173 create_bbox (FALSE, "Spread", 30, 85, 20, GTK_BUTTONBOX_SPREAD),
1176 gtk_box_pack_start (GTK_BOX (hbox),
1177 create_bbox (FALSE, "Edge", 30, 85, 20, GTK_BUTTONBOX_EDGE),
1180 gtk_box_pack_start (GTK_BOX (hbox),
1181 create_bbox (FALSE, "Start", 30, 85, 20, GTK_BUTTONBOX_START),
1184 gtk_box_pack_start (GTK_BOX (hbox),
1185 create_bbox (FALSE, "End", 30, 85, 20, GTK_BUTTONBOX_END),
1188 gtk_box_pack_start (GTK_BOX (hbox),
1189 create_bbox (FALSE, "Center", 30, 85, 20, GTK_BUTTONBOX_CENTER),
1193 if (!gtk_widget_get_visible (window))
1194 gtk_widget_show_all (window);
1196 gtk_widget_destroy (window);
1204 new_pixbuf (char *filename,
1210 if (strcmp (filename, "test.xpm") == 0)
1213 pixbuf = gdk_pixbuf_new_from_file (filename, NULL);
1216 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
1218 widget = gtk_image_new_from_pixbuf (pixbuf);
1220 g_object_unref (pixbuf);
1227 set_toolbar_small_stock (GtkWidget *widget,
1230 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_SMALL_TOOLBAR);
1234 set_toolbar_large_stock (GtkWidget *widget,
1237 gtk_toolbar_set_icon_size (GTK_TOOLBAR (data), GTK_ICON_SIZE_LARGE_TOOLBAR);
1241 set_toolbar_horizontal (GtkWidget *widget,
1244 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_HORIZONTAL);
1248 set_toolbar_vertical (GtkWidget *widget,
1251 gtk_orientable_set_orientation (GTK_ORIENTABLE (data), GTK_ORIENTATION_VERTICAL);
1255 set_toolbar_icons (GtkWidget *widget,
1258 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_ICONS);
1262 set_toolbar_text (GtkWidget *widget,
1265 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_TEXT);
1269 set_toolbar_both (GtkWidget *widget,
1272 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH);
1276 set_toolbar_both_horiz (GtkWidget *widget,
1279 gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH_HORIZ);
1283 set_toolbar_enable (GtkWidget *widget,
1286 GtkSettings *settings = gtk_widget_get_settings (widget);
1287 g_object_set (settings, "gtk-enable-tooltips", TRUE, NULL);
1291 set_toolbar_disable (GtkWidget *widget,
1294 GtkSettings *settings = gtk_widget_get_settings (widget);
1295 g_object_set (settings, "gtk-enable-tooltips", FALSE, NULL);
1298 static GtkActionEntry create_toolbar_items[] = {
1299 { NULL, GTK_STOCK_NEW, NULL, NULL, "Stock icon: New",
1300 G_CALLBACK (set_toolbar_small_stock) },
1301 { NULL, GTK_STOCK_OPEN, NULL, NULL, "Stock icon: Open",
1302 G_CALLBACK (set_toolbar_large_stock) },
1303 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1304 G_CALLBACK (set_toolbar_horizontal) },
1305 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1306 G_CALLBACK (set_toolbar_vertical) },
1308 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1309 G_CALLBACK (set_toolbar_icons) },
1310 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1311 G_CALLBACK (set_toolbar_text) },
1312 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1313 G_CALLBACK (set_toolbar_both) },
1314 { NULL, NULL, "Both (horizontal)", NULL, "Show toolbar icons and text in a horizontal fashion",
1315 G_CALLBACK (set_toolbar_both_horiz) },
1317 { "entry", NULL, NULL, "This is an unusable GtkEntry ;)",
1321 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1322 G_CALLBACK (set_toolbar_enable) },
1323 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1324 G_CALLBACK (set_toolbar_disable) },
1326 { NULL, NULL, "Frobate", NULL, "Frobate tooltip",
1328 { NULL, NULL, "Baz", NULL, "Baz tooltip",
1331 { NULL, NULL, "Blah", NULL, "Blash tooltip",
1333 { NULL, NULL, "Bar", NULL, "Bar tooltip",
1338 create_toolbar (GtkWidget *widget)
1340 static GtkWidget *window = NULL;
1347 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1348 gtk_window_set_screen (GTK_WINDOW (window),
1349 gtk_widget_get_screen (widget));
1351 gtk_window_set_title (GTK_WINDOW (window), "Toolbar test");
1353 g_signal_connect (window, "destroy",
1354 G_CALLBACK (gtk_widget_destroyed),
1357 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1358 gtk_widget_realize (window);
1360 toolbar = gtk_toolbar_new ();
1361 for (i = 0; i < G_N_ELEMENTS (create_toolbar_items); i++)
1363 GtkToolItem *toolitem;
1365 if (create_toolbar_items[i].tooltip == NULL)
1366 toolitem = gtk_separator_tool_item_new ();
1367 else if (g_strcmp0 (create_toolbar_items[i].name, "entry") == 0)
1371 toolitem = gtk_tool_item_new ();
1372 entry = gtk_entry_new ();
1373 gtk_container_add (GTK_CONTAINER (toolitem), entry);
1375 else if (create_toolbar_items[i].stock_id)
1376 toolitem = gtk_tool_button_new_from_stock (create_toolbar_items[i].stock_id);
1381 icon = new_pixbuf ("test.xpm", gtk_widget_get_window (window));
1382 toolitem = gtk_tool_button_new (icon, create_toolbar_items[i].label);
1384 if (create_toolbar_items[i].callback)
1385 g_signal_connect (toolitem, "clicked",
1386 create_toolbar_items[i].callback, toolbar);
1387 gtk_tool_item_set_tooltip_text (toolitem, create_toolbar_items[i].tooltip);
1388 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1391 gtk_container_add (GTK_CONTAINER (window), toolbar);
1393 gtk_widget_set_size_request (toolbar, 200, -1);
1396 if (!gtk_widget_get_visible (window))
1397 gtk_widget_show_all (window);
1399 gtk_widget_destroy (window);
1402 static GtkActionEntry make_toolbar_items[] = {
1403 { NULL, NULL, "Horizontal", NULL, "Horizontal toolbar layout",
1404 G_CALLBACK (set_toolbar_horizontal) },
1405 { NULL, NULL, "Vertical", NULL, "Vertical toolbar layout",
1406 G_CALLBACK (set_toolbar_vertical) },
1408 { NULL, NULL, "Icons", NULL, "Only show toolbar icons",
1409 G_CALLBACK (set_toolbar_icons) },
1410 { NULL, NULL, "Text", NULL, "Only show toolbar text",
1411 G_CALLBACK (set_toolbar_text) },
1412 { NULL, NULL, "Both", NULL, "Show toolbar icons and text",
1413 G_CALLBACK (set_toolbar_both) },
1415 { NULL, NULL, "Woot", NULL, "Woot woot woot",
1417 { NULL, NULL, "Blah", NULL, "Blah blah blah",
1420 { NULL, NULL, "Enable", NULL, "Enable tooltips",
1421 G_CALLBACK (set_toolbar_enable) },
1422 { NULL, NULL, "Disable", NULL, "Disable tooltips",
1423 G_CALLBACK (set_toolbar_disable) },
1425 { NULL, NULL, "Hoo", NULL, "Hoo tooltip",
1427 { NULL, NULL, "Woo", NULL, "Woo tooltip",
1432 make_toolbar (GtkWidget *window)
1437 if (!gtk_widget_get_realized (window))
1438 gtk_widget_realize (window);
1440 toolbar = gtk_toolbar_new ();
1441 for (i = 0; i < G_N_ELEMENTS (make_toolbar_items); i++)
1444 GtkToolItem *toolitem;
1446 if (make_toolbar_items[i].label == NULL)
1448 toolitem = gtk_separator_tool_item_new ();
1451 icon = new_pixbuf ("test.xpm", gtk_widget_get_window (window));
1452 toolitem = gtk_tool_button_new (icon, make_toolbar_items[i].label);
1453 gtk_tool_item_set_tooltip_text (toolitem, make_toolbar_items[i].tooltip);
1454 if (make_toolbar_items[i].callback != NULL)
1455 g_signal_connect (toolitem, "clicked", make_toolbar_items[i].callback, toolbar);
1456 gtk_toolbar_insert (GTK_TOOLBAR (toolbar), toolitem, -1);
1466 static guint statusbar_counter = 1;
1469 statusbar_push (GtkWidget *button,
1470 GtkStatusbar *statusbar)
1474 sprintf (text, "something %d", statusbar_counter++);
1476 gtk_statusbar_push (statusbar, 1, text);
1480 statusbar_push_long (GtkWidget *button,
1481 GtkStatusbar *statusbar)
1485 sprintf (text, "Just because a system has menu choices written with English words, phrases or sentences, that is no guarantee, that it is comprehensible. Individual words may not be familiar to some users (for example, \"repaginate\"), and two menu items may appear to satisfy the users's needs, whereas only one does (for example, \"put away\" or \"eject\").");
1487 gtk_statusbar_push (statusbar, 1, text);
1491 statusbar_pop (GtkWidget *button,
1492 GtkStatusbar *statusbar)
1494 gtk_statusbar_pop (statusbar, 1);
1498 statusbar_steal (GtkWidget *button,
1499 GtkStatusbar *statusbar)
1501 gtk_statusbar_remove (statusbar, 1, 4);
1505 statusbar_popped (GtkStatusbar *statusbar,
1510 statusbar_counter = 1;
1514 statusbar_contexts (GtkStatusbar *statusbar)
1518 string = "any context";
1519 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1521 gtk_statusbar_get_context_id (statusbar, string));
1523 string = "idle messages";
1524 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1526 gtk_statusbar_get_context_id (statusbar, string));
1528 string = "some text";
1529 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1531 gtk_statusbar_get_context_id (statusbar, string));
1533 string = "hit the mouse";
1534 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1536 gtk_statusbar_get_context_id (statusbar, string));
1538 string = "hit the mouse2";
1539 g_print ("GtkStatusBar: context=\"%s\", context_id=%d\n",
1541 gtk_statusbar_get_context_id (statusbar, string));
1545 create_statusbar (GtkWidget *widget)
1547 static GtkWidget *window = NULL;
1551 GtkWidget *separator;
1552 GtkWidget *statusbar;
1556 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1557 gtk_window_set_screen (GTK_WINDOW (window),
1558 gtk_widget_get_screen (widget));
1560 g_signal_connect (window, "destroy",
1561 G_CALLBACK (gtk_widget_destroyed),
1564 gtk_window_set_title (GTK_WINDOW (window), "statusbar");
1565 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
1567 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1568 gtk_container_add (GTK_CONTAINER (window), box1);
1570 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1571 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1572 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
1574 statusbar = gtk_statusbar_new ();
1575 gtk_box_pack_end (GTK_BOX (box1), statusbar, TRUE, TRUE, 0);
1576 g_signal_connect (statusbar,
1578 G_CALLBACK (statusbar_popped),
1581 button = g_object_new (gtk_button_get_type (),
1582 "label", "push something",
1586 g_object_connect (button,
1587 "signal::clicked", statusbar_push, statusbar,
1590 button = g_object_connect (g_object_new (gtk_button_get_type (),
1595 "signal_after::clicked", statusbar_pop, statusbar,
1598 button = g_object_connect (g_object_new (gtk_button_get_type (),
1599 "label", "steal #4",
1603 "signal_after::clicked", statusbar_steal, statusbar,
1606 button = g_object_connect (g_object_new (gtk_button_get_type (),
1607 "label", "test contexts",
1611 "swapped_signal_after::clicked", statusbar_contexts, statusbar,
1614 button = g_object_connect (g_object_new (gtk_button_get_type (),
1615 "label", "push something long",
1619 "signal_after::clicked", statusbar_push_long, statusbar,
1622 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1623 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
1625 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
1626 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
1627 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
1629 button = gtk_button_new_with_label ("close");
1630 g_signal_connect_swapped (button, "clicked",
1631 G_CALLBACK (gtk_widget_destroy),
1633 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
1634 gtk_widget_set_can_default (button, TRUE);
1635 gtk_widget_grab_default (button);
1638 if (!gtk_widget_get_visible (window))
1639 gtk_widget_show_all (window);
1641 gtk_widget_destroy (window);
1649 handle_box_child_signal (GtkHandleBox *hb,
1651 const gchar *action)
1653 printf ("%s: child <%s> %sed\n",
1654 g_type_name (G_OBJECT_TYPE (hb)),
1655 g_type_name (G_OBJECT_TYPE (child)),
1660 create_handle_box (GtkWidget *widget)
1662 static GtkWidget* window = NULL;
1663 GtkWidget *handle_box;
1664 GtkWidget *handle_box2;
1669 GtkWidget *separator;
1673 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1675 gtk_window_set_screen (GTK_WINDOW (window),
1676 gtk_widget_get_screen (widget));
1677 gtk_window_set_modal (GTK_WINDOW (window), FALSE);
1678 gtk_window_set_title (GTK_WINDOW (window),
1680 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
1682 g_signal_connect (window, "destroy",
1683 G_CALLBACK (gtk_widget_destroyed),
1686 gtk_container_set_border_width (GTK_CONTAINER (window), 20);
1688 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
1689 gtk_container_add (GTK_CONTAINER (window), vbox);
1690 gtk_widget_show (vbox);
1692 label = gtk_label_new ("Above");
1693 gtk_container_add (GTK_CONTAINER (vbox), label);
1694 gtk_widget_show (label);
1696 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1697 gtk_container_add (GTK_CONTAINER (vbox), separator);
1698 gtk_widget_show (separator);
1700 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
1701 gtk_container_add (GTK_CONTAINER (vbox), hbox);
1702 gtk_widget_show (hbox);
1704 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
1705 gtk_container_add (GTK_CONTAINER (vbox), separator);
1706 gtk_widget_show (separator);
1708 label = gtk_label_new ("Below");
1709 gtk_container_add (GTK_CONTAINER (vbox), label);
1710 gtk_widget_show (label);
1712 handle_box = gtk_handle_box_new ();
1713 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1714 g_signal_connect (handle_box,
1716 G_CALLBACK (handle_box_child_signal),
1718 g_signal_connect (handle_box,
1720 G_CALLBACK (handle_box_child_signal),
1722 gtk_widget_show (handle_box);
1724 toolbar = make_toolbar (window);
1726 gtk_container_add (GTK_CONTAINER (handle_box), toolbar);
1727 gtk_widget_show (toolbar);
1729 handle_box = gtk_handle_box_new ();
1730 gtk_box_pack_start (GTK_BOX (hbox), handle_box, FALSE, FALSE, 0);
1731 g_signal_connect (handle_box,
1733 G_CALLBACK (handle_box_child_signal),
1735 g_signal_connect (handle_box,
1737 G_CALLBACK (handle_box_child_signal),
1739 gtk_widget_show (handle_box);
1741 handle_box2 = gtk_handle_box_new ();
1742 gtk_container_add (GTK_CONTAINER (handle_box), handle_box2);
1743 g_signal_connect (handle_box2,
1745 G_CALLBACK (handle_box_child_signal),
1747 g_signal_connect (handle_box2,
1749 G_CALLBACK (handle_box_child_signal),
1751 gtk_widget_show (handle_box2);
1753 hbox = g_object_new (GTK_TYPE_HBOX, "visible", 1, "parent", handle_box2, NULL);
1754 label = gtk_label_new ("Fooo!");
1755 gtk_container_add (GTK_CONTAINER (hbox), label);
1756 gtk_widget_show (label);
1757 g_object_new (GTK_TYPE_ARROW, "visible", 1, "parent", hbox, NULL);
1760 if (!gtk_widget_get_visible (window))
1761 gtk_widget_show (window);
1763 gtk_widget_destroy (window);
1770 sensitivity_toggled (GtkWidget *toggle,
1773 gtk_widget_set_sensitive (widget,
1774 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle)));
1778 create_sensitivity_control (GtkWidget *widget)
1782 button = gtk_toggle_button_new_with_label ("Sensitive");
1784 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
1785 gtk_widget_is_sensitive (widget));
1787 g_signal_connect (button,
1789 G_CALLBACK (sensitivity_toggled),
1792 gtk_widget_show_all (button);
1798 set_selectable_recursive (GtkWidget *widget,
1801 if (GTK_IS_CONTAINER (widget))
1806 children = gtk_container_get_children (GTK_CONTAINER (widget));
1810 set_selectable_recursive (tmp->data, setting);
1814 g_list_free (children);
1816 else if (GTK_IS_LABEL (widget))
1818 gtk_label_set_selectable (GTK_LABEL (widget), setting);
1823 selectable_toggled (GtkWidget *toggle,
1826 set_selectable_recursive (widget,
1827 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (toggle)));
1831 create_selectable_control (GtkWidget *widget)
1835 button = gtk_toggle_button_new_with_label ("Selectable");
1837 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
1840 g_signal_connect (button,
1842 G_CALLBACK (selectable_toggled),
1845 gtk_widget_show_all (button);
1851 dialog_response (GtkWidget *dialog, gint response_id, GtkLabel *label)
1855 gtk_widget_destroy (dialog);
1857 text = "Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
1858 "as hyperlinks, which can be clicked\n"
1859 "or activated via <a href=\"keynav\">keynav</a>.\n"
1860 "The links remain the same.";
1861 gtk_label_set_markup (label, text);
1865 activate_link (GtkWidget *label, const gchar *uri, gpointer data)
1867 if (g_strcmp0 (uri, "keynav") == 0)
1871 dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (gtk_widget_get_toplevel (label)),
1872 GTK_DIALOG_DESTROY_WITH_PARENT,
1875 "The term <i>keynav</i> is a shorthand for "
1876 "keyboard navigation and refers to the process of using a program "
1877 "(exclusively) via keyboard input.");
1879 gtk_window_present (GTK_WINDOW (dialog));
1881 g_signal_connect (dialog, "response", G_CALLBACK (dialog_response), label);
1889 void create_labels (GtkWidget *widget)
1891 static GtkWidget *window = NULL;
1900 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1902 gtk_window_set_screen (GTK_WINDOW (window),
1903 gtk_widget_get_screen (widget));
1905 g_signal_connect (window, "destroy",
1906 G_CALLBACK (gtk_widget_destroyed),
1909 gtk_window_set_title (GTK_WINDOW (window), "Label");
1911 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1913 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
1914 gtk_container_add (GTK_CONTAINER (window), vbox);
1916 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
1918 button = create_sensitivity_control (hbox);
1920 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
1922 button = create_selectable_control (hbox);
1924 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
1926 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1928 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
1929 gtk_container_set_border_width (GTK_CONTAINER (window), 5);
1931 frame = gtk_frame_new ("Normal Label");
1932 label = gtk_label_new ("This is a Normal label");
1933 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
1934 gtk_container_add (GTK_CONTAINER (frame), label);
1935 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1937 frame = gtk_frame_new ("Multi-line Label");
1938 label = gtk_label_new ("This is a Multi-line label.\nSecond line\nThird line");
1939 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
1940 gtk_container_add (GTK_CONTAINER (frame), label);
1941 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1943 frame = gtk_frame_new ("Left Justified Label");
1944 label = gtk_label_new ("This is a Left-Justified\nMulti-line label.\nThird line");
1945 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_MIDDLE);
1946 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1947 gtk_container_add (GTK_CONTAINER (frame), label);
1948 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1950 frame = gtk_frame_new ("Right Justified Label");
1951 gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_START);
1952 label = gtk_label_new ("This is a Right-Justified\nMulti-line label.\nFourth line, (j/k)");
1953 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
1954 gtk_container_add (GTK_CONTAINER (frame), label);
1955 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1957 frame = gtk_frame_new ("Internationalized Label");
1958 label = gtk_label_new (NULL);
1959 gtk_label_set_markup (GTK_LABEL (label),
1960 "French (Fran\303\247ais) Bonjour, Salut\n"
1961 "Korean (\355\225\234\352\270\200) \354\225\210\353\205\225\355\225\230\354\204\270\354\232\224, \354\225\210\353\205\225\355\225\230\354\213\255\353\213\210\352\271\214\n"
1962 "Russian (\320\240\321\203\321\201\321\201\320\272\320\270\320\271) \320\227\320\264\321\200\320\260\320\262\321\201\321\202\320\262\321\203\320\271\321\202\320\265!\n"
1963 "Chinese (Simplified) <span lang=\"zh-cn\">\345\205\203\346\260\224 \345\274\200\345\217\221</span>\n"
1964 "Chinese (Traditional) <span lang=\"zh-tw\">\345\205\203\346\260\243 \351\226\213\347\231\274</span>\n"
1965 "Japanese <span lang=\"ja\">\345\205\203\346\260\227 \351\226\213\347\231\272</span>");
1966 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1967 gtk_container_add (GTK_CONTAINER (frame), label);
1968 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1970 frame = gtk_frame_new ("Bidirection Label");
1971 label = gtk_label_new ("\342\200\217Arabic \330\247\331\204\330\263\331\204\330\247\331\205 \330\271\331\204\331\212\331\203\331\205\n"
1972 "\342\200\217Hebrew \327\251\327\234\327\225\327\235");
1973 gtk_container_add (GTK_CONTAINER (frame), label);
1974 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1976 frame = gtk_frame_new ("Links in a label");
1977 label = gtk_label_new ("Some <a href=\"http://en.wikipedia.org/wiki/Text\" title=\"plain text\">text</a> may be marked up\n"
1978 "as hyperlinks, which can be clicked\n"
1979 "or activated via <a href=\"keynav\">keynav</a>");
1980 gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
1981 gtk_container_add (GTK_CONTAINER (frame), label);
1982 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
1983 g_signal_connect (label, "activate-link", G_CALLBACK (activate_link), NULL);
1985 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
1986 gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
1987 frame = gtk_frame_new ("Line wrapped label");
1988 label = gtk_label_new ("This is an example of a line-wrapped label. It should not be taking "\
1989 "up the entire "/* big space to test spacing */\
1990 "width allocated to it, but automatically wraps the words to fit. "\
1991 "The time has come, for all good men, to come to the aid of their party. "\
1992 "The sixth sheik's six sheep's sick.\n"\
1993 " It supports multiple paragraphs correctly, and correctly adds "\
1994 "many extra spaces. ");
1996 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
1997 gtk_container_add (GTK_CONTAINER (frame), label);
1998 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2000 frame = gtk_frame_new ("Filled, wrapped label");
2001 label = gtk_label_new ("This is an example of a line-wrapped, filled label. It should be taking "\
2002 "up the entire width allocated to it. Here is a seneance to prove "\
2003 "my point. Here is another sentence. "\
2004 "Here comes the sun, do de do de do.\n"\
2005 " This is a new paragraph.\n"\
2006 " This is another newer, longer, better paragraph. It is coming to an end, "\
2008 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_FILL);
2009 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
2010 gtk_container_add (GTK_CONTAINER (frame), label);
2011 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2013 frame = gtk_frame_new ("Underlined label");
2014 label = gtk_label_new ("This label is underlined!\n"
2015 "This one is underlined (\343\201\223\343\202\223\343\201\253\343\201\241\343\201\257) in quite a funky fashion");
2016 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2017 gtk_label_set_pattern (GTK_LABEL (label), "_________________________ _ _________ _ _____ _ __ __ ___ ____ _____");
2018 gtk_container_add (GTK_CONTAINER (frame), label);
2019 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2021 frame = gtk_frame_new ("Markup label");
2022 label = gtk_label_new (NULL);
2024 /* There's also a gtk_label_set_markup() without accel if you
2025 * don't have an accelerator key
2027 gtk_label_set_markup_with_mnemonic (GTK_LABEL (label),
2028 "This <span foreground=\"blue\" background=\"orange\">label</span> has "
2029 "<b>markup</b> _such as "
2030 "<big><i>Big Italics</i></big>\n"
2031 "<tt>Monospace font</tt>\n"
2032 "<u>Underline!</u>\n"
2034 "<span foreground=\"green\" background=\"red\">Ugly colors</span>\n"
2035 "and nothing on this line,\n"
2038 "or even on this one\n"
2039 "la <big>la <big>la <big>la <big>la</big></big></big></big>\n"
2040 "but this _word is <span foreground=\"purple\"><big>purple</big></span>\n"
2041 "<span underline=\"double\">We like <sup>superscript</sup> and <sub>subscript</sub> too</span>");
2043 g_assert (gtk_label_get_mnemonic_keyval (GTK_LABEL (label)) == GDK_KEY_s);
2045 gtk_container_add (GTK_CONTAINER (frame), label);
2046 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
2049 if (!gtk_widget_get_visible (window))
2050 gtk_widget_show_all (window);
2052 gtk_widget_destroy (window);
2056 on_angle_scale_changed (GtkRange *range,
2059 gtk_label_set_angle (GTK_LABEL (label), gtk_range_get_value (range));
2063 create_rotated_label (GtkWidget *widget)
2065 static GtkWidget *window = NULL;
2066 GtkWidget *content_area;
2070 GtkWidget *scale_label;
2071 GtkWidget *scale_hbox;
2075 window = gtk_dialog_new_with_buttons ("Rotated Label",
2076 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2077 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2080 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2082 gtk_window_set_screen (GTK_WINDOW (window),
2083 gtk_widget_get_screen (widget));
2085 g_signal_connect (window, "response",
2086 G_CALLBACK (gtk_widget_destroy), NULL);
2087 g_signal_connect (window, "destroy",
2088 G_CALLBACK (gtk_widget_destroyed), &window);
2090 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2092 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2093 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
2094 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
2096 label = gtk_label_new (NULL);
2097 gtk_label_set_markup (GTK_LABEL (label), "Hello World\n<i>Rotate</i> <span underline='single' foreground='blue'>me</span>");
2098 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
2100 scale_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2101 gtk_box_pack_start (GTK_BOX (vbox), scale_hbox, FALSE, FALSE, 0);
2103 scale_label = gtk_label_new (NULL);
2104 gtk_label_set_markup (GTK_LABEL (scale_label), "<i>Angle: </i>");
2105 gtk_box_pack_start (GTK_BOX (scale_hbox), scale_label, FALSE, FALSE, 0);
2107 hscale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL,
2109 g_signal_connect (hscale, "value-changed",
2110 G_CALLBACK (on_angle_scale_changed), label);
2112 gtk_range_set_value (GTK_RANGE (hscale), 45);
2113 gtk_widget_set_size_request (hscale, 200, -1);
2114 gtk_box_pack_start (GTK_BOX (scale_hbox), hscale, TRUE, TRUE, 0);
2117 if (!gtk_widget_get_visible (window))
2118 gtk_widget_show_all (window);
2120 gtk_widget_destroy (window);
2123 #define DEFAULT_TEXT_RADIUS 200
2126 on_rotated_text_unrealize (GtkWidget *widget)
2128 g_object_set_data (G_OBJECT (widget), "text-gc", NULL);
2132 on_rotated_text_draw (GtkWidget *widget,
2134 GdkPixbuf *tile_pixbuf)
2136 static const gchar *words[] = { "The", "grand", "old", "Duke", "of", "York",
2137 "had", "10,000", "men" };
2142 PangoLayout *layout;
2143 PangoContext *context;
2144 PangoFontDescription *desc;
2148 gdk_cairo_set_source_pixbuf (cr, tile_pixbuf, 0, 0);
2149 cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REPEAT);
2152 cairo_set_source_rgb (cr, 0, 0, 0);
2154 width = gtk_widget_get_allocated_width (widget);
2155 height = gtk_widget_get_allocated_height (widget);
2156 radius = MIN (width, height) / 2.;
2158 cairo_translate (cr,
2159 radius + (width - 2 * radius) / 2,
2160 radius + (height - 2 * radius) / 2);
2161 cairo_scale (cr, radius / DEFAULT_TEXT_RADIUS, radius / DEFAULT_TEXT_RADIUS);
2163 context = gtk_widget_get_pango_context (widget);
2164 layout = pango_layout_new (context);
2165 desc = pango_font_description_from_string ("Sans Bold 30");
2166 pango_layout_set_font_description (layout, desc);
2167 pango_font_description_free (desc);
2169 n_words = G_N_ELEMENTS (words);
2170 for (i = 0; i < n_words; i++)
2176 cairo_rotate (cr, 2 * G_PI * i / n_words);
2177 pango_cairo_update_layout (cr, layout);
2179 pango_layout_set_text (layout, words[i], -1);
2180 pango_layout_get_size (layout, &width, &height);
2182 cairo_move_to (cr, - width / 2 / PANGO_SCALE, - DEFAULT_TEXT_RADIUS);
2183 pango_cairo_show_layout (cr, layout);
2188 g_object_unref (layout);
2194 create_rotated_text (GtkWidget *widget)
2196 static GtkWidget *window = NULL;
2200 const GdkRGBA white = { 1.0, 1.0, 1.0, 1.0 };
2201 GtkRequisition requisition;
2202 GtkWidget *content_area;
2203 GtkWidget *drawing_area;
2204 GdkPixbuf *tile_pixbuf;
2206 window = gtk_dialog_new_with_buttons ("Rotated Text",
2207 GTK_WINDOW (gtk_widget_get_toplevel (widget)), 0,
2208 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
2211 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2213 gtk_window_set_screen (GTK_WINDOW (window),
2214 gtk_widget_get_screen (widget));
2216 g_signal_connect (window, "response",
2217 G_CALLBACK (gtk_widget_destroy), NULL);
2218 g_signal_connect (window, "destroy",
2219 G_CALLBACK (gtk_widget_destroyed), &window);
2221 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
2223 drawing_area = gtk_drawing_area_new ();
2224 gtk_box_pack_start (GTK_BOX (content_area), drawing_area, TRUE, TRUE, 0);
2225 gtk_widget_override_background_color (drawing_area, 0, &white);
2227 tile_pixbuf = gdk_pixbuf_new_from_file ("marble.xpm", NULL);
2229 g_signal_connect (drawing_area, "draw",
2230 G_CALLBACK (on_rotated_text_draw), tile_pixbuf);
2231 g_signal_connect (drawing_area, "unrealize",
2232 G_CALLBACK (on_rotated_text_unrealize), NULL);
2234 gtk_widget_show_all (gtk_bin_get_child (GTK_BIN (window)));
2236 gtk_widget_set_size_request (drawing_area, DEFAULT_TEXT_RADIUS * 2, DEFAULT_TEXT_RADIUS * 2);
2237 gtk_widget_get_preferred_size ( (window),
2238 &requisition, NULL);
2239 gtk_widget_set_size_request (drawing_area, -1, -1);
2240 gtk_window_resize (GTK_WINDOW (window), requisition.width, requisition.height);
2243 if (!gtk_widget_get_visible (window))
2244 gtk_widget_show (window);
2246 gtk_widget_destroy (window);
2254 reparent_label (GtkWidget *widget,
2255 GtkWidget *new_parent)
2259 label = g_object_get_data (G_OBJECT (widget), "user_data");
2261 gtk_widget_reparent (label, new_parent);
2265 set_parent_signal (GtkWidget *child,
2266 GtkWidget *old_parent,
2271 parent = gtk_widget_get_parent (child);
2272 g_message ("set_parent for \"%s\": new parent: \"%s\", old parent: \"%s\", data: %d\n",
2273 g_type_name (G_OBJECT_TYPE (child)),
2274 parent ? g_type_name (G_OBJECT_TYPE (parent)) : "NULL",
2275 old_parent ? g_type_name (G_OBJECT_TYPE (old_parent)) : "NULL",
2276 GPOINTER_TO_INT (func_data));
2280 create_reparent (GtkWidget *widget)
2282 static GtkWidget *window = NULL;
2289 GtkWidget *separator;
2290 GtkWidget *event_box;
2294 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2296 gtk_window_set_screen (GTK_WINDOW (window),
2297 gtk_widget_get_screen (widget));
2299 g_signal_connect (window, "destroy",
2300 G_CALLBACK (gtk_widget_destroyed),
2303 gtk_window_set_title (GTK_WINDOW (window), "reparent");
2304 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2306 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2307 gtk_container_add (GTK_CONTAINER (window), box1);
2309 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
2310 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2311 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2313 label = gtk_label_new ("Hello World");
2315 frame = gtk_frame_new ("Frame 1");
2316 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2318 box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2319 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2320 gtk_container_add (GTK_CONTAINER (frame), box3);
2322 button = gtk_button_new_with_label ("switch");
2323 g_object_set_data (G_OBJECT (button), "user_data", label);
2324 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2326 event_box = gtk_event_box_new ();
2327 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2328 gtk_container_add (GTK_CONTAINER (event_box), label);
2330 g_signal_connect (button, "clicked",
2331 G_CALLBACK (reparent_label),
2334 g_signal_connect (label, "parent_set",
2335 G_CALLBACK (set_parent_signal),
2336 GINT_TO_POINTER (42));
2338 frame = gtk_frame_new ("Frame 2");
2339 gtk_box_pack_start (GTK_BOX (box2), frame, TRUE, TRUE, 0);
2341 box3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2342 gtk_container_set_border_width (GTK_CONTAINER (box3), 5);
2343 gtk_container_add (GTK_CONTAINER (frame), box3);
2345 button = gtk_button_new_with_label ("switch");
2346 g_object_set_data (G_OBJECT (button), "user_data", label);
2347 gtk_box_pack_start (GTK_BOX (box3), button, FALSE, TRUE, 0);
2349 event_box = gtk_event_box_new ();
2350 gtk_box_pack_start (GTK_BOX (box3), event_box, FALSE, TRUE, 0);
2352 g_signal_connect (button, "clicked",
2353 G_CALLBACK (reparent_label),
2356 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2357 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2359 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2360 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2361 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2363 button = gtk_button_new_with_label ("close");
2364 g_signal_connect_swapped (button, "clicked",
2365 G_CALLBACK (gtk_widget_destroy), window);
2366 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2367 gtk_widget_set_can_default (button, TRUE);
2368 gtk_widget_grab_default (button);
2371 if (!gtk_widget_get_visible (window))
2372 gtk_widget_show_all (window);
2374 gtk_widget_destroy (window);
2381 grippy_button_press (GtkWidget *area, GdkEventButton *event, GdkWindowEdge edge)
2383 if (event->type == GDK_BUTTON_PRESS)
2385 if (event->button == 1)
2386 gtk_window_begin_resize_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)), edge,
2387 event->button, event->x_root, event->y_root,
2389 else if (event->button == 2)
2390 gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (area)),
2391 event->button, event->x_root, event->y_root,
2398 grippy_draw (GtkWidget *area, cairo_t *cr, GdkWindowEdge edge)
2400 GtkStyleContext *context;
2401 GtkJunctionSides sides;
2405 case GDK_WINDOW_EDGE_NORTH_WEST:
2406 sides = GTK_JUNCTION_CORNER_TOPLEFT;
2408 case GDK_WINDOW_EDGE_NORTH:
2409 sides = GTK_JUNCTION_TOP;
2411 case GDK_WINDOW_EDGE_NORTH_EAST:
2412 sides = GTK_JUNCTION_CORNER_TOPRIGHT;
2414 case GDK_WINDOW_EDGE_WEST:
2415 sides = GTK_JUNCTION_LEFT;
2417 case GDK_WINDOW_EDGE_EAST:
2418 sides = GTK_JUNCTION_RIGHT;
2420 case GDK_WINDOW_EDGE_SOUTH_WEST:
2421 sides = GTK_JUNCTION_CORNER_BOTTOMLEFT;
2423 case GDK_WINDOW_EDGE_SOUTH:
2424 sides = GTK_JUNCTION_BOTTOM;
2426 case GDK_WINDOW_EDGE_SOUTH_EAST:
2427 sides = GTK_JUNCTION_CORNER_BOTTOMRIGHT;
2430 g_assert_not_reached();
2433 context = gtk_widget_get_style_context (area);
2434 gtk_style_context_save (context);
2435 gtk_style_context_add_class (context, "grip");
2436 gtk_style_context_set_junction_sides (context, sides);
2437 gtk_render_handle (context, cr,
2439 gtk_widget_get_allocated_width (area),
2440 gtk_widget_get_allocated_height (area));
2442 gtk_style_context_restore (context);
2448 create_resize_grips (GtkWidget *widget)
2450 static GtkWidget *window = NULL;
2452 GtkWidget *hbox, *vbox;
2455 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2457 gtk_window_set_screen (GTK_WINDOW (window),
2458 gtk_widget_get_screen (widget));
2460 gtk_window_set_title (GTK_WINDOW (window), "resize grips");
2462 g_signal_connect (window, "destroy",
2463 G_CALLBACK (gtk_widget_destroyed),
2466 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2467 gtk_container_add (GTK_CONTAINER (window), vbox);
2469 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2470 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2473 area = gtk_drawing_area_new ();
2474 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2475 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2476 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2477 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2478 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2479 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_WEST));
2482 area = gtk_drawing_area_new ();
2483 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2484 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2485 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2486 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2487 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2488 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH));
2491 area = gtk_drawing_area_new ();
2492 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2493 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2494 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2495 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2496 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2497 GINT_TO_POINTER (GDK_WINDOW_EDGE_NORTH_EAST));
2499 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2500 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2503 area = gtk_drawing_area_new ();
2504 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2505 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2506 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2507 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2508 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2509 GINT_TO_POINTER (GDK_WINDOW_EDGE_WEST));
2512 area = gtk_drawing_area_new ();
2513 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2516 area = gtk_drawing_area_new ();
2517 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2518 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2519 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2520 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2521 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2522 GINT_TO_POINTER (GDK_WINDOW_EDGE_EAST));
2525 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2526 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
2529 area = gtk_drawing_area_new ();
2530 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2531 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2532 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2533 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2534 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2535 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_WEST));
2537 area = gtk_drawing_area_new ();
2538 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2539 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2540 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2541 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2542 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2543 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH));
2546 area = gtk_drawing_area_new ();
2547 gtk_widget_add_events (area, GDK_BUTTON_PRESS_MASK);
2548 gtk_box_pack_start (GTK_BOX (hbox), area, TRUE, TRUE, 0);
2549 g_signal_connect (area, "draw", G_CALLBACK (grippy_draw),
2550 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2551 g_signal_connect (area, "button_press_event", G_CALLBACK (grippy_button_press),
2552 GINT_TO_POINTER (GDK_WINDOW_EDGE_SOUTH_EAST));
2555 if (!gtk_widget_get_visible (window))
2556 gtk_widget_show_all (window);
2558 gtk_widget_destroy (window);
2564 gint upositionx = 0;
2565 gint upositiony = 0;
2568 uposition_configure (GtkWidget *window)
2574 lx = g_object_get_data (G_OBJECT (window), "x");
2575 ly = g_object_get_data (G_OBJECT (window), "y");
2577 gdk_window_get_root_origin (gtk_widget_get_window (window),
2578 &upositionx, &upositiony);
2579 sprintf (buffer, "%d", upositionx);
2580 gtk_label_set_text (lx, buffer);
2581 sprintf (buffer, "%d", upositiony);
2582 gtk_label_set_text (ly, buffer);
2588 uposition_stop_configure (GtkToggleButton *toggle,
2591 if (gtk_toggle_button_get_active (toggle))
2592 g_signal_handlers_block_by_func (window, G_CALLBACK (uposition_configure), NULL);
2594 g_signal_handlers_unblock_by_func (window, G_CALLBACK (uposition_configure), NULL);
2598 create_saved_position (GtkWidget *widget)
2600 static GtkWidget *window = NULL;
2605 GtkWidget *main_vbox;
2613 window = g_object_connect (g_object_new (GTK_TYPE_WINDOW,
2614 "type", GTK_WINDOW_TOPLEVEL,
2615 "title", "Saved Position",
2617 "signal::configure_event", uposition_configure, NULL,
2620 gtk_window_move (GTK_WINDOW (window), upositionx, upositiony);
2622 gtk_window_set_screen (GTK_WINDOW (window),
2623 gtk_widget_get_screen (widget));
2626 g_signal_connect (window, "destroy",
2627 G_CALLBACK (gtk_widget_destroyed),
2630 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2631 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
2632 gtk_container_add (GTK_CONTAINER (window), main_vbox);
2635 g_object_new (GTK_TYPE_BOX,
2636 "orientation", GTK_ORIENTATION_VERTICAL,
2637 "GtkBox::homogeneous", FALSE,
2638 "GtkBox::spacing", 5,
2639 "GtkContainer::border_width", 10,
2640 "GtkWidget::parent", main_vbox,
2641 "GtkWidget::visible", TRUE,
2642 "child", g_object_connect (g_object_new (GTK_TYPE_TOGGLE_BUTTON,
2643 "label", "Stop Events",
2647 "signal::clicked", uposition_stop_configure, window,
2651 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2652 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2653 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2655 label = gtk_label_new ("X Origin : ");
2656 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2657 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
2659 x_label = gtk_label_new ("");
2660 gtk_box_pack_start (GTK_BOX (hbox), x_label, TRUE, TRUE, 0);
2661 g_object_set_data (G_OBJECT (window), "x", x_label);
2663 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2664 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
2665 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
2667 label = gtk_label_new ("Y Origin : ");
2668 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2669 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
2671 y_label = gtk_label_new ("");
2672 gtk_box_pack_start (GTK_BOX (hbox), y_label, TRUE, TRUE, 0);
2673 g_object_set_data (G_OBJECT (window), "y", y_label);
2676 g_object_new (gtk_hseparator_get_type (),
2677 "GtkWidget::visible", TRUE,
2679 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
2681 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2682 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
2683 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
2685 button = gtk_button_new_with_label ("Close");
2686 g_signal_connect_swapped (button, "clicked",
2687 G_CALLBACK (gtk_widget_destroy),
2689 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
2690 gtk_widget_set_can_default (button, TRUE);
2691 gtk_widget_grab_default (button);
2693 gtk_widget_show_all (window);
2696 gtk_widget_destroy (window);
2704 create_pixbuf (GtkWidget *widget)
2706 static GtkWidget *window = NULL;
2712 GtkWidget *separator;
2713 GtkWidget *pixbufwid;
2714 GdkWindow *gdk_window;
2718 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2720 gtk_window_set_screen (GTK_WINDOW (window),
2721 gtk_widget_get_screen (widget));
2723 g_signal_connect (window, "destroy",
2724 G_CALLBACK (gtk_widget_destroyed),
2727 gtk_window_set_title (GTK_WINDOW (window), "GtkPixmap");
2728 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
2729 gtk_widget_realize(window);
2731 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2732 gtk_container_add (GTK_CONTAINER (window), box1);
2734 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2735 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2736 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2738 button = gtk_button_new ();
2739 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
2741 gdk_window = gtk_widget_get_window (window);
2743 pixbufwid = new_pixbuf ("test.xpm", gdk_window);
2745 label = gtk_label_new ("Pixbuf\ntest");
2746 box3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2747 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
2748 gtk_container_add (GTK_CONTAINER (box3), pixbufwid);
2749 gtk_container_add (GTK_CONTAINER (box3), label);
2750 gtk_container_add (GTK_CONTAINER (button), box3);
2752 button = gtk_button_new ();
2753 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, FALSE, 0);
2755 pixbufwid = new_pixbuf ("test.xpm", gdk_window);
2757 label = gtk_label_new ("Pixbuf\ntest");
2758 box3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
2759 gtk_container_set_border_width (GTK_CONTAINER (box3), 2);
2760 gtk_container_add (GTK_CONTAINER (box3), pixbufwid);
2761 gtk_container_add (GTK_CONTAINER (box3), label);
2762 gtk_container_add (GTK_CONTAINER (button), box3);
2764 gtk_widget_set_sensitive (button, FALSE);
2766 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2767 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2769 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2770 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2771 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2773 button = gtk_button_new_with_label ("close");
2774 g_signal_connect_swapped (button, "clicked",
2775 G_CALLBACK (gtk_widget_destroy),
2777 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2778 gtk_widget_set_can_default (button, TRUE);
2779 gtk_widget_grab_default (button);
2782 if (!gtk_widget_get_visible (window))
2783 gtk_widget_show_all (window);
2785 gtk_widget_destroy (window);
2789 create_tooltips (GtkWidget *widget)
2791 static GtkWidget *window = NULL;
2798 GtkWidget *separator;
2803 g_object_new (gtk_window_get_type (),
2804 "GtkWindow::type", GTK_WINDOW_TOPLEVEL,
2805 "GtkContainer::border_width", 0,
2806 "GtkWindow::title", "Tooltips",
2807 "GtkWindow::resizable", FALSE,
2810 gtk_window_set_screen (GTK_WINDOW (window),
2811 gtk_widget_get_screen (widget));
2813 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
2814 gtk_container_add (GTK_CONTAINER (window), box1);
2816 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2817 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2818 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
2820 button = gtk_toggle_button_new_with_label ("button1");
2821 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2823 gtk_widget_set_tooltip_text (button, "This is button 1");
2825 button = gtk_toggle_button_new_with_label ("button2");
2826 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2828 gtk_widget_set_tooltip_text (button,
2829 "This is button 2. This is also a really long tooltip which probably "
2830 "won't fit on a single line and will therefore need to be wrapped. "
2831 "Hopefully the wrapping will work correctly.");
2833 toggle = gtk_toggle_button_new_with_label ("Override TipsQuery Label");
2834 gtk_box_pack_start (GTK_BOX (box2), toggle, TRUE, TRUE, 0);
2836 gtk_widget_set_tooltip_text (toggle, "Toggle TipsQuery view.");
2839 g_object_new (GTK_TYPE_BOX,
2840 "orientation", GTK_ORIENTATION_VERTICAL,
2841 "homogeneous", FALSE,
2848 g_object_new (gtk_button_get_type (),
2853 gtk_box_set_child_packing (GTK_BOX (box3), button, FALSE, FALSE, 0, GTK_PACK_START);
2854 gtk_widget_set_tooltip_text (button, "Start the Tooltips Inspector");
2856 frame = g_object_new (gtk_frame_get_type (),
2857 "label", "ToolTips Inspector",
2858 "label_xalign", (double) 0.5,
2864 gtk_box_set_child_packing (GTK_BOX (box2), frame, TRUE, TRUE, 10, GTK_PACK_START);
2866 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
2867 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
2869 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
2870 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
2871 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
2873 button = gtk_button_new_with_label ("close");
2874 g_signal_connect_swapped (button, "clicked",
2875 G_CALLBACK (gtk_widget_destroy),
2877 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
2878 gtk_widget_set_can_default (button, TRUE);
2879 gtk_widget_grab_default (button);
2881 gtk_widget_set_tooltip_text (button, "Push this button to close window");
2884 if (!gtk_widget_get_visible (window))
2885 gtk_widget_show_all (window);
2887 gtk_widget_destroy (window);
2895 pack_image (GtkWidget *box,
2899 gtk_box_pack_start (GTK_BOX (box),
2900 gtk_label_new (text),
2903 gtk_box_pack_start (GTK_BOX (box),
2909 create_image (GtkWidget *widget)
2911 static GtkWidget *window = NULL;
2918 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2920 gtk_window_set_screen (GTK_WINDOW (window),
2921 gtk_widget_get_screen (widget));
2923 /* this is bogus for testing drawing when allocation < request,
2924 * don't copy into real code
2926 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
2928 g_signal_connect (window, "destroy",
2929 G_CALLBACK (gtk_widget_destroyed),
2932 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
2934 gtk_container_add (GTK_CONTAINER (window), vbox);
2936 pack_image (vbox, "Stock Warning Dialog",
2937 gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
2938 GTK_ICON_SIZE_DIALOG));
2940 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
2942 pack_image (vbox, "Pixbuf",
2943 gtk_image_new_from_pixbuf (pixbuf));
2945 g_object_unref (pixbuf);
2948 if (!gtk_widget_get_visible (window))
2949 gtk_widget_show_all (window);
2951 gtk_widget_destroy (window);
2959 create_menu (GdkScreen *screen, gint depth, gint length, gboolean tearoff)
2962 GtkWidget *menuitem;
2971 menu = gtk_menu_new ();
2972 gtk_menu_set_screen (GTK_MENU (menu), screen);
2978 menuitem = gtk_tearoff_menu_item_new ();
2979 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2980 gtk_widget_show (menuitem);
2983 image = gtk_image_new_from_stock (GTK_STOCK_OPEN,
2984 GTK_ICON_SIZE_MENU);
2985 gtk_widget_show (image);
2986 menuitem = gtk_image_menu_item_new_with_label ("Image item");
2987 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
2988 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2989 gtk_widget_show (menuitem);
2991 for (i = 0, j = 1; i < length; i++, j++)
2993 sprintf (buf, "item %2d - %d", depth, j);
2995 menuitem = gtk_radio_menu_item_new_with_label (group, buf);
2996 group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
2998 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
2999 gtk_widget_show (menuitem);
3001 gtk_widget_set_sensitive (menuitem, FALSE);
3004 gtk_check_menu_item_set_inconsistent (GTK_CHECK_MENU_ITEM (menuitem),
3008 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem),
3009 create_menu (screen, depth - 1, 5, TRUE));
3016 create_table_menu (GdkScreen *screen, gint cols, gint rows, gboolean tearoff)
3019 GtkWidget *menuitem;
3025 menu = gtk_menu_new ();
3026 gtk_menu_set_screen (GTK_MENU (menu), screen);
3031 menuitem = gtk_tearoff_menu_item_new ();
3032 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3033 gtk_widget_show (menuitem);
3037 menuitem = gtk_menu_item_new_with_label ("items");
3038 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3040 submenu = gtk_menu_new ();
3041 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3042 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3043 gtk_widget_show (menuitem);
3046 /* now fill the items submenu */
3047 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3048 GTK_ICON_SIZE_MENU);
3049 gtk_widget_show (image);
3050 menuitem = gtk_image_menu_item_new_with_label ("Image");
3051 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3052 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3053 gtk_widget_show (menuitem);
3055 menuitem = gtk_menu_item_new_with_label ("x");
3056 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 0, 1);
3057 gtk_widget_show (menuitem);
3059 menuitem = gtk_menu_item_new_with_label ("x");
3060 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 2);
3061 gtk_widget_show (menuitem);
3063 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3064 GTK_ICON_SIZE_MENU);
3065 gtk_widget_show (image);
3066 menuitem = gtk_image_menu_item_new_with_label ("Image");
3067 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3068 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3069 gtk_widget_show (menuitem);
3071 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3072 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 2, 3);
3073 gtk_widget_show (menuitem);
3075 menuitem = gtk_menu_item_new_with_label ("x");
3076 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 2, 3);
3077 gtk_widget_show (menuitem);
3079 menuitem = gtk_menu_item_new_with_label ("x");
3080 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 3, 4);
3081 gtk_widget_show (menuitem);
3083 menuitem = gtk_radio_menu_item_new_with_label (NULL, "Radio");
3084 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 3, 4);
3085 gtk_widget_show (menuitem);
3087 menuitem = gtk_check_menu_item_new_with_label ("Check");
3088 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 4, 5);
3089 gtk_widget_show (menuitem);
3091 menuitem = gtk_menu_item_new_with_label ("x");
3092 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 4, 5);
3093 gtk_widget_show (menuitem);
3095 menuitem = gtk_menu_item_new_with_label ("x");
3096 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 5, 6);
3097 gtk_widget_show (menuitem);
3099 menuitem = gtk_check_menu_item_new_with_label ("Check");
3100 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 5, 6);
3101 gtk_widget_show (menuitem);
3103 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3104 gtk_widget_show (menuitem);
3105 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 8);
3107 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3108 gtk_widget_show (menuitem);
3109 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 2);
3111 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3112 gtk_widget_show (menuitem);
3113 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, 0);
3115 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3116 gtk_widget_show (menuitem);
3117 gtk_menu_shell_insert (GTK_MENU_SHELL (submenu), menuitem, -1);
3119 /* end of items submenu */
3121 menuitem = gtk_menu_item_new_with_label ("spanning");
3122 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, cols, j, j + 1);
3124 submenu = gtk_menu_new ();
3125 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3126 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3127 gtk_widget_show (menuitem);
3130 /* now fill the spanning submenu */
3131 menuitem = gtk_menu_item_new_with_label ("a");
3132 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 2, 0, 1);
3133 gtk_widget_show (menuitem);
3135 menuitem = gtk_menu_item_new_with_label ("b");
3136 gtk_menu_attach (GTK_MENU (submenu), menuitem, 2, 3, 0, 2);
3137 gtk_widget_show (menuitem);
3139 menuitem = gtk_menu_item_new_with_label ("c");
3140 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 1, 3);
3141 gtk_widget_show (menuitem);
3143 menuitem = gtk_menu_item_new_with_label ("d");
3144 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 2, 1, 2);
3145 gtk_widget_show (menuitem);
3147 menuitem = gtk_menu_item_new_with_label ("e");
3148 gtk_menu_attach (GTK_MENU (submenu), menuitem, 1, 3, 2, 3);
3149 gtk_widget_show (menuitem);
3150 /* end of spanning submenu */
3152 menuitem = gtk_menu_item_new_with_label ("left");
3153 gtk_menu_attach (GTK_MENU (menu), menuitem, 0, 1, j, j + 1);
3154 submenu = gtk_menu_new ();
3155 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3156 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3157 gtk_widget_show (menuitem);
3159 menuitem = gtk_menu_item_new_with_label ("Empty");
3160 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3161 submenu = gtk_menu_new ();
3162 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3163 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3164 gtk_widget_show (menuitem);
3166 menuitem = gtk_menu_item_new_with_label ("right");
3167 gtk_menu_attach (GTK_MENU (menu), menuitem, 1, 2, j, j + 1);
3168 submenu = gtk_menu_new ();
3169 gtk_menu_set_screen (GTK_MENU (submenu), screen);
3170 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), submenu);
3171 gtk_widget_show (menuitem);
3173 menuitem = gtk_menu_item_new_with_label ("Empty");
3174 gtk_menu_attach (GTK_MENU (submenu), menuitem, 0, 1, 0, 1);
3175 gtk_widget_show (menuitem);
3179 for (; j < rows; j++)
3180 for (i = 0; i < cols; i++)
3182 sprintf (buf, "(%d %d)", i, j);
3183 menuitem = gtk_menu_item_new_with_label (buf);
3184 gtk_menu_attach (GTK_MENU (menu), menuitem, i, i + 1, j, j + 1);
3185 gtk_widget_show (menuitem);
3188 menuitem = gtk_menu_item_new_with_label ("1. Inserted normally (8)");
3189 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 8);
3190 gtk_widget_show (menuitem);
3191 menuitem = gtk_menu_item_new_with_label ("2. Inserted normally (2)");
3192 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 2);
3193 gtk_widget_show (menuitem);
3194 menuitem = gtk_menu_item_new_with_label ("3. Inserted normally (0)");
3195 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 0);
3196 gtk_widget_show (menuitem);
3197 menuitem = gtk_menu_item_new_with_label ("4. Inserted normally (-1)");
3198 gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, -1);
3199 gtk_widget_show (menuitem);
3205 create_menus (GtkWidget *widget)
3207 static GtkWidget *window = NULL;
3211 GtkWidget *optionmenu;
3212 GtkWidget *separator;
3218 GtkWidget *menuitem;
3219 GtkAccelGroup *accel_group;
3221 GdkScreen *screen = gtk_widget_get_screen (widget);
3223 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3225 gtk_window_set_screen (GTK_WINDOW (window), screen);
3227 g_signal_connect (window, "destroy",
3228 G_CALLBACK (gtk_widget_destroyed),
3230 g_signal_connect (window, "delete-event",
3231 G_CALLBACK (gtk_true),
3234 accel_group = gtk_accel_group_new ();
3235 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3237 gtk_window_set_title (GTK_WINDOW (window), "menus");
3238 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3241 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
3242 gtk_container_add (GTK_CONTAINER (window), box1);
3243 gtk_widget_show (box1);
3245 menubar = gtk_menu_bar_new ();
3246 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3247 gtk_widget_show (menubar);
3249 menu = create_menu (screen, 2, 50, TRUE);
3251 menuitem = gtk_menu_item_new_with_label ("test\nline2");
3252 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3253 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3254 gtk_widget_show (menuitem);
3256 menu = create_table_menu (screen, 2, 50, TRUE);
3258 menuitem = gtk_menu_item_new_with_label ("table");
3259 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3260 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3261 gtk_widget_show (menuitem);
3263 menuitem = gtk_menu_item_new_with_label ("foo");
3264 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 3, 5, TRUE));
3265 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3266 gtk_widget_show (menuitem);
3268 image = gtk_image_new_from_stock (GTK_STOCK_HELP,
3269 GTK_ICON_SIZE_MENU);
3270 gtk_widget_show (image);
3271 menuitem = gtk_image_menu_item_new_with_label ("Help");
3272 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), image);
3273 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), create_menu (screen, 4, 5, TRUE));
3274 gtk_widget_set_hexpand (menuitem, TRUE);
3275 gtk_widget_set_halign (menuitem, GTK_ALIGN_END);
3276 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3277 gtk_widget_show (menuitem);
3279 menubar = gtk_menu_bar_new ();
3280 gtk_box_pack_start (GTK_BOX (box1), menubar, FALSE, TRUE, 0);
3281 gtk_widget_show (menubar);
3283 menu = create_menu (screen, 2, 10, TRUE);
3285 menuitem = gtk_menu_item_new_with_label ("Second menu bar");
3286 gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem), menu);
3287 gtk_menu_shell_append (GTK_MENU_SHELL (menubar), menuitem);
3288 gtk_widget_show (menuitem);
3290 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3291 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3292 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
3293 gtk_widget_show (box2);
3295 menu = create_menu (screen, 1, 5, FALSE);
3296 gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
3298 menuitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_NEW, accel_group);
3299 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3300 gtk_widget_show (menuitem);
3302 menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
3303 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3304 gtk_widget_show (menuitem);
3305 gtk_widget_add_accelerator (menuitem,
3311 menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
3312 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3313 gtk_widget_show (menuitem);
3314 gtk_widget_add_accelerator (menuitem,
3319 GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3320 menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
3321 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
3322 gtk_widget_show (menuitem);
3323 gtk_widget_add_accelerator (menuitem,
3329 gtk_widget_add_accelerator (menuitem,
3336 optionmenu = gtk_combo_box_text_new ();
3337 gtk_combo_box_set_active (GTK_COMBO_BOX (optionmenu), 3);
3338 gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
3339 gtk_widget_show (optionmenu);
3341 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
3342 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
3343 gtk_widget_show (separator);
3345 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
3346 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
3347 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
3348 gtk_widget_show (box2);
3350 button = gtk_button_new_with_label ("close");
3351 g_signal_connect_swapped (button, "clicked",
3352 G_CALLBACK (gtk_widget_destroy),
3354 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
3355 gtk_widget_set_can_default (button, TRUE);
3356 gtk_widget_grab_default (button);
3357 gtk_widget_show (button);
3360 if (!gtk_widget_get_visible (window))
3361 gtk_widget_show (window);
3363 gtk_widget_destroy (window);
3366 /* GdkPixbuf RGBA C-Source image dump */
3368 static const guint8 apple[] =
3370 /* Pixbuf magic (0x47646b50) */
3372 /* length: header (24) + pixel_data (2304) */
3374 /* pixdata_type (0x1010002) */
3376 /* rowstride (96) */
3383 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3384 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3385 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3386 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3387 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3388 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3389 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\26\24"
3390 "\17\11\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3391 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`m"
3392 "[pn{a\344hv_\345_k[`\0\0\0\0\0\0\0\0\0\0\0\0D>/\305\0\0\0_\0\0\0\0\0"
3393 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3394 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`l[Blza\373s\202d\354w\206g\372p~c"
3395 "\374`l[y\0\0\0\0[S\77/\27\25\17\335\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0"
3396 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3397 "\0\0\0\0\0\0`l\\\20iw_\356y\211h\373x\207g\364~\216i\364u\204e\366gt"
3398 "_\374^jX\241A;-_\0\0\0~\0\0\0\0SM4)SM21B9&\22\320\270\204\1\320\270\204"
3399 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0eq"
3400 "]\212r\200c\366v\205f\371jx_\323_kY\232_kZH^jY\26]iW\211@G9\272:6%j\220"
3401 "\211]\320\221\211`\377\212\203Z\377~xP\377mkE\331]^;|/0\37\21\0\0\0\0"
3402 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0ly`\40p~b\360lz`\353^kY\246["
3403 "eT<\216\200Z\203\227\211_\354\234\217c\377\232\217b\362\232\220c\337"
3404 "\243\233k\377\252\241p\377\250\236p\377\241\225h\377\231\214_\377\210"
3405 "\202U\377srI\377[]:\355KO0U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0i"
3406 "v^\200`lY\211^jY\"\0\0\0\0\221\204\\\273\250\233r\377\302\267\224\377"
3407 "\311\300\237\377\272\256\204\377\271\256\177\377\271\257\200\377\267"
3408 "\260\177\377\260\251x\377\250\236l\377\242\225e\377\226\213]\377~zP\377"
3409 "ff@\377QT5\377LR2d\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0]iW(\0\0\0\0\0\0\0"
3410 "\0\213\203[v\253\240t\377\334\326\301\377\344\340\317\377\321\312\253"
3411 "\377\303\271\217\377\300\270\213\377\277\267\210\377\272\264\203\377"
3412 "\261\255z\377\250\242n\377\243\232h\377\232\220`\377\210\202V\377nnE"
3413 "\377SW6\377RX6\364Za<\34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0b]@\20"
3414 "\234\222e\362\304\274\232\377\337\333\306\377\332\325\273\377\311\302"
3415 "\232\377\312\303\236\377\301\273\216\377\300\271\212\377\270\264\200"
3416 "\377\256\253v\377\246\243n\377\236\232h\377\230\220`\377\213\203V\377"
3417 "wvL\377X]:\377KR0\377NU5v\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\212"
3418 "\203Zl\242\234l\377\321\315\260\377\331\324\271\377\320\313\251\377\307"
3419 "\301\232\377\303\276\224\377\300\272\214\377\274\267\206\377\264\260"
3420 "|\377\253\251s\377\244\243n\377\232\230e\377\223\216^\377\207\200U\377"
3421 "ttJ\377[_<\377HO/\377GN0\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3422 "\210\204Y\240\245\237o\377\316\310\253\377\310\303\237\377\304\300\230"
3423 "\377\303\277\225\377\277\272\216\377\274\270\210\377\266\263\200\377"
3424 "\256\254v\377\247\246p\377\237\236j\377\227\226d\377\215\212[\377\203"
3425 "\177T\377qsH\377X]8\377FN.\377DK-\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3426 "\0\0\0\0\207\204X\257\244\240o\377\300\275\231\377\301\275\226\377\274"
3427 "\270\213\377\274\270\214\377\267\264\205\377\264\262\200\377\260\256"
3428 "z\377\251\251s\377\243\244n\377\231\232g\377\220\222`\377\210\211Y\377"
3429 "|}Q\377hlC\377PU3\377CK,\377DL/Y\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3430 "\0\0\205\204X\220\232\230h\377\261\260\204\377\266\264\212\377\261\260"
3431 "\201\377\263\260\200\377\260\257}\377\256\256x\377\253\254t\377\244\246"
3432 "o\377\233\236i\377\221\224b\377\211\214\\\377\202\204V\377txM\377]b>"
3433 "\377HP0\377@H+\373CJ-\25\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0xxO>"
3434 "\215\215_\377\237\237r\377\247\247x\377\247\247t\377\252\252w\377\252"
3435 "\252u\377\252\253t\377\243\246o\377\235\240j\377\223\230c\377\213\217"
3436 "]\377\201\206V\377x}P\377gkD\377RY5\377BI,\377AI,\262\0\0\0\0\0\0\0\0"
3437 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\202\205W\312\216\220`\377\230"
3438 "\232g\377\234\236i\377\236\241l\377\241\244n\377\240\244m\377\232\237"
3439 "i\377\223\230c\377\212\221]\377\200\210W\377v|P\377jnG\377Za>\377HP2"
3440 "\377=D)\377HQ1:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3441 "\0wzQ6\177\201U\371\206\211Z\377\216\222`\377\220\225a\377\220\225b\377"
3442 "\220\226a\377\213\221_\377\204\213Z\377{\203R\377ryN\377iqH\377^fA\377"
3443 "R[;\377BJ-\3778@'\317\0\0\0>\0\0\0\36\0\0\0\7\0\0\0\0\0\0\0\0\0\0\0\0"
3444 "\0\0\0\0\0\0\0\0\0\0\0\0ptJTw|Q\371z\177R\377}\202T\377|\203T\377z\200"
3445 "R\377v|O\377pwL\377jpF\377dlB\377`hB\377Yb@\377LT6\377<C*\377\11\12\6"
3446 "\376\0\0\0\347\0\0\0\262\0\0\0Y\0\0\0\32\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3447 "\0\0\0\0\0\0\0\0\0\0\\`=UgnE\370hnG\377gmE\377djB\377]d>\377[c<\377Y"
3448 "b<\377Zc>\377V_>\377OW8\377BK/\377\16\20\12\377\0\0\0\377\0\0\0\377\0"
3449 "\0\0\374\0\0\0\320\0\0\0I\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3450 "\0\1\0\0\0\40\22\24\15\260@D+\377W`;\377OV5\377.3\36\377.3\37\377IP0"
3451 "\377RZ7\377PZ8\3776=&\377\14\15\10\377\0\0\0\377\0\0\0\377\0\0\0\377"
3452 "\0\0\0\347\0\0\0\217\0\0\0""4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3453 "\0\0\0\0\0\0\0\20\0\0\0P\0\0\0\252\7\10\5\346\7\7\5\375\0\0\0\377\0\0"
3454 "\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\374\0"
3455 "\0\0\336\0\0\0\254\0\0\0i\0\0\0""2\0\0\0\10\0\0\0\0\0\0\0\0\0\0\0\0\0"
3456 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\0\0\0\40\0\0\0D\0\0\0m\0\0\0"
3457 "\226\0\0\0\234\0\0\0\234\0\0\0\244\0\0\0\246\0\0\0\232\0\0\0\202\0\0"
3458 "\0i\0\0\0T\0\0\0,\0\0\0\15\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
3459 "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0\6\0\0\0"
3460 "\16\0\0\0\22\0\0\0\24\0\0\0\23\0\0\0\17\0\0\0\14\0\0\0\13\0\0\0\10\0"
3461 "\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"};
3465 accel_button_new (GtkAccelGroup *accel_group,
3470 GdkModifierType modifiers;
3474 gtk_accelerator_parse (accel, &keyval, &modifiers);
3477 button = gtk_button_new ();
3478 gtk_widget_add_accelerator (button, "activate", accel_group,
3479 keyval, modifiers, GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
3481 label = gtk_accel_label_new (text);
3482 gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), button);
3483 gtk_widget_show (label);
3485 gtk_container_add (GTK_CONTAINER (button), label);
3491 create_key_lookup (GtkWidget *widget)
3493 static GtkWidget *window = NULL;
3494 gpointer window_ptr;
3498 GtkAccelGroup *accel_group = gtk_accel_group_new ();
3500 GtkWidget *content_area;
3502 window = gtk_dialog_new_with_buttons ("Key Lookup", NULL, 0,
3503 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
3506 gtk_window_set_screen (GTK_WINDOW (window),
3507 gtk_widget_get_screen (widget));
3509 /* We have to expand it so the accel labels will draw their labels
3511 gtk_window_set_default_size (GTK_WINDOW (window), 300, -1);
3513 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
3515 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
3517 button = gtk_button_new_with_mnemonic ("Button 1 (_a)");
3518 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3519 button = gtk_button_new_with_mnemonic ("Button 2 (_A)");
3520 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3521 button = gtk_button_new_with_mnemonic ("Button 3 (_\321\204)");
3522 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3523 button = gtk_button_new_with_mnemonic ("Button 4 (_\320\244)");
3524 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3525 button = gtk_button_new_with_mnemonic ("Button 6 (_b)");
3526 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3527 button = accel_button_new (accel_group, "Button 7", "<Alt><Shift>b");
3528 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3529 button = accel_button_new (accel_group, "Button 8", "<Alt>d");
3530 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3531 button = accel_button_new (accel_group, "Button 9", "<Alt>Cyrillic_ve");
3532 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3533 button = gtk_button_new_with_mnemonic ("Button 10 (_1)");
3534 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3535 button = gtk_button_new_with_mnemonic ("Button 11 (_!)");
3536 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3537 button = accel_button_new (accel_group, "Button 12", "<Super>a");
3538 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3539 button = accel_button_new (accel_group, "Button 13", "<Hyper>a");
3540 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3541 button = accel_button_new (accel_group, "Button 14", "<Meta>a");
3542 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3543 button = accel_button_new (accel_group, "Button 15", "<Shift><Mod4>b");
3544 gtk_box_pack_start (GTK_BOX (content_area), button, FALSE, FALSE, 0);
3546 window_ptr = &window;
3547 g_object_add_weak_pointer (G_OBJECT (window), window_ptr);
3548 g_signal_connect (window, "response", G_CALLBACK (gtk_widget_destroy), NULL);
3550 gtk_widget_show_all (window);
3553 gtk_widget_destroy (window);
3562 cmw_destroy_cb(GtkWidget *widget)
3564 /* This is needed to get out of gtk_main */
3571 cmw_color (GtkWidget *widget, GtkWidget *parent)
3574 GtkWidget *colorsel;
3575 GtkWidget *ok_button, *cancel_button;
3577 csd = gtk_color_selection_dialog_new ("This is a modal color selection dialog");
3579 gtk_window_set_screen (GTK_WINDOW (csd), gtk_widget_get_screen (parent));
3581 colorsel = gtk_color_selection_dialog_get_color_selection (GTK_COLOR_SELECTION_DIALOG (csd));
3582 gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (colorsel),
3586 gtk_window_set_modal (GTK_WINDOW(csd),TRUE);
3588 /* And mark it as a transient dialog */
3589 gtk_window_set_transient_for (GTK_WINDOW (csd), GTK_WINDOW (parent));
3591 g_signal_connect (csd, "destroy",
3592 G_CALLBACK (cmw_destroy_cb), NULL);
3595 "ok-button", &ok_button,
3596 "cancel-button", &cancel_button,
3599 g_signal_connect_swapped (ok_button,
3600 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
3601 g_signal_connect_swapped (cancel_button,
3602 "clicked", G_CALLBACK (gtk_widget_destroy), csd);
3604 /* wait until destroy calls gtk_main_quit */
3605 gtk_widget_show (csd);
3610 cmw_file (GtkWidget *widget, GtkWidget *parent)
3614 fs = gtk_file_chooser_dialog_new ("This is a modal file selection dialog",
3615 GTK_WINDOW (parent), GTK_FILE_CHOOSER_ACTION_OPEN,
3616 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
3617 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
3619 gtk_window_set_screen (GTK_WINDOW (fs), gtk_widget_get_screen (parent));
3620 gtk_window_set_modal (GTK_WINDOW (fs), TRUE);
3622 g_signal_connect (fs, "destroy",
3623 G_CALLBACK (cmw_destroy_cb), NULL);
3624 g_signal_connect_swapped (fs, "response",
3625 G_CALLBACK (gtk_widget_destroy), fs);
3627 /* wait until destroy calls gtk_main_quit */
3628 gtk_widget_show (fs);
3634 create_modal_window (GtkWidget *widget)
3636 GtkWidget *window = NULL;
3637 GtkWidget *box1,*box2;
3639 GtkWidget *btnColor,*btnFile,*btnClose;
3641 /* Create modal window (Here you can use any window descendent )*/
3642 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3643 gtk_window_set_screen (GTK_WINDOW (window),
3644 gtk_widget_get_screen (widget));
3646 gtk_window_set_title (GTK_WINDOW(window),"This window is modal");
3648 /* Set window as modal */
3649 gtk_window_set_modal (GTK_WINDOW(window),TRUE);
3651 /* Create widgets */
3652 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
3653 frame1 = gtk_frame_new ("Standard dialogs in modal form");
3654 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
3655 gtk_box_set_homogeneous (GTK_BOX (box2), TRUE);
3656 btnColor = gtk_button_new_with_label ("Color");
3657 btnFile = gtk_button_new_with_label ("File Selection");
3658 btnClose = gtk_button_new_with_label ("Close");
3661 gtk_container_set_border_width (GTK_CONTAINER (box1), 3);
3662 gtk_container_set_border_width (GTK_CONTAINER (box2), 3);
3665 gtk_container_add (GTK_CONTAINER (window), box1);
3666 gtk_box_pack_start (GTK_BOX (box1), frame1, TRUE, TRUE, 4);
3667 gtk_container_add (GTK_CONTAINER (frame1), box2);
3668 gtk_box_pack_start (GTK_BOX (box2), btnColor, FALSE, FALSE, 4);
3669 gtk_box_pack_start (GTK_BOX (box2), btnFile, FALSE, FALSE, 4);
3670 gtk_box_pack_start (GTK_BOX (box1), gtk_separator_new (GTK_ORIENTATION_HORIZONTAL), FALSE, FALSE, 4);
3671 gtk_box_pack_start (GTK_BOX (box1), btnClose, FALSE, FALSE, 4);
3673 /* connect signals */
3674 g_signal_connect_swapped (btnClose, "clicked",
3675 G_CALLBACK (gtk_widget_destroy), window);
3677 g_signal_connect (window, "destroy",
3678 G_CALLBACK (cmw_destroy_cb), NULL);
3680 g_signal_connect (btnColor, "clicked",
3681 G_CALLBACK (cmw_color), window);
3682 g_signal_connect (btnFile, "clicked",
3683 G_CALLBACK (cmw_file), window);
3686 gtk_widget_show_all (window);
3688 /* wait until dialog get destroyed */
3697 make_message_dialog (GdkScreen *screen,
3699 GtkMessageType type,
3700 GtkButtonsType buttons,
3701 guint default_response)
3705 gtk_widget_destroy (*dialog);
3710 *dialog = gtk_message_dialog_new (NULL, 0, type, buttons,
3711 "This is a message dialog; it can wrap long lines. This is a long line. La la la. Look this line is wrapped. Blah blah blah blah blah blah. (Note: testgtk has a nonstandard gtkrc that changes some of the message dialog icons.)");
3713 gtk_window_set_screen (GTK_WINDOW (*dialog), screen);
3715 g_signal_connect_swapped (*dialog,
3717 G_CALLBACK (gtk_widget_destroy),
3720 g_signal_connect (*dialog,
3722 G_CALLBACK (gtk_widget_destroyed),
3725 gtk_dialog_set_default_response (GTK_DIALOG (*dialog), default_response);
3727 gtk_widget_show (*dialog);
3731 create_message_dialog (GtkWidget *widget)
3733 static GtkWidget *info = NULL;
3734 static GtkWidget *warning = NULL;
3735 static GtkWidget *error = NULL;
3736 static GtkWidget *question = NULL;
3737 GdkScreen *screen = gtk_widget_get_screen (widget);
3739 make_message_dialog (screen, &info, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, GTK_RESPONSE_OK);
3740 make_message_dialog (screen, &warning, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, GTK_RESPONSE_CLOSE);
3741 make_message_dialog (screen, &error, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK_CANCEL, GTK_RESPONSE_OK);
3742 make_message_dialog (screen, &question, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, GTK_RESPONSE_NO);
3749 static GtkWidget *sw_parent = NULL;
3750 static GtkWidget *sw_float_parent;
3751 static gulong sw_destroyed_handler = 0;
3754 scrolled_windows_delete_cb (GtkWidget *widget, GdkEventAny *event, GtkWidget *scrollwin)
3756 gtk_widget_reparent (scrollwin, sw_parent);
3758 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
3759 sw_float_parent = NULL;
3761 sw_destroyed_handler = 0;
3767 scrolled_windows_destroy_cb (GtkWidget *widget, GtkWidget *scrollwin)
3769 gtk_widget_destroy (sw_float_parent);
3771 sw_float_parent = NULL;
3773 sw_destroyed_handler = 0;
3777 scrolled_windows_remove (GtkWidget *widget, GtkWidget *scrollwin)
3781 gtk_widget_reparent (scrollwin, sw_parent);
3782 gtk_widget_destroy (sw_float_parent);
3784 g_signal_handler_disconnect (sw_parent, sw_destroyed_handler);
3785 sw_float_parent = NULL;
3787 sw_destroyed_handler = 0;
3791 sw_parent = gtk_widget_get_parent (scrollwin);
3792 sw_float_parent = gtk_window_new (GTK_WINDOW_TOPLEVEL);
3793 gtk_window_set_screen (GTK_WINDOW (sw_float_parent),
3794 gtk_widget_get_screen (widget));
3796 gtk_window_set_default_size (GTK_WINDOW (sw_float_parent), 200, 200);
3798 gtk_widget_reparent (scrollwin, sw_float_parent);
3799 gtk_widget_show (sw_float_parent);
3801 sw_destroyed_handler =
3802 g_signal_connect (sw_parent, "destroy",
3803 G_CALLBACK (scrolled_windows_destroy_cb), scrollwin);
3804 g_signal_connect (sw_float_parent, "delete_event",
3805 G_CALLBACK (scrolled_windows_delete_cb), scrollwin);
3810 create_scrolled_windows (GtkWidget *widget)
3812 static GtkWidget *window;
3813 GtkWidget *content_area, *action_area;
3814 GtkWidget *scrolled_window;
3822 window = gtk_dialog_new ();
3824 gtk_window_set_screen (GTK_WINDOW (window),
3825 gtk_widget_get_screen (widget));
3827 g_signal_connect (window, "destroy",
3828 G_CALLBACK (gtk_widget_destroyed),
3831 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
3832 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
3834 gtk_window_set_title (GTK_WINDOW (window), "dialog");
3835 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
3837 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
3838 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
3839 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
3840 GTK_POLICY_AUTOMATIC,
3841 GTK_POLICY_AUTOMATIC);
3842 gtk_box_pack_start (GTK_BOX (content_area), scrolled_window, TRUE, TRUE, 0);
3843 gtk_widget_show (scrolled_window);
3845 table = gtk_table_new (20, 20, FALSE);
3846 gtk_table_set_row_spacings (GTK_TABLE (table), 10);
3847 gtk_table_set_col_spacings (GTK_TABLE (table), 10);
3848 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
3849 gtk_container_set_focus_hadjustment (GTK_CONTAINER (table),
3850 gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
3851 gtk_container_set_focus_vadjustment (GTK_CONTAINER (table),
3852 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
3853 gtk_widget_show (table);
3855 for (i = 0; i < 20; i++)
3856 for (j = 0; j < 20; j++)
3858 sprintf (buffer, "button (%d,%d)\n", i, j);
3859 button = gtk_toggle_button_new_with_label (buffer);
3860 gtk_table_attach_defaults (GTK_TABLE (table), button,
3862 gtk_widget_show (button);
3866 button = gtk_button_new_with_label ("Close");
3867 g_signal_connect_swapped (button, "clicked",
3868 G_CALLBACK (gtk_widget_destroy),
3870 gtk_widget_set_can_default (button, TRUE);
3871 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
3872 gtk_widget_grab_default (button);
3873 gtk_widget_show (button);
3875 button = gtk_button_new_with_label ("Reparent Out");
3876 g_signal_connect (button, "clicked",
3877 G_CALLBACK (scrolled_windows_remove),
3879 gtk_widget_set_can_default (button, TRUE);
3880 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
3881 gtk_widget_grab_default (button);
3882 gtk_widget_show (button);
3884 gtk_window_set_default_size (GTK_WINDOW (window), 300, 300);
3887 if (!gtk_widget_get_visible (window))
3888 gtk_widget_show (window);
3890 gtk_widget_destroy (window);
3898 entry_toggle_frame (GtkWidget *checkbutton,
3901 gtk_entry_set_has_frame (GTK_ENTRY(entry),
3902 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
3906 entry_toggle_sensitive (GtkWidget *checkbutton,
3909 gtk_widget_set_sensitive (entry,
3910 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(checkbutton)));
3914 entry_progress_timeout (gpointer data)
3916 if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (data), "progress-pulse")))
3918 gtk_entry_progress_pulse (GTK_ENTRY (data));
3924 fraction = gtk_entry_get_progress_fraction (GTK_ENTRY (data));
3927 if (fraction > 1.0001)
3930 gtk_entry_set_progress_fraction (GTK_ENTRY (data), fraction);
3937 entry_remove_timeout (gpointer data)
3939 g_source_remove (GPOINTER_TO_UINT (data));
3943 entry_toggle_progress (GtkWidget *checkbutton,
3946 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)))
3948 guint timeout = gdk_threads_add_timeout (100,
3949 entry_progress_timeout,
3951 g_object_set_data_full (G_OBJECT (entry), "timeout-id",
3952 GUINT_TO_POINTER (timeout),
3953 entry_remove_timeout);
3957 g_object_set_data (G_OBJECT (entry), "timeout-id",
3958 GUINT_TO_POINTER (0));
3960 gtk_entry_set_progress_fraction (GTK_ENTRY (entry), 0.0);
3965 entry_toggle_pulse (GtkWidget *checkbutton,
3968 g_object_set_data (G_OBJECT (entry), "progress-pulse",
3969 GUINT_TO_POINTER ((guint) gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton))));
3973 props_clicked (GtkWidget *button,
3976 GtkWidget *window = create_prop_editor (object, 0);
3978 gtk_window_set_title (GTK_WINDOW (window), "Object Properties");
3982 create_entry (GtkWidget *widget)
3984 static GtkWidget *window = NULL;
3988 GtkWidget *has_frame_check;
3989 GtkWidget *sensitive_check;
3990 GtkWidget *progress_check;
3992 GtkComboBoxText *cb;
3993 GtkWidget *cb_entry;
3995 GtkWidget *separator;
3999 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4000 gtk_window_set_screen (GTK_WINDOW (window),
4001 gtk_widget_get_screen (widget));
4003 g_signal_connect (window, "destroy",
4004 G_CALLBACK (gtk_widget_destroyed),
4007 gtk_window_set_title (GTK_WINDOW (window), "entry");
4008 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4011 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4012 gtk_container_add (GTK_CONTAINER (window), box1);
4015 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
4016 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4017 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
4019 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
4020 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
4022 entry = gtk_entry_new ();
4023 gtk_entry_set_text (GTK_ENTRY (entry), "hello world \330\247\331\204\330\263\331\204\330\247\331\205 \330\271\331\204\331\212\331\203\331\205");
4024 gtk_editable_select_region (GTK_EDITABLE (entry), 0, 5);
4025 gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
4027 button = gtk_button_new_with_mnemonic ("_Props");
4028 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
4029 g_signal_connect (button, "clicked",
4030 G_CALLBACK (props_clicked),
4033 cb = GTK_COMBO_BOX_TEXT (gtk_combo_box_text_new_with_entry ());
4035 gtk_combo_box_text_append_text (cb, "item0");
4036 gtk_combo_box_text_append_text (cb, "item0");
4037 gtk_combo_box_text_append_text (cb, "item1 item1");
4038 gtk_combo_box_text_append_text (cb, "item2 item2 item2");
4039 gtk_combo_box_text_append_text (cb, "item3 item3 item3 item3");
4040 gtk_combo_box_text_append_text (cb, "item4 item4 item4 item4 item4");
4041 gtk_combo_box_text_append_text (cb, "item5 item5 item5 item5 item5 item5");
4042 gtk_combo_box_text_append_text (cb, "item6 item6 item6 item6 item6");
4043 gtk_combo_box_text_append_text (cb, "item7 item7 item7 item7");
4044 gtk_combo_box_text_append_text (cb, "item8 item8 item8");
4045 gtk_combo_box_text_append_text (cb, "item9 item9");
4047 cb_entry = gtk_bin_get_child (GTK_BIN (cb));
4048 gtk_entry_set_text (GTK_ENTRY (cb_entry), "hello world \n\n\n foo");
4049 gtk_editable_select_region (GTK_EDITABLE (cb_entry), 0, -1);
4050 gtk_box_pack_start (GTK_BOX (box2), GTK_WIDGET (cb), TRUE, TRUE, 0);
4052 sensitive_check = gtk_check_button_new_with_label("Sensitive");
4053 gtk_box_pack_start (GTK_BOX (box2), sensitive_check, FALSE, TRUE, 0);
4054 g_signal_connect (sensitive_check, "toggled",
4055 G_CALLBACK (entry_toggle_sensitive), entry);
4056 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sensitive_check), TRUE);
4058 has_frame_check = gtk_check_button_new_with_label("Has Frame");
4059 gtk_box_pack_start (GTK_BOX (box2), has_frame_check, FALSE, TRUE, 0);
4060 g_signal_connect (has_frame_check, "toggled",
4061 G_CALLBACK (entry_toggle_frame), entry);
4062 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (has_frame_check), TRUE);
4064 progress_check = gtk_check_button_new_with_label("Show Progress");
4065 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4066 g_signal_connect (progress_check, "toggled",
4067 G_CALLBACK (entry_toggle_progress), entry);
4069 progress_check = gtk_check_button_new_with_label("Pulse Progress");
4070 gtk_box_pack_start (GTK_BOX (box2), progress_check, FALSE, TRUE, 0);
4071 g_signal_connect (progress_check, "toggled",
4072 G_CALLBACK (entry_toggle_pulse), entry);
4074 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
4075 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4077 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
4078 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4079 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4081 button = gtk_button_new_with_label ("close");
4082 g_signal_connect_swapped (button, "clicked",
4083 G_CALLBACK (gtk_widget_destroy),
4085 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4086 gtk_widget_set_can_default (button, TRUE);
4087 gtk_widget_grab_default (button);
4090 if (!gtk_widget_get_visible (window))
4091 gtk_widget_show_all (window);
4093 gtk_widget_destroy (window);
4097 create_expander (GtkWidget *widget)
4100 GtkWidget *expander;
4102 static GtkWidget *window = NULL;
4106 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4107 gtk_window_set_screen (GTK_WINDOW (window),
4108 gtk_widget_get_screen (widget));
4110 g_signal_connect (window, "destroy",
4111 G_CALLBACK (gtk_widget_destroyed),
4114 gtk_window_set_title (GTK_WINDOW (window), "expander");
4115 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4117 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4118 gtk_container_add (GTK_CONTAINER (window), box1);
4120 expander = gtk_expander_new ("The Hidden");
4122 gtk_box_pack_start (GTK_BOX (box1), expander, TRUE, TRUE, 0);
4124 hidden = gtk_label_new ("Revealed!");
4126 gtk_container_add (GTK_CONTAINER (expander), hidden);
4129 if (!gtk_widget_get_visible (window))
4130 gtk_widget_show_all (window);
4132 gtk_widget_destroy (window);
4140 event_box_label_pressed (GtkWidget *widget,
4141 GdkEventButton *event,
4144 g_print ("clicked on event box\n");
4148 event_box_button_clicked (GtkWidget *widget,
4152 g_print ("pushed button\n");
4156 event_box_toggle_visible_window (GtkWidget *checkbutton,
4157 GtkEventBox *event_box)
4159 gtk_event_box_set_visible_window (event_box,
4160 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
4164 event_box_toggle_above_child (GtkWidget *checkbutton,
4165 GtkEventBox *event_box)
4167 gtk_event_box_set_above_child (event_box,
4168 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton)));
4172 create_event_box (GtkWidget *widget)
4174 static GtkWidget *window = NULL;
4180 GtkWidget *separator;
4181 GtkWidget *event_box;
4183 GtkWidget *visible_window_check;
4184 GtkWidget *above_child_check;
4194 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4195 gtk_window_set_screen (GTK_WINDOW (window),
4196 gtk_widget_get_screen (widget));
4198 g_signal_connect (window, "destroy",
4199 G_CALLBACK (gtk_widget_destroyed),
4202 gtk_window_set_title (GTK_WINDOW (window), "event box");
4203 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
4205 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4206 gtk_container_add (GTK_CONTAINER (window), box1);
4207 gtk_widget_override_background_color (window, 0, &color);
4209 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4210 gtk_box_pack_start (GTK_BOX (box1), hbox, TRUE, FALSE, 0);
4212 event_box = gtk_event_box_new ();
4213 gtk_box_pack_start (GTK_BOX (hbox), event_box, TRUE, FALSE, 0);
4215 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4216 gtk_container_add (GTK_CONTAINER (event_box), vbox);
4217 g_signal_connect (event_box, "button_press_event",
4218 G_CALLBACK (event_box_label_pressed),
4221 label = gtk_label_new ("Click on this label");
4222 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, FALSE, 0);
4224 button = gtk_button_new_with_label ("button in eventbox");
4225 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, FALSE, 0);
4226 g_signal_connect (button, "clicked",
4227 G_CALLBACK (event_box_button_clicked),
4231 visible_window_check = gtk_check_button_new_with_label("Visible Window");
4232 gtk_box_pack_start (GTK_BOX (box1), visible_window_check, FALSE, TRUE, 0);
4233 g_signal_connect (visible_window_check, "toggled",
4234 G_CALLBACK (event_box_toggle_visible_window), event_box);
4235 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (visible_window_check), FALSE);
4237 above_child_check = gtk_check_button_new_with_label("Above Child");
4238 gtk_box_pack_start (GTK_BOX (box1), above_child_check, FALSE, TRUE, 0);
4239 g_signal_connect (above_child_check, "toggled",
4240 G_CALLBACK (event_box_toggle_above_child), event_box);
4241 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (above_child_check), FALSE);
4243 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
4244 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
4246 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
4247 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
4248 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
4250 button = gtk_button_new_with_label ("close");
4251 g_signal_connect_swapped (button, "clicked",
4252 G_CALLBACK (gtk_widget_destroy),
4254 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
4255 gtk_widget_set_can_default (button, TRUE);
4256 gtk_widget_grab_default (button);
4259 if (!gtk_widget_get_visible (window))
4260 gtk_widget_show_all (window);
4262 gtk_widget_destroy (window);
4270 #define SIZE_GROUP_INITIAL_SIZE 50
4273 size_group_hsize_changed (GtkSpinButton *spin_button,
4276 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4277 gtk_spin_button_get_value_as_int (spin_button),
4282 size_group_vsize_changed (GtkSpinButton *spin_button,
4285 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
4287 gtk_spin_button_get_value_as_int (spin_button));
4291 create_size_group_window (GdkScreen *screen,
4292 GtkSizeGroup *master_size_group)
4294 GtkWidget *content_area;
4297 GtkWidget *main_button;
4299 GtkWidget *spin_button;
4301 GtkSizeGroup *hgroup1;
4302 GtkSizeGroup *hgroup2;
4303 GtkSizeGroup *vgroup1;
4304 GtkSizeGroup *vgroup2;
4306 window = gtk_dialog_new_with_buttons ("GtkSizeGroup",
4312 gtk_window_set_screen (GTK_WINDOW (window), screen);
4314 gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
4316 g_signal_connect (window, "response",
4317 G_CALLBACK (gtk_widget_destroy),
4320 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
4322 table = gtk_table_new (2, 2, FALSE);
4323 gtk_box_pack_start (GTK_BOX (content_area), table, TRUE, TRUE, 0);
4325 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
4326 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
4327 gtk_container_set_border_width (GTK_CONTAINER (table), 5);
4328 gtk_widget_set_size_request (table, 250, 250);
4330 hgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4331 hgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
4332 vgroup1 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4333 vgroup2 = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
4335 main_button = gtk_button_new_with_label ("X");
4337 gtk_table_attach (GTK_TABLE (table), main_button,
4339 GTK_EXPAND, GTK_EXPAND,
4341 gtk_size_group_add_widget (master_size_group, main_button);
4342 gtk_size_group_add_widget (hgroup1, main_button);
4343 gtk_size_group_add_widget (vgroup1, main_button);
4344 gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (main_button)),
4345 SIZE_GROUP_INITIAL_SIZE,
4346 SIZE_GROUP_INITIAL_SIZE);
4348 button = gtk_button_new ();
4349 gtk_table_attach (GTK_TABLE (table), button,
4351 GTK_EXPAND, GTK_EXPAND,
4353 gtk_size_group_add_widget (vgroup1, button);
4354 gtk_size_group_add_widget (vgroup2, button);
4356 button = gtk_button_new ();
4357 gtk_table_attach (GTK_TABLE (table), button,
4359 GTK_EXPAND, GTK_EXPAND,
4361 gtk_size_group_add_widget (hgroup1, button);
4362 gtk_size_group_add_widget (hgroup2, button);
4364 button = gtk_button_new ();
4365 gtk_table_attach (GTK_TABLE (table), button,
4367 GTK_EXPAND, GTK_EXPAND,
4369 gtk_size_group_add_widget (hgroup2, button);
4370 gtk_size_group_add_widget (vgroup2, button);
4372 g_object_unref (hgroup1);
4373 g_object_unref (hgroup2);
4374 g_object_unref (vgroup1);
4375 g_object_unref (vgroup2);
4377 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
4378 gtk_box_pack_start (GTK_BOX (content_area), hbox, FALSE, FALSE, 0);
4380 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4381 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4382 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4383 g_signal_connect (spin_button, "value_changed",
4384 G_CALLBACK (size_group_hsize_changed), main_button);
4386 spin_button = gtk_spin_button_new_with_range (1, 100, 1);
4387 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin_button), SIZE_GROUP_INITIAL_SIZE);
4388 gtk_box_pack_start (GTK_BOX (hbox), spin_button, TRUE, TRUE, 0);
4389 g_signal_connect (spin_button, "value_changed",
4390 G_CALLBACK (size_group_vsize_changed), main_button);
4396 create_size_groups (GtkWidget *widget)
4398 static GtkWidget *window1 = NULL;
4399 static GtkWidget *window2 = NULL;
4400 static GtkSizeGroup *master_size_group;
4402 if (!master_size_group)
4403 master_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH);
4407 window1 = create_size_group_window (gtk_widget_get_screen (widget),
4410 g_signal_connect (window1, "destroy",
4411 G_CALLBACK (gtk_widget_destroyed),
4417 window2 = create_size_group_window (gtk_widget_get_screen (widget),
4420 g_signal_connect (window2, "destroy",
4421 G_CALLBACK (gtk_widget_destroyed),
4425 if (gtk_widget_get_visible (window1) && gtk_widget_get_visible (window2))
4427 gtk_widget_destroy (window1);
4428 gtk_widget_destroy (window2);
4432 if (!gtk_widget_get_visible (window1))
4433 gtk_widget_show_all (window1);
4434 if (!gtk_widget_get_visible (window2))
4435 gtk_widget_show_all (window2);
4443 static GtkWidget *spinner1;
4446 toggle_snap (GtkWidget *widget, GtkSpinButton *spin)
4448 gtk_spin_button_set_snap_to_ticks (spin,
4449 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
4453 toggle_numeric (GtkWidget *widget, GtkSpinButton *spin)
4455 gtk_spin_button_set_numeric (spin,
4456 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)));
4460 change_digits (GtkWidget *widget, GtkSpinButton *spin)
4462 gtk_spin_button_set_digits (GTK_SPIN_BUTTON (spinner1),
4463 gtk_spin_button_get_value_as_int (spin));
4467 get_value (GtkWidget *widget, gpointer data)
4471 GtkSpinButton *spin;
4473 spin = GTK_SPIN_BUTTON (spinner1);
4474 label = GTK_LABEL (g_object_get_data (G_OBJECT (widget), "user_data"));
4475 if (GPOINTER_TO_INT (data) == 1)
4476 sprintf (buf, "%d", gtk_spin_button_get_value_as_int (spin));
4478 sprintf (buf, "%0.*f",
4479 gtk_spin_button_get_digits (spin),
4480 gtk_spin_button_get_value (spin));
4482 gtk_label_set_text (label, buf);
4486 get_spin_value (GtkWidget *widget, gpointer data)
4490 GtkSpinButton *spin;
4492 spin = GTK_SPIN_BUTTON (widget);
4493 label = GTK_LABEL (data);
4495 buffer = g_strdup_printf ("%0.*f",
4496 gtk_spin_button_get_digits (spin),
4497 gtk_spin_button_get_value (spin));
4498 gtk_label_set_text (label, buffer);
4504 spin_button_time_output_func (GtkSpinButton *spin_button)
4506 GtkAdjustment *adjustment;
4507 static gchar buf[6];
4511 adjustment = gtk_spin_button_get_adjustment (spin_button);
4512 hours = gtk_adjustment_get_value (adjustment) / 60.0;
4513 minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
4514 sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
4515 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4516 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4521 spin_button_month_input_func (GtkSpinButton *spin_button,
4525 static gchar *month[12] = { "January", "February", "March", "April",
4526 "May", "June", "July", "August",
4527 "September", "October", "November", "December" };
4529 gboolean found = FALSE;
4531 for (i = 1; i <= 12; i++)
4533 tmp1 = g_ascii_strup (month[i - 1], -1);
4534 tmp2 = g_ascii_strup (gtk_entry_get_text (GTK_ENTRY (spin_button)), -1);
4535 if (strstr (tmp1, tmp2) == tmp1)
4545 return GTK_INPUT_ERROR;
4547 *new_val = (gdouble) i;
4552 spin_button_month_output_func (GtkSpinButton *spin_button)
4554 GtkAdjustment *adjustment;
4557 static gchar *month[12] = { "January", "February", "March", "April",
4558 "May", "June", "July", "August", "September",
4559 "October", "November", "December" };
4561 adjustment = gtk_spin_button_get_adjustment (spin_button);
4562 value = gtk_adjustment_get_value (adjustment);
4563 for (i = 1; i <= 12; i++)
4564 if (fabs (value - (double)i) < 1e-5)
4566 if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
4567 gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
4573 spin_button_hex_input_func (GtkSpinButton *spin_button,
4580 buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
4581 res = strtol(buf, &err, 16);
4584 return GTK_INPUT_ERROR;
4590 spin_button_hex_output_func (GtkSpinButton *spin_button)
4592 GtkAdjustment *adjustment;
4593 static gchar buf[7];
4596 adjustment = gtk_spin_button_get_adjustment (spin_button);
4597 val = (gint) gtk_adjustment_get_value (adjustment);
4598 if (fabs (val) < 1e-5)
4599 sprintf (buf, "0x00");
4601 sprintf (buf, "0x%.2X", val);
4602 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
4603 gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
4608 create_spins (GtkWidget *widget)
4610 static GtkWidget *window = NULL;
4613 GtkWidget *main_vbox;
4616 GtkWidget *spinner2;
4620 GtkWidget *val_label;
4621 GtkAdjustment *adjustment;
4625 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4626 gtk_window_set_screen (GTK_WINDOW (window),
4627 gtk_widget_get_screen (widget));
4629 g_signal_connect (window, "destroy",
4630 G_CALLBACK (gtk_widget_destroyed),
4633 gtk_window_set_title (GTK_WINDOW (window), "GtkSpinButton");
4635 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
4636 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 10);
4637 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4639 frame = gtk_frame_new ("Not accelerated");
4640 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4642 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4643 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4644 gtk_container_add (GTK_CONTAINER (frame), vbox);
4646 /* Time, month, hex spinners */
4648 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4649 gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
4651 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4652 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4654 label = gtk_label_new ("Time :");
4655 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4656 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4658 adjustment = gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
4659 spinner = gtk_spin_button_new (adjustment, 0, 0);
4660 gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
4661 g_signal_connect (spinner,
4663 G_CALLBACK (spin_button_time_output_func),
4665 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4666 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 5);
4667 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4669 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4670 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4672 label = gtk_label_new ("Month :");
4673 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4674 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4676 adjustment = gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
4678 spinner = gtk_spin_button_new (adjustment, 0, 0);
4679 gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
4680 GTK_UPDATE_IF_VALID);
4681 g_signal_connect (spinner,
4683 G_CALLBACK (spin_button_month_input_func),
4685 g_signal_connect (spinner,
4687 G_CALLBACK (spin_button_month_output_func),
4689 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4690 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 9);
4691 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4693 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4694 gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
4696 label = gtk_label_new ("Hex :");
4697 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4698 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4700 adjustment = gtk_adjustment_new (0, 0, 255, 1, 16, 0);
4701 spinner = gtk_spin_button_new (adjustment, 0, 0);
4702 gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
4703 g_signal_connect (spinner,
4705 G_CALLBACK (spin_button_hex_input_func),
4707 g_signal_connect (spinner,
4709 G_CALLBACK (spin_button_hex_output_func),
4711 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
4712 gtk_entry_set_width_chars (GTK_ENTRY (spinner), 4);
4713 gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
4715 frame = gtk_frame_new ("Accelerated");
4716 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4718 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4719 gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
4720 gtk_container_add (GTK_CONTAINER (frame), vbox);
4722 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4723 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4725 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4726 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4728 label = gtk_label_new ("Value :");
4729 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4730 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4732 adjustment = gtk_adjustment_new (0.0, -10000.0, 10000.0,
4734 spinner1 = gtk_spin_button_new (adjustment, 1.0, 2);
4735 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner1), TRUE);
4736 gtk_box_pack_start (GTK_BOX (vbox2), spinner1, FALSE, TRUE, 0);
4738 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
4739 gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 5);
4741 label = gtk_label_new ("Digits :");
4742 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4743 gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
4745 adjustment = gtk_adjustment_new (2, 1, 15, 1, 1, 0);
4746 spinner2 = gtk_spin_button_new (adjustment, 0.0, 0);
4747 g_signal_connect (adjustment, "value_changed",
4748 G_CALLBACK (change_digits),
4750 gtk_box_pack_start (GTK_BOX (vbox2), spinner2, FALSE, TRUE, 0);
4752 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4753 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 5);
4755 button = gtk_check_button_new_with_label ("Snap to 0.5-ticks");
4756 g_signal_connect (button, "clicked",
4757 G_CALLBACK (toggle_snap),
4759 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4760 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4762 button = gtk_check_button_new_with_label ("Numeric only input mode");
4763 g_signal_connect (button, "clicked",
4764 G_CALLBACK (toggle_numeric),
4766 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
4767 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
4769 val_label = gtk_label_new ("");
4771 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4772 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
4774 button = gtk_button_new_with_label ("Value as Int");
4775 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4776 g_signal_connect (button, "clicked",
4777 G_CALLBACK (get_value),
4778 GINT_TO_POINTER (1));
4779 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4781 button = gtk_button_new_with_label ("Value as Float");
4782 g_object_set_data (G_OBJECT (button), "user_data", val_label);
4783 g_signal_connect (button, "clicked",
4784 G_CALLBACK (get_value),
4785 GINT_TO_POINTER (2));
4786 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4788 gtk_box_pack_start (GTK_BOX (vbox), val_label, TRUE, TRUE, 0);
4789 gtk_label_set_text (GTK_LABEL (val_label), "0");
4791 frame = gtk_frame_new ("Using Convenience Constructor");
4792 gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
4794 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4795 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4796 gtk_container_add (GTK_CONTAINER (frame), hbox);
4798 val_label = gtk_label_new ("0.0");
4800 spinner = gtk_spin_button_new_with_range (0.0, 10.0, 0.009);
4801 gtk_spin_button_set_value (GTK_SPIN_BUTTON (spinner), 0.0);
4802 g_signal_connect (spinner, "value_changed",
4803 G_CALLBACK (get_spin_value), val_label);
4804 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 5);
4805 gtk_box_pack_start (GTK_BOX (hbox), val_label, TRUE, TRUE, 5);
4807 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4808 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
4810 button = gtk_button_new_with_label ("Close");
4811 g_signal_connect_swapped (button, "clicked",
4812 G_CALLBACK (gtk_widget_destroy),
4814 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
4817 if (!gtk_widget_get_visible (window))
4818 gtk_widget_show_all (window);
4820 gtk_widget_destroy (window);
4829 cursor_draw (GtkWidget *widget,
4834 GtkStyleContext *context;
4837 width = gtk_widget_get_allocated_width (widget);
4838 height = gtk_widget_get_allocated_height (widget);
4840 cairo_set_source_rgb (cr, 1, 1, 1);
4841 cairo_rectangle (cr, 0, 0, width, height / 2);
4844 cairo_set_source_rgb (cr, 0, 0, 0);
4845 cairo_rectangle (cr, 0, height / 2, width, height / 2);
4848 context = gtk_widget_get_style_context (widget);
4849 gtk_style_context_get_background_color (context, GTK_STATE_FLAG_NORMAL, &bg);
4850 gdk_cairo_set_source_rgba (cr, &bg);
4851 cairo_rectangle (cr, width / 3, height / 3, width / 3, height / 3);
4858 set_cursor (GtkWidget *spinner,
4867 c = CLAMP (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spinner)), 0, 152);
4870 label = g_object_get_data (G_OBJECT (spinner), "user_data");
4872 class = g_type_class_ref (GDK_TYPE_CURSOR_TYPE);
4873 vals = class->values;
4875 while (vals && vals->value != c)
4878 gtk_label_set_text (GTK_LABEL (label), vals->value_nick);
4880 gtk_label_set_text (GTK_LABEL (label), "<unknown>");
4882 g_type_class_unref (class);
4884 cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), c);
4885 gdk_window_set_cursor (gtk_widget_get_window (widget),
4887 g_object_unref (cursor);
4891 cursor_event (GtkWidget *widget,
4893 GtkSpinButton *spinner)
4895 if ((event->type == GDK_BUTTON_PRESS) &&
4896 ((event->button.button == 1) ||
4897 (event->button.button == 3)))
4899 gtk_spin_button_spin (spinner, event->button.button == 1 ?
4900 GTK_SPIN_STEP_FORWARD : GTK_SPIN_STEP_BACKWARD, 0);
4907 #ifdef GDK_WINDOWING_X11
4908 #include "x11/gdkx.h"
4911 change_cursor_theme (GtkWidget *widget,
4918 children = gtk_container_get_children (GTK_CONTAINER (data));
4920 theme = gtk_entry_get_text (GTK_ENTRY (children->next->data));
4921 size = (gint) gtk_spin_button_get_value (GTK_SPIN_BUTTON (children->next->next->data));
4923 g_list_free (children);
4925 gdk_x11_display_set_cursor_theme (gtk_widget_get_display (widget),
4932 create_cursors (GtkWidget *widget)
4934 static GtkWidget *window = NULL;
4937 GtkWidget *main_vbox;
4944 GtkAdjustment *adjustment;
4950 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
4951 gtk_window_set_screen (GTK_WINDOW (window),
4952 gtk_widget_get_screen (widget));
4954 g_signal_connect (window, "destroy",
4955 G_CALLBACK (gtk_widget_destroyed),
4958 gtk_window_set_title (GTK_WINDOW (window), "Cursors");
4960 main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
4961 gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 0);
4962 gtk_container_add (GTK_CONTAINER (window), main_vbox);
4965 g_object_new (GTK_TYPE_BOX,
4966 "orientation", GTK_ORIENTATION_VERTICAL,
4967 "GtkBox::homogeneous", FALSE,
4968 "GtkBox::spacing", 5,
4969 "GtkContainer::border_width", 10,
4970 "GtkWidget::parent", main_vbox,
4971 "GtkWidget::visible", TRUE,
4974 #ifdef GDK_WINDOWING_X11
4975 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4976 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4977 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
4979 label = gtk_label_new ("Cursor Theme : ");
4980 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
4981 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
4983 entry = gtk_entry_new ();
4984 gtk_entry_set_text (GTK_ENTRY (entry), "default");
4985 gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, TRUE, 0);
4987 size = gtk_spin_button_new_with_range (1.0, 64.0, 1.0);
4988 gtk_spin_button_set_value (GTK_SPIN_BUTTON (size), 24.0);
4989 gtk_box_pack_start (GTK_BOX (hbox), size, TRUE, TRUE, 0);
4991 g_signal_connect (entry, "changed",
4992 G_CALLBACK (change_cursor_theme), hbox);
4993 g_signal_connect (size, "changed",
4994 G_CALLBACK (change_cursor_theme), hbox);
4997 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
4998 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
4999 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
5001 label = gtk_label_new ("Cursor Value : ");
5002 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
5003 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
5005 adjustment = gtk_adjustment_new (0,
5009 spinner = gtk_spin_button_new (adjustment, 0, 0);
5010 gtk_box_pack_start (GTK_BOX (hbox), spinner, TRUE, TRUE, 0);
5013 g_object_new (gtk_frame_get_type (),
5014 "GtkFrame::label_xalign", 0.5,
5015 "GtkFrame::label", "Cursor Area",
5016 "GtkContainer::border_width", 10,
5017 "GtkWidget::parent", vbox,
5018 "GtkWidget::visible", TRUE,
5021 darea = gtk_drawing_area_new ();
5022 gtk_widget_set_size_request (darea, 80, 80);
5023 gtk_container_add (GTK_CONTAINER (frame), darea);
5024 g_signal_connect (darea,
5026 G_CALLBACK (cursor_draw),
5028 gtk_widget_set_events (darea, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
5029 g_signal_connect (darea,
5030 "button_press_event",
5031 G_CALLBACK (cursor_event),
5033 gtk_widget_show (darea);
5035 g_signal_connect (spinner, "changed",
5036 G_CALLBACK (set_cursor),
5039 label = g_object_new (GTK_TYPE_LABEL,
5044 gtk_container_child_set (GTK_CONTAINER (vbox), label,
5047 g_object_set_data (G_OBJECT (spinner), "user_data", label);
5050 g_object_new (gtk_hseparator_get_type (),
5051 "GtkWidget::visible", TRUE,
5053 gtk_box_pack_start (GTK_BOX (main_vbox), any, FALSE, TRUE, 0);
5055 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
5056 gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
5057 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, TRUE, 0);
5059 button = gtk_button_new_with_label ("Close");
5060 g_signal_connect_swapped (button, "clicked",
5061 G_CALLBACK (gtk_widget_destroy),
5063 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
5065 gtk_widget_show_all (window);
5067 set_cursor (spinner, darea);
5070 gtk_widget_destroy (window);
5078 color_selection_ok (GtkWidget *w,
5079 GtkColorSelectionDialog *cs)
5081 GtkWidget *colorsel;
5084 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5086 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5087 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5091 color_selection_changed (GtkWidget *w,
5092 GtkColorSelectionDialog *cs)
5094 GtkWidget *colorsel;
5097 colorsel = gtk_color_selection_dialog_get_color_selection (cs);
5098 gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5099 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (colorsel), &color);
5104 opacity_toggled_cb (GtkWidget *w,
5105 GtkColorSelectionDialog *cs)
5107 GtkColorSelection *colorsel;
5109 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5110 gtk_color_selection_set_has_opacity_control (colorsel,
5111 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5115 palette_toggled_cb (GtkWidget *w,
5116 GtkColorSelectionDialog *cs)
5118 GtkColorSelection *colorsel;
5120 colorsel = GTK_COLOR_SELECTION (cs->colorsel);
5121 gtk_color_selection_set_has_palette (colorsel,
5122 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w)));
5127 create_color_selection (GtkWidget *widget)
5129 static GtkWidget *window = NULL;
5138 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5139 gtk_window_set_screen (GTK_WINDOW (window),
5140 gtk_widget_get_screen (widget));
5142 g_signal_connect (window, "destroy",
5143 G_CALLBACK (gtk_widget_destroyed),
5146 gtk_window_set_title (GTK_WINDOW (window), "GtkColorButton");
5147 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5149 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
5150 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5151 gtk_container_add (GTK_CONTAINER (window), hbox);
5153 label = gtk_label_new ("Pick a color");
5154 gtk_container_add (GTK_CONTAINER (hbox), label);
5156 picker = gtk_color_button_new ();
5157 gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON (picker), TRUE);
5158 gtk_container_add (GTK_CONTAINER (hbox), picker);
5160 button = gtk_button_new_with_mnemonic ("_Props");
5161 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
5162 g_signal_connect (button, "clicked",
5163 G_CALLBACK (props_clicked),
5167 if (!gtk_widget_get_visible (window))
5168 gtk_widget_show_all (window);
5170 gtk_widget_destroy (window);
5174 flipping_toggled_cb (GtkWidget *widget, gpointer data)
5176 int state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
5177 int new_direction = state ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR;
5179 gtk_widget_set_default_direction (new_direction);
5183 orientable_toggle_orientation (GtkOrientable *orientable)
5185 GtkOrientation orientation;
5187 orientation = gtk_orientable_get_orientation (orientable);
5188 gtk_orientable_set_orientation (orientable,
5189 orientation == GTK_ORIENTATION_HORIZONTAL ?
5190 GTK_ORIENTATION_VERTICAL :
5191 GTK_ORIENTATION_HORIZONTAL);
5193 if (GTK_IS_CONTAINER (orientable))
5198 children = gtk_container_get_children (GTK_CONTAINER (orientable));
5200 for (child = children; child; child = child->next)
5202 if (GTK_IS_ORIENTABLE (child->data))
5203 orientable_toggle_orientation (child->data);
5206 g_list_free (children);
5211 flipping_orientation_toggled_cb (GtkWidget *widget, gpointer data)
5213 GtkWidget *content_area;
5214 GtkWidget *toplevel;
5216 toplevel = gtk_widget_get_toplevel (widget);
5217 content_area = gtk_dialog_get_content_area (GTK_DIALOG (toplevel));
5218 orientable_toggle_orientation (GTK_ORIENTABLE (content_area));
5222 set_direction_recurse (GtkWidget *widget,
5225 GtkTextDirection *dir = data;
5227 gtk_widget_set_direction (widget, *dir);
5228 if (GTK_IS_CONTAINER (widget))
5229 gtk_container_foreach (GTK_CONTAINER (widget),
5230 set_direction_recurse,
5235 create_forward_back (const char *title,
5236 GtkTextDirection text_dir)
5238 GtkWidget *frame = gtk_frame_new (title);
5239 GtkWidget *bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
5240 GtkWidget *back_button = gtk_button_new_from_stock (GTK_STOCK_GO_BACK);
5241 GtkWidget *forward_button = gtk_button_new_from_stock (GTK_STOCK_GO_FORWARD);
5243 gtk_container_set_border_width (GTK_CONTAINER (bbox), 5);
5245 gtk_container_add (GTK_CONTAINER (frame), bbox);
5246 gtk_container_add (GTK_CONTAINER (bbox), back_button);
5247 gtk_container_add (GTK_CONTAINER (bbox), forward_button);
5249 set_direction_recurse (frame, &text_dir);
5255 create_flipping (GtkWidget *widget)
5257 static GtkWidget *window = NULL;
5258 GtkWidget *check_button, *button;
5259 GtkWidget *action_area, *content_area;
5263 window = gtk_dialog_new ();
5265 gtk_window_set_screen (GTK_WINDOW (window),
5266 gtk_widget_get_screen (widget));
5268 g_signal_connect (window, "destroy",
5269 G_CALLBACK (gtk_widget_destroyed),
5272 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5273 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
5275 gtk_window_set_title (GTK_WINDOW (window), "Bidirectional Flipping");
5277 check_button = gtk_check_button_new_with_label ("Right-to-left global direction");
5278 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5279 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5281 if (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL)
5282 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), TRUE);
5284 g_signal_connect (check_button, "toggled",
5285 G_CALLBACK (flipping_toggled_cb), NULL);
5287 check_button = gtk_check_button_new_with_label ("Toggle orientation of all boxes");
5288 gtk_container_set_border_width (GTK_CONTAINER (check_button), 10);
5289 gtk_box_pack_start (GTK_BOX (content_area), check_button, TRUE, TRUE, 0);
5291 g_signal_connect (check_button, "toggled",
5292 G_CALLBACK (flipping_orientation_toggled_cb), NULL);
5294 gtk_box_pack_start (GTK_BOX (content_area),
5295 create_forward_back ("Default", GTK_TEXT_DIR_NONE),
5298 gtk_box_pack_start (GTK_BOX (content_area),
5299 create_forward_back ("Left-to-Right", GTK_TEXT_DIR_LTR),
5302 gtk_box_pack_start (GTK_BOX (content_area),
5303 create_forward_back ("Right-to-Left", GTK_TEXT_DIR_RTL),
5306 button = gtk_button_new_with_label ("Close");
5307 g_signal_connect_swapped (button, "clicked",
5308 G_CALLBACK (gtk_widget_destroy), window);
5309 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5312 if (!gtk_widget_get_visible (window))
5313 gtk_widget_show_all (window);
5315 gtk_widget_destroy (window);
5323 make_focus_table (GList **list)
5328 table = gtk_table_new (5, 5, FALSE);
5341 widget = gtk_entry_new ();
5343 widget = gtk_button_new_with_label ("Foo");
5345 *list = g_list_prepend (*list, widget);
5347 gtk_table_attach (GTK_TABLE (table),
5351 GTK_EXPAND | GTK_FILL,
5352 GTK_EXPAND | GTK_FILL,
5361 *list = g_list_reverse (*list);
5367 create_focus (GtkWidget *widget)
5369 static GtkWidget *window = NULL;
5373 GtkWidget *content_area;
5378 window = gtk_dialog_new_with_buttons ("Keyboard focus navigation",
5384 gtk_window_set_screen (GTK_WINDOW (window),
5385 gtk_widget_get_screen (widget));
5387 g_signal_connect (window, "destroy",
5388 G_CALLBACK (gtk_widget_destroyed),
5391 g_signal_connect (window, "response",
5392 G_CALLBACK (gtk_widget_destroy),
5395 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
5397 gtk_window_set_title (GTK_WINDOW (window), "Keyboard Focus Navigation");
5399 frame = gtk_frame_new ("Weird tab focus chain");
5401 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5403 table = make_focus_table (&list);
5405 gtk_container_add (GTK_CONTAINER (frame), table);
5407 gtk_container_set_focus_chain (GTK_CONTAINER (table),
5412 frame = gtk_frame_new ("Default tab focus chain");
5414 gtk_box_pack_start (GTK_BOX (content_area), frame, TRUE, TRUE, 0);
5417 table = make_focus_table (&list);
5421 gtk_container_add (GTK_CONTAINER (frame), table);
5424 if (!gtk_widget_get_visible (window))
5425 gtk_widget_show_all (window);
5427 gtk_widget_destroy (window);
5435 font_selection_ok (GtkWidget *w,
5436 GtkFontSelectionDialog *fs)
5438 gchar *s = gtk_font_selection_dialog_get_font_name (fs);
5440 g_print ("%s\n", s);
5442 gtk_widget_destroy (GTK_WIDGET (fs));
5446 create_font_selection (GtkWidget *widget)
5448 static GtkWidget *window = NULL;
5456 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5457 gtk_window_set_screen (GTK_WINDOW (window),
5458 gtk_widget_get_screen (widget));
5460 g_signal_connect (window, "destroy",
5461 G_CALLBACK (gtk_widget_destroyed),
5464 gtk_window_set_title (GTK_WINDOW (window), "GtkFontButton");
5465 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5467 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
5468 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
5469 gtk_container_add (GTK_CONTAINER (window), hbox);
5471 label = gtk_label_new ("Pick a font");
5472 gtk_container_add (GTK_CONTAINER (hbox), label);
5474 picker = gtk_font_button_new ();
5475 gtk_font_button_set_use_font (GTK_FONT_BUTTON (picker), TRUE);
5476 gtk_container_add (GTK_CONTAINER (hbox), picker);
5479 if (!gtk_widget_get_visible (window))
5480 gtk_widget_show_all (window);
5482 gtk_widget_destroy (window);
5489 static GtkWidget *dialog_window = NULL;
5492 label_toggle (GtkWidget *widget,
5497 *label = gtk_label_new ("Dialog Test");
5498 g_signal_connect (*label,
5500 G_CALLBACK (gtk_widget_destroyed),
5502 gtk_misc_set_padding (GTK_MISC (*label), 10, 10);
5503 gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog_window))),
5504 *label, TRUE, TRUE, 0);
5505 gtk_widget_show (*label);
5508 gtk_widget_destroy (*label);
5512 create_dialog (GtkWidget *widget)
5514 static GtkWidget *label;
5515 GtkWidget *action_area;
5520 /* This is a terrible example; it's much simpler to create
5521 * dialogs than this. Don't use testgtk for example code,
5525 dialog_window = gtk_dialog_new ();
5526 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5527 gtk_widget_get_screen (widget));
5529 g_signal_connect (dialog_window, "destroy",
5530 G_CALLBACK (gtk_widget_destroyed),
5533 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5535 gtk_window_set_title (GTK_WINDOW (dialog_window), "GtkDialog");
5536 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5538 button = gtk_button_new_with_label ("OK");
5539 gtk_widget_set_can_default (button, TRUE);
5540 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5541 gtk_widget_grab_default (button);
5542 gtk_widget_show (button);
5544 button = gtk_button_new_with_label ("Toggle");
5545 g_signal_connect (button, "clicked",
5546 G_CALLBACK (label_toggle),
5548 gtk_widget_set_can_default (button, TRUE);
5549 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5550 gtk_widget_show (button);
5555 if (!gtk_widget_get_visible (dialog_window))
5556 gtk_widget_show (dialog_window);
5558 gtk_widget_destroy (dialog_window);
5561 /* Display & Screen test
5568 GtkWidget *radio_dpy;
5569 GtkWidget *toplevel;
5570 GtkWidget *dialog_window;
5571 } ScreenDisplaySelection;
5574 screen_display_check (GtkWidget *widget, ScreenDisplaySelection *data)
5576 const gchar *display_name;
5577 GdkDisplay *display = gtk_widget_get_display (widget);
5579 GdkScreen *new_screen = NULL;
5580 GdkScreen *current_screen = gtk_widget_get_screen (widget);
5582 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->radio_dpy)))
5584 display_name = gtk_entry_get_text (GTK_ENTRY (data->entry));
5585 display = gdk_display_open (display_name);
5589 dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
5590 GTK_DIALOG_DESTROY_WITH_PARENT,
5593 "The display :\n%s\ncannot be opened",
5595 gtk_window_set_screen (GTK_WINDOW (dialog), current_screen);
5596 gtk_widget_show (dialog);
5597 g_signal_connect (dialog, "response",
5598 G_CALLBACK (gtk_widget_destroy),
5603 GtkTreeModel *model = gtk_combo_box_get_model (GTK_COMBO_BOX (data->combo));
5606 gboolean found = FALSE;
5607 while (gtk_tree_model_iter_nth_child (model, &iter, NULL, i++))
5610 gtk_tree_model_get (model, &iter, 0, &name, -1);
5611 found = !g_ascii_strcasecmp (display_name, name);
5618 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (data->combo), display_name);
5619 new_screen = gdk_display_get_default_screen (display);
5624 gint number_of_screens = gdk_display_get_n_screens (display);
5625 gint screen_num = gdk_screen_get_number (current_screen);
5626 if ((screen_num +1) < number_of_screens)
5627 new_screen = gdk_display_get_screen (display, screen_num + 1);
5629 new_screen = gdk_display_get_screen (display, 0);
5634 gtk_window_set_screen (GTK_WINDOW (data->toplevel), new_screen);
5635 gtk_widget_destroy (data->dialog_window);
5640 screen_display_destroy_diag (GtkWidget *widget, GtkWidget *data)
5642 gtk_widget_destroy (data);
5646 create_display_screen (GtkWidget *widget)
5648 GtkWidget *table, *frame, *window, *combo_dpy, *vbox;
5649 GtkWidget *radio_dpy, *radio_scr, *applyb, *cancelb;
5651 ScreenDisplaySelection *scr_dpy_data;
5652 GdkScreen *screen = gtk_widget_get_screen (widget);
5653 GdkDisplay *display = gdk_screen_get_display (screen);
5655 window = g_object_new (gtk_window_get_type (),
5658 "type", GTK_WINDOW_TOPLEVEL,
5660 "Screen or Display selection",
5661 "border_width", 10, NULL);
5662 g_signal_connect (window, "destroy",
5663 G_CALLBACK (gtk_widget_destroy), NULL);
5665 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
5666 gtk_container_add (GTK_CONTAINER (window), vbox);
5668 frame = gtk_frame_new ("Select screen or display");
5669 gtk_container_add (GTK_CONTAINER (vbox), frame);
5671 table = gtk_table_new (2, 2, TRUE);
5672 gtk_table_set_row_spacings (GTK_TABLE (table), 3);
5673 gtk_table_set_col_spacings (GTK_TABLE (table), 3);
5675 gtk_container_add (GTK_CONTAINER (frame), table);
5677 radio_dpy = gtk_radio_button_new_with_label (NULL, "move to another X display");
5678 if (gdk_display_get_n_screens(display) > 1)
5679 radio_scr = gtk_radio_button_new_with_label
5680 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)), "move to next screen");
5683 radio_scr = gtk_radio_button_new_with_label
5684 (gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_dpy)),
5685 "only one screen on the current display");
5686 gtk_widget_set_sensitive (radio_scr, FALSE);
5688 combo_dpy = gtk_combo_box_text_new_with_entry ();
5689 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo_dpy), "diabolo:0.0");
5690 gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (combo_dpy))),
5691 "<hostname>:<X Server Num>.<Screen Num>");
5693 gtk_table_attach_defaults (GTK_TABLE (table), radio_dpy, 0, 1, 0, 1);
5694 gtk_table_attach_defaults (GTK_TABLE (table), radio_scr, 0, 1, 1, 2);
5695 gtk_table_attach_defaults (GTK_TABLE (table), combo_dpy, 1, 2, 0, 1);
5697 bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
5698 applyb = gtk_button_new_from_stock (GTK_STOCK_APPLY);
5699 cancelb = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
5701 gtk_container_add (GTK_CONTAINER (vbox), bbox);
5703 gtk_container_add (GTK_CONTAINER (bbox), applyb);
5704 gtk_container_add (GTK_CONTAINER (bbox), cancelb);
5706 scr_dpy_data = g_new0 (ScreenDisplaySelection, 1);
5708 scr_dpy_data->entry = gtk_bin_get_child (GTK_BIN (combo_dpy));
5709 scr_dpy_data->radio_dpy = radio_dpy;
5710 scr_dpy_data->toplevel = gtk_widget_get_toplevel (widget);
5711 scr_dpy_data->dialog_window = window;
5713 g_signal_connect (cancelb, "clicked",
5714 G_CALLBACK (screen_display_destroy_diag), window);
5715 g_signal_connect (applyb, "clicked",
5716 G_CALLBACK (screen_display_check), scr_dpy_data);
5717 gtk_widget_show_all (window);
5722 static gulong event_watcher_enter_id = 0;
5723 static gulong event_watcher_leave_id = 0;
5726 event_watcher (GSignalInvocationHint *ihint,
5727 guint n_param_values,
5728 const GValue *param_values,
5731 g_print ("Watch: \"%s\" emitted for %s\n",
5732 g_signal_name (ihint->signal_id),
5733 G_OBJECT_TYPE_NAME (g_value_get_object (param_values + 0)));
5739 event_watcher_down (void)
5741 if (event_watcher_enter_id)
5745 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5746 g_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
5747 event_watcher_enter_id = 0;
5748 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5749 g_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
5750 event_watcher_leave_id = 0;
5755 event_watcher_toggle (void)
5757 if (event_watcher_enter_id)
5758 event_watcher_down ();
5763 signal_id = g_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
5764 event_watcher_enter_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5765 signal_id = g_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
5766 event_watcher_leave_id = g_signal_add_emission_hook (signal_id, 0, event_watcher, NULL, NULL);
5771 create_event_watcher (GtkWidget *widget)
5773 GtkWidget *action_area, *content_area;
5778 dialog_window = gtk_dialog_new ();
5779 gtk_window_set_screen (GTK_WINDOW (dialog_window),
5780 gtk_widget_get_screen (widget));
5782 g_signal_connect (dialog_window, "destroy",
5783 G_CALLBACK (gtk_widget_destroyed),
5785 g_signal_connect (dialog_window, "destroy",
5786 G_CALLBACK (event_watcher_down),
5789 content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog_window));
5790 action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog_window));
5792 gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
5793 gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
5794 gtk_widget_set_size_request (dialog_window, 200, 110);
5796 button = gtk_toggle_button_new_with_label ("Activate Watch");
5797 g_signal_connect (button, "clicked",
5798 G_CALLBACK (event_watcher_toggle),
5800 gtk_container_set_border_width (GTK_CONTAINER (button), 10);
5801 gtk_box_pack_start (GTK_BOX (content_area), button, TRUE, TRUE, 0);
5802 gtk_widget_show (button);
5804 button = gtk_button_new_with_label ("Close");
5805 g_signal_connect_swapped (button, "clicked",
5806 G_CALLBACK (gtk_widget_destroy),
5808 gtk_widget_set_can_default (button, TRUE);
5809 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
5810 gtk_widget_grab_default (button);
5811 gtk_widget_show (button);
5814 if (!gtk_widget_get_visible (dialog_window))
5815 gtk_widget_show (dialog_window);
5817 gtk_widget_destroy (dialog_window);
5825 reformat_value (GtkScale *scale,
5828 return g_strdup_printf ("-->%0.*g<--",
5829 gtk_scale_get_digits (scale), value);
5833 create_range_controls (GtkWidget *widget)
5835 static GtkWidget *window = NULL;
5839 GtkWidget *scrollbar;
5841 GtkWidget *separator;
5842 GtkAdjustment *adjustment;
5847 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
5849 gtk_window_set_screen (GTK_WINDOW (window),
5850 gtk_widget_get_screen (widget));
5852 g_signal_connect (window, "destroy",
5853 G_CALLBACK (gtk_widget_destroyed),
5856 gtk_window_set_title (GTK_WINDOW (window), "range controls");
5857 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
5860 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
5861 gtk_container_add (GTK_CONTAINER (window), box1);
5862 gtk_widget_show (box1);
5865 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
5866 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5867 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
5868 gtk_widget_show (box2);
5871 adjustment = gtk_adjustment_new (0.0, 0.0, 101.0, 0.1, 1.0, 1.0);
5873 scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5874 gtk_widget_set_size_request (GTK_WIDGET (scale), 150, -1);
5875 gtk_scale_set_digits (GTK_SCALE (scale), 1);
5876 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5877 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
5878 gtk_widget_show (scale);
5880 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5881 gtk_box_pack_start (GTK_BOX (box2), scrollbar, TRUE, TRUE, 0);
5882 gtk_widget_show (scrollbar);
5884 scale = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (adjustment));
5885 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5886 g_signal_connect (scale,
5888 G_CALLBACK (reformat_value),
5890 gtk_box_pack_start (GTK_BOX (box2), scale, TRUE, TRUE, 0);
5891 gtk_widget_show (scale);
5893 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
5895 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5896 gtk_widget_set_size_request (scale, -1, 200);
5897 gtk_scale_set_digits (GTK_SCALE (scale), 2);
5898 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5899 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5900 gtk_widget_show (scale);
5902 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5903 gtk_widget_set_size_request (scale, -1, 200);
5904 gtk_scale_set_digits (GTK_SCALE (scale), 2);
5905 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5906 gtk_range_set_inverted (GTK_RANGE (scale), TRUE);
5907 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5908 gtk_widget_show (scale);
5910 scale = gtk_scale_new (GTK_ORIENTATION_VERTICAL, GTK_ADJUSTMENT (adjustment));
5911 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
5912 g_signal_connect (scale,
5914 G_CALLBACK (reformat_value),
5916 gtk_box_pack_start (GTK_BOX (hbox), scale, TRUE, TRUE, 0);
5917 gtk_widget_show (scale);
5920 gtk_box_pack_start (GTK_BOX (box2), hbox, TRUE, TRUE, 0);
5921 gtk_widget_show (hbox);
5923 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
5924 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
5925 gtk_widget_show (separator);
5928 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
5929 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
5930 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
5931 gtk_widget_show (box2);
5934 button = gtk_button_new_with_label ("close");
5935 g_signal_connect_swapped (button, "clicked",
5936 G_CALLBACK (gtk_widget_destroy),
5938 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
5939 gtk_widget_set_can_default (button, TRUE);
5940 gtk_widget_grab_default (button);
5941 gtk_widget_show (button);
5944 if (!gtk_widget_get_visible (window))
5945 gtk_widget_show (window);
5947 gtk_widget_destroy (window);
5954 { { 0, 0x0000, 0x0000, 0x0000 }, "black" },
5955 { { 0, 0xFFFF, 0xFFFF, 0xFFFF }, "white" },
5956 { { 0, 0xFFFF, 0x0000, 0x0000 }, "red" },
5957 { { 0, 0x0000, 0xFFFF, 0x0000 }, "green" },
5958 { { 0, 0x0000, 0x0000, 0xFFFF }, "blue" },
5959 { { 0, 0x0000, 0xFFFF, 0xFFFF }, "cyan" },
5960 { { 0, 0xFFFF, 0x0000, 0xFFFF }, "magenta" },
5961 { { 0, 0xFFFF, 0xFFFF, 0x0000 }, "yellow" }
5964 int ntext_colors = sizeof(text_colors) / sizeof(text_colors[0]);
5970 static const char * book_open_xpm[] = {
5993 static const char * book_closed_xpm[] = {
6018 GdkPixbuf *book_open;
6019 GdkPixbuf *book_closed;
6020 GtkWidget *sample_notebook;
6023 set_page_image (GtkNotebook *notebook, gint page_num, GdkPixbuf *pixbuf)
6025 GtkWidget *page_widget;
6028 page_widget = gtk_notebook_get_nth_page (notebook, page_num);
6030 pixwid = g_object_get_data (G_OBJECT (page_widget), "tab_pixmap");
6031 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6033 pixwid = g_object_get_data (G_OBJECT (page_widget), "menu_pixmap");
6034 gtk_image_set_from_pixbuf (GTK_IMAGE (pixwid), pixbuf);
6038 page_switch (GtkWidget *widget, gpointer *page, gint page_num)
6040 GtkNotebook *notebook = GTK_NOTEBOOK (widget);
6041 gint old_page_num = gtk_notebook_get_current_page (notebook);
6043 if (page_num == old_page_num)
6046 set_page_image (notebook, page_num, book_open);
6048 if (old_page_num != -1)
6049 set_page_image (notebook, old_page_num, book_closed);
6053 tab_fill (GtkToggleButton *button, GtkWidget *child)
6055 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
6056 "tab-fill", gtk_toggle_button_get_active (button),
6061 tab_expand (GtkToggleButton *button, GtkWidget *child)
6063 gtk_container_child_set (GTK_CONTAINER (sample_notebook), child,
6064 "tab-expand", gtk_toggle_button_get_active (button),
6069 create_pages (GtkNotebook *notebook, gint start, gint end)
6071 GtkWidget *child = NULL;
6076 GtkWidget *label_box;
6077 GtkWidget *menu_box;
6081 char accel_buffer[32];
6083 for (i = start; i <= end; i++)
6085 sprintf (buffer, "Page %d", i);
6086 sprintf (accel_buffer, "Page _%d", i);
6088 child = gtk_frame_new (buffer);
6089 gtk_container_set_border_width (GTK_CONTAINER (child), 10);
6091 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6092 gtk_box_set_homogeneous (GTK_BOX (vbox), TRUE);
6093 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
6094 gtk_container_add (GTK_CONTAINER (child), vbox);
6096 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6097 gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE);
6098 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 5);
6100 button = gtk_check_button_new_with_label ("Fill Tab");
6101 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6102 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
6103 g_signal_connect (button, "toggled",
6104 G_CALLBACK (tab_fill), child);
6106 button = gtk_check_button_new_with_label ("Expand Tab");
6107 gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 5);
6108 g_signal_connect (button, "toggled",
6109 G_CALLBACK (tab_expand), child);
6111 button = gtk_button_new_with_label ("Hide Page");
6112 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 5);
6113 g_signal_connect_swapped (button, "clicked",
6114 G_CALLBACK (gtk_widget_hide),
6117 gtk_widget_show_all (child);
6119 label_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6120 pixwid = gtk_image_new_from_pixbuf (book_closed);
6121 g_object_set_data (G_OBJECT (child), "tab_pixmap", pixwid);
6123 gtk_box_pack_start (GTK_BOX (label_box), pixwid, FALSE, TRUE, 0);
6124 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6125 label = gtk_label_new_with_mnemonic (accel_buffer);
6126 gtk_box_pack_start (GTK_BOX (label_box), label, FALSE, TRUE, 0);
6127 gtk_widget_show_all (label_box);
6130 menu_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6131 pixwid = gtk_image_new_from_pixbuf (book_closed);
6132 g_object_set_data (G_OBJECT (child), "menu_pixmap", pixwid);
6134 gtk_box_pack_start (GTK_BOX (menu_box), pixwid, FALSE, TRUE, 0);
6135 gtk_misc_set_padding (GTK_MISC (pixwid), 3, 1);
6136 label = gtk_label_new (buffer);
6137 gtk_box_pack_start (GTK_BOX (menu_box), label, FALSE, TRUE, 0);
6138 gtk_widget_show_all (menu_box);
6140 gtk_notebook_append_page_menu (notebook, child, label_box, menu_box);
6145 rotate_notebook (GtkButton *button,
6146 GtkNotebook *notebook)
6148 gtk_notebook_set_tab_pos (notebook, (gtk_notebook_get_tab_pos (notebook) + 1) % 4);
6152 show_all_pages (GtkButton *button,
6153 GtkNotebook *notebook)
6155 gtk_container_foreach (GTK_CONTAINER (notebook),
6156 (GtkCallback) gtk_widget_show, NULL);
6160 notebook_type_changed (GtkWidget *optionmenu,
6163 GtkNotebook *notebook;
6173 notebook = GTK_NOTEBOOK (data);
6175 c = gtk_combo_box_get_active (GTK_COMBO_BOX (optionmenu));
6180 /* standard notebook */
6181 gtk_notebook_set_show_tabs (notebook, TRUE);
6182 gtk_notebook_set_show_border (notebook, TRUE);
6183 gtk_notebook_set_scrollable (notebook, FALSE);
6187 /* notabs notebook */
6188 gtk_notebook_set_show_tabs (notebook, FALSE);
6189 gtk_notebook_set_show_border (notebook, TRUE);
6194 gtk_notebook_set_show_tabs (notebook, FALSE);
6195 gtk_notebook_set_show_border (notebook, FALSE);
6200 gtk_notebook_set_show_tabs (notebook, TRUE);
6201 gtk_notebook_set_show_border (notebook, TRUE);
6202 gtk_notebook_set_scrollable (notebook, TRUE);
6203 if (gtk_notebook_get_n_pages (notebook) == 5)
6204 create_pages (notebook, 6, 15);
6210 if (gtk_notebook_get_n_pages (notebook) == 15)
6211 for (i = 0; i < 10; i++)
6212 gtk_notebook_remove_page (notebook, 5);
6216 notebook_popup (GtkToggleButton *button,
6217 GtkNotebook *notebook)
6219 if (gtk_toggle_button_get_active (button))
6220 gtk_notebook_popup_enable (notebook);
6222 gtk_notebook_popup_disable (notebook);
6226 create_notebook (GtkWidget *widget)
6228 static GtkWidget *window = NULL;
6232 GtkWidget *separator;
6236 static gchar *items[] =
6246 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6247 gtk_window_set_screen (GTK_WINDOW (window),
6248 gtk_widget_get_screen (widget));
6250 g_signal_connect (window, "destroy",
6251 G_CALLBACK (gtk_widget_destroyed),
6254 gtk_window_set_title (GTK_WINDOW (window), "notebook");
6255 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6257 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6258 gtk_container_add (GTK_CONTAINER (window), box1);
6260 sample_notebook = gtk_notebook_new ();
6261 g_signal_connect (sample_notebook, "switch_page",
6262 G_CALLBACK (page_switch), NULL);
6263 gtk_notebook_set_tab_pos (GTK_NOTEBOOK (sample_notebook), GTK_POS_TOP);
6264 gtk_box_pack_start (GTK_BOX (box1), sample_notebook, TRUE, TRUE, 0);
6265 gtk_container_set_border_width (GTK_CONTAINER (sample_notebook), 10);
6267 gtk_widget_realize (sample_notebook);
6270 book_open = gdk_pixbuf_new_from_xpm_data (book_open_xpm);
6273 book_closed = gdk_pixbuf_new_from_xpm_data (book_closed_xpm);
6275 create_pages (GTK_NOTEBOOK (sample_notebook), 1, 5);
6277 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
6278 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 10);
6280 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
6281 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6282 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6284 button = gtk_check_button_new_with_label ("popup menu");
6285 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, FALSE, 0);
6286 g_signal_connect (button, "clicked",
6287 G_CALLBACK (notebook_popup),
6290 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
6291 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6292 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6294 label = gtk_label_new ("Notebook Style :");
6295 gtk_box_pack_start (GTK_BOX (box2), label, FALSE, TRUE, 0);
6297 omenu = build_option_menu (items, G_N_ELEMENTS (items), 0,
6298 notebook_type_changed,
6300 gtk_box_pack_start (GTK_BOX (box2), omenu, FALSE, TRUE, 0);
6302 button = gtk_button_new_with_label ("Show all Pages");
6303 gtk_box_pack_start (GTK_BOX (box2), button, FALSE, TRUE, 0);
6304 g_signal_connect (button, "clicked",
6305 G_CALLBACK (show_all_pages), sample_notebook);
6307 box2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
6308 gtk_box_set_homogeneous (GTK_BOX (box2), TRUE);
6309 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
6310 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
6312 button = gtk_button_new_with_label ("prev");
6313 g_signal_connect_swapped (button, "clicked",
6314 G_CALLBACK (gtk_notebook_prev_page),
6316 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6318 button = gtk_button_new_with_label ("next");
6319 g_signal_connect_swapped (button, "clicked",
6320 G_CALLBACK (gtk_notebook_next_page),
6322 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6324 button = gtk_button_new_with_label ("rotate");
6325 g_signal_connect (button, "clicked",
6326 G_CALLBACK (rotate_notebook), sample_notebook);
6327 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
6329 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
6330 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);
6332 button = gtk_button_new_with_label ("close");
6333 gtk_container_set_border_width (GTK_CONTAINER (button), 5);
6334 g_signal_connect_swapped (button, "clicked",
6335 G_CALLBACK (gtk_widget_destroy),
6337 gtk_box_pack_start (GTK_BOX (box1), button, FALSE, FALSE, 0);
6338 gtk_widget_set_can_default (button, TRUE);
6339 gtk_widget_grab_default (button);
6342 if (!gtk_widget_get_visible (window))
6343 gtk_widget_show_all (window);
6345 gtk_widget_destroy (window);
6353 toggle_resize (GtkWidget *widget, GtkWidget *child)
6355 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6356 GValue value = { 0, };
6357 g_value_init (&value, G_TYPE_BOOLEAN);
6358 gtk_container_child_get_property (container, child, "resize", &value);
6359 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6360 gtk_container_child_set_property (container, child, "resize", &value);
6364 toggle_shrink (GtkWidget *widget, GtkWidget *child)
6366 GtkContainer *container = GTK_CONTAINER (gtk_widget_get_parent (child));
6367 GValue value = { 0, };
6368 g_value_init (&value, G_TYPE_BOOLEAN);
6369 gtk_container_child_get_property (container, child, "shrink", &value);
6370 g_value_set_boolean (&value, !g_value_get_boolean (&value));
6371 gtk_container_child_set_property (container, child, "shrink", &value);
6375 paned_props_clicked (GtkWidget *button,
6378 GtkWidget *window = create_prop_editor (paned, GTK_TYPE_PANED);
6380 gtk_window_set_title (GTK_WINDOW (window), "Paned Properties");
6384 create_pane_options (GtkPaned *paned,
6385 const gchar *frame_label,
6386 const gchar *label1,
6387 const gchar *label2)
6389 GtkWidget *child1, *child2;
6394 GtkWidget *check_button;
6396 child1 = gtk_paned_get_child1 (paned);
6397 child2 = gtk_paned_get_child2 (paned);
6399 frame = gtk_frame_new (frame_label);
6400 gtk_container_set_border_width (GTK_CONTAINER (frame), 4);
6402 table = gtk_table_new (4, 2, 4);
6403 gtk_container_add (GTK_CONTAINER (frame), table);
6405 label = gtk_label_new (label1);
6406 gtk_table_attach_defaults (GTK_TABLE (table), label,
6409 check_button = gtk_check_button_new_with_label ("Resize");
6410 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6412 g_signal_connect (check_button, "toggled",
6413 G_CALLBACK (toggle_resize),
6416 check_button = gtk_check_button_new_with_label ("Shrink");
6417 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6419 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6421 g_signal_connect (check_button, "toggled",
6422 G_CALLBACK (toggle_shrink),
6425 label = gtk_label_new (label2);
6426 gtk_table_attach_defaults (GTK_TABLE (table), label,
6429 check_button = gtk_check_button_new_with_label ("Resize");
6430 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6432 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6434 g_signal_connect (check_button, "toggled",
6435 G_CALLBACK (toggle_resize),
6438 check_button = gtk_check_button_new_with_label ("Shrink");
6439 gtk_table_attach_defaults (GTK_TABLE (table), check_button,
6441 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button),
6443 g_signal_connect (check_button, "toggled",
6444 G_CALLBACK (toggle_shrink),
6447 button = gtk_button_new_with_mnemonic ("_Properties");
6448 gtk_table_attach_defaults (GTK_TABLE (table), button,
6450 g_signal_connect (button, "clicked",
6451 G_CALLBACK (paned_props_clicked),
6458 create_panes (GtkWidget *widget)
6460 static GtkWidget *window = NULL;
6469 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6471 gtk_window_set_screen (GTK_WINDOW (window),
6472 gtk_widget_get_screen (widget));
6474 g_signal_connect (window, "destroy",
6475 G_CALLBACK (gtk_widget_destroyed),
6478 gtk_window_set_title (GTK_WINDOW (window), "Panes");
6479 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
6481 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6482 gtk_container_add (GTK_CONTAINER (window), vbox);
6484 vpaned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6485 gtk_box_pack_start (GTK_BOX (vbox), vpaned, TRUE, TRUE, 0);
6486 gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5);
6488 hpaned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6489 gtk_paned_add1 (GTK_PANED (vpaned), hpaned);
6491 frame = gtk_frame_new (NULL);
6492 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6493 gtk_widget_set_size_request (frame, 60, 60);
6494 gtk_paned_add1 (GTK_PANED (hpaned), frame);
6496 button = gtk_button_new_with_label ("Hi there");
6497 gtk_container_add (GTK_CONTAINER(frame), button);
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, 80, 60);
6502 gtk_paned_add2 (GTK_PANED (hpaned), frame);
6504 frame = gtk_frame_new (NULL);
6505 gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN);
6506 gtk_widget_set_size_request (frame, 60, 80);
6507 gtk_paned_add2 (GTK_PANED (vpaned), frame);
6509 /* Now create toggle buttons to control sizing */
6511 gtk_box_pack_start (GTK_BOX (vbox),
6512 create_pane_options (GTK_PANED (hpaned),
6518 gtk_box_pack_start (GTK_BOX (vbox),
6519 create_pane_options (GTK_PANED (vpaned),
6525 gtk_widget_show_all (vbox);
6528 if (!gtk_widget_get_visible (window))
6529 gtk_widget_show (window);
6531 gtk_widget_destroy (window);
6535 * Paned keyboard navigation
6539 paned_keyboard_window1 (GtkWidget *widget)
6562 window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6563 gtk_window_set_title (GTK_WINDOW (window1), "Basic paned navigation");
6564 gtk_window_set_screen (GTK_WINDOW (window1),
6565 gtk_widget_get_screen (widget));
6567 hpaned1 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6568 gtk_container_add (GTK_CONTAINER (window1), hpaned1);
6570 frame1 = gtk_frame_new (NULL);
6571 gtk_paned_pack1 (GTK_PANED (hpaned1), frame1, FALSE, TRUE);
6572 gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
6574 vbox1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6575 gtk_container_add (GTK_CONTAINER (frame1), vbox1);
6577 button7 = gtk_button_new_with_label ("button7");
6578 gtk_box_pack_start (GTK_BOX (vbox1), button7, FALSE, FALSE, 0);
6580 button8 = gtk_button_new_with_label ("button8");
6581 gtk_box_pack_start (GTK_BOX (vbox1), button8, FALSE, FALSE, 0);
6583 button9 = gtk_button_new_with_label ("button9");
6584 gtk_box_pack_start (GTK_BOX (vbox1), button9, FALSE, FALSE, 0);
6586 vpaned1 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6587 gtk_paned_pack2 (GTK_PANED (hpaned1), vpaned1, TRUE, TRUE);
6589 frame2 = gtk_frame_new (NULL);
6590 gtk_paned_pack1 (GTK_PANED (vpaned1), frame2, FALSE, TRUE);
6591 gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
6593 frame5 = gtk_frame_new (NULL);
6594 gtk_container_add (GTK_CONTAINER (frame2), frame5);
6596 hbox1 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6597 gtk_container_add (GTK_CONTAINER (frame5), hbox1);
6599 button5 = gtk_button_new_with_label ("button5");
6600 gtk_box_pack_start (GTK_BOX (hbox1), button5, FALSE, FALSE, 0);
6602 button6 = gtk_button_new_with_label ("button6");
6603 gtk_box_pack_start (GTK_BOX (hbox1), button6, FALSE, FALSE, 0);
6605 frame3 = gtk_frame_new (NULL);
6606 gtk_paned_pack2 (GTK_PANED (vpaned1), frame3, TRUE, TRUE);
6607 gtk_frame_set_shadow_type (GTK_FRAME (frame3), GTK_SHADOW_IN);
6609 frame4 = gtk_frame_new ("Buttons");
6610 gtk_container_add (GTK_CONTAINER (frame3), frame4);
6611 gtk_container_set_border_width (GTK_CONTAINER (frame4), 15);
6613 table1 = gtk_table_new (2, 2, FALSE);
6614 gtk_container_add (GTK_CONTAINER (frame4), table1);
6615 gtk_container_set_border_width (GTK_CONTAINER (table1), 11);
6617 button1 = gtk_button_new_with_label ("button1");
6618 gtk_table_attach (GTK_TABLE (table1), button1, 0, 1, 0, 1,
6619 (GtkAttachOptions) (GTK_FILL),
6620 (GtkAttachOptions) (0), 0, 0);
6622 button2 = gtk_button_new_with_label ("button2");
6623 gtk_table_attach (GTK_TABLE (table1), button2, 1, 2, 0, 1,
6624 (GtkAttachOptions) (GTK_FILL),
6625 (GtkAttachOptions) (0), 0, 0);
6627 button3 = gtk_button_new_with_label ("button3");
6628 gtk_table_attach (GTK_TABLE (table1), button3, 0, 1, 1, 2,
6629 (GtkAttachOptions) (GTK_FILL),
6630 (GtkAttachOptions) (0), 0, 0);
6632 button4 = gtk_button_new_with_label ("button4");
6633 gtk_table_attach (GTK_TABLE (table1), button4, 1, 2, 1, 2,
6634 (GtkAttachOptions) (GTK_FILL),
6635 (GtkAttachOptions) (0), 0, 0);
6641 paned_keyboard_window2 (GtkWidget *widget)
6646 GtkWidget *button13;
6650 GtkWidget *button12;
6652 GtkWidget *button11;
6653 GtkWidget *button10;
6655 window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6656 gtk_window_set_title (GTK_WINDOW (window2), "\"button 10\" is not inside the horisontal pane");
6658 gtk_window_set_screen (GTK_WINDOW (window2),
6659 gtk_widget_get_screen (widget));
6661 hpaned2 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6662 gtk_container_add (GTK_CONTAINER (window2), hpaned2);
6664 frame6 = gtk_frame_new (NULL);
6665 gtk_paned_pack1 (GTK_PANED (hpaned2), frame6, FALSE, TRUE);
6666 gtk_frame_set_shadow_type (GTK_FRAME (frame6), GTK_SHADOW_IN);
6668 button13 = gtk_button_new_with_label ("button13");
6669 gtk_container_add (GTK_CONTAINER (frame6), button13);
6671 hbox2 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6672 gtk_paned_pack2 (GTK_PANED (hpaned2), hbox2, TRUE, TRUE);
6674 vpaned2 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6675 gtk_box_pack_start (GTK_BOX (hbox2), vpaned2, TRUE, TRUE, 0);
6677 frame7 = gtk_frame_new (NULL);
6678 gtk_paned_pack1 (GTK_PANED (vpaned2), frame7, FALSE, TRUE);
6679 gtk_frame_set_shadow_type (GTK_FRAME (frame7), GTK_SHADOW_IN);
6681 button12 = gtk_button_new_with_label ("button12");
6682 gtk_container_add (GTK_CONTAINER (frame7), button12);
6684 frame8 = gtk_frame_new (NULL);
6685 gtk_paned_pack2 (GTK_PANED (vpaned2), frame8, TRUE, TRUE);
6686 gtk_frame_set_shadow_type (GTK_FRAME (frame8), GTK_SHADOW_IN);
6688 button11 = gtk_button_new_with_label ("button11");
6689 gtk_container_add (GTK_CONTAINER (frame8), button11);
6691 button10 = gtk_button_new_with_label ("button10");
6692 gtk_box_pack_start (GTK_BOX (hbox2), button10, FALSE, FALSE, 0);
6698 paned_keyboard_window3 (GtkWidget *widget)
6705 GtkWidget *button14;
6708 GtkWidget *button15;
6711 GtkWidget *button16;
6713 GtkWidget *button17;
6715 window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6716 g_object_set_data (G_OBJECT (window3), "window3", window3);
6717 gtk_window_set_title (GTK_WINDOW (window3), "Nested panes");
6719 gtk_window_set_screen (GTK_WINDOW (window3),
6720 gtk_widget_get_screen (widget));
6723 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6724 gtk_container_add (GTK_CONTAINER (window3), vbox2);
6726 label1 = gtk_label_new ("Three panes nested inside each other");
6727 gtk_box_pack_start (GTK_BOX (vbox2), label1, FALSE, FALSE, 0);
6729 hpaned3 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6730 gtk_box_pack_start (GTK_BOX (vbox2), hpaned3, TRUE, TRUE, 0);
6732 frame9 = gtk_frame_new (NULL);
6733 gtk_paned_pack1 (GTK_PANED (hpaned3), frame9, FALSE, TRUE);
6734 gtk_frame_set_shadow_type (GTK_FRAME (frame9), GTK_SHADOW_IN);
6736 button14 = gtk_button_new_with_label ("button14");
6737 gtk_container_add (GTK_CONTAINER (frame9), button14);
6739 hpaned4 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6740 gtk_paned_pack2 (GTK_PANED (hpaned3), hpaned4, TRUE, TRUE);
6742 frame10 = gtk_frame_new (NULL);
6743 gtk_paned_pack1 (GTK_PANED (hpaned4), frame10, FALSE, TRUE);
6744 gtk_frame_set_shadow_type (GTK_FRAME (frame10), GTK_SHADOW_IN);
6746 button15 = gtk_button_new_with_label ("button15");
6747 gtk_container_add (GTK_CONTAINER (frame10), button15);
6749 hpaned5 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6750 gtk_paned_pack2 (GTK_PANED (hpaned4), hpaned5, TRUE, TRUE);
6752 frame11 = gtk_frame_new (NULL);
6753 gtk_paned_pack1 (GTK_PANED (hpaned5), frame11, FALSE, TRUE);
6754 gtk_frame_set_shadow_type (GTK_FRAME (frame11), GTK_SHADOW_IN);
6756 button16 = gtk_button_new_with_label ("button16");
6757 gtk_container_add (GTK_CONTAINER (frame11), button16);
6759 frame12 = gtk_frame_new (NULL);
6760 gtk_paned_pack2 (GTK_PANED (hpaned5), frame12, TRUE, TRUE);
6761 gtk_frame_set_shadow_type (GTK_FRAME (frame12), GTK_SHADOW_IN);
6763 button17 = gtk_button_new_with_label ("button17");
6764 gtk_container_add (GTK_CONTAINER (frame12), button17);
6770 paned_keyboard_window4 (GtkWidget *widget)
6777 GtkWidget *button19;
6778 GtkWidget *button18;
6781 GtkWidget *button21;
6782 GtkWidget *button20;
6784 GtkWidget *button23;
6785 GtkWidget *button22;
6787 GtkWidget *button25;
6788 GtkWidget *button24;
6790 window4 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
6791 g_object_set_data (G_OBJECT (window4), "window4", window4);
6792 gtk_window_set_title (GTK_WINDOW (window4), "window4");
6794 gtk_window_set_screen (GTK_WINDOW (window4),
6795 gtk_widget_get_screen (widget));
6797 vbox3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
6798 gtk_container_add (GTK_CONTAINER (window4), vbox3);
6800 label2 = gtk_label_new ("Widget tree:\n\nhpaned \n - vpaned\n - hbox\n - vpaned\n - vpaned\n - vpaned\n");
6801 gtk_box_pack_start (GTK_BOX (vbox3), label2, FALSE, FALSE, 0);
6802 gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
6804 hpaned6 = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
6805 gtk_box_pack_start (GTK_BOX (vbox3), hpaned6, TRUE, TRUE, 0);
6807 vpaned3 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6808 gtk_paned_pack1 (GTK_PANED (hpaned6), vpaned3, FALSE, TRUE);
6810 button19 = gtk_button_new_with_label ("button19");
6811 gtk_paned_pack1 (GTK_PANED (vpaned3), button19, FALSE, TRUE);
6813 button18 = gtk_button_new_with_label ("button18");
6814 gtk_paned_pack2 (GTK_PANED (vpaned3), button18, TRUE, TRUE);
6816 hbox3 = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
6817 gtk_paned_pack2 (GTK_PANED (hpaned6), hbox3, TRUE, TRUE);
6819 vpaned4 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6820 gtk_box_pack_start (GTK_BOX (hbox3), vpaned4, TRUE, TRUE, 0);
6822 button21 = gtk_button_new_with_label ("button21");
6823 gtk_paned_pack1 (GTK_PANED (vpaned4), button21, FALSE, TRUE);
6825 button20 = gtk_button_new_with_label ("button20");
6826 gtk_paned_pack2 (GTK_PANED (vpaned4), button20, TRUE, TRUE);
6828 vpaned5 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6829 gtk_box_pack_start (GTK_BOX (hbox3), vpaned5, TRUE, TRUE, 0);
6831 button23 = gtk_button_new_with_label ("button23");
6832 gtk_paned_pack1 (GTK_PANED (vpaned5), button23, FALSE, TRUE);
6834 button22 = gtk_button_new_with_label ("button22");
6835 gtk_paned_pack2 (GTK_PANED (vpaned5), button22, TRUE, TRUE);
6837 vpaned6 = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
6838 gtk_box_pack_start (GTK_BOX (hbox3), vpaned6, TRUE, TRUE, 0);
6840 button25 = gtk_button_new_with_label ("button25");
6841 gtk_paned_pack1 (GTK_PANED (vpaned6), button25, FALSE, TRUE);
6843 button24 = gtk_button_new_with_label ("button24");
6844 gtk_paned_pack2 (GTK_PANED (vpaned6), button24, TRUE, TRUE);
6850 create_paned_keyboard_navigation (GtkWidget *widget)
6852 static GtkWidget *window1 = NULL;
6853 static GtkWidget *window2 = NULL;
6854 static GtkWidget *window3 = NULL;
6855 static GtkWidget *window4 = NULL;
6858 (gtk_widget_get_screen (window1) != gtk_widget_get_screen (widget)))
6860 gtk_widget_destroy (window1);
6861 gtk_widget_destroy (window2);
6862 gtk_widget_destroy (window3);
6863 gtk_widget_destroy (window4);
6868 window1 = paned_keyboard_window1 (widget);
6869 g_signal_connect (window1, "destroy",
6870 G_CALLBACK (gtk_widget_destroyed),
6876 window2 = paned_keyboard_window2 (widget);
6877 g_signal_connect (window2, "destroy",
6878 G_CALLBACK (gtk_widget_destroyed),
6884 window3 = paned_keyboard_window3 (widget);
6885 g_signal_connect (window3, "destroy",
6886 G_CALLBACK (gtk_widget_destroyed),
6892 window4 = paned_keyboard_window4 (widget);
6893 g_signal_connect (window4, "destroy",
6894 G_CALLBACK (gtk_widget_destroyed),
6898 if (gtk_widget_get_visible (window1))
6899 gtk_widget_destroy (GTK_WIDGET (window1));
6901 gtk_widget_show_all (GTK_WIDGET (window1));
6903 if (gtk_widget_get_visible (window2))
6904 gtk_widget_destroy (GTK_WIDGET (window2));
6906 gtk_widget_show_all (GTK_WIDGET (window2));
6908 if (gtk_widget_get_visible (window3))
6909 gtk_widget_destroy (GTK_WIDGET (window3));
6911 gtk_widget_show_all (GTK_WIDGET (window3));
6913 if (gtk_widget_get_visible (window4))
6914 gtk_widget_destroy (GTK_WIDGET (window4));
6916 gtk_widget_show_all (GTK_WIDGET (window4));
6924 typedef struct _cursoroffset {gint x,y;} CursorOffset;
6927 shape_pressed (GtkWidget *widget, GdkEventButton *event)
6931 /* ignore double and triple click */
6932 if (event->type != GDK_BUTTON_PRESS)
6935 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
6936 p->x = (int) event->x;
6937 p->y = (int) event->y;
6939 gtk_grab_add (widget);
6940 gdk_device_grab (gdk_event_get_device ((GdkEvent*)event),
6941 gtk_widget_get_window (widget),
6944 GDK_BUTTON_RELEASE_MASK |
6945 GDK_BUTTON_MOTION_MASK |
6946 GDK_POINTER_MOTION_HINT_MASK,
6952 shape_released (GtkWidget *widget,
6953 GdkEventButton *event)
6955 gtk_grab_remove (widget);
6956 gdk_device_ungrab (gdk_event_get_device ((GdkEvent*)event), event->time);
6960 shape_motion (GtkWidget *widget,
6961 GdkEventMotion *event)
6965 GdkModifierType mask;
6967 p = g_object_get_data (G_OBJECT (widget), "cursor_offset");
6970 * Can't use event->x / event->y here
6971 * because I need absolute coordinates.
6973 gdk_window_get_pointer (NULL, &xp, &yp, &mask);
6974 gtk_window_move (GTK_WINDOW (widget), xp - p->x, yp - p->y);
6978 shape_create_icon (GdkScreen *screen,
6989 CursorOffset* icon_pos;
6990 cairo_surface_t *mask;
6991 cairo_region_t *mask_region;
6996 * GDK_WINDOW_TOPLEVEL works also, giving you a title border
6998 window = gtk_window_new (window_type);
6999 gtk_window_set_screen (GTK_WINDOW (window), screen);
7001 fixed = gtk_fixed_new ();
7002 gtk_widget_set_size_request (fixed, 100, 100);
7003 gtk_container_add (GTK_CONTAINER (window), fixed);
7004 gtk_widget_show (fixed);
7006 gtk_widget_set_events (window,
7007 gtk_widget_get_events (window) |
7008 GDK_BUTTON_MOTION_MASK |
7009 GDK_POINTER_MOTION_HINT_MASK |
7010 GDK_BUTTON_PRESS_MASK);
7012 gtk_widget_realize (window);
7014 pixbuf = gdk_pixbuf_new_from_file (xpm_file, NULL);
7015 g_assert (pixbuf); /* FIXME: error handling */
7017 mask = cairo_image_surface_create (CAIRO_FORMAT_A1,
7018 gdk_pixbuf_get_width (pixbuf),
7019 gdk_pixbuf_get_height (pixbuf));
7020 cr = cairo_create (mask);
7021 gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
7025 mask_region = gdk_cairo_region_create_from_surface (mask);
7027 cairo_region_translate (mask_region, px, py);
7029 image = gtk_image_new_from_pixbuf (pixbuf);
7030 gtk_fixed_put (GTK_FIXED (fixed), image, px,py);
7031 gtk_widget_show (image);
7033 gtk_widget_shape_combine_region (window, mask_region);
7035 cairo_region_destroy (mask_region);
7036 cairo_surface_destroy (mask);
7037 g_object_unref (pixbuf);
7039 g_signal_connect (window, "button_press_event",
7040 G_CALLBACK (shape_pressed), NULL);
7041 g_signal_connect (window, "button_release_event",
7042 G_CALLBACK (shape_released), NULL);
7043 g_signal_connect (window, "motion_notify_event",
7044 G_CALLBACK (shape_motion), NULL);
7046 icon_pos = g_new (CursorOffset, 1);
7047 g_object_set_data (G_OBJECT (window), "cursor_offset", icon_pos);
7049 gtk_window_move (GTK_WINDOW (window), x, y);
7050 gtk_widget_show (window);
7056 create_shapes (GtkWidget *widget)
7058 /* Variables used by the Drag/Drop and Shape Window demos */
7059 static GtkWidget *modeller = NULL;
7060 static GtkWidget *sheets = NULL;
7061 static GtkWidget *rings = NULL;
7062 static GtkWidget *with_region = NULL;
7063 GdkScreen *screen = gtk_widget_get_screen (widget);
7065 if (!(file_exists ("Modeller.xpm") &&
7066 file_exists ("FilesQueue.xpm") &&
7067 file_exists ("3DRings.xpm")))
7073 modeller = shape_create_icon (screen, "Modeller.xpm",
7074 440, 140, 0,0, GTK_WINDOW_POPUP);
7076 g_signal_connect (modeller, "destroy",
7077 G_CALLBACK (gtk_widget_destroyed),
7081 gtk_widget_destroy (modeller);
7085 sheets = shape_create_icon (screen, "FilesQueue.xpm",
7086 580, 170, 0,0, GTK_WINDOW_POPUP);
7088 g_signal_connect (sheets, "destroy",
7089 G_CALLBACK (gtk_widget_destroyed),
7094 gtk_widget_destroy (sheets);
7098 rings = shape_create_icon (screen, "3DRings.xpm",
7099 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7101 g_signal_connect (rings, "destroy",
7102 G_CALLBACK (gtk_widget_destroyed),
7106 gtk_widget_destroy (rings);
7110 cairo_region_t *region;
7113 with_region = shape_create_icon (screen, "3DRings.xpm",
7114 460, 270, 25,25, GTK_WINDOW_TOPLEVEL);
7116 gtk_window_set_decorated (GTK_WINDOW (with_region), FALSE);
7118 g_signal_connect (with_region, "destroy",
7119 G_CALLBACK (gtk_widget_destroyed),
7122 /* reset shape from mask to a region */
7125 region = cairo_region_create ();
7137 cairo_region_union_rectangle (region, &rect);
7145 gdk_window_shape_combine_region (gtk_widget_get_window (with_region),
7150 gtk_widget_destroy (with_region);
7158 create_wmhints (GtkWidget *widget)
7160 static GtkWidget *window = NULL;
7162 GtkWidget *separator;
7166 GdkWindow *gdk_window;
7172 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7174 gtk_window_set_screen (GTK_WINDOW (window),
7175 gtk_widget_get_screen (widget));
7177 g_signal_connect (window, "destroy",
7178 G_CALLBACK (gtk_widget_destroyed),
7181 gtk_window_set_title (GTK_WINDOW (window), "WM Hints");
7182 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
7184 gtk_widget_realize (window);
7186 gdk_window = gtk_widget_get_window (window);
7188 pixbuf = gdk_pixbuf_new_from_xpm_data ((const char **) openfile);
7189 list = g_list_prepend (NULL, pixbuf);
7191 gdk_window_set_icon_list (gdk_window, list);
7194 g_object_unref (pixbuf);
7196 gdk_window_set_icon_name (gdk_window, "WMHints Test Icon");
7198 gdk_window_set_decorations (gdk_window, GDK_DECOR_ALL | GDK_DECOR_MENU);
7199 gdk_window_set_functions (gdk_window, GDK_FUNC_ALL | GDK_FUNC_RESIZE);
7201 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7202 gtk_container_add (GTK_CONTAINER (window), box1);
7203 gtk_widget_show (box1);
7205 label = gtk_label_new ("Try iconizing me!");
7206 gtk_widget_set_size_request (label, 150, 50);
7207 gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
7208 gtk_widget_show (label);
7211 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
7212 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
7213 gtk_widget_show (separator);
7216 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
7217 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
7218 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
7219 gtk_widget_show (box2);
7222 button = gtk_button_new_with_label ("close");
7224 g_signal_connect_swapped (button, "clicked",
7225 G_CALLBACK (gtk_widget_destroy),
7228 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
7229 gtk_widget_set_can_default (button, TRUE);
7230 gtk_widget_grab_default (button);
7231 gtk_widget_show (button);
7234 if (!gtk_widget_get_visible (window))
7235 gtk_widget_show (window);
7237 gtk_widget_destroy (window);
7242 * Window state tracking
7246 window_state_callback (GtkWidget *widget,
7247 GdkEventWindowState *event,
7250 GtkWidget *label = data;
7253 msg = g_strconcat (gtk_window_get_title (GTK_WINDOW (widget)), ": ",
7254 (event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) ?
7255 "withdrawn" : "not withdrawn", ", ",
7256 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) ?
7257 "iconified" : "not iconified", ", ",
7258 (event->new_window_state & GDK_WINDOW_STATE_STICKY) ?
7259 "sticky" : "not sticky", ", ",
7260 (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) ?
7261 "maximized" : "not maximized", ", ",
7262 (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) ?
7263 "fullscreen" : "not fullscreen",
7264 (event->new_window_state & GDK_WINDOW_STATE_ABOVE) ?
7265 "above" : "not above", ", ",
7266 (event->new_window_state & GDK_WINDOW_STATE_BELOW) ?
7267 "below" : "not below", ", ",
7270 gtk_label_set_text (GTK_LABEL (label), msg);
7278 tracking_label (GtkWidget *window)
7284 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
7286 g_signal_connect_object (hbox,
7288 G_CALLBACK (gtk_widget_destroy),
7292 label = gtk_label_new ("<no window state events received>");
7293 gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
7294 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
7296 g_signal_connect (window,
7297 "window_state_event",
7298 G_CALLBACK (window_state_callback),
7301 button = gtk_button_new_with_label ("Deiconify");
7302 g_signal_connect_object (button,
7304 G_CALLBACK (gtk_window_deiconify),
7307 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7309 button = gtk_button_new_with_label ("Iconify");
7310 g_signal_connect_object (button,
7312 G_CALLBACK (gtk_window_iconify),
7315 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7317 button = gtk_button_new_with_label ("Fullscreen");
7318 g_signal_connect_object (button,
7320 G_CALLBACK (gtk_window_fullscreen),
7323 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7325 button = gtk_button_new_with_label ("Unfullscreen");
7326 g_signal_connect_object (button,
7328 G_CALLBACK (gtk_window_unfullscreen),
7331 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7333 button = gtk_button_new_with_label ("Present");
7334 g_signal_connect_object (button,
7336 G_CALLBACK (gtk_window_present),
7339 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7341 button = gtk_button_new_with_label ("Show");
7342 g_signal_connect_object (button,
7344 G_CALLBACK (gtk_widget_show),
7347 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
7349 gtk_widget_show_all (hbox);
7355 keep_window_above (GtkToggleButton *togglebutton, gpointer data)
7357 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7359 gtk_window_set_keep_above (GTK_WINDOW (data),
7360 gtk_toggle_button_get_active (togglebutton));
7362 if (gtk_toggle_button_get_active (togglebutton))
7363 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7367 keep_window_below (GtkToggleButton *togglebutton, gpointer data)
7369 GtkWidget *button = g_object_get_data (G_OBJECT (togglebutton), "radio");
7371 gtk_window_set_keep_below (GTK_WINDOW (data),
7372 gtk_toggle_button_get_active (togglebutton));
7374 if (gtk_toggle_button_get_active (togglebutton))
7375 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
7380 get_state_controls (GtkWidget *window)
7384 GtkWidget *button_above;
7385 GtkWidget *button_below;
7387 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7389 button = gtk_button_new_with_label ("Stick");
7390 g_signal_connect_object (button,
7392 G_CALLBACK (gtk_window_stick),
7395 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7397 button = gtk_button_new_with_label ("Unstick");
7398 g_signal_connect_object (button,
7400 G_CALLBACK (gtk_window_unstick),
7403 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7405 button = gtk_button_new_with_label ("Maximize");
7406 g_signal_connect_object (button,
7408 G_CALLBACK (gtk_window_maximize),
7411 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7413 button = gtk_button_new_with_label ("Unmaximize");
7414 g_signal_connect_object (button,
7416 G_CALLBACK (gtk_window_unmaximize),
7419 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7421 button = gtk_button_new_with_label ("Iconify");
7422 g_signal_connect_object (button,
7424 G_CALLBACK (gtk_window_iconify),
7427 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7429 button = gtk_button_new_with_label ("Fullscreen");
7430 g_signal_connect_object (button,
7432 G_CALLBACK (gtk_window_fullscreen),
7435 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7437 button = gtk_button_new_with_label ("Unfullscreen");
7438 g_signal_connect_object (button,
7440 G_CALLBACK (gtk_window_unfullscreen),
7443 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7445 button_above = gtk_toggle_button_new_with_label ("Keep above");
7446 g_signal_connect (button_above,
7448 G_CALLBACK (keep_window_above),
7450 gtk_box_pack_start (GTK_BOX (vbox), button_above, FALSE, FALSE, 0);
7452 button_below = gtk_toggle_button_new_with_label ("Keep below");
7453 g_signal_connect (button_below,
7455 G_CALLBACK (keep_window_below),
7457 gtk_box_pack_start (GTK_BOX (vbox), button_below, FALSE, FALSE, 0);
7459 g_object_set_data (G_OBJECT (button_above), "radio", button_below);
7460 g_object_set_data (G_OBJECT (button_below), "radio", button_above);
7462 button = gtk_button_new_with_label ("Hide (withdraw)");
7463 g_signal_connect_object (button,
7465 G_CALLBACK (gtk_widget_hide),
7468 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7470 gtk_widget_show_all (vbox);
7476 create_window_states (GtkWidget *widget)
7478 static GtkWidget *window = NULL;
7481 GtkWidget *iconified;
7483 GtkWidget *controls;
7487 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7488 gtk_window_set_screen (GTK_WINDOW (window),
7489 gtk_widget_get_screen (widget));
7491 g_signal_connect (window, "destroy",
7492 G_CALLBACK (gtk_widget_destroyed),
7495 gtk_window_set_title (GTK_WINDOW (window), "Window states");
7497 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7498 gtk_container_add (GTK_CONTAINER (window), box1);
7500 iconified = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7502 gtk_window_set_screen (GTK_WINDOW (iconified),
7503 gtk_widget_get_screen (widget));
7505 g_signal_connect_object (iconified, "destroy",
7506 G_CALLBACK (gtk_widget_destroy),
7509 gtk_window_iconify (GTK_WINDOW (iconified));
7510 gtk_window_set_title (GTK_WINDOW (iconified), "Iconified initially");
7511 controls = get_state_controls (iconified);
7512 gtk_container_add (GTK_CONTAINER (iconified), controls);
7514 normal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7516 gtk_window_set_screen (GTK_WINDOW (normal),
7517 gtk_widget_get_screen (widget));
7519 g_signal_connect_object (normal, "destroy",
7520 G_CALLBACK (gtk_widget_destroy),
7524 gtk_window_set_title (GTK_WINDOW (normal), "Deiconified initially");
7525 controls = get_state_controls (normal);
7526 gtk_container_add (GTK_CONTAINER (normal), controls);
7528 label = tracking_label (iconified);
7529 gtk_container_add (GTK_CONTAINER (box1), label);
7531 label = tracking_label (normal);
7532 gtk_container_add (GTK_CONTAINER (box1), label);
7534 gtk_widget_show_all (iconified);
7535 gtk_widget_show_all (normal);
7536 gtk_widget_show_all (box1);
7539 if (!gtk_widget_get_visible (window))
7540 gtk_widget_show (window);
7542 gtk_widget_destroy (window);
7550 configure_event_callback (GtkWidget *widget,
7551 GdkEventConfigure *event,
7554 GtkWidget *label = data;
7558 gtk_window_get_position (GTK_WINDOW (widget), &x, &y);
7560 msg = g_strdup_printf ("event: %d,%d %d x %d\n"
7562 event->x, event->y, event->width, event->height,
7565 gtk_label_set_text (GTK_LABEL (label), msg);
7573 get_ints (GtkWidget *window,
7580 spin1 = g_object_get_data (G_OBJECT (window), "spin1");
7581 spin2 = g_object_get_data (G_OBJECT (window), "spin2");
7583 *a = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin1));
7584 *b = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin2));
7588 set_size_callback (GtkWidget *widget,
7593 get_ints (data, &w, &h);
7595 gtk_window_resize (GTK_WINDOW (g_object_get_data (data, "target")), w, h);
7599 unset_default_size_callback (GtkWidget *widget,
7602 gtk_window_set_default_size (g_object_get_data (data, "target"),
7607 set_default_size_callback (GtkWidget *widget,
7612 get_ints (data, &w, &h);
7614 gtk_window_set_default_size (g_object_get_data (data, "target"),
7619 unset_size_request_callback (GtkWidget *widget,
7622 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7627 set_size_request_callback (GtkWidget *widget,
7632 get_ints (data, &w, &h);
7634 gtk_widget_set_size_request (g_object_get_data (data, "target"),
7639 set_location_callback (GtkWidget *widget,
7644 get_ints (data, &x, &y);
7646 gtk_window_move (g_object_get_data (data, "target"), x, y);
7650 move_to_position_callback (GtkWidget *widget,
7656 window = g_object_get_data (data, "target");
7658 gtk_window_get_position (window, &x, &y);
7660 gtk_window_move (window, x, y);
7664 set_geometry_callback (GtkWidget *entry,
7670 target = GTK_WINDOW (g_object_get_data (G_OBJECT (data), "target"));
7672 text = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
7674 if (!gtk_window_parse_geometry (target, text))
7675 g_print ("Bad geometry string '%s'\n", text);
7681 resizable_callback (GtkWidget *widget,
7684 g_object_set (g_object_get_data (data, "target"),
7685 "resizable", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)),
7690 gravity_selected (GtkWidget *widget,
7693 gtk_window_set_gravity (GTK_WINDOW (g_object_get_data (data, "target")),
7694 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GDK_GRAVITY_NORTH_WEST);
7698 pos_selected (GtkWidget *widget,
7701 gtk_window_set_position (GTK_WINDOW (g_object_get_data (data, "target")),
7702 gtk_combo_box_get_active (GTK_COMBO_BOX (widget)) + GTK_WIN_POS_NONE);
7706 move_gravity_window_to_current_position (GtkWidget *widget,
7712 window = GTK_WINDOW (data);
7714 gtk_window_get_position (window, &x, &y);
7716 gtk_window_move (window, x, y);
7720 get_screen_corner (GtkWindow *window,
7725 GdkScreen * screen = gtk_window_get_screen (window);
7727 gtk_window_get_size (GTK_WINDOW (window), &w, &h);
7729 switch (gtk_window_get_gravity (window))
7731 case GDK_GRAVITY_SOUTH_EAST:
7732 *x = gdk_screen_get_width (screen) - w;
7733 *y = gdk_screen_get_height (screen) - h;
7736 case GDK_GRAVITY_NORTH_EAST:
7737 *x = gdk_screen_get_width (screen) - w;
7741 case GDK_GRAVITY_SOUTH_WEST:
7743 *y = gdk_screen_get_height (screen) - h;
7746 case GDK_GRAVITY_NORTH_WEST:
7751 case GDK_GRAVITY_SOUTH:
7752 *x = (gdk_screen_get_width (screen) - w) / 2;
7753 *y = gdk_screen_get_height (screen) - h;
7756 case GDK_GRAVITY_NORTH:
7757 *x = (gdk_screen_get_width (screen) - w) / 2;
7761 case GDK_GRAVITY_WEST:
7763 *y = (gdk_screen_get_height (screen) - h) / 2;
7766 case GDK_GRAVITY_EAST:
7767 *x = gdk_screen_get_width (screen) - w;
7768 *y = (gdk_screen_get_height (screen) - h) / 2;
7771 case GDK_GRAVITY_CENTER:
7772 *x = (gdk_screen_get_width (screen) - w) / 2;
7773 *y = (gdk_screen_get_height (screen) - h) / 2;
7776 case GDK_GRAVITY_STATIC:
7777 /* pick some random numbers */
7783 g_assert_not_reached ();
7789 move_gravity_window_to_starting_position (GtkWidget *widget,
7795 window = GTK_WINDOW (data);
7797 get_screen_corner (window,
7800 gtk_window_move (window, x, y);
7804 make_gravity_window (GtkWidget *destroy_with,
7813 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7815 gtk_window_set_screen (GTK_WINDOW (window),
7816 gtk_widget_get_screen (destroy_with));
7818 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
7819 gtk_widget_show (vbox);
7821 gtk_container_add (GTK_CONTAINER (window), vbox);
7822 gtk_window_set_title (GTK_WINDOW (window), title);
7823 gtk_window_set_gravity (GTK_WINDOW (window), gravity);
7825 g_signal_connect_object (destroy_with,
7827 G_CALLBACK (gtk_widget_destroy),
7832 button = gtk_button_new_with_mnemonic ("_Move to current position");
7834 g_signal_connect (button, "clicked",
7835 G_CALLBACK (move_gravity_window_to_current_position),
7838 gtk_container_add (GTK_CONTAINER (vbox), button);
7839 gtk_widget_show (button);
7841 button = gtk_button_new_with_mnemonic ("Move to _starting position");
7843 g_signal_connect (button, "clicked",
7844 G_CALLBACK (move_gravity_window_to_starting_position),
7847 gtk_container_add (GTK_CONTAINER (vbox), button);
7848 gtk_widget_show (button);
7850 /* Pretend this is the result of --geometry.
7851 * DO NOT COPY THIS CODE unless you are setting --geometry results,
7852 * and in that case you probably should just use gtk_window_parse_geometry().
7853 * AGAIN, DO NOT SET GDK_HINT_USER_POS! It violates the ICCCM unless
7854 * you are parsing --geometry or equivalent.
7856 gtk_window_set_geometry_hints (GTK_WINDOW (window),
7860 gtk_window_set_default_size (GTK_WINDOW (window),
7863 get_screen_corner (GTK_WINDOW (window), &x, &y);
7865 gtk_window_move (GTK_WINDOW (window),
7872 do_gravity_test (GtkWidget *widget,
7875 GtkWidget *destroy_with = data;
7878 /* We put a window at each gravity point on the screen. */
7879 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_WEST,
7881 gtk_widget_show (window);
7883 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_EAST,
7885 gtk_widget_show (window);
7887 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH_EAST,
7889 gtk_widget_show (window);
7891 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH_WEST,
7893 gtk_widget_show (window);
7895 window = make_gravity_window (destroy_with, GDK_GRAVITY_SOUTH,
7897 gtk_widget_show (window);
7899 window = make_gravity_window (destroy_with, GDK_GRAVITY_NORTH,
7901 gtk_widget_show (window);
7904 window = make_gravity_window (destroy_with, GDK_GRAVITY_WEST,
7906 gtk_widget_show (window);
7909 window = make_gravity_window (destroy_with, GDK_GRAVITY_EAST,
7911 gtk_widget_show (window);
7913 window = make_gravity_window (destroy_with, GDK_GRAVITY_CENTER,
7915 gtk_widget_show (window);
7917 window = make_gravity_window (destroy_with, GDK_GRAVITY_STATIC,
7919 gtk_widget_show (window);
7923 window_controls (GtkWidget *window)
7925 GtkWidget *control_window;
7930 GtkAdjustment *adjustment;
7935 control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
7937 gtk_window_set_screen (GTK_WINDOW (control_window),
7938 gtk_widget_get_screen (window));
7940 gtk_window_set_title (GTK_WINDOW (control_window), "Size controls");
7942 g_object_set_data (G_OBJECT (control_window),
7946 g_signal_connect_object (control_window,
7948 G_CALLBACK (gtk_widget_destroy),
7952 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
7954 gtk_container_add (GTK_CONTAINER (control_window), vbox);
7956 label = gtk_label_new ("<no configure events>");
7957 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
7959 g_signal_connect (window,
7961 G_CALLBACK (configure_event_callback),
7964 adjustment = gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0, 5.0, 0.0);
7965 spin = gtk_spin_button_new (adjustment, 0, 0);
7967 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
7969 g_object_set_data (G_OBJECT (control_window), "spin1", spin);
7971 adjustment = gtk_adjustment_new (10.0, -2000.0, 2000.0, 1.0, 5.0, 0.0);
7972 spin = gtk_spin_button_new (adjustment, 0, 0);
7974 gtk_box_pack_start (GTK_BOX (vbox), spin, FALSE, FALSE, 0);
7976 g_object_set_data (G_OBJECT (control_window), "spin2", spin);
7978 entry = gtk_entry_new ();
7979 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
7981 g_signal_connect (entry, "changed",
7982 G_CALLBACK (set_geometry_callback),
7985 button = gtk_button_new_with_label ("Show gravity test windows");
7986 g_signal_connect_swapped (button,
7988 G_CALLBACK (do_gravity_test),
7990 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
7992 button = gtk_button_new_with_label ("Reshow with initial size");
7993 g_signal_connect_object (button,
7995 G_CALLBACK (gtk_window_reshow_with_initial_size),
7998 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8000 button = gtk_button_new_with_label ("Queue resize");
8001 g_signal_connect_object (button,
8003 G_CALLBACK (gtk_widget_queue_resize),
8006 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8008 button = gtk_button_new_with_label ("Resize");
8009 g_signal_connect (button,
8011 G_CALLBACK (set_size_callback),
8013 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8015 button = gtk_button_new_with_label ("Set default size");
8016 g_signal_connect (button,
8018 G_CALLBACK (set_default_size_callback),
8020 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8022 button = gtk_button_new_with_label ("Unset default size");
8023 g_signal_connect (button,
8025 G_CALLBACK (unset_default_size_callback),
8027 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8029 button = gtk_button_new_with_label ("Set size request");
8030 g_signal_connect (button,
8032 G_CALLBACK (set_size_request_callback),
8034 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8036 button = gtk_button_new_with_label ("Unset size request");
8037 g_signal_connect (button,
8039 G_CALLBACK (unset_size_request_callback),
8041 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8043 button = gtk_button_new_with_label ("Move");
8044 g_signal_connect (button,
8046 G_CALLBACK (set_location_callback),
8048 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8050 button = gtk_button_new_with_label ("Move to current position");
8051 g_signal_connect (button,
8053 G_CALLBACK (move_to_position_callback),
8055 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8057 button = gtk_check_button_new_with_label ("Allow resize");
8058 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
8059 g_signal_connect (button,
8061 G_CALLBACK (resizable_callback),
8063 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8065 button = gtk_button_new_with_mnemonic ("_Show");
8066 g_signal_connect_object (button,
8068 G_CALLBACK (gtk_widget_show),
8071 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8073 button = gtk_button_new_with_mnemonic ("_Hide");
8074 g_signal_connect_object (button,
8076 G_CALLBACK (gtk_widget_hide),
8079 gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
8081 om = gtk_combo_box_text_new ();
8085 static gchar *names[] = {
8086 "GDK_GRAVITY_NORTH_WEST",
8087 "GDK_GRAVITY_NORTH",
8088 "GDK_GRAVITY_NORTH_EAST",
8090 "GDK_GRAVITY_CENTER",
8092 "GDK_GRAVITY_SOUTH_WEST",
8093 "GDK_GRAVITY_SOUTH",
8094 "GDK_GRAVITY_SOUTH_EAST",
8095 "GDK_GRAVITY_STATIC",
8099 g_assert (names[i]);
8100 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (om), names[i]);
8105 g_signal_connect (om,
8107 G_CALLBACK (gravity_selected),
8110 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8113 om = gtk_combo_box_text_new ();
8117 static gchar *names[] = {
8119 "GTK_WIN_POS_CENTER",
8120 "GTK_WIN_POS_MOUSE",
8121 "GTK_WIN_POS_CENTER_ALWAYS",
8122 "GTK_WIN_POS_CENTER_ON_PARENT",
8126 g_assert (names[i]);
8127 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (om), names[i]);
8132 g_signal_connect (om,
8134 G_CALLBACK (pos_selected),
8137 gtk_box_pack_end (GTK_BOX (vbox), om, FALSE, FALSE, 0);
8139 gtk_widget_show_all (vbox);
8141 return control_window;
8145 create_window_sizing (GtkWidget *widget)
8147 static GtkWidget *window = NULL;
8148 static GtkWidget *target_window = NULL;
8154 target_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8155 gtk_window_set_screen (GTK_WINDOW (target_window),
8156 gtk_widget_get_screen (widget));
8157 label = gtk_label_new (NULL);
8158 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");
8159 gtk_container_add (GTK_CONTAINER (target_window), label);
8160 gtk_widget_show (label);
8162 g_signal_connect (target_window, "destroy",
8163 G_CALLBACK (gtk_widget_destroyed),
8166 window = window_controls (target_window);
8168 g_signal_connect (window, "destroy",
8169 G_CALLBACK (gtk_widget_destroyed),
8172 gtk_window_set_title (GTK_WINDOW (target_window), "Window to size");
8175 /* don't show target window by default, we want to allow testing
8176 * of behavior on first show.
8179 if (!gtk_widget_get_visible (window))
8180 gtk_widget_show (window);
8182 gtk_widget_destroy (window);
8189 typedef struct _ProgressData {
8192 GtkWidget *block_spin;
8193 GtkWidget *x_align_spin;
8194 GtkWidget *y_align_spin;
8195 GtkWidget *step_spin;
8196 GtkWidget *act_blocks_spin;
8207 progress_timeout (gpointer data)
8209 ProgressData *pdata = data;
8213 if (pdata->activity)
8215 gtk_progress_bar_pulse (GTK_PROGRESS_BAR (pdata->pbar));
8217 text = g_strdup_printf ("%s", "???");
8221 new_val = gtk_progress_bar_get_fraction (GTK_PROGRESS_BAR (pdata->pbar)) + 0.01;
8224 gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (pdata->pbar), new_val);
8226 text = g_strdup_printf ("%.0f%%", 100 * new_val);
8229 gtk_label_set_text (GTK_LABEL (pdata->label), text);
8236 destroy_progress (GtkWidget *widget,
8237 ProgressData **pdata)
8239 if ((*pdata)->timer)
8241 g_source_remove ((*pdata)->timer);
8242 (*pdata)->timer = 0;
8244 (*pdata)->window = NULL;
8250 progressbar_toggle_orientation (GtkWidget *widget, gpointer data)
8252 ProgressData *pdata;
8255 pdata = (ProgressData *) data;
8257 if (!gtk_widget_get_mapped (widget))
8260 i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8262 if (i == 0 || i == 1)
8263 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_HORIZONTAL);
8265 gtk_orientable_set_orientation (GTK_ORIENTABLE (pdata->pbar), GTK_ORIENTATION_VERTICAL);
8267 if (i == 1 || i == 2)
8268 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), TRUE);
8270 gtk_progress_bar_set_inverted (GTK_PROGRESS_BAR (pdata->pbar), FALSE);
8274 toggle_show_text (GtkWidget *widget, ProgressData *pdata)
8278 active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8279 gtk_progress_bar_set_show_text (GTK_PROGRESS_BAR (pdata->pbar), active);
8283 progressbar_toggle_ellipsize (GtkWidget *widget,
8286 ProgressData *pdata = data;
8287 if (gtk_widget_is_drawable (widget))
8289 gint i = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
8290 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar), i);
8295 toggle_activity_mode (GtkWidget *widget, ProgressData *pdata)
8297 pdata->activity = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
8301 toggle_running (GtkWidget *widget, ProgressData *pdata)
8303 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
8305 if (pdata->timer == 0)
8306 pdata->timer = g_timeout_add (100, (GSourceFunc)progress_timeout, pdata);
8310 if (pdata->timer != 0)
8312 g_source_remove (pdata->timer);
8319 entry_changed (GtkWidget *widget, ProgressData *pdata)
8321 gtk_progress_bar_set_text (GTK_PROGRESS_BAR (pdata->pbar),
8322 gtk_entry_get_text (GTK_ENTRY (pdata->entry)));
8326 create_progress_bar (GtkWidget *widget)
8328 GtkWidget *action_area, *content_area;
8338 static ProgressData *pdata = NULL;
8340 static gchar *items1[] =
8348 static char *ellipsize_items[] = {
8349 "None", // PANGO_ELLIPSIZE_NONE,
8350 "Start", // PANGO_ELLIPSIZE_START,
8351 "Middle", // PANGO_ELLIPSIZE_MIDDLE,
8352 "End", // PANGO_ELLIPSIZE_END
8356 pdata = g_new0 (ProgressData, 1);
8360 pdata->window = gtk_dialog_new ();
8362 gtk_window_set_screen (GTK_WINDOW (pdata->window),
8363 gtk_widget_get_screen (widget));
8365 gtk_window_set_resizable (GTK_WINDOW (pdata->window), TRUE);
8367 g_signal_connect (pdata->window, "destroy",
8368 G_CALLBACK (destroy_progress),
8372 content_area = gtk_dialog_get_content_area (GTK_DIALOG (pdata->window));
8373 action_area = gtk_dialog_get_action_area (GTK_DIALOG (pdata->window));
8375 gtk_window_set_title (GTK_WINDOW (pdata->window), "GtkProgressBar");
8376 gtk_container_set_border_width (GTK_CONTAINER (pdata->window), 0);
8378 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8379 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
8380 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, TRUE, 0);
8382 frame = gtk_frame_new ("Progress");
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 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8389 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8391 pdata->pbar = gtk_progress_bar_new ();
8392 gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (pdata->pbar),
8393 PANGO_ELLIPSIZE_MIDDLE);
8395 gtk_container_add (GTK_CONTAINER (align), pdata->pbar);
8397 align = gtk_alignment_new (0.5, 0.5, 0, 0);
8398 gtk_box_pack_start (GTK_BOX (vbox2), align, FALSE, FALSE, 5);
8400 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
8401 gtk_container_add (GTK_CONTAINER (align), hbox);
8402 label = gtk_label_new ("Label updated by user :");
8403 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8404 pdata->label = gtk_label_new ("");
8405 gtk_box_pack_start (GTK_BOX (hbox), pdata->label, FALSE, TRUE, 0);
8407 frame = gtk_frame_new ("Options");
8408 gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
8410 vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
8411 gtk_container_add (GTK_CONTAINER (frame), vbox2);
8413 tab = gtk_table_new (7, 2, FALSE);
8414 gtk_box_pack_start (GTK_BOX (vbox2), tab, FALSE, TRUE, 0);
8416 label = gtk_label_new ("Orientation :");
8417 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 0, 1,
8418 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8420 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
8422 pdata->omenu1 = build_option_menu (items1, 4, 0,
8423 progressbar_toggle_orientation,
8425 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8426 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 0, 1,
8427 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8429 gtk_box_pack_start (GTK_BOX (hbox), pdata->omenu1, TRUE, TRUE, 0);
8431 check = gtk_check_button_new_with_label ("Running");
8432 g_signal_connect (check, "toggled",
8433 G_CALLBACK (toggle_running),
8435 gtk_table_attach (GTK_TABLE (tab), check, 0, 2, 1, 2,
8436 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8438 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check), TRUE);
8440 check = gtk_check_button_new_with_label ("Show text");
8441 g_signal_connect (check, "clicked",
8442 G_CALLBACK (toggle_show_text),
8444 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 2, 3,
8445 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8448 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8449 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 2, 3,
8450 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8453 label = gtk_label_new ("Text: ");
8454 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
8456 pdata->entry = gtk_entry_new ();
8457 g_signal_connect (pdata->entry, "changed",
8458 G_CALLBACK (entry_changed),
8460 gtk_box_pack_start (GTK_BOX (hbox), pdata->entry, TRUE, TRUE, 0);
8461 gtk_widget_set_size_request (pdata->entry, 100, -1);
8463 label = gtk_label_new ("Ellipsize text :");
8464 gtk_table_attach (GTK_TABLE (tab), label, 0, 1, 10, 11,
8465 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8467 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
8468 pdata->elmenu = build_option_menu (ellipsize_items,
8469 sizeof (ellipsize_items) / sizeof (ellipsize_items[0]),
8470 2, // PANGO_ELLIPSIZE_MIDDLE
8471 progressbar_toggle_ellipsize,
8473 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
8474 gtk_table_attach (GTK_TABLE (tab), hbox, 1, 2, 10, 11,
8475 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8477 gtk_box_pack_start (GTK_BOX (hbox), pdata->elmenu, TRUE, TRUE, 0);
8479 check = gtk_check_button_new_with_label ("Activity mode");
8480 g_signal_connect (check, "clicked",
8481 G_CALLBACK (toggle_activity_mode), pdata);
8482 gtk_table_attach (GTK_TABLE (tab), check, 0, 1, 15, 16,
8483 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL,
8486 button = gtk_button_new_with_label ("close");
8487 g_signal_connect_swapped (button, "clicked",
8488 G_CALLBACK (gtk_widget_destroy),
8490 gtk_widget_set_can_default (button, TRUE);
8491 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
8492 gtk_widget_grab_default (button);
8495 if (!gtk_widget_get_visible (pdata->window))
8496 gtk_widget_show_all (pdata->window);
8498 gtk_widget_destroy (pdata->window);
8510 GtkWidget *res_widget;
8514 find_widget (GtkWidget *widget, FindWidgetData *data)
8516 GtkAllocation new_allocation;
8520 gtk_widget_get_allocation (widget, &new_allocation);
8522 if (data->found || !gtk_widget_get_mapped (widget))
8525 /* Note that in the following code, we only count the
8526 * position as being inside a WINDOW widget if it is inside
8527 * widget->window; points that are outside of widget->window
8528 * but within the allocation are not counted. This is consistent
8529 * with the way we highlight drag targets.
8531 if (gtk_widget_get_has_window (widget))
8533 new_allocation.x = 0;
8534 new_allocation.y = 0;
8537 if (gtk_widget_get_parent (widget) && !data->first)
8539 GdkWindow *window = gtk_widget_get_window (widget);
8540 while (window != gtk_widget_get_window (gtk_widget_get_parent (widget)))
8542 gint tx, ty, twidth, theight;
8544 twidth = gdk_window_get_width (window);
8545 theight = gdk_window_get_height (window);
8547 if (new_allocation.x < 0)
8549 new_allocation.width += new_allocation.x;
8550 new_allocation.x = 0;
8552 if (new_allocation.y < 0)
8554 new_allocation.height += new_allocation.y;
8555 new_allocation.y = 0;
8557 if (new_allocation.x + new_allocation.width > twidth)
8558 new_allocation.width = twidth - new_allocation.x;
8559 if (new_allocation.y + new_allocation.height > theight)
8560 new_allocation.height = theight - new_allocation.y;
8562 gdk_window_get_position (window, &tx, &ty);
8563 new_allocation.x += tx;
8565 new_allocation.y += ty;
8568 window = gdk_window_get_parent (window);
8572 if ((data->x >= new_allocation.x) && (data->y >= new_allocation.y) &&
8573 (data->x < new_allocation.x + new_allocation.width) &&
8574 (data->y < new_allocation.y + new_allocation.height))
8576 /* First, check if the drag is in a valid drop site in
8577 * one of our children
8579 if (GTK_IS_CONTAINER (widget))
8581 FindWidgetData new_data = *data;
8583 new_data.x -= x_offset;
8584 new_data.y -= y_offset;
8585 new_data.found = FALSE;
8586 new_data.first = FALSE;
8588 gtk_container_forall (GTK_CONTAINER (widget),
8589 (GtkCallback)find_widget,
8592 data->found = new_data.found;
8594 data->res_widget = new_data.res_widget;
8597 /* If not, and this widget is registered as a drop site, check to
8598 * emit "drag_motion" to check if we are actually in
8604 data->res_widget = widget;
8610 find_widget_at_pointer (GdkDevice *device)
8612 GtkWidget *widget = NULL;
8613 GdkWindow *pointer_window;
8615 FindWidgetData data;
8617 pointer_window = gdk_device_get_window_at_position (device, NULL, NULL);
8621 gpointer widget_ptr;
8623 gdk_window_get_user_data (pointer_window, &widget_ptr);
8624 widget = widget_ptr;
8629 gdk_window_get_pointer (gtk_widget_get_window (widget),
8637 find_widget (widget, &data);
8639 return data.res_widget;
8645 struct PropertiesData {
8653 destroy_properties (GtkWidget *widget,
8654 struct PropertiesData *data)
8658 *data->window = NULL;
8659 data->window = NULL;
8664 g_object_unref (data->cursor);
8665 data->cursor = NULL;
8670 g_signal_handler_disconnect (widget, data->handler);
8678 property_query_event (GtkWidget *widget,
8680 struct PropertiesData *data)
8682 GtkWidget *res_widget = NULL;
8684 if (!data->in_query)
8687 if (event->type == GDK_BUTTON_RELEASE)
8689 gtk_grab_remove (widget);
8690 gdk_device_ungrab (gdk_event_get_device (event), GDK_CURRENT_TIME);
8692 res_widget = find_widget_at_pointer (gdk_event_get_device (event));
8695 g_object_set_data (G_OBJECT (res_widget), "prop-editor-screen",
8696 gtk_widget_get_screen (widget));
8697 create_prop_editor (G_OBJECT (res_widget), 0);
8700 data->in_query = FALSE;
8707 query_properties (GtkButton *button,
8708 struct PropertiesData *data)
8710 GtkWidget *widget = GTK_WIDGET (button);
8711 GdkDisplay *display;
8712 GdkDeviceManager *device_manager;
8715 g_signal_connect (button, "event",
8716 G_CALLBACK (property_query_event), data);
8718 display = gtk_widget_get_display (widget);
8721 data->cursor = gdk_cursor_new_for_display (display, GDK_TARGET);
8723 device_manager = gdk_display_get_device_manager (display);
8724 device = gdk_device_manager_get_client_pointer (device_manager);
8725 gdk_device_grab (device,
8726 gtk_widget_get_window (widget),
8729 GDK_BUTTON_RELEASE_MASK,
8732 gtk_grab_add (widget);
8734 data->in_query = TRUE;
8738 create_properties (GtkWidget *widget)
8740 static GtkWidget *window = NULL;
8744 struct PropertiesData *data;
8746 data = g_new (struct PropertiesData, 1);
8747 data->window = &window;
8748 data->in_query = FALSE;
8749 data->cursor = NULL;
8754 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8756 gtk_window_set_screen (GTK_WINDOW (window),
8757 gtk_widget_get_screen (widget));
8759 data->handler = g_signal_connect (window, "destroy",
8760 G_CALLBACK (destroy_properties),
8763 gtk_window_set_title (GTK_WINDOW (window), "test properties");
8764 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
8766 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1);
8767 gtk_container_add (GTK_CONTAINER (window), vbox);
8769 label = gtk_label_new ("This is just a dumb test to test properties.\nIf you need a generic module, get GLE.");
8770 gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
8772 button = gtk_button_new_with_label ("Query properties");
8773 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8774 g_signal_connect (button, "clicked",
8775 G_CALLBACK (query_properties),
8779 if (!gtk_widget_get_visible (window))
8780 gtk_widget_show_all (window);
8782 gtk_widget_destroy (window);
8786 struct SnapshotData {
8787 GtkWidget *toplevel_button;
8791 gboolean is_toplevel;
8796 destroy_snapshot_data (GtkWidget *widget,
8797 struct SnapshotData *data)
8800 *data->window = NULL;
8804 g_object_unref (data->cursor);
8805 data->cursor = NULL;
8810 g_signal_handler_disconnect (widget, data->handler);
8818 snapshot_widget_event (GtkWidget *widget,
8820 struct SnapshotData *data)
8822 GtkWidget *res_widget = NULL;
8824 if (!data->in_query)
8827 if (event->type == GDK_BUTTON_RELEASE)
8829 gtk_grab_remove (widget);
8830 gdk_device_ungrab (gdk_event_get_device (event),
8833 res_widget = find_widget_at_pointer (gdk_event_get_device (event));
8834 if (data->is_toplevel && res_widget)
8835 res_widget = gtk_widget_get_toplevel (res_widget);
8838 cairo_surface_t *surface;
8839 GtkWidget *window, *image;
8844 width = gtk_widget_get_allocated_width (res_widget);
8845 height = gtk_widget_get_allocated_height (res_widget);
8847 surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
8849 cr = cairo_create (surface);
8850 gtk_widget_draw (res_widget, cr);
8853 pixbuf = gdk_pixbuf_get_from_surface (surface,
8856 cairo_surface_destroy (surface);
8858 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8859 image = gtk_image_new_from_pixbuf (pixbuf);
8860 g_object_unref (pixbuf);
8862 gtk_container_add (GTK_CONTAINER (window), image);
8863 gtk_widget_show_all (window);
8866 data->in_query = FALSE;
8873 snapshot_widget (GtkButton *button,
8874 struct SnapshotData *data)
8876 GtkWidget *widget = GTK_WIDGET (button);
8879 device = gtk_get_current_event_device ();
8883 if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
8884 device = gdk_device_get_associated_device (device);
8886 data->is_toplevel = widget == data->toplevel_button;
8889 data->cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget),
8892 gdk_device_grab (device,
8893 gtk_widget_get_window (widget),
8894 GDK_OWNERSHIP_APPLICATION,
8896 GDK_BUTTON_RELEASE_MASK,
8900 g_signal_connect (button, "event",
8901 G_CALLBACK (snapshot_widget_event), data);
8903 gtk_grab_add (widget);
8905 data->in_query = TRUE;
8909 create_snapshot (GtkWidget *widget)
8911 static GtkWidget *window = NULL;
8914 struct SnapshotData *data;
8916 data = g_new (struct SnapshotData, 1);
8917 data->window = &window;
8918 data->in_query = FALSE;
8919 data->cursor = NULL;
8924 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
8926 gtk_window_set_screen (GTK_WINDOW (window),
8927 gtk_widget_get_screen (widget));
8929 data->handler = g_signal_connect (window, "destroy",
8930 G_CALLBACK (destroy_snapshot_data),
8933 gtk_window_set_title (GTK_WINDOW (window), "test snapshot");
8934 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
8936 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 1);
8937 gtk_container_add (GTK_CONTAINER (window), vbox);
8939 button = gtk_button_new_with_label ("Snapshot widget");
8940 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8941 g_signal_connect (button, "clicked",
8942 G_CALLBACK (snapshot_widget),
8945 button = gtk_button_new_with_label ("Snapshot toplevel");
8946 data->toplevel_button = button;
8947 gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
8948 g_signal_connect (button, "clicked",
8949 G_CALLBACK (snapshot_widget),
8953 if (!gtk_widget_get_visible (window))
8954 gtk_widget_show_all (window);
8956 gtk_widget_destroy (window);
8965 selection_test_received (GtkWidget *tree_view,
8966 GtkSelectionData *selection_data)
8968 GtkTreeModel *model;
8969 GtkListStore *store;
8973 if (gtk_selection_data_get_length (selection_data) < 0)
8975 g_print ("Selection retrieval failed\n");
8978 if (gtk_selection_data_get_data_type (selection_data) != GDK_SELECTION_TYPE_ATOM)
8980 g_print ("Selection \"TARGETS\" was not returned as atoms!\n");
8984 /* Clear out any current list items */
8986 model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
8987 store = GTK_LIST_STORE (model);
8988 gtk_list_store_clear (store);
8990 /* Add new items to list */
8992 gtk_selection_data_get_targets (selection_data,
8995 for (i = 0; i < l; i++)
9000 name = gdk_atom_name (atoms[i]);
9003 gtk_list_store_insert_with_values (store, &iter, i, 0, name, -1);
9007 gtk_list_store_insert_with_values (store, &iter, i, 0, "(bad atom)", -1);
9014 selection_test_get_targets (GtkWidget *widget, GtkWidget *tree_view)
9016 static GdkAtom targets_atom = GDK_NONE;
9018 if (targets_atom == GDK_NONE)
9019 targets_atom = gdk_atom_intern ("TARGETS", FALSE);
9021 gtk_selection_convert (tree_view, GDK_SELECTION_PRIMARY, targets_atom,
9026 create_selection_test (GtkWidget *widget)
9028 static GtkWidget *window = NULL;
9029 GtkWidget *action_area, *content_area;
9032 GtkWidget *scrolled_win;
9033 GtkListStore* store;
9034 GtkWidget *tree_view;
9035 GtkTreeViewColumn *column;
9036 GtkCellRenderer *renderer;
9041 window = gtk_dialog_new ();
9043 gtk_window_set_screen (GTK_WINDOW (window),
9044 gtk_widget_get_screen (widget));
9046 g_signal_connect (window, "destroy",
9047 G_CALLBACK (gtk_widget_destroyed),
9050 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9051 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9053 gtk_window_set_title (GTK_WINDOW (window), "Selection Test");
9054 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9056 /* Create the list */
9058 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
9059 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9060 gtk_box_pack_start (GTK_BOX (content_area), vbox, TRUE, TRUE, 0);
9062 label = gtk_label_new ("Gets available targets for current selection");
9063 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9065 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
9066 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
9067 GTK_POLICY_AUTOMATIC,
9068 GTK_POLICY_AUTOMATIC);
9069 gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 0);
9070 gtk_widget_set_size_request (scrolled_win, 100, 200);
9072 store = gtk_list_store_new (1, G_TYPE_STRING);
9073 tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
9074 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_win), tree_view);
9076 renderer = gtk_cell_renderer_text_new ();
9077 column = gtk_tree_view_column_new_with_attributes ("Target", renderer,
9079 gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
9081 g_signal_connect (tree_view, "selection_received",
9082 G_CALLBACK (selection_test_received), NULL);
9084 /* .. And create some buttons */
9085 button = gtk_button_new_with_label ("Get Targets");
9086 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9088 g_signal_connect (button, "clicked",
9089 G_CALLBACK (selection_test_get_targets), tree_view);
9091 button = gtk_button_new_with_label ("Quit");
9092 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9094 g_signal_connect_swapped (button, "clicked",
9095 G_CALLBACK (gtk_widget_destroy),
9099 if (!gtk_widget_get_visible (window))
9100 gtk_widget_show_all (window);
9102 gtk_widget_destroy (window);
9109 static int scroll_test_pos = 0.0;
9112 scroll_test_draw (GtkWidget *widget,
9114 GtkAdjustment *adjustment)
9117 gint imin, imax, jmin, jmax;
9120 gdk_cairo_get_clip_rectangle (cr, &clip);
9122 imin = (clip.x) / 10;
9123 imax = (clip.x + clip.width + 9) / 10;
9125 jmin = ((int)gtk_adjustment_get_value (adjustment) + clip.y) / 10;
9126 jmax = ((int)gtk_adjustment_get_value (adjustment) + clip.y + clip.height + 9) / 10;
9128 for (i=imin; i<imax; i++)
9129 for (j=jmin; j<jmax; j++)
9131 cairo_rectangle (cr, 10*i, 10*j - (int)gtk_adjustment_get_value (adjustment), 1+i%10, 1+j%10);
9139 scroll_test_scroll (GtkWidget *widget, GdkEventScroll *event,
9140 GtkAdjustment *adjustment)
9142 gdouble new_value = gtk_adjustment_get_value (adjustment) + ((event->direction == GDK_SCROLL_UP) ?
9143 -gtk_adjustment_get_page_increment (adjustment) / 2:
9144 gtk_adjustment_get_page_increment (adjustment) / 2);
9145 new_value = CLAMP (new_value, gtk_adjustment_get_lower (adjustment), gtk_adjustment_get_upper (adjustment) - gtk_adjustment_get_page_size (adjustment));
9146 gtk_adjustment_set_value (adjustment, new_value);
9152 scroll_test_configure (GtkWidget *widget, GdkEventConfigure *event,
9153 GtkAdjustment *adjustment)
9155 GtkAllocation allocation;
9157 gtk_widget_get_allocation (widget, &allocation);
9158 gtk_adjustment_configure (adjustment,
9159 gtk_adjustment_get_value (adjustment),
9160 gtk_adjustment_get_lower (adjustment),
9161 gtk_adjustment_get_upper (adjustment),
9162 0.1 * allocation.height,
9163 0.9 * allocation.height,
9168 scroll_test_adjustment_changed (GtkAdjustment *adjustment, GtkWidget *widget)
9173 dy = scroll_test_pos - (int)gtk_adjustment_get_value (adjustment);
9174 scroll_test_pos = gtk_adjustment_get_value (adjustment);
9176 if (!gtk_widget_is_drawable (widget))
9179 window = gtk_widget_get_window (widget);
9180 gdk_window_scroll (window, 0, dy);
9181 gdk_window_process_updates (window, FALSE);
9186 create_scroll_test (GtkWidget *widget)
9188 static GtkWidget *window = NULL;
9189 GtkWidget *action_area, *content_area;
9191 GtkWidget *drawing_area;
9192 GtkWidget *scrollbar;
9194 GtkAdjustment *adjustment;
9195 GdkGeometry geometry;
9196 GdkWindowHints geometry_mask;
9200 window = gtk_dialog_new ();
9202 gtk_window_set_screen (GTK_WINDOW (window),
9203 gtk_widget_get_screen (widget));
9205 g_signal_connect (window, "destroy",
9206 G_CALLBACK (gtk_widget_destroyed),
9209 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9210 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9212 gtk_window_set_title (GTK_WINDOW (window), "Scroll Test");
9213 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9215 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
9216 gtk_box_pack_start (GTK_BOX (content_area), hbox, TRUE, TRUE, 0);
9217 gtk_widget_show (hbox);
9219 drawing_area = gtk_drawing_area_new ();
9220 gtk_widget_set_size_request (drawing_area, 200, 200);
9221 gtk_box_pack_start (GTK_BOX (hbox), drawing_area, TRUE, TRUE, 0);
9222 gtk_widget_show (drawing_area);
9224 gtk_widget_set_events (drawing_area, GDK_EXPOSURE_MASK | GDK_SCROLL_MASK);
9226 adjustment = gtk_adjustment_new (0.0, 0.0, 1000.0, 1.0, 180.0, 200.0);
9227 scroll_test_pos = 0.0;
9229 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, adjustment);
9230 gtk_box_pack_start (GTK_BOX (hbox), scrollbar, FALSE, FALSE, 0);
9231 gtk_widget_show (scrollbar);
9233 g_signal_connect (drawing_area, "draw",
9234 G_CALLBACK (scroll_test_draw), adjustment);
9235 g_signal_connect (drawing_area, "configure_event",
9236 G_CALLBACK (scroll_test_configure), adjustment);
9237 g_signal_connect (drawing_area, "scroll_event",
9238 G_CALLBACK (scroll_test_scroll), adjustment);
9240 g_signal_connect (adjustment, "value_changed",
9241 G_CALLBACK (scroll_test_adjustment_changed),
9244 /* .. And create some buttons */
9246 button = gtk_button_new_with_label ("Quit");
9247 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9249 g_signal_connect_swapped (button, "clicked",
9250 G_CALLBACK (gtk_widget_destroy),
9252 gtk_widget_show (button);
9254 /* Set up gridded geometry */
9256 geometry_mask = GDK_HINT_MIN_SIZE |
9257 GDK_HINT_BASE_SIZE |
9258 GDK_HINT_RESIZE_INC;
9260 geometry.min_width = 20;
9261 geometry.min_height = 20;
9262 geometry.base_width = 0;
9263 geometry.base_height = 0;
9264 geometry.width_inc = 10;
9265 geometry.height_inc = 10;
9267 gtk_window_set_geometry_hints (GTK_WINDOW (window),
9268 drawing_area, &geometry, geometry_mask);
9271 if (!gtk_widget_get_visible (window))
9272 gtk_widget_show (window);
9274 gtk_widget_destroy (window);
9281 static int timer = 0;
9284 timeout_test (GtkWidget *label)
9286 static int count = 0;
9287 static char buffer[32];
9289 sprintf (buffer, "count: %d", ++count);
9290 gtk_label_set_text (GTK_LABEL (label), buffer);
9296 start_timeout_test (GtkWidget *widget,
9301 timer = g_timeout_add (100, (GSourceFunc)timeout_test, label);
9306 stop_timeout_test (GtkWidget *widget,
9311 g_source_remove (timer);
9317 destroy_timeout_test (GtkWidget *widget,
9320 stop_timeout_test (NULL, NULL);
9326 create_timeout_test (GtkWidget *widget)
9328 static GtkWidget *window = NULL;
9329 GtkWidget *action_area, *content_area;
9335 window = gtk_dialog_new ();
9337 gtk_window_set_screen (GTK_WINDOW (window),
9338 gtk_widget_get_screen (widget));
9340 g_signal_connect (window, "destroy",
9341 G_CALLBACK (destroy_timeout_test),
9344 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9345 action_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9347 gtk_window_set_title (GTK_WINDOW (window), "Timeout Test");
9348 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9350 label = gtk_label_new ("count: 0");
9351 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
9352 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9353 gtk_widget_show (label);
9355 button = gtk_button_new_with_label ("close");
9356 g_signal_connect_swapped (button, "clicked",
9357 G_CALLBACK (gtk_widget_destroy),
9359 gtk_widget_set_can_default (button, TRUE);
9360 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9361 gtk_widget_grab_default (button);
9362 gtk_widget_show (button);
9364 button = gtk_button_new_with_label ("start");
9365 g_signal_connect (button, "clicked",
9366 G_CALLBACK(start_timeout_test),
9368 gtk_widget_set_can_default (button, TRUE);
9369 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9370 gtk_widget_show (button);
9372 button = gtk_button_new_with_label ("stop");
9373 g_signal_connect (button, "clicked",
9374 G_CALLBACK (stop_timeout_test),
9376 gtk_widget_set_can_default (button, TRUE);
9377 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9378 gtk_widget_show (button);
9381 if (!gtk_widget_get_visible (window))
9382 gtk_widget_show (window);
9384 gtk_widget_destroy (window);
9391 static int idle_id = 0;
9394 idle_test (GtkWidget *label)
9396 static int count = 0;
9397 static char buffer[32];
9399 sprintf (buffer, "count: %d", ++count);
9400 gtk_label_set_text (GTK_LABEL (label), buffer);
9406 start_idle_test (GtkWidget *widget,
9411 idle_id = g_idle_add ((GSourceFunc) idle_test, label);
9416 stop_idle_test (GtkWidget *widget,
9421 g_source_remove (idle_id);
9427 destroy_idle_test (GtkWidget *widget,
9430 stop_idle_test (NULL, NULL);
9436 toggle_idle_container (GObject *button,
9437 GtkContainer *container)
9439 gtk_container_set_resize_mode (container, GPOINTER_TO_INT (g_object_get_data (button, "user_data")));
9443 create_idle_test (GtkWidget *widget)
9445 static GtkWidget *window = NULL;
9448 GtkWidget *container;
9452 GtkWidget *action_area, *content_area;
9457 window = gtk_dialog_new ();
9459 gtk_window_set_screen (GTK_WINDOW (window),
9460 gtk_widget_get_screen (widget));
9462 g_signal_connect (window, "destroy",
9463 G_CALLBACK (destroy_idle_test),
9466 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9467 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9469 gtk_window_set_title (GTK_WINDOW (window), "Idle Test");
9470 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9472 label = gtk_label_new ("count: 0");
9473 gtk_misc_set_padding (GTK_MISC (label), 10, 10);
9474 gtk_widget_show (label);
9477 g_object_new (GTK_TYPE_HBOX,
9479 /* "GtkContainer::child", g_object_new (GTK_TYPE_HBOX,
9480 * "GtkWidget::visible", TRUE,
9485 gtk_box_pack_start (GTK_BOX (content_area), container, TRUE, TRUE, 0);
9488 g_object_new (GTK_TYPE_FRAME,
9490 "label", "Label Container",
9492 "parent", content_area,
9495 g_object_new (GTK_TYPE_VBOX,
9500 g_object_connect (g_object_new (GTK_TYPE_RADIO_BUTTON,
9501 "label", "Resize-Parent",
9502 "user_data", (void*)GTK_RESIZE_PARENT,
9506 "signal::clicked", toggle_idle_container, container,
9508 button = g_object_new (GTK_TYPE_RADIO_BUTTON,
9509 "label", "Resize-Queue",
9510 "user_data", (void*)GTK_RESIZE_QUEUE,
9515 g_object_connect (button,
9516 "signal::clicked", toggle_idle_container, container,
9518 button2 = g_object_new (GTK_TYPE_RADIO_BUTTON,
9519 "label", "Resize-Immediate",
9520 "user_data", (void*)GTK_RESIZE_IMMEDIATE,
9522 g_object_connect (button2,
9523 "signal::clicked", toggle_idle_container, container,
9525 g_object_set (button2,
9531 button = gtk_button_new_with_label ("close");
9532 g_signal_connect_swapped (button, "clicked",
9533 G_CALLBACK (gtk_widget_destroy),
9535 gtk_widget_set_can_default (button, TRUE);
9536 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9537 gtk_widget_grab_default (button);
9538 gtk_widget_show (button);
9540 button = gtk_button_new_with_label ("start");
9541 g_signal_connect (button, "clicked",
9542 G_CALLBACK (start_idle_test),
9544 gtk_widget_set_can_default (button, TRUE);
9545 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9546 gtk_widget_show (button);
9548 button = gtk_button_new_with_label ("stop");
9549 g_signal_connect (button, "clicked",
9550 G_CALLBACK (stop_idle_test),
9552 gtk_widget_set_can_default (button, TRUE);
9553 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9554 gtk_widget_show (button);
9557 if (!gtk_widget_get_visible (window))
9558 gtk_widget_show (window);
9560 gtk_widget_destroy (window);
9568 create_rc_file (GtkWidget *widget)
9570 static GtkWidget *window = NULL;
9571 GtkWidget *action_area, *content_area;
9579 window = gtk_dialog_new ();
9581 gtk_window_set_screen (GTK_WINDOW (window),
9582 gtk_widget_get_screen (widget));
9584 g_signal_connect (window, "destroy",
9585 G_CALLBACK (gtk_widget_destroyed),
9588 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9589 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9591 frame = gtk_aspect_frame_new ("Testing RC file prioritization", 0.5, 0.5, 0.0, TRUE);
9592 gtk_box_pack_start (GTK_BOX (content_area), frame, FALSE, FALSE, 0);
9594 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
9595 gtk_container_add (GTK_CONTAINER (frame), vbox);
9597 label = gtk_label_new ("This label should be red");
9598 gtk_widget_set_name (label, "testgtk-red-label");
9599 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9601 label = gtk_label_new ("This label should be green");
9602 gtk_widget_set_name (label, "testgtk-green-label");
9603 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9605 label = gtk_label_new ("This label should be blue");
9606 gtk_widget_set_name (label, "testgtk-blue-label");
9607 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9609 gtk_window_set_title (GTK_WINDOW (window), "Reload Rc file");
9610 gtk_container_set_border_width (GTK_CONTAINER (window), 0);
9612 button = gtk_button_new_with_label ("Reload");
9613 g_signal_connect_swapped (button, "clicked",
9614 G_CALLBACK (gtk_style_context_reset_widgets),
9615 gtk_widget_get_screen (button));
9616 gtk_widget_set_can_default (button, TRUE);
9617 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9618 gtk_widget_grab_default (button);
9620 button = gtk_button_new_with_label ("Close");
9621 g_signal_connect_swapped (button, "clicked",
9622 G_CALLBACK (gtk_widget_destroy),
9624 gtk_widget_set_can_default (button, TRUE);
9625 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9628 if (!gtk_widget_get_visible (window))
9629 gtk_widget_show_all (window);
9631 gtk_widget_destroy (window);
9635 * Test of recursive mainloop
9639 mainloop_destroyed (GtkWidget *w, GtkWidget **window)
9646 create_mainloop (GtkWidget *widget)
9648 static GtkWidget *window = NULL;
9649 GtkWidget *action_area, *content_area;
9655 window = gtk_dialog_new ();
9657 gtk_window_set_screen (GTK_WINDOW (window),
9658 gtk_widget_get_screen (widget));
9660 gtk_window_set_title (GTK_WINDOW (window), "Test Main Loop");
9662 g_signal_connect (window, "destroy",
9663 G_CALLBACK (mainloop_destroyed),
9666 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9667 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9669 label = gtk_label_new ("In recursive main loop...");
9670 gtk_misc_set_padding (GTK_MISC(label), 20, 20);
9672 gtk_box_pack_start (GTK_BOX (content_area), label, TRUE, TRUE, 0);
9673 gtk_widget_show (label);
9675 button = gtk_button_new_with_label ("Leave");
9676 gtk_box_pack_start (GTK_BOX (action_area), button, FALSE, TRUE, 0);
9678 g_signal_connect_swapped (button, "clicked",
9679 G_CALLBACK (gtk_widget_destroy),
9682 gtk_widget_set_can_default (button, TRUE);
9683 gtk_widget_grab_default (button);
9685 gtk_widget_show (button);
9688 if (!gtk_widget_get_visible (window))
9690 gtk_widget_show (window);
9692 g_print ("create_mainloop: start\n");
9694 g_print ("create_mainloop: done\n");
9697 gtk_widget_destroy (window);
9701 layout_draw_handler (GtkWidget *widget, cairo_t *cr)
9704 GdkWindow *bin_window;
9707 gint imin, imax, jmin, jmax;
9709 layout = GTK_LAYOUT (widget);
9710 bin_window = gtk_layout_get_bin_window (layout);
9712 if (!gtk_cairo_should_draw_window (cr, bin_window))
9715 gdk_window_get_position (bin_window, &x, &y);
9716 cairo_translate (cr, x, y);
9718 gdk_cairo_get_clip_rectangle (cr, &clip);
9720 imin = (clip.x) / 10;
9721 imax = (clip.x + clip.width + 9) / 10;
9723 jmin = (clip.y) / 10;
9724 jmax = (clip.y + clip.height + 9) / 10;
9726 for (i=imin; i<imax; i++)
9727 for (j=jmin; j<jmax; j++)
9729 cairo_rectangle (cr,
9738 void create_layout (GtkWidget *widget)
9740 GtkAdjustment *hadjustment, *vadjustment;
9742 static GtkWidget *window = NULL;
9743 GtkWidget *layout_widget;
9744 GtkWidget *scrolledwindow;
9753 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
9754 gtk_window_set_screen (GTK_WINDOW (window),
9755 gtk_widget_get_screen (widget));
9757 g_signal_connect (window, "destroy",
9758 G_CALLBACK (gtk_widget_destroyed),
9761 gtk_window_set_title (GTK_WINDOW (window), "Layout");
9762 gtk_widget_set_size_request (window, 200, 200);
9764 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
9765 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow),
9767 gtk_scrolled_window_set_placement (GTK_SCROLLED_WINDOW (scrolledwindow),
9768 GTK_CORNER_TOP_RIGHT);
9770 gtk_container_add (GTK_CONTAINER (window), scrolledwindow);
9772 layout_widget = gtk_layout_new (NULL, NULL);
9773 layout = GTK_LAYOUT (layout_widget);
9774 gtk_container_add (GTK_CONTAINER (scrolledwindow), layout_widget);
9776 /* We set step sizes here since GtkLayout does not set
9779 hadjustment = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (layout));
9780 vadjustment = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (layout));
9781 gtk_adjustment_set_step_increment (hadjustment, 10.0);
9782 gtk_adjustment_set_step_increment (vadjustment, 10.0);
9783 gtk_scrollable_set_hadjustment (GTK_SCROLLABLE (layout), hadjustment);
9784 gtk_scrollable_set_vadjustment (GTK_SCROLLABLE (layout), vadjustment);
9786 gtk_widget_set_events (layout_widget, GDK_EXPOSURE_MASK);
9787 g_signal_connect (layout, "draw",
9788 G_CALLBACK (layout_draw_handler), NULL);
9790 gtk_layout_set_size (layout, 1600, 128000);
9792 for (i=0 ; i < 16 ; i++)
9793 for (j=0 ; j < 16 ; j++)
9795 sprintf(buf, "Button %d, %d", i, j);
9797 button = gtk_button_new_with_label (buf);
9799 button = gtk_label_new (buf);
9801 gtk_layout_put (layout, button, j*100, i*100);
9804 for (i=16; i < 1280; i++)
9806 sprintf(buf, "Button %d, %d", i, 0);
9808 button = gtk_button_new_with_label (buf);
9810 button = gtk_label_new (buf);
9812 gtk_layout_put (layout, button, 0, i*100);
9816 if (!gtk_widget_get_visible (window))
9817 gtk_widget_show_all (window);
9819 gtk_widget_destroy (window);
9823 /* FIXME: need to completely redo this for GtkStyleContext */
9825 create_styles (GtkWidget *widget)
9827 static GtkWidget *window = NULL;
9828 GtkWidget *content_area, *action_area;
9833 static GdkRGBA red = { 1,0,0,1 };
9834 static GdkRGBA green = { 0,1,0,1 };
9835 static GdkRGBA blue = { 0,0,1,1 };
9836 static GdkRGBA yellow = { 1,1,0,1 };
9837 static GdkRGBA cyan = { 0,1,1,1 };
9838 PangoFontDescription *font_desc;
9840 GtkRcStyle *rc_style;
9844 window = gtk_dialog_new ();
9845 gtk_window_set_screen (GTK_WINDOW (window),
9846 gtk_widget_get_screen (widget));
9848 g_signal_connect (window, "destroy",
9849 G_CALLBACK (gtk_widget_destroyed),
9852 content_area = gtk_dialog_get_content_area (GTK_DIALOG (window));
9853 action_area = gtk_dialog_get_action_area (GTK_DIALOG (window));
9855 button = gtk_button_new_with_label ("Close");
9856 g_signal_connect_swapped (button, "clicked",
9857 G_CALLBACK (gtk_widget_destroy),
9859 gtk_widget_set_can_default (button, TRUE);
9860 gtk_box_pack_start (GTK_BOX (action_area), button, TRUE, TRUE, 0);
9861 gtk_widget_show (button);
9863 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
9864 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
9865 gtk_box_pack_start (GTK_BOX (content_area), vbox, FALSE, FALSE, 0);
9867 label = gtk_label_new ("Font:");
9868 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9869 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9871 font_desc = pango_font_description_from_string ("Helvetica,Sans Oblique 18");
9873 button = gtk_button_new_with_label ("Some Text");
9874 gtk_widget_override_font (gtk_bin_get_child (GTK_BIN (button)), font_desc);
9875 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9877 label = gtk_label_new ("Foreground:");
9878 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9879 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9881 button = gtk_button_new_with_label ("Some Text");
9882 gtk_widget_override_color (gtk_bin_get_child (GTK_BIN (button)), 0, &red);
9883 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9885 label = gtk_label_new ("Background:");
9886 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9887 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9889 button = gtk_button_new_with_label ("Some Text");
9890 gtk_widget_override_background_color (button, 0, &green);
9891 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9893 label = gtk_label_new ("Text:");
9894 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9895 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9897 entry = gtk_entry_new ();
9898 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9899 gtk_widget_override_color (entry, 0, &blue);
9900 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9902 label = gtk_label_new ("Base:");
9903 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9904 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9906 entry = gtk_entry_new ();
9907 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9908 gtk_widget_override_background_color (entry, 0, &yellow);
9909 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9911 label = gtk_label_new ("Cursor:");
9912 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9913 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9915 entry = gtk_entry_new ();
9916 gtk_entry_set_text (GTK_ENTRY (entry), "Some Text");
9917 gtk_widget_modify_cursor (entry, &red, &red);
9918 gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
9920 label = gtk_label_new ("Multiple:");
9921 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
9922 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
9924 button = gtk_button_new_with_label ("Some Text");
9926 rc_style = gtk_rc_style_new ();
9928 rc_style->font_desc = pango_font_description_copy (font_desc);
9929 rc_style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG | GTK_RC_BG;
9930 rc_style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG | GTK_RC_BG;
9931 rc_style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG | GTK_RC_BG;
9932 rc_style->fg[GTK_STATE_NORMAL] = yellow;
9933 rc_style->bg[GTK_STATE_NORMAL] = blue;
9934 rc_style->fg[GTK_STATE_PRELIGHT] = blue;
9935 rc_style->bg[GTK_STATE_PRELIGHT] = yellow;
9936 rc_style->fg[GTK_STATE_ACTIVE] = red;
9937 rc_style->bg[GTK_STATE_ACTIVE] = cyan;
9938 rc_style->xthickness = 5;
9939 rc_style->ythickness = 5;
9941 gtk_widget_modify_style (button, rc_style);
9942 gtk_widget_modify_style (gtk_bin_get_child (GTK_BIN (button)), rc_style);
9944 g_object_unref (rc_style);
9946 gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
9949 if (!gtk_widget_get_visible (window))
9950 gtk_widget_show_all (window);
9952 gtk_widget_destroy (window);
9957 * Main Window and Exit
9961 do_exit (GtkWidget *widget, GtkWidget *window)
9963 gtk_widget_destroy (window);
9969 void (*func) (GtkWidget *widget);
9970 gboolean do_not_benchmark;
9973 { "alpha window", create_alpha_window },
9974 { "big windows", create_big_windows },
9975 { "button box", create_button_box },
9976 { "buttons", create_buttons },
9977 { "check buttons", create_check_buttons },
9978 { "color selection", create_color_selection },
9979 { "composited window", create_composited_window },
9980 { "cursors", create_cursors },
9981 { "dialog", create_dialog },
9982 { "display & screen", create_display_screen, TRUE },
9983 { "entry", create_entry },
9984 { "event box", create_event_box },
9985 { "event watcher", create_event_watcher },
9986 { "expander", create_expander },
9987 { "flipping", create_flipping },
9988 { "focus", create_focus },
9989 { "font selection", create_font_selection },
9990 { "handle box", create_handle_box },
9991 { "image", create_image },
9992 { "key lookup", create_key_lookup },
9993 { "labels", create_labels },
9994 { "layout", create_layout },
9995 { "menus", create_menus },
9996 { "message dialog", create_message_dialog },
9997 { "modal window", create_modal_window, TRUE },
9998 { "notebook", create_notebook },
9999 { "panes", create_panes },
10000 { "paned keyboard", create_paned_keyboard_navigation },
10001 { "pixbuf", create_pixbuf },
10002 { "progress bar", create_progress_bar },
10003 { "properties", create_properties },
10004 { "radio buttons", create_radio_buttons },
10005 { "range controls", create_range_controls },
10006 { "rc file", create_rc_file },
10007 { "reparent", create_reparent },
10008 { "resize grips", create_resize_grips },
10009 { "rotated label", create_rotated_label },
10010 { "rotated text", create_rotated_text },
10011 { "saved position", create_saved_position },
10012 { "scrolled windows", create_scrolled_windows },
10013 { "shapes", create_shapes },
10014 { "size groups", create_size_groups },
10015 { "snapshot", create_snapshot },
10016 { "spinbutton", create_spins },
10017 { "statusbar", create_statusbar },
10019 { "styles", create_styles },
10021 { "test idle", create_idle_test },
10022 { "test mainloop", create_mainloop, TRUE },
10023 { "test scrolling", create_scroll_test },
10024 { "test selection", create_selection_test },
10025 { "test timeout", create_timeout_test },
10026 { "toggle buttons", create_toggle_buttons },
10027 { "toolbar", create_toolbar },
10028 { "tooltips", create_tooltips },
10029 { "WM hints", create_wmhints },
10030 { "window sizing", create_window_sizing },
10031 { "window states", create_window_states }
10033 int nbuttons = sizeof (buttons) / sizeof (buttons[0]);
10036 create_main_window (void)
10041 GtkWidget *scrolled_window;
10045 GtkWidget *separator;
10046 GdkGeometry geometry;
10049 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10050 gtk_widget_set_name (window, "main_window");
10051 gtk_window_move (GTK_WINDOW (window), 50, 20);
10052 gtk_window_set_default_size (GTK_WINDOW (window), -1, 400);
10054 geometry.min_width = -1;
10055 geometry.min_height = -1;
10056 geometry.max_width = -1;
10057 geometry.max_height = G_MAXSHORT;
10058 gtk_window_set_geometry_hints (GTK_WINDOW (window), NULL,
10060 GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
10062 g_signal_connect (window, "destroy",
10063 G_CALLBACK (gtk_main_quit),
10065 g_signal_connect (window, "delete-event",
10066 G_CALLBACK (gtk_false),
10069 box1 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
10070 gtk_container_add (GTK_CONTAINER (window), box1);
10072 if (gtk_micro_version > 0)
10075 gtk_get_major_version (),
10076 gtk_get_minor_version (),
10077 gtk_get_micro_version ());
10081 gtk_get_major_version (),
10082 gtk_get_minor_version ());
10084 label = gtk_label_new (buffer);
10085 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);
10086 gtk_widget_set_name (label, "testgtk-version-label");
10088 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
10089 gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
10090 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
10092 GTK_POLICY_AUTOMATIC);
10093 gtk_box_pack_start (GTK_BOX (box1), scrolled_window, TRUE, TRUE, 0);
10095 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
10096 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10097 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), box2);
10098 gtk_container_set_focus_vadjustment (GTK_CONTAINER (box2),
10099 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window)));
10100 gtk_widget_show (box2);
10102 for (i = 0; i < nbuttons; i++)
10104 button = gtk_button_new_with_label (buttons[i].label);
10105 if (buttons[i].func)
10106 g_signal_connect (button,
10108 G_CALLBACK(buttons[i].func),
10111 gtk_widget_set_sensitive (button, FALSE);
10112 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10115 separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);
10116 gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
10118 box2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10);
10119 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
10120 gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
10122 button = gtk_button_new_with_mnemonic ("_Close");
10123 g_signal_connect (button, "clicked",
10124 G_CALLBACK (do_exit),
10126 gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
10127 gtk_widget_set_can_default (button, TRUE);
10128 gtk_widget_grab_default (button);
10130 gtk_widget_show_all (window);
10136 if (g_file_test ("../modules/input/immodules.cache", G_FILE_TEST_EXISTS))
10137 g_setenv ("GTK_IM_MODULE_FILE", "../modules/input/immodules.cache", TRUE);
10141 pad (const char *str, int to)
10143 static char buf[256];
10144 int len = strlen (str);
10147 for (i = 0; i < to; i++)
10152 memcpy (buf, str, len);
10158 bench_iteration (GtkWidget *widget, void (* fn) (GtkWidget *widget))
10160 fn (widget); /* on */
10161 while (g_main_context_iteration (NULL, FALSE));
10162 fn (widget); /* off */
10163 while (g_main_context_iteration (NULL, FALSE));
10167 do_real_bench (GtkWidget *widget, void (* fn) (GtkWidget *widget), char *name, int num)
10173 static gboolean printed_headers = FALSE;
10175 if (!printed_headers) {
10176 g_print ("Test Iters First Other\n");
10177 g_print ("-------------------- ----- ---------- ----------\n");
10178 printed_headers = TRUE;
10181 g_get_current_time (&tv0);
10182 bench_iteration (widget, fn);
10183 g_get_current_time (&tv1);
10185 dt_first = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10186 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10188 g_get_current_time (&tv0);
10189 for (n = 0; n < num - 1; n++)
10190 bench_iteration (widget, fn);
10191 g_get_current_time (&tv1);
10192 dt = ((double)tv1.tv_sec - tv0.tv_sec) * 1000.0
10193 + (tv1.tv_usec - tv0.tv_usec) / 1000.0;
10195 g_print ("%s %5d ", pad (name, 20), num);
10197 g_print ("%10.1f %10.1f\n", dt_first, dt/(num-1));
10199 g_print ("%10.1f\n", dt_first);
10203 do_bench (char* what, int num)
10207 void (* fn) (GtkWidget *widget);
10209 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
10211 if (g_ascii_strcasecmp (what, "ALL") == 0)
10213 for (i = 0; i < nbuttons; i++)
10215 if (!buttons[i].do_not_benchmark)
10216 do_real_bench (widget, buttons[i].func, buttons[i].label, num);
10223 for (i = 0; i < nbuttons; i++)
10225 if (strcmp (buttons[i].label, what) == 0)
10227 fn = buttons[i].func;
10233 g_print ("Can't bench: \"%s\" not found.\n", what);
10235 do_real_bench (widget, fn, buttons[i].label, num);
10242 fprintf (stderr, "Usage: testgtk [--bench ALL|<bench>[:<count>]]\n");
10247 main (int argc, char *argv[])
10249 GtkCssProvider *provider, *memory_provider;
10250 GdkDisplay *display;
10252 GtkBindingSet *binding_set;
10254 gboolean done_benchmarks = FALSE;
10256 srand (time (NULL));
10260 g_set_application_name ("GTK+ Test Program");
10262 gtk_init (&argc, &argv);
10264 provider = gtk_css_provider_new ();
10266 /* Check to see if we are being run from the correct
10269 if (file_exists ("testgtk.css"))
10270 gtk_css_provider_load_from_path (provider, "testgtk.css", NULL);
10271 else if (file_exists ("tests/testgtk.css"))
10272 gtk_css_provider_load_from_path (provider, "tests/testgtk.css", NULL);
10274 g_warning ("Couldn't find file \"testgtk.css\".");
10276 display = gdk_display_get_default ();
10277 screen = gdk_display_get_default_screen (display);
10279 gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (provider),
10280 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
10281 g_object_unref (provider);
10283 gtk_accelerator_set_default_mod_mask (GDK_SHIFT_MASK |
10292 for (i = 1; i < argc; i++)
10294 if (strncmp (argv[i], "--bench", strlen("--bench")) == 0)
10301 nextarg = strchr (argv[i], '=');
10312 count = strchr (nextarg, ':');
10315 what = g_strndup (nextarg, count - nextarg);
10317 num = atoi (count);
10322 what = g_strdup (nextarg);
10324 do_bench (what, num ? num : 1);
10325 done_benchmarks = TRUE;
10330 if (done_benchmarks)
10335 binding_set = gtk_binding_set_by_class (g_type_class_ref (GTK_TYPE_WIDGET));
10336 gtk_binding_entry_add_signal (binding_set,
10337 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
10340 G_TYPE_STRING, "GtkWidgetClass <ctrl><release>9 test");
10342 memory_provider = gtk_css_provider_new ();
10343 gtk_css_provider_load_from_data (memory_provider,
10344 "#testgtk-version-label {\n"
10346 " font: Sans 18;\n"
10349 gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER (memory_provider),
10350 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION + 1);
10352 create_main_window ();
10358 while (g_main_context_pending (NULL))
10359 g_main_context_iteration (NULL, FALSE);
10362 while (g_main_context_pending (NULL))
10363 g_main_context_iteration (NULL, FALSE);